Página:de 57 Tamaño real 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) // f PANTALLA1 c f e workstn sfile(SFL1:nrr) f FICHERO i f e k disk // // Definiciones de campo // d indicadores@ s * inz(%addr(*in)) Puntero indicadores d indicadores ds based(indicadores@) Estruct. indicadore d SALIR 03 03 n F3=Salir d LIMPIAR 61 61 n Limpiar subfichero d MOSTRAR 62 62 n Visualiza subficher // d nrr s 4 s 0 inz(*zeros) Nº rel. reg. subfic d arg s 30 a 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: 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 30 A O 8 4 A TELEFONO 15 A O 8 35 A EMAIL 30 A O 8 51 A R SFL1CTL SFLCTL(SFL1) A SFLSIZ(0020) A SFLPAG(0010) A CA03(03 'Salir') A N 99 ROLLUP(60 'AvPág') A N 61 62 SFLDSP A N 61 SFLDSPCTL A 61 SFLCLR A N 61 62 99 SFLEND(*MORE) A N 61 62 SFLRCD 4 S 0 H SFLRCDNBR A 5 4 'Desde el nombre . . .' A DSPATR(HI) A ARG 30 A B 5 27 DSPATR(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) // f PANTALLA3 c f e workstn sfile(SFL1:nrr) f FICHERO i f e k disk // // Definiciones de campo // d indicadores@ s * inz(%addr(*in)) Puntero indicadores d indicadores ds based(indicadores@) Estruct. indicadore d SALIR 03 03 n F3=Salir d AV_PAGINA 60 60 n Avance de página d LIMPIAR 61 61 n Limpiar subfichero d MOSTRAR 62 62 n Visualiza subficher d FIN_FICHERO 99 99 n EOF fichero // d nrr s 4 s 0 inz(*zeros) Nº rel. reg. subfic d arg s 30 a inz(*blanks) Argumento búsqueda d i s 4 s 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 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; 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 tra