Refrescar

Tengo un DataWindow generada por dos tablas ventas y clientes, en la tabla ventas tengo un campo codcli que esta enlazada con la tabla clientes, lo que pasa es que cuando cambio el código en el campo codcli de la tabla ventas no se refrescan los cambios en los campos que provienen de la tabla clientes, cuando hablo de campos me refiero a los campos del datawindow.
Por favor como puedo hacer para que se refresquen los datos en el datawindows sin hacer un retrieve.

1 respuesta

Respuesta
1
El datawindow posee un evento llamado ROWFOCUSCHANGED()
Este es disparado cada vez que el datawindow cambia de row, o fila, o tupla, o resistro, en este evento podrías hacer lo que necesitas,
El evento ROWFOCUSCHANGED envía la referencia currentrow, la cual indica la fila en la que esta posicionada ahora, utilizando esta variable puedes hacer mención a el valor del código del cliente ejm,
STRING ls_codcli
ls_codcli = THIS.GetItemString(currentrow, 'codcli')
Parent. <dw detalle>. retrieve(ls_codcli)
Lo que pasa es que tengo un solo datawindow donde se muestran campos de la tabla ventas y clientes, el campo editable es el código del cliente, cuando cambio el código del cliente quisiera que también cambien los otros campos que provienen de la tabla clientes. Todo esta en un solo datawindow
Creo entender que lo que buscas es que cuando ingresas un código, (en este caso el del cliente), aparezcan datos relacionados a el, los cuales están relacionados directamente con el código, por ejemplo el nombre, dirección, etc.
Existen 2 formas de hacer esto:
La más simple:
Primero tienes que crear un datawindow por cada una de los valores relacionados por ejem.
Si ingreso el código del cliente necesito ver su nombre
Bueno pues generas un datawindow basado en la tabla del cliente, esta de tipo grid, y desplegando unicamente la columna del nombre, grabas y en el otro datawindow, replicas la columna de código de cliente, a esta le colocas un cero en la propiedad de tab-order, luego en la pestaña de edit, seleccionas dropdowndw, este tipo de campo extra información de un datawindow, los últimos campos que rellenaras son, Datawindow, colocando aquí el nombre del que creaste basado en el cliente, y Display column seleccionando el nombre y por ultimo data column, y seleccionas el código, grabas y pruebas.
ADVERTENCIA: esta manera de resolver es la más simple y rápida, sin embargo, repercute en el numero de datos relacionados que integres, pues por cada dato hay que poner un datawindow relacionado, por lo que degrada un poco el sistema.
La forma no tan fácil.
Existe un control llamado computed field, este funciona para hacer llamadas a una función, por ejemplo una sumatoria, etc.
En este caso puedes crear una función tipo publica, la cual devuelva un valor string y en esta buscar el nombre del cliente, por medio de un parámetro de referencia el cual corresponde al código de este. Y colocar todo esto en este campo computado.
En caso de ser un external datawindow
Existe un evento llamado ITEMCHANGED(), este evento se dispara justo cuando va a cambiar el valor de la casilla editable, los parámetros que referencia son,
dwo, data, row,
dwo = objeto del datawindow que posee el foco
data = nuevo valor en la parte editable
row = linea activa
Con estos datos preguntas por el nombre del campo que estas editando, y por supuesto en el datawindow tendrás un cambio para colocar el nombre, sin embargo igualmente que el ejemplo anterior deberás colocar el tab-order en 0,
ejm.
Tengo una variable llamada codcli y otra nomcli estas integradas en el datawindow externo,
Evalúo el valor del codcli y luego relleno el valor de nomcli, todo esto en el evento itemchanged()
STRING ls_nombre
CHOOSE CASE LOWER(dwo.name)
CASE 'codcli'
SELECT nombre
INTO ls_nombre
FROM clientes
WHERE codcli = :data
USING SQLCA;
THIS.SetItem(row, 'nomcli', ls_nombre)
END CHOOSE
Y esto deberá refrescar el nombre cada vez que integras el código, OJO, esto solo funciona si y solo si, tienes un datawindow determinado como external.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas