Está en la página 1de 57

Pgina 1

Documento: PROG1.RPGLE

// ==========================================================================================
// PROG1.RPGLE | SUBFICHERO COMPLETO
// Es una tcnica adecuada si se procesa un nmero relativamente pequeo de registros.
// La paginacin 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 definicin del SFLCTL de la DDS, se especifica el tamao del subfichero (SFLSIZ)
//
mayor que el tamao de la pgina de visualizacin (SFLPAG). As el subfichero se
//
extiende automticamente cuando se graban ms registros de los indicados en el tamao
//
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 algn 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 bsqueda. 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 bsqueda. El SFL no se visualiza porque no hay registros y por
//
tanto, el indicador 62 est en OFF.
// Despus 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 nmero relativo de registro se define con la palabra clave
//
SFILE, en las especificaciones de descripcin de archivos, para el archivo WORKSTN.
// El nmero 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 Rodrguez Surez | 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 bsqueda
//
// Especificaciones de clculo 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

Pgina 2

Documento: PROG1.RPGLE

//
LIMPIAR = *on;
write SFL1CTL;
LIMPIAR = *off;
//
// Posicionarse en el fichero con el argumento de bsqueda
//
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

Pgina 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'Telfono
'
A
DSPATR(RI)
A
7 51'Email
'
A
DSPATR(RI)

Pgina 1

Documento: PROG2.RPGLE

// ==========================================================================================
// PROG2.RPGLE | SUBFICHERO PGINA A PGINA
// Es una tcnica adecuada si se procesa un nmero grande de registros.
// Un programa de subfichero tratado pgina a pgina prepara la primera pgina del
//
subfichero y la visualiza al usuario.
// Si se pulsa la tecla de Avance Pgina, el control vuelve al programa y este adiciona una
//
segunda pgina al subfichero y lo visualiza de nuevo.
// Si se pulsa Retroceder Pgina, el propio sistema operativo se encargar de retroceder a
//
la primera pgina.
// Si en estas circunstancias se pulsa de nuevo Avance Pgina, el sistema operativo paginar
//
el subfichero a la segunda pgina.
// Si se insiste en Avanzar, la tercera pgina debe aadirse por programa y luego
//
visualizarse.
// -----------------------------------------------------------------------------------------// Procedimiento:
// Para este funcionamiento hay que aadir 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 pgina aadida se visualice. Si en esta situacin se pulsa de nuevo
//
Acance de Pgina el control vuelve al programa como si se hubiera pulsado una tecla de
//
funcin.
// El indicador 60 asociado a la palabra clave ROLLUP se activa (ON) y el programa puede
//
probar esta situacin.
// La lgica salta la rutina de borrado del SFL cuando la tecla Avan Pg ha sido pulsada.
// La rutina de lectura/carga del subfichero lee los prximos 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 ms registros de los existentes.
// Se ha aadido un campo oculto (SFLRCD) con la palabra clave SFLRCDNBR.
// El campo se usa para posicionar el subfichero en la pgina adecuada durante la operacin
//
de visualizacin.
// El ltimo NRR usado se sita en el campo SFLRCD asociado al SFLRCDNBR.
// Cuando se visualiza el subfichero la palabra clave SFLRCDNBR har que se visualice la
//
pgina que contiene el numero relativo de registro cuyo valor numrico se halla en le
//
campo SFLRCD.
// ==========================================================================================
//
// Cabecera
//
h copyright('Marcelino Rodrguez Surez | 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 pgina
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 bsqueda
d i
s
4s 0 inz(*zeros)
Contador bucle for
//
// Especificaciones de clculo en formato libre
//
/free
//
// Presentar pantalla
//
exfmt SFL1CTL;

Pgina 2

Documento: PROG2.RPGLE

//
// Ejecutar hasta que se pulse F3
//
dow not SALIR;
//
// Si no pulsa Av Pg (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 bsqueda
//
setll arg FICHERO ;
endif;
//
// Leer hasta un mximo de 10 registros de cada vez.
// El tamao de la pgina 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 pgina del subfichero donde se encuentre
// el ltimo nmero 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

Pgina 1

Documento: PANTALLA2.DSPF

A* ------------------------------------------------------------------------------------------A* PANTALLA2.DSPF | Subfichero pgina a pgina


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 'AvPg')
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'Telfono
'
A
DSPATR(RI)
A
7 51'Email
'
A
DSPATR(RI)

