Página 1 de 1

Memdataset: utilizar aData

Publicado: Jue Jul 06, 2006 12:45 pm
por jose.luis
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

Memdataset: utilizar aData

Publicado: Jue Jul 06, 2006 1:11 pm
por ignacio
José Luis,
> a. ¿Donde se guarda el valor de un campo calculado? ¿aData? ¿aWork? ¿no se
> guarda, solo se calcula según demanda?
En ningún sitio, efectivamente se calcula según se demanda.
> b. ¿aData contiene la información última o solo la original cuando se
> abrió el memdataset?
aData contiene siempre toda la información del dataset, aWork sólo contiene
la información de los elementos visibles y en el orden deseado.
Piensa que realmente las dos matrices APUNTAN A LOS MISMOS DATOS, tan sólo
cambia el primer nivel de la matriz. Por ese motivo si cambias el valor de
un subelemento de la matriz tanto en aWork como en aData AMBAS matrices
reflejan el cambio.
Un saludo,
>
> Saludos y gracias,
> José Luis Capel
>

Memdataset: utilizar aData

Publicado: Jue Jul 06, 2006 1:14 pm
por jose.luis
Ignacio,
>
>> a. ¿Donde se guarda el valor de un campo calculado? ¿aData? ¿aWork? ¿no
>> se guarda, solo se calcula según demanda?
>
> En ningún sitio, efectivamente se calcula según se demanda.
>
>> b. ¿aData contiene la información última o solo la original cuando se
>> abrió el memdataset?
>
> aData contiene siempre toda la información del dataset, aWork sólo
> contiene la información de los elementos visibles y en el orden deseado.
>
> Piensa que realmente las dos matrices APUNTAN A LOS MISMOS DATOS, tan sólo
> cambia el primer nivel de la matriz. Por ese motivo si cambias el valor de
> un subelemento de la matriz tanto en aWork como en aData AMBAS matrices
> reflejan el cambio.
>
Muchas gracias por tus explicaciones. Cada día me gusta más este dataset!!
Saludos,
José Luis Capel