Objetivo
Crear un componente que sea capaz de añadir, actualizar o borrar un registro de una entidad de una base de datos.
En este ejemplo, se realizará un componente para actualizar información de la tabla de clientes.
Estos componentes complementan al componente acceso de datos presentado en entradas anteriores.
Configuración
Se utiliza SQL para el desarrollo del código. El componente formará parte de un programa de servicio y será exportable por lo que podrá ser llamado por el programa que enlace este programa de servicio.
- Los nombres de los componentes (Add_Cliente, Upd_Cliente, Dlt_Cliente). Utilizo siempre Add_xxxxxx, Upd_xxxxx, Dlt_xxxxx donde xxxxx es la entidad para la definición del componente de actualización.
- El nombre del módulo donde estarán los componentes BAN01M1
- El miembro (/Copy) con la definición del prototipo con los componentes y con la definición de estructuras será BAN01M1CP
- El programa de servicio donde estarán los módulos BAN01SRV. Tendrá un miembro asociado con el mismo nombre con la definición (binder) de los componentes a exportar.
Miembro /Copy. BAN01M1CP
Se describen las estructuras de datos que dan servicio al componente de acceso a base de datos y el prototipo de llamada. Estarán en un miembro fuente independiente para que sea utilizado como /Copy tanto por el fuente del componente como los fuentes de los posibles programas que lo utilicen.
*===========================================================
** Alta de cliente
*===========================================================
DDs_AddClie DS QUALIFIED
D Nombre 50
D Apellidos 100
D Direccion 100
D IdPais 3
D IdTipCli 1
DAdd_Cliente PR 10 0
D P_DsClieAlt Const LikeDs(Ds_AddClie)
*============================================================
** Actualizacion de cliente
*============================================================
DDs_UpdClie DS QUALIFIED
D Nombre 50
D Apellidos 100
D Direccion 100
D IdPais 3
D IdTipCli 1
DUpd_Cliente PR
D P_IdCliente 10 0 Const
D P_DsClieMod Const LikeDs(Ds_UpdClie)
*============================================================
** Borrado de cliente
*============================================================
DDlt_Cliente PR
D P_IdCliente 10 0 Const
*===========================================================
** Alta de cliente
*===========================================================
DDs_AddClie DS QUALIFIED
D Nombre 50
D Apellidos 100
D Direccion 100
D IdPais 3
D IdTipCli 1
DAdd_Cliente PR 10 0
D P_DsClieAlt Const LikeDs(Ds_AddClie)
*============================================================
** Actualizacion de cliente
*============================================================
DDs_UpdClie DS QUALIFIED
D Nombre 50
D Apellidos 100
D Direccion 100
D IdPais 3
D IdTipCli 1
DUpd_Cliente PR
D P_IdCliente 10 0 Const
D P_DsClieMod Const LikeDs(Ds_UpdClie)
*============================================================
** Borrado de cliente
*============================================================
DDlt_Cliente PR
D P_IdCliente 10 0 Const
Está compuesto por:
- (Ds_AddClie) y (Ds_UpdClie) Estructura de datos con los campos para generar un cliente y para actualizar un cliente respestivamente.
- (Add_Cliente) Definición de prototipo (interfaz) para generar un nuevo cliente.
- (Upd_Cliente) Definición de prototipo (interfaz) para actualizar los datos de un cliente
- (Dlt_Cliente) Definición de prototipo (interfaz) para generar un nuevo cliente.
Al principio del fuente del componente se utiliza el /COPY para “cargar” las estructuras de datos y los prototipos de los componentes.
/COPY *LIBL/QRPGLESRC,BAN01M1CP
Fuente del componente. Add_Cliente en BAN01M1
Este componente genera un nuevo cliente en la tabla correspondiente y devuelve el id de cliente (clave primaria) que ha generado
El componente tiene el siguiente código:
PAdd_Cliente B EXPORT
DAdd_Cliente PI 10 0
D P_DsClieAdd Const LikeDs(Ds_AddClie)
D WCorrecto S n
D WClave S 10 0
/Free
WCorrecto=*Off;
Dow Not WCorrecto;
Exec SQL SELECT Max(IdCliente)+1
INTO :WClave FROM Cliente;
If SqlCod<0; //SQLCode -305 resultado null
WClave=1;
EndIf;
Exec SQL INSERT INTO Cliente
(IdCliente,
Nombre,
Apellidos,
Direccion,
IdPais,
IdTipCli)
VALUES(:WClave,
:P_DsClieAdd.Nombre,
:P_DsClieAdd.Apellidos,
:P_DsClieAdd.Direccion,
:P_DsClieAdd.IdPais,
:P_DsClieAdd.IdTipCli);
If SqlCod=0;
WCorrecto=*On;
EndIf;
EndDo;
Return WClave;
/End-Free
P E
Parámetros de salida
- Como función devuelve el Id de la nueva clave generada.
Parámetros de entrada
- (P_DsClieAdd) Estructura de datos con los campos con los que se generará el nuevo registro de la base de datos.
Código
Primero busca el id de la clave primaria del último registro del fichero y le suma una unidad (WClave) que será la clave que va a generar.
A continuación de realiza la sentencia SQL de inserción a partir de los datos que se reciben como parámetro (P_DsClieAdd).
Por último, devuelve la clave generada (Return WClave).
PUpd_Cliente B EXPORT
DUpd_Cliente PI
D P_IdCliente 10 0 Const
D P_DsClieUpd Const LikeDs(Ds_UpdClie)
/Free
Exec SQL UPDATE Cliente SET
Nombre = :P_DsClieUpd.Nombre,
Apellidos = :P_DsClieUpd.Apellidos,
Direccion = :P_DsClieUpd.Direccion,
IdPais = :P_DsClieUpd.IdPais,
IdTipCli = :P_DsClieUpd.IdTipCli
WHERE IdCliente = :P_IdCliente;
/End-Free
P E
PDlt_Cliente B EXPORT
DDlt_Cliente PI
D P_IdCliente 10 0 Const
/Free
// Se eliminan las cuentas del cliente
Exec SQL DELETE from Cuenta
WHERE IdCliente = :P_IdCliente;
// Se elimina el cliente
Exec SQL DELETE from Cliente
WHERE IdCliente = :P_IdCliente;
/End-Free
P E
A continuación de realiza la sentencia SQL de inserción a partir de los datos que se reciben como parámetro (P_DsClieAdd).
Por último, devuelve la clave generada (Return WClave).
Fuente del componente. Upd_Cliente en BAN01M1
Este componente actualiza los datos de un cliente existente en la tabla correspondiente.
El componente tiene el siguiente código:
PUpd_Cliente B EXPORT
DUpd_Cliente PI
D P_IdCliente 10 0 Const
D P_DsClieUpd Const LikeDs(Ds_UpdClie)
/Free
Exec SQL UPDATE Cliente SET
Nombre = :P_DsClieUpd.Nombre,
Apellidos = :P_DsClieUpd.Apellidos,
Direccion = :P_DsClieUpd.Direccion,
IdPais = :P_DsClieUpd.IdPais,
IdTipCli = :P_DsClieUpd.IdTipCli
WHERE IdCliente = :P_IdCliente;
/End-Free
P E
Parámetros de entrada
- (P_IdCliente) Id de la clave del registro a actualizar.
- (P_DsClieUpd) Estructura de datos con los campos con los que se actualizará el registro de la base de datos.
Código
Realiza la actualización de la clave (P_IdCliente) del registro que se recibe y poniendo los campos recibidos en la estructura (P_DsClieUpd)
Fuente del componente. Dlt_Cliente en BAN01M1
Este componente borra los datos de un cliente existente en la tabla correspondiente. En este ejemplo es un borrado físico pero podría hacerse como un borrado lógico actualizando un campo que indique que esté de baja.
El componente tiene el siguiente código:
PDlt_Cliente B EXPORT
DDlt_Cliente PI
D P_IdCliente 10 0 Const
/Free
// Se eliminan las cuentas del cliente
Exec SQL DELETE from Cuenta
WHERE IdCliente = :P_IdCliente;
// Se elimina el cliente
Exec SQL DELETE from Cliente
WHERE IdCliente = :P_IdCliente;
/End-Free
P E
Parámetros de entrada
- (P_IdCliente) Id de la clave del registro a eliminar.
Código
Realiza el borrado de la clave (P_IdCliente) del registro que se recibe. En esta funcionalidad también se borran las cuentas asociadas al cliente debido a que forma parte de la lógica de negocio de la aplicación.
Anexos
Programa de prueba
Dejo este proceso donde se puede comprobar el funcionamiento de los componentes anterioresD w_IdCliente S 10 0
D w_DsClieAlt Ds LikeDs(Ds_AddClie)
D w_DsClieMod Ds LikeDs(Ds_UpdClie)
/COPY *LIBL/QRPGLESRC,BAN01M1CP
/Free
w_DsClieAlt.Nombre = 'Olga';
w_DsClieAlt.Apellidos = 'Pardo Lopez';
w_DsClieAlt.Direccion = 'Av. Valladolid, 12.';
w_DsClieAlt.IdPais = 'ESP';
w_DsClieAlt.IdTipCli = 'V';
w_IdCliente = Add_Cliente(W_DsClieAlt);
w_DsClieMod.Nombre = 'Olga2';
w_DsClieMod.Apellidos = 'Pardo Lopez2';
w_DsClieMod.Direccion = 'Av. Valladolid, 33.';
w_DsClieMod.IdPais = 'FRA';
w_DsClieMod.IdTipCli = 'N';
Upd_Cliente(w_IdCliente : w_DsClieMod);
Dlt_Cliente(w_IdCliente);
*InLr = *On;
/End-Free
Primero añade un nuevo cliente, después modifica los datos y por último lo borra.
No hay comentarios:
Publicar un comentario