Re: [gx-l] Como actualizar un dato en una collection

Gracias por la aclaración, entiendo que esto es así, se está trabajando en cada caso con punteros a la posición de memoria de cada elemento de la collection.  De ahí viene también el origen de la duda que planteaba al hilo de este tema: cuando tiene sentido hacer  un new()  para  la variable item que se está añadiendo a una collection. Si la adición es una copia del contenido de la variable (que en nuestro caso es un SDT) a la posición determinada de la collection, o es una asignación del puntero a la variable que se ha creado.



El 27/09/2012 17:44, Luciano Rigolin escribió:

A documentação deve estar desatualizada. Tenha em mente que o SDT trabalha com posições de memória. Quando está fazendo  "for &sdtLogDI in &sdtLogDICollection",  &sdtLogDICollection aponta para vários endereços de memoria e  &sdtLogDI aponta para um desses endereços. 

&sdtLogDICollection.Item(1) é igual a primeira passagem &sdtLogDI no for in. Ambos apontam para o mesmo endereço de memória.

Espero que compreenda o português.

Atenciosamente,

Luciano Rigolin


Date: Thu, 27 Sep 2012 17:20:20 +0200
From: jbusquets@grespania.com
To: gx-l@gxtech.com.uy
Subject: Re: [gx-l] Como actualizar un dato en una collection

Muy interesante. Ahora , faltaría saber si esto es estable en todos los entornos/versiones, o si es algo que funciona en algunos de ellos , y puede que deje de funcionar en un upgrade o cambio de entorno.

Puede que la implementación sea distinta según el lenguaje generador, y tengamos problemas si se quiere migrar alguna vez.

En todo caso, voy a probarlo, en mi entorno java/web


El 27/09/2012 16:29, Luciano Rigolin escribió:
Jesus, fui testar e como te falei funciona, contrariando a documentação.

O meu teste foi o seguinte:

for &sdtLogDI in &sdtLogDICollection
if &sdtLogDI.EmpCod = &EmpCod
&sdtLogDI.ImpAno = &ImpAno
endif
endfor

&sdtLogDI.ImpAno atualizou normalmente.

Atenciosamente,

Luciano Rigolin


Date: Thu, 27 Sep 2012 15:52:11 +0200
From: jbusquets@grespania.com
To: gx-l@gxtech.com.uy
Subject: Re: [gx-l] Como actualizar un dato en una collection

Es decir, que no hace falta ir contando los índices, sino que basta con mirarlo en el momento en que encuentras la coincidencia (así ya no tiene sentido pensar sobre el valor inicial)

Combinando las sugerencias de Martín y Leonardo, entiendo que sería algo así, para actualizar el valor dentro del bucle For


For &FiltroItem in &Filtros
        If &FiltroItem.Clave= lo_que_sea 
           
&Idx = &Filtros.indexof(&FiltroItem)
         
  &Filtros.item(&idx).Valor = Valor_Nuevo
        EndIf
EndFor



La otra forma sería la sugerencia de Luis murillo, que propone la actualización posterior, eliminando el elemento y creándolo de nuevo (esto es, haciendo caso estrictamente a lo que dice la documentación de que no se puede actualizar dentro del bucle), y cuyo código copio aquí para comentarlo:

 Event Start  	&FiltroItem.Clave = 10  	&FiltroItem.Valor = 10  	&Filtro.Add(&FiltroItem)  	&FiltroItem = new()  	&FiltroItem.Clave = 20  	&FiltroItem.Valor = 20  	&Filtro.Add(&FiltroItem)  	&FiltroItem = new()  	&FiltroItem.Clave = 30  	&FiltroItem.Valor = 30  	&Filtro.Add(&FiltroItem)  	&FiltroItem = new()  EndEvent      Event Enter  	&LVCAntes = &Filtro.ToXml()  	&Elem = 1  	for &FiltroItem in &Filtro  		if &FiltroItem.Clave = 20  			&ElemSelec = &Elem  		endif  		&Elem += 1  	endfor  	&FiltroItem = new()  	&FiltroItem = &Filtro.Item(&ElemSelec)  	&FiltroItem.Valor = 25  	&Filtro.Remove(&ElemSelec)  	&Filtro.Add(&FiltroItem, &ElemSelec)  EndEvent 


Utiliza el mismo sistema de ir incrementando el contador en el bucle, pero entiendo que se puede utilizar el método de Martín de guardar simplemente el  índice del elemento que interesa.

Este código me hace plantearme alguna duda, también de concepto con las colecciones de SDT: el uso de new()

Entiendo que new() se utiliza para crear una nueva instancia de un SDT, es decir, reservar el espacio en memoria para almacenar los datos...

En el ejemplo, en el evento start, que rellena con datos de ejemplo,
Se hace un new() para una variable SDT   &FiltroItem, y luego se añade dicha variable a la collection &Filtro...
pero:
  •  ¿por qué se hace el new()   después de haber dado valores a la variable y haberla añadido a &Filtro?
  • Cuando hacemos &Filtro.Add(&FiltroItem), lo que se hace es asignar el espacio reservado con new() a un elemento de &Filtro, o crear un elemento nuevo para la collection y  copiar el contenido de &FiltroItem a dicho elemento? Si fuera así, no sería necesario crear un nuevo &FiltroItem a cada elemento que se añade.
