Estoy trabajando en la Dw_1 y quiero que no me muestre un campo en la dw_2 todo depende si selecciono 1, 2 o 3 . Si selecciono 2 en la dw_1 no debo mostrar un campo en la dw_2. Hay alguna manera de hacer esto desde una dw a otra.
1 respuesta
Respuesta de Antonio Garcia
1
1
Antonio Garcia, clipper todas sus versiones (manejo total) power builder todas...
El datawindow es un objeto que esta formado por 2 partes, UNO el datawindow control, que en definitiva es el contenedor de la parte segunda, DOS, el datawindow object, que es prácticamente el objeto de programación visual. En los dos casos es posible hacer ciertas validaciones y consultas, para solucionar un problema similar al que me planteas. En este caso mi recomendación es que lo ataques por medio del datawindow control. El datawindow control por ser una clase visual, contiene aspectos como eventos, estos eventos son realmente procesos que el programador puede utilizar, en el momento de ejercer una acción sobre la clase, en algunos casos los eventos permiten continuar o no, con la ejecución normal de la acción, la cual es conocida como método, Con relación a tu inquietud, puedes utilizar un evento llamado ITEMCHANGED(), este evento es disparado cada vez que cambia el valor de la columna en cuestión. Igualmente dicho evento te informa de valores por medio de variables que son utilizadas como argumentos. ROW = fila actual en el datawindow object. DWO = el objeto que contiene el foco de edicion. DATA = el valor que va a ser asentado a el objeto que tiene el foco de edición y que por el momento solo se encuentra en el buffer de video. Utilizando estos argumentos tu puedes montar por ejemplo un concepto de validación en este evento. Digamos que intentas impedir que una columna del tipo numérico permita recibir del usuario valores negativos. Y que ademas envíe un mensaje y no permita continuar con la edición de otra columna asumamos que la columna tiene como destino integrar un salario. INTEGER li_return = 0 DECIMAL{2} ldc_valor CHOOSE CASE LOWER(DWO.name) CASE 'salario' ldc_valor = DEC(data) IF (ldc_valor < 0) THEN li_return = 1 MESSAGEBOX('ERROR', 'NO ESTA PERMITIDO INGRESAR VALORES NEGATIVOS') END IF END CHOOSE RETURN(li_return) Permíteme explicar el script. Como podrás observar lo primero que hago es declarar una variable del tipo INTEGER, en la cual integro un valor 0, esta variable tiene la finalidad de retornar al método que disparo este evento, este mismo valor, si devuelvo 0, significa que todo fue bien, de lo contrario puedo devolver los siguientes valores. 1 = no permite el cambio de foco, y rechaza el valor 2 = permite el cambio de foco y rechaza el valor En el ejemplo utilizo el 1, Igualmente veras que utilizo la función LOWER(), la cual convierte cualquier valor string a minúsculas, con esta función minimizo los posibles errores de digitación con respecto a los nombres de las columnas, la cual es proporcionada por el objeto DWO (DATA WINDOW OBJECT), auxiliado por la propiedad NAME, que contiene el nombre del objeto en el datawindow object. Por ultimo convierto el valor de DATA a decimal, pues es DATA quien tiene el valor que en ese momento esta ingresando el usuario pero que aun no ha sido integrado en la columna. Con todo este escenario ahora puedo preguntar por el valor ingresado en su tipo nativo, si la condición integrada luego de saber que el objeto que tiene el foco es "salario" se cumple, simplemente cambio el valor de li_return a 1 y envío un mensaje de advertencia. En tu caso el valor que debes retornar por medio del evento realmente deberá ser 0, pues la intención de utilizarlo no es para validar, sino que para proporcionar una relación con respecto a el valor que esta cambiando. Entonces en lugar de validar el valor, lo envías como argumento en una función o integras, las instrucciones en ese mismo lugar. Por ejemplo puedes evaluar el valor que contiene la variable data CHOOSE CADE INTEGER(data) CASE 1 Efecto en el datawindow 2 ... .. CASE 2 CASE 3 END CHOOSE Como te dije al principio, este mismo proceso puede ser integrado directamente en el datawindow object, pero esto sera harina de otro costal.