Pasar mas de un argumento por medio de una DropDownDW

Leo me podrías ayudar con el siguiente inconveniente.
Tengo una DataWindow Principal tabular (dw_detalle) en la cual dependiendo un id de producto me tiene que mostrar en otros 2 campos (id_producto_talle y id_producto_color) por medio DropdownDW la descripción de los mismos.
El tema esta en que funciona bien pero cuando cambio de fila para agregar otro producto me muestra el id_producto_talle y el id_producto_color en vez de mostrarme la descripción.
Tengo codificado el evento itemfocuschanged de la siguiente manera:
DataWindowchild dwc_talles, dwc_colores
long l_id_producto , l_id_talle, l_id_color
IF dwo.Name = 'comprobantes_detalle_id_talle' THEN
dw_detalle.getChild('comprobantes_detalle_id_talle',dwc_talles)
dwc_talles.setTransObject(SQLCA)
dwc_talles.retrieve(dw_detalle.object.id_producto[getrow()])
END IF
IF dwo.Name = 'comprobantes_detalle_id_color' THEN
dw_detalle.getChild('comprobantes_detalle_id_color',dwc_colores)
dwc_colores.setTransObject(SQLCA)
dwc_colores.retrieve(dw_detalle.object.id_producto[getrow()])
END IF
Que puedo hacer para que no me muestre el id y la descripción cuando cambio de fila.

1

1 Respuesta

5.575 pts. Ingeniero en Sistemas de Información

Te cuento que la DW tabular funciona a modo columna. Al hacer un retrieve en una DDDW cuyo valor depende de otro campo de la misma DW, va a modificar toda la columna, no
Solamente el ID sino que también la descripción, ya que estas cambiando el valor de la columna.

Nosotros trabajamos con dos DW: una DW tabular en la parte de arriba de la ventana, en la cual vas a ver todos los productos cargados (es de solo consulta, visualizas todos los datos) y debajo de esta, una DW freeform en donde se inserta un registro por vez. De esta forma te evitas el problema anterior.

Otra solución, que capaz que a vos te sirva, es la de colocar dos campos: uno ID y otro, pegado al ID que se llame descripción, el cual puede ser un statictext o edittext.
En el campo ID vas a colocar la DDDW, cuyo código es el que me escribiste, salvo
Que en vez de visualizar la descripción, vas a visualizar siempre el ID.

En el campo descripción, vas a setear la descripción del producto según el ID elegido en la DDDW. Puedes buscar la descripción directamente de la DDDWo bien crear un datastore en el cual buscas el ID y tomas la descripción a setear en el nuevo campos.

Por lo tanto, cada vez que ingreses un nuevo registro, solo va a variar el campo ID, y no el de descripción. En el caso de que quieras guardar en la base el campo ID, vas a tener que crear un campo oculto en el cual le setas el ID.

Gracias por responder.

No me queda bien en claro algunos puntos.

Cuando me comentas de crear un statictext o edittext en este caso son controles sobre la ventana y no sobre la datawindow que es lo que tengo.

El tema es que el usuario debe tener una dropdowndw para elegir una opción si este campo lo copio y pego es decir por ejemplo tendría el id_talle y el id_talle_1 .

En id_talle podría asociarle la dropdowndw y en el otro id_talle_1 dejar el id pero como hacer para mostrar el id_talle_1 con la descripcion?

Hago una aclaración con respecto al código original con el campo id_color. que depende del id_producto y del id_talle.

El evento itemfocuschanged me queda asi:

DataWindowchild dwc_talles, dwc_colores
long l_id_producto , l_id_talle, l_id_color
IF dwo.Name = 'comprobantes_detalle_id_talle' THEN
dw_detalle.getChild('comprobantes_detalle_id_talle',dwc_talles)
dwc_talles.setTransObject(SQLCA)
dwc_talles.retrieve(dw_detalle.object.id_producto[getrow()])
END IF
IF dwo.Name = 'comprobantes_detalle_id_color' THEN
dw_detalle.getChild('comprobantes_detalle_id_color',dwc_colores)
dwc_colores.setTransObject(SQLCA)
dwc_colores.retrieve(dw_detalle.object.id_producto[getrow()], dw_detalle.object.comprobantes_detalle_id_talle[getrow()])
END IF

No se si me expreso bien.

