Objetivo
Realizar un módulo que presenta una ventana para el mantenimiento de los datos de un registro. Permitirá dar de alta un nuevo registro o realizar las opciones de modificación, consulta o borrado de un registro existente. Lógicamente validará la información introducida por el usuario antes de actualizar la información en la base de datos.
Para los campos de tipo tabla también se habilita el acceso a los programas de lista de selección (F4) en el ejemplo que se mostrará sobre el campo de país y de tipo de cliente.
En este ejemplo, se realizará una pantalla de mantenimiento de un cliente. Será llamado desde la pantalla de lista de clientes.
Tiene el mandato F10 para confirmar la acción de alta, modificación o borrado. Con F4 accederá a la lista de selección de país y de tipo de cliente. Con F12 no realizará ninguna acción y volverá a la pantalla que le llamó.
Configuración
Este programa utilizará un componente de acceso a base de datos de lista de clientes, los componentes de actualización (alta, baja y modificación) de un registro y los componentes de validación que se encuentran todos ellos en el programa de servicio correspondiente.- El nombre del módulo donde esta el ventana de lista de registros para mantenimiento BAN02P1
- La definición de la pantalla estará definida como BAN02S1
- Utiliza el programa de servicio BAN01SRV que contiene los componentes de acceso a BD, de actualización y de validación
- El miembro (/Copy) con la definición del prototipo con los componentes y con la definición de estructuras será BAN01M1CP
- Llamará a los programas de lista de países (PAN40P1) y lista de tipos de cliente (PAN40P2)
Este ejemplo sirve de plantilla para otro proceso similar.
Fuente de la pantalla. BAN02S1
Se define la pantalla para presentar el mantenimiento de un registro.
A DSPSIZ(24 80 *DS3)
A PRINT
A R BAN02S01
A 66 CF04(04 'Consultar')
A 67 CF10(10 'Confirmar')
A CF12(12 'Anterior')
A RTNCSRLOC(*RECNAME ®CUR &CAMCUR)
A CAMCUR 10A H
A REGCUR 10A H
A WKSTNS 10A O 1 71DSPATR(HI)
A 2 3DATE
A EDTCDE(Y)
A DSPATR(HI)
A 2 71USER
A DSPATR(HI)
A D_TIPOOPC 12A O 2 32DSPATR(HI)
A 1 3'BAN02P1'
A DSPATR(HI)
A 1 27'Mantenimiento de cliente'
A DSPATR(HI)
A 69 5 3'Cliente'
A 69 D_IDCLIENT 10Y 0O 5 12DSPATR(HI)
A EDTCDE(4)
A 8 4'Nombre'
A D_NOMBRE 50A B 8 17CHECK(LC)
A 68 DSPATR(PR)
A 30 DSPATR(RI)
A 30 DSPATR(PC)
A 70 ERRMSG('Debe rellenarse' 70)
A 9 4'Apellidos'
A D_APELLIDO 100A B 9 17CHECK(LC)
A 68 DSPATR(PR)
A 31 DSPATR(RI)
A 31 DSPATR(PC)
A 71 ERRMSG('Debe rellenarse' 71)
A 11 4'Direccion'
A D_DIRECCIO 100A B 11 17CHECK(LC)
A 68 DSPATR(PR)
A 32 DSPATR(RI)
A 32 DSPATR(PC)
A 72 ERRMSG('Debe rellenarse' 72)
A 13 4'Pais'
A D_IDPAIS 3A B 13 17
A 68 DSPATR(PR)
A 33 DSPATR(RI)
A 33 DSPATR(PC)
A 73 ERRMSG('Debe rellenarse' 73)
A 74 ERRMSG('No existe' 74)
A D_DSPAIS 50A O 13 22
A 14 4'Tip cliente '
A D_IDTIPCLI 1A B 14 17
A 68 DSPATR(PR)
A 34 DSPATR(RI)
A 34 DSPATR(PC)
A 75 ERRMSG('Debe rellenarse' 75)
A 76 ERRMSG('No existe' 76)
A D_DSTIPCLI 50A O 14 22
A*
A 66 23 4'F4-Consulta'
A 67 23 24'F10-Confirmar'
A 23 47'F12-Anterior'
Se define:
- El registro de mantenimiento (BAN02S01) con todos los campos a presentar y mantener.
Fuente del proceso. BAN02P1
Se presenta el fuente del modulo que controla el mantenimiento de un registro. Utilizará el componentes de acceso de base de datos, de mantenimiento y de validación similares a los que se presentaron en entradas previas en este blog.
Nota: pondré en color azul lo que debería cambiar en esta plantilla del fuente RPG para hacer un nuevo programa de selección de otra entidad.
Nota: pondré en color azul lo que debería cambiar en esta plantilla del fuente RPG para hacer un nuevo programa de selección de otra entidad.
Definición ficheros y variables
Se define la pantalla de lista para selección y las estructuras de datos que se utilizarán en el programa. Como en todos los fuentes anteriores, se utilizan estructuras de datos para no cambiar las llamadas entre funciones cuando hagamos otro proceso similar; sólo bastaría con cambiar las variables contenidas en las estructura.*===============================================================
* Plantilla Pantalla de mantenimimiento - V1.0
*===============================================================
H DEBUG DECEDIT('0,') DATEDIT(*DMY.)
FBan02s1 CF E WORKSTN USROPN
// Ds de DEFINCICION de los datos de pantalla
DDs_DatosDsp DS
D IdCliente 10 0
D Nombre 50
D Apellidos 100
D Direccion 100
D IdPais 3
D DsPais 50
D IdTipCli 1
D DsTipCli 50
// Ds con los datos del fichero y de pantalla
D W_DatosLst Ds Dim(99) LikeDs(Ds_BasClie)
D W_NumReg S 2 0
D W_TotReg S 10 0
D W_DatosDsp Ds LikeDs(Ds_DatosDsp)
// Ds de actualizaciones
D W_DsAlt Ds LikeDs(Ds_AddClie)
D W_DsMod Ds LikeDs(Ds_UpdClie)
Definición de las estructuras de datos
- (Ds_DatosDsp). Campos que se presentan en la ventana. Tendrá asociada la variable de trabajo correspondiente (W_DatosDsp)
Por último tiene las variables de trabajo necesarias para acceder a los componentes de acceso a base de datos (W_DatosLst), de alta de registro (W_DsAlt) y de actualización de registro (W_DsMod). Se utilizarán en los componentes correspondientes y la definición de la estructura estará en el /Copy del programa de servicio
Recursos y definición de prototipos internos.
En esta parte se define recursos comunes y los componentes internos del programa./COPY *LIBL/QRPGLESRC,BAN00VAR
// Ds de DEFINCICION de los parametros de entrada
DDs_Parametros DS Qualified
D IdCliente 10 0
DBAN02P1 PR
D P_Parametros Const LikeDs(Ds_Parametros)
D P_TipoOpc 3 Const
D P_Resultado 3
DBAN02P1 PI
D P_Parametros Const LikeDs(Ds_Parametros)
D P_TipoOpc 3 Const
D P_Resultado 3
// Ds con los campos de llamada al programa de F4 de pais
DP_ParamF4Pais DS Qualified
D IdPais 3
D DsPais 50
DBan40P1Ej PR EXTPGM('BAN40P1EJ')
D P_ParamF4Pais Const LikeDs(P_ParamF4Pais)
D P_Resultado 3
// Ds con los campos de llamada al programa de F4 tipo cliente
DP_ParamF4TpCl DS Qualified
D IdTipCli 1
D DsTipCli 50
DBan40P2Ej PR EXTPGM('BAN40P2EJ')
D P_ParamF4TpCl Const LikeDs(P_ParamF4TpCl)
D P_Resultado 3
/COPY *LIBL/QRPGLESRC,BAN01M1CP
DDsp_CargaDatos PR
D P_LeerFil n Const
DDsp_ObtDatos PR
DDsp_DatosDsp PR
D P_Accion Like(WAccActual)
D P_AccionCons 10
DRec_Descripcion PR
DValida PR n
La rutina /Copy (BAN00VAR) contiene definición de variables comunes a todos los programas de pantalla. Se detallará en un apartado.
La rutina /Copy (BAN01M1CP) contiene la definición de los componentes de acceso a base de datos, de actualización y de validación.
Parámetros de entrada
Parámetros de entrada
- El nombre del modulo (BAN02P1). Tiene asociada una estructura de datos (P_ParamMante) con los datos clave que es necesario pasarle. En este caso, el identificativo del cliente (IdCliente) sobre el que se realizará la operación de mantenimiento.También tiene otro campo de entrada (P_TipoOpc) que es la operación a realizar (alta, baja, modificación o consulta) y tiene un campo de salida (P_Resultado) que tendrá si se ha realizado alguna operación o no se ha hecho nada.
Llamadas a módulos y programas
- Llamada a programas de lista de registros F4 sobre los campos de búsqueda
Las dos definiciones siguientes son opcionales ya que dependen de los campos de búsqueda que haya. Si no hay ninguno que tenga F4, no existirán estas definiciones (nota: yo, aunque no tenga ningún F4 dejo solo una definición "asteriscada" por si en el futuro pudiera tener una) - (Ban40P1Ej) es la definición de llamada al programa de lista de selección de países. Tiene una estructura de datos (P_ParamF4Pais) con los campos que se devolverán del programa de lista. En este caso, la estructura tiene los campos de identificación de país y de nombre de país (IdPais y DsPais). Tiene un campo de salida (P_Resultado) que tendrá si se ha realizado alguna operación o no se ha hecho nada.
- (Ban40P2Ej) es la definición de llamada al programa de lista de selección de tipos de clientes. Tiene una estructura de datos (P_ParamF4TpCl) con los campos que se devolverán del programa de lista. En este caso, la estructura tiene los campos de identificación de tipo de cliente y de descripción de tipo de cliente (IdTipCli y DsTipCli). Tiene un campo de salida (P_Resultado) que tendrá si se ha realizado alguna operación o no se ha hecho nada.
Procedimientos internos
- (Dsp_CargaDatos) Se utilizará para cargar los campos y datos de la ventana
- (Dsp_ObtDatos) Se utilizará para obtener los campos de la ventana rellenados por el usuario
- (Dsp_DatosDsp) Se utilizará para presentar la pantalla y recoger la acción realizaad por el usuario.
- (Rec_Descripcion). Se utiliza para recuperar las descripciones de campos de tipo tabla. Se utilizará para el campo de país y de tipo de cliente.
- (Valida) Validará que los datos introducidos son correctos.
Flujo principal
Se presenta el flujo principal del programa. Igual que se comentó en la entrada que explicaba el programa de lista de registros, es necesario mencionar que es no está escrito linealmente sino que está incluido en un bucle y utiliza una variable (WSitActual) para ir cambiando de estado y para cada estado realiza un grupo de acciones determinado; A la finalización de las acciones de un grupo, la variable cambiará de estado y en el siguiente ciclo realizará otras acciones. Cuando alcance un estado de finalización (CSitFinalizar) terminará el proceso.Si se quiere modificar el flujo de proceso, basta con cambiar el contenido de esta variable al finalizar su grupo de acciones.
Si se desea incluir nuevas acciones, se crearía una nueva situación incluyendo las instrucciones que fuera y al finalizar estas acciones debería cambiar el contenido de la variables de situación para pasar a otro estado. Lógicamente, habría también que cambiar que alguien llamará a este nuevo grupo cambiado la variable de situación.
/Free
Open Ban02s1;
WSitActual= CSitRecuperar;
Clear W_DatosDsp;
Dow WSitActual<>CSitFinalizar;
Select;
///////////////////////////////////////////////////////
// MODELO: Obtener datos del registro ////////////////
///////////////////////////////////////////////////////
When WSitActual = CSitRecuperar;
Dsp_CargaDatos(*On);
WSitActual= CSitShowDatos;
///////////////////////////////////////////////////////
// VISTA: Presenta datos de pantalla //////////////
///////////////////////////////////////////////////////
When WSitActual = CSitShowDatos;
Dsp_DatosDsp (W_Accion : W_AccionCons);
Select;
When W_Accion = CAccAnterior;
P_Resultado = CRtnSalir;
WSitActual = CSitFinalizar;
When W_Accion = CAccConfirmar;
WSitActual = CSitActualizar;
When W_Accion = CAccEnter;
WSitActual = CSitEnter;
When W_Accion = CAccCons;
Select;
When W_AccionCons='PAIS';
BAN40P1EJ (P_ParamF4Pais : w_Resultado);
If w_Resultado = CRtnConfirmado;
W_DatosDsp.IdPais = P_ParamF4Pais.IdPais;
W_DatosDsp.DsPais = P_ParamF4Pais.DsPais;
EndIf;
When W_AccionCons='TPCL';
BAN40P2EJ (P_ParamF4TpCl : w_Resultado);
If w_Resultado = CRtnConfirmado;
W_DatosDsp.IdTipCli=P_ParamF4TpCl.IdTipCli;
W_DatosDsp.DsTipCli=P_ParamF4TpCl.DsTipCli;
EndIf;
EndSl;
Dsp_CargaDatos(*Off);
WSitActual = CSitShowDatos;
EndSl;
//////////////////////////////////////////////////////
// VISTA: Valida los datos de pantalla //////////////
//////////////////////////////////////////////////////
When WSitActual = CSitEnter;
Dsp_ObtDatos ();
Valida ();
Rec_Descripcion ();
WSitActual = CSitShowDatos;
//////////////////////////////////////////////////////
// MODELO: Actualizar //////////////
//////////////////////////////////////////////////////
When WSitActual = CSitActualizar;
Dsp_ObtDatos ();
If Valida ();
Select;
When P_TipoOpc = CEjeAlt; // Alta
W_DsAlt.Nombre = W_DatosDsp.Nombre;
W_DsAlt.Apellidos= W_DatosDsp.Apellidos;
W_DsAlt.Direccion= W_DatosDsp.Direccion;
W_DsAlt.IdPais = W_DatosDsp.IdPais;
W_DsAlt.IdTipCli = W_DatosDsp.IdTipCli;
Add_Cliente(W_DsAlt);
When P_TipoOpc = CEjeMod; // Modificacion
W_DsMod.Nombre = W_DatosDsp.Nombre;
W_DsMod.Apellidos= W_DatosDsp.Apellidos;
W_DsMod.Direccion= W_DatosDsp.Direccion;
W_DsMod.IdPais = W_DatosDsp.IdPais;
W_DsMod.IdTipCli = W_DatosDsp.IdTipCli;
Upd_Cliente(P_Parametros.IdCliente: W_DsMod);
When P_TipoOpc = CEjeBor; // baja
Dlt_Cliente(P_Parametros.IdCliente);
EndSl;
P_Resultado = CRtnConfirmado;
WSitActual = CSitFinalizar;
Else;
WSitActual= CSitShowDatos;
EndIf;
EndSl;
EndDo;
Close Ban02s1;
Eval *InLr=*On;
/End-Free
Las situaciones por las que esta pasando el programa son constantes definidas en el /Copy común y son las siguientes:
- (CSitRecuperar). Es la inicial. Recupera la información del fichero y carga los campos de pantalla.
- (CSitShowDatos). Presenta la pantalla y esperará a que el usuario realice una acción y recogerá el mandato pulsado por el usuario.
Si ha pulsado el mandato de salida (W_Accion=CAccSalir) y finalizará (P_Resultado = CRtnSalir).
Si ha pulsado el mandato de confirmar(W_Accion=CAccConfirmar) accederá a las acciones asociadas a este mandato (WSitActual=CSitActualizar).
Si ha pulsado enter (W_Accion=CSitEnter) accederá a las acciones asociadas a este mandato (WSitActual=CAccEnter)
Si ha pulsado F4 (W_Accion=CAccCons) accederá al programa de lista de selección F4 correspondiente según el campo en el que el usuario haya pulsado. - (CSitEnter). Recupera los datos grabados por el usuario en la pantalla y los valida.
- (CSitActualizar). Recupera los datos de pantalla y los valida. Si es correcto, realiza la acción de actualización que se trate a través del componente correspondiente del programa de servicio, para alta (Add_Cliente), modificación (Upd_Cliente) y para borrado (Dlt_Cliente) y después finaliza (WSitActual=CSitFinalizar) el programa devolviendo que ha realizado la operación (P_Resultado = CRtnConfirmado).
Si hubo error de validación, vuelve a enseñar la pantalla con los errores detectados (WSitActual= CSitShowDatos) - (CSitFinalizar). Finaliza el proceso.
Componente interno de Carga de pantalla
Realiza la carga de la cabecera de la pantalla.PDsp_CargaDatos B
DDsp_CargaDatos PI
D P_LeerFil n Const
D W_Sel DS LikeDs(Ds_SelClie)
/Free
If P_LeerFil;
Clear W_DatosLst;
If P_TipoOpc <> CEjeAlt;
Clear W_Sel;
W_Sel.K_IdCliente = P_Parametros.IdCliente;
Obt_LstClientes(W_DatosLst : W_NumReg : W_TotReg :
0 : 0 : '1A' :
W_Sel);
EndIf;
W_DatosDsp.IdCliente = W_DatosLst(1).IdCliente;
W_DatosDsp.Nombre = W_DatosLst(1).Nombre ;
W_DatosDsp.Apellidos = W_DatosLst(1).Apellidos;
W_DatosDsp.Direccion = W_DatosLst(1).Direccion;
W_DatosDsp.IdPais = W_DatosLst(1).IdPais ;
W_DatosDsp.DsPais = W_DatosLst(1).DsPais ;
W_DatosDsp.IdTipCli = W_DatosLst(1).IdTipCli ;
W_DatosDsp.DsTipCli = W_DatosLst(1).DsTipCli ;
EndIf;
D_IdClient = W_DatosDsp.IdCliente;
D_Nombre = W_DatosDsp.Nombre;
D_Apellido = W_DatosDsp.Apellidos;
D_Direccio = W_DatosDsp.Direccion;
D_IdPais = W_DatosDsp.IdPais;
D_DsPais = W_DatosDsp.DsPais;
D_IdTipCli = W_DatosDsp.IdTipCli;
D_DsTipCli = W_DatosDsp.DsTipCli;
/End-Free
P E
Primero, si no es acción de alta, recupera de la base de datos, a través del componente ((Obt_LstClientes)) de acceso a BD que está en el programa de servicio, los datos de la clave sobre la que se realiza el mantenimiento. Carga los datos recuperados de la base de datos sobre la estructura de datos de campos de pantalla.
Posteriormente, carga los campos de pantalla desde la información de la estructura de datos.
Componente interno de Obtener datos
PDsp_ObtDatos B
DDsp_ObtDatos PI
/Free
W_DatosDsp.Nombre = D_Nombre ;
W_DatosDsp.Apellidos= D_Apellido ;
W_DatosDsp.Direccion= D_Direccio ;
W_DatosDsp.IdPais = D_IdPais ;
W_DatosDsp.DsPais = D_DsPais ;
W_DatosDsp.IdTipCli = D_IdTipCli ;
W_DatosDsp.DsTipCli = D_DsTipCli ;
/End-Free
P E
Recupera los datos de pantalla seleccionados por el usuario y los carga sobre la estructura de datos de campos de pantalla (W_DatosDsp)
Componente interno de Presentar pantalla
Presenta la pantalla al usuario y recoge el mandato pulsado por el usuario
PDsp_DatosDsp B
DDsp_DatosDsp PI
D P_Accion Like(WAccActual)
D P_AccionCons 10
/Free
Select;
When P_TipoOpc=CEjeAlt; // Alta
D_TipoOpc = 'Alta';
*In66=*On; // Boton f4
*In67=*On; // Boton confirmar
*In68=*Off; // Proteger No Claves
*In69=*Off; // Proteger Claves
When P_TipoOpc=CEjeMod; // Modificacion
D_TipoOpc = 'Modificacion';
*In66=*On; // Boton f4
*In67=*On; // Boton confirmar
*In68=*Off; // Proteger No Claves
*In69=*On; // Proteger Claves
When P_TipoOpc=CEjeBor; // baja
D_TipoOpc = 'Borrado';
*In66=*Off; // Boton f4
*In67=*On; // Boton confirmar
*In68=*On; // Proteger No Claves
*In69=*On; // Proteger Claves
When P_TipoOpc=CEjeCon; // consulta
D_TipoOpc = 'Consulta';
*In66=*Off; // Boton f4
*In67=*Off; // Boton confirmar
*In68=*On; // Proteger No Claves
*In69=*On; // Proteger Claves
Other;
D_TipoOpc = '***ERR';
*In66=*Off; // Boton f4
*In67=*Off; // Boton confirmar
*In68=*On; // Proteger No Claves
*In69=*On; // Proteger Claves
EndSl;
Exfmt Ban02S01;
// Apagar indicadores de error
*In30=*Off; // Error. Visual
*In31=*Off; // Error. Visual
*In32=*Off; // Error. Visual
*In33=*Off; // Error. Visual
*In34=*Off; // Error. Visual
*In70=*Off; // Error. Msg
*In71=*Off; // Error. Msg
*In72=*Off; // Error. Msg
*In73=*Off; // Error. Msg
*In74=*Off; // Error. Msg
*In75=*Off; // Error. Msg
*In76=*Off; // Error. Msg
Select;
When *In12=*On;
P_Accion=CAccAnterior;
When *In10=*On;
P_Accion=CAccConfirmar;
When *In04=*On;
Select;
When CAMCUR='D_IDPAIS';
P_Accion=CAccCons;
P_AccionCons='PAIS';
When CAMCUR='D_IDTIPCLI';
P_Accion=CAccCons;
P_AccionCons='TPCL';
Other;
P_Accion=CAccEnter;
EndSl;
Other;
P_Accion=CAccEnter;
EndSl;
/End-Free
P E
Inicializará variables e indicadores de pantalla según la acción que se realiza (alta, baja, modificación o consulta) y presenta la pantalla.
Recoge el mandato pulsado por el usuario.
Según cada programa que se desarrolle habrá (o no) funciones de lista de registros de ayuda (F4). En este programa está la lista para seleccionar pais y habrá que comprobar el campo asociado (D_IDPAIS) y para el tipo de cliente (D_IDTIPCLI)
Componente interno de Recuperar descripción
Se utiliza para recuperar descripciones de campos de tipo tabla. Si no los hubiera, la rutina podría estar vacía. En este caso se recuperan descripciones del nombre de país y de descripción de tipo de cliente.PRec_Descripcion B
DRec_Descripcion PI
D W_DatosPais Ds Dim(99) LikeDs(Ds_BasPais)
D W_NumRegPais S 2 0
D W_SelPais Ds LikeDs(Ds_SelPais)
D W_DatosTpCl Ds Dim(99) LikeDs(Ds_BasTpCl)
D W_NumRegTpCl S 2 0
D W_SelTpCl Ds LikeDs(Ds_SelTpCl)
D W_TotReg S 10 0
/Free
// Recupera descripcion de codigo de pais.
Clear W_SelPais;
W_SelPais.K_IdPais = W_DatosDsp.IdPais;
Obt_LstPais(W_DatosPais : W_NumRegPais : W_TotReg :
0 : 0 : '1A' :
W_SelPais);
If W_NumRegPais > *Zeros;
W_DatosDsp.DsPais = W_DatosPais(1).DsPais;
D_DsPais = W_DatosDsp.DsPais;
EndIf;
// Recupera descripcion de tipo de cliente
Clear W_SelTpCl;
W_SelTpCl.K_IdTipCli = W_DatosDsp.IdTipCli;
Obt_LstTpClient(W_DatosTpCl : W_NumRegTpCl : W_TotReg :
0 : 0 : '1A' :
W_SelTpCl);
If W_NumRegTpCl > *Zeros;
W_DatosDsp.DsTipCli = W_DatosTpCl(1).DsTipCli;
D_DsTipCli = W_DatosDsp.DsTipCli;
EndIf;
/End-Free
P E
Por cada campo de tabla que tenga un campo de descripción, se accede al componente (Obt_LstTpClient) de acceso de BD con la clave (W_DatosDsp.IdTipCli) recuperada de los campos de pantalla y del registro que se recupera del componente (W_DatosTpCl(1).DsTipCli), se carga el campo pantalla (D_DsTipCli) de descripción.
PValida B
DValida PI n
D W_IdError S 3
/Free
If Not Val_Nombre(W_DatosDsp.Nombre : W_IdError);
If w_IdError='E01'; // Vacio
*In10=*On;
*In70=*On;
EndIf;
Return *Off;
Endif;
If Not Val_Apellidos(W_DatosDsp.Apellidos : W_IdError);
If w_IdError='E01'; // Vacio
*In31=*On;
*In71=*On;
EndIf;
Return *Off;
Endif;
If Not Val_Direccion(W_DatosDsp.Direccion : W_IdError);
If w_IdError='E01'; // Vacio
*In32=*On;
*In72=*On;
EndIf;
Return *Off;
Endif;
If Not Val_IdPais(W_DatosDsp.IdPais : W_IdError);
If w_IdError='E01'; // Vacio
*In33=*On;
*In73=*On;
EndIf;
If w_IdError='E02'; // No existe
*In33=*On;
*In74=*On;
EndIf;
Return *Off;
Endif;
If Not Val_IdTipCli(W_DatosDsp.IdTipCli : W_IdError);
If w_IdError='E01'; // Vacio
*In34=*On;
*In75=*On;
EndIf;
If w_IdError='E02'; // No existe
*In34=*On;
*In76=*On;
EndIf;
Return *Off;
Endif;
// Correcto
Return *On;
/End-Free
P E
// Estructuras y campos de control de pantalla
D Sistema SDS
D Usuario 254 263
D WKSTNS 244 253
D CURSOR DS
D PXCUR 370 371B 0
D PXNRC 378 379B 0
// Constantes de acciones dentro del programa
DWAccActual S 15
D CAccSalir C 'Salir '
D CAccAlta C 'Alta '
D CAccEnter C 'Enter '
D CAccCons C 'ConsultaF4 '
D CAccAnterior C 'Anterior '
D CAccConfirmar C 'Confirmar '
D CPagSig C 'PaginaSig '
// Constantes de posibles situaciones del programa
D W_Accion S Like(WAccActual)
D W_AccionCons S 10
D WSitActual S 15
D CSitCargarDsp C 'Cargar_Dsp '
D CSitFinalizar C 'Finalizar '
D CSitShowDatos C 'ShowDatos '
D CSitValidar C 'Validar '
D CSitAlta C 'Alta '
D CSitRecuperar C 'Recuperar '
D CSitCargarDat C 'Cargar_Datos '
D CSitActualizar C 'Actualizar '
D CSitEnter C 'Enter '
// Constantes de tipos de ejecucion programa
D CEjeAlt C 'Add'
D CEjeMod C 'Upd'
D CEjeBor C 'Dlt'
D CEjeCon C 'Dsp'
* Validacion
D W_Error S n
* Datos seleccionados de la lista
D W_HaySeleccion S n
D W_OpcionSel S 1
** Variables de trabajo
D w_Resultado S 3
D CRtnConfirmado C 'OK'
D CRtnSalir C 'Sal'
Componente interno de Validación
Se encarga de realizar las validaciones de los datos introducidos por el usuario
PValida B
DValida PI n
D W_IdError S 3
/Free
If Not Val_Nombre(W_DatosDsp.Nombre : W_IdError);
If w_IdError='E01'; // Vacio
*In10=*On;
*In70=*On;
EndIf;
Return *Off;
Endif;
If Not Val_Apellidos(W_DatosDsp.Apellidos : W_IdError);
If w_IdError='E01'; // Vacio
*In31=*On;
*In71=*On;
EndIf;
Return *Off;
Endif;
If Not Val_Direccion(W_DatosDsp.Direccion : W_IdError);
If w_IdError='E01'; // Vacio
*In32=*On;
*In72=*On;
EndIf;
Return *Off;
Endif;
If Not Val_IdPais(W_DatosDsp.IdPais : W_IdError);
If w_IdError='E01'; // Vacio
*In33=*On;
*In73=*On;
EndIf;
If w_IdError='E02'; // No existe
*In33=*On;
*In74=*On;
EndIf;
Return *Off;
Endif;
If Not Val_IdTipCli(W_DatosDsp.IdTipCli : W_IdError);
If w_IdError='E01'; // Vacio
*In34=*On;
*In75=*On;
EndIf;
If w_IdError='E02'; // No existe
*In34=*On;
*In76=*On;
EndIf;
Return *Off;
Endif;
// Correcto
Return *On;
/End-Free
P E
Va realizando llamadas a los componentes de validación según los campos que haya en la pantalla. Si una validación no es correcta, se enciende los indicadores de error correspondiente y finaliza la ejecución de la rutina de validación de forma insatisfactoria (Return *Off).
Si no hay error, devuelve que todo es correcto (Return *On)
Si no hay error, devuelve que todo es correcto (Return *On)
Anexo. /Copy BAN00VAR declaraciones generales y comunes
Presenta la pantalla al usuario y recoge el mandato pulsado por el usuario
D Sistema SDS
D Usuario 254 263
D WKSTNS 244 253
D CURSOR DS
D PXCUR 370 371B 0
D PXNRC 378 379B 0
// Constantes de acciones dentro del programa
DWAccActual S 15
D CAccSalir C 'Salir '
D CAccAlta C 'Alta '
D CAccEnter C 'Enter '
D CAccCons C 'ConsultaF4 '
D CAccAnterior C 'Anterior '
D CAccConfirmar C 'Confirmar '
D CPagSig C 'PaginaSig '
// Constantes de posibles situaciones del programa
D W_Accion S Like(WAccActual)
D W_AccionCons S 10
D WSitActual S 15
D CSitCargarDsp C 'Cargar_Dsp '
D CSitFinalizar C 'Finalizar '
D CSitShowDatos C 'ShowDatos '
D CSitValidar C 'Validar '
D CSitAlta C 'Alta '
D CSitRecuperar C 'Recuperar '
D CSitCargarDat C 'Cargar_Datos '
D CSitActualizar C 'Actualizar '
D CSitEnter C 'Enter '
// Constantes de tipos de ejecucion programa
D CEjeAlt C 'Add'
D CEjeMod C 'Upd'
D CEjeBor C 'Dlt'
D CEjeCon C 'Dsp'
* Validacion
D W_Error S n
* Datos seleccionados de la lista
D W_HaySeleccion S n
D W_OpcionSel S 1
** Variables de trabajo
D w_Resultado S 3
D CRtnConfirmado C 'OK'
D CRtnSalir C 'Sal'
Se define para reutilizar en todos los programas de pantalla las siguientes variables que estarán en las diferentes plantillas:
- Estructuras y variables para pantalla
- Constantes de acciones realizadas por el usuario (CAccAlta, CAccSalir etc.)
- Variables y constantes por las que pasa el programa (WSitActual, CSitValidar etc.)
- Constantes de tipo de ejecución para programa mantenimiento (CEjeAlt , CEjeBor etc)
- Constantes de retorno al programa que le llamó (CRtnConfirmado, CRtnSalir etc)
Muy buen ejemplo.
ResponderEliminar