You are on page 1of 7

SUBFILE, RPG FREE

Alguien me pregunt si podra recomendar un ejemplo de programa de subarchivo simple escrito en


"RPG / free". Despus de unos minutos de Googling la mayora de los ejemplos que encontr
estaban en RPGIII, unos pocos estaban en RPGLE de formato fijo, y un par tena Clculos de formato
libre. Esto fue bastante decepcionante como RPGLE es ms de 21 aos de edad, los clculos de
formato libre de 14 aos de edad, incluso las definiciones de formato libre RPG est en su tercer
ao. Todos los ejemplos que encontr parecan demasiado complicados para un principiante, as que
decid crear este post mostrando un simple subfile programa escrito en RPG moderno.

Los ejemplos en este post son la forma en que escribira un programa de subarchivo simple usando
RPG totalmente gratis. Estoy seguro de que mis ejemplos no son la forma en que todos los
desarrolladores de IBM i escribiran los suyos. Probablemente hay tantas maneras de escribir un
programa de subarchivo que hay programadores que los escriben, cada uno con sus propios
peccadillos de codificacin.

Este ejemplo es para un subarchivo "Load all" (subfile size = 9999). Si desea utilizar un subarchivo
"Ampliacin" (subfile size> subfile page) o un subfile "Page a la vez" (subfile size = subfile page),
puede utilizar este ejemplo como punto de partida.

Permtanme comenzar con el archivo de visualizacin. El archivo de visualizacin de ejemplo consta


de cuatro partes:

Palabras clave de nivel de archivo


Formato de registro: SFL01 el registro de subarchivo
Formato de registro: CTL01 el registro de control de subarchivo
Formato de grabacin: REC01 el bit en la parte inferior para mostrar las teclas de funcin
Esto no va a ser un tutorial para explicar cada palabra clave en el archivo de visualizacin, slo voy a
sealar ciertas lneas y explicar por qu son la forma en que son.

Permtanme comenzar con las palabras clave de nivel de archivo:

01 A REF(ITMMST)
02 A DSPSIZ(24 80 *DS3)
03 A PRINT
04 A INDARA
05 A CA03(03 'F3=Exit')

Lnea 1: Este subarchivo va a mostrar datos del archivo ITMMST, por lo tanto, en mi
opinin es mejor que use la palabra clave REF para que yo pueda "referirme" a los
nombres de campo del archivo al definir campos en el resto de El archivo de
visualizacin.

Lnea 4: Aquellos de ustedes que son lectores regulares de este sitio web sabrn
que yo soy un proponente de usar el rea de Comunicacin de Indicadores para pasar
los valores de los indicadores hacia y desde los archivos de pantalla e impresora y
un programa de RPG. No voy a entrar en detalles sobre l como lo he escrito sobre
l anteriormente en el poste No More Number Indicators.
El registro de subarchivo es muy simple con slo cuatro campos. Hay un solo campo
de caracteres que se utilizar para que el usuario pueda introducir un valor para,
por ejemplo, editar, ver, eliminar, etc., el registro seleccionado.
06 A R SFL01 SFL
07 A Z1RRN 4S 0H
08 A Z1OPT 1A B 5 3
09 A ITMNBR R O 5 6
10 A ITMDESC R O 5 24

El formato de registro de control de subarchivo es ms largo que el formato de


registro de subarchivo, pero sigue siendo muy simple.

11 A R CTL01 SFLCTL(SFL01)
12 A SFLSIZ(9999)
13 A SFLPAG(0017)
14 A OVERLAY
15 A 31 SFLDSP
16 A 30 SFLDSPCTL
17 *** A N30 SFLDLT
17 A N30 SFLCLR
18 A 30 SFLEND(*MORE)
19 A CA05(05 'F5=Refresh')
20 A 1 2USER
21 A COLOR(BLU)
22 A 1 63TIME
23 A COLOR(BLU)
24 A 1 72DATE
25 A EDTCDE(Y)
26 A COLOR(BLU)
27 A Z1SCREEN 12A O 2 2COLOR(BLU)
28 A 2 72SYSNAME
29 A COLOR(BLU)
30 A 3 2'Position to:'
31 A COLOR(BLU)
32 A Z1POSITIONR B 3 15REFFLD(ITMNBR)
33 A COLOR(BLU)
34 A 4 2'Opt Item number +
35 A Item description +
36 A '
37 A DSPATR(UL)
38 A DSPATR(HI)