Gracias !!!

Te voy a ir explicando cómo deberías hacer. Olvídate del statictext o edittext que te dije antes.

En la datawindow principal (tabular) seguramente tenes un SQL en donde lees id_producto, id_producto_talle, id_producto_color. Dentro de esta consulta vas a colocar 2 campos más: descripción del talle y la descripción del color. Estos dos campos no van a ser editables
por el usuario, pero si los va a visualizar.

La dropdowndw la vas a tener como hasta ahora, no cambia. Cuando el usuario elija el talle, tomas el valor. De esta forma ya tenes la descripción del talle. Si agregas una fila mas, esa descripción te va a quedar como corresponde. El problema es que perdiste el valor de id_producto_talle, ya que la dropdowndw hizo retrieve, por lo tanto, a tu datawindow principal le vas a tener que agregar un nuevo campo que se llame id_producto_talle_aux, el cual
contenga el valor id_producto_talle. Acá viene otro cambio, en vez de que la dropdowndw
este en el campo id_producto_talle vas a colocarlo en el id_producto_talle_aux.

Cuando el usuario elija el talle, el campo id_producto_talle_auxtendrá ese código de talle que lo vas a copiar al id_producto_talle.

El evento itemfocuschanged te quedaría así:

DataWindowchild dwc_talles, dwc_colores
long l_id_producto , l_id_talle, l_id_color

IF dwo.Name = 'comprobantes_detalle_id_talle_aux' THEN
dw_detalle.getChild('comprobantes_detalle_id_talle_aux',dwc_talles)
dwc_talles.setTransObject(SQLCA)
dwc_talles.retrieve(dw_detalle.object.id_producto[getrow()])
END IF

El evento itemchanged te quedaría así:

DataWindowchild dwc_talles, dwc_colores
long l_id_producto , l_id_talle, l_id_color

IF dwo.Name = 'comprobantes_detalle_id_talle_aux' THEN
dw_detalle.getChild('comprobantes_detalle_id_talle_aux',dwc_talles)
dwc_talles.setTransObject(SQLCA)
dwc_talles.retrieve(dw_detalle.object.id_producto[getrow()])
/**/
dw_detalle.setitem (row, ‘'comprobantes_detalle_id_talle’,
long(data)
dw_detalle.setitem (row,
‘descripicon_talle’, dwc_talles.getitemstring(1,”*campo descripción de la dddw”))
dw_detalle.AcceptText()
END IF

Esto mismo vas a tener que hacer con el color. El evento itemfocuschanged te quedaría así:

DataWindowchild
dwc_talles, dwc_colores
long l_id_producto ,
l_id_talle, l_id_color
IF dwo.Name ='comprobantes_detalle_id_color_aux' THEN
dw_detalle.getChild('comprobantes_detalle_id_color_aux',dwc_colores)
dwc_colores.setTransObject(SQLCA)
dwc_colores.retrieve(dw_detalle.object.id_producto[getrow()],
dw_detalle.object.comprobantes_detalle_id_talle[getrow()])
END IF

El evento itemchanged tenes que agregarle lo siguiente:

DataWindowchild dwc_talles, dwc_colores
long l_id_producto , l_id_talle, l_id_color
IF dwo.Name = 'comprobantes_detalle_id_color_aux'
THEN
dw_detalle.getChild('comprobantes_detalle_id_color_aux',dwc_colores)
dwc_colores.setTransObject(SQLCA)
dwc_colores.retrieve(dw_detalle.object.id_producto[getrow()],
dw_detalle.object.comprobantes_detalle_id_talle[getrow()])
/**/
dw_detalle.setitem (row, ‘'comprobantes_detalle_id_color’,
long(data)
dw_detalle.setitem (row, ‘descripicon_color’,
dwc_talles.getitemstring(1,”*campo descripción de la dddw”))
dw_detalle.AcceptText()
END IF

Espero que se entienda el código y la explicación que te di.

Capaz que algún nombre de campo le erre.

Claro pero el tema esta en que no quisiera repetir las mismas columnas 2 veces.

Es decir por ejemplo en la dropdowndw que tengo el campo id_talle e id_color no tengo problemas de obtener el id de cada una por lo tanto al copiar en el campo id_talle_1 e id_color_1 y asociarle otra dropdowndw que contine la descripcion del talle y del color estaria solucionando el problema pero me quedan 2 columnas de mas y mi idea es hacerlo solo en una columna.

Es decir en resumen tengo 4 columnas con 4 dropdowndw y solo quisiera hacerlo en 2.

A nivel dato anda bien pero no a nivel grafico para el usuario.

Gracias

No, no tenes repetidos las dropdowndw, solo se usa en la columna que elige el usuario. Ahí vos les visualizas los datos que el usuario quiere. Una vez que lo elige, tomas la descripción y la colocas en un nuevo campo.

Como es una dw tabular, cada vez que agregues un nuevo registro, vas a realizar un retrieve, por lo tanto perdés los ID del producto, talle y color anteriores cargados, por tal motivo, debes guardarlos en otros campos.

Si solamente hicieras una sola vez el retrieve, si te sirve la tabular.

Otra solución mas simple y que a mi entender es mucho mejor, es dentro de una ventana tener 2 DW, una de tipo tabular en donde ves todos los datos cargados (solo lectura) y debajo una DW de tipo freeform, en donde vez los datos seleccionados de la DW tabular. En esta DW freeform en donde haces el alta, baja y modificaciones. Podes poner todas las dropdowndw que quieras, total siempre se ve un solo registro.

Claro yo el id_talle y el id_color lo tengo en la datawindow tabular y ese dato esta bien. Cuando se pasa a la linea siguiente no cambia el dato sino la descripción. Lo que hice es con ese id mostrar la descripción.
Me queda una datawindow tabular así por ejemplo:
id_producto | descripción producto | id_talle id_talle_1 | id_color id_color_1
1 Remera 1 ES 3 Amarillo
1 Remera 1 ES 7 Verde
2 Short 4 44 3 Amarillo
<span class="scayt-misspell" data-scaytid="192" data-scayt_word="id_talle_1">id_talle_1</span> e id_color_1 están como no editables y tienen una dropdwondw que solo muestran la descripción en base al id_talle .
Ahí es donde no quisiera repetir las columnas.
A nivel datos anda bien porque obtengo los id de cada columna.

Gracias

Bueno si a nivel de datos queda bien, solo deberías agregar 2 columnas donde seteas la descripción del talle y color:

id_producto | descripción producto | id_talle | descripción talle | id_color | descripción color

En los Id_talle y id_color tenes las dropdowndw donde el usuario elige el talle y el color.

Una vez que los eligió, seteas la descripción de ambos en sus respectivos campos descripción.

De esa forma no se te van a ir las descripciones cuando pases al siguiente registro.

Claro así lo tengo pero no hay forma para que sea la misma dropdown que elege el usuario para no confundirlo a nivel visual.

Saludos

El usuario no se va a confundir. En la DW principal, el usuario va a ver dos campos, uno con el ID del color (por ejemplo) y otro campo con la descripción del color, el cual no se puede editar.

El campo ID del color es el que tiene la dropdown, esta dropdown vas a colocar que muestre el ID y que grabe el ID (propiedades de la dropdown), para que no se vea la descripción 2 veces en la DW principal. De esta forma, en el campo ID vez el código del color y en el campo descripción el nombre del color, que lo seteas una vez que el usuario cargo el color en la DW principal.

Por ejemplo: en la DW principal vas a tener el color: 3 | Amarillo

En el próximo registro, cuando hagas el retrieve del color, ese 3 | Amarillo no lo perdés a nivel visual.

Claro pero cuando despliega el dropdowndw si pongo en las propiedades que el display sea el id el usuario no va a saber a que hace referencia hasta presionar tab.

Pero bueno creo que la única alternativa es esta no?

No, son dos cosas distintas, lo que muestra la dropdowndw a lo que dejas visible en la DW principal.

La dropdowndw tiene un query que es la información que le vas a dar al usuario para que
elija. Cuando vos a asocias al campo de la DW, colocas el nombre de la dropdowndw,
el campo que quieres visualizar y el campo que quieres guardar en la base.

En tu caso, cuando se despliega la dropdowndw vas a ver la información del query propio de la dropdowndw, una vez que elije el usuario y vuelve a la DW principal, este verá en ese campo solamente el código de lo que eligió, y a su derecha vera la descripción de ese código que es lo mismo que se despliega en la dropdowndw.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas