Buscar en el Blog

Mostrando entradas con la etiqueta powerbuilder. Mostrar todas las entradas
Mostrando entradas con la etiqueta powerbuilder. Mostrar todas las entradas

miércoles, 1 de febrero de 2017

PowerBuilder - usando Treeview - Creando un Menu para nuestro sistema


Lo primero será agregar un treeview al que llamaremos tv_menu y un boton. Dentro del  boton es donde vamos a programar a modo de ejemplo. Una vez terminado, ustedes pueden colocar el codigo dentro de constructor del treeview.

El siguiente paso es agregar imagenes al treeview, los cuales seran usados para ser asignados a los items del treeview.

El número que esta al lado izquierdo de la imagen, indica el indice asignado de la imagen. Por ejemplo si deseamos asignar la imagen Asterisk a un item, entonces usaremos el indice 2.

Para insertar los items en el treeview usaremos la funcion insertitemlast.

control_treeview.insertitemlast( padre, "texto que aparecera",indice_de_la_imagen)


El primero parametro que recibe la funcion es el indice del padre, al iniciar el primer item o los primeros items, se le asigna el numero cero. El siguiente parametro es el texto que aparecera en el item y el tercer parametro es el indice de la imagen que se mostrará al lado del item.

Conforme se vayan insertando items, se van asignando automaticamente un indice correlativo.



Si queremos insertar un item hijo a compras el código seria así.


//hijos de Compras
tv_menu.insertitemlast( 3, "Proveedores",5)//11



Codigo para insertar los items al treeview
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//padres
tv_menu.insertitemlast( 0, "Almacen",1)//id 1
tv_menu.insertitemlast( 0, "Ventas",2)//id 2
tv_menu.insertitemlast( 0, "Compras",3)//id 3
tv_menu.insertitemlast( 0, "Configuracion",4)//id 4
//hijos

//hijos de almacen
tv_menu.insertitemlast( 1, "Tablas",7)//5
tv_menu.insertitemlast( 1, "Articulos",8)//6
tv_menu.insertitemlast( 1, "Grupos",9)//7

//hijos de Ventas
tv_menu.insertitemlast( 2, "Clientes",4)//8
tv_menu.insertitemlast( 2, "Documento de Venta",2)//9
tv_menu.insertitemlast( 2, "Reportes",3)//10

//hijos de Compras
tv_menu.insertitemlast( 3, "Proveedores",5)//11
tv_menu.insertitemlast( 3, "Documento de Compra",4)//12
tv_menu.insertitemlast( 3, "Reportes",7)//13

//hijos de Configuracion
tv_menu.insertitemlast( 4, "IGV",8)//14

//hijos de reporte de compras

tv_menu.insertitemlast( 13, "Reportes mensual",6)//15

/*********************************************************/



Si ejecutamos la aplicacion veremos que los items aparecen todos colapsados. Para desplegar los items usaremos el siguiente código.

long ll_tvi
int i

ll_tvi = tv_menu.FindItem(RootTreeItem! , 0)
tv_menu.ExpandAll(ll_tvi)
for i=1 to 3
    ll_tvi = tv_menu.FindItem(NextTreeItem! ,ll_tvi )
    tv_menu.ExpandAll(ll_tvi)

next



Si queremos abrir una ventana cuando presionen dos veces sobre un item, entonces debemos programar en el evento doubleclicked.
Para saber en que item se realizo el doble click, usamos el argumento handle del evento. Este argumento contiene el numero que indica el indice del item. Entonces para abrir una ventana sabiendo el numero de item seleccionado, usaremos choose case.


choose case handle
    case 5
        open(w_ventana1)
    case 6

        //otra ventana
    case 7

      //otra mas
end choose


Nota: Debe agregar una ventana llamada w_ventana1 al proyecto.


martes, 31 de enero de 2017

PowerBuilder usando Dropdowndw




PowerBuilder usando Dropdowndw

En el presente video se mostrará como usar columnas dropdowndw dependientes y el uso de getchild


lunes, 11 de julio de 2016

PowerBuilder: Ocultar campos en Powerbuilder por condicion.

En nuestras aplicaciones a veces necesitamos ocultar algunos campos según la opción que nosotros escojamos. Esta funcionalidad se puede realizar mediante código, pero también podemos hacerlo a traves de algunas propiedades y con menos código. Por ejemplo, según sea la selección del documento Boleta o Factura. Si es Boleta, no debe aparecer el subtotal ni el igv. De caso contrario, si es factura, si debe aparecer.




Aquí les mostraré los pases que se deben seguir.
  1. Debesmos estar en el objeto datawindow.
  2. Seleccionar el campo u objeto a  condicionar.
  3. Presionar el boton que esta al lado derecho de la propiedad visible.
  4. En la ventana de expresiones colocar la condicion. Por ejemplo en mi caso. 
if( tipodocumento =2,1,0) 

Si tipodocumento es dos, entonces que sea visible Caso contrario esta invisble.
Tipodocumento es el campo por el cual yo realizo la condicion. Si es Factura que se muestre, de caso contrario, si es Boleta  que oculte.





jueves, 4 de febrero de 2016

PowerBuilder: Conexion a Sql Server usando OLEDB


PowerBuilder: Conexion a Sql Server usando OLEDB





// Profile OLEDB
SQLCA.DBMS = "OLE DB"
SQLCA.LogPass = "password"
SQLCA.LogId = "sa"
SQLCA.AutoCommit = False
SQLCA.DBParm = "PROVIDER='SQLOLEDB',DATASOURCE='.',PROVIDERSTRING='database=almacen'"
connect using sqlca;


viernes, 22 de enero de 2016

PowerBuilder: Trabajando con columna identidad - Sql Server


Tomando como referencia la aplicacion desarrollada en el post anterior, modificaremos el codigo y nuestra base de datos para generar el codigo de una columna que esta como llave primaria, espeficando dicho campo como identidad.

Primer paso.
Asignar el campo como identidad.




Segundo paso.
Seleccionamos nuestro datawindow cabecera, clic derecho y seleccionamos modificar.
En el menu Rows seleccionamos update properties.




Seleccionamos la columna identidad y le damos clic en ok. Guardamos los cambios en el datawindow.

Tercer paso.
Modificar el script del agregar producto.
En el evento doublecliced colocaremos como comentario.

Cuarto paso.
En el boton nuevo, colocamos como comentario la linea en donde generamos el codigo.
Quinto paso.
En el boton guardar debemos agregar y modificar algunas lineas del sccript.

integer i,j,li_codproducto, li_cantidad,li_codmovimiento
string ls_movimiento
dw_cabecera.accepttext( )
ls_movimiento=trim(dw_cabecera.getitemstring(1,3))
if dw_cabecera.update()=1 then    
    j=dw_detalle.rowcount( )
    li_codmovimiento=dw_cabecera.getitemnumber( 1,1)
        for i=1 to j
                dw_detalle.setitem( i, 1,li_codmovimiento)
        next
    if dw_detalle.update( )=1 then
        for i=1 to j
            li_codproducto=dw_detalle.getitemnumber( i,2)
            li_cantidad=dw_detalle.getitemnumber( i,3)
            uf_actualizarstock(li_codproducto,ls_movimiento,li_cantidad)
        next
        commit using sqlca;
        messagebox("Exito","Se guardaron los datos")
    else
        messagebox("error","No se guardaron los datos")
        rollback using sqlca;
    end if
else
    messagebox("error","No se guardaron los datos")
end if

Por tanto, el boton nuevo, deberia verse así.






miércoles, 20 de enero de 2016

Sending Key Press


Primero declaramos el API Win32
Subroutine keybd_event( int bVk, int bScan, int dwFlags, int dwExtraInfo) Library "user32.dll"


Luego ingresamos el codigo en el boton

integer li_tecla
li_tecla= 65 // caracter A en ascii. Revisar el codigo Ascii
sle_1.setfocus() // foco en el control sle_1
keybd_event( li_tecla, 1, 0, 0)


 

ejecutar VBScript desde PowerBuilder - Microsoft Script Control (msscript.ocx)



OleObject ole_wsh
Integer li_rc, i, j, k

ole_wsh = Create OleObject
li_rc = ole_wsh.ConnectToNewObject ("MSScriptControl.ScriptControl")
ole_wsh.language = "vbscript"
ole_wsh.addcode("function nombre_funcion(parametro) nombre_funcion = parametro end function")
ole_wsh.executestatement ('if 2 > 1 then msgbox nombre_funcion("true") else msgbox nombre_funcion("false") end if')

martes, 19 de enero de 2016

Abrir una aplicacion desde PowerBuilder

integer li_rc
OleObject ole_wsh

ole_wsh = CREATE OleObject
li_rc = ole_wsh.ConnectToNewObject ( "WScript.Shell" )
ole_wsh.Run ("Notepad")
ole_wsh.AppActivate("Untitled - Notepad")
Sleep (500)
ole_wsh.SendKeys ("Hola mundo") 
Pero primero debe declarar la subroutina Sleep
 
 Subroutine Sleep (Long dwMilliseconds) Library "kernel32" Alias for "Sleep"

PowerBuilder : Obtener el dominio - Nombre de usuario y el nombre de la computadora.

 
 
integer li_rc
OleObject ole_wsh

