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 Documento: PANTALLA5.DSPF

A* -------------------------------------------------------------------------------------------
A* PANTALLA5.DSPF | Ejemplo de seleccin (Subfichero completo)
A* -------------------------------------------------------------------------------------------
A DSPSIZ(24 80 *DS3)
A R SFL1 SFL
A SEL 1A B 8 2VALUES('6' '9' ' ')
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 62 SFLDSP
A SFLDSPCTL
A 62 SFLEND(*MORE)
A 62 SFLRCD 4S 0H SFLRCDNBR
A 3 1'Nombre . . . . . . . .'
A DSPATR(HI)
A ARG 30A O 3 24DSPATR(HI)
A 5 1'Opciones: 6=Imprimir 9=Seleccion-
A ar'
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: 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 Documento: PROG6.RPGLE

o 10 'Ficha'
o udate y 20
o nombre 55
o telefono 75
o email 110
Pgina 1 Documento: PANTALLA6.DSPF

A* -------------------------------------------------------------------------------------------
A* PANTALLA6.DSPF | Ejemplo de seleccin cdigo (Subfichero completo)
A* -------------------------------------------------------------------------------------------
A DSPSIZ(24 80 *DS3)
A R SFL1 SFL
A 40 SFLNXTCHG
A SEL 1A B 8 2VALUES('6' ' ')
A NOMBRE 30A O 8 4
A TELEFONO 15A O 8 35
A EMAIL 30 O 8 51
A 41 DSPATR(BL)
A 41 COLOR(RED)
A R SFL1CTL SFLCTL(SFL1)
A SFLSIZ(0020)
A SFLPAG(0010)
A CA03(03 'Salir')
A 62 SFLDSP
A SFLDSPCTL
A 62 SFLEND(*MORE)
A 62 SFLRCD 4S 0H SFLRCDNBR
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: 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 Documento: PANTALLA7.DSPF

A* -------------------------------------------------------------------------------------------
A* PANTALLA7.DSPF | Verificacin de datos (Subfichero completo)
A* -------------------------------------------------------------------------------------------
A DSPSIZ(24 80 *DS3)
A R SFL1 SFL
A 40 SFLNXTCHG
A NOMBRE 30A B 8 4CHECK(LC)
A TELEFONO 15A B 8 35
A 91 DSPATR(BL)
A 91 COLOR(RED)
A EMAIL 30A B 8 51CHECK(LC)
A 92 DSPATR(BL)
A 92 COLOR(RED)
A R SFL1CTL SFLCTL(SFL1)
A CA03(03 'Salir')
A 62 SFLDSP
A SFLDSPCTL
A 62 SFLEND(*MORE)
A SFLSIZ(0020)
A SFLPAG(0010)
A 55 SFLMSG('email sin arroba o telfono-
A con letras' 55)
A 7 4'Nombre '
A DSPATR(RI)
A 7 35'Telfono '
A DSPATR(RI)
A 7 51'Email '
A 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 Documento: PANTALLAW.DSPF

A* ------------------------------------------------------------------------
A* PANTALLAW.DSPF | Pantalla (Subfichero Windows)
A* ------------------------------------------------------------------------
A DSPSIZ(24 80 *DS3)
A PRINT
A* ------------------------------------------------------------------------
A* Subarchivo
A* ------------------------------------------------------------------------
A R SFL1 SFL
A S1CODIGO 3A O 7 2
A S1NOMBRE 30A O 7 7
A* ------------------------------------------------------------------------
A* Control del subarchivo
A* ------------------------------------------------------------------------
A R SFL1CTL SFLCTL(SFL1)
A WINDOW(FMT1)
A SFLSIZ(0020)
A SFLPAG(0010)
A CF03(03)
A CF12(12)
A ROLLUP(33)
A BLINK
A RTNDTA
A OVERLAY
A SFLCSRRRN(&C1RRN)
A 50 SFLDSP
A 51 SFLDSPCTL
A 52 SFLCLR
A C1NBR 4S 0H SFLRCDNBR
A C1RRN 5S 0H
A 2 1DATE
A EDTCDE(Y)
A COLOR(BLU)
A 1 1TIME
A COLOR(BLU)
A C1DIA 10 O 3 1COLOR(BLU)
A 1 15'www.marce.com'
A DSPATR(HI)
A 2 17'Seleccin'
A 1 36USER
A COLOR(BLU)
A 2 36SYSNAME
A COLOR(BLU)
A 4 1'Sitese sobre su opcin y pulse <I-
A NTRO>'
A COLOR(BLU)
A 5 2'Id.'
A DSPATR(HI)
A DSPATR(UL)
A 5 7'Descripcin '
A DSPATR(HI)
A DSPATR(UL)
A C1CODIGO 3A B 6 2DSPATR(HI)
A* ------------------------------------------------------------------------
A* Ventana
A* ------------------------------------------------------------------------
A R FMT1
A WINDOW(3 5 18 45)
A OVERLAY
A WDWBORDER((*COLOR BLU) (*DSPATR HI))
A 17 2'F3=Salir'
A COLOR(BLU)
A 17 12'F12=Cancelar'
A COLOR(BLU)
A* ------------------------------------------------------------------------
A* Vaco
A* ------------------------------------------------------------------------
A R VACIO
A ASSUME
A 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 Documento: EMPRESAP.RPGLE

d OPC_ERR s n Operacin de sele


d FIND_DESC s n Bsqueda por desc
d NOT_READC s n No existen cambio
d REG_SELECT s n Seleccionado regi
d REG_LOCKED s n Registro bloquead
d REG_NOTFND s n Registro existent
d EDIT_ERR s n Errores en datos ed
d NOT_TOT_SFL s n No rellenado todo e
d CHG_PROCES s n Se ha procesado una
// 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 emCEmp
d finKey s 2s 0 emCEmp
*
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;
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 Documento: EMPRESAS.DSPF

A* -------------------------------------------------------------------------------------------
A* EMPRESAS.DSPF | Pantallas mantenimiento empresas-Subfichero edicin-Formulario de empresas
A* -------------------------------------------------------------------------------------------
A DSPSIZ(24 80 *DS3)
A PRINT
A INDARA
A R EMPRPSUB
A OVERLAY
A PROTECT
A WINDOW(1 2 22 75)
A WDWBORDER((*COLOR WHT) (*DSPATR ND))
A 21 1'F3=Salir'
A COLOR(BLU)
A 21 12'F5=Renovar'
A COLOR(BLU)
A 21 25'F6=Aadir'
A COLOR(BLU)
A 21 37'F12=Cancelar'
A COLOR(BLU)
A R EMPRSUBF SFL
A KFUNC 1A B 10 2VALUES('B' 'M' 'A' 'X' 'V' ' ')
A DSPATR(UL)
A EMCEMP 2Y 0O 10 6EDTCDE(4)
A EMNEMP 40A O 10 10
A EMMECE R O 10 51REFFLD(EMPRER/EMMECE *LIBL/EMPRESAF)
A EDTCDE(4)
A EMTIPO 1Y 0O 10 56EDTCDE(4)
A EMTELE R O 10 60REFFLD(EMPRER/EMTELE *LIBL/EMPRESAF)
A R EMPRCSUB SFLCTL(EMPRSUBF)
A SFLSIZ(0010)
A SFLPAG(0010)
A WINDOW(EMPRPSUB)
A CF05(05 'Refrescar')
A ROLLDOWN(25 'Pagina Atras')
A ROLLUP(26 'Pagina Adelante')
A CF06(06 'Aadir')
A CA03(03 'Salir')
A CA12(12 'Cancelar')
A OVERLAY
A PROTECT
A SFLDSPCTL
A 28 SFLDSP
A 27 SFLCLR
A 29 SFLEND
A 42 SFLMSGID(PGM0020 *LIBL/EMPRESAM)
A 43 SFLMSGID(PGM0030 *LIBL/EMPRESAM)
A 40 SFLMSGID(PGM0050 *LIBL/EMPRESAM)
A 41 SFLMSGID(PGM0060 *LIBL/EMPRESAM)
A KPANTA 20A O 1 1COLOR(WHT)
A DSPATR(HI)
A KNOMAP 12A O 1 30COLOR(GRN)
A 1 68DATE
A EDTCDE(Y)
A COLOR(GRN)
A SUBRAY 75A O 2 1DSPATR(UL)
A COLOR(GRN)
A KBIBLI 10A O 3 1
A KNOEMP 30A O 3 21COLOR(GRN)
A KDVINO 20A O 3 56COLOR(WHT)
A DSPATR(HI)
A 4 13'Cdigo'
A DSPATR(HI)
A 4 20'Empresa'
A DSPATR(HI)
A 5 1'Situar en:'
A DESCOD 2Y 0B 5 15EDTCDE(4)
A DESDES 40A B 5 20
A 35 7 1'A=Auditora'
A COLOR(BLU)
A 7 15'B=Borrar'
Pgina 2 Documento: EMPRESAS.DSPF

A COLOR(BLU)
A 7 26'M=Modificar'
A COLOR(BLU)
A 7 40'V=Visualizar'
A COLOR(BLU)
A 36 7 55'X=Seleccionar'
A COLOR(BLU)
A 9 1'Opc'
A DSPATR(HI)
A 9 5'Cd.'
A DSPATR(HI)
A 9 10'Empresa'
A DSPATR(HI)
A 9 51'Mes'
A DSPATR(HI)
A 9 55'Tipo'
A DSPATR(HI)
A 9 60'Telfono'
A DSPATR(HI)
A R EMPRFORM
A WINDOW(10 4 11 71)
A CA03(03 'Salir')
A CA12(12 'Cancelar')
A CLRL(*NO)
A OVERLAY
A PROTECT
A WDWBORDER((*COLOR WHT) (*DSPATR HI))
A OPETXT 67A O 1 1DSPATR(HI)
A DSPATR(UL)
A 2 1'Cdigo'
A 2 13'Empresa'
A 2 54'NIF'
A EMCEMP R Y B 3 1REFFLD(EMPRER/EMCEMP *LIBL/EMPRESAF)
A CHECK(RZ)
A 61 DSPATR(PR)
A 51 ERRMSGID(PGM0100 *LIBL/EMPRESAM)
A 50 ERRMSGID(PGM0090 *LIBL/EMPRESAM)
A EDTCDE(4)
A EMNEMP R B 3 13REFFLD(EMPRER/EMNEMP *LIBL/EMPRESAF)
A 52 ERRMSGID(PGM0100 *LIBL/EMPRESAM)
A 60 DSPATR(PR)
A EMNIF R B 3 54REFFLD(EMPRER/EMNIF *LIBL/EMPRESAF)
A 60 DSPATR(PR)
A 4 1'Mes inicio'
A 4 13'Tipo'
A 4 25'Direccin'
A EMMECE R Y B 5 1REFFLD(EMPRER/EMMECE *LIBL/EMPRESAF)
A EDTCDE(4)
A 60 DSPATR(PR)
A 53 ERRMSGID(PGM1020 *LIBL/EMPRESAM)
A EMTIPO R Y B 5 13REFFLD(EMPRER/EMTIPO *LIBL/EMPRESAF)
A EDTCDE(4)
A 60 DSPATR(PR)
A EMDIRE R B 5 25REFFLD(EMPRER/EMDIRE *LIBL/EMPRESAF)
A 60 DSPATR(PR)
A 6 1'Municipio'
A 6 25'Provincia'
A 6 54'D. postal'
A EMMUNI R B 7 1REFFLD(EMPRER/EMMUNI *LIBL/EMPRESAF)
A 60 DSPATR(PR)
A EMPROV R B 7 25REFFLD(EMPRER/EMPROV *LIBL/EMPRESAF)
A 60 DSPATR(PR)
A EMDPOS R Y B 7 54REFFLD(EMPRER/EMDPOS *LIBL/EMPRESAF)
A CHECK(RZ)
A 60 DSPATR(PR)
A EDTCDE(4)
A 8 1'Telfono'
A 8 13'Mvil'
A 8 25'Fax'
A 8 39'Fecha de alta'
Pgina 3 Documento: EMPRESAS.DSPF

A 8 54'Fecha de baja'
A EMTELE R B 9 1REFFLD(EMPRER/EMTELE *LIBL/EMPRESAF)
A 60 DSPATR(PR)
A EMMOVI R B 9 13REFFLD(EMPRER/EMMOVI *LIBL/EMPRESAF)
A 60 DSPATR(PR)
A EMFAX R B 9 25REFFLD(EMPRER/EMFAX *LIBL/EMPRESAF)
A 60 DSPATR(PR)
A WFEDTA 6Y 0B 9 39
A 60 DSPATR(PR)
A EDTMSK(' & & ')
A EDTWRD(' / / ')
A 54 ERRMSGID(PGM1010 *LIBL/EMPRESAM)
A 56 ERRMSGID(PGM1030 *LIBL/EMPRESAM)
A WFEDTB 6Y 0B 9 54
A 55 ERRMSGID(PGM1010 *LIBL/EMPRESAM)
A 56 ERRMSGID(PGM1030 *LIBL/EMPRESAM)
A 60 DSPATR(PR)
A EDTMSK(' & & ')
A EDTWRD(' / / ')
A 10 1'F3=Salir'
A COLOR(BLU)
A 10 12'F12=Cancelar'
A COLOR(BLU)
A R EMPRAUDI
A CA03(03 'Salir')
A CA12(12 'Cancelar')
A OVERLAY
A PROTECT
A WINDOW(16 4 5 71)
A WDWBORDER((*COLOR WHT) (*DSPATR HI))
A OPETXT 67A O 1 1DSPATR(UL)
A DSPATR(HI)
A 2 1'Cdigo'
A 2 19'Estacin'
A 2 34'Usuario'
A 2 52'Fecha y Hora'
A EMCEMP 2S 0O 3 3
A EMESTA R O 3 19REFFLD(EMPRER/EMESTA *LIBL/EMPRESAF)
A EMUSUA R O 3 34REFFLD(EMPRER/EMUSUA *LIBL/EMPRESAF)
A WAFEHO 14Y 0O 3 49EDTWRD(' / / & : : ')
A 4 1'F3=Salir'
A COLOR(BLU)
A 4 12'F12=Cancelar'
A 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')