Вы находитесь на странице: 1из 33

PowerBuilder

Aplicacin
Maestro Detalle
Autor: Vsquez Blas Leopoldo
infotutoriales.info

lexblas@gmail.com
15/01/2016

Vsquez Blas Leopoldo

infotutoriales.info

PowerBuilder Aplicacin Maestro Detalle

1. Lo primero que haremos es disear e implementar nuestra base de datos. En este caso
usar Microsoft SQL Server 2008.

Diagrama de base de datos


2. Crearemos nuestra aplicacin en PowerBuilder

Aplicacin
Como hemos visto en el diagrama de nuestra base de datos, contamos con tres tablas. La
tabla cabecera, ser la tabla maestro y la detalle ser (valga la redundancia) el detalle. Con

Vsquez Blas Leopoldo

infotutoriales.info

respecto a la tabla producto, los datos los llenaremos desde la misma base de datos. Nos
centraremos en la implementacin de la ventana maestro detalle.
3. Creacin de la conexin con la base de datos.
Crearemos la conexin a travs de ODBC.
Nos dirigimos al panel de control y elegimos herramientas administrativas.

Panel de control
Luego elegimos orgenes de datos ODBC.

Vsquez Blas Leopoldo

infotutoriales.info

Clic en el botn agregar.

Seleccionamos en mi caso SQL Server Native Client 10.0. Ustedes seleccionaran la


versin con la cual estn trabajando. Luego clic en finalizar.

Vsquez Blas Leopoldo

infotutoriales.info

Clic en siguiente

Lo dejaremos con autenticacin integrado de Windows. Para esto en SQL Server debe
estar en modo de autenticacin mixta.
Vsquez Blas Leopoldo

infotutoriales.info

Clic en siguiente

Clic en siguiente.

Vsquez Blas Leopoldo

infotutoriales.info

Vsquez Blas Leopoldo

infotutoriales.info

Al hacer clic en el botn test data source, les debe aparecer otra ventana indicando que
la prueba de conexin fue exitosa. Con esto ya tenemos nuestra configuracin ODBC.
Podemos crear el perfil de conexin de la base de datos a travs del Database Profile o
a travs de Database.

Vsquez Blas Leopoldo

infotutoriales.info

Vsquez Blas Leopoldo

infotutoriales.info

Luego nos dirigimos a la pestaa Preview y ah probamos la conexin con nuestra base
de datos.

Vsquez Blas Leopoldo

infotutoriales.info

Clic en el botn copy para copiar el script generado para la conexin, el cual pegaremos
en nuestra aplicacin. Finalmente clic en ok para cerrar y guardar nuestro perfil de
conexin a la base de datos.
Nos dirigimos a nuestra aplicacin y en el evento open pegamos el cdigo de conexin.

4. Diseo de la ventana
Para estar seccin solo usaremos datawindows para la cabecera y detalle. Tambin
podramos usar los controles comunes, instrucciones sql y cursores.
La ventana se llamar w_maestro_detalle.

Nota: Los nombres de los controles estn separados por un guion bajo _.

Vsquez Blas Leopoldo

infotutoriales.info

5. Creacin de los objetos datawindows


Crearemos tres objetos datawindows:
1 del tipo freeform para la cabecera.
2 del tipo grid. Uno para la bsqueda de los productos y otro para el detalle.
Antes de continuar, verificar si estamos conectados a la base de datos correcta. El perfil
que hemos creado debe estar con un check verde, indicando que es la conexin activa.

De no estar activa la conexin, simplemente clic derecho sobre el perfil y


seleccionamos connect

Vsquez Blas Leopoldo

infotutoriales.info

Dw_cabecera.

En esta venta podramos haber escogido Quick Select, pero escogeremos SQL Select.

Vsquez Blas Leopoldo

infotutoriales.info

En esta ventana seleccionamos la tabla cabecera y presionamos el botn open.


En la ventana siguiente seleccionamos todos los campos de la tabla.

Vsquez Blas Leopoldo

infotutoriales.info

En la siguiente ventana tenemos los parmetros de diseo de nuestro datawindows. Lo


dejaremos con los valores por defecto.

Vsquez Blas Leopoldo

infotutoriales.info

Aqu ya tenemos nuestro objeto datawindow creado. Por un lado estn los nombres de
las columnas (etiquetas) y por el otro los valores de las columnas. En esta parte
podemos disear nuestro datawindow dndole una mejor presentacin.

En este datawindow agregaremos un argumento.

El argumento se llamara cod y ser del tipo number.

En la siguiente ventana, en la seccin column escogemos el campo idmovimiento. En el


operador lo dejamos con = y en value realizamos clic derecho y seleccionamos
arguments y seleccionamos cod, el cual es el argumento que acabamos de crear.
Vsquez Blas Leopoldo

infotutoriales.info

Despus de darle un poco de formato, grabaremos nuestro datawindow con el nombre


de dw_cabecera.

Siguiente paso es hacer lo mismo con los otros datawindows, pero usando datagrid.

Vsquez Blas Leopoldo

infotutoriales.info

Dw_producto

Guardamos nuestro datawindow con el nombre de dw_producto.

Vsquez Blas Leopoldo

infotutoriales.info

Dw_detalle

En el caso del detalle, le agregaremos un argumento.

Vsquez Blas Leopoldo

infotutoriales.info

El argumento se llamara cod y ser del tipo number.

En la siguiente ventana, en la seccin column escogemos el campo idmovimiento. En el


operador lo dejamos con = y en value realizamos clic derecho y seleccionamos
arguments y seleccionamos cod, el cual es el argumento que acabamos de crear.

Vsquez Blas Leopoldo

infotutoriales.info

En la siguiente ventana presionamos en el botn con los puntos suspensivos para


seleccionar el datawindow desde donde se mostraran los datos para la columna idproducto.

Vsquez Blas Leopoldo

infotutoriales.info

Guardamos nuestro datawindow con el nombre de dw_detalle.

Vsquez Blas Leopoldo

infotutoriales.info

6. Implementando la aplicacin

Ahora en cada control datawindow en el evento contructor, agregamos lo siguiente.


This.settransobject(sql). Este es el objeto transaccin con el cual trabajaremos.

Si deseamos ver cmo est quedando nuestra aplicacin en tiempo de ejecucin, debemos
agregar el siguiente cdigo en el evento de la aplicacin.
connect using sqlca;//Nos conectamos a nuestra base de datos usando el objeto de
transaccin por defecto llamado sqlca.
open(w_maestro_detalle)//indicamos que se abra nuestra ventana.

Vsquez Blas Leopoldo

infotutoriales.info

Ejecutamos nuestra aplicacin y se vera de la siguiente manera.

Como vemos, no se muestran las columnas o cabeceras en nuestro datawindow cabecera.


Para poder visualizarlo, debemos agregar una fila. Con respecto al datawindow producto,
debemos agregar la instruccin retrieve para recuperar los datos que estn en la tabla
producto.

Si ejecutamos nuevamente nuestra aplicacin, se ver de la siguiente manera.

Vsquez Blas Leopoldo

infotutoriales.info

En el evento open de la ventana agregamos el siguiente cdigo

La bsqueda de productos.
Dentro del sle_buscar, en el evento modified agregamos el siguiente cdigo.
if this.text="" then//si esta vacio
dw_buscar.setfilter( "")//limpia el filtro para que se muestren todos los datos
else
dw_buscar.setfilter( " descripcion like '%"+ this.text+"%'")//de caso contrario
asigna un filtro comparando el campo descripcin con el texto ingresado.
end if

Vsquez Blas Leopoldo

infotutoriales.info

dw_buscar.filter( )//aplica el filtro.

Validar para que no se agregue el mismo producto ms de una vez en el detalle.

Generar cdigo correlativo.


Para generar el cdigo correlativo crearemos una funcin. Esta funcin estar
implementada en la aplicacin. Tambin podramos usar un procedimiento almacenado
o colocar la columna como identidad.

Vsquez Blas Leopoldo

infotutoriales.info

Funcin uf_generarcodigo
integer li_cod
SELECT max(cabecera.idmovimiento )
INTO :li_cod
FROM cabecera ;
if li_cod=0 or isnull(li_cod) then
li_cod=1
else
li_cod++
end if
return li_cod

Botones
En el botn nuevo agregamos en siguiente cdigo.

En la lnea nmero cuatro, estamos asignando el valor generado por la funcin en la


columna nmero uno, que es el idmovimiento. Tambin agregaremos el cdigo para
limpiar el detalle y el sle_buscar.
dw_cabecera.retrieve( 0)
dw_cabecera.insertrow( 1)
dw_cabecera.setfocus( )

Vsquez Blas Leopoldo

infotutoriales.info

dw_cabecera.setitem( 1,1, uf_generarcodigo() )


dw_detalle.retrieve( 0)
dw_buscar.retrieve( )
sle_buscar.text=""
cb_nuevo.enabled=false
cb_guardar.enabled=true
cb_cancelar.enabled=true
Debera quedar como en la siguiente imagen.

Botn cb_cancelar

Botn guardar

La instruccin update devuelve el valor 1 si se guard satisfactoriamente, si ha


ocurrido algn error devolver -1. Entonces para poder grabar el detalle, primero

Vsquez Blas Leopoldo

infotutoriales.info

verifico que la cabecera se guarde correctamente, luego procedo a guardar el detalle. Si


se ha producido algn error, hago uso de la instruccin rollback para deshacer los
cambios.
Para la actualizacin del stock, podramos usar triggers o bien crear una funcin y
recorrer el detalle e ir actualizando cada producto agregado.

7. La aplicacin en ejecucin.

Si se intenta agregar ms de una vez el mismo producto.

Vsquez Blas Leopoldo

infotutoriales.info

Si se ingresaron los datos correctamente, aparecer un mensaje indicando que los datos
se guardaron correctamente.

Vsquez Blas Leopoldo

infotutoriales.info

8. Agregando otras funcionalidades.


Creacin la funcin actualizar stock

La fucion se llamar uf_actualizarstock. Tendra como argumentos o parmetros


Idproducto, movimiento y cantidad. Si el movimiento es Salida S se restara del stock,
de caso contrario se sumara la cantidad al stock existente.

Vsquez Blas Leopoldo

infotutoriales.info

No se ha realizado ninguna validacin si la cantidad supera al stock permitido.


Actualizamos el botn guardar.

Por cada producto ingresado en el detalle, debemos llamar a la funcin actualizar


pasndole los parmetros correspondientes obtenidos del detalle.
Dando formato al datawindow cabecera.
Seleccionamos el campo fecha.

Nos dirigimos a la pestaa Edit y seleccionamos en Style Type EditMask.


En Mask ingresamos la mascara dd/mm/yyy

Vsquez Blas Leopoldo

infotutoriales.info

Siguiente paso: Seleccionar el campo movimiento.

Vsquez Blas Leopoldo

infotutoriales.info