Lnea 12: Como este es un subarchivo "Load all" Quiero que mi subarchivo sea 9,999
registros.

Los registros de subarchivo de la Lnea 13: 17 aparecern en cada pantalla


(pgina).

Lneas 15 - 18: stas son las palabras clave del subarchivo necesarias para
controlar la visualizacin del subarchivo. Slo tengo que usar dos indicadores para
condicionarlos. El indicador 31 se utiliza slo para controlar la visualizacin del
subarchivo, si no hay registros en el subarchivo que no quiero mostrar. Indicador
30 se utiliza para toda la visualizacin del control de subarchivo, y quiero "Ms
..." para aparecer en la parte inferior de la pgina de subfile en lugar de un "+"
como creo que es ms agradable estticamente.

Enmienda: Brian Rusch hizo una sugerencia en un comentario a continuacin que tiene
sentido. En lugar de usar un SFLDLT en la lnea 17, un SFLCLR es mejor.
Lneas 20 - 26: siempre muestro el ID de usuario, la fecha y la hora en todos mis
archivos de visualizacin.

Lneas 27 - 29: Tambin muestro el "id de pantalla", que es el nombre del programa
con "-1" al final. Si el usuario tiene un problema con el programa les digo que me
den el nombre de la pantalla y s con qu programa trabajar. Nunca cdigo duro este
campo. Se toma de la estructura de datos del programa RPG. De esta manera, si copio
o cambio el nombre del programa siempre mostrar el nombre del programa actual.

Lneas 32 - 33: Estoy proporcionando un campo "Posicin a" para que el usuario
pueda colocar el inicio del subarchivo en un registro en el archivo, y luego el
programa carga el subarchivo desde ese punto.

El ltimo formato de grabacin realmente no necesita ninguna explicacin:

38 A R REC01
39 A 23 3'F3=Exit F5=Refresh'
40 A COLOR(BLU)

Y en el RPG. Para aquellos de ustedes que utilizan una versin de IBM i que no
permite las definiciones de formato libre tengo los equivalentes de formato fijo en
la parte inferior de este post aqu. Si no puede utilizar el RPG totalmente
gratuito, pero puede utilizar definiciones de formato libre, entonces tendr que
iniciar su cdigo en la octava columna e ignorar el ** FREE. Utilizo lo que llamo
subprocedimientos "abiertos" en lugar de subrutinas. Pero si prefiere usar
subrutinas puede reemplazar los subprocedimientos, reemplazando la llamada a los
procedimientos con EXSR, DCL-PROC con BEGSR y END-PROC con ENDSR.

Permtanme comenzar con la parte de las definiciones del programa de mi ejemplo:

01 **free
02 ctl-opt option(*nodebugio:*srcstmt:*nounref) dftactgrp(*no) ;

03 dcl-ds PgmDs psds qualified ;


04 PgmName *proc ;
05 end-ds ;

06 dcl-f SFL_DSPF workstn indds(Dspf) sfile(SFL01:Z1RRN) ;

07 dcl-c MaxSfl 9999 ;

08 dcl-ds Dspf qualified ;


09 Exit ind pos(3) ;
10 Refresh ind pos(5) ;
11 SflDspCtl ind pos(30) ;
12 SflDsp ind pos(31) ;
13 end-ds ;

14 dcl-f ITMMST keyed ;

15 dcl-s PrvPosition like(Z1POSITION) ;

16 Z1SCREEN = %trimr(PgmDs.PgmName) + '-1' ;

Lnea 1: Todo RPG totalmente libre tiene que empezar con un ** GRATIS.

Lnea 2: Como estoy usando subprocedimientos necesito la palabra clave DFTACTGRP en


