Está en la página 1de 57
Pagina 1 Documento: PROG1.RPGLE uw 77 PROGL.RPGLE | SUBFICHERO COMPLETO 77 Es una técnica adecuada si se procesa un nimero relativamente pequefio de registros. 77 + La paginacién es realizada por el sistema operativo. uw 71 Procedimiento: // + Leer un registro del archivo, escribirlo en el subfichero y repetir hasta que se 77 Ulegue al final del archivo, luego visualizar el subfichero. 77+ En la definicién del SFLCTL de la DDS, se especifica el tamafio del subfichero (SFLSIZ) 77 mayor que el tamaiio de 1a pagina de visualizacién (SFLPAG). Asi el subfichero se 77 extiende automaticamente cuando se graban mas registros de los indicados en el tamafio 77 del subfichero 7/ + El indicador 61 se asigna a SFLCLR, por tanto, debe ponerse a ON cuando el SFL deba 7 borrarse 71 + El indicador 62 se asigna a SFLDSP. Se pone a ON si se graba algin registro en el 77 subfichero y cuando se borra el subfichero debe estar en OFF. 71 + Cuando el EXFNT del programa tiene lugar, el subfichero se visualiza si el indicador 62 77 esta en ON. 77 + El registro de control SFLCTL incorpora un campo llamado ARG en donde el usuario puede 77 entrar un argumento de busqueda. Este argumento se usa para situar el archivo en el 71 primer registro a recuperar 71 + Cuando el programa se inicia, el registro de control se visualiza, solicitando al 77 usuario un argumento de busqueda. Ei SFL no se visualiza porque no hay registros y por 77 tanto, el indicador 62 esta en OFF. 7/ + Después de entrar el ARG y haber pulsado INTRO, el subfichero se borra y se carga. Una 77 vez cargado, el programa regresa mediante un bucle controlado por un DOWHILE 77 (hasta que se haya pulsado F3) para visualizar el registro de control. 77 + El proceso es mediante un ntimero relativo de registro se define con la palabra clave 77 SFILE, en las especificaciones de descripcién de archivos, para el archivo WORKSTN. 71 + El ndmero relativo de registro (NRR) se incrementa cada vez que se graba un nuevo 77 registro en el subfichero, y se restaura a ceros cuando se borra el subfichero we uw 71 Cabecera uw h copyright( ‘Marcelino Rodriguez Suérez | http://ww.marce.com’ ) h datedit(*dmy/) h dat fmt (*dmy/) uw 77 Archivos (pantalla y disco) uW fPANTALLAL cf e workstn sfile(SFL1:nrr) fFICHERO if e k disk a 71 Definiciones de campo uw d indicadores@ 5 * ine (%addr(*in)) Puntero indicadores dindicadores ds based(indicadores@) Estruct. indicadore a SALIR 03 03n F3-Salir d LIMPIAR 61 In Limpiar subfichero d_ MOSTRAR 62 62n Visualiza subficher uw donee s 4s 0 inz(*zeros) Ne rel. reg. subfic darg 8 30a inz(*blanks) Argumento busqueda we 71 Especificaciones de calculo en formato libre We (tree u" // Presentar la pantalla " exfmt SFLICTL; Ww 7/ Bjecutar hasta que se pulse F3 uw dow not SALIR; nrr_= *zeros;_// Inicializar el numero relativo de registro MOSTRAR = *off; // No mostrar subfichero Ww // Limpiar subfichero Pagina 2 Documento: PROG1.RPGLE M LIMPIAR = “on; write SFLICTL; LIMPIAR = “off; uw 7/ Posicionarse en el fichero con el argumento de busqueda Ww setll arg FICHERO; Ww // Leer fichero de datos uw read FICHERO; uw 71 Sino es fin de fichero, escribir registro en subfichero uw dow not %eof(FICHERO) ; nrr #21; // Incrementar el numero relativo de registro MOSTRAR = *on; // Mostrar subfichero write SFL1; read FICHERO; enddo; Ww 7/ Presentar la pantalla Ww exfmt SFLICTL; enddo; u // Terminar el programa u “intr = ton; Jend-free Pagina 1 Documento: PANTALLA1.DSPF Ae A* PANTALLAL.DSPF | Subfichero completo ro DSPSIZ(24 89 *DS3) R SFLL SFL NOMBRE 304 0 8 4 TELEFON 15a 0 8 35 EMAIL 304 0 8 51 R SFLICTL SFLCTL(SFL1) SFLSIZ(0020) SFLPAG(0010) ag3(03 *Salir’) N61 62 SFLDSP N61 SFLDSPCTL 61 SFLCLR N61 62 SFLEND (*HORE) 5 4'Desde el nombre . . .* DSPATR(HI) ARG 30A B 5 27DSPATR(HI) CHECK(LC) 4" Nombre . DSPATR(RI) 35' Teléfono DSPATR(RI) 51' Email . DSPATR(RI) PPPPPErSrrErrrrrprrprpe> BE 124% 00) MoS 1012] “we Eoin Wa Comnesain hemes Verona Aya B) DS A/S) Bw) sl w/e) 2k) ele) Desde el nombre . . . Amaya Nombre no Amaya Arenas Tamayo 773430585 amayaenarce. com Carmen Solar Arroyo 824419483 carmen@marce. com Cristina Barreiro Serra 634281441 cristinaemarce.com Diego Sanz Casado 722998487 diegoenarce. com Fatima Davila Sanchez 788203588 fatimaenarce.com Juan Santafé Castafo 630454420 juaniimarce. com Manuel Alvarez Viana 707937809 manuelemarce. com Manuel Moreno Melero 758431258 manuel@narce. com Marfa Fernandez Pérez 651142918 mariaemarce. com Narta Rodriguez Esteban 603652729 martaemarce. com Nore. naa Mu 05/027| (oe Sena sata A PROG2.RPGLE Documento: Pagina 1 Ww _— a 77 PROG2.RPGLE | SUBFICHERO PAGINA A PAGINA 77 Es una técnica adecuada si se procesa un nimero grande de registros. 77 + Un programa de subfichero tratado pagina a pagina prepara la primera pagina del 77 subfichero y la visualiza al usuario. 7/ + Si se pulsa la tecla de Avance Pagina, el control vuelve al programa y este adiciona una 77 Segunda pagina al subfichero y lo visualiza de nuevo 7/ + Si-se pulsa Retroceder Pagina, el propio sistema operativo se encargaré de retroceder a 77 Ya primera pagina. // - Si en estas circunstancias se pulsa de nuevo Avance Pagina, el sistema operativo paginar 77 el subfichero a la segunda pagina. 7/7 + Si se insiste en Avanzar, la tercera pagina debe ajfiadirse por programa y luego 71 visualizarse a 71 Procedimiento: 77» Para este funcionamiento hay que afiadir la tecla ROLLUP a la DDS del fichero de // pantalla. Esto hace que el sistema operativo pagine el subfichero hacia adelante hasta 77 que la ltima pagina afiadida se visualice. Si en esta situacién se pulsa de nuevo 77 Reance de Pagina el control vuelve al programa como si se hubiera pulsado una tecla de 77 funcién. 77 + El indicador 60 asociado a la palabra clave ROLLUP se activa (ON) y el programa puede 77 probar esta situacién. 7/ + La légica salta la rutina de borrado del SFL cuando la tecla Avan Pag ha sido pulsada. 77+ La rutina de lectura/carga del subfichero lee los préximos diez registros. 71 + Cuando se produce el EOF el indicador 99 se pone en ON y el bucle finaliza. 71 + Si se produce EOF del FICHERO, como en la DDS la palabra clave ROLLUP esta condicionada 77 a N99, esta queda sin efecto y si el operador solicita avanzar de nuevo, le apareceré el 77 mensaje normal de fin de subfichero; al mismo tiempo que impide que el programa 77 intente leer mas registros de los existentes. 71 + Se ha afiadido un campo oculto (SFLRCD) con la palabra clave SFLRCDNBR 77 - El campo se usa para posicionar el subfichero en la pagina adecuada durante la operacién 71 de visualizacién 77 - El Gltimo NRR usado se situa en el campo SFLRCD asociado al SFLRCDNBR 77 + Cuando se visualiza el subfichero la palabra clave SFLRCDNBR hard que se visualice la 71 pagina que contiene el numero relativo de registro cuyo valor numérico se halla en le 77 campo SFLRCD 11 Cabecera Ww h copyright( ‘Marcelino Rodriguez Sudrez | http: //ww.marce.com' ) h datedit(*dmy/) h dat fmt (*dmy/) aw 71 Archivos (pantalla y disco) a fPANTALLA2 cf e workstn sfile(SFLI:nrr) fFICHERO if e k disk a 71 Definiciones de campo iy d indicadores@ 5 * anz(%addr(*in)) Puntero indicadores dindicadores ds based(indicadores@) Estruct. indicadore ad SALIR 03 @3n F3sSalir dd AV_PAGINA 60 © -60n Avance de pagina d LINPIAR 61 61n Limpiar subfichero MOSTRAR 62 62n Visualiza subficher d_FIN_FICHERO 99 99n EOF fichero A doer 3 4s 0 inz(*zeros) Ne rel. reg. subfic darg 3 30a inz(*blanks) Argumento bisqueda di s 4s © inz(*zeros) Contador bucle for Ww // Especificaciones de célculo en formato Libre Ws /free u" 7/ Presentar pantalla uw exfmt SFLICTL; Pagina 2 Documento: PROG2.RPGLE Ww // Ejecutar hasta que se pulse F3 Wy dow not SALIR; Ww 77 Si no pulsa Av Pag (RollUp) uw if not AV_PAGINA; nrr= Zeros; // Inicializar el numero relativo de registro MOSTRAR = *off; // No mostrar subfichero uy // Limpirar subfichero “ts LIMPIAR = “on; write SFLICTL; LIMPIAR = “off; “ // Posicionarse en el fichero con el argumento de busqueda uy setll arg FICHERO ; endif; Ww 7/ Leer hasta un maximo de 10 registros de cada vez. 7/ El tamaiio de la pagina del subfichero es 10 (SFLPAG) uw for i= 1 to 10; uw /1 Leer fichero de datos uy read FICHERO; u" // Sino es fin de fichero, escribir registro en subfichero u" if not ‘eof (FICHERO) ; FIN_FICHERO = *oft; ner JJ Incrementar el numero relativo de registro MOSTRAR = *on; // Mostrar subfichero write SFL1; else; FIN_FICHERO = *on; leave; endif; endfor; uw 71 Se visualizaré la pagina del subfichero donde se encuentre 77 el Gltimo niimero relative de registro cargado. 7/ La palabra clave de 1a DDS que lo define es SFLRCDNBR W. sflred = ner; Ws 77 Presentar la pantalla uw exfmt SFLICTL; enddo; // Terminar el programa intr = *on; Jend-free Pagina 1 Documento: PANTALLA2.DSPF Ae A* PANTALLA2,DSPF | Subfichero pagina a pagina ro DSPSIZ(24 89 *DS3) R SFLL SFL NOMBRE 304 0 8 4 TELEFON 15a 0 8 35 EMAIL 304 0 8 51 R SFLICTL SFLCTL(SFL1) SFLSIZ(0020) SFLPAG(0010) ao3(03 “Salir’) Ngo ROLLUP(60 'AvPag') N61 62 SFLDSP NGL SFLDSPCTL 61 SFLCLR N61 62 99 SFLEND(*MORE) N61 62 SFLRCD 4S OH SFLRCDNBR 5 4*Desde el nombre . . . DSPATR(HI) ARG 30A B 5 27DSPATR(HI) CHECK(LC) 7 4'Nombre . DSPATR(RI) 7 35' Teléfono DSPATR(RI) 7 SL'Email . DSPATR(RI) PPP PPP PP rSPErErrrrprprpp> Pagina 1 Documento: PROG3.RPGLE Me _ ae 77 PROG3.RPGLE | SUBFICHERO DE UNA PAGINA 77 Es una técnica adecuada si se procesa un mimero grande de registros. 77 + Requieren una minima cantidad de recursos de memoria // + Se presenta siempre una nueva pagina de registros y el subfichero equivale a esta pagina 77 siendo el programa el encargado de controlar la paginacién MW 71 Procedimiento: 77+ En este caso se define SFLSIZ = SFLPAG uw uw 71 Cabecera Ww h copyright( ‘Marcelino Rodriguez Suérez | http://ww.marce.com' ) h datedit(*dmy/) h dat fmt (*dmy/) wa 71 Archivos (pantalla y disco) uw FPANTALLAS cf e workstn sfile(SFLI:nrr) FFICHERO if e k disk Ww 77 Definiciones de campo We d indicadores@ — s * nz (%addr(*in)) Puntero indicadores dindicadores ds based(indicadores@) Estruct. indicadore d SALIR 03 @3n F3=Salir d AV PAGINA 60 © 60n Avance de pagina d LIMPIAR 61 In Limpiar subfichero d MOSTRAR 62 62n Visualiza subficher d_ FIN_FICHERO 99 99n EOF fichero we dnrr s 4s 0 inz(*zeros) No rel. reg. subfic d arg 8 30a inz(*blanks) Argumento busqueda di 5 4s 0 inz(*zeros) Contador bucle for Ww 71 Especificaciones de célculo en formato Libre We /tree “ // Presentar pantalla “us exfmt SFLICTL; a" 7/ Ejecutar hasta que se pulse F3 " dow not SALIR; Ww 77 Sino pulsa Av Pag (RollUp) us if not AV_PAGINA; uw // Posicionarse en el fichero con el argumento de busqueda uw setll arg FICHERO; endif; nrr_= *zeros;_ // Inicializar el numero relativo de registro MOSTRAR = off; // No mostrar subfichero aw 71 Limpirar subfichero uw LIMPIAR = *on; write SFLICTL; LIMPIAR = “off; Ws 77 Leer hasta un maximo de 10 registros de cada vez. 7/ El tamaiio de la pagina del subfichero es 10 (SFLPAG) uw for i = 1 to 10; ue Pagina 2 Documento: PROG3.RPGLE /1 Leer fichero de datos u" read FICHERO; uy 71 Sino es fin de fichero, escribir registro en subfichero uy if not ‘eof (FICHERO) ; FIN_FICHERO = “oft; ner // Incrementar el numero relativo de registro MOSTRAR = *on; // Mostrar subfichero write SFLI; else; FIN_FICHERO = *on; Leave; endif; endfor; we 77 Presentar pantalla uw exfmt SFLICTL; enddo; // Terminar el programa ‘intr = *on; /end- free Pagina 1 Documento: PANTALLA3.DSPF Ae A* PANTALLA3.DSPF | Subfichero de una pagina ro DSPSIZ(24 89 *DS3) R SFLL SFL NOMBRE 304 0 8 4 TELEFON 15a 0 8 35 EMAIL 304 0 8 51 R SFLICTL SFLCTL(SFL1) SFLSIZ(0010) SFLPAG(0010) ao3(03 “Salir’) Ngo ROLLUP(60 'AvPag') N61 62 SFLDSP NGL SFLDSPCTL 61 SFLCLR N61 62 99 SFLEND(*MORE) 5 4'Desde el nombre . . .* DSPATR(HI) ARG 30A B 5 27DSPATR(HI) CHECK(LC) 7 4'Nombre . DSPATR(RI) 35'Teléfono . DSPATR(RI) 51' Email ' DSPATR(RI) PPD PPP PPSPrErerrrrErppr> Pagina 1 Documento: PROG4.RPGLE MW = 77 PROG4.RPGLE | EJEMPLO EMPLEO READC (Subfichero pagina a pagina) 77 - El subfichero se usaré para visualizar una lista de registros con el objetivo de que el 77 usuario pueda hacer una seleccién entre ellos. 77 + El método empleado para cargar y representar el subfichero en pantalla es el denominado 77 pagina a pagina MW 71 Procedimiento: // + Se situa un campo de entrada de una sola posicién, a la izquierda de cada registro del 77 subfichero, para que el usuario pudiera entrar un cédigo de accién 77 + El usuario puede poner un "6" en varios de los registros visualizados 77 + El cédigo de operacién usado para leer registros modificados del subfichero es READC. 7/ + Un registro se considera modificado si algiin dato (incluido blancos) se teclea en un 77 campo del subfichero que sea susceptible de entrada. 71 + Si se recupera algin registro, el campo de entrada SEL se compara con "6" y si coincide, 77 5e ejecutaraé la subrutina correspondiente. we uw 71 Cabecera uw h copyright( ‘Marcelino Rodriguez Suérez | http://ww.marce.com’ ) h datedit(*dmy/) h dat fmt (*dmy/) Ww 77 Archivos (pantalla, impresora y disco) u fPANTALLAG cf oe workstn sfile(SFLiinrr) fQPRINT 0 ff 132 printer oflind(*inof) FFICHERO if e k disk We 71 Definiciones de campo “ d indicadores@ s * nz (addr (*in)) Puntero indicadores dindicadores ds based(indicadores@) Estruct. indicadore d SALIR 03 O3n F3=Salir d AV PAGINA 60 © 60n Avance de pagina d LIWiPTAR 61 61n Limpiar subfichero d MOSTRAR 62 62n Visualiza subficher d FIN_FICHERO 99 99n EOF fichero uw dnrr s 4s 0 inz(*zeros) Ne rel. reg. subfic d nTotRr 5 4s 0 inz(*zeros) No total reg. subf. d arg 3 30a inz(*blanks) Argumento busqueda d argsav 3 30a inz(*Loval) Argumento anterior di Ss 4s 0 inz(*zeros) Contador bucle for aw 71 Especificaciones de célculo en formato Libre uw a /tree " 7/ Presentar pantalla u exfmt SFLICTL; Ws // Ejecutar hasta que se pulse F3 us dow not SALIR; uw 71 Si no pulsa Av Pag (RollUp) a if not AV_PAGINA; u" // Si hay registros en el subfichero se leen posibles cambios uv if nTotRr <= *zeros; " 77 Leer cambios " readc SFL1; Pagina 2 Documento: PROG4.RPGLE dow not ‘eof (); uw // Impresion de la ficha uw if sel = ‘6; exsr imprimeFicha; endif; uy // Leer cambios uy reade SFL1; enddo; endif; uy 7/ Si hay un nuevo argumento de busqueda se inicializa el subfichero " if arg <> argSav; nTotRr = *zeros; // Inicializar el numero relativo de registro ner = nTotRr; MOSTRAR = *off; // No mostrar subfichero Ws // Limpirar subfichero LIMPIAR = *on; write SFLICTL; LIMPIAR = “off; au // Posicionarse en el fichero con el argumento de busqueda " setll arg FICHERO; W exsr fillSfl; // Leer hasta un méximo de 10 registros de cada vez argSav = arg; // Se guarda el argumento de busqueda actual endif; else; exsr fillSfl; // Leer hasta un maximo de 10 registros de cada vez endif; uw // Se visualizaré la pagina del subfichero donde se encuentre 7/ el Giltimo numero relativo de registro cargado. // La palabra clave de la DDS que lo define es SFLRCDNBR W. sflred = arr; aw 7/ Presentar pantalla uw exfmt SFLICTL; enddo; " // Terminar el programa u *inlr = ton; We - // Carga de registros en el subfichero Wa= begsr fillsfl; Ws 7/ Leer hasta un maximo de 19 registros de cada vez. 7/ El tamafio de la pégina del subfichero es 10 (SFLPAG) uw for i= 1 to 10; “ /1 Leer fichero de datos “ read FICHERO; uy // Sino es fin de fichero, escribir registro en subfichero uw if not ‘eof (FICHERO) ; FIN_FICHERO = *off; Pagina 3 Documento: PROG4.RPGLE nTotRr += 1; // Incrementar el numero relativo de registro arr = nTotRr; MOSTRAR = *on; // Mostrar subfichero sel = “blanks; write SFL1; else; FIN_FICHERO = *on; leave; endif; endfor; 7/ Impresién de a 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; Jend-free Ws // Especificaciones de salida uw OQPRINT =e reca @ 201 ° 10 'Ficha’ ° udate y 20 ° nombre 55 ° telefono 75 ° email 110 Pagina 1 Documento: PANTALLA4.DSPF Ae ‘A* PANTALLAG.DSPF | Ejemplo empleo READC (Subfichero pagina a pagina) ro DSPSIZ(24 89 *DS3) R SFLL SFL SEL 1A NOMBRE 308 TELEFON 154 EMAIL 304, 51 R SFLICTL SFLCTL(SFL1) SFLSIZ(0020) SFLPAG(0010) a03(03 *Salir') N99 ROLLUP(60 'AvPAg') N61 62 SFLDSP N61 SFLDSPCTL 61 SFLCLR N61 62 99 SFLEND (*MORE) Nel 62 SFLRCD 4S OH SFLRCDNBR 3 1'Desde el nomore DSPATR(HI) ARG 30A 8 3 24DSPATR(HI) CHECK (LC) 1'Opciones: 6=Imprimir’ COLOR (BLU) 7 1'0p" DSPATR(RI) 4 Nonire ' DSPATR(RI) 35' Teléfono . DSPATR(RI) 51! Email . DSPATR(RI) 2VALUES(' * '6') 4 PPP PPP PPrrrerreprrrerrrperprp> BE 124% 00) MoS 1012] “we Eoin Wa Comnesain hemes Verona Aya SB D2) 218) wis) | wl) ale! ele! Desde el nombre . . . Amaya Opciones: 6=Imprimir '6 Amaya Arenas Tamayo 773430585 amayaemarce. com 6 Carmen Solar Arroyo 824419483 carmen@marce.com §& Cristina Barreiro Serra 634281441 cristinaemarce.com ba feqalemnctceseas 722998487 diegoemerce. con = Fatima Davila Sanchez 788203588 fatimaemarce.com _ Juan Santafé Castano 630454420 juan#marce.com _ Manuel Alvarez Viana 707937809 manuel@marce. com _ Manuel Moreno Melero 758431258 manuel@marce.com _ Maria Fernandez Pérez 651142918 mariaemarce.com bel Wanealnodoraucclestaen oe eee More. ci ay Mu 11/002| (FF mee nia aaa A Pagina 1 Documento: PROGSA.RPGLE MW = 77 PROGSA-RPGLE | EJENPLO DE SELECCION (Programa principal que Ulana al subprograma) 77 - El programa principal requiere un teléfono que se obtiene a través de un subprograma con 77 un subfichero de seleccién. MW --- // Procedimiento: // + Se solicita al usuario que teclee el nombre de la persona y pulse INTRO. 7/ + El programa principal llama entonces al subprograma ofreciendo un subfichero de 77 seleccién 77 - El subprograma es Ulamado con el nombre de la persona como primer pardmetro 77+ El subprograma, mediante SETLL y READE, monta un subfichero con los teléfonos de la 77 persona indicada y los muestra en pantalla para que el usuario seleccione el adecuado. 7/ + Después de recuperado el registro seleccionado mediante READC, el teléfono es devuelto a a 7 do para Ws uw 71 Cabecera uw h copyright( ‘Marcelino Rodriguez Sudrez | http://ww.marce.com’) h datedit(*amy/) hh dat fmt (*dmy/) Ww 77 Prototipo del programa amado Ww d program pr extpgm( * PROGS' ) d pNombre 30a d_ pTelefono 15a uw 77 Definiciones de campo W d pNombre s 30a inz(*blanks) d pTelefono 5 15a inz(*blanks) d respuesta 8 la inz(*blanks) aw 71 Especificaciones de calculo en formato libre Ww /tree “ // Presentar peticién de nombre W dsply ‘Nombre a seleccionar: us // Llamada al programa de seleccién " program(pNombre : pTelefono); " 7/ Presentacién del teléfono de respuesta W if pTelefono <> “blanks; dsply (‘Teléfono devuelto: ' + pTelefono) endif; uw 71 Terminar el programa u" *inlr = ton; Jend-free pNombre; respuesta; Pagina 1 Documento: PROGS.RPGLE i= a // PROGS.RPGLE | EJEMPLO DE SELECCION - Subprograma (Subfichero completo) 71 + Se emplea la técnica del subfichero completo. W- 71 Procedimiento: 77 El subprograma es llamado con el nombre de la persona como primer pardmetro // + El subprograma, mediante SETLL y READE, monta un subfichero con los teléfonos de La 77 persona indicada y los muestra en pantalla para que el usuario seleccione el adecuado. 71 + Después de recuperado el registro seleccionado mediante READC, el teléfono es devuelto a 77 programa principal en un segundo parametro. u au“ 71 Cabecera uw h copyright( ‘Marcelino Rodriguez Suarez | http: //ww.marce.com' ) h datedit(*dmy/) hh dat fmt (*dmy/) uW 77 Archivos (pantalla, impresora y disco) "7 *PANTALLAS cf e workstn sfile(SFLi:nrr) fQPRINT 0 =f :132 printer oflind(*inof) fFICHERO if e k disk Ws 77 Prototipo de llamada al programa 1 @ main pr extpgm( * PROGS" ) d pNombre 30a d_ pTelefono 158 uw 77 Interfaz de procedimiento uy d main pi d pNombre 308 d_ pTelefono 1a uw 7/ Estructura de datos de la clave del fichero W. d clave ds Likerec(registro : *key) uw 71 Definiciones de campo u d indicadores@ 5 * nz addr (*in)) Puntero indicadores dindicadores ds based(indicadores@) Estruct. indicadore d SALIR 03 @3n F3=Salir MOSTRAR 62 62n Visualize subficher 1 d ner s 4s 0 inz(*zeros) NO rel. reg. subfic d nTotRr s 4s 0 inz(*zeros) Ne total reg. subf. darg s 30a inz(*blanks) Argumento busqueda aw 71 Especificaciones de célculo en formato Libre uw /free “ // Si se Lama al programa con al menos un pardmetro este se almacena en arg “ if %parms >= 1; arg = plionbre; endif; “ 7/ Posicionarse en el fichero con el argumento de busqueda uw clave.nombre = arg; setUl clave.nombre FICHERO; us // Leer y cargar los registros uw if “parms >= 1; reade clave.nombre FICHERO; Pagina 2 Documento: PROGS.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; uw 77 Leer fichero de datos “ if “parms >= 1; reade clave.nombre FICHERO; else; read FICHERO; endif; enddo; ws sflred = 1; // Se visualizaré la primera pagina del subfichero. ws 7/ Presentar pantalla uw exfmt SFLICTL; uw // Ejecutar hasta que se pulse F3 uw dow not SALIR; We 71 Si hay registros en el subfichero se leen posibles cambios “a if nTotRr <> *zeros; uy /1 Leer cambios u reade SFLL; dow not %eof(); wu sflrcd = nrr; // Visualizar pagina del dltimo niimero relativo de registro cambiado. uw 7/ Impresién de la ficha uw if sel = 6; exsr imprimeFicha; u" // Seleccién del registro uw elseif sel = '9'; if “parms >= 2; // Si hay un 22 pardmetro se le pasaré el teléfono pTelefono = telefono; endif; “intr return; endif; uw // Leer cambios uw reade SFL1; enddo; endif; we 71 Presentar pantalla uw exfmt SFLICTL; enddo; uv 71 Terminar el programa uw *inlr = *on; ‘on; // Terminar el programa Pagina 3 Documento: PROGS.RPGLE Wee 71 Inpresion de la ficha E 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; Jend-free uw 77 Especificaciones de salida a OQPRINT € reca 0 201 ° 10 ‘Ficha’ ° udate y 20 ° nombre 55 ° email 5 ° telefono 110 Pagina 1 Documento: PANTALLAS.DSPF Ae A* PANTALLAS.DSPF | Ejemplo de seleccién (Subfichero completo} ro DSPSIZ(24 89 *DS3) R SFLL SFL SEL 1A NOMBRE 308 TELEFON 154 EMAIL 304, 51 R SFLICTL SFLCTL(SFL1) SFLSIZ(0020) SFLPAG(0010) a03(03 *Salir') 62 SFLDSP SFLDSPCTL 62 SFLEND(*HORE) 62 SFLRCD 4S OH SFLRCDNBR Nombre... et DSPATR(HI) 24DSPATR(HI) 1'Opciones: 6=Imprimir 9=Seleccion- ar’ COLOR (BLU) 10p" DSPATR(RI) 4 Nonibre ' DSPATR(RI) 35' Teléfono : DSPATR(RI) 51! Email . DSPATR(RI) 2VALUES('6' ‘9! 4 ARG 30A 0 PPPPPPPPrrrr>rrrrrrerprpprp> BE 124% 00) MoS “we Eoin Wa Comnesain hemes Verona Aya SB D2) 218) wis) | wl) ale! ele! 2ini3| Nombre... . . . . . Amaya Arenas Tamayo Opciones: 6=Imprimir 9=Selecciona: i '§ Amaya Arenas Tamayo 773430585 amayaemarce. com Bot tom way i) 08/002 (BF ie Sands alecornerte a Pagina 1 Documento: PROG6.RPGLE uw 77 PROGS.RPGLE | EJEMPLO DE SELECCION DE CODIGO (Subfichero completo) 7/ - El programa imprime, previa confirmacién, las personas cuyo email no contiene una arroba 77 a excepcién de aquellas que explicitamente sefiale el usuario. 77 + El método empleado para cargar y representar el subfichero en pantalla es el denominado 71 completo. uw 71 Procedimiento: 77+ 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 77 alguna ficha, puede blanquear el cédigo "6". 77 + Los registros se recuperan empleando la palabra clave SFLNXTCHG en el registro del 71 subfichero de 1a DDS. Esta palabra clave esta condicionada por el indicador 40, que se 77 pone a ON cuando se graba en el subfichero un registro que no contiene una arroba en el 77 email. Con lo que en la préxima Lectura del subfichero, hara que este registro se 77 comporte como si hubiera sido modificado por el usuario. 71 - Una operacién READC recuperaré el registro y la ficha seré impresa automaticamente. 77 - Un READC recupera también los registros "blanqueados", pero como el campo SEL est en 77 blanco, no actuaré la rutina de impresién. 7/ + La aplicacién cuando el campo email no contiene una arroba, debe parpadear. 77 + La funcién de parpadeo se activa usando en las DDS la palabra clave DSPATR(BL) 77 + Los atributos de campo también pueden emplearse con los registros de un subfichero. 77 + Asi, en 1a DDS, el campo EMATL tiene DSPATR(BL) condicionado por el indicador 41. Este 77 indicador se pone a ON al grabar un registro en el subfichero, si el email no contiene 77 una arroba, por tanto parpadeara. 77+ En el programa se observa que para cada registro que se lee del archivo, se verifica si 77 el email no contiene una arroba, activandose en este caso los indicadores 40 y 41, y 77 moviendo un "6" al campo SEL. a Ws 71 Cabecera uw h copyright('Marcelino Rodriguez Sudrez | htt h datedit(*amy/) h dat fmt (*dmy/) ‘/vra.marce.com') uw // Archivos (pantalla, impresora y disco) uw TPANTALLA6 cf € Workstn sfite(SFLisnrr) fQPRINT oo =f 132 printer oflind(*inof) fRICHERO if k disk us // Definiciones de campo “7 dindicadores@ * — inz(saddr(*in)) Puntero indicadores dindicadores ds based (indicadores@) Estruct. indicadore d SALIR 03 63n F3=Salir d CAMBIO_REG 40 40n Cambio reg. subfich d_ PARPADEAR 41 4in Email parpadeante d_ MOSTRAR, 62 62n Visualiza subficher uw dare s 45 © inz(*zeros) N® rel. reg. subfic aw // Especificaciones de célculo en formato Libre Wy /free a“ // Posicionarse en el primer registro del fichero u“ setll *loval FICHERO; 7/ Leer fichero de datos ” read FICHERO; Wy // Si no es fin de fichero, escribir registro en subfichero uy dow not eof (FICHERO) ; nrrt21; // Increnentar el numero relativo de registro MOSTRAR = *on; // Mostrar subfichero Pagina 2 Documento: PROG6.RPGLE // Si el email no contiene una arroba (@) se debe marcar af “scan (“@ : email) = *zeros and email < “blanks; sel = ‘6; 71 Se marca para imprimir CAMBIO_REG = *on; // Se activa el indicador de registro canbiado 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 = *oft; // Se desactiva el parpadeo del email endif; write SFLL; read FICHERO; enddo; uv CAMBIO_REG = *oft; PARPADEAR = *off; sflred = 1; // Se visualiza 1? la pagina del subfichero Ww 7/ Presentar la pantalla uw exfmt SFLICTL; 7/ Bjecutar hasta que se pulse F3 uw dow not SALIR; // Si hay registros if nrr © “zeros; // Leer posibles cambios reade SFL1; dow not %eof(); // Hay cambios // Se visualizara la pagina del subfichero donde se encuentre el ultimo // nimero de registro tratado sflred = arr; // Impresion de la ficha if sel = '6'; exsr imprimeFicha; endif; // Leer posibles cambios reade SFL1; enddo; endif; uw 7/ Presentar la pantalla uw exfmt SFLICTL; enddo; “ 77 Terminar el programa " *inlr = fon; MW 7/ Impresién de la ficha Wan 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; Jend-free u 71 Especificaciones de salida wy oQPRINT e reca e021 Pagina 3 Documento: PROG6.RPGLE udate nombre telefono email y Pagina 1 Documento: PANTALLAG.DSPF Ae - A* PANTALLAS.DSPF | Ejemplo de seleccién cédigo (Subfichero completo) ro . DSPSIZ(24 89 *DS3) R SFLL SFL 49 SFLNXTCHG SEL 1A 8 8 2VALUES('6' * ') NOMBRE 304 0 8 4 TELEFON 154 0 8 35 EMAIL 300 851 41 DSPATR(BL) 41 COLOR (RED) R SFLICTL SFLCTL(SFL1) SFLS1Z(0020) SFLPAG(0010) cAa03(03 'Salir') 62 SFLOSP, SFLDSPCTL 62 SFLEND(*HORE) 62 SFLRCD 48 OH SFLRCDNBR L'Opciones: 6=Inprimir’ COLOR (BLU) 1°09 DSPATR(RI) 4'Nombre : DSPATR(RI) 35 ‘Teléfono : DSPATR(RI) S1'Email : DSPATR(RI) PPPEPPPrrErSrrErrrrrrrrrpy> BE 124% 00) MoS 1012] “we Eoin Wa Comnesain hemes Verona Aya SB D2) 218) wis) | wl) ale! ele! Opciones: 6=Imprimir mbre = Adela Casanovas Santos 729860652 adelaemarce. com T Alicia Veraguas Amador 840030103 aliciaemarce.com — Amaya Arenas Tamayo 773430585 amayaemarce. com _ Carmen Solar Arroyo 824419483 carmenemarce. com ~ Cristina Barreiro Serra 634281441 cristinaemarce.com 1 Diego Sanz Casado 722998487 diegoemarce.com _ Fatima Davita Sanchez 788203588 fatimaemarce. com & Juan Santafé Castano 630454420 juantimarce. com _ Manuel Alvarez Viana 707937808 manuelemarce.com _ Manuel Moreno Melero 758431258 manuelemarce. com More. way i) 08/002 (oe Sena sata A Pagina 1 Documento: PROG7.RPGLE Ww _ 77 PROGT.RPGLE | VERIFICACION DE DATOS MEDIANTE EL USO DE SFLNXTCHG (Subfichero completo) 77 ~ La palabra SFLNXTCHG se puede usar para efectuar el control de errores en los campos de 77 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 77 datos es minimo 71 + El método empleado para cargar y representar el subfichero en pantalla es el denominado 71 completo. Ww 71 Procedimiento: 77+ En el ejemplo el usuario actualiza, mediante el uso de un subfichero, el teléfono y el 77 email de una persona determinada. 7/ + Cuando pulsa INTRO, el programa ejecuta un bucle con READC para obtener los registros 71 modificados 7/ + En este momento se comprueba 1a validez del teléfono y email para las personas 77 (se entiende que no puede validarse desde la DDS con VALUE, RANGE, etc.) 71 + Si no es valido, el programa pone en ON un indicador para el mensaje de error y cuando 71 todos los registros han sido procesados, si el indicador de error esta activado, se 77 Visualizara de nuevo el subfichero. 77 + En este momento el usuario puede, en lugar de repasar y cambiar los registros erréneos, 77 pulsar simplemente INTRO de nuevo y, como los registros no han sido modificados, el 77 bucle READC no los procesaré, por tanto, la técnica expuesta anteriormente es 77 inadecuada. 77+ Lo que se debe hacer es activar, ademas del indicador de error, un indicador individual 77 que condicione un DSPATR(BL) para cada campo erréneo y un indicador para condicionar 77 SFLNXTCHG, y seguidamente actualizar en el subfichero el registro que se esta 77 procesando con estos indicadores activados. 71 + Bunque el contenido de los campos no varié, como se activé ‘registro cambiado’ con 77 SFLNXTCHG en la préxima lectura, una vez dado el INTRO, se leerd de nuevo este registro 71 como si se hubiera modificado por el usuario. uw we 71 Cabecera a h copyright( ‘Marcelino Rodriguez Sudrez | http: //ww.marce.com' ) h datedit(*dmy/) h dat fmt (*amy/) uw 77 Archivos (pantalla y disco) uw fPANTALLAT cf oe workstn sfile(SFL1:arr) fRICHERO if e k disk uw 71 Definiciones de campo uw d indicadores@ 5 * nz (addr (*in)) Puntero indicadores dindicadores ds based(indicadoresa) Estruct. indicadore d SALIR 03 O3n F3=Salir d CAMBIO_REG 40 40n Cambio reg. subfich d d a d MOSTRAR 62 62n Visualiza subficher MENSAJE_ERR 55 55n Nensaje error subf. ERROR_TELEF 91 In Error en teléfono ERROR_EMATL 92 92n Error en email uw donee s 4s 0 NO rel. reg. subfic Ww // Especificaciones de calculo en formato Libre We (free uw // Posicionarse al inicio del fichero “ setll *Loval FICHERO; “ 77 Leer fichero de datos " read FICHERO; " 7/ Si no es fin de fichero, escribir registro en subfichero Ww Pagina 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; uw 7/ Presentar 1a pantalla uw exfmt SFLICTL; uw // Bjecutar hasta que se pulse F3 us dow not SALIR; 71 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; uw 7/ Presentar la pantalla uw exfmt SFLICTL; // Terminar el programa “ ‘intr = *onj UW - 7/ Rutina de verificacién de los datos introducidos en el subfichero ia begsr verif; MENSAJE_ERR = “off; reade 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+-*/=.()#@::, 5" telefono) <> *blanks; ERROR_TELEF = *on; endif; /1 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_ENAIL; CAMBTO-REG = *on; /7 Se activa cambio de registro del subfichero MENSAJE_ERR = *on; // Se activa mensaje de error del subfichero endif; update SFL1; reade SFLL; enddo; uw CAMBIO_REG ERROR_TELEF = ERROR_EMATL endsr; Jend-free Pagina 1 Documento: PANTALLA7.DSPF Ae A* PANTALLA7.DSPF | Verificacién de datos (Subfichero completo) ro DSPSIZ(24 89 *DS3) R SFLL SFL 49 SFLNXTCHG NOMBRE 30A B 8 ACHECK(LC) TELEFONO 154 B 8 35 a1 DSPATR(BL) a1 COLOR (RED) EMAIL 30A B 8 SICHECK(LC) 92 DSPATR(BL) 92 COLOR (RED) R SFLICTL SFLCTL(SFL1) a03(03 *Salir') 62 SFLDSP SFLDSPCTL 62 SFLEND(*MORE) SFLSIZ(0020) SFLPAG(0010) 55 SFLNSG( ‘email sin arroba o teléfono- con letras’ 55) 7 4'Nombre . DSPATR(RI) 7 35' Teléfono DSPATR(RI) 7 SL'Email . DSPATR(RI) PPPP PP PPr>rErrrrrrprrrpp> BE 124% 00) MOR SP 1012] “we Eoin Wa Comnesain hemes Verona Aya SB D2) 218) wis) | wl) ale! ele! i Era Adela Casanovas Santos ABC860652 adelaénarce. com Alicia Veraquas Amador 840030103 aliciatimarce. com Amaya Arenas Tamayo 773430585 amayaemarce com Carmen Solar Arroyo 824419483 carmen@marce. com Cristina Barreiro Serra 634281441 cristinaemarce.com Diego Sanz Casado 722998487 dieqoemarce. com Fatima Davila Sanchez 788203588 fatimaemarce. com Juan Santafé Castafo 630454420 juanemarce. com Manuel Alvarez Viana 707937809 manuelemarce. com Manuel Moreno Melero 758431258 manuelemarce. com More... Naya XII Mu 08/004 (oats arin tao wn eas A

También podría gustarte