In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

Memdataset: utilizar aData

Foro de Xailer profesional en español
Responder
jose.luis
Mensajes: 1633
Registrado: Vie Oct 14, 2005 10:56 pm

Memdataset: utilizar aData

Mensaje 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
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9452
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Memdataset: utilizar aData

Mensaje 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
>
Ignacio Ortiz de Zúñiga
[OZ Software]
https://www.ozs.es
--
[Equipo de Xailer / Xailer team]
https://www.xailer.com
jose.luis
Mensajes: 1633
Registrado: Vie Oct 14, 2005 10:56 pm

Memdataset: utilizar aData

Mensaje 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
Responder