Por otro lado, entiendo que, naturalmente,  el código es un ejemplo, y que tengo que considerar los casos de que el SDT esté vacío o no se encuentre la clave buscada (o sea, solo actualizar si &ElemSelec > 0 )


Saludos



El 27/09/2012 15:11, Martin Ciarapica escribió:
Jesús la solución de leonardo te deberia funcionar  para obtener el indice del item haces     &Idx  = &Filtros.indexof(&FiltroItem)    Saludos            El día 27 de septiembre de 2012 09:58, Jesus Busquets  <jbusquets@grespania.com> escribió:  
Eso es lo que quería hacer, pero  al mirar la documentación, leí que no era  posible, de modo que no hice la prueba.    ¿realmente actualiza la variable &Filtros si se hace así?      El 27/09/2012 14:09, Luciano Rigolin escribió:    Jesus, onde viu que não pode alterar dentro do for in? Já tentou fazer  assim:    For &FiltroItem in &Filtros          If &FiltroItem.Clave= lo_que_sea                &FiltroItem.Clave  = &NovoValor          EndIf  EndFor    Até onde entendo, isso é possível.    Atenciosamente,    Luciano Rigolin      Date: Thu, 27 Sep 2012 09:27:33 +0200  From: jbusquets@grespania.com  To: gx-l@gxtech.com.uy  Subject: [gx-l] Como actualizar un dato en una collection    Una pregunta que no parece complicada, pero no encuentro como hacer  exactamente, porque la documentación sobre el trabajo con colecciones que  hay en el wiki no consigue aclararme la forma de trabajar con ellas.      Tengo un SDT que es una collection:    Filtro   collection  de FiltroItem    Filtro Item se compone de Clave y Valor    Tengo una variable &Filtros  , de tipo Filtro, cargada con una serie de  valores, puedo navegar por ella, por ejemplo, con:    For &FiltroItem in &Filtros          If &FiltroItem.Clave= lo_que_sea            ...          EndIf  EndFor    El caso es que quiero actualizar el valor del elemento lo_que_sea  de  &Filtros para que "Valor" contenga algo.    En la documentación dice que no se permite actualizar la variable collection  en un For..in    ¿cómo tendría que hacerlo, pues, eliminando el elemento y crear uno nuevo?  ¿lo puedo hacer dentro del for ..in?    ¿si se puede actualizar el valor, cómo se haría exactamente?    Un saludo      --    Jesús Busquets    GRESPANIA, S.A.    Este mensaje se dirige exclusivamente a su destinatario y puede contener  información privilegiada o confidencial. Si no es Vd. el destinatario  indicado, queda notificado de que la utilización, divulgación y/o copia sin  autorización está prohibida en virtud de la legislación vigente. Si ha  recibido este mensaje por error, le rogamos que nos lo comunique  inmediatamente por esta misma vía y proceda a su destrucción.        --    Jesús Busquets    GRESPANIA, S.A.    Este mensaje se dirige exclusivamente a su destinatario y puede contener  información privilegiada o confidencial. Si no es Vd. el destinatario  indicado, queda notificado de que la utilización, divulgación y/o copia sin  autorización está prohibida en virtud de la legislación vigente. Si ha  recibido este mensaje por error, le rogamos que nos lo comunique  inmediatamente por esta misma vía y proceda a su destrucción.      

--
Jesús Busquets
GRESPANIA, S.A.
Este mensaje se dirige exclusivamente a su destinatario y puede contener información privilegiada o confidencial. Si no es Vd. el destinatario indicado, queda notificado de que la utilización, divulgación y/o copia sin autorización está prohibida en virtud de la legislación vigente. Si ha recibido este mensaje por error, le rogamos que nos lo comunique inmediatamente por esta misma vía y proceda a su destrucción.



--

Jesús Busquets

GRESPANIA, S.A.

Este mensaje se dirige exclusivamente a su destinatario y puede contener información privilegiada o confidencial. Si no es Vd. el destinatario indicado, queda notificado de que la utilización, divulgación y/o copia sin autorización está prohibida en virtud de la legislación vigente. Si ha recibido este mensaje por error, le rogamos que nos lo comunique inmediatamente por esta misma vía y proceda a su destrucción.



--

Jesús Busquets

GRESPANIA, S.A.

Este mensaje se dirige exclusivamente a su destinatario y puede contener información privilegiada o confidencial. Si no es Vd. el destinatario indicado, queda notificado de que la utilización, divulgación y/o copia sin autorización está prohibida en virtud de la legislación vigente. Si ha recibido este mensaje por error, le rogamos que nos lo comunique inmediatamente por esta misma vía y proceda a su destrucción.


0 Response to "Re: [gx-l] Como actualizar un dato en una collection"

Publicar un comentario