Buscar en el Blog

domingo, 25 de octubre de 2020

Miniproyecto Powerbuilder Datawindows

 



En esta ocasión vamos a crear un pequeño proyecto, en el cual solo vamos a implementar la parte principal,el Core del negocio .  Este proceso debe permitir ingresar la fecha, el Po Number, seleccionar un supplier code e ingresar un receive number. Ademas de poder seleccionar varios productos para ser agregados a la lista que se encuentra ubicada en la parte inferior. Los datos que la lista debe contener es el producto, la cantidad y el texto ingresado en la caja de texto info.
Al presionar aceptar(guardar), debe insertar un registro en la tabla document y n registros en la tabla document detail, segun la cantidad de productos ingresados en la lista(detalle).


Nota: Los productos y supplier se agregaron manualmente para solo dedicarse a realizar el core.

Para avanzar con el tutorial, vamos a saltarnos los pasos de la creación del proyecto y la creación de la conexión a la base de datos.

Después de crear el proyecto y realizar la conexión, vamos a agregar dos ventanas.

Una se llamará w_lista y la otra w_registro.
La ventana w_lista tengra un dw que mostrará los documents registrados. Agregamos tres botones, el nuevo, eliminar y salir. Solo programaremos el botón nuevo y eliminar (a estas alturas ya deberían saber como programar el botón salir).

El siguiente paso es crear el objecto dw que contendrá la información de la tabla documents y su tabla relacionada (supplier).

Seleccionamos New Datawindow del tipo grid.



Seleccionamos las tablas document y supplier, así como las columnas que deseamos mostrar.
Click en el boton return, luego siguiente y finalizar.

Con esto tendremos nuestro objeto dw creado, pero aun falta guardarlo. Le pondremos por nombre dwgr_lista.

Regresamos a la ventana w_lista y asignamos el dw control el objecto dw que hemos creado.




Entramos al control dw y buscamos el evento constructor
Agregamos el siguiente código (para obtener los datos desde la base de datos, por ahora no mostrará nada porque esta vacío).



En la venta w_registro deben agregar los siguientes controles y asignarle los nombres que aparecen en la imagen.


Ademas de asignarle a la venta en la propiedad windowType el tipo response.


Para la cabecera crearemos un datawindow object(dw object o dwo) del tipo freeform.

Seleccionamos la tabla document y seleccionamos todas las columnas.

Luego nos vamos al menu Design y seleccionamos Retrieval Arguments.






Le asignamos el argumento creado a la columna document number.

Una vez hecho esto guardamos el dw con el nombre de dwff_document. Debe verse similar a la imagen.
Recuerden que apara el supplier se debe seleccionar de una lista. Estos datos ya deben estar ingresados en la tabla supplier para que aparescan. Para esto debemos crear otro dw y enlazar la columna supplier code del dwff_documento con el nuevo dw que vamos a crear. 





El nuevo dw que contendrá la lista de supplier sera del tipo tabular(también podría haber sido del tipo grid). 

Ocultamos el header y debería verse así.

Este dw lo guardamos con el nombre dwtb_supplier.
Regresamos al dwff_document y seleccionamos la columna supplier code. Luegos nos dirigimos a la pestaña Edit y en la propiedad Style type seleccionas dropdowndw


En la parte inferior seleccionamos el dw tabular, la columna que se mostrara y la que se va a guardar.


En la columna date editamos la propiedad mask y le asignamos el formato dd/mm/yyyy



Guardamos los cambios y asignamos en el dw_cabecera el dwo dwff_documento.




Vamos a crear otro dw para el detalle.

Retornamos y en la parte del diseño ocultamos las dos primeras columnas.





Guardamos el dw con el nombre de dwgr_detalle y asignamos este dwo al dw control llamado dw_detalle.


En el evento open de la ventana agregamos el siguiente código.


if message.doubleparm>0 then
dw_cabecera.retrieve(message.doubleparm)
dw_detalle.retrieve(message.doubleparm)
else
dw_cabecera.insertrow(1)
end if

Explicacion:
if message.doubleparm>0 then //preguntamos si recibe un message del tipo double, de ser así 
recuperamos los datos según el parámetro pasado. Recuerden que asignamos un argumento en los  objetos datawindows que habíamos creado. De caso contrario, inserta un registro en blanco en la cabecera.

Para ir viendo como va quedando agregaremos el siguiente script en el evento open de la aplicación.





En el botón nuevo de la ventana w_lista agregamos lo siguiente.
Explicación: 
Abrimos la ventana pasando como parámetro el valor cero, de esta manera indicamos que vamos a registrar un nuevo registro. Si la ventana w_registro devuelve un mensaje del tipo double mayor a cero, entonces actualizamos el dw.






Ejecutamos la aplicación y debe verse de esta manera. 


Poco a poco va tomando forma.


 Regresamos a la ventana w_registro y vamos a crear tres funciones.

La primera se llamará uf_buscar, para lo cual primero vamos a tener que crear otra ventana del tipo response para poder buscar el producto a seleccionar. La ventana se llamará w_buscar y el dwo dwgr_product. No olviden colocar el WindowType que sea del tipo response.



Aquí creamos una función llamada uf_seleccionar()
int fila
string id_product
fila=dw_1.getrow()
if fila=0 then
return
end if
id_product=dw_1.getitemstring( fila,"product_code")

closewithreturn(this,id_product)

Esta función la llamaremos desde el evento doubleclic del dw control y desde el evento clic del cb_seleccionar.

Agregar además en el evento construct del dw control


Regresamos a la ventana w_registro y en la función uf_buscar agregamos el siguiente código.
Abrimos la ventana w_buscar, si el parámetro es correcto hacemos un select para obtener los datos del producto seleccionado (Esto también se podría haber hecho usando struct, el cual seria el valor devuelto por la ventana w_buscar).


Agregamos otra función llamada uf_agregar().


Agregamos otra función llamada uf_guardar





int id,i
dw_cabecera.accepttext( )
dw_detalle.accepttext( )

if dw_cabecera.update( )= 1 then
id=dw_cabecera.getitemnumber(1,1)
for i=1 to dw_detalle.rowcount( )
dw_detalle.setitem( i, "document_number", id)
next
if dw_detalle.update( )=1 then
commit using sqlca;
closewithreturn(this,1)
else
rollback using sqlca;
messagebox("Error",sqlca.sqlerrtext)
end if
else

rollback using sqlca;
messagebox("Error",sqlca.sqlerrtext)

end if



Ademas en el evento construct del dw_cabecera agregar el objeto de transacción.
y en el dw_detalle





Ejecutamos la aplicación para ir viendo como esta quedando. Le damos clic en nuevo y se abrirá la ventana de registro. Si desplegamos el campo supplier podemos observar que se muestra la lista de supplier que están registradas en la base de datos(ingresadas manualmente).


Agregamos el llamado de las funciones uf_agregar y uf_buscar en los botones cb_agregar y cb_buscar

No nos olvidemos del botón aceptar



Ejecutamos la aplicación para probarla.





Al ingresar los datos y al presionar el botón aceptar debe registrar los datos en la base de datos y mostrarlo en el dw de la ventana w_lista.






Si no se muestra ninguna datos verificar si se ha guardado en la base de datos y en e evento construct del dw_1 de la ventana w_lista verificar que este el siguiente codigo:

this.settransobject( sqlca)
this.retrieve( )

Descargar







1 comentario:

Nota: solo los miembros de este blog pueden publicar comentarios.