Hola experto aquí estoy de nuevo molestandonde, mi problema es el siguiente tengo dentro de mi DW el campo Signatario y lo que necesito es que cuando le de doble click o enter me habrá mi catalogo de signatario y así pueda seleccionar el nombre correcto y se inserte en el campo signataio. Cabe mencionar que el catalogo ya esta creado y cuenta con Altas, Bajas y Guardar De antemano muchas gracias por tu ayuda
Atentamente Abraham
1 respuesta
Respuesta de Antonio Garcia
1
1
Antonio Garcia, clipper todas sus versiones (manejo total) power builder todas...
Como ya sabrás las variables en power builder tienen 3 alcances, Publicas o globales. --> Las variables que se encuentran disponibles en toda la aplicación. Compartidas o shared --> son variables que pueden ser compartidas entre una aplicación y otra. Instancia --> variables que podría definir como privadas, estas trabajan al nivel del objeto, sin embargo pueden servir en un momento como propiedades de una instancia. La idea de utilizar una variable global es que puedas cambiar el valor de esta en cualquier parte de la palicacion, al tipo de la variable por recomendación, debería de ser el mismo de la columna a la que necesitas asignar el valor, por ejemplo si la columna tiene un tipo string, pues la variable debería ser string. Con respecto a tu script, simplemente no necesitas asignar el valor de ROW a otra variable pues esta ya es una variable, y contiene el numero de la fila activa en la pantalla, no el numero de filas del datawindow, con esta referencia simplemente encuentras la fila activa en el datawindow. Recuerda que la función setitem(), asigna el valor que indiques a la columna que indiques en el ejemplo asigna el valor de la variable ib_codigo_cliente, a la columna del datawindow, cod_cliente. De las cuales las dos son de tipo numérico.
Hola amigo muchas gracias por tu ayuda, solo que tengo varias dudas no entiendo muy bien lo de la variable global del mismo tipo del código de cliente y no se si estoy bien en mi script siguiente de antemano muchas gracias... long ls_filas ls_filas = ROW if ROWCOUNT() > 1 then if ls_filas > 0 then CHOOSE CASE LOWER(dwo.c_signatario) CASE 'cod_cliente' gi_codigo_signatario = -1 OPEN(w_signatario) IF (gi_codigo_signatario > 0) THEN THIS.SetItem(row, 'cod_cliente', gi_codigo_signatario) END IF END CHOOSE end if end if
La solución es muy simple. Si ya tienes hecho el catalogo de signatarios, (imagino que te refieres a la ventana que abre dichosvdatos.) Simplemente utiliza ahora el evento DOUBLECLICKED(), este evento es disparado en el momento que el botón derecho del ratón es activado en doble clic, las características de funcionamiento son muy similares a las del evento ITEMCHANGED(), los parámetros o argumentos que contiene el evento son XPOS -> posicion x del puntero del cursor YPOS -> posicion y del puntero del cursor ROW -> numero de fila seleccionada. DWO -> objeto del datawindow que contiene el foco. Tienes que tener en cuentra varias cosas, al momento de que el evento doubleclicked es activado, dentro de este deberás hacer las siguientes validaciones antes de hacer cualquier cosa. Primero: verificar que existen lineas dentro del datawindow, (por lo menos 1), esto lo sabes por medio de la función ROWCOUNT() Segundo: verifica que el valor de la variable ROW, sea mayor a 0, pues si esta contiene ese valor, significa que el doble click lo hiciste en la cabecera, o en el pie, y no dentro del detalle. Para determinar el campo que depende del doble click utilizas el objeto dwo con la propiedad "name" Veamos un ejemplo. Digamos que necesitas integrar en el código del cliente un numero, el cual puede ser escrito directamente o puede presentar una pantalla y en esta hacer una selección, colocando dicha selección en el código. Para el efecto, necesito primero haber creado una ventana que me presente todos los clientes. Y luego declarar una variable tipo GLOBAL, del mismo tipo del código del cliente, en la cual depositare el código seleccionado. En el caso que no seleccione nada, simplemente le coloco un valor representativo de error, digamos -1, lo que me dirá que no seleccione ningún dato. Por ejemplo simplemente cerré la ventana. Ok. El panorama esta montado. Utilizando el ventó DOUBLECLICKED() CHOOSE CASE LOWER(dwo.name) CASE 'cod_cliente' gi_codigo_cliente = -1 OPEN(w_clientes) IF (gi_codigo_cliente > 0) THEN THIS.SetItem(row, 'cod_cliente', gi_codigo_cliente) END IF END CHOOSE En el pequeño script, simplemente utilizo una variable global llamada gi_codigo_cliente, la cual es de valor -1 antes de abrir la ventana w_clientes, en la cual pinto todos los clientes disponibles, dentro de esta ventana tengo 2 botones, seleccionar y cerrar, si utilizo el botón seleccionar simplemente asigno el valor del código del cliente de esa fila, a la variable y cierro la ventana Gi_codigo_cliente, de lo contrario si cierro la ventana sin seleccionar nada, le doy un valor -1, cuando retorna el control a mi evento, puedo verificar que la variable tenga un valor mayor a cero o simplemente -1, esto determina que fue lo que sucedió, si es mayor a cero, simplemente asigno el valor a la columna del datawindow, la cual según la fila que tiene el foco, contendrá el nuevo valor. Para dar el efecto de espera, utilizo la ventana de clientes, del tipo RESPONSE, o sea hasta que no cierre esta ventana no puedo continuar con el resto.