Professional Documents
Culture Documents
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.
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
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.
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.
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.
01 **free
02 ctl-opt option(*nodebugio:*srcstmt:*nounref) dftactgrp(*no) ;
Lnea 1: Todo RPG totalmente libre tiene que empezar con un ** GRATIS.
Lnea 14: Esta es la definicin para el archivo de Elemento maestro, que estoy
leyendo en clave de orden.
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.
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 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.
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.
41 dcl-proc LoadSubfile ;
42 Dspf.SflDspCtl = *off ;
43 Dspf.SflDsp = *off ;
44 write CTL01 ;
45 Dspf.SflDspCtl = *on ;
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 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.
58 dcl-proc ReadSubfile ;
59 dow (1 = 1) ;
60 readc SFL01 ;
61 if (%eof) ;
62 leave ;
63 endif ;
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.
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.