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