Maestro detalle

Como logro que en mi detalle de una factura (datawindow) al ingresar el item se rellen los demás campos como unidad de medida, precio etc...

1 respuesta

Respuesta
1
Como todos los objetos en pb el data window cuenta con eventos que se disparan por cada acción, en este caso para responder tu pregunta debes utilizar el evento itemchanged, este se dispara en el momento en que el campo va ha cambiar de valor, recibe varios parámetros como dwo (el objeto que cambia), row (la fila), data (el valor nuevo en formato string)
Es aquí donde evaluamos los valores que son ingresados a los campos del datawindow, para ser aprobados o no.
Con este prescedente entonces, podemos evaluar cualquier campo que sea MODIFICADO utilizando el objeto dwo para reconocer que campo es el que en ese momento debe ser interrogado.
Un ejemplo:
Tenemos un datawindow con 2 campos CÓDIGO y DESCRIPCIÓN
el segundo campo no es editable solo despliega el valor relacionado con código.
El script puede seria de la siguiente forma:
STRING ls_descripcion
INTEGER li_return = 0
CHOOSE CASE LOWER(dwo.name)
CASE 'codigo'
SELECT ARTICULOS.DESCRIPCION
FROM ARTICULOS
WHERE (ARTICULOS.CODIGO = :data)
USING SQLCA;
IF ((SQLCA.SQLCode = 0) AND (SQLCA.SQLDBCode = 0)) THEN
THIS.SetItem(row, 'descripcion', ls_descripcion)
ELSE
MESSAGEBOX('ERROR', 'Codigo ingresado no existe')
li_return = 1
END IF
END CHOOSE
RETURN(li_return)
Observamos en el script varias cosas interesantes
*- dwo es un objeto que posee varias propiedades que recomiento veas en la ayuda del editor de desarrollo.
*- que el evento en funcion (itemchanged) puede retornar un valor tipo numerico en este caso 0 por omision que significa que todo esta bien, 1 por cuestion de error que significa que el cursor no se movera del campo el cual estoy editando, sin embargo este debe ir alineado con otro evento que se llama itemerror que posee similares valores a retornar (recomiendo leer la ayuda de estos 2 eventos)
*- que estoy asignando un valor al campo descripcion, esto significa que este campo o forma parte de la tabla, o es un external datawindow y refiere a una variable cualquiera.
Veamos ahora otra forma de hacerlo
Pero esto es lento y degrada el sistema,
El datawindow object maneja un objeto llamado computed field, o campo computado, este puede utilizar como escapr una función ya sea propia de power builder o una que yo quiera crear con la salvedad que esta debe ser publica y recibir un parámetro o parámetros, y por supuesto retornar otro para que el campo computado reciba ese valor y lo pinte en pantalla
UN EJEMPLO:
fp_get_descripcion( codigo )
La función fp_get_descripcion, recibe un parámetro el cual es el valor que en ese momento tiene código, (tomando como base el ejemplo anterior), la función recibe el parámetro y lo relaciona por medio de un script que puede ser un select y esta devuelve el valor encontrado.
Este método es casi inmediato pero degrada el sistema, pues cada vez que el puntero pasa por la linea del datawindow o esta es cargada, el computed field es disparado reclamando su valor (no quiero pensar que pasa cuando estos son varios campos computados actuando de la misma forma)
Una forma más de resolverlo sera.
Relacionar otro datawindow al campo en función
Si yo quiero desplegar el valor relacionado con el código inmediatamente después de que este toma un valor, seria de la siguiente manera.
Primero crear un datawindow con los campos de la tabla que posee la información que busco, tomemos el ejemplo 1
la tabla se llama artículos y los campos que voy a integrar en este nuevo datawindow son código y descripción, ademas estos los integro en el datawindow, lo grabo y le pongo un nombre significativo por ejemplo dw_view_articulos, luego regreso a mi pantalla de detalle en donde añado o inserto al lado del campo código del detalle otro que sea igual o sea otro código este automáticamente se nombra codigo_1, dicho campo debe ser solo de lectura, y en las propiedades del código busco la pestaña de edit y selecciono para este DropDownDW colocando en la casilla del nombre del datawindow dw_view_articulos, en la casilla de de display column DESCRIPCIÓN y en data column CÓDIGO, y grabo
automativamente cuando cambie de valor el campo código como se replica en codigo_1 trae el la descripción actuando sobre el datawindow relacionado y la despliega, sin embargo esto funciona igualmente que el ejemplo anterior inmediato, que degrada el sistema y mientras más detalle tengas y valores similares existan esta será más lenta, por supuesto depende de la data que manejes, el crecimiento de la base de datos, el servidor, etc.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas