Memdataset: utilizar aData
Publicado: Jue Jul 06, 2006 12:45 pm
Hola,
Estoy usando extensivamente los memdataset con mucha satisfacción. Es una
gran herramienta de trabajo!!
Ahoro me estoy enfrentando a un tema donde tengo que sacarle la máxima
velocidad en un proceso donde se recorre un memdataset de 2000x12 elementos,
además de añadir un campo calculado y ordenarlo por ese campo. El código
que utilizo podría ser algo así:
// ---------> Ordenamos odbtCarga por el campo cref (ojo!! posición 2 del
array!!)
oCol := ::oParent:odbitCarga:addCalcField("CREF2",{ | a | PADL(ALLTRIM(
a:oDataset:cRef ),18," ") })
::oParent:odbitCarga:Sort( { oCol:nIndex } )
::oParent:odbitCarga:GoTop()
DO WHILE ! ::oParent:odbitCarga:EOF()
// ----> Si no está marcado para cargar, fuera!!!
IF ::oParent:odbitCarga:lCargar
odbiTemp:Append()
odbiTemp:cref := ::oParent:odbitCarga:cRef
odbiTemp:Save()
ENDIF
::oParent:odbitCarga:Skip(+1)
ENDDO
Como se ve en el código, añado una columna al memdataset y ordeno el
memdataset por esa columna. Luego, desde el principio a fin, añado en otro
objeto (en este caso es un recordset de ADO) uno de esos campos. El caso es
que este proceso tan simple consume un tiempo que quisiera mejorar.
Para ello he pensado en utilizar directamente la matriz sobre la que trabaja
el memdataset. Hacer algo parecido a esto:
FOR EACH aElement IN ::oParent:odbitCarga:aData
IF aElement[3]
odbiTemp:Append()
odbiTemp:cref := aElement[5]
odbiTemp:Save()
ENDIF
NEXT
Sin embargo, tengo dos cuestiones:
a. ¿Donde se guarda el valor de un campo calculado? ¿aData? ¿aWork? ¿no se
guarda, solo se calcula según demanda?
b. ¿aData contiene la información última o solo la original cuando se abrió
el memdataset?
Saludos y gracias,
José Luis Capel
Estoy usando extensivamente los memdataset con mucha satisfacción. Es una
gran herramienta de trabajo!!
Ahoro me estoy enfrentando a un tema donde tengo que sacarle la máxima
velocidad en un proceso donde se recorre un memdataset de 2000x12 elementos,
además de añadir un campo calculado y ordenarlo por ese campo. El código
que utilizo podría ser algo así:
// ---------> Ordenamos odbtCarga por el campo cref (ojo!! posición 2 del
array!!)
oCol := ::oParent:odbitCarga:addCalcField("CREF2",{ | a | PADL(ALLTRIM(
a:oDataset:cRef ),18," ") })
::oParent:odbitCarga:Sort( { oCol:nIndex } )
::oParent:odbitCarga:GoTop()
DO WHILE ! ::oParent:odbitCarga:EOF()
// ----> Si no está marcado para cargar, fuera!!!
IF ::oParent:odbitCarga:lCargar
odbiTemp:Append()
odbiTemp:cref := ::oParent:odbitCarga:cRef
odbiTemp:Save()
ENDIF
::oParent:odbitCarga:Skip(+1)
ENDDO
Como se ve en el código, añado una columna al memdataset y ordeno el
memdataset por esa columna. Luego, desde el principio a fin, añado en otro
objeto (en este caso es un recordset de ADO) uno de esos campos. El caso es
que este proceso tan simple consume un tiempo que quisiera mejorar.
Para ello he pensado en utilizar directamente la matriz sobre la que trabaja
el memdataset. Hacer algo parecido a esto:
FOR EACH aElement IN ::oParent:odbitCarga:aData
IF aElement[3]
odbiTemp:Append()
odbiTemp:cref := aElement[5]
odbiTemp:Save()
ENDIF
NEXT
Sin embargo, tengo dos cuestiones:
a. ¿Donde se guarda el valor de un campo calculado? ¿aData? ¿aWork? ¿no se
guarda, solo se calcula según demanda?
b. ¿aData contiene la información última o solo la original cuando se abrió
el memdataset?
Saludos y gracias,
José Luis Capel