Pgina 1

Documento: PROG3.RPGLE

// ==========================================================================================
// PROG3.RPGLE | SUBFICHERO DE UNA PGINA
// Es una tcnica adecuada si se procesa un nmero grande de registros.
// Requieren una mnima cantidad de recursos de memoria.
// Se presenta siempre una nueva pgina de registros y el subfichero equivale a esta pgina
//
siendo el programa el encargado de controlar la paginacin.
// -----------------------------------------------------------------------------------------// Procedimiento:
// En este caso se define SFLSIZ = SFLPAG
// ==========================================================================================
//
// Cabecera
//
h copyright('Marcelino Rodrguez Surez | 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 pgina
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 bsqueda
d i
s
4s 0 inz(*zeros)
Contador bucle for
//
// Especificaciones de clculo en formato libre
//
/free
//
// Presentar pantalla
//
exfmt SFL1CTL;
//
// Ejecutar hasta que se pulse F3
//
dow not SALIR;
//
// Si no pulsa Av Pg (RollUp)
//
if not AV_PAGINA;
//
// Posicionarse en el fichero con el argumento de bsqueda
//
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 mximo de 10 registros de cada vez.
// El tamao de la pgina del subfichero es 10 (SFLPAG)
//
for i = 1 to 10;
//

Pgina 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

Pgina 1

Documento: PANTALLA3.DSPF

A* ------------------------------------------------------------------------------------------A* PANTALLA3.DSPF | Subfichero de una pgina


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 'AvPg')
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'Telfono
'
A
DSPATR(RI)
A
7 51'Email
'
A
DSPATR(RI)

Pgina 1

Documento: PROG4.RPGLE

// ==========================================================================================
// PROG4.RPGLE | EJEMPLO EMPLEO READC (Subfichero pgina a pgina)
// El subfichero se usar para visualizar una lista de registros con el objetivo de que el
//
usuario pueda hacer una seleccin entre ellos.
// El mtodo empleado para cargar y representar el subfichero en pantalla es el denominado
//
pgina a pgina.
// -----------------------------------------------------------------------------------------// Procedimiento:
// Se situa un campo de entrada de una sola posicin, a la izquierda de cada registro del
//
subfichero, para que el usuario pudiera entrar un cdigo de accin.
// El usuario puede poner un "6" en varios de los registros visualizados.
// El cdigo de operacin usado para leer registros modificados del subfichero es READC.
// Un registro se considera modificado si algn dato (incluido blancos) se teclea en un
//
campo del subfichero que sea susceptible de entrada.
// Si se recupera algn registro, el campo de entrada SEL se compara con "6" y si coincide,
//
se ejecutar la subrutina correspondiente.
// ==========================================================================================
//
// Cabecera
//
h copyright('Marcelino Rodrguez Surez | 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 pgina
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 bsqueda
d argSav
s
30a
inz(*loval)
Argumento anterior
d i
S
4s 0 inz(*zeros)
Contador bucle for
//
// Especificaciones de clculo en formato libre
//
//
/free
//
// Presentar pantalla
//
exfmt SFL1CTL;
//
// Ejecutar hasta que se pulse F3
//
dow not SALIR;
//
// Si no pulsa Av Pg (RollUp)
//
if not AV_PAGINA;
//
// Si hay registros en el subfichero se leen posibles cambios
//
if nTotRr <> *zeros;
//
// Leer cambios
//
readc SFL1;

Pgina 2

Documento: PROG4.RPGLE

dow not %eof();


//
// Impresin de la ficha
//
if sel = '6';
exsr imprimeFicha;
endif;
//
// Leer cambios
//
readc SFL1;
enddo;
endif;
//
// Si hay un nuevo argumento de bsqueda 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 bsqueda
//
setll arg FICHERO;
//
exsr fillSfl; // Leer hasta un mximo de 10 registros de cada vez
argSav = arg; // Se guarda el argumento de bsqueda actual
endif;
else;
exsr fillSfl; // Leer hasta un mximo de 10 registros de cada vez
endif;
//
// Se visualizar la pgina del subfichero donde se encuentre
// el ltimo nmero 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 mximo de 10 registros de cada vez.
// El tamao de la pgina 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;

Pgina 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;
//----------------------------------------------------------------// Impresin 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 seleccin
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

Pgina 1

Documento: PANTALLA4.DSPF

A* ------------------------------------------------------------------------------------------A* PANTALLA4.DSPF | Ejemplo empleo READC (Subfichero pgina a pgina)


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 'AvPg')
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'Telfono
'
A
DSPATR(RI)
A
7 51'Email
'
A
DSPATR(RI)

