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 &sdtLogDICollectionif &sdtLogDI.EmpCod = &EmpCod&sdtLogDI.ImpAno = &ImpAnoendifendfor
&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 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 )
- ¿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.
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