Buscar en el Blog

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

martes, 16 de enero de 2024

Crear archivos Log en PowerBuilder

 Crear archivos Log en PowerBuilder



Estoy seguro que a más de uno se ha visto en la necesidad de crear log para poder realizar seguimiento a algunos procesos de sus sistemas. Para esto he creado una clase que simplifica el proceso de creación de estos archivos.

Esta clase tiene varios funciones que podemos usar.

  • of_log(runtimeerror)
    • Recibe como parametro un objeto runtimeerror y escribe en el archivo log el detalle del error.
  • of_log(string)
    • Recibe un string que es escrito en el archivo log.
  • of_log(string,string)
    • Recibe dos string que es escrito en el archivo log.
    • El primero es el tipo de mensaje que puede ser IS_TIPO_ERROR o IS_TIPO_INFORMATION. También pueden pasarle un tipo personalizado.
    • El segundo es la descripción o mensaje a escribir en el log.
  • of_log(string runtimeerror)
    • Recibe como parametro un string y un objeto runtimeerror.El primero es el tipo de mensaje y el segundo el objeto error para escribir el detalle del error.

Instancia

Se puede crear la instancia en el evento open de la aplicación y declarar el objeto como una variable global.
gc_log=create cc_lexblas_log Se indica el directorio base.
gc_log.is_directory_base="C:/" Se indica el en donde estaran los archivos log. Si no existe el directorio será creado.
gc_log.is_log_directory="logger"

Destruyendo la instancia

En el evento close de la aplicación destruimos la instancia del objeto. destroy gc_log

Archivo cc_lexblas_log.sru

Si trabaja con una versión distinta a 11.5 puede importar el objeto usando el archivo cc_lexblas_log.sru


martes, 6 de septiembre de 2022

BARCODE 128 PowerBuilder

 


Code 128 es un código de barras de alta densidad, usado ampliamente para la logística y paquetería. Puede codificar caracteres alfanuméricos o solo numéricos. Con este código es posible representar todos los caracteres de la tabla ASCII, incluyendo los caracteres de control.


Para comprender cómo se codifica este código, debemos tener en cuenta que cada ASCII se codifica mediante 11 barras.

https://es.wikipedia.org/wiki/Code_128


El código fue adaptado desde vbs http://www.myonlinetraininghub.com/create-barcodes-with-excel-vba



Se de instalar la fuente code128.ttf


https://github.com/LEXBLAS/barcode128pb.git




martes, 20 de abril de 2021

Obtener el indice seleccionado en Dropdownlistbox | Powerbuilder

 Para obtener el indice seleccionado en un Dropdownlistbox  vamos a crear un objeto Standar Visual que herede de este objeto.



Una vez creado el objeto nos posicionamos en la pestaña instance variables


Agregamos una variable que almacenara el índice seleccionado, en este caso le pondré de nombre índice.




En el evento selectionchange coloco lo siguiente:
Con esto ya tengo almacenado el índice seleccionado y puedo acceder a el externamente.

Guardo los cambios y le coloco un nombre, en mi caso le coloque cuvo_ddlb.

Para probarlo lo agregamos una ventana, para esto simplemente arrastramos el objeto a la ventana y soltamos. Además agregamos un botón a la ventana.



En el ddlb agregamos elementos desde las propiedades(también podríamos hacerlo mediante código)
Después de esto dentro del botón en el evento clic agregamos lo siguiente:

int i
i=ddlb_1.indice
messagebox("",string(i))
ddlb_1.deleteitem( i)

Donde índice es el nro de elemento seleccionado y ddlb_1 es el nombre del ddlb.

Con este código muestro en un mensaje el índice del elemento seleccionado y además elimino el ítem.



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