martes, 14 de mayo de 2013

Componente. Actualización de base de datos


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


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).



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 anteriores

D 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