ole_wsh = CREATE OleObject
li_rc = ole_wsh.ConnectToNewObject ( "WScript.Network" )
IF li_rc = 0 THEN
     MessageBox ("Dominio", string( ole_wsh.UserDomain ))
     MessageBox ("Usuario", string( ole_wsh.UserName ))
     MessageBox ("Nombre de la computadora", string( ole_wsh.ComputerName ))
END IF

viernes, 15 de enero de 2016

PowerBuilder: Aplicacion Maestro- Detalle usando Datawindow con conexion a SQL Server





PowerBuilder


Aplicación Maestro Detalle


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



2.      Crearemos nuestra aplicación en PowerBuilder 

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 respecto a la tabla producto, los datos los llenaremos desde la misma base de datos. Nos centraremos en la implementación de la ventana maestro detalle.

3.      Creación de la conexión con la base de datos.
Crearemos la conexión a través de ODBC.
Nos dirigimos al panel de control y elegimos herramientas administrativas.

Luego elegimos orígenes de datos ODBC.( Si ya conoces como realizar la conexion, puedes saltarte la seccion)
 

Al usar autenticacion integrada de windows, debemos verificar nuestra configuracion en Nuestro Gestor de Base de Datos.


 

 

Al hacer clic en el botón test data source, les debe aparecer otra ventana indicando que la prueba de conexión fue exitosa. Con esto ya tenemos nuestra configuración ODBC.

Podemos crear el perfil de conexión de la base de datos a través del Database Profile  o a través de Database.

 










Clic en el botón copy para copiar el script generado para la conexión, el cual pegaremos en nuestra aplicación. Finalmente clic en ok para cerrar y guardar nuestro perfil de conexión a la base de datos.

Nos dirigimos a nuestra aplicación y en el evento open pegamos el código de conexión.



4.      Diseño de la ventana
Para estar sección solo usaremos datawindows para la cabecera y detalle. También podríamos usar los controles comunes, instrucciones sql y cursores.
La ventana se llamará w_maestro_detalle.
  


Nota: Los nombres de los controles están separados por un guion bajo “_”.


5.      Creación de los objetos datawindows
Crearemos tres objetos datawindows:
·         1 del tipo freeform para la cabecera.
·         2 del tipo grid. Uno para la búsqueda 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 conexión activa.


 

  • Dw_cabecera





En esta venta podríamos haber escogido Quick Select, pero escogeremos SQL Select.






En la siguiente ventana tenemos los parámetros de diseño de nuestro datawindows. Lo dejaremos con los valores por defecto.





Aquí ya tenemos nuestro objeto datawindow creado. Por un lado están los nombres de las columnas (etiquetas) y por el otro los valores de las columnas. En esta parte podemos diseñar nuestro datawindow dándole una mejor presentación. 


En este datawindow agregaremos un argumento.





En la siguiente ventana, en la sección 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.




Después de darle un poco de formato, grabaremos nuestro datawindow con el nombre de dw_cabecera.


  • Dw_producto
 
Guardamos nuestro datawindow con el nombre de dw_producto.

  • Dw_detalle

   








Guardamos nuestro datawindow con el nombre de dw_detalle.



6.      Implementando la aplicación

Ahora en cada control datawindow en el evento contructor, agregamos lo siguiente.
This.settransobject(sql). Este es el objeto transacción con el cual trabajaremos.


Si deseamos ver cómo está quedando nuestra aplicación en tiempo de ejecución, debemos agregar el siguiente código en el evento de la aplicación.
connect using sqlca;//Nos conectamos a nuestra base de datos usando el objeto de transacción por defecto llamado sqlca.
open(w_maestro_detalle)//indicamos que se abra nuestra ventana.
 




Si ejecutamos nuevamente nuestra aplicación, se verá de la siguiente manera. 


 La búsqueda de productos.
Dentro del sle_buscar, en el evento modified agregamos el siguiente código.

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 descripción con el texto ingresado.
end if
dw_buscar.filter( )//aplica el filtro.





Validar para que no se agregue el mismo producto más de una vez en el detalle.





Generar código correlativo.
Para generar el código correlativo crearemos una función. Esta función estará implementada en la aplicación. También podríamos usar  un procedimiento almacenado o colocar la columna como identidad.


Botones


 




7.      La aplicación en ejecución.



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


8.      Agregando otras funcionalidades.
Creación la función actualizar stock





La fucion se llamará uf_actualizarstock. Tendra como argumentos o parámetros Idproducto, movimiento y cantidad. Si el movimiento es Salida “S” se restara del stock, de caso contrario se sumara la cantidad al stock existente.

No se ha realizado ninguna validación si la cantidad supera al stock permitido.

Actualizamos el botón guardar.



Por cada producto ingresado en el detalle, debemos llamar a la función actualizar pasándole los parámetros correspondientes obtenidos del detalle.

Dando formato al datawindow cabecera.
Seleccionamos el campo fecha.










Google+ Seguidores