mis opciones de control.
Lneas 3 - 5: Esta es la estructura de datos de mi estado del programa. Utilizo
esto para conseguir el nombre del programa que utilizo para el nombre de pantalla
en el formato del registro del control del subfile.

Lnea 6: Esta es la definicin del archivo de visualizacin que contiene el


subarchivo. Necesito el INDDS para dar el nombre de mi estructura de datos
Indicator Communication Area. La palabra clave SFILE es necesaria para cada
subarchivo, necesito dar el nombre del formato de registro de subarchivo y el
nombre del campo que se utiliza como una "clave numrica" para el subarchivo.

Lnea 7: Esta constante contiene el nmero mximo de registros que mi subarchivo


puede contener.

Lnea 8 - 13: Es la estructura de datos del rea de comunicacin del indicador. Lo


que me gusta de estas estructuras de datos es que puedo asignar un indicador desde
el archivo de visualizacin a un nombre significativo. Por ejemplo: el indicador 3
del archivo de visualizacin se denomina Dsp.Exit ya que los subcampos de la
estructura de datos estn calificados, vea el QUALIFICADO en la lnea 8. Esto es
mucho mejor que * IN03 o * INKC.

Lnea 14: Esta es la definicin para el archivo de Elemento maestro, que estoy
leyendo en clave de orden.

Lnea 15: PrvPosition se define como el campo de pantalla Z1POSITION. Voy a


utilizar esto para contener el valor anterior de Z1POSITION. En otros programas he
codificado esto como un campo oculto en el control de subarchivo, pero estoy
manteniendo este ejemplo simple.

Lnea 16: Esta no es una lnea de definicin. Es donde creo el nombre de pantalla
aadiendo "-1" al final del nombre del programa.

This next section is the code I need to handle the subfile. As I am using a "Load all" I do
not have to code of the user pressing the Page Up or Down key the subfile does all that
for me behind the scenes.

17 setll *loval ITMMSTR ;


18 LoadSubfile() ;

19 dow (1 = 1) ;
20 write REC01 ;
21 exfmt CTL01 ;

22 if (Dspf.Exit) ;
23 leave ;
24 elseif (Dspf.Refresh) ;
25 Z1POSITION = ' ' ;
26 PrvPosition = ' ' ;
27 setll *loval ITMMSTR ;
28 LoadSubfile() ;
29 iter ;
30 elseif (Z1POSITION <> PrvPosition) ;
31 PrvPosition = Z1POSITION ;
32 setll Z1POSITION ITMMSTR ;
33 LoadSubfile() ;
34 iter ;
35 endif ;

36 if (Dspf.SflDsp) ;
37 ReadSubfile() ;
38 endif ;
39 enddo ;

40 *inlr = *on ;
Line 17: Realmente no necesito esta lnea como el archivo se abre en el primer
registro.

Lnea 18: Esta es la llamada al procedimiento que carga el subarchivo.

Lnea 20: Formato de grabacin REC01 muestra las teclas de funcin en la parte
inferior de la pantalla. LO ESCRIBO aqu para superponer la pantalla anterior que
se muestra, esto es especialmente til si no hay registros para mostrar en el
subarchivo actual.

Lnea 21: El EXFMT del registro de control de subarchivo significa que el


procesamiento del programa permanece "dentro" del subarchivo hasta que se pulsa
Enter o una de las teclas de funcin vlidas. No es necesario ningn cdigo para
subir o bajar la pgina, ya que el subarchivo se ocupa de l mismo.

Lneas 22 - 23: Como Dsp.Exit es el equivalente del indicador 3, este cdigo slo
se ejecuta si se ha pulsado F3.

Lneas 24 - 29: Este es el cdigo para cuando se ha presionado la tecla F5. Utilizo
IF y ELSEIF en lugar del cdigo de operacin SELECT, puede obtener ms informacin
acerca de ELSEIF aqu. Todo este cdigo hace es volver a cargar el subarchivo desde
el comienzo del archivo.

Lneas 30 - 34: Si el usuario escribe algo en la "Posicin a" entonces utilizo


SETLL para reposicionar el puntero del archivo antes de recargar el subarchivo.

