Ejemplos de subficheros en RPG/Free

Anuncio
Página 1
Documento: PROG1.RPGLE
// ==========================================================================================
// PROG1.RPGLE | SUBFICHERO COMPLETO
// · Es una técnica adecuada si se procesa un número relativamente pequeño de registros.
// · La paginación es realizada por el sistema operativo.
// -----------------------------------------------------------------------------------------// Procedimiento:
// · Leer un registro del archivo, escribirlo en el subfichero y repetir hasta que se
//
llegue al final del archivo, luego visualizar el subfichero.
// · En la definición del SFLCTL de la DDS, se especifica el tamaño del subfichero (SFLSIZ)
//
mayor que el tamaño de la página de visualización (SFLPAG). Así el subfichero se
//
extiende automáticamente cuando se graban más registros de los indicados en el tamaño
//
del subfichero.
// · El indicador 61 se asigna a SFLCLR, por tanto, debe ponerse a ON cuando el SFL deba
//
borrarse.
// · El indicador 62 se asigna a SFLDSP. Se pone a ON si se graba algún registro en el
//
subfichero y cuando se borra el subfichero debe estar en OFF.
// · Cuando el EXFMT del programa tiene lugar, el subfichero se visualiza si el indicador 62
//
está en ON.
// · El registro de control SFLCTL incorpora un campo llamado ARG en donde el usuario puede
//
entrar un argumento de búsqueda. Este argumento se usa para situar el archivo en el
//
primer registro a recuperar
// · Cuando el programa se inicia, el registro de control se visualiza, solicitando al
//
usuario un argumento de búsqueda. El SFL no se visualiza porque no hay registros y por
//
tanto, el indicador 62 está en OFF.
// · Después de entrar el ARG y haber pulsado INTRO, el subfichero se borra y se carga. Una
//
vez cargado, el programa regresa mediante un bucle controlado por un DOWHILE
//
(hasta que se haya pulsado F3) para visualizar el registro de control.
// · El proceso es mediante un número relativo de registro se define con la palabra clave
//
SFILE, en las especificaciones de descripción de archivos, para el archivo WORKSTN.
// · El número relativo de registro (NRR) se incrementa cada vez que se graba un nuevo
//
registro en el subfichero, y se restaura a ceros cuando se borra el subfichero.
// ==========================================================================================
//
// Cabecera
//
h copyright('Marcelino Rodríguez Suárez | http://www.marce.com')
h datedit(*dmy/)
h datfmt(*dmy/)
//
// Archivos (pantalla y disco)
//
fPANTALLA1 cf
e
workstn sfile(SFL1:nrr)
fFICHERO
if
e
k disk
//
// Definiciones de campo
//
d indicadores@
s
*
inz(%addr(*in))
Puntero indicadores
d indicadores
ds
based(indicadores@)
Estruct. indicadore
d SALIR
03
03n
F3=Salir
d LIMPIAR
61
61n
Limpiar subfichero
d MOSTRAR
62
62n
Visualiza subficher
//
d nrr
s
4s 0 inz(*zeros)
Nº rel. reg. subfic
d arg
s
30a
inz(*blanks)
Argumento búsqueda
//
// Especificaciones de cálculo en formato libre
//
/free
//
// Presentar la pantalla
//
exfmt SFL1CTL;
//
// Ejecutar hasta que se pulse F3
//
dow not SALIR;
nrr = *zeros; // Inicializar el numero relativo de registro
MOSTRAR = *off; // No mostrar subfichero
//
// Limpiar subfichero
Página 2
Documento: PROG1.RPGLE
//
LIMPIAR = *on;
write SFL1CTL;
LIMPIAR = *off;
//
// Posicionarse en el fichero con el argumento de búsqueda
//
setll arg FICHERO;
//
// Leer fichero de datos
//
read FICHERO;
//
// Si no es fin de fichero, escribir registro en subfichero
//
dow not %eof(FICHERO);
nrr += 1; // Incrementar el numero relativo de registro
MOSTRAR = *on; // Mostrar subfichero
write SFL1;
read FICHERO;
enddo;
//
// Presentar la pantalla
//
exfmt SFL1CTL;
enddo;
//
// Terminar el programa
//
*inlr = *on;
/end-free
Página 1
Documento: PANTALLA1.DSPF
A* ------------------------------------------------------------------------------------------A* PANTALLA1.DSPF | Subfichero completo
A* ------------------------------------------------------------------------------------------A
DSPSIZ(24 80 *DS3)
A
R SFL1
SFL
A
NOMBRE
30A O 8 4
A
TELEFONO
15A O 8 35
A
EMAIL
30A O 8 51
A
R SFL1CTL
SFLCTL(SFL1)
A
SFLSIZ(0020)
A
SFLPAG(0010)
A
CA03(03 'Salir')
A N61 62
SFLDSP
A N61
SFLDSPCTL
A 61
SFLCLR
A N61 62
SFLEND(*MORE)
A
5 4'Desde el nombre . . .'
A
DSPATR(HI)
A
ARG
30A B 5 27DSPATR(HI)
A
CHECK(LC)
A
7 4'Nombre
'
A
DSPATR(RI)
A
7 35'Teléfono
'
A
DSPATR(RI)
A
7 51'Email
'
A
DSPATR(RI)
Página 1
Documento: PROG2.RPGLE
// ==========================================================================================
// PROG2.RPGLE | SUBFICHERO PÁGINA A PÁGINA
// · Es una técnica adecuada si se procesa un número grande de registros.
// · Un programa de subfichero tratado página a página prepara la primera página del
//
subfichero y la visualiza al usuario.
// · Si se pulsa la tecla de Avance Página, el control vuelve al programa y este adiciona una
//
segunda página al subfichero y lo visualiza de nuevo.
// · Si se pulsa Retroceder Página, el propio sistema operativo se encargará de retroceder a
//
la primera página.
// · Si en estas circunstancias se pulsa de nuevo Avance Página, el sistema operativo paginar
//
el subfichero a la segunda página.
// · Si se insiste en Avanzar, la tercera página debe añadirse por programa y luego
//
visualizarse.
// -----------------------------------------------------------------------------------------// Procedimiento:
// · Para este funcionamiento hay que añadir la tecla ROLLUP a la DDS del fichero de
//
pantalla. Esto hace que el sistema operativo pagine el subfichero hacia adelante hasta
//
que la última página añadida se visualice. Si en esta situación se pulsa de nuevo
//
Acance de Página el control vuelve al programa como si se hubiera pulsado una tecla de
//
función.
// · El indicador 60 asociado a la palabra clave ROLLUP se activa (ON) y el programa puede
//
probar esta situación.
// · La lógica salta la rutina de borrado del SFL cuando la tecla Avan Pág ha sido pulsada.
// · La rutina de lectura/carga del subfichero lee los próximos diez registros.
// · Cuando se produce el EOF el indicador 99 se pone en ON y el bucle finaliza.
// · Si se produce EOF del FICHERO, como en la DDS la palabra clave ROLLUP está condicionada
//
a N99, esta queda sin efecto y si el operador solicita avanzar de nuevo, le aparecerá el
//
mensaje normal de fin de subfichero; al mismo tiempo que impide que el programa
//
intente leer más registros de los existentes.
// · Se ha añadido un campo oculto (SFLRCD) con la palabra clave SFLRCDNBR.
// · El campo se usa para posicionar el subfichero en la página adecuada durante la operación
//
de visualización.
// · El último NRR usado se sitúa en el campo SFLRCD asociado al SFLRCDNBR.
// · Cuando se visualiza el subfichero la palabra clave SFLRCDNBR hará que se visualice la
//
página que contiene el numero relativo de registro cuyo valor numérico se halla en le
//
campo SFLRCD.
// ==========================================================================================
//
// Cabecera
//
h copyright('Marcelino Rodríguez Suárez | http://www.marce.com')
h datedit(*dmy/)
h datfmt(*dmy/)
//
// Archivos (pantalla y disco)
//
fPANTALLA2 cf
e
workstn sfile(SFL1:nrr)
fFICHERO
if
e
k disk
//
// Definiciones de campo
//
d indicadores@
s
*
inz(%addr(*in))
Puntero indicadores
d indicadores
ds
based(indicadores@)
Estruct. indicadore
d SALIR
03
03n
F3=Salir
d AV_PAGINA
60
60n
Avance de página
d LIMPIAR
61
61n
Limpiar subfichero
d MOSTRAR
62
62n
Visualiza subficher
d FIN_FICHERO
99
99n
EOF fichero
//
d nrr
s
4s 0 inz(*zeros)
Nº rel. reg. subfic
d arg
s
30a
inz(*blanks)
Argumento búsqueda
d i
s
4s 0 inz(*zeros)
Contador bucle for
//
// Especificaciones de cálculo en formato libre
//
/free
//
// Presentar pantalla
//
exfmt SFL1CTL;
Página 2
Documento: PROG2.RPGLE
//
// Ejecutar hasta que se pulse F3
//
dow not SALIR;
//
// Si no pulsa Av Pág (RollUp)
//
if not AV_PAGINA;
nrr = *zeros; // Inicializar el numero relativo de registro
MOSTRAR = *off; // No mostrar subfichero
//
// Limpirar subfichero
//
LIMPIAR = *on;
write SFL1CTL;
LIMPIAR = *off;
//
// Posicionarse en el fichero con el argumento de búsqueda
//
setll arg FICHERO ;
endif;
//
// Leer hasta un máximo de 10 registros de cada vez.
// El tamaño de la página del subfichero es 10 (SFLPAG)
//
for i = 1 to 10;
//
// Leer fichero de datos
//
read FICHERO;
//
// Si no es fin de fichero, escribir registro en subfichero
//
if not %eof(FICHERO);
FIN_FICHERO = *off;
nrr += 1; // Incrementar el numero relativo de registro
MOSTRAR = *on; // Mostrar subfichero
write SFL1;
else;
FIN_FICHERO = *on;
leave;
endif;
endfor;
//
// Se visualizará la página del subfichero donde se encuentre
// el último número relativo de registro cargado.
// La palabra clave de la DDS que lo define es SFLRCDNBR
//
sflrcd = nrr;
//
// Presentar la pantalla
//
exfmt SFL1CTL;
enddo;
// Terminar el programa
*inlr = *on;
/end-free
Página 1
Documento: PANTALLA2.DSPF
A* ------------------------------------------------------------------------------------------A* PANTALLA2.DSPF | Subfichero página a página
A* ------------------------------------------------------------------------------------------A
DSPSIZ(24 80 *DS3)
A
R SFL1
SFL
A
NOMBRE
30A O 8 4
A
TELEFONO
15A O 8 35
A
EMAIL
30A O 8 51
A
R SFL1CTL
SFLCTL(SFL1)
A
SFLSIZ(0020)
A
SFLPAG(0010)
A
CA03(03 'Salir')
A N99
ROLLUP(60 'AvPág')
A N61 62
SFLDSP
A N61
SFLDSPCTL
A 61
SFLCLR
A N61 62 99
SFLEND(*MORE)
A N61 62
SFLRCD
4S 0H
SFLRCDNBR
A
5 4'Desde el nombre . . .'
A
DSPATR(HI)
A
ARG
30A B 5 27DSPATR(HI)
A
CHECK(LC)
A
7 4'Nombre
'
A
DSPATR(RI)
A
7 35'Teléfono
'
A
DSPATR(RI)
A
7 51'Email
'
A
DSPATR(RI)
Página 1
Documento: PROG3.RPGLE
// ==========================================================================================
// PROG3.RPGLE | SUBFICHERO DE UNA PÁGINA
// · Es una técnica adecuada si se procesa un número grande de registros.
// · Requieren una mínima cantidad de recursos de memoria.
// · Se presenta siempre una nueva página de registros y el subfichero equivale a esta página
//
siendo el programa el encargado de controlar la paginación.
// -----------------------------------------------------------------------------------------// Procedimiento:
// · En este caso se define SFLSIZ = SFLPAG
// ==========================================================================================
//
// Cabecera
//
h copyright('Marcelino Rodríguez Suárez | http://www.marce.com')
h datedit(*dmy/)
h datfmt(*dmy/)
//
// Archivos (pantalla y disco)
//
fPANTALLA3 cf
e
workstn sfile(SFL1:nrr)
fFICHERO
if
e
k disk
//
// Definiciones de campo
//
d indicadores@
s
*
inz(%addr(*in))
Puntero indicadores
d indicadores
ds
based(indicadores@)
Estruct. indicadore
d SALIR
03
03n
F3=Salir
d AV_PAGINA
60
60n
Avance de página
d LIMPIAR
61
61n
Limpiar subfichero
d MOSTRAR
62
62n
Visualiza subficher
d FIN_FICHERO
99
99n
EOF fichero
//
d nrr
s
4s 0 inz(*zeros)
Nº rel. reg. subfic
d arg
s
30a
inz(*blanks)
Argumento búsqueda
d i
s
4s 0 inz(*zeros)
Contador bucle for
//
// Especificaciones de cálculo en formato libre
//
/free
//
// Presentar pantalla
//
exfmt SFL1CTL;
//
// Ejecutar hasta que se pulse F3
//
dow not SALIR;
//
// Si no pulsa Av Pág (RollUp)
//
if not AV_PAGINA;
//
// Posicionarse en el fichero con el argumento de búsqueda
//
setll arg FICHERO;
endif;
nrr = *zeros; // Inicializar el numero relativo de registro
MOSTRAR = *off; // No mostrar subfichero
//
// Limpirar subfichero
//
LIMPIAR = *on;
write SFL1CTL;
LIMPIAR = *off;
//
// Leer hasta un máximo de 10 registros de cada vez.
// El tamaño de la página del subfichero es 10 (SFLPAG)
//
for i = 1 to 10;
//
Página 2
Documento: PROG3.RPGLE
// Leer fichero de datos
//
read FICHERO;
//
// Si no es fin de fichero, escribir registro en subfichero
//
if not %eof(FICHERO);
FIN_FICHERO = *off;
nrr += 1; // Incrementar el numero relativo de registro
MOSTRAR = *on; // Mostrar subfichero
write SFL1;
else;
FIN_FICHERO = *on;
leave;
endif;
endfor;
//
// Presentar pantalla
//
exfmt SFL1CTL;
enddo;
// Terminar el programa
*inlr = *on;
/end-free
Página 1
Documento: PANTALLA3.DSPF
A* ------------------------------------------------------------------------------------------A* PANTALLA3.DSPF | Subfichero de una página
A* ------------------------------------------------------------------------------------------A
DSPSIZ(24 80 *DS3)
A
R SFL1
SFL
A
NOMBRE
30A O 8 4
A
TELEFONO
15A O 8 35
A
EMAIL
30A O 8 51
A
R SFL1CTL
SFLCTL(SFL1)
A
SFLSIZ(0010)
A
SFLPAG(0010)
A
CA03(03 'Salir')
A N99
ROLLUP(60 'AvPág')
A N61 62
SFLDSP
A N61
SFLDSPCTL
A 61
SFLCLR
A N61 62 99
SFLEND(*MORE)
A
5 4'Desde el nombre . . .'
A
DSPATR(HI)
A
ARG
30A B 5 27DSPATR(HI)
A
CHECK(LC)
A
7 4'Nombre
'
A
DSPATR(RI)
A
7 35'Teléfono
'
A
DSPATR(RI)
A
7 51'Email
'
A
DSPATR(RI)
Página 1
Documento: PROG4.RPGLE
// ==========================================================================================
// PROG4.RPGLE | EJEMPLO EMPLEO READC (Subfichero página a página)
// · El subfichero se usará para visualizar una lista de registros con el objetivo de que el
//
usuario pueda hacer una selección entre ellos.
// · El método empleado para cargar y representar el subfichero en pantalla es el denominado
//
página a página.
// -----------------------------------------------------------------------------------------// Procedimiento:
// · Se situa un campo de entrada de una sola posición, a la izquierda de cada registro del
//
subfichero, para que el usuario pudiera entrar un código de acción.
// · El usuario puede poner un "6" en varios de los registros visualizados.
// · El código de operación usado para leer registros modificados del subfichero es READC.
// · Un registro se considera modificado si algún dato (incluido blancos) se teclea en un
//
campo del subfichero que sea susceptible de entrada.
// · Si se recupera algún registro, el campo de entrada SEL se compara con "6" y si coincide,
//
se ejecutará la subrutina correspondiente.
// ==========================================================================================
//
// Cabecera
//
h copyright('Marcelino Rodríguez Suárez | http://www.marce.com')
h datedit(*dmy/)
h datfmt(*dmy/)
//
// Archivos (pantalla, impresora y disco)
//
fPANTALLA4 cf
e
workstn sfile(SFL1:nrr)
fQPRINT
o
f 132
printer oflind(*inof)
fFICHERO
if
e
k disk
//
// Definiciones de campo
//
d indicadores@
s
*
inz(%addr(*in))
Puntero indicadores
d indicadores
ds
based(indicadores@)
Estruct. indicadore
d SALIR
03
03n
F3=Salir
d AV_PAGINA
60
60n
Avance de página
d LIMPIAR
61
61n
Limpiar subfichero
d MOSTRAR
62
62n
Visualiza subficher
d FIN_FICHERO
99
99n
EOF fichero
//
d nrr
S
4s 0 inz(*zeros)
Nº rel. reg. subfic
d nTotRr
s
4s 0 inz(*zeros)
Nº total reg. subf.
d arg
s
30a
inz(*blanks)
Argumento búsqueda
d argSav
s
30a
inz(*loval)
Argumento anterior
d i
S
4s 0 inz(*zeros)
Contador bucle for
//
// Especificaciones de cálculo en formato libre
//
//
/free
//
// Presentar pantalla
//
exfmt SFL1CTL;
//
// Ejecutar hasta que se pulse F3
//
dow not SALIR;
//
// Si no pulsa Av Pág (RollUp)
//
if not AV_PAGINA;
//
// Si hay registros en el subfichero se leen posibles cambios
//
if nTotRr <> *zeros;
//
// Leer cambios
//
readc SFL1;
Página 2
Documento: PROG4.RPGLE
dow not %eof();
//
// Impresión de la ficha
//
if sel = '6';
exsr imprimeFicha;
endif;
//
// Leer cambios
//
readc SFL1;
enddo;
endif;
//
// Si hay un nuevo argumento de búsqueda se inicializa el subfichero
//
if arg <> argSav;
nTotRr = *zeros; // Inicializar el numero relativo de registro
nrr = nTotRr;
MOSTRAR = *off; // No mostrar subfichero
//
// Limpirar subfichero
//
LIMPIAR = *on;
write SFL1CTL;
LIMPIAR = *off;
//
// Posicionarse en el fichero con el argumento de búsqueda
//
setll arg FICHERO;
//
exsr fillSfl; // Leer hasta un máximo de 10 registros de cada vez
argSav = arg; // Se guarda el argumento de búsqueda actual
endif;
else;
exsr fillSfl; // Leer hasta un máximo de 10 registros de cada vez
endif;
//
// Se visualizará la página del subfichero donde se encuentre
// el último número relativo de registro cargado.
// La palabra clave de la DDS que lo define es SFLRCDNBR
//
sflrcd = nrr;
//
// Presentar pantalla
//
exfmt SFL1CTL;
enddo;
//
// Terminar el programa
//
*inlr = *on;
//----------------------------------------------------------------// Carga de registros en el subfichero
//----------------------------------------------------------------begsr fillSfl;
//
// Leer hasta un máximo de 10 registros de cada vez.
// El tamaño de la página del subfichero es 10 (SFLPAG)
//
for i = 1 to 10;
//
// Leer fichero de datos
//
read FICHERO;
//
// Si no es fin de fichero, escribir registro en subfichero
//
if not %eof(FICHERO);
FIN_FICHERO = *off;
Página 3
Documento: PROG4.RPGLE
nTotRr += 1; // Incrementar el numero relativo de registro
nrr = nTotRr;
MOSTRAR = *on; // Mostrar subfichero
sel = *blanks;
write SFL1;
else;
FIN_FICHERO = *on;
leave;
endif;
endfor;
endsr;
//----------------------------------------------------------------// Impresión de la ficha
//----------------------------------------------------------------begsr imprimeFicha;
except reca;
// Imprimir el registro
dsply ('Impresa la ficha de: ' + %trim(nombre) + '.' );
sel = *blanks; // Establecer a blanco el campo de selección
update SFL1;
// Actualizar el registro del subfichero
endsr;
/end-free
//
// Especificaciones de salida
//
oQPRINT
e
reca
0 2 01
o
10 'Ficha'
o
udate
y
20
o
nombre
55
o
telefono
75
o
email
110
Página 1
Documento: PANTALLA4.DSPF
A* ------------------------------------------------------------------------------------------A* PANTALLA4.DSPF | Ejemplo empleo READC (Subfichero página a página)
A* ------------------------------------------------------------------------------------------A
DSPSIZ(24 80 *DS3)
A
R SFL1
SFL
A
SEL
1A B 8 2VALUES(' ' '6')
A
NOMBRE
30A O 8 4
A
TELEFONO
15A O 8 35
A
EMAIL
30A O 8 51
A
R SFL1CTL
SFLCTL(SFL1)
A
SFLSIZ(0020)
A
SFLPAG(0010)
A
CA03(03 'Salir')
A N99
ROLLUP(60 'AvPág')
A N61 62
SFLDSP
A N61
SFLDSPCTL
A 61
SFLCLR
A N61 62 99
SFLEND(*MORE)
A N61 62
SFLRCD
4S 0H
SFLRCDNBR
A
3 1'Desde el nombre . . .'
A
DSPATR(HI)
A
ARG
30A B 3 24DSPATR(HI)
A
CHECK(LC)
A
5 1'Opciones: 6=Imprimir'
A
COLOR(BLU)
A
7 1'Op'
A
DSPATR(RI)
A
7 4'Nombre
'
A
DSPATR(RI)
A
7 35'Teléfono
'
A
DSPATR(RI)
A
7 51'Email
'
A
DSPATR(RI)
Página 1
Documento: PROG5A.RPGLE
// ==========================================================================================
// PROG5A.RPGLE | EJEMPLO DE SELECCIÓN (Programa principal que llama al subprograma)
// · El programa principal requiere un teléfono que se obtiene a través de un subprograma con
//
un subfichero de selección.
// -----------------------------------------------------------------------------------------// Procedimiento:
// · Se solicita al usuario que teclee el nombre de la persona y pulse INTRO.
// · El programa principal llama entonces al subprograma ofreciendo un subfichero de
//
selección.
// · El subprograma es llamado con el nombre de la persona como primer parámetro.
// · El subprograma, mediante SETLL y READE, monta un subfichero con los teléfonos de la
//
persona indicada y los muestra en pantalla para que el usuario seleccione el adecuado.
// · Después de recuperado el registro seleccionado mediante READC, el teléfono es devuelto a
//
programa principal en un segundo parámetro.
// ==========================================================================================
//
// Cabecera
//
h copyright('Marcelino Rodríguez Suárez | http://www.marce.com')
h datedit(*dmy/)
h datfmt(*dmy/)
//
// Prototipo del programa llamado
//
d program
pr
extpgm('PROG5')
d pNombre
30a
d pTelefono
15a
//
// Definiciones de campo
//
d pNombre
s
30a
inz(*blanks)
d pTelefono
s
15a
inz(*blanks)
d respuesta
s
1a
inz(*blanks)
//
// Especificaciones de cálculo en formato libre
//
/free
//
// Presentar petición de nombre
//
dsply 'Nombre a seleccionar: ' ' ' pNombre;
//
// Llamada al programa de selección
//
program(pNombre : pTelefono);
//
// Presentación del teléfono de respuesta
//
if pTelefono <> *blanks;
dsply ('Teléfono devuelto: ' + pTelefono) ' ' respuesta;
endif;
//
// Terminar el programa
//
*inlr = *on;
/end-free
Página 1
Documento: PROG5.RPGLE
// ==========================================================================================
// PROG5.RPGLE | EJEMPLO DE SELECCIÓN - Subprograma (Subfichero completo)
// · Se emplea la técnica del subfichero completo.
// -----------------------------------------------------------------------------------------// Procedimiento:
// · El subprograma es llamado con el nombre de la persona como primer parámetro.
// · El subprograma, mediante SETLL y READE, monta un subfichero con los teléfonos de la
//
persona indicada y los muestra en pantalla para que el usuario seleccione el adecuado.
// · Después de recuperado el registro seleccionado mediante READC, el teléfono es devuelto a
//
programa principal en un segundo parámetro.
// ==========================================================================================
//
// Cabecera
//
h copyright('Marcelino Rodríguez Suárez | http://www.marce.com')
h datedit(*dmy/)
h datfmt(*dmy/)
//
// Archivos (pantalla, impresora y disco)
//
fPANTALLA5 cf
e
workstn sfile(SFL1:nrr)
fQPRINT
o
f 132
printer oflind(*inof)
fFICHERO
if
e
k disk
//
// Prototipo de llamada al programa
//
d main
pr
extpgm('PROG5')
d pNombre
30a
d pTelefono
15a
//
// Interfaz de procedimiento
//
d main
pi
d pNombre
30a
d pTelefono
15a
//
// Estructura de datos de la clave del fichero
//
d clave
ds
likerec(registro : *key)
//
// Definiciones de campo
//
d indicadores@
s
*
inz(%addr(*in))
Puntero indicadores
d indicadores
ds
based(indicadores@)
Estruct. indicadore
d SALIR
03
03n
F3=Salir
d MOSTRAR
62
62n
Visualiza subficher
//
d nrr
s
4s 0 inz(*zeros)
Nº rel. reg. subfic
d nTotRr
s
4s 0 inz(*zeros)
Nº total reg. subf.
d arg
s
30a
inz(*blanks)
Argumento búsqueda
//
// Especificaciones de cálculo en formato libre
//
/free
//
// Si se llama al programa con al menos un parámetro este se almacena en arg
//
if %parms >= 1;
arg = pNombre;
endif;
//
// Posicionarse en el fichero con el argumento de búsqueda
//
clave.nombre = arg;
setll clave.nombre FICHERO;
//
// Leer y cargar los registros
//
if %parms >= 1;
reade clave.nombre FICHERO;
Página 2
Documento: PROG5.RPGLE
else;
read FICHERO;
endif;
//
dow not %eof(FICHERO);
nTotRr += 1; // Incrementar el numero relativo de registro
nrr = nTotRr;
MOSTRAR = *on; // Mostrar subfichero
sel = *blanks;
write SFL1;
//
// Leer fichero de datos
//
if %parms >= 1;
reade clave.nombre FICHERO;
else;
read FICHERO;
endif;
enddo;
//
sflrcd = 1; // Se visualizará la primera página del subfichero.
//
// Presentar pantalla
//
exfmt SFL1CTL;
//
// Ejecutar hasta que se pulse F3
//
dow not SALIR;
//
// Si hay registros en el subfichero se leen posibles cambios
//
if nTotRr <> *zeros;
//
// Leer cambios
//
readc SFL1;
dow not %eof();
//
sflrcd = nrr; // Visualizar página del último número relativo de registro cambiado.
//
// Impresión de la ficha
//
if sel = '6';
exsr imprimeFicha;
//
// Selección del registro
//
elseif sel = '9';
if %parms >= 2; // Si hay un 2º parámetro se le pasará el teléfono
pTelefono = telefono;
endif;
*inlr = *on; // Terminar el programa
return;
endif;
//
// Leer cambios
//
readc SFL1;
enddo;
endif;
//
// Presentar pantalla
//
exfmt SFL1CTL;
enddo;
//
// Terminar el programa
//
*inlr = *on;
Página 3
Documento: PROG5.RPGLE
//----------------------------------------------------------------// Impresión de la ficha
//----------------------------------------------------------------begsr imprimeFicha;
except reca;
// Imprimir el registro
dsply ('Impresa la ficha de: ' + %trim(nombre) + '.' );
sel = *blanks; // Establecer a blanco el campo de selección
update SFL1;
// Actualizar el registro del subfichero
endsr;
/end-free
//
// Especificaciones de salida
//
oQPRINT
e
reca
0 2 01
o
10 'Ficha'
o
udate
y
20
o
nombre
55
o
email
75
o
telefono
110
Página 1
A*
A*
A*
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
Documento: PANTALLA5.DSPF
------------------------------------------------------------------------------------------PANTALLA5.DSPF | Ejemplo de selección (Subfichero completo)
------------------------------------------------------------------------------------------DSPSIZ(24 80 *DS3)
R SFL1
SFL
SEL
1A B 8 2VALUES('6' '9' ' ')
NOMBRE
30A O 8 4
TELEFONO
15A O 8 35
EMAIL
30A O 8 51
R SFL1CTL
SFLCTL(SFL1)
SFLSIZ(0020)
SFLPAG(0010)
CA03(03 'Salir')
62
SFLDSP
SFLDSPCTL
62
SFLEND(*MORE)
62
SFLRCD
4S 0H
SFLRCDNBR
3 1'Nombre . . . . . . . .'
DSPATR(HI)
ARG
30A O 3 24DSPATR(HI)
5 1'Opciones: 6=Imprimir 9=Seleccionar'
COLOR(BLU)
7 1'Op'
DSPATR(RI)
7 4'Nombre
'
DSPATR(RI)
7 35'Teléfono
'
DSPATR(RI)
7 51'Email
'
DSPATR(RI)
Página 1
Documento: PROG6.RPGLE
// ==========================================================================================
// PROG6.RPGLE | EJEMPLO DE SELECCIÓN DE CÓDIGO (Subfichero completo)
// · El programa imprime, previa confirmación, las personas cuyo email no contiene una arroba
//
a excepción de aquellas que explícitamente señale el usuario.
// · El método empleado para cargar y representar el subfichero en pantalla es el denominado
//
completo.
// -----------------------------------------------------------------------------------------// Procedimiento:
// · El programa pone un "6" en el campo de selección SEL en el momento en que cada uno de lo
//
registros seleccionados es grabado en el subfichero. Si el usuario decide no imprimir
//
alguna ficha, puede blanquear el código "6".
// · Los registros se recuperan empleando la palabra clave SFLNXTCHG en el registro del
//
subfichero de la DDS. Esta palabra clave esta condicionada por el indicador 40, que se
//
pone a ON cuando se graba en el subfichero un registro que no contiene una arroba en el
//
email. Con lo que en la próxima lectura del subfichero, hará que este registro se
//
comporte como si hubiera sido modificado por el usuario.
// · Una operación READC recuperará el registro y la ficha será impresa automáticamente.
// · Un READC recupera también los registros "blanqueados", pero como el campo SEL está en
//
blanco, no actuará la rutina de impresión.
// · La aplicación cuando el campo email no contiene una arroba, debe parpadear.
// · La función de parpadeo se activa usando en las DDS la palabra clave DSPATR(BL)
// · Los atributos de campo también pueden emplearse con los registros de un subfichero.
// · Así, en la DDS, el campo EMAIL tiene DSPATR(BL) condicionado por el indicador 41. Este
//
indicador se pone a ON al grabar un registro en el subfichero, si el email no contiene
//
una arroba, por tanto parpadeará.
// · En el programa se observa que para cada registro que se lee del archivo, se verifica si
//
el email no contiene una arroba, activándose en este caso los indicadores 40 y 41, y
//
moviendo un "6" al campo SEL.
// ==========================================================================================
//
// Cabecera
//
h copyright('Marcelino Rodríguez Suárez | http://www.marce.com')
h datedit(*dmy/)
h datfmt(*dmy/)
//
// Archivos (pantalla, impresora y disco)
//
fPANTALLA6 cf
e
workstn sfile(SFL1:nrr)
fQPRINT
o
f 132
printer oflind(*inof)
fFICHERO
if
e
k disk
//
// Definiciones de campo
//
d indicadores@
s
*
inz(%addr(*in))
Puntero indicadores
d indicadores
ds
based(indicadores@)
Estruct. indicadore
d SALIR
03
03n
F3=Salir
d CAMBIO_REG
40
40n
Cambio reg. subfich
d PARPADEAR
41
41n
Email parpadeante
d MOSTRAR
62
62n
Visualiza subficher
//
d nrr
s
4s 0 inz(*zeros)
Nº rel. reg. subfic
//
// Especificaciones de cálculo en formato libre
//
/free
//
// Posicionarse en el primer registro del fichero
//
setll *loval FICHERO;
//
// Leer fichero de datos
//
read FICHERO;
//
// Si no es fin de fichero, escribir registro en subfichero
//
dow not %eof(FICHERO);
nrr += 1; // Incrementar el numero relativo de registro
MOSTRAR = *on; // Mostrar subfichero
Página 2
Documento: PROG6.RPGLE
// Si el email no contiene una arroba (@) se debe marcar
if %scan ('@' : email) = *zeros and email <> *blanks;
sel = '6';
// Se marca para imprimir
CAMBIO_REG = *on;
// Se activa el indicador de registro cambiado
PARPADEAR = *on;
// Se activa el parpadeo del email
else;
sel = *blanks;
// No se marca para imprimir
CAMBIO_REG = *off; // Se desactiva el indicador de registro cambiado
PARPADEAR = *off; // Se desactiva el parpadeo del email
endif;
write SFL1;
read FICHERO;
enddo;
//
CAMBIO_REG = *off;
PARPADEAR = *off;
sflrcd = 1; // Se visualiza 1ª la página del subfichero
//
// Presentar la pantalla
//
exfmt SFL1CTL;
//
// Ejecutar hasta que se pulse F3
//
dow not SALIR;
// Si hay registros
if nrr <> *zeros;
// Leer posibles cambios
readc SFL1;
dow not %eof(); // Hay cambios
// Se visualizará la página del subfichero donde se encuentre el último
// número de registro tratado
sflrcd = nrr;
// Impresión de la ficha
if sel = '6';
exsr imprimeFicha;
endif;
// Leer posibles cambios
readc SFL1;
enddo;
endif;
//
// Presentar la pantalla
//
exfmt SFL1CTL;
enddo;
//
// Terminar el programa
//
*inlr = *on;
//----------------------------------------------------------------// Impresión de la ficha
//----------------------------------------------------------------begsr imprimeFicha;
except reca;
dsply ('Impresa la ficha de: ' + %trim(nombre) + '.');
sel = *blanks;
if %scan ('@' : email) = *zeros and email <> *blanks;
PARPADEAR = *on;
// Se activa el parpadeo del email
else;
PARPADEAR = *off; // Se desactiva el parpadeo del nombre
endif;
update SFL1;
PARPADEAR = *off;
endsr;
/end-free
//
// Especificaciones de salida
//
oQPRINT
e
reca
0 2 1
Página 3
o
o
o
o
o
Documento: PROG6.RPGLE
udate
nombre
telefono
email
y
10 'Ficha'
20
55
75
110
Página 1
A*
A*
A*
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
Documento: PANTALLA6.DSPF
------------------------------------------------------------------------------------------PANTALLA6.DSPF | Ejemplo de selección código (Subfichero completo)
------------------------------------------------------------------------------------------DSPSIZ(24 80 *DS3)
R SFL1
SFL
40
SFLNXTCHG
SEL
1A B 8 2VALUES('6' ' ')
NOMBRE
30A O 8 4
TELEFONO
15A O 8 35
EMAIL
30
O 8 51
41
DSPATR(BL)
41
COLOR(RED)
R SFL1CTL
SFLCTL(SFL1)
SFLSIZ(0020)
SFLPAG(0010)
CA03(03 'Salir')
62
SFLDSP
SFLDSPCTL
62
SFLEND(*MORE)
62
SFLRCD
4S 0H
SFLRCDNBR
5 1'Opciones: 6=Imprimir'
COLOR(BLU)
7 1'Op'
DSPATR(RI)
7 4'Nombre
'
DSPATR(RI)
7 35'Teléfono
'
DSPATR(RI)
7 51'Email
'
DSPATR(RI)
Página 1
Documento: PROG7.RPGLE
// ==========================================================================================
// PROG7.RPGLE | VERIFICACIÓN DE DATOS MEDIANTE EL USO DE SFLNXTCHG (Subfichero completo)
// · La palabra SFLNXTCHG se puede usar para efectuar el control de errores en los campos de
//
entrada de los registros de un subfichero.
// · Se usa si la cantidad de registros a procesar es reducida y el riesgo de pérdida de
//
datos es mínimo.
// · El método empleado para cargar y representar el subfichero en pantalla es el denominado
//
completo.
// -----------------------------------------------------------------------------------------// Procedimiento:
// · En el ejemplo el usuario actualiza, mediante el uso de un subfichero, el teléfono y el
//
email de una persona determinada.
// · Cuando pulsa INTRO, el programa ejecuta un bucle con READC para obtener los registros
//
modificados.
// · En este momento se comprueba la validez del teléfono y email para las personas.
//
(se entiende que no puede validarse desde la DDS con VALUE, RANGE, etc.).
// · Si no es válido, el programa pone en ON un indicador para el mensaje de error y cuando
//
todos los registros han sido procesados, si el indicador de error está activado, se
//
visualizará de nuevo el subfichero.
// · En este momento el usuario puede, en lugar de repasar y cambiar los registros erróneos,
//
pulsar simplemente INTRO de nuevo y, como los registros no han sido modificados, el
//
bucle READC no los procesará, por tanto, la técnica expuesta anteriormente es
//
inadecuada.
// · Lo que se debe hacer es activar, además del indicador de error, un indicador individual
//
que condicione un DSPATR(BL) para cada campo erróneo y un indicador para condicionar
//
SFLNXTCHG, y seguidamente actualizar en el subfichero el registro que se está
//
procesando con estos indicadores activados.
// · Aunque el contenido de los campos no varié, como se activó 'registro cambiado' con
//
SFLNXTCHG en la próxima lectura, una vez dado el INTRO, se leerá de nuevo este registro
//
como si se hubiera modificado por el usuario.
// ==========================================================================================
//
// Cabecera
//
h copyright('Marcelino Rodríguez Suárez | http://www.marce.com')
h datedit(*dmy/)
h datfmt(*dmy/)
//
// Archivos (pantalla y disco)
//
fPANTALLA7 cf
e
workstn sfile(SFL1:nrr)
fFICHERO
if
e
k disk
//
// Definiciones de campo
//
d indicadores@
s
*
inz(%addr(*in))
Puntero indicadores
d indicadores
ds
based(indicadores@)
Estruct. indicadore
d SALIR
03
03n
F3=Salir
d CAMBIO_REG
40
40n
Cambio reg. subfich
d MOSTRAR
62
62n
Visualiza subficher
d MENSAJE_ERR
55
55n
Mensaje error subf.
d ERROR_TELEF
91
91n
Error en teléfono
d ERROR_EMAIL
92
92n
Error en email
//
d nrr
s
4s 0
Nº rel. reg. subfic
//
// Especificaciones de cálculo en formato libre
//
/free
//
// Posicionarse al inicio del fichero
//
setll *loval FICHERO;
//
// Leer fichero de datos
//
read FICHERO;
//
// Si no es fin de fichero, escribir registro en subfichero
//
Página 2
Documento: PROG7.RPGLE
dow not %eof(FICHERO);
nrr += 1; // Incrementar el numero relativo de registro
MOSTRAR = *on; // Mostrar subfichero
write SFL1;
read FICHERO;
enddo;
//
// Presentar la pantalla
//
exfmt SFL1CTL;
//
// Ejecutar hasta que se pulse F3
//
dow not SALIR;
// Si hay registros en el subfichero ir a la rutina de verificación
if nrr > *zeros;
exsr verif;
// Si no hay errores se sale del bucle de presentación de la pantalla
if not MENSAJE_ERR;
leave;
endif;
endif;
//
// Presentar la pantalla
//
exfmt SFL1CTL;
enddo;
//
// Terminar el programa
//
*inlr = *on;
// -------------------------------------------------------------------// Rutina de verificación de los datos introducidos en el subfichero
// -------------------------------------------------------------------begsr verif;
MENSAJE_ERR = *off;
readc SFL1;
dow not %eof();
CAMBIO_REG = *off;
ERROR_TELEF = *off;
ERROR_EMAIL = *off;
// Activación del indicador de parpadeo del teléfono
if %xlate('1234567890+-*/=.()#@·:,;':
'
':
telefono) <> *blanks;
ERROR_TELEF = *on;
endif;
// Activación del indicador de parpadeo del email
if %scan ('@' : email) = *zeros and email <> *blanks;
ERROR_EMAIL = *on;
endif;
// Si hay error en el teléfono o el email se activa el indicador de
// registro cambiado y el de mensaje de error del subfichero
if ERROR_TELEF or ERROR_EMAIL;
CAMBIO_REG = *on; // Se activa cambio de registro del subfichero
MENSAJE_ERR = *on; // Se activa mensaje de error del subfichero
endif;
update SFL1;
readc SFL1;
enddo;
//
CAMBIO_REG = *off;
ERROR_TELEF = *off;
ERROR_EMAIL = *off;
endsr;
/end-free
Página 1
A*
A*
A*
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
Documento: PANTALLA7.DSPF
------------------------------------------------------------------------------------------PANTALLA7.DSPF | Verificación de datos (Subfichero completo)
------------------------------------------------------------------------------------------DSPSIZ(24 80 *DS3)
R SFL1
SFL
40
SFLNXTCHG
NOMBRE
30A B 8 4CHECK(LC)
TELEFONO
15A B 8 35
91
DSPATR(BL)
91
COLOR(RED)
EMAIL
30A B 8 51CHECK(LC)
92
DSPATR(BL)
92
COLOR(RED)
R SFL1CTL
SFLCTL(SFL1)
CA03(03 'Salir')
62
SFLDSP
SFLDSPCTL
62
SFLEND(*MORE)
SFLSIZ(0020)
SFLPAG(0010)
55
SFLMSG('email sin arroba o teléfonocon letras' 55)
7 4'Nombre
'
DSPATR(RI)
7 35'Teléfono
'
DSPATR(RI)
7 51'Email
'
DSPATR(RI)
Página 1
Documento: FICHERO.PF
* ------------------------------------------------------------------------------------------* FICHERO.PF | Archivo físico: Fichero
* ------------------------------------------------------------------------------------------A
UNIQUE
A
R REGISTRO
A
NOMBRE
30A
COLHDG('Nombre')
A
TELEFONO
15A
COLHDG('Teléfono')
A
EMAIL
30A
COLHDG('Email')
A
K NOMBRE
A
K TELEFONO
A
K EMAIL
/*
* FICHEROD.SQL | Datos de test para el fichero
*/
INSERT INTO FICHERO VALUES
('Adela Casanovas Santos ', '729860652', '[email protected]
'),
('Alicia Veraguas Amador ', '840030103', '[email protected] '),
('Amaya Arenas Tamayo
', '773430585', '[email protected]
'),
('Carmen Solar Arroyo
', '824419483', '[email protected] '),
('Cristina Barreiro Serra ', '634281441', '[email protected]'),
('Diego Sanz Casado
', '722998487', '[email protected]
'),
('Fátima Dávila Sánchez
', '788203588', '[email protected] '),
('Juan Santafé Castaño
', '630454420', 'juan#marce.com
'),
('Manuel Álvarez Viana
', '707937809', '[email protected] '),
('Manuela Moreno Melero
', '758431258', '[email protected] '),
('María Fernández Pérez
', '651142918', '[email protected]
'),
('Marta Rodríguez Esteban ', '603652729', '[email protected]
'),
('Susana Alsogaray Gómez ', '639802252', '[email protected] '),
('Victoria Herrera Soriano', '676290169', '[email protected]')
Página 1
Documento: PROGW.RPGLE
//
// PROGW.RPGLE | Programa (Subfichero Windows)
//
fPANTALLAW cf
e
workstn infds(infds)
f
sfile(SFL1:rrn1)
fARCHIVO
if
e
k disk
//
// Información de la estructura de datos de pantalla
//
d infds
ds
d actrrn
378
379b 0
//
// Prototipo del programa
//
d programa
pr
extpgm('PROGW')
d
3
d
3
//
// Interfaz de procedimiento del programa
//
d programa
pi
d inCodigo
3
d outCodigo
3
//
// Definiciones de campo
//
d fechaISO
s
d
d @pant1
s
1
inz('S')
d rrn1
s
like(C1NBR)
d savRrn
s
like(C1NBR)
d diaSemana
s
7 0
//=============================================================
// Inicio
//=============================================================
/free
@pant1 = 'S';
exsr $dia;
exsr $clearSfl;
if %parms > *zeros;
setll inCodigo ARCHIVO;
endif;
exsr $loadSfl;
dow @pant1 = 'S';
exfmt SFL1CTL;
if actrrn <> *zeros;
rrn1
= actrrn;
C1NBR
= rrn1;
endif;
select;
//
// F3=Fin del programa.
//
when *in03;
@pant1 = *blanks;
//
// F12=Fin del programa.
//
when *in12;
@pant1 = *blanks;
//
// Avance de página.
//
when *in33;
exsr $loadSfl;
//
// Otra. Se ha pulsado la tecla <INTRO>.
//
other;
if C1CODIGO <> *blanks;
exsr $clearSfl;
Página 2
Documento: PROGW.RPGLE
setll C1CODIGO ARCHIVO;
exsr $loadSfl;
clear C1CODIGO;
else;
exsr $proceso;
endif;
endsl;
enddo;
*inlr = *on;
return;
//==================================================================
// $loadSfl - Carga del subfichero.
//==================================================================
begsr $loadSfl;
if savRrn > *zeros;
C1NBR = savRrn;
rrn1 = C1NBR;
endif;
dou %eof(ARCHIVO);
read ARCHIVO;
if not %eof(ARCHIVO);
S1CODIGO = CODIGO;
S1NOMBRE = NOMBRE;
rrn1 += 1;
C1NBR = rrn1;
write SFL1;
endif;
enddo;
savRrn = C1NBR;
//
// Si no hay registros en el subfichero no se visualiza.
//
if savRrn = *zeros and %eof(ARCHIVO);
*in50 = *off;
else;
rrn1 = 1;
C1NBR = rrn1;
endif;
endsr;
//==================================================================
// $clearSfl - Limpiar subfichero.
//==================================================================
begsr $clearSfl;
setll *start ARCHIVO;
*in50 = *off;
*in51 = *off;
*in52 = *on;
write FMT1;
write SFL1CTL;
*in50 = *on;
*in51 = *on;
*in52 = *off;
clear rrn1;
clear C1NBR;
clear savRrn;
endsr;
//==================================================================
// $dia - Día actual.
//==================================================================
begsr $dia;
diaSemana = %diff(fechaISO: d'1899-12-30': *days);
diaSemana = %rem(diaSemana:7);
if diaSemana < 1;
diaSemana = diaSemana + 7;
endif;
select;
when diaSemana = 1;
C1DIA = 'Domingo';
when diaSemana = 2;
C1DIA = 'Lunes';
Página 3
Documento: PROGW.RPGLE
when diaSemana = 3;
C1DIA = 'Martes';
when diaSemana = 4;
C1DIA = 'Miércoles';
when diaSemana = 5;
C1DIA = 'Jueves';
when diaSemana = 6;
C1DIA = 'Viernes';
when diaSemana = 7;
C1DIA = 'Sábado';
endsl;
endsr;
//==================================================================
// $proceso - Procesar el subfichero.
//==================================================================
begsr $proceso;
if C1RRN > *zeros;
chain C1RRN SFL1;
if %found;
if %parms > 1;
outCodigo = S1CODIGO; // Código devuelto
endif;
@pant1 = *blanks;
endif;
endif;
endsr;
//==================================================================
// *inzsr - Subrutina de arranque inicial.
//==================================================================
begsr *inzsr;
fechaISO = %date(udate:*mdy);
endsr;
/end-free
Página 1
A*
A*
A*
A
A
A*
A*
A*
A
A
A
A*
A*
A*
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A*
A*
A*
A
A
A
A
A
A
A
A
A*
A*
A*
A
A
A
Documento: PANTALLAW.DSPF
-----------------------------------------------------------------------PANTALLAW.DSPF | Pantalla (Subfichero Windows)
-----------------------------------------------------------------------DSPSIZ(24 80 *DS3)
PRINT
-----------------------------------------------------------------------Subarchivo
-----------------------------------------------------------------------R SFL1
SFL
S1CODIGO
3A O 7 2
S1NOMBRE
30A O 7 7
-----------------------------------------------------------------------Control del subarchivo
-----------------------------------------------------------------------R SFL1CTL
SFLCTL(SFL1)
WINDOW(FMT1)
SFLSIZ(0020)
SFLPAG(0010)
CF03(03)
CF12(12)
ROLLUP(33)
BLINK
RTNDTA
OVERLAY
SFLCSRRRN(&C1RRN)
50
SFLDSP
51
SFLDSPCTL
52
SFLCLR
C1NBR
4S 0H
SFLRCDNBR
C1RRN
5S 0H
2 1DATE
EDTCDE(Y)
COLOR(BLU)
1 1TIME
COLOR(BLU)
C1DIA
10
O 3 1COLOR(BLU)
1 15'www.marce.com'
DSPATR(HI)
2 17'Selección'
1 36USER
COLOR(BLU)
2 36SYSNAME
COLOR(BLU)
4 1'Sitúese sobre su opción y pulse <INTRO>'
COLOR(BLU)
5 2'Id.'
DSPATR(HI)
DSPATR(UL)
5 7'Descripción
'
DSPATR(HI)
DSPATR(UL)
C1CODIGO
3A B 6 2DSPATR(HI)
-----------------------------------------------------------------------Ventana
-----------------------------------------------------------------------R FMT1
WINDOW(3 5 18 45)
OVERLAY
WDWBORDER((*COLOR BLU) (*DSPATR HI))
17 2'F3=Salir'
COLOR(BLU)
17 12'F12=Cancelar'
COLOR(BLU)
-----------------------------------------------------------------------Vacío
-----------------------------------------------------------------------R VACIO
ASSUME
1 3' '
Página 1
Documento: ARCHIVO.PF
* ------------------------------------------------------------------------------------------* ARCHIVO.PF | Archivo (Subfichero Windows)
* ------------------------------------------------------------------------------------------A
UNIQUE
A
R REGISTRO
A
CODIGO
3A
COLHDG('Código')
A
NOMBRE
30A
COLHDG('Nombre')
A
K CODIGO
/*
* ARCHIVOD.SQL | Datos de test para el archivo (Subfichero Windows)
*/
INSERT INTO ARCHIVO VALUES
('001', 'AAAAAAAAAA'), ('002', 'BBBBBBBBBB'),
('003', 'CCCCCCCCCC'), ('004', 'DDDDDDDDDD'),
('005', 'EEEEEEEEEE'), ('006', 'FFFFFFFFFF'),
('007', 'GGGGGGGGGG'), ('008', 'HHHHHHHHHH'),
('009', 'IIIIIIIIII'), ('010', 'JJJJJJJJJJ'),
('011', 'KKKKKKKKKK'), ('012', 'LLLLLLLLLL'),
('013', 'MMMMMMMMMM'), ('014', 'NNNNNNNNNN'),
('015', 'OOOOOOOOOO'), ('016', 'PPPPPPPPPP'),
('017', 'QQQQQQQQQQ'), ('018', 'RRRRRRRRRR'),
('019', 'SSSSSSSSSS'), ('020', 'TTTTTTTTTT'),
('021', 'UUUUUUUUUU'), ('022', 'VVVVVVVVVV'),
('023', 'WWWWWWWWWW'), ('024', 'XXXXXXXXXX'),
('025', 'YYYYYYYYYY'), ('026', 'ZZZZZZZZZZ')
Página 1
Documento: EMPRESAP.RPGLE
// ==========================================================================================
// EMPRESAP.RPGLE | Programa mantenimiento empresas-Subfichero edición-Formulario de empresas
// -----------------------------------------------------------------------------------------// OBJETIVO: Mantenimiento de empresas
// -----------------------------------------------------------------------------------------// Utilización de indicadores :
//
· Del 01 al 24 Teclas de función
//
· Del 25 al 99 Otras teclas programables,
//
mensajes de error y
//
visualizaciones alternativas
// ==========================================================================================
// Cabecera
h copyright('Marcelino Rodríguez Suárez | http://www.marce.com')
h datfmt(*eur) decedit('0,') alwnull(*usrctl)
// Archivos
fEMPRESAF uf a e
k disk
fEMPRESAS cf
e
workstn sfile(emprSubf: nrr)
f
indds(pantInds)
// Prototipo de llamada al programa
d main
pr
extpgm('EMPRESAP')
d
256a
// Interfaz de procedimiento
d main
pi
d parEnt
256a
// Definición de variables de programa
d strSel
ds
d
kUsuar
10a
d
kEstac
10a
d
kBibli
10a
d
kPanta
20a
d
kNomAp
12a
d
kNoEmp
30a
d
kDVino
20a
d
kAutor
1a
d
kOfici
1a
d
parDes
2s 0
d
parEmC
2s 0
d
parEmN
40a
// Estructura de datos de indicadores
d pantInds
ds
d EXIT
03
03n
F3=Salir
d REFRESH
05
05n
F5=Refrescar
d ADD_REG
06
06n
F6=Añadir
d CANCEL
12
12n
F12=Cancelar
*
d RE_PAG
25
25n
Página atrás
d AV_PAG
26
26n
Página adelante
d SFL_CLR
27
27n
Limpiar subficher
d SFL_DSP
28
28n
Visualizar subfic
d SFL_END
29
29n
Fin del fichero n
*
d SFL_AUDIT
35
35n
Usuario auditor
d SFL_SELEC
36
36n
Visualiza operaci
*
d SFL_REG_LOCK
40
40n
Registro bloquead
d SFL_REG_EOF
41
41n
No existe registr
d SFL_BOF_RE
42
42n
Inicio de archivo
d SFL_EOF_AV
43
43n
Fin de archivo ha
*
d KEY_DUP
50
50n
Clave duplicada
d KEY_EMPTY
51
51n
Clave en blanco
d DESC_EMPTY
52
52n
Descripción en bl
d MES_ERR
53
53n
Mes invalido
d FEC_ALTA_ERR
54
54n
Fecha alta inváli
d FEC_BAJA_ERR
55
55n
Fecha baja inváli
d FEC_RANG_ERR
56
56n
Fecha de alta may
*
d PROTECT_FLD
60
60n
Protege resto cam
d PROTECT_KEY
61
61n
Protege campo cla
// Otros indicadores de programa
Página 2
d
d
d
d
d
d
d
d
d
Documento: EMPRESAP.RPGLE
OPC_ERR
s
n
FIND_DESC
s
n
NOT_READC
s
n
REG_SELECT
s
n
REG_LOCKED
s
n
REG_NOTFND
s
n
EDIT_ERR
s
n
NOT_TOT_SFL
s
n
CHG_PROCES
s
n
// Matriz de textos
d sTxt
s
10a
dim(5)
ctdata
//
d kFunc
s
1a
//
d totNrr
s
4s 0 inz(10)
d cntNrr
s
4s 0
d nrr
s
4s 0
d dMovPag
s
2a
// Clave archivo
d regKey
ds
likerec(empreR : *key)
*
d iniKey
s
2s 0
d finKey
s
2s 0
*
d desCod
s
2s 0
d oldDesCod
s
2s 0 inz(*loval)
*
d desDes
s
40a
d oldDesDes
s
40a
inz(*loval)
// Campos de trabajo con fechas
d wFEdtA
s
6s 0
d wFEdtB
s
6s 0
d fechA
s
d
d fechB
s
d
// Especificaciones de cálculo en formato libre
/free
// En depuración
if %parms = *zeros;
kUsuar = 'USUARIO';
kEstac = 'ESTACIÓN';
kBibli = 'BIBLIOTECA';
kPanta = 'NOMBRE PANTALLA';
kNomAp = 'APLICACIÓN';
kNoEmp = 'NOMBRE DE LA ENTIDAD';
kDVino = 'PROGRAMA LLAMADOR';
kAutor = 'S';
kOfici = ' ';
parDes = *zeros;
parEmC = *zeros;
parEmN = *blanks;
else;
strSel = parEnt;
endif;
// Autorizado
if kAutor = 'S';
SFL_AUDIT = *on; // Usuario con autorización
endif;
// Llamado
if kDVino <> *blanks;
SFL_SELEC = *on; // Operación de selección
endif;
// Vbles. desde
if SFL_SELEC; // Operación de selección
desCod = parDes;
else;
desCod = *zeros;
endif;
desDes = *blanks;
// Principal
dow not EXIT and not CANCEL;
Operación de sele
Búsqueda por desc
No existen cambio
Seleccionado regi
Registro bloquead
Registro existent
Errores en datos ed
No rellenado todo e
Se ha procesado una
emCEmp
emCEmp
Página 3
Documento: EMPRESAP.RPGLE
// Tratamiento acciones
write emPrPSub; // Escritura del píe de mandatos
exfmt emPrCSub; // Esperar acciones
// Desactivamos indicadores de error
SFL_BOF_RE = *off; // No inicio de archivo para hacer pág. atrás
SFL_EOF_AV = *off; // No fin de archivo para hacer pág. adelante
OPC_ERR = *off; // Operación de seleción permitida
SFL_REG_LOCK = *off; // Registro no bloqueado (operación permitida)
SFL_REG_EOF = *off; // Si existe registro para la operación
select;
// Finalizar
when EXIT or CANCEL;
leave;
when AV_PAG; // Página adelante
exsr avPag;
when RE_PAG; // Página atrás
exsr rePag;
when REFRESH; // Renovar
exsr refresco;
// Fichero sin registros (fin de archivo en pág. adelante y atrás)
if SFL_BOF_RE and SFL_EOF_AV;
exsr dltSfl; // Borrar sfl
endif;
when ADD_REG; // Añadir
// Hasta que se pulse F12
dou CANCEL;
kFunc = 'I';
EXIT = *off; // No se ha pulsado F3
CANCEL = *off; // No se ha pulsado F12
SFL_REG_LOCK = *off; // Registro no bloqueado (operación permitida)
SFL_REG_EOF = *off; // Si existe registro
exsr udtForm;
SFL_REG_LOCK = *off; // Despreciamos el valor devuelto
SFL_REG_EOF = *off; // Despreciamos el valor devuelto
// F3
if EXIT;
*inlr = *on;
return;
endif;
if not CANCEL;
iniKey = emCEmp;
exsr rePag;
endif;
enddo;
exsr refresco; // Refescamos
// Fichero sin registros (fin de archivo en pág. adelante y atrás)
if SFL_BOF_RE and SFL_EOF_AV;
exsr dltSfl; // Borrar sfl
endif;
ADD_REG = *off;
CANCEL = *off;
other; // Procesamos de opciones tecleadas
readc(e) emPrSubf;
if %error or %eof(EMPRESAS);
NOT_READC = *on; // No hay cambios en el subfichero
CHG_PROCES = *off;
else;
NOT_READC = *off; // Hay cambios en el subfichero
CHG_PROCES = *on;
endif;
// Bucle de proceso de los cambios
dow not NOT_READC; // Si hay cambios en el subfichero
select;
when not SFL_AUDIT and kFunc = 'A'; // Usuario sin autorización
OPC_ERR = *on; // Operación de selección no permitida
when not SFL_SELEC and kFunc = 'X'; // Selección sin operación de seleccionar per
OPC_ERR = *on; // Operación de selección no permitida
other;
OPC_ERR = *off; // Operación de selección permitida
Página 4
Documento: EMPRESAP.RPGLE
endsl;
if SFL_SELEC and kFunc = 'X'; // Operación de selección y selecciona
parEmC = emCEmp;
parEmN = emNEmp;
*inlr = *on;
return;
endif;
// Si a tecleado alguna opción y hay cambios en el subfichero
if kFunc <> ' ' and not OPC_ERR;
// Indica
EXIT = *off;
CANCEL = *off;
SFL_REG_LOCK = *off; // Registro no bloqueado (operación permitida)
SFL_REG_EOF = *off; // Si existe registro para la operación
exsr udtForm;
CANCEL = *off; // Despreciamos el valor devuelto
// F3
if EXIT;
*inlr = *on;
return;
endif;
else;
kFunc = ' ';
endif;
// Si hay cambios en el subfichero
readc(e) emPrSubf;
if %eof(EMPRESAS);
NOT_READC = *on; // No hay cambios en el subfichero
else;
NOT_READC = *off; // Hay cambios en el subfichero
endif;
enddo;
if CHG_PROCES;
exsr refresco; // Refrescamos
// Fichero sin registros (fin de archivo en pág. adelante y atrás)
if SFL_BOF_RE and SFL_EOF_AV;
exsr dltSfl; // Borrar sfl
endif;
endif;
// Reposicionamiento
if desCod <> oldDesCod or desDes <> oldDesDes;
iniKey = desCod; // Vble. primer
finKey = iniKey; // Vble. final
if desDes <> *blanks; // Por descripción
FIND_DESC = *on; // Búsqueda por descripción
else;
FIND_DESC = *off; // No búsqueda por descripción
endif;
oldDesCod = desCod;
oldDesDes = desDes;
exsr avPag;
endif;
endsl;
// Principal
enddo;
// Fin ejecuc.
*inlr = *on;
return;
// ------------------------------------------------// S u b r u t i n a s
// ------------------------------------------------// Revisualiza (si no hay errores pendientes)
begsr refresco;
finKey = iniKey;
exsr avPag;
if SFL_EOF_AV; // Fin de archivo para hacer pág. adelante
exsr rePag;
endif;
endsr;
// Av. Pág.
Página 5
Documento: EMPRESAP.RPGLE
begsr avPag;
dMovPag = 'Av'; // Cargo adelante
exsr aMovPag;
endsr;
// Re. Pág.
begsr rePag;
dMovPag = 'Re'; // Cargo atrás
exsr aMovPag;
if NOT_TOT_SFL;
finKey = iniKey; // Ult. sfl = 1º sfl
exsr avPag;
endif;
endsr;
// Tratamiento paginación
begsr aMovPag;
// Por defecto consideramos que el subfichero se cubrirá por entero
NOT_TOT_SFL = *off;
// Msg de giro
if dMovPag = 'Av';
SFL_EOF_AV = *off; // No fin de archivo en pág. adelante
emCEmp = finKey; // Ult. sfl
else;
SFL_BOF_RE = *off; // No fin de archivo en pág. atrás
emCEmp = iniKey; // 1º sfl
endif;
regKey.emCEmp = emCEmp;
if dMovPag = 'Av';
// Si página adelante
if AV_PAG; // Adelante desde ult. anterior
setgt %kds(regKey) EMPRESAF;
else;
// Adelante desde ult. anterior inclusive
setll %kds(regKey) EMPRESAF;
endif;
else;
// Si página atrás
if RE_PAG; // Atrás desde 1º anterior inclusive
setll %kds(regKey) EMPRESAF;
else;
// Atrás desde 1º anterior
setgt %kds(regKey) EMPRESAF;
endif;
endif;
if dMovPag = 'Av';
read(en) EMPRESAF;
else;
readp(en) EMPRESAF;
endif;
if %eof(EMPRESAF);
SFL_END = *on; // Fin de fichero
else;
SFL_END = *off; // No fin de fichero
endif;
// Búsqueda por descripción
if FIND_DESC;
// Salta adelante/atrás
dow not SFL_END; // No fin de fichero
if %scan(%trimr(desDes) : emNEmp) = *zeros;
REG_SELECT = *off; // No seleccionado registro para subfichero
else;
REG_SELECT = *on; // Seleccionado registro para subfichero
endif;
if not REG_SELECT; // No seleccionado registro para subfichero
if dMovPag = 'Av';
read(en) EMPRESAF;
else;
readp(en) EMPRESAF;
endif;
if %eof(EMPRESAF);
SFL_END = *on; // Fin de fichero
else;
SFL_END = *off; // No fin de fichero
Página 6
Documento: EMPRESAP.RPGLE
endif;
else;
leave;
endif;
enddo;
else;
REG_SELECT = *on; // Seleccionado registro para subfichero
endif;
// Fin de fichero
if SFL_END;
// Msg de giro
// Fin de archivo para hacer pág. adelante/atrás
if dMovPag = 'Av';
SFL_EOF_AV = *on;
else;
SFL_BOF_RE = *on;
endif;
else;
// Borro pantalla
exsr dltSfl;
if dMovPag = 'Av';
iniKey = emCEmp; // 1º sfl
else;
finKey = emCEmp; // Ult. sfl
endif;
cntNrr = 1;
dow cntNrr <= totNrr;
// Búsqueda por descripción
if FIND_DESC;
if %scan(%trimr(desDes) : emNEmp) = *zeros;
REG_SELECT = *off; // No seleccionado registro para subfichero
else;
REG_SELECT = *on; // Seleccionado registro para subfichero
endif;
endif;
if REG_SELECT; // Seleccionado registro para subfichero
if dMovPag = 'Av';
nrr = cntNrr;
else;
nrr = (totNrr - cntNrr) + 1;
endif;
write emPrSubf;
SFL_DSP = *on;
if dMovPag = 'Av';
finKey = emCEmp; // Ult. sfl
else;
iniKey = emCEmp; // 1º sfl
endif;
cntNrr += 1;
endif;
if cntNrr <= totNrr;
if dMovPag = 'Av';
read(en) EMPRESAF;
else;
readp(en) EMPRESAF;
endif;
if %eof(EMPRESAF);
SFL_END = *on; // Fin de fichero
else;
SFL_END = *off; // No fin de fichero
endif;
if SFL_END; // Fin de fichero
leave;
endif;
endif;
enddo;
if dMovPag = 'Re';
if cntNrr <= totNrr; // No lleno
NOT_TOT_SFL = *on;
endif;
Página 7
Documento: EMPRESAP.RPGLE
endif;
endif;
endsr;
// Borro pant.
begsr dltSfl;
// Del sfl
SFL_DSP = *off; // No visualizar subfichero en pantalla (SflDsp)
SFL_CLR = *on; // Limpiar subfichero de pantalla (SflClr)
write emPrPSub;
write emPrCSub;
SFL_CLR = *off; // No limpiar subfichero de pantalla (SflClr)
endsr;
// Formulario del registro
begsr udtForm;
// Autorizado
if kAutor = 'S';
SFL_AUDIT = *on;
endif;
// Llamado
if kDVino <> *blanks;
SFL_SELEC = *on;
endif;
// Añadir
if kFunc = 'I';
// Limpiamos subfichero
opeTxt = sTxt(4);
// Inicializar campos
emEsta = *blanks;
emUsua = *blanks;
emFeHo = %timestamp('0001-01-01-00.00.00.000000' : *iso);
emCEmp = *zeros;
emTipo = *zeros;
emNIF = *blanks;
emNEmp = *blanks;
emDire = *blanks;
emMuni = *blanks;
emProv = *blanks;
emDPos = *zeros;
emTele = *blanks;
emFax = *blanks;
emMovi = *blanks;
emFAlt = %date('0001-01-01' : *iso);
emFBaj = %date('0001-01-01' : *iso);
emMece = *zeros;
exsr cvtDatToDMY;
// Hasta no error
EDIT_ERR = *off;
dou not EDIT_ERR;
exfmt emPrForm; // Formulario
EDIT_ERR = *off;
// Errores
KEY_DUP = *off;
KEY_EMPTY = *off;
DESC_EMPTY = *off;
FEC_RANG_ERR = *off;
FEC_ALTA_ERR = *off;
FEC_BAJA_ERR = *off;
MES_ERR = *off;
if not EXIT and not CANCEL;
// Busqueda del registro
regKey.emCEmp=emCEmp;
chain(en) %kds(regKey) EMPRESAF;
if %error;
REG_LOCKED = *on;
else;
REG_LOCKED = *off;
endif;
if %found(EMPRESAF);
REG_NOTFND = *off;
Página 8
Documento: EMPRESAP.RPGLE
else;
REG_NOTFND = *on;
endif;
// Ya existe o bloqueado
if not REG_NOTFND or REG_LOCKED;
KEY_DUP = *on;
EDIT_ERR = *on;
else ;
exsr cheq;
endif;
else;
leave;
endif;
enddo;
if not EXIT and not CANCEL;
exsr cvtDMYtoDat;
exsr audito; // Auditoria
write empreR; // Alta
endif;
else;
// Posicionarse
regKey.emCEmp=emCEmp;
if kFunc = 'M' or kFunc = 'B';
chain(e) %kds(regKey) EMPRESAF;
else;
chain(en) %kds(regKey) EMPRESAF;
endif;
if %error;
SFL_REG_LOCK = *on;
else;
SFL_REG_LOCK = *off;
endif;
if %found(EMPRESAF);
SFL_REG_EOF = *off;
else;
SFL_REG_EOF = *on;
endif;
if not SFL_REG_EOF and not SFL_REG_LOCK;
select;
when kFunc = 'A'; // Auditoría
opeTxt = sTxt(1);
wAFeHo = %dec(%date(emFeHo) : *eur) * 1000000 +
%dec(%time(emFeHo) : *hms) ;
exfmt emPrAudi; // Visualiza
when kFunc = 'B'; // Borrado
opeTxt = sTxt(2);
exsr cvtDatToDMY;
PROTECT_FLD = *on;
PROTECT_KEY = *on;
exfmt emPrForm; // Formulario
PROTECT_FLD = *off;
PROTECT_KEY = *off;
if not CANCEL and not EXIT;
delete EMPRESAF; // Borra
else;
unlock EMPRESAF;
endif;
when kFunc = 'V'; // Consulta
opeTxt = sTxt(5);
exsr cvtDatToDMY;
PROTECT_FLD = *on;
PROTECT_KEY = *on;
exfmt emPrForm; // Formulario
PROTECT_FLD = *off;
PROTECT_KEY = *off;
when kFunc = 'M'; // Modificación
opeTxt = sTxt(3);
exsr cvtDatToDMY;
EDIT_ERR = *off;
dou not EDIT_ERR;
Página 9
Documento: EMPRESAP.RPGLE
PROTECT_KEY = *on;
exfmt emPrForm; // Formulario
PROTECT_KEY = *off;
EDIT_ERR = *off;
// Errores
KEY_DUP = *off;
KEY_EMPTY = *off;
DESC_EMPTY = *off;
FEC_RANG_ERR = *off;
FEC_ALTA_ERR = *off;
FEC_BAJA_ERR = *off;
MES_ERR = *off;
if not EXIT and not CANCEL;
exsr cheq;
else;
leave;
endif;
enddo;
if not EXIT and not CANCEL;
exsr cvtDMYtoDat;
exsr audito; // Auditoría
update empreR; // Modifica
else;
unlock EMPRESAF;
endif;
endsl;
endif;
endif;
kFunc = ' ';
endsr;
// Datos de auditoría
begsr audito;
emFeHo = %timestamp();
emUsua = kUsuar;
emEsta = kEstac;
endsr;
// Chequeo de datos
begsr cheq;
// Bucle
dou 0 = 0;
if emCEmp = *zeros;
KEY_EMPTY = *on;
leave;
endif;
if emNEmp = *blanks;
DESC_EMPTY = *on;
leave;
endif;
if emMeCE < 1 or emMeCE > 12;
MES_ERR = *on;
leave;
endif;
if wFEdtA <> *zeros;
test(ed) *dmy wFEdtA;
if %error;
FEC_ALTA_ERR = *on;
leave;
endif;
endif;
if wFEdtB <> *zeros;
test(ed) *dmy wFEdtB;
if %error;
FEC_BAJA_ERR = *on;
leave;
endif;
endif;
if wFEdtA <> *zeros and wFEdtB <> *zeros;
fechA = %date(wFEdtA : *dmy);
fechB = %date(wFEdtB : *dmy);
if fechA > fechB;
Página 10
Documento: EMPRESAP.RPGLE
FEC_RANG_ERR = *on;
leave;
endif;
endif;
enddo;
if KEY_EMPTY
or
DESC_EMPTY
or
FEC_RANG_ERR or
FEC_ALTA_ERR or
FEC_BAJA_ERR or
MES_ERR;
EDIT_ERR = *on;
endif;
endsr;
// Convertir de date a DMY
begsr cvtDatToDMY;
if emFAlt = %date('0001-01-01' : *iso);
wFEdtA = *zeros;
else;
wFEdtA = %dec(emFAlt : *dmy);
endif;
if emFBaj = %date('0001-01-01' : *iso);
wFEdtB = *zeros;
else;
wFEdtB = %dec(emFBaj : *dmy);
endif;
endsr;
// Convertir de DMY a date
begsr cvtDMYtoDat;
test(ed) *dmy wFEdtA;
if %error;
emFAlt = %date('0001-01-01' : *iso);
else;
emFAlt = %date(wFEdtA : *dmy);
endif;
test(ed) *dmy wFEdtB;
if %error;
emFBaj = %date('0001-01-01' : *iso);
else;
emFBaj = %date(wFEdtB : *dmy);
endif;
endsr;
/end-free
**
Auditoría
Borrar
Modificar
Añadir
Visualizar
Página 1
A*
A*
A*
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
Documento: EMPRESAS.DSPF
------------------------------------------------------------------------------------------EMPRESAS.DSPF | Pantallas mantenimiento empresas-Subfichero edición-Formulario de empresas
------------------------------------------------------------------------------------------DSPSIZ(24 80 *DS3)
PRINT
INDARA
R EMPRPSUB
OVERLAY
PROTECT
WINDOW(1 2 22 75)
WDWBORDER((*COLOR WHT) (*DSPATR ND))
21 1'F3=Salir'
COLOR(BLU)
21 12'F5=Renovar'
COLOR(BLU)
21 25'F6=Añadir'
COLOR(BLU)
21 37'F12=Cancelar'
COLOR(BLU)
R EMPRSUBF
SFL
KFUNC
1A B 10 2VALUES('B' 'M' 'A' 'X' 'V' ' ')
DSPATR(UL)
EMCEMP
2Y 0O 10 6EDTCDE(4)
EMNEMP
40A O 10 10
EMMECE
R
O 10 51REFFLD(EMPRER/EMMECE *LIBL/EMPRESAF)
EDTCDE(4)
EMTIPO
1Y 0O 10 56EDTCDE(4)
EMTELE
R
O 10 60REFFLD(EMPRER/EMTELE *LIBL/EMPRESAF)
R EMPRCSUB
SFLCTL(EMPRSUBF)
SFLSIZ(0010)
SFLPAG(0010)
WINDOW(EMPRPSUB)
CF05(05 'Refrescar')
ROLLDOWN(25 'Pagina Atras')
ROLLUP(26 'Pagina Adelante')
CF06(06 'Añadir')
CA03(03 'Salir')
CA12(12 'Cancelar')
OVERLAY
PROTECT
SFLDSPCTL
28
SFLDSP
27
SFLCLR
29
SFLEND
42
SFLMSGID(PGM0020 *LIBL/EMPRESAM)
43
SFLMSGID(PGM0030 *LIBL/EMPRESAM)
40
SFLMSGID(PGM0050 *LIBL/EMPRESAM)
41
SFLMSGID(PGM0060 *LIBL/EMPRESAM)
KPANTA
20A O 1 1COLOR(WHT)
DSPATR(HI)
KNOMAP
12A O 1 30COLOR(GRN)
1 68DATE
EDTCDE(Y)
COLOR(GRN)
SUBRAY
75A O 2 1DSPATR(UL)
COLOR(GRN)
KBIBLI
10A O 3 1
KNOEMP
30A O 3 21COLOR(GRN)
KDVINO
20A O 3 56COLOR(WHT)
DSPATR(HI)
4 13'Código'
DSPATR(HI)
4 20'Empresa'
DSPATR(HI)
5 1'Situar en:'
DESCOD
2Y 0B 5 15EDTCDE(4)
DESDES
40A B 5 20
35
7 1'A=Auditoría'
COLOR(BLU)
7 15'B=Borrar'
Página 2
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
Documento: EMPRESAS.DSPF
COLOR(BLU)
7 26'M=Modificar'
COLOR(BLU)
7 40'V=Visualizar'
COLOR(BLU)
7 55'X=Seleccionar'
COLOR(BLU)
9 1'Opc'
DSPATR(HI)
9 5'Cód.'
DSPATR(HI)
9 10'Empresa'
DSPATR(HI)
9 51'Mes'
DSPATR(HI)
9 55'Tipo'
DSPATR(HI)
9 60'Teléfono'
DSPATR(HI)
36
R EMPRFORM
OPETXT
67A
Y
O
1
B
2
2
2
3
EMCEMP
R
EMNEMP
R
B
3
EMNIF
R
B
3
61
51
50
52
60
60
EMMECE
R
Y
B
4
4
4
5
EMTIPO
R
Y
B
5
EMDIRE
R
B
5
60
53
60
60
EMMUNI
R
B
6
6
6
7
EMPROV
R
B
7
EMDPOS
R
B
7
60
60
Y
60
8
8
8
8
WINDOW(10 4 11 71)
CA03(03 'Salir')
CA12(12 'Cancelar')
CLRL(*NO)
OVERLAY
PROTECT
WDWBORDER((*COLOR WHT) (*DSPATR HI))
1DSPATR(HI)
DSPATR(UL)
1'Código'
13'Empresa'
54'NIF'
1REFFLD(EMPRER/EMCEMP *LIBL/EMPRESAF)
CHECK(RZ)
DSPATR(PR)
ERRMSGID(PGM0100 *LIBL/EMPRESAM)
ERRMSGID(PGM0090 *LIBL/EMPRESAM)
EDTCDE(4)
13REFFLD(EMPRER/EMNEMP *LIBL/EMPRESAF)
ERRMSGID(PGM0100 *LIBL/EMPRESAM)
DSPATR(PR)
54REFFLD(EMPRER/EMNIF *LIBL/EMPRESAF)
DSPATR(PR)
1'Mes inicio'
13'Tipo'
25'Dirección'
1REFFLD(EMPRER/EMMECE *LIBL/EMPRESAF)
EDTCDE(4)
DSPATR(PR)
ERRMSGID(PGM1020 *LIBL/EMPRESAM)
13REFFLD(EMPRER/EMTIPO *LIBL/EMPRESAF)
EDTCDE(4)
DSPATR(PR)
25REFFLD(EMPRER/EMDIRE *LIBL/EMPRESAF)
DSPATR(PR)
1'Municipio'
25'Provincia'
54'D. postal'
1REFFLD(EMPRER/EMMUNI *LIBL/EMPRESAF)
DSPATR(PR)
25REFFLD(EMPRER/EMPROV *LIBL/EMPRESAF)
DSPATR(PR)
54REFFLD(EMPRER/EMDPOS *LIBL/EMPRESAF)
CHECK(RZ)
DSPATR(PR)
EDTCDE(4)
1'Teléfono'
13'Móvil'
25'Fax'
39'Fecha de alta'
Página 3
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
Documento: EMPRESAS.DSPF
EMTELE
R
B
EMMOVI
R
B
EMFAX
R
B
60
60
60
WFEDTA
6Y 0B
WFEDTB
6Y 0B
60
54
56
55
56
60
8 54'Fecha de baja'
9 1REFFLD(EMPRER/EMTELE *LIBL/EMPRESAF)
DSPATR(PR)
9 13REFFLD(EMPRER/EMMOVI *LIBL/EMPRESAF)
DSPATR(PR)
9 25REFFLD(EMPRER/EMFAX *LIBL/EMPRESAF)
DSPATR(PR)
9 39
DSPATR(PR)
EDTMSK(' & & ')
EDTWRD(' / / ')
ERRMSGID(PGM1010 *LIBL/EMPRESAM)
ERRMSGID(PGM1030 *LIBL/EMPRESAM)
9 54
ERRMSGID(PGM1010 *LIBL/EMPRESAM)
ERRMSGID(PGM1030 *LIBL/EMPRESAM)
DSPATR(PR)
EDTMSK(' & & ')
EDTWRD(' / / ')
10 1'F3=Salir'
COLOR(BLU)
10 12'F12=Cancelar'
COLOR(BLU)
R EMPRAUDI
OPETXT
EMCEMP
EMESTA
EMUSUA
WAFEHO
67A
R
R
O
2S 0O
O
O
14Y 0O
1
2
2
2
2
3
3
3
3
4
4
CA03(03 'Salir')
CA12(12 'Cancelar')
OVERLAY
PROTECT
WINDOW(16 4 5 71)
WDWBORDER((*COLOR WHT) (*DSPATR HI))
1DSPATR(UL)
DSPATR(HI)
1'Código'
19'Estación'
34'Usuario'
52'Fecha y Hora'
3
19REFFLD(EMPRER/EMESTA *LIBL/EMPRESAF)
34REFFLD(EMPRER/EMUSUA *LIBL/EMPRESAF)
49EDTWRD(' / /
& : : ')
1'F3=Salir'
COLOR(BLU)
12'F12=Cancelar'
COLOR(BLU)
Página 1
Documento: EMPRESAF.PF
* ------------------------------------------------------------------------------------------* EMPRESAF.PF | Maestro de empresas-Subfichero edición
* ------------------------------------------------------------------------------------------A
UNIQUE
A
R EMPRER
TEXT('Registro')
A
EMESTA
10A
TEXT('Estación trabajo')
A
COLHDG('Est.trab.')
A
EMUSUA
10A
TEXT('Usuario')
A
COLHDG('Usuario')
A
EMFEHO
Z
TEXT('Fecha-hora rgto.')
A
COLHDG('Fecha-hora rgto.')
A
EMCEMP
2 00
TEXT('Código')
A
COLHDG('Código')
A
COMP(GT 0)
A
EMTIPO
1 00
TEXT('Tipo')
A
COLHDG('Tipo')
A
COMP(GE 0)
A
EMNIF
11A
TEXT('NIF')
A
COLHDG('NIF')
A
EMNEMP
40A
TEXT('Nombre')
A
COLHDG('Nombre')
A
EMDIRE
40A
TEXT('Dirección')
A
COLHDG('Dirección')
A
EMMUNI
20A
TEXT('Municipio')
A
COLHDG('Municipio')
A
EMPROV
23A
TEXT('Provincia')
A
COLHDG('Provincia')
A
EMDPOS
5 00
TEXT('Distrito postal')
A
COLHDG('D.post.')
A
COMP(GE 0)
A
EMTELE
10A
TEXT('Teléfono')
A
COLHDG('Teléfono')
A
EMFAX
10A
TEXT('Fax')
A
COLHDG('Fax')
A
EMMOVI
10A
TEXT('Móvil')
A
COLHDG('Móvil')
A
EMFALT
L
TEXT('Fecha alta')
A
COLHDG('Alta')
A
EMFBAJ
L
TEXT('Fecha baja')
A
COLHDG('Baja')
A
EMMECE
2 00
TEXT('Mes comienzo eje.')
A
COLHDG('Mes c.')
A
RANGE(0 12)
A
K EMCEMP
/*
* EMPRESAD.SQL | Datos de test para EMPRESAF-Subfichero edición
*/
INSERT INTO EMPRESAF VALUES
('ESTACIÓN1', 'USUARIO1', '2011-01-01-01.01.01.001000', 1, 1,
'A01010101', 'EMPRESA 01', 'DIRECCIÓN 01', 'MUNICIPIO 01',
'PROVINCIA 01', 10101, '010101010', '111111111', '101010101',
'2011-01-01', '0001-01-01', 1),
('ESTACIÓN2', 'USUARIO2', '2012-02-02-02.02.02.002000', 2, 2,
'A02020202', 'EMPRESA 02', 'DIRECCIÓN 02', 'MUNICIPIO 02',
'PROVINCIA 02', 20202, '020202020', '222222222', '202020202',
'2012-02-02', '0001-01-01', 2),
('ESTACIÓN3', 'USUARIO3', '2013-03-03-03.03.03.003000', 3, 3,
'A03030303', 'EMPRESA 03', 'DIRECCIÓN 03', 'MUNICIPIO 03',
'PROVINCIA 03', 30303, '030303030', '333333333', '303030303',
'2013-03-03', '0001-01-01', 3),
('ESTACIÓN4', 'USUARIO4', '2014-04-04-04.04.04.004000', 4, 4,
'A04040404', 'EMPRESA 04', 'DIRECCIÓN 04', 'MUNICIPIO 04',
'PROVINCIA 04', 40404, '040404040', '444444444', '404040404',
'2014-04-04', '0001-01-01', 4)
Página 1
Documento: EMPRESAC.CLP
/* -------------------------------------------------------------------- */
/* EMPRESAC.CLP | Creación de la aplicación: Mantenimiento de empresas */
/* Se considera que todos los fuentes se encuentran en el mismo archivo */
/* -------------------------------------------------------------------- */
DCL
VAR(&SRCF) TYPE(*CHAR) LEN(10)
/* Se recupera el nombre del archivo de fuentes */
RTVOBJD
OBJ(EMPRESAC) OBJTYPE(*PGM) SRCF(&SRCF)
/* Crea fichero EMPRESAF.PF */
CRTPF
FILE(EMPRESAF) SRCFILE(&SRCF) SRCMBR(EMPRESAF)
/* Añade registros de prueba a EMPRESAF.PF */
RUNSQLSTM SRCFILE(&SRCF) SRCMBR(EMPRESAD) COMMIT(*NONE)
/* Crea pantalla EMPRESAS.DSPF */
CRTDSPF
FILE(EMPRESAS) SRCFILE(&SRCF) SRCMBR(EMPRESAS)
/* Crea programa EMPRESAP.RPGLE */
CRTBNDRPG PGM(EMPRESAP) SRCFILE(&SRCF) SRCMBR(EMPRESAP)
/* Crea archivo de mensajes EMPRESAM.MSGF */
CRTMSGF
MSGF(EMPRESAM) TEXT('Mensajes del mantenimiento de empresas')
/* Añade mensajes a EMPRESAM.MSGF */
ADDMSGD
MSGID(PGM0010) MSGF(EMPRESAM) MSG('Fin de lista')
ADDMSGD
MSGID(PGM0020) MSGF(EMPRESAM) MSG('Inicio de lista')
ADDMSGD
MSGID(PGM0030) MSGF(EMPRESAM) MSG('Fin de lista')
ADDMSGD
MSGID(PGM0050) MSGF(EMPRESAM) MSG('Registro bloqueado')
ADDMSGD
MSGID(PGM0060) MSGF(EMPRESAM) MSG('Registro inexistente')
ADDMSGD
MSGID(PGM0090) MSGF(EMPRESAM) MSG('Registro existente/bloqueado')
ADDMSGD
MSGID(PGM0100) MSGF(EMPRESAM) MSG('Campo vacío')
ADDMSGD
MSGID(PGM1010) MSGF(EMPRESAM) MSG('Fecha incorrecta')
ADDMSGD
MSGID(PGM1020) MSGF(EMPRESAM) MSG('Mes incorrecto')
ADDMSGD
MSGID(PGM1030) MSGF(EMPRESAM) MSG('Rango de fechas erróneo')
Descargar
Colecciones de estudio