Crear Objetos a partir de Tablas

 


Hoy quiero compartir una idea que me ronda la cabeza desde hace mucho tiempo, que es la generación automática de código en PowerBuilder.

En los ejemplos de Appeon, viene un ejemplo para generar estructuras a partir de datawindow y también hay otro ejemplo para crear datawindow a partir de tablas.

Pues hoy os traigo un refrito de ambos ejemplos, en los que a partir de las tablas se generan los objetos que luego podremos incorporar a nuestros proyectos.

La idea es poder tener un CRUD en una clase no visual. Esta clase se apoyará en una estructura para devolver los datos de un Select o para recibir los datos para un Insert o un Update.

La función global puede resultar útil en un reporte o en un datawindow en el que no se quiere complicar el Select simplemente para mostrar el valor de una columna.

ENTRAMOS EN DETALLE:

Estructura:

El primer objeto que podemos crear es una estructura, aunque se puede seleccionar qué campos queremos incluir, lo normal para hacer un CRUD es incluirlos todos, que es la opción por defecto.

Es tan sencillo como seleccionar la tabla que queramos y apretar el botón de Crear Sintaxis y el programa nos genera el código PowerBuilder para generar un objeto structure. Luego apretamos el botón Guardar Sintaxi y podemos guardar el objeto donde queramos para después importarlo en nuestro proyecto.

Tener la estructura de la tabla es necesario para poder usar la clase no visual del CRUD.

Instancia NVO:

El segundo objeto a crear es precisamente la clase no visual. En este caso he optado por no hacerla Auto-Instanciable, aunque es muy sencillo modificar el código si se desea lo contrario.

Al generar esta clase, se creara un objeto no visual llamado n_cst_nombreTabla con las siguientes funciones:

structure of_select (Campos Clave Primaria) throws exception

Con la función of _select podemos cargar un registro de una tabla en una estructura. Puede se útil hacer un Select, modicar algún campo de la estructura y luego hacer un Insert o un Update con esa estructura.

of_insert (structure astructure) throws  exception

Sirve para insertar un registro en la base de datos. Le pasaremos una estructura con todos los datos de la tabla a insertar.

of_update (structure astructure) throws exception

Sirve para actualizar un registro en la base de datos. Le pasaremos una estructura con todos los datos de a actualizar. En la misma estructura van los datos de la clave primaria para el Update. No se pueden actualizar los datos que sean de la clave primaria, para ellos habría que hacer un Delete y luego un Insert.

of_delete  (Campos Clave Primariathrows exception

Sirve para borrar un registro. Le pasaremos como parámetros la clave primaria de la tabla.

structure of_reset ()

Sirve para limpiar la estructura y poner todos sus valores en Null.

boolean of_exists  (Campos Clave Primaria)

Para evaluar si un registro existe.

string of_getfieldtype (string as_column)

Con esta función podemos identificar el tipo de dato (de la base de datos, no de PowerBuilder) de un campo de la tabla.

Las siguientes 4 funciones sirven para obtener el valor de un campo en función al estilo de como se obtiene en un datawindow.

long of_getitemnumber  (string as_column, Campos Clave Primaria)

string of_getitemstring  (string as_column, Campos Clave Primaria)

datetime of_getitemdatetime  (string as_column, Campos Clave Primaria)

decimal of_getitemdecimal  (string as_column, Campos Clave Primaria)

Para finalizar he añadido la función:

exception of_get_exception (string as_message)

La he tomado prestada del ejemplo  u_json (Georg Brodbeck–Informaticon AG) para implementar excepciones en la clase no visual y no usar mensajes visuales de error.

Así la funciones que arrojan excepciones hay que usarlas dentro de un bloque TRY CATCH

y se pueden capturar los mensajes de error y mostrar en pantalla si se desea.

Función Global:

La función global creará una instancia del objeto no visual y usará las funciones of_getitemnumber, 

of_getitemstring, of_getitemdatetime  y of_getitemdecimal  para devolver el valor de un campo de la tabla recibido como parámetro junto con el valor de los campos de la clave primaria de la tabla.

Esta función se apoyará en la función of_getfieldtype para determinar cual de las cuatros funciones anteriores usar.

En todos los caos convertirá el dato en un string que será el valor devuelto.

Datawindow:

El datawindow es un extra, que para el CRUD que porongo no sirve para nada, simplemente lo dejo como idea a desarrollar. Se puede usar luego por ejemplo para crear un DataStore sin tener que escribir manualmente todo el Select en un string o para la que sea...

DEMOSTRACIÓN:

He creado otro Target con una demo en el que se usa el datawindow generado para visualizar los datos de un retrieve. Unos botones de INSERT, DELETE, UPDATE para probar las funciones explicadas.

También he puesto un campo para escribir el nombre de una columna para visualizar en MessageBox su valor usando la función global.


En fin no me en enrollo más y os dejo el enlace de proyecto actual en GitHub:

github.com/rasanfe/Table_to_Object

FELICES VACACIONES!

La tabla de ejemplo es:

CREATE TABLE [dbo].[genter](
[empresa] [char](5) NOT NULL,
[tipoter] [char](1) NOT NULL,
[codigo] [char](15) NOT NULL,
[nombre] [char](50) NULL,
[razon] [char](50) NULL,
[cif] [char](30) NULL,
[pais] [char](5) NULL,
[provincia] [char](5) NULL,
[cod_postal] [char](10) NULL,
[localidad] [char](50) NULL,
[domicilio] [char](50) NULL,
[telefono] [char](30) NULL,
[fax] [char](30) NULL,
[moneda] [char](5) NULL,
[riesgo] [money] NULL,
[falta] [datetime] NULL,
[apellidos] [char](40) NULL,
[sexo] [char](1) NULL,
[fecha_nacimiento] [datetime] NULL,
[idioma] [char](5) NULL,
[colocacion] [char](1) NULL,
[activo] [char](1) NULL,
[tipopais] [char](1) NULL,
[cl_domicilio] [char](10) NULL,
[nu_domicilio] [char](10) NULL,
[prefijo_provincia] [char](5) NULL,
[distribuidor] [char](1) NULL,
[codigo_cliente] [char](15) NULL,
[cuenta] [char](20) NULL,
[correos] [char](200) NULL,
[abreviado] [char](10) NULL,
[provisional] [char](1) NULL,
[web] [char](100) NULL,
[correo_electronico] [char](100) NULL,
[tipo_proveedor] [char](1) NULL,
[bloqueo_compras] [char](1) NULL,
[movil] [char](20) NULL,
[usuario_web] [char](50) NULL,
[pass_web] [char](50) NULL,
[lpd_confidencial] [datetime] NULL,
[tipo_empresa] [char](1) NULL,
[extinguida] [char](1) NULL,
 CONSTRAINT [PK_genter] PRIMARY KEY CLUSTERED 
(
[empresa] ASC,
[tipoter] ASC,
[codigo] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]



Comentarios