Lneas 36 - 38: Si no ha ocurrido nada de lo anterior, quiero ver si el usuario ha


introducido un valor en el campo de opcin del registro con el que quiere hacer
algo, lo cual se hace en el subprocedimiento ReadSubfile. Pero slo quiero llamar a
ese subprocedimiento si hay registros en el subarchivo. El indicador Dsp.SflDsp
slo estar activado si hay registros en el subarchivo.

El subprocedimiento LoadSubfile es donde se carga el subarchivo:

41 dcl-proc LoadSubfile ;
42 Dspf.SflDspCtl = *off ;
43 Dspf.SflDsp = *off ;
44 write CTL01 ;
45 Dspf.SflDspCtl = *on ;

46 Z1OPT = ' ' ;

47 for Z1RRN = 1 to MaxSfl ;


48 read ITMMSTR ;
49 if (%eof) ;
50 leave ;
51 endif ;

52 write SFL01 ;
53 endfor ;

54 if (Z1RRN > 1) ;
55 Dspf.SflDsp = *on ;
56 endif ;
57 end-proc ;
Lneas 42 - 44: Aqu es donde se elimina el subarchivo existente, Dspf.DspSflCtl =
* off, y como no estoy seguro de si ser ningn registro, establezco el indicador
que muestra el subarchivo, Dsp.DspSfl, en off. La supresin del subarchivo
existente no se produce hasta que escriba el registro de control de subarchivo.

Lnea 45: Voy a querer que el formato de registro de control de subarchivo se


muestre en todo momento por lo que aqu es donde se establece en el indicador que
seala que quiero mostrarlo.

Lnea 46: borro el campo de opcin para que todos los campos de opcin en el
subarchivo queden en blanco.

Lnea 47: Prefiero usar el cdigo de operacin FOR cuando necesito realizar un
bucle un nmero de veces. Si usted no lo ha utilizado usted debe comprobar hacia
fuera el poste PARA substituye HAGA en RPGLE. Z1RRN es el campo "clave" para el
subarchivo, en cada registro de subarchivo Z1RRN debe contener un nmero secuencial
nico. La sentencia dice que el conjunto Z1RRN a uno, a continuacin, incrementarlo
por uno cada vez que el ciclo For ciclos para el nmero de veces que se mantiene en
la constante MaxSfl.

Lneas 48 - 52: El procesamiento dentro del For-loop es muy simple. Leer un


registro, escribir en el subarchivo, hasta que el final del archivo o el bucle se
haya realizado el nmero de veces prescrito.
Lnea 54 - 56: Slo quiero mostrar el subarchivo si contiene algn registro. Si
slo se ha escrito un registro en el subfile Z1RRN contendr dos, y si se
escribieran ms registros, el nmero sera mayor.

El otro subprocedimiento maneja cualquier valor introducido en el campo de opcin


del subarchivo.

58 dcl-proc ReadSubfile ;
59 dow (1 = 1) ;
60 readc SFL01 ;
61 if (%eof) ;
62 leave ;
63 endif ;

//Do something depending on value in Z1OPT

64 Z1OPT = ' ' ;


65 update SFL01 ;
66 enddo ;
67 end-proc ;

Lneas 60 - 63: RPG nos proporciona el cdigo de operacin READC para su uso con
subarchivos. Slo lee registros de subarchivo modificados, que sern aquellos en
los que el usuario ha introducido un valor en el campo de opcin, ya que es el
nico campo en el subarchivo que puede recibir entrada. Despus de que se han ledo
todos los registros modificados o no hay registros cambiados, se activa el
indicador de fin de archivo.

Lneas 64 - 65: Despus de realizar cualquier procesamiento, necesito borrar el


campo de opcin del registro de subarchivo y, a continuacin, necesito actualizar
el registro de subarchivo para borrar el campo de opcin en la pantalla.

Como he dicho, este es un subarchivo de ejemplo muy simple. Usted puede hacer el
suyo mucho ms complicado si usted lo desea. Espero que esto sea de utilidad para
las personas que escriben su primer subfile programa, y como otro ejemplo de uso de
formato libre RPG de definicin.

You might also like