Pgina 1

Documento: PROG5A.RPGLE

// ==========================================================================================
// PROG5A.RPGLE | EJEMPLO DE SELECCIN (Programa principal que llama al subprograma)
// El programa principal requiere un telfono que se obtiene a travs de un subprograma con
//
un subfichero de seleccin.
// -----------------------------------------------------------------------------------------// 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
//
seleccin.
// El subprograma es llamado con el nombre de la persona como primer parmetro.
// El subprograma, mediante SETLL y READE, monta un subfichero con los telfonos de la
//
persona indicada y los muestra en pantalla para que el usuario seleccione el adecuado.
// Despus de recuperado el registro seleccionado mediante READC, el telfono es devuelto a
//
programa principal en un segundo parmetro.
// ==========================================================================================
//
// Cabecera
//
h copyright('Marcelino Rodrguez Surez | 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 clculo en formato libre
//
/free
//
// Presentar peticin de nombre
//
dsply 'Nombre a seleccionar: ' ' ' pNombre;
//
// Llamada al programa de seleccin
//
program(pNombre : pTelefono);
//
// Presentacin del telfono de respuesta
//
if pTelefono <> *blanks;
dsply ('Telfono devuelto: ' + pTelefono) ' ' respuesta;
endif;
//
// Terminar el programa
//
*inlr = *on;
/end-free

Pgina 1

Documento: PROG5.RPGLE

// ==========================================================================================
// PROG5.RPGLE | EJEMPLO DE SELECCIN - Subprograma (Subfichero completo)
// Se emplea la tcnica del subfichero completo.
// -----------------------------------------------------------------------------------------// Procedimiento:
// El subprograma es llamado con el nombre de la persona como primer parmetro.
// El subprograma, mediante SETLL y READE, monta un subfichero con los telfonos de la
//
persona indicada y los muestra en pantalla para que el usuario seleccione el adecuado.
// Despus de recuperado el registro seleccionado mediante READC, el telfono es devuelto a
//
programa principal en un segundo parmetro.
// ==========================================================================================
//
// Cabecera
//
h copyright('Marcelino Rodrguez Surez | 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 bsqueda
//
// Especificaciones de clculo en formato libre
//
/free
//
// Si se llama al programa con al menos un parmetro este se almacena en arg
//
if %parms >= 1;
arg = pNombre;
endif;
//
// Posicionarse en el fichero con el argumento de bsqueda
//
clave.nombre = arg;
setll clave.nombre FICHERO;
//
// Leer y cargar los registros
//
if %parms >= 1;
reade clave.nombre FICHERO;

Pgina 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 pgina 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 pgina del ltimo nmero relativo de registro cambiado.
//
// Impresin de la ficha
//
if sel = '6';
exsr imprimeFicha;
//
// Seleccin del registro
//
elseif sel = '9';
if %parms >= 2; // Si hay un 2 parmetro se le pasar el telfono
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;

Pgina 3

Documento: PROG5.RPGLE

//----------------------------------------------------------------// Impresin 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 seleccin
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

Pgina 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 seleccin (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'Telfono
'
DSPATR(RI)
7 51'Email
'
DSPATR(RI)

Pgina 1

Documento: PROG6.RPGLE

// ==========================================================================================
// PROG6.RPGLE | EJEMPLO DE SELECCIN DE CDIGO (Subfichero completo)
// El programa imprime, previa confirmacin, las personas cuyo email no contiene una arroba
//
a excepcin de aquellas que explcitamente seale el usuario.
// El mtodo empleado para cargar y representar el subfichero en pantalla es el denominado
//
completo.
// -----------------------------------------------------------------------------------------// Procedimiento:
// El programa pone un "6" en el campo de seleccin 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 cdigo "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 prxima lectura del subfichero, har que este registro se
//
comporte como si hubiera sido modificado por el usuario.
// Una operacin READC recuperar el registro y la ficha ser impresa automticamente.
// Un READC recupera tambin los registros "blanqueados", pero como el campo SEL est en
//
blanco, no actuar la rutina de impresin.
// La aplicacin cuando el campo email no contiene una arroba, debe parpadear.
// La funcin de parpadeo se activa usando en las DDS la palabra clave DSPATR(BL)
// Los atributos de campo tambin 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, activndose en este caso los indicadores 40 y 41, y
//
moviendo un "6" al campo SEL.
// ==========================================================================================
//
// Cabecera
//
h copyright('Marcelino Rodrguez Surez | 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 clculo 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

Pgina 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 pgina 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 pgina del subfichero donde se encuentre el ltimo
// nmero de registro tratado
sflrcd = nrr;
// Impresin 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;
//----------------------------------------------------------------// Impresin 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

Pgina 3
o
o
o
o
o

Documento: PROG6.RPGLE
udate
nombre
telefono
email

10 'Ficha'
20
55
75
110

Pgina 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 seleccin cdigo (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'Telfono
'
DSPATR(RI)
7 51'Email
'
DSPATR(RI)

Pgina 1

Documento: PROG7.RPGLE

// ==========================================================================================
// PROG7.RPGLE | VERIFICACIN 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 prdida de
//
datos es mnimo.
// El mtodo 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 telfono 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 telfono y email para las personas.
//
(se entiende que no puede validarse desde la DDS con VALUE, RANGE, etc.).
// Si no es vlido, 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 errneos,
//
pulsar simplemente INTRO de nuevo y, como los registros no han sido modificados, el
//
bucle READC no los procesar, por tanto, la tcnica expuesta anteriormente es
//
inadecuada.
// Lo que se debe hacer es activar, adems del indicador de error, un indicador individual
//
que condicione un DSPATR(BL) para cada campo errneo 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 prxima lectura, una vez dado el INTRO, se leer de nuevo este registro
//
como si se hubiera modificado por el usuario.
// ==========================================================================================
//
// Cabecera
//
h copyright('Marcelino Rodrguez Surez | 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 telfono
d ERROR_EMAIL
92
92n
Error en email
//
d nrr
s
4s 0
N rel. reg. subfic
//
// Especificaciones de clculo 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
//

Pgina 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 verificacin
if nrr > *zeros;
exsr verif;
// Si no hay errores se sale del bucle de presentacin de la pantalla
if not MENSAJE_ERR;
leave;
endif;
endif;
//
// Presentar la pantalla
//
exfmt SFL1CTL;
enddo;
//
// Terminar el programa
//
*inlr = *on;
// -------------------------------------------------------------------// Rutina de verificacin 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;
// Activacin del indicador de parpadeo del telfono
if %xlate('1234567890+-*/=.()#@:,;':
'
':
telefono) <> *blanks;
ERROR_TELEF = *on;
endif;
// Activacin del indicador de parpadeo del email
if %scan ('@' : email) = *zeros and email <> *blanks;
ERROR_EMAIL = *on;
endif;
// Si hay error en el telfono 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

Pgina 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 | Verificacin 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 telfonocon letras' 55)
7 4'Nombre
'
DSPATR(RI)
7 35'Telfono
'
DSPATR(RI)
7 51'Email
'
DSPATR(RI)

Pgina 1

Documento: FICHERO.PF

* ------------------------------------------------------------------------------------------* FICHERO.PF | Archivo fsico: Fichero


* ------------------------------------------------------------------------------------------A
UNIQUE
A
R REGISTRO
A
NOMBRE
30A
COLHDG('Nombre')
A
TELEFONO
15A
COLHDG('Telfono')
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', 'adela@marce.com
'),
('Alicia Veraguas Amador ', '840030103', 'alicia@marce.com '),
('Amaya Arenas Tamayo
', '773430585', 'amaya@marce.com
'),
('Carmen Solar Arroyo
', '824419483', 'carmen@marce.com '),
('Cristina Barreiro Serra ', '634281441', 'cristina@marce.com'),
('Diego Sanz Casado
', '722998487', 'diego@marce.com
'),
('Ftima Dvila Snchez
', '788203588', 'fatima@marce.com '),
('Juan Santaf Castao
', '630454420', 'juan#marce.com
'),
('Manuel lvarez Viana
', '707937809', 'manuel@marce.com '),
('Manuela Moreno Melero
', '758431258', 'manuela@marce.com '),
('Mara Fernndez Prez
', '651142918', 'maria@marce.com
'),
('Marta Rodrguez Esteban ', '603652729', 'marta@marce.com
'),
('Susana Alsogaray Gmez ', '639802252', 'susana@marce.com '),
('Victoria Herrera Soriano', '676290169', 'victoria@marce.com')

Pgina 1

Documento: PROGW.RPGLE

//
// PROGW.RPGLE | Programa (Subfichero Windows)
//
fPANTALLAW cf
e
workstn infds(infds)
f
sfile(SFL1:rrn1)
fARCHIVO
if
e
k disk
//
// Informacin 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 pgina.
//
when *in33;
exsr $loadSfl;
//
// Otra. Se ha pulsado la tecla <INTRO>.
//
other;
if C1CODIGO <> *blanks;
exsr $clearSfl;

Pgina 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 - Da 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';

Pgina 3

Documento: PROGW.RPGLE

when diaSemana = 3;
C1DIA = 'Martes';
when diaSemana = 4;
C1DIA = 'Mircoles';
when diaSemana = 5;
C1DIA = 'Jueves';
when diaSemana = 6;
C1DIA = 'Viernes';
when diaSemana = 7;
C1DIA = 'Sbado';
endsl;
endsr;
//==================================================================
// $proceso - Procesar el subfichero.
//==================================================================
begsr $proceso;
if C1RRN > *zeros;
chain C1RRN SFL1;
if %found;
if %parms > 1;
outCodigo = S1CODIGO; // Cdigo devuelto
endif;
@pant1 = *blanks;
endif;
endif;
endsr;
//==================================================================
// *inzsr - Subrutina de arranque inicial.
//==================================================================
begsr *inzsr;
fechaISO = %date(udate:*mdy);
endsr;
/end-free

Pgina 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'Seleccin'
1 36USER
COLOR(BLU)
2 36SYSNAME
COLOR(BLU)
4 1'Sitese sobre su opcin y pulse <INTRO>'
COLOR(BLU)
5 2'Id.'
DSPATR(HI)
DSPATR(UL)
5 7'Descripcin
'
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)
-----------------------------------------------------------------------Vaco
-----------------------------------------------------------------------R VACIO
ASSUME
1 3' '

Pgina 1

Documento: ARCHIVO.PF

* ------------------------------------------------------------------------------------------* ARCHIVO.PF | Archivo (Subfichero Windows)


* ------------------------------------------------------------------------------------------A
UNIQUE
A
R REGISTRO
A
CODIGO
3A
COLHDG('Cdigo')
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')

Pgina 1

Documento: EMPRESAP.RPGLE

// ==========================================================================================
// EMPRESAP.RPGLE | Programa mantenimiento empresas-Subfichero edicin-Formulario de empresas
// -----------------------------------------------------------------------------------------// OBJETIVO: Mantenimiento de empresas
// -----------------------------------------------------------------------------------------// Utilizacin de indicadores :
//
Del 01 al 24 Teclas de funcin
//
Del 25 al 99 Otras teclas programables,
//
mensajes de error y
//
visualizaciones alternativas
// ==========================================================================================
// Cabecera
h copyright('Marcelino Rodrguez Surez | 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
// Definicin 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=Aadir
d CANCEL
12
12n
F12=Cancelar
*
d RE_PAG
25
25n
Pgina atrs
d AV_PAG
26
26n
Pgina 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
Descripcin en bl
d MES_ERR
53
53n
Mes invalido
d FEC_ALTA_ERR
54
54n
Fecha alta invli
d FEC_BAJA_ERR
55
55n
Fecha baja invli
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

Pgina 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 clculo en formato libre
/free
// En depuracin
if %parms = *zeros;
kUsuar = 'USUARIO';
kEstac = 'ESTACIN';
kBibli = 'BIBLIOTECA';
kPanta = 'NOMBRE PANTALLA';
kNomAp = 'APLICACIN';
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 autorizacin
endif;
// Llamado
if kDVino <> *blanks;
SFL_SELEC = *on; // Operacin de seleccin
endif;
// Vbles. desde
if SFL_SELEC; // Operacin de seleccin
desCod = parDes;
else;
desCod = *zeros;
endif;
desDes = *blanks;
// Principal
dow not EXIT and not CANCEL;

Operacin de sele
Bsqueda 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

Pgina 3

Documento: EMPRESAP.RPGLE
// Tratamiento acciones
write emPrPSub; // Escritura del pe de mandatos
exfmt emPrCSub; // Esperar acciones
// Desactivamos indicadores de error
SFL_BOF_RE = *off; // No inicio de archivo para hacer pg. atrs
SFL_EOF_AV = *off; // No fin de archivo para hacer pg. adelante
OPC_ERR = *off; // Operacin de selecin permitida
SFL_REG_LOCK = *off; // Registro no bloqueado (operacin permitida)
SFL_REG_EOF = *off; // Si existe registro para la operacin
select;
// Finalizar
when EXIT or CANCEL;
leave;
when AV_PAG; // Pgina adelante
exsr avPag;
when RE_PAG; // Pgina atrs
exsr rePag;
when REFRESH; // Renovar
exsr refresco;
// Fichero sin registros (fin de archivo en pg. adelante y atrs)
if SFL_BOF_RE and SFL_EOF_AV;
exsr dltSfl; // Borrar sfl
endif;
when ADD_REG; // Aadir
// 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 (operacin 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 pg. adelante y atrs)
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 autorizacin
OPC_ERR = *on; // Operacin de seleccin no permitida
when not SFL_SELEC and kFunc = 'X'; // Seleccin sin operacin de seleccionar per
OPC_ERR = *on; // Operacin de seleccin no permitida
other;
OPC_ERR = *off; // Operacin de seleccin permitida

Pgina 4

Documento: EMPRESAP.RPGLE

endsl;
if SFL_SELEC and kFunc = 'X'; // Operacin de seleccin y selecciona
parEmC = emCEmp;
parEmN = emNEmp;
*inlr = *on;
return;
endif;
// Si a tecleado alguna opcin y hay cambios en el subfichero
if kFunc <> ' ' and not OPC_ERR;
// Indica
EXIT = *off;
CANCEL = *off;
SFL_REG_LOCK = *off; // Registro no bloqueado (operacin permitida)
SFL_REG_EOF = *off; // Si existe registro para la operacin
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 pg. adelante y atrs)
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 descripcin
FIND_DESC = *on; // Bsqueda por descripcin
else;
FIND_DESC = *off; // No bsqueda por descripcin
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 pg. adelante
exsr rePag;
endif;
endsr;
// Av. Pg.

Pgina 5

Documento: EMPRESAP.RPGLE

begsr avPag;
dMovPag = 'Av'; // Cargo adelante
exsr aMovPag;
endsr;
// Re. Pg.
begsr rePag;
dMovPag = 'Re'; // Cargo atrs
exsr aMovPag;
if NOT_TOT_SFL;
finKey = iniKey; // Ult. sfl = 1 sfl
exsr avPag;
endif;
endsr;
// Tratamiento paginacin
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 pg. adelante
emCEmp = finKey; // Ult. sfl
else;
SFL_BOF_RE = *off; // No fin de archivo en pg. atrs
emCEmp = iniKey; // 1 sfl
endif;
regKey.emCEmp = emCEmp;
if dMovPag = 'Av';
// Si pgina 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 pgina atrs
if RE_PAG; // Atrs desde 1 anterior inclusive
setll %kds(regKey) EMPRESAF;
else;
// Atrs 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;
// Bsqueda por descripcin
if FIND_DESC;
// Salta adelante/atrs
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

Pgina 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 pg. adelante/atrs
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;
// Bsqueda por descripcin
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;

Pgina 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;
// Aadir
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;

Pgina 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'; // Auditora
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'; // Modificacin
opeTxt = sTxt(3);
exsr cvtDatToDMY;
EDIT_ERR = *off;
dou not EDIT_ERR;

Pgina 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; // Auditora
update empreR; // Modifica
else;
unlock EMPRESAF;
endif;
endsl;
endif;
endif;
kFunc = ' ';
endsr;
// Datos de auditora
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;

Pgina 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
**
Auditora
Borrar
Modificar
Aadir
Visualizar

Pgina 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 edicin-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=Aadir'
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 'Aadir')
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'Cdigo'
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=Auditora'
COLOR(BLU)
7 15'B=Borrar'

Pgina 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'Cd.'
DSPATR(HI)
9 10'Empresa'
DSPATR(HI)
9 51'Mes'
DSPATR(HI)
9 55'Tipo'
DSPATR(HI)
9 60'Telfono'
DSPATR(HI)

36

R EMPRFORM

OPETXT

67A

2
2
2
3

EMCEMP

EMNEMP

EMNIF

61
51
50
52
60
60

EMMECE

4
4
4
5

EMTIPO

EMDIRE

60
53
60
60

EMMUNI

6
6
6
7

EMPROV

EMDPOS

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'Cdigo'
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'Direccin'
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'Telfono'
13'Mvil'
25'Fax'
39'Fecha de alta'

Pgina 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

EMMOVI

EMFAX

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

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'Cdigo'
19'Estacin'
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)

Pgina 1

Documento: EMPRESAF.PF

* ------------------------------------------------------------------------------------------* EMPRESAF.PF | Maestro de empresas-Subfichero edicin


* ------------------------------------------------------------------------------------------A
UNIQUE
A
R EMPRER
TEXT('Registro')
A
EMESTA
10A
TEXT('Estacin 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('Cdigo')
A
COLHDG('Cdigo')
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('Direccin')
A
COLHDG('Direccin')
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('Telfono')
A
COLHDG('Telfono')
A
EMFAX
10A
TEXT('Fax')
A
COLHDG('Fax')
A
EMMOVI
10A
TEXT('Mvil')
A
COLHDG('Mvil')
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 edicin
*/
INSERT INTO EMPRESAF VALUES
('ESTACIN1', 'USUARIO1', '2011-01-01-01.01.01.001000', 1, 1,
'A01010101', 'EMPRESA 01', 'DIRECCIN 01', 'MUNICIPIO 01',
'PROVINCIA 01', 10101, '010101010', '111111111', '101010101',
'2011-01-01', '0001-01-01', 1),
('ESTACIN2', 'USUARIO2', '2012-02-02-02.02.02.002000', 2, 2,
'A02020202', 'EMPRESA 02', 'DIRECCIN 02', 'MUNICIPIO 02',
'PROVINCIA 02', 20202, '020202020', '222222222', '202020202',
'2012-02-02', '0001-01-01', 2),
('ESTACIN3', 'USUARIO3', '2013-03-03-03.03.03.003000', 3, 3,
'A03030303', 'EMPRESA 03', 'DIRECCIN 03', 'MUNICIPIO 03',
'PROVINCIA 03', 30303, '030303030', '333333333', '303030303',
'2013-03-03', '0001-01-01', 3),
('ESTACIN4', 'USUARIO4', '2014-04-04-04.04.04.004000', 4, 4,
'A04040404', 'EMPRESA 04', 'DIRECCIN 04', 'MUNICIPIO 04',
'PROVINCIA 04', 40404, '040404040', '444444444', '404040404',
'2014-04-04', '0001-01-01', 4)

Pgina 1

Documento: EMPRESAC.CLP

/* -------------------------------------------------------------------- */
/* EMPRESAC.CLP | Creacin de la aplicacin: 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)
/* Aade 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')
/* Aade 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 vaco')
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 errneo')