rpg tutorial

141
Lenguaje RPG400 ©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España. http://www.recursos-as400.com 1

Upload: juan-lafuente

Post on 03-Nov-2014

526 views

Category:

Documents


100 download

TRANSCRIPT

Page 1: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

1

Page 2: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

2

Nació la idea de desarrollar este Tutorial una noche embarcado en la Fragata A.R.A LIBERTAD Atlántico Sur, lo comencé a escribir a bordo del velero 'Goleta Sarandi' en Buenos Aires Argentina y lo finalice a bordo del velero 'Sudaca forever ' Michigan EEUU. Dedicado a mis hijos Diego Andres y Juan Alberto, a mi Madre, a Galicia en memoria de mi Padre, a toda mi familia y amigos en Argentina, España y United State of America.

Daniel Hugo Enriquez Leivas

25 de Septiembre de 2002 Buenos Aires Argentina

Page 3: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

3

INDICE

1. INTRODUCCION 2. OPERACIONES ARITMETICAS.

Operación ADD. Operación DIV. Operación MULT. Operación MVR. Operación SQRT. Operación SUB. Operación XFOOT. Operación Z-ADD. Operación Z-SUB.

3. OPERACIONES DE MOVIMIENTO

Operación MOVE. Operación MOVEA. Operación MOVEL

4. OPERACIONES DE MOVIMIENTO DE ZONA Operación MHHZO. Operación MHLZO. Operación MLHZO. Operación MLLZO.

5. OPERACIONES DE ESTABLECIMIENTO DE INDICADOR. Operación SETON. Operación SETOF 6. OPERACIONES CON SERIES

Operación CAT. Operación check. Operación CHECR. Operación SCAN. Operación SUBST. Operación XLATE.

7. OPERACIONES DE MATRIZ

Operación LOKUP. Operación MOVEA. Operación SORTA. Operación XFOOT.

Page 4: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

4

8. OPERACIONES DE COMPARACION

Operación COMP. Operación Fis. Operación AND. Operación Hors. Operación CABxx. Operación CASxx. Operación DOUxx. Operación DOWxx. Operación Ex.

9. OPERACIONES DE SUBRUTINA

Operación BEGSR. Operación ENDSR. Operación EXSR. Operación CASxx.

10. PROCESO DE BASE DE DATOS

Definiciones externas e internas. Archivos de solo lectura. Archivos de Salida. Archivos de actualización.

11. OPERACIONES CON BASES DE DATOS

Operación SETLL. Operación READ. Operación SETGT. Operación READP. Operación READE. Operación READC. Operación CHAIN. Operación WRITE. Operación UPDAT. Operación DELET. Operación OPEN. Operación CLOSE. Operación FEOD. Operación UNLCK. Operación EXCPT.

12. OPERACIONES DE LLAMADA Y DECLARATIVAS

Operacion CALL. Operacion FREE. Operación PARM. Operación PLIST. Operación RETRN. Operación KFLD. Operación KLIST.

13. OPERACIONES DE AREA DE DATOS

Operacion IN. Operacion OUT. Operación UNLCK. 14. OPERACIONES DE INICIALIZACION

Operación CLEAR. Operación RESET.

Page 5: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

5

15. OPERACIONES DE INFORMACION

Operación DEBUG. Operación DUMP. Operación SHTDN. Operación TIME.

16. OPERACIONES DE BITS Operación BITOF. Operación BITON. Operación TESTB.

17. OPERACIONES DECLARATIVAS Y DE LLAMADA

Operación CALL. Operación PARM. Operación PLIST. Operación RETRN. Operación FREE. Operación DEFN. Operación KLIST. Operación KFLD.

18. SUBFILE

Formato de registro SFL. Formato de registro SFLCTL. SLFSIZ . SFLPAG. SFLEND. SFLCLR. Inicialización de subfile. Grabar un subfile. Actualizar un subfile. Desplegar un subfile.

Page 6: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

6

1. INTRODUCCION Ha transcurrido mas de treinta años desde que naciera tímidamente el lenguaje RPG. En sus albores fue concebido simplemente para realizar reportes de datos debido a su fácil y rápida programación en comparación a los extensos y tediosos programas en COBOL. En la década del setenta se contaba con maquinas como las IBM 360 o el sistema 3 de la misma compañía. Al ver el éxito de este lenguaje la empresa IBM lo potencio y comenzó a difundirse por sobre todo en sus sistemas IBM/34, IBM/36, IBM/38 hasta llegar a nuestros días, donde se le utiliza en las diversas aplicaciones en IBM AS/400. Fueron los años y la tecnología lo que permitió su evolución, primero al RPG II luego el RPG III en el S/38, hasta nuestros días con el RPG/400, RPG IV y RPG ILE. Desde su nacimiento este lenguaje cuenta con un ciclo propio de procesamiento y una sintaxis en su codificación estructurada y facilitada por medio de formularios (Hojas) que cumplen determinadas funciones. Es así como tenemos una hoja para definir los archivos o bases de datos a utilizar en los programas identificada con 'F' -FILE-, una hoja I -INPUT- donde realizamos las definiciones internas, la hoja 'C' - CALC - donde realizamos las operaciones de calculo y procesamiento de archivos y una hoja 'O' OUTPUT - donde establecemos las salidas de datos. Además por medio del AS/400 que nos permite trabajar con bases de datos relacionales cuenta con definiciones externas de las mismas, definiciones externas de pantallas y de reportes de impresión. También no olvidaremos las hojas E - Extensión - para definir tablas y matrices como la Hoja - L - que nos permite establecer longitudes de formularios no standart. Estos formularios cuentan con una serie de columnas que deberemos codificar respetando estrictamente la sintaxis. Algunas de estas columnas serán opcionales, por lo tanto no necesaria su codificación y otras obligatorias, siempre considerando lo que estamos programando y el objetivo deseado.

Page 7: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

7

El RPG identifica cada una de estas hojas ya que las mismas llevan en la columna numero 6 su identificación según corresponda, una F para la hoja File, una C para la hoja Calc,etc. El éxito de una buena codificación y programación no solo se deberá al cumplimiento del uso de una correcta sintaxis sino también al buen dominio de las diferentes sentencias y comandos de este lenguaje. Desarrollaremos cada una de las formas de codificación y veremos en el transcurso de este manual todos los comandos y su manera de emplearlos. En el ultimo capitulo analizaremos una serie de programas que nos permitirán obtener una acabada forma de la codificación y utilización del RPG/400.

Page 8: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

8

2. OPERACIONES ARITMETICAS Las operaciones aritméticas son: ADD sumar DIV dividir MULT multiplicar MVR mover resto SQRT raiz cuadrada SUB restar XFOOT sumar los elementos de una matriz Z-ADD establecer a cero y sumar Z-SUB borar a cero y restar En el RPG/400 cuando usted quiere trabajar con operaciones aritméticas, las mismas se podrán realizar con campos numéricos. Estas operaciones se realizan en formato decimal empaquetado y los datos contenidos en otros factores también se convierten en formato decimal empaquetado. Al realizar cualquier operación de suma, resta, división, multiplicación todo campo que se ubique en el campo de resultado sustituye los datos que hubiera en dicho campo. Deberá considerar que este campo de resultado debe ser lo suficientemente grande como para almacenar el resultado de la operación. Cuando realizamos una operación aritmética tenemos la posibilidad de establecer un redondeo de los valores decimales excepto en la operación MVR ( mover resto. Todas las operaciones aritméticas tienen signo ( un signo mas es una F hexadecimal y un signo menos es una D hexadecimal. El signo ocupa la parte de byte de orden inferior. Veremos a continuación cada una de las operaciones aritmeticas que podemos realizar con este lenguaje.

Page 9: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

9

ADD ( sumar ) Para realizar la operación de suma en RPG/400 deberemos utilizar la operación ADD. Esta operación suma el contenido del factor 1 al del factor 2 y almacena el resultado de la misma en el campo de resultado. Por ejemplo si quisiéramos sumar al campo STOCK la cantidad que nos han remitido por la ultima compra efectuada de un determinado articulo, campa COMPRA, en la columna factor 1 pondríamos STOCK, en la columna código de operación la instrucción ADD, en la columna factor 2 COMPRA y en el campo de resultado STOCK. Supongamos que en la base de datos de los artículos de nuestra empresa el campo STOCK es igual a 1025 TN y la cantidad que ingresa por una nueva compra es 65 TN, la operación aritmética suma codificada en la hoja de calculo del RPG/400 será la siguiente, 0026.00 C*------------------------------------------------- 0027.00 C* HOJA DE CALCULO 0028.00 C*------------------------------------------------- 0028.01 C STOCK ADD COMPRA STOCK 0028.02 C* 0028.03 C* ADICIONA EL CONTENIDO DEL CAMPO COMPRA AL CAMPO STOCK 28.04 C* Observe la edición de la sentencia 0028.01 Prompt type . . . C Sequence number . . . 0028.01 Level N01N02N03 Factor 1 Operation Factor 2 Result STOCK ADD COMPRA STOCK Decimal Length Positions H/N/P HI LO EQ Comment

Page 10: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

10

Luego que el RPG/400 realice la operación ADD el nuevo contenido del campo STOCK en el campo de resultado será 1090. 0026.00 C*------------------------------------------------ 0027.00 C* HOJA DE CALCULO 0028.00 C*------------------------------------------------ 0028.01 C STOCK ADD COMPRA STOCK 0028.02 C* 1025 + 65 1090 Otra cuestión a considerar en las aperaciones de suma son los signos que contienen cada uno de los factores. Si el factor 1 y el factor 2 tienen el mismo signo, el signo campo de resultados es el mismo. Si el factor 1 y el factor 2 tienen distinto signo, el signo del campo de resultado es el mismo que el signo del factor con mayor valor absoluto. Ampliaremos estos conceptos analizando los siguientes ejemplos que nos permitirán clarificar las reglas de los signos en los cálculos aritméticos del operando suma.

CAMPO CONTENIDO

CAMPO CONTENIDO

CAMP01

2.00 CAMP02

10.00

CAMP03

55.00 CAMP04

-20

CAMP05

0,5 CAMP06

8.85

TAB 2 , 4.6 , 7 Para los ejemplo utilizaremos campos auxiliares ( auxxx) definidos en la hoja de calculo como numéricos de nueve posiciones con 0, 2 y 4 decimales respectivamente.

Page 11: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

11

Prompt type . . . C Sequence number . . . 0028.01 Level N01N02N03 Factor 1 Operation Factor 2 Result CAMP01 ADD CAMP02 AUX01 Decimal Length Positions H/N/P HI LO EQ Comment

9 2 0026.00 C*------------------------------------------------- 0027.00 C* HOJA DE CALCULO 0028.00 C*------------------------------------------------- 0028.01 C CAMP01 ADD CAMP02 AUX01 92 0028.02 C CAMP05 ADD CAMP06 AUX02 90 0028.03 C CAMP03 ADD CAMP04 AUX03 94 0028.04 C* 0028.05 C*

Factor 1 Operación Factor 2 Campo de resultado

RESULTADO

CAMP01 ADD CAMP02 AUX01 9 2 57.00 CAMP05 ADD CAMP06 AUX02 9 0 8 CAMP03 ADD CAMP04 AUX03 9 4 35.00 ADD CAMP05 CAMP03 10,05

Las operaciones de suma entre los campos CAMP05 y CAMP06 arroja como resultado 8 debido a que el campo de resultado AUX02 fue definido con nueve posiciones con cero decimal quedando truncada las posiciones decimales. Todo campo auxiliar y cualquier otro campo sea numérico o alfanumérico que no este definido por medio de una definición externa o interna deberemos definirlo en la hoja de calculo estableciendo su longitud en todos los casos y para aquellos campos numéricos la cantidad de decimales. Esta cantidad de decimales es la que le indica al RPG/400 que el campo es numerico, por ejemplo si deseamos definir un campo numerico entero de nueve posiciones codificaremos su longitud ( 9) y cero decimal ( 0.

Page 12: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

12

0026.00 C*------------------------------------------------- 0027.00 C* HOJA DE CALCULO 0028.00 C*------------------------------------------------- 0028.01 C* 0028.02 C* 0028.03 C ADD CAMP05 CAMPO3 0028.04 C* 0028.05 C* En el ejemplo observara que no hemos codificado ningún campo en el factor 1, deseamos sumar el contenido del CAMP05 al CAMP03 y guardar su resultado en el CAMP03, por lo que nos es necesario su codificación en el factor en cuestión, ya que el RPG/400 al no codificar ningún campo en el factor 1 asume que el valor actual del campo de resultado debe sumarle el valor del factor 2 y guardarlo en el campo de resultado. SUB ( restar) La operación aritmética resta, se realiza por medio del comando SUB. Esta operación resta el contenido del factor 2 al factor 1 y el resultado se almacena en el campo de resultado. En la operación de sustracción deberá cambiar el signo del factor 2 y aplicar las reglas de la adición. 0026.00 C*------------------------------------------------- 0027.00 C* HOJA DE CALCULO 0028.00 C*------------------------------------------------- 0028.01 C CAMP02 SUB CAMP05 AUX01 92 0028.02 C SUB CAMP06 AUX02 112 0028.03 C CAMP03 SUB CAMP05 AUX03 122 0028.04 C CAMP03 SUB CAMP06 AUX04 92 0028.05 C*

Page 13: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

13

Factor 1 Operación Factor 2 Campo de

resultado L D RESULTADO

CAMP02 SUB CAMP05 AUX01 9 2 1.50 SUB CAMP06 AUX02 1

1 2 -8.95

CAMP03 SUB CAMP05 AUX03 12

2 75.00

CAMP03 SUB CAMP06 AUX04 9 2 46.05 Observara en el ejemplo que en la sentencia donde restamos el CAMP06 se ha omitido el factor 1, deberá entender que es lo mismo que codificar lo siguiente AUX02 SUB CAMP06 AUX02 11 2 -8.95 MULT ( multiplicar) La operación aritmética multiplicar se realiza por medio del operando MULT. Esta operación multiplica el contenido del factor 1 por el contenido del factor 2 y almacena el resultado en el campo de resultado. Deberá observar en esta operación la siguiente regla: Si el factor 1 y el factor 2 tienen signos iguales, el signo del campo de resultados es ( +. Si el factor 1 y el factor 2 tienen signos distintos, el signo del campo de resultados es ( - ) 0026.00 C*------------------------------------------------- 0027.00 C* HOJA DE CALCULO 0028.00 C*------------------------------------------------- 0028.01 C CAMP02 MULT CAMP05 AUX01 92 0028.03 C CAMP03 MULT CAMP05 AUX03 110 0028.04 C CAMP01 MULT CAMP04 AUX04 92H 0028.05 C* 0028.06 C*

Page 14: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

14

Factor 1 Operación Factor 2 Campo de

resultado L D RESULTADO

CAMP02 MULT CAMP05 AUX01 9 2 5.00 CAMP03 MULT CAMP05 AUX03 1

1 0 27

CAMP01 MULT CAMP04 AUX04 9 2 -80.00 Observe en la hoja 'C' en la sentencia 0028.04 el campo de resultado AUX04 se ha codificado con una 'H' que le indica al RPG/400 que deberá redondear los resultados de la operación. 0028.06 C* Prompt type . . . C Sequence number . . . 0028.04 Level N01N02N03 Factor 1 Operation Factor 2 Result CAMP01 MULT CAMP04 AUX04 Decimal Length Positions H/N/P HI LO EQ Comment 9 2 H Z-ADD ( establecer a cero y sumar) Esta operación primero pone a ceros el campo de resultados y luego le adiciona el contenido del campo indicado en el factor 2. Si previo a la ejecución esta operación el campo de resultado contiene algún valor, el mismo será restablecido a ceros y luego se le adicionara el campo del factor 2. 0026.00 C*------------------------------------------------- 0027.00 C* HOJA DE CALCULO 0028.00 C*------------------------------------------------- 0028.01 C Z-ADDCAMP05 AUX01 92 0028.03 C Z-ADDCAMP06 CAMPO3 0028.05 C* 0028.06 C*

Page 15: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

15

Factor 1 Operación Factor 2 Campo de

resultado L D RESULTADO

Z-ADD CAMP05 AUX01 9 2 0,50 Z-ADD CAMP06 CAMP03 11 2 8.95 DIV ( dividir) La operación aritmética de dividir esta representada por la operación DIV. Esta operación divide el contenido del factor 1 por el contenido del factor 2 y almacena el resultado en el campo de resultado. Durante la ejecución de esta sentencia el RPG/400 observará la siguiente regla: Si el factor 1 y el factor 2 tienen signos iguales, el signo del campo de resultados es mas ( + ). Si el factor 1 y el factor 2 tienen signos distintos, el signo del campo de resultados es ( - ). 0026.00 C*----------------------------------------------- 0027.00 C* HOJA DE CALCULO 0028.00 C*----------------------------------------------- 0028.01 C CAMP02 DIV CAMP05 AUX01 92 0028.03 C CAMP04 DIV CAMP01 AUX03 114 0028.04 C CAMP06 DIV CAMP03 AUX04 126 0028.05 C* 0028.06 C* 0028.07 C CAMP04 DIV CAMP01 AUX03 114H Factor 1 Operación Factor 2 Campo de

resultado L D RESULTADO

CAMP02 DIV CAMP05 AUX01 9 2 20.00 CAMP04 DIV CAMP01 AUX03 11 4 0,3636 CAMP06 DIV CAMP03 AUX04 12 6 0.162727

Page 16: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

16

En la última sentencia hemos repetido la división del campo CAMP04 dividido CAMP01 pero le hemos pedido al RPG/400 que redondee el resultado de la operación mediante la codificación en la respectiva columna de la letra H, en este caso el resultado almacenado en el campo AUX03 será 0,3640. Deberá recordar que para las operaciones ADD, SUB, MULT y DIV, el factor 1 no es necesario. Si no se especifica el factor 1, la operación se realiza como si el factor 1 y el campo de resultados fuesen el mismo campo. SQRT ( raíz cuadrada ) Esta operación nos permite extraer la raiz cuadrada de un campo y almacenar su resultado en el campo de resultados. FMT * ..... *. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 0027.00 C* HOJA DE CALCULO 0028.00 C*------------------------------------------------- 0028.01 C SQRT CAMP01 AUX01 92 0028.03 C SQRT CAMP02 CAMP03 0028.04 C* 0028.05 C* RESULTADO DESPUES DE REALIZAR LA SENTENCIA 28.01 ES 0028.06 C* 1.41 0028.07 C* RESULTADO DESPUES DE REALIZAR LA SENTENCIA 28.03 ES 0028.08 C* 3.16 XFOOT ( sumar elementos de una matriz ) Con la operación XFOOT podemos realizar la suma de series o matrices. El resultado de sumar los elementos de las las series o matrices codificadas en el factor 2 se almacena en el campo de resultado. En el siguiente ejemplo sumaremos todos los elementos de la serie TAB y este resultado lo almacenaremos en el campo de resultados que contiene al campo AUX01definido como numérico de 9 posiciones en total y dos de las cuales son decimales.

Page 17: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

17

0026.00 C*------------------------------------------------- 0027.00 C* HOJA DE CALCULO 0028.00 C*------------------------------------------------- 0028.01 C XFOOTTAB AUX01 92 0028.04 C* 0028.06 C* 0028.08 C* Las series o matrices se definen en la Hoja 'E'. En la medida que desarrollemos otros ejemplos sé vera la forma de definirlas en esta hoja. Ejemplos sobre distintas operaciones aritméticas 0026.00 C*------------------------------------------------- 0027.00 C* HOJA DE CALCULO 0028.00 C*------------------------------------------------- 0028.01 C Z-ADD*ZEROS AUX01 0028.02 C Z-ADD*ZEROS AUX02 0028.03 C* 0028.04 C CAMP01 ADD CAMP02 AUX01 0028.05 C AUX01 MULT CAMP03 AUX02 0028.06 C 05 SQRT AUX01 AUX01 0028.07 C CAMP02 DIV AUX01 CAMP03 0028.08 C* 0028.09 C*PRIMERO HEMOS PUESTO A CERO LOS CAMPOS AUX01 Y AUX02 0028.10 C*POR MEDIO DE *ZEROS QUE MUEVE CEROS A UN CAMPO NUMERICO 0028.11 C* 0028.12 C*OBSERVE LA SENTENCIA 28.06 VEMOS LA OPERACION SQRT. LA 0028.13 C*EJECUCION DE ESTA LINEA SE ENCUENTRA CONDICIONADA POR UN 0028.14 C*INDICADOR ( EN ESTE CASO 05 ). SI ESTE INDICADOR SE ENCUENTRA 0028.15 C*ACTIVO LA SENTENCIA SE EJECURA, EN CASO CONTRARIO EL RPG/400 0028.16 C*IGNORARA LO CODIFICADO EN LA LINEA 28.06 0028.17 C*

Page 18: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

18

Supongamos que debemos calcular un descuento del 10 % en el total de una factura de servicios telefonicos. El total bruto antes de realizar las operaciones para calcular descuento se encuentra en el campo TOTBRU cuyo monto es de 1.153 .00 pesos y almacenaremos el total con descuento en el campo TOTNET, sobre este ultimo campo calcularemos el IVA según la alícuota que aplica Telefónica de España en Argentina del 27 % por sus prestaciones de telefonía, bueno si le parece algo elevado esta alícuota mejor ni le cuento el valor del pulso telefónico. Veremos a continuación como codificaríamos estas sentencias para que puedan ser interpretadas y ejecutadas en el lenguaje RPG/400. Observara que en las primeras sentencias sé inicializan los campos auxiliares que utilizaremos ya que las mismas pueden ser parte de un programa que ejecutará este calculo por cada registro de una base de datos que contiene millones de usuarios y deberemos asegurarnos que esos campos se encuentren sin valores de cálculos de registros anteriores. 0026.00 C*------------------------------------------------- 0027.00 C* HOJA DE CALCULO 0028.00 C*------------------------------------------------- 0028.01 C Z-ADD*ZEROS AUX01 112 0028.02 C Z-ADD*ZEROS TOTNET 112 0028.03 C Z-ADD*ZEROS TOTIVA 112 0028.04 C Z-ADD*ZEROS TOTFAC 112 0028.05 C* 0028.06 C TOTBRU MULT 0.10 AUX01 0028.07 C TOTBRU SUB AUX01 TOTNET 0028.08 C TOTNET MULT 0.27 TOTIVA 0028.09 C TOTNET ADD TOTIVA TOTFAC 0028.10 C* 0028.11 C*PRIMERO HEMOS PUESTO A CERO LOS CAMPOS AUX01, TOTNET 0028.12 C*TOTIVA, TOTFAC. 0028.13 C*----------- 0028.14 C*RESULTADOS: 0028.15 C*----------- 0028.16 C*AUX01 = 115.30 0028.17 C*TOTNET = 1037.70 0028.18 C*TOTIVA = 280.18 0028.19 C*TOTFAC = 1317.88 0028.20 C* 0028.21 C*

Page 19: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

19

Con la intención de analizar distintas situaciones que clarifiquen el uso y codificación de las operaciones aritméticas por unos minutos nos convertiremos en agentes bursátiles y realizaremos algunos cálculos sobre las operaciones de compra y venta de acciones de la empresa VITALCARIE COOPORATION. Operación de compra: Precio por acción: 10 dolares Cantidad comprada: 500 Comisión de compra: 1% Operación de Venta: Precio por acción: 12 dolares Cantidad vendida: 500 Comisión de Venta: 1% Deseamos saber cual es la ganancia antes de aplicarle la alícuota de impuestos a las ganancias, que ha obtenido el inversor luego de un periodo de tres meses. FMT * ..... *. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 *************** Beginning of data *************** 001.00 H*------------------------------------------------- 002.00 H* SISTEMA : EJEMPLOS RPG/400 TUTORIAL I 003.00 H* BS. AS. ARGENTINA 004.00 H* DANIEL HUGO ENRIQUEZ LEIVAS 005.00 H* PROGRAMA: PROG10 006.00 H* FECHA : 2002 007.00 F*------------------------------------------------- 008.00 F* HOJA FILE 009.00 F*------------------------------------------------- 010.00 FACCION IF F 256 6AI 1 DISK 012.00 FLISTA O E 60 PRINTER 026.00 C*------------------------------------------------- 027.00 C* CALCULO ACCIONES DE VITALCARIE S.A. 28.0 C*-------------------------------------------------

Page 20: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

20

Observemos las sentencias de calculo en la Hoja 'C' y los comentarios insertados en ella por medio de codificar un asterisco a continuación de la letra C que identifica dicha hoja. Esto es una buena forma de documentar o comentar determinados cálculos o acciones dentro de un programa RPG/400. 028.01 C Z-ADD*ZEROS AUX01 112 028.02 C Z-ADD*ZEROS AUX02 112 0028.03 C Z-ADD*ZEROS AUX03 112 0028.04 C Z-ADD*ZEROS AUX04 112 0028.05 C* 0028.06 C* PRECC = PRECIO UNITARIO POR ACCION A LA COMPRA 0028.07 C* PRECV = PRECIO UNITARIO POR ACCION A LA VENTA 0028.08 C* CANTC = CANTIDAD COMPRADA 0028.09 C* CANTV = CANTIDAD VENDIDA 0028.10 C* COMIC = COMISION DE COMPRA 0028.11 C* COMIV = COMISION DE VENTA 0028.12 C* TOTCOM = IMPORTE DE COMPRA + COMISIONES 0028.13 C* TOTVEN = IMPORTE DE VENTA - COMISIONES 0028.14 C* TOTGAN = TOTAL GANANCIA ANTES DE IMPUESTOS 0028.15 C* 0028.16 C CANTC MULT PRECC AUX01 0028.17 C AUX01 MULT COMIC AUX02 0028.18 C AUX01 ADD AUX02 TOTCOM 0028.19 C* 0028.20 C CANTV MULT PRECV AUX03 0028.21 C AUX03 MULT COMIV AUX04 0028.22 C AUX03 SUB AUX04 TOTVEN 0028.23 C* 0028.24 C TOTVEN SUB TOTCOM TOTGAN 0028.25 C* 0028.26 C* 0028.29 C*----------- 0028.30 C*RESULTADOS: 0028.31 C*----------- 0028.32 C*AUX01 = 5000.00 0028.33 C*AUX02 = 50.00 0028.34 C*AUX03 = 6000.00 0028.35 C*AUX04 = 60.00 0028.36 C* 0028.37 C*TOTCOM = 5050.00 0028.38 C*TOTVEN = 5940.00 0028.39 C*TOTGAN = 890.00 0028.40 C*

Page 21: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

21

2. OPERACIONES DE MOVIMIENTO Las operaciones de movimiento son: MOVE ( Mover ) MOVEL ( Mover por la izquierda ) MOVEA ( Mover Matriz ) MOVE ( Mover ) Estas operaciones nos permiten transferir caracteres contenidos dentro de un campo o constante literal desde el Factor 2 al campo de resultados. MOVE ( Mover ) En la operación MOVE la transferencia comienza por el carácter mas a la derecha del factor 2. 0026.00 C*------------------------------------------------- 0027.00 C* OPERACION MOVE 0028.00 C*------------------------------------------------- 0028.01 C MOVE 'LIMA' AUX01 4 0028.02 C MOVE 'LIMA' AUX02 6 0028.03 C MOVE AUX02 AUX03 6 0028.04 C* 0028.05 C*

Factor 1 Operación Factor 2 Campo de resultado

L D RESULTADO

MOVE 'LIMA' AUX01 4 LIMA MOVE 'LIMA' AUX02 6 LIMA

Page 22: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

22

Observara que en la primera operación MOVE el campo de resultado tiene todas sus posiciones con caracteres esto se debe a que su longitud es de 4 caracteres y la constante 'LIMA' también lo es. En la segunda operación MOVE vemos en el campo de resultado de 6 posiciones la constante literal 'LIMA' ha quedado alineada por la derecha y los dos primeras posiciones están en blanco. En la ultima movemos el contenido de un campo en este caso AUX02 al campo de resultados AUX03. MOVEL ( Mover por la izquierda) Esta operación transfiere caracteres desde el Factor 2 al campo de resultados. La transferencia comienza por el carácter mas a la derecha del factor 2. 0026.00 Cha------------------------------------------------- 0027.00 C* OPERACION MOVEL 0028.00 C*------------------------------------------------- 0028.01 C MOVEL'LIMA' AUX01 4 0028.02 C MOVEL'LIMA' AUX02 6 0028.03 C MOVEL'LIMA' AUX03 6 0028.04 C* 0028.05 C* Factor 1

Operación

Factor 2

Campo de resultado

L D RESULTADO

MOVEL 'LIMA' AUX01 4 LIMA MOVEL 'LIMA' AUX02 6 LIMA MOVEL 'LIMA' AUX03 6 LIMAXX La primera operación MOVEL 'LIMA' mueve a un campo de longitud cuatro caracteres de longitud, por lo tanto ocupa todas las posiciones del campo de resultados. La segunda operación MOVEL 'LIMA' mueve a un campo de longitud 6 caracteres y por lo tanto los dos caracteres de la derecha queda en blanco si el campo AUX02 estaba vació (inicializado. El la tercer operación MOVEL 'LIMA' a AUX03 tenemos que el campo AUX03 antes de la operación MOVEL contenía 'XXXXXX' por lo tanto después de esta operación su contenido es 'LIMAXX'.

Page 23: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

23

Suponga que necesitamos acceder a un archivo por medio de una clave compuesta por numero de cliente, tipo de comprobante y numero. Para ello necesitaremos armar una clave de acceso que contenga esos datos. 0026.00 C*------------------------------------------------- 0027.00 C* OPERACIONES MOVEL Y MOVE 0028.00 C*------------------------------------------------- 0028.01 C MOVELCLIEN CLAVE 14 0028.02 C MOVEL'FC' AUX01 8 0028.03 C MOVE CPBTE AUX01 0028.04 C MOVE AUX01 CLAVE 0028.05 C* 0028.06 C* CLIEN = CAMPO CON EL NUMERO DE CLIENTE DE 6 POSICIONES 0028.07 C* FC =CONSTANTE LITERAL COMPROBANTE FACTURA 0028.08 C* CPBTE = NUMERO DE COMPROBANTE DE 6 POSICIONES 0028.09 C* AUX01 = CAMPO AUXILIAR 0028.11 C* PRIMERA OPERACION MOVEL CLAVE = '001287________' 0028.12 C* SEGUNDA OPERACION MOVEL AUX01 = 'FC______' 0028.13 C* PRIMERA OPERACION MOVE AUX01 = 'FC528734' 0028.14 C* SEGUNDA OPERACION MOVE CLAVE = '001287FC528734' MOVEA ( Mover matriz ) Esta operación transfiere valores de caracteres alfabéticos o numéricos del factor 2 al campo de resultado. Puede utilizar MOVEA con una matriz empaquetada binaria, con zona o de caracteres. Con MOVEA podemos mover varios elementos contiguos de una matriz de caracteres a un único campo de caracteres. Mover un único campo de caracteres a varios elementos contiguos de una matriz de caracteres. Mover elementos contiguos de una matriz a elementos contiguos de otra matriz. Cuando utilizamos MOVEA para mover caracteres tanto el factor 2 como el campo de resultados deben definirse como de caracteres. Cuando la utilizamos con datos numéricos debemos observar que, las matrices deben estar definidas por la misma longitud numérica. Supongamos que tenemos las siguientes matrices.

Page 24: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

24

Contenido: Nombre :MATX Un elemento dos caracteres 1 2 3 4 5 6 7 8 9 0 Nombre: MATY Contenido: Un elemento de caracteres A A B B C C D D E E F F Observemos, tenemos dos matrices sin indexar, de diferente longitud de matriz e igual longitud de elementos 0026.00 C*------------------------------------------------ 0027.00 C* OPERACION MOVEA 0028.00 C*------------------------------------------------ 0028.01 C MOVEAMATY MATX 0028.02 C* Factor 1

Operación Factor 2 Campo de resultado

L D

MOVEA MATX MATY Resultado después de MOVEA 1 2 3 4 5 6 7 8 9 0 F F Mover matriz a matriz con campo de resultado indexado. 0026.00 C*------------------------------------------------- 0027.00 C* OPERACION MOVEA 0028.00 C*------------------------------------------------- 0028.01 C MOVEAMATY MATX,3 28.02 C*

Page 25: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

25

Factor 1

Operación Factor 2 Campo de resultado

L D

MOVEA MATX MATY,3 Resultado A A B B 1 2 3 4 5 6 Mover matriz a matriz , sin indexar y elementos de matriz de longitud diferentes. MATX elemento dos caracteres, MATY elementos 3 caracteres. Factor 1

Operación

Factor 2

Campo de resultado

L D

MOVEA MATX MATY MATX 1 2 3 4 5 6 7 8 9 0 MATY A A A B B B C C C D D D Resultado 1 2 3 4 5 6 7 8 9 0 D D 3. OPERACIONES DE MOVIMIENTO DE ZONA MHHZO ( Mover zona de la parte superior a la parte superior) MHLZO ( Mover zona de la parte superior a la parte inferior)

Page 26: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

26

MLHZO ( Mover zona de la parte inferior a la parte superior) MLLZO ( Mover zona de la parte inferior a la parte inferior) MHHZO ( Mover zona de la parte superior a la parte superior) Esta operación mueve la parte de zona de un carácter desde la zona mas a la izquierda del factor 2 a la zona extrema izquierda del campo de resultados. Tanto el factor 2 como el campo de resultados deben ser campos definidos de tipo carácter. MHLZO ( Mover zona de la parte superior a la parte inferior ) Esta operación mueve la parte de zona de un carácter desde la zona mas a la izquierda del factor 2 a la zona extrema derecha del campo de resultados. Tanto el factor 2 como el campo de resultados deben ser campos definidos de tipo carácter. MLHZO ( Mover zona de la parte inferior a la parte superior ) Esta operación mueve la parte de zona de un carácter desde la zona mas a la derecha del factor 2 a la zona extrema izquierda del campo de resultados. Tanto el factor 2 como el campo de resultados deben ser campos definidos de tipo carácter. MLLZO ( Mover zona de la parte inferior a la parte inferior ) Esta operación mueve la parte de zona de un carácter desde la zona mas a la derecha del factor 2 a la zona extrema derecha del campo de resultados. Tanto el factor 2 como el campo de resultados deben ser campos definidos de tipo carácter.

Page 27: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

27

4. OPERACIONES DE ESTABLECIMIENTO DE INDICADOR SETON ( ACTIVAR INDICADOR ) SETOF ( DESACTIVAR INDICADOR ) Las operaciones SETON y SETOF activan o desactivan respectivamente los indicadores establecidos en las columnas 54 a 58 de la hoja de calculo. Los indicadores 1P , MR, KA A KN no pueden activarse por medio de la operación SETON. Los indicadores 1P y MR no pueden desactivarse mediante la operación SETOF. Podemos activar o desactivar los indicadores L1 a L9 mediante una operación SETON o SETOF pero en este caso no se activaran o desactivaran los indicadores de corte de control inferiores. 0026.00 C*------------------------------------------------- 0027.00 C* OPERACIONES SETON Y SETOF 0028.00 C*------------------------------------------------- 0028.01 C SETON 20 0028.02 C 20 08 SETOF 10 0028.03 C 20 0028.04 COR N10 SETON 50 0028.05 C* La primera sentencia SETON se ejecutara cada vez que el programa procese la misma ya que esta no se encuentra condicionada. En cambio en la sentencia siguiente, se observa que se activara el indicador 10 o sea se procesara la operación SETON siempre y cuando se encuentren activados los indicadores 20 y 08. Estos indicadores condicionan la ejecución de esta operación y al estar codificados en la misma línea debemos interpretar que se deberá cumplir la condición de que el indicador 20 este activado -Y- el indicador 08 también. En la ultima operación SETON vemos que se encuentra condicionada por el estado de dos indicadores - el indicador 20 activado - O - el indicador 10 desactivado (N10) -. Observe a continuación esta sentencia en modo de edición.

Page 28: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

28

Prompt type . . . C Sequence number . . . 0028.03 Level N01N02N03 Factor 1 Operation Factor 2 Res 20 Decimal Length Positions H/N/P HI LO EQ Comment Prompt type . . . C Sequence number . . . 0028.04 Level N01N02N03 Factor 1 Operation Factor 2 Result OR N10 SETON Decimal Length Positions H/N/P HI LO EQ Comment 50

Page 29: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

29

5. OPERACIONES DE SERIE CAT ( Concatenar dos series de caracteres ) CHECK ( Comprobar caracteres ) CHECR ( Comprobar caracteres hacia atrás) SCAN ( Explorar Serie de caracteres) SUBST ( Subserie ) XLATE ( Convertir ) CAT (Concatenar dos series de caracteres) La operación CAT concatena la serie de caracteres especificada en el factor 2 al final de la serie de caracteres especificada en el factor 1 y lo coloca en el campo de resultado. El factor 1 puede contener una serie de caracteres, un nombre de campo, un elemento de una matriz, una constante con nombre, una estructura de datos, un nombre de tabla o un literal. El factor 2 puede contener una serie de caracteres o puede contener el numero de blancos a insertar entre las series concatenadas.

Page 30: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

30

0026.00 C*------------------------------------------------ 0027.00 C* OPERACION CAT 0028.00 C*------------------------------------------------ 0028.01 C 'DIEGO' CAT 'Y JUAN' AUX01 12 0028.02 C* 0028.03 C*RESULTADO 'DIEGO Y JUAN' 0028.04 C* 0028.05 C MOVEL'AS/400' AUX02 6 0028.06 C MOVEL'RPG' AUX03 6 0028.07 C AUX02 CAT AUX03:1 AUX04 9 0028.08 C* 0028.09 C*RESULTADO 'AS/400 RPG' 0028.10 C* 0028.11 C MOVEL*BLANK AUX02 0028.12 C MOVEL'JAIME' AUX02 0028.13 C MOVEL*BLANK AUX05 15 0028.14 C 'MASTER' CAT AUX02:2 AUX05 0028.15 C* 0028.16 C*RESULTADO 'MASTER JAIME' 0028.17 C* CHECK ( Comprobar caracteres ) La operación CHECK verifica que cada carácter de la serie del factor 2 este entre los caracteres indicados en la serie del factor 1. Comienza la verificación en el carácter mas a la izquierda del factor 2 y continua carácter por carácter, desde la izquierda hacia la derecha. 0026.00 C*------------------------------------------------- 0027.00 C* OPERACION CHECK 0028.00 C*------------------------------------------------- 0028.01 C Z-ADD *ZEROS N 20 0028.02 C MOVEL*BLANK AUX01 6 0028.03 C MOVE 'MI' AUX01 0028.04 C ' ' CHECKAUX01 N 0028.05 C*

Page 31: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

31

Como en el factor 1 tenemos un blanco (' '), CHECK nos indicara la primera posición que no es blanco, en el ejemplo N será igual a 5. 0026.00 C*------------------------------------------------- 0027.00 C* OPERACION CHECK 0028.00 C*------------------------------------------------- 0028.01 C* 0028.02 C Z-ADD *ZEROS N 20 0028.03 C MOVEL'0123' AUX01 4 0028.04 C MOVEL'$1032.' AUX02 6 0028.05 C AUX01 CHECKAUX02:2 N 90 0028.06 C* En este ejemplo le hemos indicado que CHECK comenzara en la posición 2 ( obsérvese el factor 2 ) y hemos utilizado el indicador de resultado encontrado 90, que se encenderá cuando encuentre el primer carácter distinto de los contenidos en AUX01, en este caso será el carácter ' . ' que hará que se active dicho indicador. CHEKR ( Comprobar caracteres hacia atrás) La operación CHEKR verifica que cada carácter de la serie (factor 2) este entre los caracteres indicados en el factor 1. Esta verificación se produce comenzando por el carácter mas a la derecha del factor 2 y continua carácter a carácter de derecha a izquierda. 0026.00 C*------------------------------------------------- 0027.00 C* OPERACION CHECKR 0028.00 C*------------------------------------------------- 0028.01 C* 0028.02 C Z-ADD *ZEROS N 20 0028.03 C MOVEL'ABCD ' AUX01 5 0028.05 C ' ' CHEKR AUX01:2 N 90 0028.06 C* El factor 1 es un carácter blanco, en este caso CHEKR nos indica la posición del primer carácter que no es blanco, para este ejemplo N=4

Page 32: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

32

SCAN ( Explorar serie de caracteres ) Esta operación explora una serie de caracteres contenida en el factor 2 para una subserie contenida en el factor 1 Esta exploración comienza en la posición especificada en el factor 2. Se entenderá claramente con un ejemplo. 0026.00 C*------------------------------------------------- 0027.00 C* OPERACION SCAN 0028.00 C*------------------------------------------------- 0028.01 C* 0028.02 C Z-ADD2 X 20 0028.03 C Z-ADD3 Y 20 0028.04 C Z-ADD*ZEROS L 20 0028.05 C Z-ADD*ZEROS N 20 0028.06 C MOVEL'ESLORA' AUX01 6 0028.07 C MOVEL'NORESTE' AUX02 6 0028.08 C MOVEL'OREN' AUX03 4 0028.09 C ORA SCAN AUX01 L 90 0028.10 C* 0028.11 C*RESULTADO L=4 INDICADOR 90 ACTIVADO 0028.12 C* 0028.13 C AUX03:Y SCAN AUX02:X N 90 0028.14 C* 0028.15 C*RESULTADO N=2 INDICADOR 90 ACTIVADO 0028.16 C*AUX03 CONSIDERANDO 3 POSICIONES '0RE' 0028.17 C*AUX02 COMENZANDO EN LA POSICION X=2 0028.18 C*

Page 33: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

33

SUBST ( Subserie ) La operación SUBST devuelve una subserie del factor 2, empezando en la ubicación especificada en este mismo factor y para una longitud especificada en el factor 1, colocando la subserie en el campo de resultado. 0026.00 C*------------------------------------------------- 0027.00 C* OPERACION SUBST 0028.00 C*------------------------------------------------- 0028.01 C Z-ADD 2 N 20 0028.02 C MOVE *BLANK AUX02 8 0028.03 C MOVEL'PIRATA' AUX01 6 0028.04 C 3 SUBST AUX01:2 AUX02 55 0028.05 C* 0028.06 C*RESULTADO 'IRA' 0028.07 C* Esta operación SUBST extrae una subserie del factor 2 o sea del campo AUX01 comenzando en la posición 2 y con una longitud de 3 especificada en el factor 1. Observese la utilizacion de un indicador en este caso el 55, pociones 56 y 57 de la hoja de calculo, el cual se activara si se produce un error durante la ejecucion de esta operación. 0026.00 C*------------------------------------------------- 0027.00 C* OPERACION SUBST 0028.00 C*------------------------------------------------- 0028.01 C Z-ADD2 N 20 0028.02 C MOVE *BLANK AUX02 8 0028.03 C MOVEL'PIRATA' AUX01 6 0028.04 C 7 SUBSTAUX01:2 AUX02 55 0028.05 C* 0028.06 C*RESULTADO ERROR 0028.07 C* En este otro ejemplo se activa el indicador 55 ya que queremos extrae una subserie del campo AUX01 a partir de la posicion 2 y desplazandonos 7 posiciones, las que exceden la totalidad de caracteres de la serie.

Page 34: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

34

XLATE ( Convertir ) Esta operacion nos permite convertir los caracteres de una serie del factor 2 de acuerdo con las series DE y A y se situan en el campo de resultados. El factor 1 debera contener las series DE ( convertir de ) y A ( convertir a ). Estas series pueden ser un nombre de campo, un elemento de matriz, una constante con nombre, una estructura de datos o un literal. Si el factor 2 fuese menor que el campo de resultados una P en la posicion 53n indica que el campo de resultados debera rellenarse por la derecha con blancos despues de la conversion. Se podea utilizar indicadores del 01 al 99 en las posiciones 56 y 57 para determinar si se produce un error. 0026.00 C*------------------------------------------------- 0027.00 C* OPERACION XLATE 0028.00 C*------------------------------------------------- 0028.01 C* 0028.02 C MOVE *BLANK AUX02 8 0028.03 C MOVEL'658 2130'AUX01 8 0028.04 C' ':'-' XLATE AUX01 AUX02 55 0028.05 C* 0028.06 C*RESULTADO 658-2130 Queremos convertir las letras minusculas del campo AUX01 a mayusculas y almacenar esta conversion en el campo AUX02. 0026.00 C*------------------------------------------------- 0027.00 C* OPERACION XLATE 0028.00 C*------------------------------------------------- 0028.01 C* 0028.02 C MOVEL*BLANK AUX02 10 0028.06 C MOVEL'abcdej' MI 6 0028.07 C MOVEL'ABCDEJ' MA 6 0028.08 C MOVEL'jacobo' AUX01 6 0028.09 C MI:MA XLATEAUX01 AUX02 28.10 C* 0028.11 C*RESULTADO AUX02 = 'JACoBo' 0028.12 C*

Page 35: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

35

Ahora veremos un ejemplo donde definimos 2 constantes literales en la hoja I ( input ) las cuales nos permitaran convertir letras mayusculas a minusculas o vice versa. 0012.01 I*------------------------------------------------- 0012.02 I* DEFINICION DE CONSTANTES LITERALES 0012.03 I*------------------------------------------------- 0012.04 I 'abcdefghijklmnopqrs -C MI 0012.05 I 'tuvwxyz' 0012.06 I 'ABCDEFGHIJKLMNOPQRS -C MA 0026.00 I 'TUVWXYZ' 0027.00 I* 0028.00 C*------------------------------------------------- 0028.01 C*CONVERSION DE MAYUSCULAS A MINUSCULAS Y VICEVERSA 0028.02 C*------------------------------------------------- 0028.03 C MOVEL*BLANKS AUX04 10 0028.04 C MOVEL*BLANKS AUX05 10 0028.05 C MOVEL*BLANKS AUX06 10 0028.06 C* 0028.07 C MOVEL'BsaS' AUX01 4 0028.08 C MOVEL'MIcHiGaN'AUX02 8 0028.09 C MOVEL'ViGo' AUX03 4 0028.10 C* 0028.11 C MI:MA XLATEAUX01 AUX04 0028.12 C MA:MI XLATEAUX02 AUX05 0028.13 C MI:MA XLATEAUX03 AUX06 0028.14 C* 0028.15 C*RESULTADO AUX04 = 'BSAS' 0028.16 C*RESULTADO AUX05 = 'michigan' 0028.17 C*RESULTADO AUX06 = 'VIGO' 0028.18 C*

Page 36: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

36

6. OPERACIONES DE MATRIZ

LOKUP (Buscar) MOVEA (Mover Matriz) SORTA (Clasificar una matriz) XFOOT (Sumar elementos de una matriz) LOKUP (Buscar) Esta operacion nos permite buscar un elemento en particular dentro de una matriz o tabla. El factor 1 es el argumento de busqueda y en el factor 2 el nombre de la matriz o tabla. Podemos codificar indicadores de resultados igual , menor y mayor. El indicador de resultado por mayor, columnas 54 y 55, le indica al programa que busque la entrada mayor mas proxima, el indicador por menor, columnas 56 y 57, la entrada menor mas proxima y el indicador por igual la entrada igual al argumento de busqueda. En este ejemplo deseamos conocer si se encuentra un elemento en la matriz EST que sea igual al contenido del campo AUX01, cuando la operacion LOKUP encuentre un elemento coicidente, se activara el indicador 47. FMT * ..... *. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 .. 0028.01 C*OPERACION LOKUP 0028.02 C*------------------------------------------------- 0028.03 C Z-ADD 1 X 20 0028.04 C MOVEL'VELA' AUX01 4 0028.05 C MOVEL'ALFA' AUX02 4 0028.10 C* 0028.11 C AUX01LOKUPEST 47 0028.12 C* 0028.13 C AUX02LOKUPEST,X 26 0028.14 C*

Page 37: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

37

Ahora deseamos conocer si existe un elemento de tabla o matriz coincidente y en que elemento de la matriz se encuentra. Cuando la operacion es satisfactoria se activara el indicador 26, el subindice X contedra el numero de elemento dentro de la tabla o matriz que es coincidente con el argumento de busqueda. MOVEA (Mover Matriz) Esta operacion transfiere valores numericos y/o de caracteres del factor 2 al campo de resultado. El factor 2 y el campo de resultado deben contener una matriz. No podemos especificar aunque este indexada la misma matriz en el factor 2 y el campo de resultado. Esta operacion comienza a mover los datos por el primer elemento de una matriz si esta no esta indexada o con el elemento especificado si lo esta. 0028.00 C*------------------------------------------------- 0028.01 C*OPERACION MOVEA 0028.02 C*------------------------------------------------- 0028.03 C* 0028.04 C MOVEAMATB MATC 0028.05 C* Antes de MOVEA MATB 56 84 90 16 22 48 MATC 10 11 12 13 14 15 Despues de MOVEA MATB

Page 38: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

38

56 84 90 16 22 48 MATC 56 84 90 16 22 48 0028.00 C*------------------------------------------------- 0028.01 C*OPERACION MOVEA 0028.02 C*------------------------------------------------- 0028.03 C* 0028.04 C MOVEAMATB MATC,4 0028.05 C* Antes de MOVEA MATB 56 84 90 16 22 48 MATC 10 11 12 13 14 15 Despues de MOVEA MATB 56 84 90 16 22 48

Page 39: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

39

MATC 10 11 12 56 84 90 0028.00 C*------------------------------------------------- 0028.01 C*OPERACION MOVEA 0028.02 C*------------------------------------------------- 0028.03 C Z-ADD2 X 20 0028.04 C MOVEAMATB,X MATC 0028.05 C* Antes de MOVEA MATB 56 84 90 16 22 48 AUX01 100B Despues de MOVEA MATB 56 84 90 16 22 48 AUX01 5684

Page 40: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

40

SORTA (Clasificar una matriz) mna 16 una F ( Full procedure ) Columna 19 una ' E' que le indica al RPG/400 que la definición de la base de datos es Externa o sea su definición se encuentra en una DDS ( Data description Specification ). ColumnEsta operación nos permite clasificar una matriz. Esta matriz definida en la hoja 'E' (especificaciones adicionales) podrá clasificarse en orden ascendente o descendente según lo codificado en la columna 45 de esta hoja. MATB HDEFABC Vemos la codificación de la letra A columna 45 que le indicara al RPG/400 la clasificación de esta matriz en orden ascendente 0012.01 E*------------------------------------------------- 0012.02 E MATB 8 1 A 0028.00 C*------------------------------------------------- 0028.01 C*OPERACION SORTA 0028.02 C*------------------------------------------------- 0028.03 C Z-ADD2 X 20 0028.04 C SORTAMATB 0028.05 C* RESULTADO ABCDEFH

Page 41: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

41

7. OPERACIONES DE COMPARACION COMP ( comparar ) IFxx (SI) AND ( Y ) ORxx ( O ) CABxx ( comparar y bifurcar ) CASxx ( llamada condicional a una sub rutina ) DOUxx ( hacer hasta ) DOWxx ( hacer mientras ) WHxx ( cuando sea verdadero seleccionar ) En las operaciones ANDxx, CABxx, DOUxx, Ifxx, Orxx y WHxx, xx puede ser : XX SIGNIFICADO GT El factor 1 es mayor que el factor 2 LT El factor 1 es menor que el factor 2 EQ El factor 1 es igual al factor 2 NE El factor 1 no es igual que el factor 2 GE El factor 1 es mayor o igual que el factor 2 LE El factor 1 es menor o igual que el factor 2 Las operaciones de comparacion prueban campos para determinar ciertas condiciones. Los indicadores resultantes utilizados en las posiciones 54 a 59 de la hoja de calculo se activan o no, según los resultados de la operación, o bien se produce una bifurcación basada en los resultados. Todas estas operaciones no cambian ningún valor de ningún campo.

Page 42: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

42

COMP ( compar ) La operación COMP compara el factor 1 con el factor 2. El factor 1 y 2 pueden contener un literal , una constante con nombre, un nombre de campo, un nombre de tabla, un elemento de matriz o una estructura de datos. El factor 1 y factor 2 deben ser ambos numéricos o de caracteres. Al realizar la comparación, se activan los indicadores de la siguiente forma: Indicador Columna Condición Mayor 54 55 El factor 1 es mayor que el factor 2 Menor 56 57 El factor 1 es menor que el factor 2 Igual 58 59 El factor 1 es igual al factor 2 0028.00 C*------------------------------------------------- 0028.01 C*OPERACION COMPARACION COMP 0028.02 C*------------------------------------------------- 0028.03 C Z-ADD23 AUX01 60 0028.04 C Z-ADD56 AUX02 60 0028.05 C AUX01 COMP AUX02 505152 0028.06 C* 0028.07 C*SE ACTIVARA EL INDICADOR 51 ( MENOR ) 0028.08 C*FACTOR 1 MENOR QUE EL FACTOR 2 0028.09 C* 0028.10 C* 0028.11 C AUX02 COMP AUX01 707172 0028.12 C* 28.11 C*SE ACTIVARA EL INDICADOR 70 ( MAYOR ) 0028.08 C*FACTOR 1 MENOR QUE EL FACTOR 2 0028.09 C*

Page 43: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

43

Ahora compararemos dos campos y según se activen los indicadores de resultado realizaremos otras operaciones que estarán condicionadas por dichos indicadores. FMT * ..... *. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... ************* Beginning of data ************* 001.00 H*------------------------------------------------- 002.00 H* SISTEMA : EJEMPLOS RPG/400 TUTORIAL I 003.00 H* : MICHIGAN . EEUU 004.00 H* AUTOR : DANIEL HUGO ENRIQUEZ LEIVAS 005.00 H* PROGRAMA: PROG15 006.00 H* FECHA : 2002 007.00 F*------------------------------------------------- 008.00 F* HOJA FILE 009.00 F*------------------------------------------------- 010.00 FSTOCK IF E K DISK 012.00 FLISTA O E 60 PRINTER 012.01 E*------------------------------------------------- 012.02 I 'NO COMPRAR -C LEY01 012.03 I 'COMPRAR -C LEY02 012.04 I 'CRITICO COMPRAR URG.-C LEY03 0028.00 C*------------------------------------------------- 0028.01 C*OPERACION COMPARACION COMP 0028.02 C*------------------------------------------------- 0028.03 C MOVEL*BLANKS LEYEN 20 0028.04 C STOCK COMP PUNTOR 807978 0028.05 C 80 MOVELLEY01 LEYEN 0028.06 C 78 MOVELLEY03 LEYEN 0028.07 C 79 MOVELLEY02 LEYEN 0028.08 C* 0028.09 C*SEGUN EL STOCK SEA MAYOR, MENOR O IGUAL 0028.10 C*AL PUNTO DE REPOSICION SE ACTIVARAN LOS 0028.11 C*INDICADORES 80,79,78 RESPECTIVAMENTE. 0028.12 C* 0028.13 C*LUEGO MOVEREMOS LA LEYENDA QUE CORRESPONDA 0028.14 C*SEGUN LOS INDICADORES. OBSERVE QUE ESTOS 0028.15 C*INDICADORES DE RESULTADO LUEGO SE TRANSFORMAN 28.16 C*EN INDICADORES QUE CONDICIONAN O NO 28.17 C*DETERMINADAS OPERACIONES

Page 44: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

44

0028.19 C*SE EJECUTARA LA SENTENCIA 28.05 SIEMPRE Y CUANDO 0028.20 C*EL INDICADOR DE RESULTADO 80 ESTE ACTIVADO, 0028.21 C*NO EJECUTANDOSE LAS OPERACIONES CONDICIONADAS 0028.22 C*POR LOS RESTANTES INDICADORES 0028.23 C* IFxx (SI ) La operación IFxx permite que se procese un grupo de cálculos si existe una relación determinada, especificada en xx, entre el factor 1 y el factor 2. El factor 1 y el factor 2 deben contener una constante con nombre, un literal, un nombre de tabla, un elemento de matriz, un nombre de estructura de datos o un nombre de campo. Las entradas del factor 1 y factor 2 deben ser ambas numéricas o de caracteres. Si la relación que especificamos por IFxx no existe, el RPG pasara el control a la operación de calculo inmediatamente después de la operación ENDIF que cierra el grupo de sentencias. Si dentro de un IFxx se especifica la operación ELSE ( en caso contrario hacer ), el control pasa a la siguiente operación de calculo después de la operación ELSE hasta ejecutar todas las sentencias comprendidas entre esta y el ENDIF. 0009.00 F*------------------------------------------------- 0010.00 FSTOCK IF E K DISK 0012.00 FLISTA O E 60 PRINTER 0012.01 E*------------------------------------------------- 0012.02 I 'NO COMPRAR -C LEY01 0012.03 I 'COMPRAR -C LEY02 0012.04 I 'CRITICO COMPRAR URG. -C LEY03 0028.00 C*------------------------------------------------- 0028.01 C*OPERACION COMPARACION IFxx 0028.02 C*------------------------------------------------- 0028.03 C MOVEL*BLANKS LEYEN 20 0028.04 C STOCK IFGT PUNTOR 0028.05 C MOVELLEY01 LEYEN 0028.06 C ENDIF 0028.07 C STOCK IFEQ PUNTOR 0028.08 C MOVELLEY02 LEYEN 0028.09 C ENDIF 0028.10 C STOCK IFLT PUNTOR 0028.11 C MOVELLEY03 LEYEN 0028.12 C ENDIF 0028.15 C*

Page 45: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

45

En la primera sentencia IFxx (IFGT es mayor que) preguntamos si el campo stock es mayor que el campo punto de reposición, si así lo fuere se ejecutara la sentencia que mueve LEY01 al campo LEYEN. En la segunda sentencia IFxx I (IFEQ es igual a) preguntamos si el campo stock es igual al campo punto de reposición, si así lo fuere se ejecutara la sentencia que mueve LEY02 al campo LEYEN. En la ultima sentencia IFxx (IFLT es menor que) preguntamos si el campo stock es menor que el campo punto de reposición, si así lo fuere se ejecutara la sentencia que mueve el campo LEY03 al campo LEYEN. También podríamos codificar estas distintas acciones de la siguiente manera incorporando el uso de la operación ELSE. 0028.02 C*------------------------------------------------- 0028.03 C MOVEL*BLANKS LEYEN 20 0028.04 C STOCK IFGT PUNTOR 0028.05 C MOVELLEY01 LEYEN 0028.06 C ELSE 0028.07 C STOCK IFEQ PUNTOR 0028.08 C MOVELLEY02 LEYEN 0028.09 C ELSE 0028.10 C STOCK IFEQ PUNTOR 0028.11 C MOVELLEY03 LEYEN 0028.12 C ENDIF 0028.13 C ENDIF 0028.14 C ENDIF 0028.15 C* En nuestro primer IFxx preguntamos si el campo STOCK es mayor que el campo PUNTOR, si lo es se ejecutara/n la/s sentencias comprendidas dentro del grupo IFxx caso contrario se ejecutaran las sentencias comprendidas entre ELSE (caso contrario hacer) y el correspondiente ENDIF. Si no se cumpliera la condición del primer IFxx ejecutara las sentencias después del ELSE que en este caso es otro IFxx. Observe que por cada grupo IFxx se deberá codificar su correspondiente ENDIF.

Page 46: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

46

En este punto el lector entenderá que podríamos mejorar nuestra programación escribiendo las sentencias de la siguiente manera optimizando los IFxx anidados. 0028.02 C*------------------------------------------------- 0028.03 C MOVEL*BLANKS LEYEN 20 0028.04 C STOCK IFGT PUNTOR 0028.05 C MOVELLEY01 LEYEN 0028.06 C ELSE 0028.07 C STOCK IFEQ PUNTOR 0028.08 C MOVELLEY02 LEYEN 0028.09 C ELSE 0028.11 C MOVELLEY03 LEYEN 0028.12 C ENDIF 0028.13 C ENDIF 0028.15 C* ANDxx (Y) La operación ANDxx es una operación optativa , la misma debe codificarse después de una operación IFxx, DOUxx, DOWxx, WHxx y antes de la codificación de la sentencia de fin de grupo. La operación ANDxx tiene una mayor prioridad que la operación Orxx. 0001.00 H*------------------------------------------------- 0002.00 H* SISTEMA EJEMPLOS RPG/400 TUTORIAL 0003.00 H* MICHIGAN . EEUU 0003.01 H* TIERRA DE VOLVERINES 0005.00 H* PROGRAMA: PROG16 0006.00 H* FECHA : 2002 0007.00 F*------------------------------------------------- 0008.00 F* HOJA FILE 0009.00 F*------------------------------------------------- 0010.00 FSTOCK IF E K DISK 0012.00 FLISTA O E 60 PRINTER 0012.01 E*------------------------------------------------- 0012.02 I 'ARGENTINA BUENOS AIR-C LEY01 0012.03 I 'ES' 0012.04 I 'MICHIGAN EEUU -C LEY02 0028.00 C*------------------------------------------------- 0028.01 C*OPERACION COMPARACION IFXX, ANDXX 0028.02 C*------------------------------------------------- 0028.03 C Z-ADD 3567 AUX01 82

Page 47: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

47

0028.04 C Z-ADD 2047 AUX02 82 0028.05 C AUX01 IFGE 3000 0028.06 C AUX02 ANDGT2000 0028.07 C MOVELLEY01 LEYEN 30 0028.08 C ELSE 0028.09 C MOVELLEY02 LEYEN 0028.14 C ENDIF 0028.17 C* Ahora queremos seleccionar todos los registros historicos de venta del articulo 0032 , vendidos por el vendedor 55 en de la zona 10. Para ello codificaremos en nuestra hoja de calculo lo siguiente: FMT * ..... *. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+. 0028.02 C*------------------------------------------------- 0028.03 C Z-ADD 32 ARTIS 60 0028.04 C Z-ADD 55 VENDS 60 0028.05 C Z-ADD 10 ZONAS 60 0028.06 C ARTIC IFEQ ARTIS 0028.07 C VENDE ANDEQVENDS 0028.08 C ZONA ANDEQZONAS 0028.09 C EXSR PROCE 0028.10 C EXSR PRIN1 0028.11 C ENDIF 0028.17 C* 0028.18 C*SE PROCESARAN LAS SENTENCIAS DENTRO DEL 0028.19 C*GRUPO IFXX SIEMPRE Y CUANDO EL CAMPO 0028.20 C*ARTIC=32 Y VENDE=55 Y ZONA=10 0028.21 C* ORxx (O ) La operación Orxx es una operación optativa y se utiliza con las operaciones IFxx, DOUxx, DOWxx, WHxx y ANDxx. Nos permite programar la condición lógica (O).

Page 48: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

48

FMT * ..... *. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ... 028.02 C*----------------------------------------------- 028.03 C Z-ADD32 ARTIS 60 028.04 C Z-ADD55 VENDS 60 028.05 C Z-ADD10 ZONAS 60 028.06 C ARTIC IFEQ ARTIS 028.07 C VENDE OREQ VENDS 028.08 C ZONA OREQ ZONAS 028.09 C EXSR PROCE 028.10 C EXSR PRIN1 028.11 C ENDIF 28.12 C* 028.13 C ARTIC IFGE ARTIS 028.14 C VENDE ORLT VENDS 028.15 C ZONA ORGT ZONAS 028.16 C EXSR PROCE 028.17 C EXSR PRIN1 028.18 C ENDIF También podemos combinar en una operación IFxx, DOUxx, DOWxx, las operaciones ANDxx y Orxx. Observe el siguiente ejemplo: 028.12 C* 028.13 C AUX01 IFGE 50 028.14 C VENDE ORLT VENDS 028.15 C AUX02 ANDLT 110 028.16 C EXSR PROCE 028.17 C EXSR PRIN1 028.18 C ENDIF CASxx ( Llamada condicional a una subrutina) 0028.00 C*------------------------------------------------- 0028.01 C*OPERACION CASXX 0028.02 C*------------------------------------------------- 0028.03 C Z-ADD25 AUX01 92 0028.04 C Z-ADD56 AUX02 92 0028.05 C Z-ADD34 AUX03 92

Page 49: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

49

0028.06 C AUX01 CASGE25 SUBR01 0028.07 C AUX02 CASEQ56 SUBR02 0028.08 C AUX03 CASLE34 SUBR03 0028.09 C ENDCS 0028.10 C* 0028.11 C* Nuestra operacion CASxx compara AUX01 si es mayor o igual a 25, de ser verdadero ejecutara la subrutina SUBR01, luego de procesar esta subrutina el control del programa regresa a la próxima sentencia donde compara AUX02 si es igual a 56, en este caso no es verdadero por lo que no ejecutara la subrutina SUBR02, continua y la próxima sentencia comprueba si AUX03 es menor o igual a 34 de ser verdadero ejecuta la subrutina SUBR03. Para finalizar el grupo toda operación CASxx debe finalizar con una operación ENDCS. En el ejemplo siguiente procesaremos distintas subrutinas de calculo según el precio de compra de las acciones sea , mayor , igual, o menor que el precio actual del mercado en la bolsa de New York. 0028.00 C*------------------------------------------------- 0028.01 C*OPERACION CASXX 0028.02 C*------------------------------------------------- 0028.05 C* 0028.06 C VALOC CASGTVALORA CALC01 0028.07 C AUX02 CASEQVALORA CALC02 0028.08 C AUX03 CASLEVALORA CALC03 0028.09 C ENDCS 0028.10 C* 0028.11 C* 0028.12 C* DOUxx (Hacer hasta) Esta operación comienza un grupo de operaciones que se desean procesar mas de una vez y por lo menos una vez. El factor 1 y el factor 2 deben contener, una constante con nombre, un nombre de campo,

Page 50: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

50

un literal, un nombre de tabla, una estructura de datos o un elemento de matriz. 0063.00 C*------------------------------------------------- 0064.00 C* RUTINA DE CALCULO 0065.00 C*------------------------------------------------- 0066.00 C CALCU BEGSR 0066.01 C Z-ADD1 TASAP 86 0066.02 C Z-ADDCANPER N 60 0066.03 C N DOUEQ0 0066.04 C TASA MULT TASAP TASAP 0066.05 C SUB 1 N 0066.06 C ENDDO 0066.07 C ENDSR En el ejemplo anterior tenemos un capital de 100000 dólares que lo invertimos en un plazo fijo en el banco 'XXX' por el termino de 10 años a un interés anual de 6.5 %. Con DOUxx realizamos en calculo de la tasa de interés a aplicar por el periodo determinado en el campo CANPER , luego al abandonar el DOUxx en el campo TASAP tendremos la tasa a aplicar y realizamos el calculo del capital. DOWxx ( hacer mientras ) Esta operación encierra un grupo de operaciones que se desea procesar mientras exista una relación xx entre los factores 1 y 2. A diferencia de DOUxx no procesara ni una vez las operaciones si no existe la relación xx entre los factores. Veremos el uso de esta operación por medio de un ejemplo. El lector observara a continuación, la definición del archivo Maestro de operaciones - MAEPRO en su correspondiente DDS (Data Descripción Source) y el printer file -LISTA- que utilizaremos en nuestro ejemplo: File . . . . . . QDDSSRC Library . . . . V40LBDHE Position to . . . . . Type options, press Enter. 2=Edit 3=Copy 4=Delete 5=Display 6=Print 7=Rename 8=Display description 9=Save 13=Change text 14=Compile 15=Create module...

Page 51: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

51

Opt Member Type Text LISTA PRTF LISTADO DE OPERACIONES A PLAZO FIJO MAEOPE PF MAESTRO DE OPERACIONES A PLAZO FIJO PANT01 DPSF PANTALLA EJEMPLO PANT02 DSPF PANTALLA EJEMPLO Para este ejemplo veremos la DDS que define el archivo de operaciones a plazo fijo llamado MAEOP DDS ARCHIVO MAEOP (MAESTRO DE OPERACIONES) FMT A* .....A*. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 *************** Beginning of data ******************************* 0000.10 A* ARCHIVO DE OPERACIONES A PLAZO FIJO 00.20 A* SISTEMA GENERAL DEL BANCO BANKROBO 00.21 A* PRESIDENTE FERNANDO EN LA RUA NOS DEJASTE A TODOS 00.22 A* FECHA 2001 AÑO DE CORRALITO ARGENTINO 0000.22 A* AUTOR DANIEL HUGO ENRIQUEZ LEIVAS 000.22.03 A* -------------------------------------------------------------------------------- 0000.23 A* ARCHIVO MAEOPE 0000.24 A*--------------------------------------------------------------------------------- 0000.40 A R ROPER 0000.41 A CODOPE 10 0 TEXT('APELLIDO Y NOMBRE') 0000.42 A FECOPE 8 0 TEXT('FECHA OPERACION') 0000.43 A CPDCLI 6 0 TEXT('CODIGO DE CLIENTE') 0000.44 A AYN 40 TEXT('APELLIDO Y NOMBRE') 0000.45 A CAPITA 12 2 TEXT('CAPITAL') 0000.46 A TASA 6 4 TEXT('TASA DE INTERES') 0000.47 A CANPER 3 0 TEXT('CANT.DE PERIODOS') 0000.48 A K CODOPE 0000.90 A Observe la definición de registro (R) llamado ROPER, luego a continuación definimos los campos del archivo con sus respectivas longitudes y si son numéricos con la cantidad de decimales correspondientes. Este archivo tiene una clave que es el campo CODOPE definida por una 'K'.

Page 52: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

52

A continuación podrá observar un printer file que utilizaremos para generar nuestro listado con las operaciones a plazo fijo. PRINTER FILE LISTA FMT DP .....AAN01N02N03T.Name++++++RLen++TDpBLinPosFunctions++ *************** Beginning of data ********************* 0000.01 A REF(MAEOPE) 0000.03 A R TITU 0000.04 A SKIPB(001) 0000.06 A LIN01 132 1 0000.07 A SPACEA(1) 0000.08 A TIT01 13 1 0000.09 A TIT02 17 +5 0000.10 A TIT03 17 +5 0000.11 A TIT04 7 +5 0000.12 A TIT05 4 +5 0000.13 A TIT06 8 +5 0000.14 A TIT07 9 +5 0000.15 A SPACEA(1) 0000.16 A LIN02 132 1 0000.17 A SPACEA(1) 0000.18 A R DETA 0000.19 A CODOPE R 1 0000.20 A CPDCLI R +5 0000.21 A AYN R +5 0000.22 A CAPITA R +5 EDTCDE(1) 0000.23 A TASA R +5 EDTCDE(1) 0000.24 A CANPER R +5 EDTCDE(1) 0001.00 A CAPIT 11 2 +5 EDTCDE(1) 0002.00 A SPACEA(1) ****************** End of data *******************

Page 53: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

53

PROGRAMA RPG/400 0001.00 H*------------------------------------------------- 0002.00 H* SISTEMA : SISTEMA GENERAL DEL BANCO 0002.01 H* BANCO : BANKROBO 0003.00 H* PRESID. : FERNANDO EN LA RUA ( NOS DEJASTE ) 0003.01 H* : CALCULO DE OPERACIONES A PLAZO FIJO 0004.00 H* AUTOR : DANIEL HUGO ENRIQUEZ LEIVAS 0005.00 H* PROGRAMA: PROG30 0006.00 H* FECHA : 2002 0009.00 F*------------------------------------------------- 0010.00 FMAEOPE IF E K DISK 0012.00 FLISTA O E 60 PRINTER 0012.01 I*------------------------------------------------- 0012.02 I 'COD.OPERACION' C TIT1 0012.03 I 'CODIGO DE CLIENTE' C TIT2 0012.04 I 'APELLIDO Y NOMBRE' C TIT3 0012.05 I 'CAPITAL' C TIT4 0012.06 I 'TASA' C TIT5 0012.07 I 'PERIODOS' C TIT6 0012.08 I 'CAP.TOTAL' C TIT7 0028.00 C*------------------------------------------------- 0028.01 C*OPERACION DOUXX 0028.02 C*------------------------------------------------- 0028.03 C MOVELTIT1 TIT01 0028.04 C MOVELTIT2 TIT02 0028.05 C MOVELTIT3 TIT03 0028.06 C MOVELTIT4 TIT04 0028.07 C MOVELTIT5 TIT05 0028.08 C MOVELTIT6 TIT06 0028.09 C MOVELTIT7 TIT07 0028.10 C MOVE *ALL'-' LIN01 0028.11 C MOVE *ALL'-' LIN02 0028.12 C WRITETITU 0028.13 C* 0028.14 C *LOVAL SETLLMAEOPE 90 0028.15 C READ ROPER 90 0028.16 C *IN90 DOWEQ*OFF 0028.17 C EXSR CALCU 0028.18 C CAPITA MULT TASAP CAPIT 0028.19 C EXSR PRI01 0028.20 C READ ROPER 90 0028.21 C *IN90 IFEQ *ON 0028.22 C LEAVE 0028.23 C ENDIF 0028.24 C ENDDO

Page 54: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

54

0028.25 C* 0028.26 C MOVE *ON *INLR 0028.27 C* 0053.00 C*------------------------------------------------- 0054.00 C* RUTINA DE IMPRESION 0055.00 C*------------------------------------------------- 0056.00 C PRI01 BEGSR 0056.01 C *IN60 IFEQ *ON 0058.00 C WRITETITU 0059.00 C MOVE *OFF *IN60 0060.00 C ENDIF 0061.00 C WRITEDETA 0062.00 C ENDSR 0063.00 C*------------------------------------------------- 0064.00 C* RUTINA DE CALCULO 0065.00 C*------------------------------------------------- 0066.00 C CALCU BEGSR 0066.01 C Z-ADD1 TASAP 86 0066.02 C Z-ADDCANPER N 60 0066.03 C N DOWNE0 0066.04 C TASA MULT TASAP TASAP 0066.05 C SUB 1 N 0066.06 C ENDDO 0066.07 C ENDSR ****************** End of data ******************* En la hoja - F - tenemos definidos el maestro de operaciones a plazo fijo MAEOPE y el printer file LISTA . Al comenzar el ciclo logico del RPG abrirá la base de datos y el printer file. Luego en la hoja - I - encontramos la declaración de constantes que serán utilizadas en los títulos del reporte que se imprimirán por primera vez por medio de la sentencia 28.12 que imprimirá el formato de registro - TITU - de nuestro printer file. A continuación nos situamos en el comienzo del archivo por medio de la sentencia *LOVAL SETLL y realizamos Nuestra primer lectura por medio de la operación READ la que tiene asignado el indicador 90 por lectura de fin de archivo. Si el indicador 90 no esta activo el control del programa ingresa dentro del DOWxx sentencia 28.16 he inmediatamente después pasa a bifurcar a la rutina de calculo y al regresar realiza las operaciones aritméticas de la sentencia 28.18 y en la 28.19 bifurca hacia la rutina de impresión de los datos correspondiente ha ese registro. Luego al regresar realiza la lectura de un nuevo registro y si el indicador 90 esta activo abandona el DOWxx por medio de la operación LEAVE y si no lo estuviera se repetirá las operaciones contenidas en el grupo DOWxx hasta alcanzar el final de archivo.

Page 55: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

55

Ahora supongamos que estamos leyendo una base de datos que contiene los registros de ventas de los últimos 5 años y debemos seleccionar las ventas del articulo 47 en todas las zonas de venta y para el vendedor 10. 0028.16 C *IN90 DOWEQ*OFF 0028.17 C ARTIC IFEQ 47 0028.18 C VEND ANDEQ10 0028.19 C EXSR PROCE 0028.20 C ENDIF 0028.21 C READ RVENT 90 0028.22 C *IN90 IFEQ *ON 0028.23 C LEAVE 0028.24 C ENDIF 0028.25 C ENDDO Este operación DOWxx se ejecutara hasta que el indicador 90 que estamos utilizando para determinar el final del archivo VENTAS no este activado. En las paginas siguiente cuando abordemos el uso de archivos completaremos este ejemplo con las operaciones de lectura. WHxx ( Seleccionar cuando sea verdadero) Esta operación en el lenguaje RPG determina donde pasara el control del programa según el grupo de selección. La operación WHxx debe comenzar siempre con una sentencia SELECT y finalizar con una sentencia ENDSL.

Page 56: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

56

0063.00 C*------------------------------------------------- 0064.00 C*RUTINA OPERACION WHXX - SELEC - ENDSL 0065.00 C*------------------------------------------------- 0066.00 C BIFU BEGSR 0066.01 C SELEC 0066.02 C AUX01 WHEQ 10 0066.03 C EXSR IMPRE 0066.04 C AUX02 WHNE 'E' 0066.05 C EXSR PROCE 0066.06 C EXSR IMPRI 0066.07 C *IN40 WHEQ *ON 0066.08 C EXSR PANTA 0066.09 C ENDSL 0066.10 C ENDSR

Page 57: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

57

9. Operaciones de Subrutina Una subrutina es un conjunto de sentencias especificadas en la hoja de calculo dentro de un programa RPG que puede procesarse varias veces. Una subrutina puede ser llamada desde cualquier punto de la hoja de calculo. Las sentencias relacionadas con subrutinas son: BEGSR ( Comenzar una subrutina ) ENDSR ( Finalizar una subrutina ) EXSR ( Ejecutar una subrutina ) CASxx ( Llamada condicional a una subrutina ) BEGSR ( Comenzar una subrutina ) Esta operación determina el comienzo de una subrutina del RPG/400. En el factor 1 escribiremos el nombre de esta subrutina. 0053.00 C*------------------------------------------------- 0054.00 C* RUTINA DE IMPRESION 0055.00 C*------------------------------------------------- 0056.00 C PRI01 BEGSR 0056.01 C *IN60 IFEQ *ON 0058.00 C WRITETITU 0059.00 C MOVE *OFF *IN60 0060.00 C ENDIF 0061.00 C WRITEDETA 0062.00 C ENDSR 0063.00 C*-------------------------------------------------

Page 58: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

58

En este ejemplo en nombre de la subrutina es PRI01 y en ella estamos ejecutando la impresión de un listado. El RPG ejecutara las sentencias comprendidas en la subrutina y luego volverá al flujo principal del programa, a la sentencia inmediatamente posterior a la que bifurco en la subrutina. Toda subrutina comienza con la operación BEGSR y finaliza con una operación ENDSR. Usted ya estará familiarizado con el ejemplo siguiente, observe en el mismo como el flujo principal del programa bifurca a la rutina CALCU ( rutina de calculo) y PRI01 (rutina de impresión) por medio de la operación EXSR. Luego cada subrutina comienza con una operación BEGSR y finaliza con una operación ENDSR. Cuando bifurque a ejecutar la rutina CALCU al finalizar las operaciones comprendidas en ella, volverá al flujo principal y ejecutara la sentencia MULT donde multiplicamos los campos CAPITA y TASAP, luego bifurcara a otra subrutina que en este ejemplo es PRI01. 0028.14 C *LOVAL SETLLMAEOPE 90 0028.15 C READ ROPER 90 0028.16 C *IN90 DOWEQ*OFF 0028.17 C EXSR CALCU 0028.18 C CAPITA MULT TASAP CAPIT 0028.19 C EXSR PRI01 0028.20 C READ ROPER 90 0028.21 C *IN90 IFEQ *ON 0028.22 C LEAVE 0028.23 C ENDIF 0028.24 C ENDDO 0028.25 C* 0028.26 C MOVE *ON *INLR 28.27 C* 0053.00 C*------------------------------------------------- 0054.00 C* RUTINA DE IMPRESION 0055.00 C*------------------------------------------------- 0056.00 C PRI01 BEGSR 0056.01 C *IN60 IFEQ *ON 0058.00 C WRITETITU 0059.00 C MOVE *OFF *IN60 0060.00 C ENDIF

Page 59: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

59

0061.00 C WRITEDETA 0062.00 C ENDSR 0063.00 C*------------------------------------------------- 0064.00 C* RUTINA DE CALCULO 0065.00 C*------------------------------------------------- 0066.00 C CALCU BEGSR 0066.01 C Z-ADD1 TASAP 86 0066.02 C Z-ADDCANPER N 60 0066.03 C N DOWNE0 0066.04 C TASA MULT TASAP TASAP 0066.05 C SUB 1 N 0066.06 C ENDDO 0066.07 C ENDSR ****************** End of data********************** CASxx (Llamada condicional a una subrutina) Esta operación nos permite seleccionar condicionalmente una subrutina para su procesamiento. La selección de la subrutina se base en la relación entre el factor 1 y el factor 2 según la condición xx. Toda operación CASxx deberá terminar con una operación ENDCS. En este ejemplo observamos las diferentes comparaciones de la operación CASxx y además la sentencia 28.06 esta condicionada su ejecución si se encuentran activos los indicadores 25 y 36. 0028.16 C* 0028.17 C* 0028.18 C STOCK CASLTVENTA SUBR01 0028.19 C 25 36 COMPRA CASEQAUX01 SUBR02 0028.20 C STOCK CASGEVENTA CALCU 0028.21 C ENDCS 0028.22 C* 0028.23 C*

Page 60: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

60

10. PROCESO DE BASES DE DATOS En RPG/400 como en otras versiones de RPG definimos en la hoja 'F' ( file ) archivos o Bases de datos de definición interna o externa, pantallas y printer file ( archivos de impresión ) que utilizaremos en nuestros programas. Esta definición puede ser tanto interna como externa. Comenzaremos viendo como codificamos en la hoja 'F' los archivos a utilizar que poseen definiciones externas. Hoja 'F' 0006.00 F*------------------------------------------------- 0007.00 F* HOJA FILE DESCRIPTION 0008.00 F*------------------------------------------------- 0009.00 FCLIENT IF E K DISK 0010.00 FLISTA O E 60 PRINTER 0011.00 C*------------------------------------------------- 0012.00 C* HOJA DE CALCULO 0013.00 C*------------------------------------------------- Prompt type . . . FX Sequence number . . . 0009.00 File File End of File Filename Type Designation File Sequence Format CLIENT I F E Mode of Record Processing Address Type Device Continuation K DISK File File Exit Entry Addition Condition Columnas 7 a 14 se coloca el nombre de la base de datos (CLIENT). Columna 15 una 'I' ( Input ) para aquellas bases de datos que solamente se utilizaran como entradas Columna 31 una 'K' que determina que la base de datos tiene una clave. Columnas 40 a 46 el dispositivo donde se encuentra la base de datos, en este caso DISK ( disco ).

Page 61: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

61

Hoja 'F' Prompt type . . . F Sequence number . . . 0010.00 File File End of File Filename Type Designation File Sequence Forma LISTA O E Record Mode of Length of Record Length Processing Key Field Address Type File Overflow Key Field Extn Organization Indicator Start Loc Code Device 60 PRINTER File File Continuation Exit Entry Addition Condition Ahora definimos en la hoja 'F' un printer file o sea un archivo de impresión llamado LISTA observemos la letra ' O' que le indica al RPG/400 que es un archivo de salida en el dispositivo impresora y cuya definición es externa y la codificación de un indicador ( de 01 a 99 ) que se activara cuando se produzca el overflow en el formulario de impresión. 0001.00 H*------------------------------------------------- 0002.00 H* SISTEMA : EJEMPLOS RPG/400 TUTORIAL I 0003.00 H* AUTOR : DANIEL HUGO ENRIQUEZ LEIVAS 0004.00 H* PROGRAMA: PROG01 0005.00 H* FECHA : 2002 0006.00 F*------------------------------------------------- 0007.00 F* HOJA FILE DESCRIPTION 0008.00 F*------------------------------------------------- 0009.00 FCLIENT IF E K DISK 0010.00 FLISTA O E 60 PRINTER 0011.00 C*------------------------------------------------- Nuestro programa leera el archivo CLIENT y por cada registro leído verificara que el crédito actual no sea mayor al limite de crédito otorgado, si es mayor el control del programa bifurca a la subrutina de impresión, la que se encargara de imprimir el reporte LISTA según el

Page 62: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

62

formato definido en este printer file. Observe en la sentencia del printer file en la hoja 'F' el uso del indicador 60 ( podría ser cualquier indicador del 01 al 99 ) este indicador le permite identificar al RPG/400 el overflow de página (desbordamiento de pagina) cuando esta activado el mismo. Hoja 'C' 0011.00 C*------------------------------------------------- 0012.00 C* HOJA DE CALCULO 0013.00 C*------------------------------------------------- 0014.00 C *LOVAL SETLLCLIENT 90 0015.00 C WRITETITU 0016.00 C READ RCLI 90 0017.00 C *IN90 DOWEQ*OFF 0018.00 C CREDITIFGT LIMCRE 0019.00 C EXSR IMPR01 0020.00 C ENDIF 0021.00 C READ RCLI 90 0022.00 C *IN90 IFEQ *ON 0023.00 C LEAVE 0024.00 C ENDIF 0025.00 C ENDDO 0026.00 C MOVE '1' *INLR 0027.00 C WRITEFIN 0028.00 C*------------------------------------------------- 0029.00 C* RUTINA DE IMPRESION 0030.00 C*------------------------------------------------- 0031.00 C IMPR01 BEGSR 0032.00 C *IN60 IFEQ *ON 0033.00 C WRITETITU 0033.01 C MOVE '0' *IN60 0034.00 C ENDIF 0035.00 C WRITEDETA 0036.00 C ENDSR

Page 63: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

63

En el siguiente ejemplo hemos adicionado al ejemplo anterior un archivo de salida llamado CREDEX. Hoja 'F' Columns . . . : 1 71 Edit V40LBDHE/QRPGSRC SEU==> PROG02 FMT * ..... *. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 *************** Beginning ofdata********************* 0001.00 H*------------------------------------------------- 0002.00 H* SISTEMA : EJEMPLOS RPG/400 TUTORIAL I 0003.00 H* : BUENOS AIRES ARGENTINA 0004.00 H* AUTOR : DANIEL HUGO ENRIQUEZ LEIVAS 0005.00 H* PROGRAMA: PROG02 0006.00 H* FECHA : 2002 0007.00 F*------------------------------------------------- 0008.00 F* HOJA FILE 0009.00 F*------------------------------------------------- 0010.00 FCLIENT IF E K DISK 0011.00 FLISTA O E 60 PRINTER 0012.00 FCREDEX O E DISK 0013.00 C*------------------------------------------------- 0014.00 C* HOJA DE CALCULO 0015.00 C*------------------------------------------------- 0016.00 C *LOVAL SETLLCLIENT 90 (C) COPYRIGHT IBM CORP. 1981, 2000. Hoja 'C' 0013.00 C*------------------------------------------------- 0014.00 C* HOJA DE CALCULO 0015.00 C*------------------------------------------------- 0016.00 C *LOVALSETLLCLIENT 90 0017.00 C WRITETITU 0018.00 C READ RCLI 90 0019.00 C *IN90 DOWEQ*OFF 0020.00 C CREDIT IFGT LIMCRE 0021.00 C EXSR IMPR01 0022.00 C EXSR GRABA 0023.00 C ENDIF 0024.00 C READ RCLI 90 0025.00 C *IN90 IFEQ *ON 0020.00 C CREDITIFGT LIMCRE 0021.00 C EXSR IMPR01 0022.00 C EXSR GRABA

Page 64: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

64

0023.00 C ENDIF 0024.00 C READ RCLI 90 0025.00 C *IN90 IFEQ *ON 0026.00 C LEAVE 0027.00 C ENDIF 0028.00 C ENDDO 0029.00 C MOVE '1' *INLR 0030.00 C WRITEFIN 0031.00 C*------------------------------------------------- 0032.00 C* RUTINA DE IMPRESION 0033.00 C*------------------------------------------------- 0034.00 C IMPR01 BEGSR 0035.00 C *IN60 IFEQ *ON 0036.00 C WRITETITU 0037.00 C MOVE '0' *IN60 0038.00 C ENDIF 0039.00 C WRITEDETA 0040.00 C ENDSR 0041.00 C*------------------------------------------------- 0042.00 C* RUTINA DE GRABACION 0043.00 C*------------------------------------------------- 0044.00 C GRABA BEGSR 0045.00 C WRITERCREX 0046.00 C ENDSR ***************** End of data************************ Ahora hemos agregado a nuestro programa una pantalla, observe el archivo de definición externa PANTA, lleva una C ( combinado ) en la columna 15 , 'F' (Full procedure) en la culumna 16 , cuya definición es externa a través de una DDS que define la estructura de campos de entrada, salida y constantes y su dispositivo es una Work station ( WORKSTN). Le pediremos a través de la pantalla el rango de clientes a procesar en nuestro programa. 0009.00 F*------------------------------------------------- 0009.01 FPANTA CF E WORKSTN 0010.00 FCLIENT IF E K DISK 0011.00 FLISTA O E 60 PRINTER 0012.00 FCREDEX O E DISK 0013.00 C*------------------------------------------------- Prompt type . . . FX Sequence number . . . 0010.00 File File End of File Filename Type Designation File Sequence Format PANTA C F E Mode of Record

Page 65: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

65

Processing Address Type Device Continuation WORKSTN File File Exit Entry Addition Condition

0016.01 C *INKC DOWNE*ON 0016.02 C EXFMTPAN01 0016.03 C *INKC IFEQ *ON 0016.04 C LEAVE 0016.05 C ENDIF 0017.00 C *LOVAL SETLLCLIENT 90 0018.00 C WRITETITU 0019.00 C READ RCLI 90

Sistemas S.A. 20/02/2002 Clientes excedidos del límite de Crédito Cliente desde: 00001 Cliente hasta: 08000 Mdto 3 = Exit

Page 66: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

66

Apertura y cierre de archivos durante las operaciones de calculo En muchas oportunidades los programas utilizan ciertas bases de datos bajo determinadas condiciones, es decir que no es necesario tener dichas bases de datos abiertas en forma permanente. En el RPG/400 podemos realizar la apertura y cierre de base de datos a voluntad, eludiendo la apertura por omisión en la hoja 'F'. Columns . . . : 1 71 Edit V40LBDHE/QRPGSRC SEU==> PROG03 FMT * ..... *. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 *************** Beginning of data*************** 0001.00 H*------------------------------------------------- 0002.00 H*EJEMPLOS RPG/400 TUTORIAL I 0003.00 H*BUENOS AIRES ARGENTINA 0004.00 H*DANIEL HUGO ENRIQUEZ LEIVAS 0005.00 H*PROGRAMA: PROG04 0006.00 H*FECHA : 2002 0007.00 F*------------------------------------------------- 0008.00 F* HOJA FILE 0009.00 F*------------------------------------------------- 0010.00 FPANTA CF E WORKSTN 0011.00 FCLIENT I F E K DISK UC 0012.00 FLISTA O E 60 PRINTER 0013.00 FCREDEX O E DISK 0014.00 C*------------------------------------------------- 0015.00 C* HOJA DE CALCULO 0016.00 C*------------------------------------------------- Vemos en el programa en la hoja 'F', que la base de datos CLIENT tendra su apertura y cierre durante el calculo indicada por la codificación en las columnas 71 y 72 de 'UC'. Prompt type . . . FX Sequence number . . . 0011.00

Page 67: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

67

File File End of File Filename Type Designation File Sequence Format CLIENT I F E Mode of Record Processing Address Type Device Continuation K DISK File File Exit Entry Addition Condition UC Si necesitáramos actualizar un archivo, por ejemplo CLIENT (maestro de clientes) codificaríamos en la hoja 'F' el archivo de la siguiente manera. FMT * ..... *. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 *************** Beginning of data********************* 0001.00 H*------------------------------------------------- 0002.00 H* SISTEMA : EJEMPLOS RPG/400 TUTORIAL I 0003.00 H* : BUENOS AIRES ARGENTINA 0004.00 H* AUTOR : DANIEL HUGO ENRIQUEZ LEIVAS 0005.00 H* PROGRAMA: PROG05 0006.00 H* FECHA : 2002 0007.00 F*------------------------------------------------- 0008.00 F* HOJA FILE 0009.00 F*------------------------------------------------- 0010.00 FPANTA CF E WORKSTN 0011.00 FCLIENT UF E K DISK A 0012.00 FLISTA O E 60 PRINTER 0013.00 FCREDEXO E DISK 0014.00 C*------------------------------------------------- 0015.00 C* HOJA DE CALCULO 0016.00 C*------------------------------------------------- Columna 15 'U' por update y en la columna 66 una 'A' adición, esto significa que podemos modificar un registro existente o borrar y adicionar aquellos que sean necesarios. Si necesitaramos grabar registros en una base de datos por numero relativo de registro, la codificación en la hoja 'F' seria de la siguiente forma:

Page 68: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

68

FMT * ..... *. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 0009.00 F*------------------------------------------------- 0010.00 FPANTA CF E WORKSTN 0011.00 FF0002 O E K DISK KRECNO RRN 0012.00 FLISTA O E 60 PRINTER 0013.00 FCREDEXO E DISK 0014.00 C*------------------------------------------------- 0015.00 C* HOJA DE CALCULO 0016.00 C*------------------------------------------------- 0016.01 C *INKC DOWNE*ON 0016.02 C EXFMTPAN01 Vemos que la base de datos F0002 se ha abierto de salida y se ha especificado en la columna 53 una 'K' continuación de especificaciones, la palabra clave RECNO indicando que se procesara por numero relativo de registro y a continuación el nombre de campo que contendra el numero relativo de registro en este caso RRN. En la hoja de calculo deberá establecerse el valor de RRN o sea del numero relativo de registro a procesar. Para poder efectuar esta adición aleatoria en una base de datos, esta deberá haber sido inicializada con el comando INZPFM (CL) con la cantidad de registros necesaria.

Page 69: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

69

0001.00 H.------------------------------------------------- 0002.00 H* SISTEMA : SISTEMA GENERAL DEL BANCO 0004.00 H* AUTOR : DANIEL HUGO ENRIQUEZ LEIVAS 0005.00 H* PROGRAMA: PROG32 0006.00 H* FECHA : 2001 0009.00 F*------------------------------------------------- 0010.00 FPRG32FM CF E WORKSTN 0010.01 F NRR1 KSFILE RPRG01 0012.00 FGJHL1 IF E K DISK 0012.01 FPRG32PF O E 60 PRINTER 0012.02 I*------------------------------------------------- Obsérvese la codificación del archivo WORKSTN donde en la línea de continuación definimos el campo RRN1 que contendrá el numero relativo de registro para el control del subfile del archivo de pantalla PRG32FM , formato de registro RPRG01. Definiciones internas Hoja 'F' 0007.00 F*------------------------------------------------- 0008.00 F* HOJA FILE 0009.00 F*------------------------------------------------- 0010.00 FGJHX01 IF F 256 6AI 1 DISK 0011.00 FCLIENT IF E K DISK 0012.00 FPRO03P O E 60 PRINTER 0012.01 F*------------------------------------------------- FMT F .....FFilenameIPEAF....RlenLK1AIOvKlocEDevice+......KExit++Entry+A....U 0010.00 FGJHX01 IF F 256 6AI 1 DISK 0011.00 FCLIENT IF E K DISK 0012.00 FPRO03P O E 60 PRINTER Prompt type . . . F Sequence number . . . 0010.00

Page 70: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

70

File File End of File Filename Type Designation File Sequence Format GJHX01 I F F Record Mode of Length of Record Length Processing Key Field Address Type 256 6 A File Overflow Key Field Extn Organization Indicator Start Loc Code Device I 1 DISK File File Continuation Exit Entry Addition Condition F3=Exit F4=Prompt F5=Refresh F11=Previous record F12=Cancel F23=Select prompt F24=More keys que contiene el archivo y sus respectivas longitudes. Ahora deberemos definir por medio de la hoja 'I' los campos Hoja 'I' 0012.01 F*------------------------------------------------- 0012.02 F* HOJA INPUT 0012.03 F*------------------------------------------------- 0012.04 IGJHX01 NS 01 0012.05 I 1 60 CAMP01 0012.06 I 7 12 CAMP02 0012.07 I 13 20 2CAMP03 0012.08 I 21 21 CAMP04 0012.09 I P 22 27 2CAMP05 0012.10 I 28 28 CAMP06 0012.11 I 28 56 CAMP07 0012.12 I 57 652CAMP08 0012.13 I 256 256 CAMP20 Observe el la hoja 'F' que definimos la longitud del registro en este caso 256, la longitud de la clave de 6 posiciones y que comienza en la posicion 1 del registro. Luego en la hoja I se definen el nombre del archivo y los campos con sus posiciones de comienzo y fin, como así también sus posiciones decimales en el caso de ser campos numéricos y/o empaquetados.

Page 71: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

71

11. OPERACIONES DE ARCHIVO SETLL ( Situar límite inferior ) READ (Leer un registro ) SETGT (Situar en mayor que ) READP (Leer registro anterior) READE (Leer clave igual ) REAPE (Leer registro anterior igual ) READC (Leer el siguiente registro modificado ) CHAIN (Recuperacion al azar ) WRITE (Grabar un registro) UPDAT (Modificar un registro) DELET (Borrar un registro) OPEN (Abrir archivo) CLOSE (Cerrar archivo) FEOD (Forzar fin de datos) UNLCK (Liberar un registro o desbloquear un area de datos)

Page 72: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

72

SETLL ( Situar límite inferior ) La operación SETLL sitúa en una Base de datos en el siguiente registro que tiene una clave o numero relativo de registro que es mayor que o igual al argumento de búsqueda ( clave o numero relativo de registro ) especificado en el factor 1. Esta base de datos debe ser definida en la hoja 'F' como de procedimiento completo codificando para ello una 'F' en la columna 16. El factor 1 es necesario. Si se accede al archivo por clave, el factor 1 puede ser un nombre de campo, una constante con nombre, una constante figurativa o un literal que se utiliza como argumento de búsqueda al situar el archivo. También el programador puede especificar un nombre de KLIST en el factor 1 para un archivo descrito externamente. El factor 2 es necesario y debe contener un nombre de archivo. En la hoja 'C' los indicadores resultantes reflejan el estado de la operación. Si se especifica un indicador en las columnas 54 y 55, este se activara cuando el argumento de búsqueda sea mayor que la mayor clave o numero relativo de registro del archivo. Si especificamos un indicador en las columnas 56 y 57, este se activara cuando la operación no se complete con éxito y si especificamos un indicador en las columnas 58 y 59 este se activara cuando este presente un registro cuya clave o numero relativo de registro sea igual al argumento de búsqueda. Podemos utilizar constantes figurativas para situarnos en la base de datos, *LOVAL nos sitúa en la clave mas baja y *HIVAL en la clave mas alta. Si la operación SETLL no tiene éxito (condición de registro no encontrado) nos situaremos en el final de archivo. Luego de alcanzar el final de archivo con una operación SETLL podemos emitir otra sentencia SETLL para resituar el archivo.

Page 73: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

73

SETLL no accede a un registro de datos determinado, si se deseara verificar la existencia o no de un registro podemos utilizar esta operación con un indicador de igual, posiciones 58 y 59 pero el RPG/400 tiene una operación especifica para estos casos permitiéndonos un mayor rendimiento , esa operación es la operación CHAIN que veremos mas adelante. Este ejemplo ya le es familiar, debemos leer la base de datos CLIENT . Para eso debemos situarnos al principio de la base de datos y acceder por clave, en este caso la mas baja por lo que utilizaremos SETLL y en el factor 1 la constante figurativa *LOVAL. FMT * ..... *. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 *********Beginning of data******* 0001.00 H*------------------------------------------------- 0002.00 H* EMPRESA :BOBAGALOS SAICA HNOS 0004.00 H* AUTOR : DANIEL H. ENRíQUEZ 0005.00 H* PROGRAMA: PROG33 0006.00 H* FECHA : 2002 0009.00 F*------------------------------------------------- 0010.00 FFCL005 IF E K DISK 0012.01 FFCL005P O E 60 PRINTER 0012.02 F*------------------------------------------------- 0012.03 E TIT 1 1 80 0028.00 C*------------------------------------------------- 0028.01 C* 0028.02 C*------------------------------------------------- 0028.03 C EXSR INI 0028.13 C* 0028.14 C *LOVAL SETLLFCL005L1 90 028.15 C READ RFC05 90 028.16 C* 028.17 C* 028.18 C *IN90 DOWEQ*OFF 028.19 C CODVTA IFNE *ZEROS 028.20 C EXSR PRIN01 028.21 C ENDIF 028.22 C READ RFC05 90 028.23 C *IN90 IFEQ *ON

Page 74: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

74

En el ejemplo anterior vemos la utilización de SETLL con una contante figurativa *LOVAL lo que nos asegura posicionarnos en la clave mas baja de la base de datos, para luego leerla por medio de la sentencia READ en orden ascendente hasta finalizar la misma. READ ( Leer un registro ) La operación READ lee un registro de una base de datos la cual debe haber sido definida en la hoja 'F' como full procedure columna 16. El factor 2 deberá contener un nombre de archivo o un nombre de formato de registro siempre y cuando en este ultimo caso en archivo fuese definido como externo. Deberá especificar un indicador en las columnas 58 y 59 para determinar si se ha producido el final de archivo. Este indicador se activa o desactiva cada vez que se procesa una operación READ. El programador puede establecer un indicador de resultado en las columnas 56 y 57 para que se active si la operación READ no ha finalizado con éxito. Si el archivo del cual se esta leyendo es un archivo en disco de actualización, podremos especificar una 'N" en las columna 53 de la hoja de calculo, la cual le indicara al RPG/400 que no se desea ningún bloqueo de registro cuando se lee.

Page 75: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

75

FMT * ..... *. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ********* Beginning of data********* 0001.00 H*------------------------------------------------- 0002.00 H* EMPRESA BOBAGALOS SAICA HNOS 0004.00 H* DANIEL HUGO ENRIQUEZ LEIVAS 0005.00 H* PROGRAMA: PROG33 0006.00 H* FECHA : 2002 0009.00 F*------------------------------------------------- 0010.00 FFCL005 IF E K DISK 0012.01 FFCL005P O E 60 PRINTER 0012.02 F*------------------------------------------------- 0012.03 E TIT 1 1 80 0028.00 C*------------------------------------------------- 0028.01 C* 0028.02 C*------------------------------------------------- 0028.03 C EXSR INI 0028.13 C* 0028.14 C *LOVAL SETLLFCL005L1 90 028.15 C READ RFC05 90 028.16 C* 028.17 C* 028.18 C *IN90 DOWEQ*OFF 028.19 C CODVTA IFNE *ZEROS 028.20 C EXSR PRIN01 028.21 C ENDIF 028.22 C READ RFC05 90 028.23 C *IN90 IFEQ *ON 0028.19 C CODVTA IFNE *ZEROS 0028.20 C EXSR PRIN01 0028.21 C ENDIF 0028.22 C READ RFC05 90 0028.23 C *IN90 IFEQ *ON 0028.24 C LEAVE 0028.25 C ENDIF 0028.33 C ENDDO 0028.34 C* 0028.35 C MOVE *ON *INLR 0028.36 C* En este ejemplo nos situamos en el inicio de archivo con una operación SETLL y leemos El primer registro, si no se activa el indicador 90 ( o sea si no ha alcanzado fin de archivo ) el control del programa pasara al DOWxx el que se encuentra condicionado para su

Page 76: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

76

ejecución por el indicador 90 siempre que este desactivado o sea en *OFF. Una vez dentro del DOWxx se realizaran las operaciones correspondientes al primer registro y luego leerá el siguiente registro, si no se activa el indicador 90 seguirá procesando las sentencias dentro de este grupo, caso contrario se ejecutara la operación LEAVE la cual nos permitirá abandonar el DOWxx y ejecutar la/s sentencias inmediatamente posteriores. SETGT ( Situar en mayor que ) Esta operación nos sitúa dentro de la base de datos en el siguiente registro cuya clave o numero relativo de registro es mayor a la clave o numero relativo de registro especificada en el factor 1. El factor 1 es necesario y si accedemos por clave este factor debe ser un nombre de campo, una constante figurativa, una constante con nombre, un literal o especificar un nombre KLIST. El factor 2 es obligatorio y debe contener un nombre de archivo o un nombre de registro. Podemos especificar un indicador en las columnas 54 y 55 para que se active si no se encuentra ningún registro con una clave o numero relativo de registro que sea mayor a la clave de búsqueda que especificamos en el factor 1 y también podemos codificar en las columnas 56 y 57 un indicador que se activara cuando se produzca un error en la lectura del archivo. Si la operación de búsqueda no es satisfactoria o se no se encontró el registro nos situaremos al final del archivo. El campo CLAVE contiene el numero 1983 de cliente 0028.02 C*------------------------------------------------- 0028.03 C CLAVE SETGTCLIENTE 90 0028.04 C READ RCLI 90 0028.05 C*

Page 77: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

77

1980

CARLOS GONZALEZ

1983

JHON SIMPSON

1984

DIEGO ANDRES

1991

JUAN ALBERTO

Con la operación SETGT quedara posicionado para leer el registro cuyo numero de cliente es 1984. Luego la operación READ leerá este registro. También podemos utilizar las constantes figurativas *LOVAL y *HIVAL. Si tenemos un archivo con clave en orden descendente podemos situarnos mediante *HIVAL de manera que se sitúa en el primer registro del archivo o si usáramos *LOVAL nos situaremos en el ultimo registro. 0028.14 C *HIVAL SETGTFCL005L1 90 0028.14 C *LOVAL SETGTFCL005L1 90 READP (Leer registro anterior) Esta operación lee el registro anterior en un archivo definido en la hoja 'F' como Full procedure. El factor 2 deberá contener el nombre de un archivo o formato de registro. Cuando la operación READP es satisfactoria nos situamos en el siguiente registro que satisface la lectura. En las posiciones 58 y 59 de la hoja de calculo debemos codificar un indicador que se activara cuando no existan registros anteriores en el archivo. Podemos además codificar un indicador en las posiciones 56 y 57 el cual se activara cuando se produzca un error en la lectura del archivo.

Page 78: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

78

En el siguiente ejemplo trabajaremos con una archivo con clave en orden descendente y deseamos posicionarnos en el ultimo registro y leer todo el archivo hasta llegar al primer registro. 0028.02 C*------------------------------------------------- 0028.05 C* 0028.06 C EXSR INI 0028.13 C* 0028.14 C *HIVAL SETGTFCL005L1 90 0028.15 C READPRFC05 90 0028.16 C* 0028.17 C* 0028.18 C *IN90 DOWEQ*OFF 0028.19 C CODVTA IFNE *ZEROS 0028.20 C EXSR PRIN01 0028.21 C ENDIF 0028.22 C READPRFC05 90 READE ( leer clave igual ) Esta operación recupera el siguiente registro si la clave del registro coincide con el argumento de búsqueda. Si la clave no coincide con el argumento de búsqueda, el indicador que se especifica en las columnas 58 y 59 se activa y el registro no se devuelve al programa. En el argumento de búsqueda que es opcional puede especificarse un nombre de campo, un literal, una constante con nombre o una constante figurativa. Si dejáramos el argumento de búsqueda en blanco y la clave completa del siguiente registro es igual a la del registro actual, se recuperara el siguiente registro. El factor 2 deberá contener el nombre del archivo a recuperar o un nombre de formato de registro. Si estamos leyendo un archivo en disco de actualización Podemos especificar una 'N' en la columna 53 de la hoja de calculo con lo que le indicaremos al RPG que no coloque ningún bloqueo en el registro que se lee. También podemos especificar una indicador en las columnas 56 y 57 para que se active cuando se produce Un error en la lectura o no se completa con éxito la operación.

Page 79: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

79

En el siguiente ejemplo tenemos una base de datos indexada por numero de cliente y numero de comprobante, ( clave compuesta) se ingresa por pantalla los argumentos de búsqueda y debemos leer todos los registros que coincidan con el argumento en cuestión. Campa clave = 001955 + 00345271 Nos posicionamos en la clave mas baja con *LOVAL SETLL , luego con el campo CLAVE ejecutamos la operación READE , si el indicador no esta activo o sea hemos encontrado una registro de igual clave el programa ejecutara el DOWxx, luego bifurcara a la rutina CALCU y PRIN01, volverá a leer y procesara esta secuencia hasta que la clave del siguiente registro sea distinta al argumento de búsqueda o sea procesara hasta que se active el indicador 90. 0028.05 C* 0028.06 C EXSR INI 0028.13 C* 0028.14 C *LOVAL SETLL MOVI 90 0028.15 C READERMOVI 90 0028.16 C* 0028.17 C* 0028.18 C *IN90 DOWNE*ON 0028.19 C EXSR CALCU 0028.22 C EXSR PRIN01 0028.23 C READE RMOVI 90 0028.24 C *IN90 IFEQ *ON 028.25 C LEAVE 028.26 C ENDIF 028.33 C ENDDO 028.34 C* 028.35 C MOVE *ON *INLR 028.36 C* REAPE ( Leer registro anterior igual ) Esta operación nos permite recuperar el siguiente registro anterior de un archivo de procesamiento completo ( full procedure ) si la clave del registro coincide con el argumento de búsqueda. Si la clave no coincide con el argumento de búsqueda el indicador que definamos

Page 80: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

80

en las columnas 58 y 59 se activara y el registro no se devuelve al programa. El factor 1 o sea el argumento de búsqueda puede ser un literal, una constante figurativa, un nombre de campo o una KLIST. El factor 2 deberá contener el nombre del archivo o el formato de registro que deseamos recuperar. Deberemos especificar un indicador resultante en las columnas 58 y 59 el cual se activara si no se encuentra ninguna clave de registro coincidente. Opcionalmente podemos definir un indicador de resultados en las columnas 56 y 57 el cual se activara si se produce un error durante la operación de lectura. Si estuviéramos leyendo un archivo en disco de actualización podemos codificar una 'N' en la columna 53 para indicarle al RPG que no deseamos el bloqueo del registro. Sobre el ejemplo anterior leeremos el mismo archivo pero nos posicionaremos en la clave mas alta con *HIVAL SETLL y leeremos los registros coincidentes. 0028.05 C* 0028.06 C EXSR INI 0028.13 C* 0028.14 C *HIVALSETLL MOVI 90 0028.15 C REAPERMOVI 90 0028.16 C* 0028.17 C* 0028.18 C *IN90 DOWNE*ON 0028.19 C EXSR CALCU 0028.22 C EXSR PRIN01 0028.23 C REAPE RMOVI 90 0028.24 C *IN90 IFEQ *ON 028.25 C LEAVE 028.26 C ENDIF 028.33 C ENDDO 028.34 C* 028.35 C MOVE *ON *INLR 028.36 C* CHAIN (Recuperación al azar)

Page 81: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

81

Esta operación nos permite recuperar un registro desde un archivo definido en la hoja 'F' en la columna 16 de procedimiento completo, el acceso se realiza por clave y recupera el primer registro cuya clave coincida con el argumento de búsqueda. Si no se encuentra ningún registro coincidente se produce la condición de registro no encontrado. En el factor 1 deberá especificar un nombre de campo, una constante figurativa, un literal, una constante con nombre o el nombre de una KLIST ( Clave compuesta. En el factor 2 deberemos especificar el nombre de un archivo o el nombre del formato de registro que deseamos leer. Deberemos especificar un indicador resultante en las columnas 54 y 55 que se activara cuando no se encontrare un registro coincidente y en las posiciones 56 y 57 un indicador opcional que se activara cuando la operación CHAIN no se realiza satisfactoriamente. 0028.13 C* 0028.14 C CLIENP CHAINCLIENT 60 0028.15 C* 0028.16 C *IN60 IFEQ *OFF 0028.17 C EXSR PROCE 0028.18 C EXSR PRIN 0028.19 C ELSE 0028.21 C EXSR NOENC 0028.22 C ENDIF 0028.23 C* En este ejemplo accedemos al azar por numero de cliente (campo CLIENP) al archivo CLIENT (clientes). Observamos que se codifico un indicador resultante en las columnas 54 y 55. Si este indicador no se encuentra activo procesara las rutinas PROCE y PRIN caso contrario ( esta activo ) registro no encontrado procesara la rutina NOENC. Si está accediendo a una archivo de ENTRADA se leerán todos los registros sin bloqueos pero si el archivo es de ACTUALIZACION se bloquean todos los registros si el la posición 53 no se coloca una 'N'. Cuando utilizamos la operación CHAIN en archivos de WORKSTN dicha operación recupera un registro de subarchivo, al cual se accede por numero relativo de registro.

Page 82: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

82

Ahora veremos en este ejemplo que leemos todo el archivo MOVTAS (movimiento de ventas) en donde por cada registro tenemos el numero de cliente y su compra anual y deberemos imprimir un reporte con estos datos y su nombre o razón social que se encuentra en el maestro de clientes (MAECLI). Observe la rutina DATOS y vera que para la operación CHAIN se ha utilizado el indicador 77, si el indicador 77 no se encuentra activo luego de que se halla ejecutado la operación CHAIN esto nos indica que existe un registro que coincide el numero de cliente con el campo clave CLIENT o sea que el cliente existe y estamos en condiciones de extraer los datos que se encuentran en el registro que para nuestro ejemplo necesitamos conocer su razón social o apellido y nombre. Por el contrario si el indicador 77 se hubiese activado por la ejecución de la operación CHAIN esto nos indica que no existe ningún registro coincidente o sea que el cliente no existe en el maestro de clientes. 0028.13 C* 0028.14 C *LOVAL SETLL MOVTA 90 0028.16 C *IN90 DOWEQ*OFF 0028.17 C EXSR DATOS 0028.18 C EXSR IMPRI 0028.19 C READ RMOV 90 0028.20 C *IN90 IFEQ *ON 0028.21 C LEAVE 0028.25 C ENDIF 0028.26 C ENDDO 0028.27 C* 0028.28 C MOVE *ON *INLR 0028.29 C* 0053.00 C*------------------------------------------------- 0054.00 C* RUTINA DE DATOS ADICIONALES 0055.00 C*------------------------------------------------- 0056.00 C DATOS BEGSR 0056.01 C CLIENT CHAINMAECLI 77 0058.00 C *IN77 IFEQ *OFF 0059.00 C MOVELAYN AYNP 0060.00 C ENDIF 0062.00 C ENDSR 0063.00 C*------------------------------------------------- WRITE (Grabar un registro)

Page 83: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

83

Esta operación nos permite grabar un nuevo registro en una base de datos. El factor 2 debe contener el nombre de un archivo. Cuando el archivo esta definido externamente es necesario un nombre de formato de registro y el RPG/400 utilizara todos los valores actuales de campos en el programa para construir el registro. Deberá especificarse una 'A' (Adición de archivos) en la posición 66 de la hoja 'F'. En las posiciones 56 y 57 se puede codificar una indicador para que se active si la operación WRITE no se completa satisfactoriamente. FMT * ..... *. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+. 0001.00 H*------------------------------------------------- 0001.01 H* SYSTEM : SISTEMA DE VENTAS 0002.00 H* CAMPFIRE COORPORATION , MI, EEUU 0004.00 H* DANIEL HUGO ENRIQUEZ LEIVAS 0005.00 H* PROGRAMA: PROG35 0006.00 H* FECHA : 3 DE NOVIEMBRE 0009.00 F*------------------------------------------------- 0010.00 FMOVTA IF E K DISK 0010.01 FMAECLI IF E K DISK 0010.02 FCLINOE UF E K DISK A 012.00 FLISTA O E 22 PRINTER 0012.01 F*------------------------------------------------- 0028.13 C* 0028.14 C *LOVAL SETLL MOVTA 90 0028.16 C *IN90 DOWEQ*OFF 0028.17 C EXSR DATOS 0028.18 C EXSR IMPRI 0028.19 C READ RMOV 90 0028.20 C *IN90 IFEQ *ON 0028.21 C LEAVE 0028.25 C ENDIF 0028.26 C* 0028.27 C ENDDO 0028.28 C* 0028.29 C MOVE *ON *INLR 0028.30 C* 0028.30 C* 0053.00 C*------------------------------------------------- 0054.00 C* RUTINA DE DATOS ADICIONALES 0055.00 C*------------------------------------------------- 0056.00 C DATOS BEGSR 0056.01 C CLIENT CHAINMAECLI 77 0058.00 C *IN77 IFEQ *OFF 0059.00 C MOVELAYN AYNP

Page 84: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

84

0059.01 C ELSE 0059.02 C WRITERNOEC 0060.00 C ENDIF 0062.00 C ENDSR 0063.00 C*------------------------------------------------- En la rutina DATOS hemos agregado la operación WRITE para grabar un registro con informacion por cada código de cliente no encontrado en el maestro de clientes.

Page 85: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

85

UPDAT (Modificar Registro Existente) Esta operación modifica el ultimo registro que se ha recuperado desde un archivo de actualización. No se debe ejecutar ninguna otra operación en el archivo entre la operación de entrada del registro y la operación UPDAT. El factor 2 deberá contener un nombre de formato de registro o archivo. Es necesario un nombre de formato de registro para un archivo definido en la hoja 'F' como externo. Podemos codificar un indicador de resultado en las columnas 56 y 57 para determinar algun error el la operacion si este se activa. Antes de procesar una operación UPDAT deberemos realizar una operación de entrada valida con bloqueo ( CHAIN, READ, READC,READE, REAPE) con bloqueo. 0001.00 H*-------------------------------------------------------------- 0001.01 H* BLISSFIELD BUSSINES ADMINISTRATION 0002.00 H* BLISSFIELD CITY , MI, EEUU 0004.00 H* DANIEL HUGO ENRIQUEZ LEIVAS 0005.00 H* PROGRAMA: PROG40 0006.00 H* FECHA : 8 DE FEBRERO DE 2002 0009.00 F*------------------------------------------------- 0009.01 FMAECLI IF E K DISK 0010.01 FMAECLI UF E K DISK 0012.01 F*------------------------------------------------- 0028.13 C* 0028.14 C* 0028.16 C* 0028.17 C UPDATRMOV 0028.26 C* 0028.28 C*

Page 86: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

86

DELET ( Borrar un registro) La operación DELET nos permite suprimir un registro de una base de datos. Este archivo debe ser definido en la hoja F como de actualización ( U en la columna 15). El registro a suprimir debe estar bloqueado por medio de una operación de entrada previa que puede ser CHAIN o READ. El registro suprimido no puede recuperarse posteriormente. En el factor 1 que es el argumento de búsqueda puede contener una clave o un numero relativo de registro. En el caso de que el acceso sea por clave el factor 1 contendrá un nombre de campo, un literal una constante con nombre. Si el archivo esta definido con definición externa puede el factor 1 contener una KLIST . Si accediéramos por numero relativo de registro el factor 1 deberá contener un literal entero o un campo numérico sin posiciones decimales. En el factor 2 definiremos el nombre de formato de registro para todo archivo definido externamente o si es definido internamente el nombre del archivo. Como en las operaciones anteriores podemos codificar un indicador de resultado en las columnas 56 y 57 que se activara si la operación DELET no se realiza satisfactoriamente. A continuación veremos la aplicación de esta sentencia por medio del siguiente programa ejemplo: 0001.00 H*------------------------------------------------- 0001.01 H* BLISSFIELD BUSSINES ADMINISTRATION 0002.00 H* : MICHIGAN , EEUU 0004.00 H* DANIEL HUGO ENRIQUEZ LEIVAS 0005.00 H* PROGRAMA: PROG40 0006.00 H* FECHA : 8 DE FEBRERO 0009.00 F*------------------------------------------------- 0009.01 FMAECLI IF E K DISK 0010.01 FMAECLI UF E K DISK 0012.01 F*------------------------------------------------- 0028.13 C* 0028.14 C* 0028.16 C*

Page 87: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

87

0028.17 C DELETRMOV 50 0028.26 C* 0028.28 C* La sentencia DELET borrara físicamente de la base de datos el registro en donde se encuentra posicionada el cual se encuentra definido en su respectiva DDS por el nombre RMOV. A continuación desarrollaremos un ejemplo de Alta, Baja y Modificación sobre una base de datos. Primero veremos la definición del archivo físico , y luego los archivos lógicos. Work with Members Using PDM V400Y File . . . . . . QDDSSRC Library . . . . V40LBDHE Position to . . . . . Type options, press Enter. 2=Edit 3=Copy 4=Delete 5=Display 6=Print 7=Rename 8=Display description 9=Save 13=Change text 14=Compile 15=Create module... Opt Member Type Text BPP001 PF BLISSFIELD PATIENT DATA BASE BPP001L1 LF BLISSFIELD PATIENT DATA BASE - S.SECURITY INDEX BPP001L2 LF BLISSFIELD PATIENT DATA BASE - L.NAME INDEX BPP001L3 LF BLISSFIELD PATIENT DATA BASE - ZIP CODE INDEX FCL005 PF MAESTRO DE CLIENTES FCL005L1 LF MAESTRO DE CLIENTES POR NUMERO DE CLIENTE FCL005L2 LF MAESTRO DE CLIENTES POR NUMERO DE CLIENTE ACTIVOS FCL005L3 LF MAESTRO DE CLIENTES POR RAZON SOCIAL More... Parameters or command ===> F3=Exit F4=Prompt F5=Refresh F6=Create F9=Retrieve F10=Command entry F23=More options F24=More keys

Page 88: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

88

ARCHIVO FISICO 0000.01 A* --------------------------------------------------------------- 0000.02 A* SYSTEM BFP - 0000.03 A* FILE BPP001 0000.21 A* DATE 2001 0000.22 A* DANIEL HUGO ENRIQUEZ LEIVAS 0000.23 A* BLISSFIELD, MI, EEUU 0000.31 A*---------------------------------------------------------------- 0000.40 A R RBFP01 0000.41 A CODSS 15 0 TEXT('SECURITY') 0000.42 A LASTN 15 TEXT('LASTNAME') 0000.43 A FIRSTN 20 TEXT('FIRSTN') 0000.44 A ADRESS 35 TEXT('ADRESS') 0000.45 A STATE 25 TEXT('STATE') 0000.46 A ZIPCOD 6 TEXT('ZIP CODE') 0000.47 A TELEPH 6 TEXXT('TELE') 0000.50 A SEX 1 TEXT('SEX') 0000.51 A EGE 3 0 TEXT('EGE') ****************** End of data************** El archivo físico BPP001 contiene los campos mínimos para la identificación del paciente. En el observamos que el formato de registro definido se denomina RBFP01. ARCHIVOS LOGICOS SEU==> BPP001L1 FMT A* .....A*. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 *************** Beginning of data************* 000.01 A* -------- - - ------ 000.02 A* SISTEMA BFP - 000.03 A* ARCHIVO BPP001 000.21 A* LOGICO BPP001L1 000.22 A* KEY CODSS - SOCIAL SECURITY CODE 000.23 A* AUTOR DANIEL HUGO ENRIQUEZ LEIVAS 000.24 A* MI, EEUU 000.31 A*---------------------------------------------------------------- 000.40 A R RBFP01 PFILE(V40LBDHE/BPP001)

Page 89: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

89

000.41 A K CODSS ****************** End of data *************** El archivo logico BPP001L1 nos permitira acceder al archivo de pacientes por la clave CODSS - código de seguridad social -. EU==> BPP001L2 FMT A* .....A*. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 *************** Beginning of data ***** 000.01 A* -------- - - ------ 000.02 A* SISTEMA BFP - 000.03 A* ARCHIVO BPP001 000.21 A* LOGICO BPP001L2 000.22 A* KEY LASTN - LAST NAME 000.23 A* AUTOR DANIEL HUGO ENRIQUEZ LEIVAS 000.24 A* MI, EEUU 000.31 A*---------------------------------------------------------------- 000.40 A R RBFP01 PFILE(V40LBDHE/BPP001) 000.41 A K LASTN ****************** End of data ************* El archivo lógico BPP001L2 nos permite acceder al archivo de pacientes por el campo clave LASTN - apellido -. Columns . . . : 1 71 Edit V40LBDHE/QDDSSRC SEU==> BPP001L3 FMT A* .....A*. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 *************** Beginning of data ********************* 000.01 A* -------- - - ------ 000.02 A* SISTEMA BFP - 000.03 A* ARCHIVO BPP001 000.21 A* LOGICO BPP001L3 000.22 A* KEY ZIPCOD- ZIPE CODE 000.23 A* AUTOR DANIEL HUGO ENRIQUEZ LEIVAS 000.24 A* MI, EEUU 000.31 A*---------------------------------------------------------------- 000.40 A R RBFP01 FILE(V40LBDHE/BPP001) 000.41 A K ZIPCOD ****************** End of data **************

Page 90: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

90

El archivo lógico BPP001L3 tiene definida como campo clave al campo ZIPCOD el cual nos permitirá acceder por numero de código postal. SDA FILE ( PANTALLAS UTILIZADAS EN EL PROGRAMA) SEU==> PA FMT A* .....A*. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+.. *************** Beginning of data ************** 0000.10 A*%%TS SD 20021112 185818 GOLETA REL-V5R1M0 5722-WDS 0000.20 A*------------------------------------------------------------ 0000.30 A* MANTENAINCE DATA BASE 0000.40 A* HEALTH CENTER BLISSFIELD CITY,MI,EEUU 0000.50 A* HEALTH CENTER MILAN CITY , 0000.60 A* HEALTH CENTER CARTOON CITY , 0000.70 A* AUTOR DANIEL H. ENRIQUEZ LEIVAS 0000.80 A*------------------------------------------------------------ 0000.90 A*%%EC 0001.00 A DSPSIZ(24 80 *DS3) 0001.10 A REF(V40LBDHE/BPP001) 0001.20 A R RPAN01 0001.30 A*%%TS SD 20021112 185818 GOLETA REL-V5R1M0 5722-WDS 0001.40 A CF02 0001.50 A CF03 0001.60 A CF04 0000.90 A*%%EC 0001.00 A DSPSIZ(24 80 *DS3) 0001.10 A REF(V40LBDHE/BPP001) 0001.20 A R RPAN01 0001.30 A*%%TS SD 20021112 185818 GOLETA REL-V5R1M0 5722-WDS 0001.40 A CF02 0001.50 A CF03 0001.60 A CF04 0001.70 A CF05 0001.80 A CF06 0001.90 A CF07 0002.00 A CF08 0002.10 A CF09 0002.20 A CF11 0002.30 A 2 68DATE 0002.40 A EDTWRD(' / / ') 0002.50 A 3 4'========================== 0002.60 A =========================== 0002.70 A =======' 0002.80 A 21 4'-------------------------- 0002.90 A --------------------------- 0003.00 A -------' 0003.10 A 5 33'MICHIGAN, USA'

Page 91: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

91

0003.20 A 6 4'-------------------------- 0003.30 A --------------------------- 0003.40 A -------' 0002.70 A =======' 0002.80 A 21 4'-------------------------- 0002.90 A --------------------------- 0003.00 A -------' 0003.10 A 5 33'MICHIGAN, USA' 0003.20 A 6 4'-------------------------- 0003.30 A --------------------------- 0003.40 A -------' 0003.50 A 7 20'MANTENIMIENTO BASE DE DATO 0003.60 A TES' 0003.70 A 11 28'F2 - ALTA' 0003.80 A 13 28'F5 - BAJA' 0003.90 A 15 28'F7 - MODIFICACION' 0004.00 A 2 4'DHE SISTEMAS' 0004.10 A 2 60'DATE' 0004.20 A 17 28'F9 - REPORTS' 0004.30 A 20 28'F3 - EXIT' 0004.40 A 8 4'-------------------------- 0004.50 A --------------------------- 0004.60 A -------' 0004.70 A 4 28'BLISSFIELD' 0004.80 A 4 39'HEALTH' 0004.90 A 4 46'CENTER' 0005.00 A 19 4'-------------------------- 0005.10 A --------------------------- 0005.20 A -------' 0005.30 A R RPAN02 0005.40 A*%%TS SD 20021111 200257 GOLETA REL-V5R1M0 5722-WDS 0005.50 A WINDOW(2 10 16 50) 0005.60 A CF02 0005.70 A CF03 0005.80 A CF04 0005.90 A CF05 0006.00 A CF06 0006.10 A CF07 0006.20 A CF08 0006.30 A CF09 0006.40 A CF11 0006.50 A 3 1'Code S.S:' 0006.60 A 5 1'Las name: ' 0006.70 A 6 1'Firs name: ' 0006.80 A 8 1'AdRres ' 0006.90 A 9 1'State:' 0007.00 A 10 1'Zi Code: ' 0007.10 A 12 1'Sex:' 0007.20 A 12 10'Ege:'

Page 92: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

92

0007.30 A 11 1'Telephone:' 0007.40 A CODSS R B 3 13REFFLD(CODSS) 0007.50 A LASTN R B 5 13REFFLD(LASTN) 0007.60 A FIRSTN R B 6 13REFFLD(FIRSTN) 0007.70 A ADRESS R B 8 13REFFLD(ADRESS) 0007.80 A STATE R B 9 13REFFLD(STATE) 0007.90 A ZIPCOD R B 10 13REFFLD(ZIPCOD) 0008.00 A TELEPH R B 11 13REFFLD(TELEPH) 0008.10 A SEX R B 12 6REFFLD(SEX) 0008.20 A EGE R B 12 16REFFLD(EGE) 0008.30 A 1 19'ALTA' 0008.40 A 15 17'F3 - EXIT' 0008.50 A 2 1'-------------------------- 0008.60 A ----------------' 0008.70 A 14 1'-------------------------- 0008.80 A ----------------' 0008.90 A R RPAERR 0009.00 A*%%TS SD 20021111 200257 GOLETA REL-V5R1M0 5722-WDS 0009.10 A WINDOW(6 12 13 15) 0009.20 A CF02 0009.30 A CF03 0009.40 A CF04 0009.50 A CF05 0009.60 A CF06 0009.70 A CF07 0009.80 A CF08 0009.90 A CF09 0010.00 A CF11 0010.10 A 4 3'transaccion' 0010.20 A 6 3'incorrecta' 0010.30 A 8 3'intentelo' 0010.40 A 12 3'Thank you' 0010.50 A 2 5'Sorry' 0010.60 A 3 1'---------------' 0010.70 A 10 3'nuevamente' 0010.80 A R RPAN05 0010.90 A*%%TS SD 20021111 200257 GOLETA REL-V5R1M0 5722-WDS 0011.00 A WINDOW(3 10 16 50) 0011.10 A CF02 0011.20 A CF03 0011.30 A CF04 0011.40 A CF05 0011.50 A CF06 0011.60 A CF07 0011.70 A CF08 0011.80 A CF09 0011.90 A CF11 0012.00 A 1 1'Baja' 0012.10 A 3 1'Code S.S:'

Page 93: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

93

0012.20 A 5 1'Last name:' 0012.30 A 6 1'First name:' 0012.40 A 8 1'Adress' 0012.50 A 9 1'State:' 0012.60 A 10 1'Zip Code:' 0012.70 A 12 1'Sex:' 0012.80 A 12 10'Ege:' 0012.90 A 11 1'Telephone:' 0013.00 A CODSS R B 3 12REFFLD(CODSS) 0013.10 A LASTN R O 5 13REFFLD(LASTN) 0013.20 A FIRSTN R O 6 13REFFLD(FIRSTN) 0013.30 A ADRESS R O 8 13REFFLD(ADRESS) 0013.40 A STATE R O 9 13REFFLD(STATE) 0013.50 A ZIPCOD R O 10 13REFFLD(ZIPCOD) 0013.60 A TELEPH R O 11 13REFFLD(TELEPH) 0013.70 A SEX R O 12 6REFFLD(SEX) 0013.80 A EGE R O 12 16REFFLD(EGE) 0013.90 A 15 18'F3 - EXIT' 0014.00 A 14 1'-------------------------- 0014.10 A ----------------' 0014.20 A R RPAN07 0014.30 A*%%TS SD 20021111 200257 GOLETA REL-V5R1M0 5722-WDS 0014.40 A WINDOW(3 10 16 50) 0014.50 A CF02 0014.60 A CF03 0014.70 A CF04 0014.80 A CF05 0014.90 A CF06 0015.00 A CF07 0015.10 A CF08 0015.20 A CF09 0015.30 A CF11 0015.40 A 1 1'Update' 0015.50 A 3 1'Code S.S:' 0015.60 A 5 1'Last name:' 0015.70 A 6 1'First name:' 0015.80 A 8 1'Adress' 0015.90 A 9 1'State:' 0016.00 A 10 1'Zip Code:' 0016.10 A 12 1'Sex:' 0016.20 A 12 10'Ege:' 0016.30 A 11 1'Telephone:' 0016.40 A CODSS R B 3 13REFFLD(CODSS) 0016.50 A LASTN R B 5 13REFFLD(LASTN) 0016.60 A FIRSTN R B 6 13REFFLD(FIRSTN) 0016.70 A ADRESS R B 8 13REFFLD(ADRESS) 0016.80 A STATE R B 9 13REFFLD(STATE) 0016.90 A ZIPCOD R B 10 13REFFLD(ZIPCOD) 0017.00 A TELEPH R B 11 13REFFLD(TELEPH)

Page 94: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

94

0017.10 A SEX R B 12 6REFFLD(SEX) 0017.20 A EGE R B 12 16REFFLD(EGE) 0017.30 A 15 17'F3 - EXIT' 0017.40 A 14 1'-------------------------- 0017.50 A ----------------' 0017.60 A R RPAN09 0017.70 A*%%TS SD 20021107 182750 GOLETA REL-V5R1M0 5722-WDS 0017.80 A WINDOW(4 5 18 42) 0017.90 A CF02 0018.00 A CF03 0018.10 A CF04 0018.20 A CF05 0018.30 A CF06 0018.40 A CF07 0018.50 A CF08 0018.60 A CF09 0018.70 A CF11 0018.80 A 15 12'F3= Exit' 0018.90 A 1 8'Data base report' 0019.00 A 5 1'F4-Clasificate for S.S. nu 0019.10 A 7 1'F6-Clasificate for last na 0019.20 A 9 1'F8-Clasificate for Zip Cod DHE SISTEMAS DATE 11/13/02 ================================= BLISSFIELD HEALTH CENTER MICHIGAN, USA --------------------------------------------------------------------------------------------------- MANTENIMIENTO BASE DE DATOS DE PACIENTES ---------------------------------------------------------------------------------------------------- F2 - ALTA F5 - BAJA F7 - MODIFICACION F9 - REPORTS ---------------------------------------------------------------------------- ---------------------- F3 - EXIT ----------------------------------------------------------------------------------------------------

Page 95: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

95

DHE S ...................................................... 11/13/02 ===== : ALTA : ===== : -------------------------------------------------- -----: : Code S.S: : ----- : : --------------- : Las name: : ----- : Firs name: : --------------- : : : AdRres : : State: : : Zi Code: : : Telephone: : : Sex: Ege: : : : : -------------------------------------------------- ---- : : F3 - EXIT : : : ----- :.................................................... : --------------- F3 - EXIT ---------------------------------------------------------------------------- DHE SISTEMAS DATE 11/13/02 ===== ...................................................... ========= : Baja : : : ----- : Code S.S: : --------------- : : ----- : Last name: : --------------- : First name: : : : : Adress : : State: : : Zip Code: : : Telephone: : : Sex: Ege: 000 : : : : -------------------------------------------------------: : F3 - EXIT : :.................................................... :

Page 96: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

96

-------------------------------------------------------------------------- DHE SISTEMAS DATE 11/13/02 ===== ...................................................... ========= : Update : : : ----- : Code S.S: 111302 : --------------- : : ----- : Last name: : BAJA : --------------- : First name: : : : : : Adress : : : State: ----- : LAST NAME: : : Zip Code: : : Telephone: : : Sex: Ege: : : : : -------------------------------------------------- ---------: : F3 - EXIT : ----- : : --------------- :..................................................………. : ---------------------------------------------------------------------------- DHE SISTEMAS DATE 11/13/02 =============================== .............................................. : Data base report : : : ---------------------------- : : ENTES : : ---------------------------- : F4-Clasificate for S.S. number : : : : F6-Clasificate for last name : : : : F8-Clasificate for Zip Code : : : : : : : : F3= Exit : ---------------------------- : : : : ---------------------------- : : :............................................:

Page 97: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

97

PROGRAMA PROG50 FMT * ..... *. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+. *************** Beginning of data ***************** 0001.00 H*------------------------------------------------- 0002.00 H* HEALTH CENTER MI,EEUU 0004.00 H* DANIEL HUGO ENRIQUEZ LEIVAS 0005.00 H* PROGRAM : PROG50 0006.00 H* DATE : 2001 0009.00 F*------------------------------------------------- 0009.01 FPANT03 CF E WORKSTN 0009.02 FBPP001L1UF E K DISK A 0012.01 FPROG50P O E 60 PRINTER 0012.02 F*------------------------------------------------- 0012.03 E TIT 1 3 80 28.02 C*------------------------------------------------- 0028.05 C* 0028.06 C EXSR INI 0028.07 C* 0028.08 C *INKC DOWNE*ON 0028.09 C EXFMTRPAN01 0028.10 C* 0028.14 C *INKC IFEQ *ON 0028.15 C LEAVE 0028.16 C ENDIF 0028.18 C* 0028.19 C *INKB CASEQ*ON ALTA 0028.20 C *INKE CASEQ*ON BAJA 0028.21 C *INKG CASEQ*ON MODI 0028.22 C *INKI CASEQ*ON LIST 0028.23 C ENDCS 0028.33 C ENDDO 0028.34 C* 0028.35 C MOVE *ON *INLR 0028.36 C* 0053.00 C*------------------------------------------------- 0054.00 C* RUTINA DE ALTA 0055.00 C*------------------------------------------------- 0056.00 C ALTA BEGSR 0056.01 C* 0058.00 C *INKC DOWEQ*OFF 0058.01 C CLEARRPAN02 0059.00 C EXFMTRPAN02 0059.01 C *INKC IFEQ *ON 0059.02 C LEAVE 0060.00 C ENDIF 0060.01 C CODSS CHAINBPP001L1 91

Page 98: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

98

0060.02 C *IN91 IFEQ *ON 0060.03 C EXFMTRPAN02 0060.04 C WRITERBFP01 0060.06 C ELSE 0061.00 C EXFMTRPAERR 0061.01 C ENDIF 0061.02 C ENDDO 0061.03 C MOVE '0' *INKC 0062.00 C ENDSR 0062.01 C*------------------------------------------------- 0062.02 C* RUTINA DE BAJA 0062.03 C*------------------------------------------------- 0062.06 C BAJA BEGSR 0062.07 C* 0062.09 C *INKC DOWEQ*OFF 0062.10 C CLEARRPAN05 0062.11 C EXFMTRPAN05 0062.12 C *INKC IFEQ *ON 0062.13 C LEAVE 0062.14 C ENDIF 0062.15 C CODSS CHAINBPP001L1 91 0062.16 C *IN91 IFEQ *OFF 0062.17 C EXFMTRPAN05 0062.18 C *INKC IFEQ *ON 0062.19 C LEAVE 0062.20 C ENDIF 0062.21 C CODSS DELETRBFP01 91 0062.22 C ELSE 0062.23 C EXFMTRPAERR 0062.25 C ENDIF 0062.26 C ENDDO 0062.27 C MOVE '0' *INKC 0062.28 C ENDSR 0062.29 C*------------------------------------------------- 0062.30 C* RUTINA DE MODIFICACION 0062.31 C*------------------------------------------------- 0062.32 C MODI BEGSR 0062.33 C* 0062.34 C *INKC DOWEQ*OFF 0062.35 C CLEARRPAN07 0062.36 C EXFMTRPAN07 0062.37 C *INKC IFEQ *ON 0062.38 C LEAVE 0062.39 C ENDIF 0062.40 C CODSS CHAINBPP001L1 91 0062.41 C *IN91 IFEQ *OFF 0062.42 C EXFMTRPAN07 0062.43 C *INKC IFEQ *ON

Page 99: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

99

0062.44 C LEAVE 0062.45 C ENDIF 0062.46 C UPDATRBFP01 0062.47 C ELSE 0062.48 C EXFMTRPAERR 0062.49 C ENDIF 0062.50 C ENDDO 0062.51 C MOVE '0' *INKC 0062.52 C ENDSR 0062.53 C*------------------------------------------------- 0062.54 C* REPORT RUTINE 0062.55 C*------------------------------------------------- 0062.56 C LIST BEGSR 0062.57 C* 0062.58 C *INKC DOWNE*ON 0062.59 C EXFMTRPAN09 0062.60 C *INKC IFEQ *ON 0062.61 C LEAVE 0062.62 C ENDIF 0062.63 C* 0062.64 C *INKD CASEQ*ON SCODE 0062.65 C *INKF CASEQ*ON LASTNA 0062.66 C *INKH CASEQ*ON CODZIP 0062.67 C ENDCS 0062.68 C ENDDO 0062.69 C* 0062.70 C MOVE '0' *INKC 0062.71 C ENDSR 0062.72 C*------------------------------------------------- 0062.73 C* RUTINE OF SCODE 0062.74 C*------------------------------------------------- 0062.75 C SCODE BEGSR 0062.76 C* 0062.77 C MOVEL*BLANK TIT01 0062.78 C MOVELTIT,1 TIT01 0062.79 C MOVE '0' *IN90 0062.80 C *LOVAL SETLLBPP001L1 90 0062.81 C READ RBFP01 90 0062.82 C WRITETITU 0062.83 C *IN90 DOWEQ*OFF 0062.84 C *IN60 IFEQ *ON 0062.85 C WRITETITU 0062.77 C MOVEL*BLANK TIT01 0062.78 C MOVELTIT,1 TIT01 0062.79 C MOVE '0' *IN90 0062.80 C *LOVAL SETLLBPP001L1 90 0062.81 C READ RBFP01 90 0062.82 C WRITETITU 0062.83 C *IN90 DOWEQ*OFF

Page 100: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

100

0062.84 C *IN60 IFEQ *ON 0062.85 C WRITETITU 0062.86 C MOVE '0' *IN60 0062.87 C ENDIF 0062.88 C WRITEDETA 0062.89 C* 0062.90 C READ RBFP01 90 0062.91 C *IN90 IFEQ *ON 0062.92 C LEAVE 0062.93 C ENDIF 0062.94 C ENDDO 0062.95 C* 0062.96 C ENDSR 0062.97 C*------------------------------------------------- 0062.98 C* REPORT RUTINE OF THE LAST NAME 0062.99 C*------------------------------------------------- 0063.00 C LASTNA BEGSR 0063.01 C* 0063.02 C CALL 'PROG51' 0063.18 C* 0063.19 C ENDSR 0063.21 C*------------------------------------------------- 0063.22 C* REPORT RUTINE OF ZIP CODE 0063.23 C*------------------------------------------------- 0063.24 C CODZIP BEGSR 0063.25 C* 0063.26 C CALL 'PROG51' 0063.46 C* 0063.48 C ENDSR 0063.49 C*------------------------------------------------- 0063.51 C* RUTINA DE INIZIALIZACION 0063.52 C*------------------------------------------------- 0063.53 C INI BEGSR 0063.54 C MOVELTIT,1 TIT01 80 0063.55 C MOVELTIT,2 TIT02 80 0063.56 C MOVEL*ALL'-' LIN01 80 0063.57 C MOVEL*ALL'-' LIN02 80 0063.58 C ENDSR 0063.59 C*------------------------------------------------- 0066.11 ** 0066.12 HEALTH CENTER, REPORT OF PATIENT CLASSIFICATE FOR S.S. CODE 0066.15 S.S. CODE LAST NAME FIRST NAME ZIP CODE ****************** End of data ************

Page 101: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

101

OPEN (Abrir archivo) El programador encontrara gran cantidad de programas de desarrollo interno en empresas, como así ERP muy conocidos en el mercado que utilizan bases de datos en determinadas circunstancias y luego no son necesarias durante en todo el proceso. Esto hace que el programa al tener varias bases de datos que abrir demore en el tiempo de arranque. Este tiempo lo podemos reducir abriendo o cerrando bases de datos en forma progresiva durante el calculo o sea cuando realmente es necesaria su utilización. La operación OPEN nos permite abrir bases de datos en forma progresiva durante el calculo, para ello deberemos codificar el la hoja 'F' columnas 71 y 72 una 'UC'. Podemos codificar un indicador de resultado en las columnas 56 y 57 de la hoja de calculo para establecer si se activa que se ha producido un error en la operación OPEN Prompt type . . . FX Sequence number . . . 0009.01 File File End of File Filename Type Designation File Sequence Format MNC501L1 I F E Mode of Record Processing Address Type Device Continuation K DISK File File Exit Entry Addition Condition UC FMT * ..... *. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+.. ******* Beginning of data ****** 0001.00 H*------------------------------------------------- 0002.00 H* BUENOS AIRES ARGENTINA 0004.00 H* DANIEL HUGO ENRIQUEZ LEIVAS 0005.00 H* PROGRAM : PROG53

Page 102: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

102

0006.00 H* DATE : 2001 0009.00 F*------------------------------------------------- 0009.01 FMNC501L1IF E K DISK UC 0009.02 FBPP001L1 IF E K DISK UC 0009.03 FBEX010L2 IF E K DISK 0012.01 FPROG53P O E 60 PRINTER 0012.02 F*------------------------------------------------- 0012.03 E TIT 1 2 80 0028.02 C*------------------------------------------------- 0028.05 C* APERTURA DE UNA BASE DE DATOS POR MEDIO DEL 0062.73 C* COMANDO OPEN 0062.74 C*------------------------------------------------- 0062.75 C* 0062.76 C OPEN BPP001L1 55 0062.77 C* 0062.78 C OPEN MNC501L1 21 CLOSE ( Cerrar archivo) La operación contraria a OPEN es CLOSE o sea que esta operación cierra bases de datos en forma progresiva durante el calculo. Deberemos para ello codificar la Hoja 'F' con una 'UC' en las columnas 71 y 72. Cuando se ejecuta una operación CLOSE en archivo cerrado no puede utilizarse nuevamente salvo que durante el calculo se procese una operación OPEN. Podemos codificar una indicador de resultado para determinar si se produce algún error durante la ejecución de esta operación. FMT * ..... *. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+.. ********** Beginning of data****** 0001.00 H.------------------------------------------------- 0002.00 H* BUENOS AIRES ARGENTINA 0004.00 H* DANIEL HUGO ENRIQUEZ LEIVAS 0005.00 H* PROGRAM : PROG53 0006.00 H* DATE : 2001 0009.00 F*-------------------------------------------------

Page 103: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

103

0009.01 FMNC501L1IF E K DISK UC 0009.02 FBPP001L1 IF E K DISK UC 0009.03 FBEX010L2 IF E K DISK 0012.01 FPROG53P O E 60PRINTER 0012.02 F*------------------------------------------------- 0012.03 E TIT 1 2 80 0028.02 C*------------------------------------------------- 0028.05 C* APERTURA DE UNA BASE DE DATOS POR MEDIO DEL 0062.73 C* COMANDO OPEN Y CIERRE POR MEDIO DE CLOSE 0062.74 C*------------------------------------------------- 0062.75 C* 0062.76 C OPEN BPP001L1 55 0062.77 C* 0062.78 C OPEN MNC501L1 21 0062.79 C* 0062.80 C* 0062.81 C CLOSEBPP001L1 56 0062.82 C* 0062.83 C CLOSEMNC501L1 22 0062.84 C* También podriamos cerrar todas las bases de datos abiertas durante el programa codificando la operación CLOSE *ALL. 0062.83 C CLOSE*ALL 22 0062.84 C* FEOD (Forzar fin de datos) Esta operación nos permite realizar un cierre lógico de la base de datos con el fin de forzar la memoria intermedia hacia el almacenamiento magnético. Podríamos utilizar la operación CLOSE y posteriormente volver a abrir con una operación OPEN pero el cierre de una base de datos desconecta a esta del programa y luego con una operación OPEN al abrirla deberemos considerar el tiempo de apertura de la misma. Este tiempo puede ser significativo y podemos salvar este problema con la operación FEOD. En el factor 2 se

Page 104: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

104

codificara el nombre del archivo para el cual queremos forzar el fin de datos y su cierre lógico. También podemos codificar un indicador de resultado en las columnas 56 y 57 para denotar un error durante la ejecución de esta operación. FMT * ..... *. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+.. ******* Beginning of data ********* 0001.00 H*------------------------------------------------- 0002.00 H* BUENOS AIRES ARGENTINA 0004.00 H* DANIEL HUGO ENRIQUEZ LEIVAS 0005.00 H* PROGRAM : PROG53 0006.00 H* DATE : 2001 0009.00 F*------------------------------------------------- 0009.01 FMNC501L1IF E K DISK UC 0009.02 FBPP001L1 IF E K DISK UC 0009.03 FBEX010L2 IF E K DISK 0012.01 FPROG53P O E 60 PRINTER 0012.02 F*------------------------------------------------- 0012.03 E TIT 1 2 80 0028.02 C*------------------------------------------------- 0062.74 C*------------------------------------------------- 0062.75 C* 0062.76 C OPEN BPP001L1 55 0062.77 C* 0062.78 C OPEN MNC501L1 21 0062.79 C* 0062.80 C* 0062.81 C FEOD BPP001L1 56 0062.82 C* 0062.83 C FEOD MNC501L1 22 UNLCK ( Liberar un registro o desbloquear un área de datos) Con el comando UNLCK podemos desbloquear un registros o área de datos que se encuentra bloqueado. El factor 2 deberá contener el nombre del área de datos o el nombre del archivo de actualización en disco que se desea desbloquear. Se podrá codificar un indicador de resultado en las columnas 56 y 57 para que este se active si se produce un error durante la operación UNLCK.

Page 105: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

105

FMT * ..... *. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+. 0001.00 H*------------------------------------------------- 0002.00 H* VIGO ESPAÑA 0004.00 H* DANIEL HUGO ENRIQUEZ LEIVAS 0005.00 H* PROGRAM : PROG54 0006.00 H* DATE : 2001 0009.00 F*------------------------------------------------- 0009.01 FMNC501L1IF E K DISK 0009.02 FBPP001L1UF E K DISK 0009.03 FBEX010L2UF E K DISK 0012.01 FPROG54P O E 60 PRINTER 0028.02 C*------------------------------------------------- 0028.05 C*DESBLOQUEO DE UN REGISTRO MEDIANTE 0062.73 C*LA OPERACION UNLCK 0062.74 C*------------------------------------------------- 0062.75 C* 0062.76 C UPDATRPP001 0062.77 C* 0062.78 C UNLCKRPP001 35 0062.79 C* Luego de la ejecución de la del comando UNLCK el registro de la base de datos en donde estamos posicionado se desbloqueara. EXFMT ( grabar y leer formato ) Esta operación esta relacionada con archivos de WORKSTN. La podemos definir como una combinación de WRITE seguido de READ para un mismo formato de registro. Este archivo WORKSTN deberá estar definido en la hoja 'F' como combinado, letra 'C' en la columna 15. En el factor 2 de la hoja de calculo se especificara el nombre del formato de registro a grabar y luego leer. En ejemplos anteriores recordara que hemos utilizado la operación EXFMT.

Page 106: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

106

FMT * ..... *. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+. ********** Beginning of data*********** 001.00 H*------------------------------------------------- 002.00 H* TOLEDO ESPAÑA 004.00 H* DANIEL HUGO ENRIQUEZ LEIVAS 005.00 H* PROGRAM : PROG54 006.00 H* DATE : 2001 009.00 F*------------------------------------------------- 009.01 FPROG054 IF E WORKSTN 009.02 FMNC501L1IF E K DISK 009.03 FBPP001L1 UF E K DISK 009.04 FBEX010L2UF E K DISK 012.01 FPROG54P O E 60 PRINTER 028.02 C*------------------------------------------------- 028.05 C* UTILIZACION DEL COMANDO EXFMT 062.73 C* DESPLIEGA UNA PANTALLA 062.74 C*------------------------------------------------- 062.75 C* 0062.75 C* 0062.76 C EXFMTRP0541 0062.77 C* En la sentencia 62.76 podemos observar el uso de la operación EXFMT la cual desplegara sobre nuestra terminal el formato de registro de pantalla RPO541 contenido en la en el archivo de pantallas PROG054 de la hola - F .- EXCPT ( Generar una salida en tiempo de calculo) Esta operación nos permite grabar registros en tiempo de calculo fuera del ciclo lógico del RPG/400. Estos registros que se graban en tiempo de excepción se identifican en la hoja 'O' (output) con una letra E en la columna 15 y una nombre de EXCPT en las columnas 32 a 37. Este nombre EXCPT deberá ser el mismo utilizado en la hoja de calculo factor 2.

Page 107: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

107

FMT * ..... *. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... ***** Beginning of data ******** 0001.00 H*------------------------------------------------- 0002.00 H* MADRID ESPAÑA 0004.00 H* DANIEL HUGO ENRIQUEZ LEIVAS 0005.00 H* PROGRAM : PROG55 0006.00 H* DATE : 2001 0009.00 F*------------------------------------------------- 0009.01 FPRG055FMIF E WORKSTN 0009.02 FMNC501L1IF E K DISK 0009.03 FBPP001L1UF E K DISK 0009.04 FBEX010L2O E K DISK 0012.01 FPROG55P O E 60 PRINTER 0028.02 C*------------------------------------------------- 0028.05 C* UTILIZACION DEL COMANDO EXCPT 0062.73 C* GRABA UN REGISTRO POR EXCEPCION 0062.74 C*------------------------------------------------- 0062.75 C* 0062.76 C EXCPTGRABA 0062.77 C* 0062.78 O GRABA 0062.79 O ARTIC 15 0062.80 O DESCRI 46 0062.81 0*

Page 108: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

108

Ejemplo: Abriendo y cerrando bases de datos. A continuación encontrara algunas compilaciones de bases de datos, printer files, SDA y el programa el cual analizaremos su funcionamiento. Compilación Archivo MAEART maestro de artículos

*...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+... 5722SS1 V5R1M0 010525 Data Description V40LBD File name . . . . . . . . . . . . . . . . . . . . . : MAEART Library name . . . . . . . . . . . . . . . . . . : V40LBDHE File attribute . . . . . . . . . . . . . . . . . . : Physical Source file containing DDS . . . . . . . . . . . . : QDDSSRC Library name . . . . . . . . . . . . . . . . . . : V40LBDHE Source member containing DDS . . . . . . . . . . . : MAEART Source member last changed . . . . . . . . . . . . : 01/05/03 16:17:38 Source listing options . . . . . . . . . . . . . . : *SOURCE *LIST DDS generation severity level . . . . . . . . . . . : 20 DDS flagging severity level . . . . . . . . . . . . : 00 File type . . . . . . . . . . . . . . . . . . . . . : *DATA Authority . . . . . . . . . . . . . . . . . . . . . : *LIBCRTAUT Replace file . . . . . . . . . . . . . . . . . . . : *NO Text . . . . . . . . . . . . . . . . . . . . . . . : MAESTRO DE ARTICULOS Compiler . . . . . . . . . . . . . . . . . . . . . : IBM AS/400 Data Descr Data Description Source SEQNBR *...+....1....+....2....+....3....+....4....+....5....+....6....+... 1 A* ------------------------------------------------------------ 2 A* DHEL SYSTEM BUENOS AIRES REPUBLICA ARGENTINA 3 A* GOLETA SARANDI 4 A* ------------------------------------------------------------ 5 A* FILE MAEART 21 A* DATE 2002 22 A* AUTOR DANIEL HUGO ENRIQUEZ LEIVAS 31 A*------------------------------------------------------------- 40 A R RMAEAR 41 A CODART 8 0 TEXT('CODE ARTICULO') 42 A DESCRI 35 TEXT('DESCRIPCION') 43 A RUBRO 4 TEXT('RUBRO') 44 A STOCKG 11 2 TEXT('STOCK GENERAL') 45 A STOCKS 11 2 TEXT('STOCK IN STORE') 47 A PREG 11 2 TEXT('PUNTO R. GENERAL') 50 A FORPRO 8 0 TEXT('FORMULA PRODUCCION' 51 A ESTADO 1 TEXT('ESTADO S=SUSPENDIDO 100 A K CODART * * * * * E N D O F S O U R C E * * * * * 5722SS1 V5R1M0 010525 Data Description V40LBD Expanded Source SEQNBR *...+....1....+....2....+....3....+....4....+....5....+....6....+.... 40 R RMAEAR 41 CODART 8P 0B TEXT('CODE ARTICULO') COLHDG('CODART') 42 DESCRI 35A B TEXT('DESCRIPCION') COLHDG('DESCRI') 43 RUBRO 4A B TEXT('RUBRO') 44 STOCKG 11P 2B TEXT('STOCK GENERAL') COLHDG('STOCKG') 45 STOCKS 11P 2B TEXT('STOCK IN STORE') COLHDG('STOCKS') 46 STOCKP 11P 2B TEXT('STOCK EN FABRICA') COLHDG('STOCKP') 47 PREG 11P 2B TEXT('PUNTO R. GENERAL') COLHDG('PREG') 50 FORPRO 8P 0B TEXT('FORMULA PRODUCCION' COLHDG('FORPRO') 51 ESTADO 1A B TEXT('ESTADO S=SUSPENDIDO COLHDG('ESTADO') 100 K CODART

Page 109: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

109

* * * * * E N D O F E X P A N D E D S O U R C E * * 5722SS1 V5R1M0 010525 Data Description V40LBD Message Summary Total Informational Warning Error Severe (0-9) (10-19) (20-29) (30-99) 0 0 0 0 0 * CPC7301 00 Message . . . . : File MAEART created in lib * * * * * E N D O F C O M P I L A T I O N * * Compilación Archivo MAEVEN maestro de vendedores 5722SS1 V5R1M0 010525 Data Description V40LBD File name . . . . . . . . . . . . . . . . . . . . . : MAEVEN Library name . . . . . . . . . . . . . . . . . . : V40LBDHE File attribute . . . . . . . . . . . . . . . . . . : Physical Source file containing DDS . . . . . . . . . . . . : QDDSSRC Library name . . . . . . . . . . . . . . . . . . : V40LBDHE Source member containing DDS . . . . . . . . . . . : MAEVEN Source member last changed . . . . . . . . . . . . : 01/06/03 14:11:09 Source listing options . . . . . . . . . . . . . . : *SOURCE *LIST DDS generation severity level . . . . . . . . . . . : 20 DDS flagging severity level . . . . . . . . . . . . : 00 File type . . . . . . . . . . . . . . . . . . . . . : *DATA Authority . . . . . . . . . . . . . . . . . . . . . : *LIBCRTAUT Replace file . . . . . . . . . . . . . . . . . . . : *NO Text . . . . . . . . . . . . . . . . . . . . . . . : MAESTRO DE VENDEDORES Compiler . . . . . . . . . . . . . . . . . . . . . : IBM AS/400 Data Descr Data Description Source SEQNBR *...+....1....+....2....+....3....+....4....+....5....+....6....+.... 1 A* ------------------------------------------------------------- 2 A* DHEL SYSTEM BUENOS AIRES REPUBLICA ARGENTINA 3 A* GOLETA SARANDI 4 A* ------------------------------------------------------------- 5 A* FILE MAEVEN 21 A* DATE 2002 22 A* AUTOR DANIEL HUGO ENRIQUEZ LEIVAS 31 A*-------------------------------------------------------------- 40 A R RMAEVN 41 A CODVEN 4 0 TEXT('COD.VENDEDOR') 42 A AYNV 35 TEXT('A Y N VENDEDOR') 43 A COMIS 7 2 TEXT('COMISION') 100 A K CODVEN * * * * * E N D O F S O U R C E * * * * * 5722SS1 V5R1M0 010525 Data Description V40LBD Expanded Source SEQNBR *...+....1....+....2....+....3....+....4....+....5....+....6....+.... 40 R RMAEVN 41 CODVEN 4P 0B TEXT('COD.VENDEDOR') COLHDG('CODVEN') 42 AYNV 35A B TEXT('A Y N VENDEDOR') COLHDG('AYNV') 43 COMIS 7P 2B TEXT('COMISION') COLHDG('COMIS') 100 K CODVEN * * * * * E N D O F E X P A N D E D S O U R C E * * 5722SS1 V5R1M0 010525 Data Description V40LBD Message Summary Total Informational Warning Error Severe (0-9) (10-19) (20-29) (30-99) 0 0 0 0 0 * CPC7301 00 Message . . . . : File MAEVEN created in lib * * * * * E N D O F C O M P I L A T I O N * * Compilación Archivo MAEZON maestro de zonas 5722SS1 V5R1M0 010525 Data Description V40LBD

Page 110: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

110

File name . . . . . . . . . . . . . . . . . . . . . : MAEZON Library name . . . . . . . . . . . . . . . . . . : V40LBDHE File attribute . . . . . . . . . . . . . . . . . . : Physical Source file containing DDS . . . . . . . . . . . . : QDDSSRC Library name . . . . . . . . . . . . . . . . . . : V40LBDHE Source member containing DDS . . . . . . . . . . . : MAEZON Source member last changed . . . . . . . . . . . . : 01/06/03 14:17:04 Source listing options . . . . . . . . . . . . . . : *SOURCE *LIST DDS generation severity level . . . . . . . . . . . : 20 DDS flagging severity level . . . . . . . . . . . . : 00 File type . . . . . . . . . . . . . . . . . . . . . : *DATA Authority . . . . . . . . . . . . . . . . . . . . . : *LIBCRTAUT Replace file . . . . . . . . . . . . . . . . . . . : *NO Text . . . . . . . . . . . . . . . . . . . . . . . : MAESTRO DE ZONAS Compiler . . . . . . . . . . . . . . . . . . . . . : IBM AS/400 Data Descr Data Description Source SEQNBR *...+....1....+....2....+....3....+....4....+....5....+....6....+.... 1 A* ------------------------------------------------------------- 2 A* DHEL SYSTEM BUENOS AIRES REPUBLICA ARGENTINA 3 A* GOLETA SARANDI 4 A* ------------------------------------------------------------- 5 A* FILE MAEZON 21 A* DATE 2002 22 A* AUTOR DANIEL HUGO ENRIQUEZ LEIVAS 31 A*-------------------------------------------------------------- 40 A R RMAEZN 41 A CODZON 4 0 TEXT('COD.VENDEDOR') 42 A ZONA 35 TEXT('DESCRIPCION') 100 A K CODZON * * * * * E N D O F S O U R C E * * * * * 5722SS1 V5R1M0 010525 Data Description V40LBD Expanded Source SEQNBR *...+....1....+....2....+....3....+....4....+....5....+....6....+.... 40 R RMAEZN 41 CODZON 4P 0B TEXT('COD.VENDEDOR') COLHDG('CODZON') 42 ZONA 35A B TEXT('DESCRIPCION') COLHDG('ZONA') 100 K CODZON * * * * * E N D O F E X P A N D E D S O U R C E * * 5722SS1 V5R1M0 010525 Data Description V40LBD Message Summary Total Informational Warning Error Severe (0-9) (10-19) (20-29) (30-99) 0 0 0 0 0 * CPC7301 00 Message . . . . : File MAEZON created in lib * * * * * E N D O F C O M P I L A T I O N * * Compilación Archivo ESTAART estadistica por articulo. 5722SS1 V5R1M0 010525 Data Description V40LBD File name . . . . . . . . . . . . . . . . . . . . . : ESTAART Library name . . . . . . . . . . . . . . . . . . : V40LBDHE File attribute . . . . . . . . . . . . . . . . . . : Physical Source file containing DDS . . . . . . . . . . . . : QDDSSRC Library name . . . . . . . . . . . . . . . . . . : V40LBDHE Source member containing DDS . . . . . . . . . . . : ESTAART

Page 111: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

111

Source member last changed . . . . . . . . . . . . : 01/07/03 14:09:58 Source listing options . . . . . . . . . . . . . . : *SOURCE *LIST DDS generation severity level . . . . . . . . . . . : 20 DDS flagging severity level . . . . . . . . . . . . : 00 File type . . . . . . . . . . . . . . . . . . . . . : *DATA Authority . . . . . . . . . . . . . . . . . . . . . : *LIBCRTAUT Replace file . . . . . . . . . . . . . . . . . . . : *NO Text . . . . . . . . . . . . . . . . . . . . . . . : ESTADISTICA POR ARTIC Compiler . . . . . . . . . . . . . . . . . . . . . : IBM AS/400 Data Descr Data Description Source SEQNBR *...+....1....+....2....+....3....+....4....+....5....+....6....+.... 1 A* ------------------------------------------------------------- 2 A* DHEL SYSTEM BUENOS AIRES REPUBLICA ARGENTINA 3 A* GOLETA SARANDI 4 A* ------------------------------------------------------------- 5 A* FILE ESTAART 21 A* DATE 2002 22 A* AUTOR DANIEL HUGO ENRIQUEZ LEIVAS 31 A*-------------------------------------------------------------- 40 A R RESTAV 41 A ARTICU 8 0 TEXT('CODE ARTICULO') 42 A VENT01 11 2 TEXT('V.TRIM 01') 43 A VENT02 11 2 TEXT('V.TRIM 02') 44 A VENT03 11 2 TEXT('V.TRIM 03') 45 A VENT04 11 2 TEXT('V.TRIM 04') 100 A K ARTICU * * * * * E N D O F S O U R C E * * * * * 5722SS1 V5R1M0 010525 Data Description V40LBD Expanded Source SEQNBR *...+....1....+....2....+....3....+....4....+....5....+....6....+.... 40 R RESTAV 41 ARTICU 8P 0B TEXT('CODE ARTICULO') COLHDG('ARTICU') 42 VENT01 11P 2B TEXT('V.TRIM 01') COLHDG('VENT01') 43 VENT02 11P 2B TEXT('V.TRIM 02') COLHDG('VENT02') 44 VENT03 11P 2B TEXT('V.TRIM 03') COLHDG('VENT03') 45 VENT04 11P 2B TEXT('V.TRIM 04') COLHDG('VENT04') 100 K ARTICU * * * * * E N D O F E X P A N D E D S O U R C E * * 5722SS1 V5R1M0 010525 Data Description V40LBD Message Summary Total Informational Warning Error Severe (0-9) (10-19) (20-29) (30-99) 0 0 0 0 0 * CPC7301 00 Message . . . . : File ESTAART created in li * * * * * E N D O F C O M P I L A T I O N * * COMPILACION PANTALLA *...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+... 5722SS1 V5R1M0 010525 Data Description V40LBD File name . . . . . . . . . . . . . . . . . . . . . : PANT01 Library name . . . . . . . . . . . . . . . . . . : V40LBDHE File attribute . . . . . . . . . . . . . . . . . . : Display Source file containing DDS . . . . . . . . . . . . : QDDSSRC Library name . . . . . . . . . . . . . . . . . . : V40LBDHE Source member containing DDS . . . . . . . . . . . : PANT01 Source member last changed . . . . . . . . . . . . : 01/06/03 14:54:53 Source listing options . . . . . . . . . . . . . . : *SOURCE *LIST DDS generation severity level . . . . . . . . . . . : 20 DDS flagging severity level . . . . . . . . . . . . : 00

Page 112: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

112

Authority . . . . . . . . . . . . . . . . . . . . . : *LIBCRTAUT Replace file . . . . . . . . . . . . . . . . . . . : *NO Text . . . . . . . . . . . . . . . . . . . . . . . : MANTENIMIENTO BASE DE Compiler . . . . . . . . . . . . . . . . . . . . . : IBM AS/400 Data Descr Data Description Source SEQNBR *...+....1....+....2....+....3....+....4....+....5....+....6....+.. 10 A*%%TS SD 20030106 144921 GOLETA REL-V5R1M0 5722-WDS 20 A*------------------------------------------------------------ 60 A* LISTADO DE BASES DE DATOS 70 A* AUTOR DANIEL H. ENRIQUEZ LEIVAS 80 A*------------------------------------------------------------ 90 A*%%EC 100 A DSPSIZ(24 80 *DS3) 110 A REF(V40LBDHE/BPP001) 120 A R RPAN01 130 A*%%TS SD 20030106 144921 GOLETA REL-V5R1M0 5722-WDS 140 A CF02 150 A CF03 160 A CF04 170 A CF05 180 A CF06 190 A CF07 200 A CF08 210 A CF09 220 A CF11 230 A 2 68DATE 240 A EDTWRD(' / / ') 250 A 3 4'======================== 260 A ========================= 270 A =======' 280 A 21 4'------------------------ 290 A ------------------------- 300 A -------' 310 A 6 4'------------------------ 320 A ------------------------- 330 A -------' 340 A 2 4'DHE SISTEMAS' 350 A 2 60'DATE' 360 A 20 28'F3 - EXIT' 370 A 8 4'------------------------ 380 A ------------------------- 390 A -------' 400 A 19 4'------------------------ 410 A ------------------------- 420 A -------' 430 A 4 24'Listado de Estadistica d 440 A 13 28'F5 - Listado de ventas p 450 A r' 460 A 15 28'F7 - Listado de ventas p 470 A 17 28'F9 - Listado de ventas p 480 A o' 490 A 11 28'F2 - Listado de ventas p 500 A o' 510 A 7 28'Su opcion ?' * * * * * E N D O F S O U R C E * * * * * 5722SS1 V5R1M0 010525 Data Description V40LBD Expanded Source SEQNBR *...+....1....+....2....+....3....+....4....+....5....+....6....+.... 100 DSPSIZ(24 80 *DS3) 120 R RPAN01 CF02 CF03 CF04 CF05 CF06 210 CF09 CF11 230 2 68DATE EDTWRD(' / / ') 250 3 4'======================== 250 ========================= 250 =======' 280 21 4'------------------------ 280 -------------------------

Page 113: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

113

280 -------' 310 6 4'------------------------ 310 ------------------------- 310 -------' 340 2 4'DHE SISTEMAS' 350 2 60'DATE' 360 20 28'F3 - EXIT' 370 8 4'------------------------ 370 ------------------------- 370 -------' 400 19 4'------------------------ 400 ------------------------- 400 -------' 430 4 24'Listado de Estadistica d 440 13 28'F5 - Listado de ventas p 440 r' 460 15 28'F7 - Listado de ventas p 470 17 28'F9 - Listado de ventas p 470 o' 490 11 28'F2 - Listado de ventas p 490 o' 510 7 28'Su opcion ?' * * * * * E N D O F E X P A N D E D S O U R C E * * 5722SS1 V5R1M0 010525 Data Description V40LBD Message Summary Total Informational Warning Error Severe (0-9) (10-19) (20-29) (30-99) 0 0 0 0 0 * CPC7301 00 Message . . . . : File PANT01 created in lib * * * * * E N D O F C O M P I L A T I O N * * PANTALLA DHE SISTEMAS DATE 1/08/03 ========================== Listado de Estadistica de Ventas ---------------------------------------------------------------------------- Su opcion ? ---------------------------------------------------------------------------- F2 - Listado de ventas por articulo F5 - Listado de ventas por Vendedor F7 - Listado de ventas por zona F9 - Listado de ventas por segmento ---------------------------------------------------------------------------- F3 - EXIT ----------------------------------------------------------------------------

Page 114: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

114

PRINTER FILE ESTAARTP ( ESTADISTICA POR ARTICULO) *...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+... 5722SS1 V5R1M0 010525 Data Description V40LBD File name . . . . . . . . . . . . . . . . . . . . . : ESTAARTP Library name . . . . . . . . . . . . . . . . . . : V40LBDHE File attribute . . . . . . . . . . . . . . . . . . : Printer Source file containing DDS . . . . . . . . . . . . : QDDSSRC Library name . . . . . . . . . . . . . . . . . . : V40LBDHE Source member containing DDS . . . . . . . . . . . : ESTAARTP Source member last changed . . . . . . . . . . . . : 01/08/03 17:30:42 Source listing options . . . . . . . . . . . . . . : *SOURCE *LIST DDS generation severity level . . . . . . . . . . . : 20 DDS flagging severity level . . . . . . . . . . . . : 00 Authority . . . . . . . . . . . . . . . . . . . . . : *LIBCRTAUT Replace file . . . . . . . . . . . . . . . . . . . : *NO Text . . . . . . . . . . . . . . . . . . . . . . . : LISTADO ESTADISTICA P Compiler . . . . . . . . . . . . . . . . . . . . . : IBM AS/400 Data Descr Data Description Source SEQNBR *...+....1....+....2....+....3....+....4....+....5....+....6....+.... 2 A REF(V40LBDHE/ESTAART) 3 A R TITU 4 A SKIPB(001) 6 A LIN01 198 1 7 A SPACEA(1) 8 A TIT01 13 1 9 A TIT02 17 +5 15 A SPACEA(1) 16 A LIN02 198 1 17 A SPACEA(1) 18 A R DETAA 19 A CODAR 11 2 1 20 A DESCA 35 +2 21 A VENT01 R +3EDTCDE(1) 23 A VENT02 R +3EDTCDE(1) *...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+... 24 A VENT03 R +3EDTCDE(1) 25 A VENT04 R +3EDTCDE(1) 200 A SPACEA(1) * * * * * E N D O F S O U R C E * * * * * 5722SS1 V5R1M0 010525 Data Description V40LBD Expanded Source SEQNBR *...+....1....+....2....+....3....+....4....+....5....+....6....+.... 3 R TITU SKIPB(001) 6 LIN01 132A O 1SPACEA(1) 8 TIT01 13A O 1 9 TIT02 17A O 19SPACEA(1) 16 LIN02 132A O 1SPACEA(1) 18 R DETAA 19 CODAR 11S 2O 1 20 DESCA 35A O 14 21 VENT01 11S 2O 52 * Referenced Field . . . . . . . . . . . : VENT01 * Format . . . . . . . . . . . . . . . : RESTAV * File . . . . . . . . . . . . . . . . : ESTAART * Library . . . . . . . . . . . . . . . : V40LBDHE 21 EDTCDE(1) 21 TEXT('V.TRIM 01 21 ') 23 VENT02 11S 2O 69 * Referenced Field . . . . . . . . . . . : VENT02 * Format . . . . . . . . . . . . . . . : RESTAV * File . . . . . . . . . . . . . . . . : ESTAART * Library . . . . . . . . . . . . . . . : V40LBDHE 23 EDTCDE(1)

Page 115: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

115

23 TEXT('V.TRIM 02 23 ') 24 VENT03 11S 2O 86 * Referenced Field . . . . . . . . . . . : VENT03 * Format . . . . . . . . . . . . . . . : RESTAV * File . . . . . . . . . . . . . . . . : ESTAART * Library . . . . . . . . . . . . . . . : V40LBDHE 24 EDTCDE(1) 24 TEXT('V.TRIM 03 24 ') 25 VENT04 11S 2O 103 * Referenced Field . . . . . . . . . . . : VENT04 * Format . . . . . . . . . . . . . . . : RESTAV * File . . . . . . . . . . . . . . . . : ESTAART * Library . . . . . . . . . . . . . . . : V40LBDHE 25 EDTCDE(1) SPACEA(1) 25 TEXT('V.TRIM 04 25 ') * * * * * E N D O F E X P A N D E D S O U R C E * * 5722SS1 V5R1M0 010525 Data Description V40LBD Message Summary Total Informational Warning Error Severe (0-9) (10-19) (20-29) (30-99) 0 0 0 0 0 * CPC7301 00 Message . . . . : File ESTAARTP created in l * * * * * E N D O F C O M P I L A T I O N * * PROGRAMA PROG22 FMT * ..... *. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 *************** Beginning of data ************************************* 0001.00 H*------------------------------------------------- 0002.00 H* ABRIENDO Y CERRANDO BASES DE DATOS 0004.00 H* AUTOR : DANIEL HUGO ENRIQUEZ LEIVAS 0004.01 H* JUAN ALBERTO ENRIQUEZ SITTNER 0005.00 H* PROGRAM : PROG22 0005.01 H* DATE : 08-02-2002 0006.00 H* BUENOS AIRES - REPUBLICA ARGENTINA 0009.00 F*------------------------------------------------- 0009.01 FPANT01 CF E WORKSTN 0009.02 FMAEART IF E K DISK UC 0009.03 FMAEVEN IF E K DISK UC 0009.04 FMAEZON IF E K DISK UC 0009.05 FMAESEG IF E K DISK UC 0009.06 FESTAART IF E K DISK UC 0009.07 FESTAVEN IF E K DISK UC 0009.08 FESTAZON IF E K DISK UC 0009.09 FESTASEG IF E K DISK UC 0009.10 FESTAARTPO E 60 PRINTER 0009.11 FESTAVENPO E 61 PRINTER 0009.12 FESTAZONPO E 62 PRINTER 0009.13 FESTASEGPO E 63 PRINTER 0012.02 F*------------------------------------------------- 0028.05 C* 0028.06 C *INKC DOWEQ*OFF 0028.07 C* 0028.08 C EXFMTRPAN01 0028.10 C* 0028.14 C *INKC IFEQ *ON 0028.15 C LEAVE 0028.16 C ENDIF 0028.18 C* 0028.19 C *INKB CASEQ*ON LISA 0028.20 C *INKE CASEQ*ON LISV

Page 116: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

116

0028.21 C *INKG CASEQ*ON LISZ 0028.22 C *INKI CASEQ*ON LISS 0028.23 C ENDCS 0028.33 C ENDDO 0028.34 C* 0028.35 C MOVE *ON *INLR 0028.36 C* 0053.00 C*------------------------------------------------- 0054.00 C* LISTADO ESTADISTICA POR ARTICULO 0055.00 C*------------------------------------------------- 0056.00 C LISA BEGSR 0056.02 C* 0056.03 C OPEN MAEART 0056.04 C OPEN ESTAART 0056.05 C* 0056.06 C MOVE '11' *IN90 0056.07 C *LOVAL SETLLESTAART 91 0056.08 C READ ESTAART 90 0056.09 C WRITETITA 0058.00 C *IN90 DOWNE*ON 0058.01 C *IN60 IFEQ *ON 0058.02 C EXSR SALTO 0058.03 C ENDIF 0058.04 C ARTICU CHAINMAEART 80 0058.05 C MOVELDESCAR DESCA 0058.06 C WRITEDETAA 0059.00 C READ ESTAART 90 0061.02 C ENDDO 0061.03 C* 0061.04 C CLOSEMAEART 0061.05 C CLOSEESTAART 0061.06 C* 0062.00 C ENDSR 0066.12 C*------------------------------------------------- 0066.13 C* LISTADO POR VENDEDOR 0066.14 C*------------------------------------------------- 0066.15 C LISV BEGSR 0066.16 C* 0066.17 C OPEN MAEVEN 0066.18 C OPEN ESTAVEN 0066.19 C* 0066.20 C MOVE '11' *IN90 0066.21 C *LOVAL SETLLESTAVEN 91 0066.22 C READ ESTAVEN 90 0066.23 C WRITETITV 0066.24 C *IN90 DOWNE*ON 0066.25 C *IN61 IFEQ *ON 0066.26 C EXSR SALTO 0066.27 C ENDIF 0066.28 C VENDE CHAINMAEVEN 80 0066.29 C MOVELAYNV AYNVP 0066.30 C WRITEDETAV 0066.31 C READ ESTAVEN 90 0066.32 C ENDDO 0066.33 C* 0066.34 C CLOSEMAEVEN 0066.35 C CLOSEESTAVEN 0066.36 C* 0066.37 C ENDSR 0066.38 C*------------------------------------------------- 0066.39 C* LISTADO POR ZONA 0066.40 C*------------------------------------------------- 0066.41 C LISZ BEGSR 0066.43 C* 0066.44 C OPEN MAEZON 0066.45 C OPEN ESTAZON 0066.46 C* 0066.47 C MOVE '11' *IN90

Page 117: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

117

0066.48 C *LOVALSETLLESTAZON 91 0066.49 C READ ESTAZON 90 0066.50 C WRITETITZ 0066.51 C *IN90 DOWNE*ON 0066.52 C *IN62 IFEQ *ON 0066.53 C EXSR SALTO 0066.54 C ENDIF 0066.55 C CODZ CHAINMAEZON 80 0066.56 C MOVELZONAP DESCZP 0066.57 C WRITEDETAZ 0066.58 C READ ESTAZON 90 0066.59 C ENDDO 0066.60 C* 0066.61 C CLOSEMAEZON 0066.62 C CLOSEESTAZON 0066.63 C* 0066.64 C ENDSR 0066.65 C*------------------------------------------------- 0067.00 C* LISTADO POR SEGMENTO DE MERCADO 0068.00 C*------------------------------------------------- 0069.00 C LISS BEGSR 0070.00 C* 0070.01 C OPEN MAESEG 0070.02 C OPEN ESTASEG 0070.03 C* 0071.00 C MOVE '11' *IN90 0072.00 C *LOVAL SETLLESTASEG 91 0073.00 C READ ESTASEG 90 0074.00 C WRITETITS 0075.00 C *IN90 DOWNE*ON 0076.00 C *IN62 IFEQ *ON 0077.00 C EXSR SALTO 0078.00 C ENDIF 0078.01 C CODS CHAINMAESEG 80 0078.02 C MOVELDESCRS DESCSP 0079.00 C WRITEDETAS 0080.00 C READ ESTASEG 90 0081.00 C ENDDO 0081.01 C* 0081.02 C CLOSEMAESEG 0081.03 C CLOSEESTASEG 0081.04 C* 0083.00 C ENDSR 0083.01 C*------------------------------------------------- 0083.02 C* RUTINA DE SALTO DE PAGINA 0083.03 C*------------------------------------------------- 0083.04 C SALTO BEGSR 0083.05 C* 0083.06 C *IN60 IFEQ *OFF 0083.07 C WRITETITA 0083.08 C ENDIF 0083.09 C* 0083.10 C *IN61 IFEQ *OFF 0083.11 C WRITETITV 0084.00 C ENDIF 0085.00 C* 0086.00 C *IN62 IFEQ *OFF 0087.00 C WRITETITZ 0088.00 C ENDIF 0089.00 C* 0090.00 C *IN63 IFEQ *OFF 0091.00 C WRITETITS 0092.00 C ENDIF 0093.00 C* 0094.00 C MOVE '0000' *IN60 0095.00 C* 0096.00 C ENDSR ****************** End of data *******************

Page 118: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

118

Desarrollo del programa PROG22

Al comenzar la ejecucion del programa el RPG/400 no abrira ninguna base de datos ya que según lo especificado en la hoja - F - las mismas se abrirán durante las operaciones de calculo. En la hoja de calculo encontramos un DOWEQ que controla el flujo principal del programa. Este DOWxx se ejecutara siempre y cuando el *INKC este desactivado o sea el usuario no presione el mandato 3 , obsérvese la pantalla de ejemplo. Al desplegar la pantalla el programa esta a la espera de que se presione uno de los mandatos indicados en la misma. Si se presiona el mandato por ejemplo 2 (*INKB) las operación CASEQ bifurcara el control del programa a la rutina LISA ( listado de artículos ). Una vez en esta rutina nos encontramos con las operaciones OPEN que abrirán las bases de datos MAEART ( maestro de articulo ) y ESTAART ( estadística por articulo ). En la sentencia 56.07 nos posicionamos para comenzar la lectura de la base de datos la cual se leerá hasta que el indicador 90 no se active por fin de archivo ( operaciones SETLL y READ ). También controlamos por medio del indicador 60 el desbordamiento o overflow de pagina efectuando el salto correspondiente al llegar a la línea 66 de impresión según los parámetros de compilación del printer file. Como necesitamos la descripción del articulo la obtenemos del archivo MAEART por medio de la operación CHAIN. Al finalizar la lectura e impresión de los registro de todos los artículos se encenderá el indicador 90 por final de archivo que obligara a abandonar el DOWxx y a continuación nos encontramos con las operaciones CLOSE que cerraran las bases de datos que hemos utilizado y al finalizar la rutina devolverá el control del programa al DOWxx de la sentencia 28.06 desplegando nuevamente la pantalla y esperando la acción correspondiente por parte del usuario . Como vera este ciclo de funcionamiento es similar para las rutinas de impresión de estadística por vendedor, zona y segmento variando en cada una de ellas sus correspondientes bases de datos y printer files.

Page 119: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

119

15. OPERACIONES DE INFORMACION. DEBUG (Depuración) DUMP (Vuelco del programa) SHTDN (Cierre) TIME (Hora del día) DEBUG (Depuración) Esta operación permite al programador depurar un programa que no esta funcionando de manera adecuada. Con esta operación se graban registros que contienen la información que será de ayuda para buscar los errores de programación. Esta operación se puede utilizar independientemente de o en combinación con las funciones de prueba y depuración del sistema operativo OS/400. La misma se puede especificar en cualquier punto del programa RPG dentro de la hoja de calculo. Al encontrar esta operación se graban los registros correspondientes con información en ese punto del programa. DUMP (Vuelco del programa) Esta operación nos permite realizar un vuelco del programa proporcionándonos información sobre todos los archivos, campos, estructuras de datos, matrices, tablas e indicadores utilizados.

Page 120: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

120

SHTDN (Cierre) Esta operación nos permite determinar si el operador del sistema ha solicitado el cierre o desactivación del mismo. 0062.80 C *LOVAL SETLLBPP001L1 90 0062.81 C READ RBFP01 90 0062.82 C WRITETITU 0062.83 C *IN90 DOWEQ*OFF 0062.84 C *IN60 IFEQ *ON 0062.85 C WRITETITU 0062.86 C MOVE '0' *IN60 0062.87 C ENDIF 0062.88 C WRITEDETA 62.89 C* 62.90 C SHTDN 75 62.91 C 75 GOTO FIN 0062.90 C READ RBFP01 90 0062.91 C *IN90 IFEQ *ON 0062.92 C LEAVE 0062.93 C ENDIF 0062.94 C ENDDO 0062.95 C* 0062.96 C ENDSR Si el operador del sistema ha solicitado su desactivación se encenderá el indicador 75 codificado en las columnas 54 y 55 y ha continuación se ejecutara la sentencia condicionada por este indicador GOTO FIN TIME (Hora del día) Esta operación nos permite conocer el día y hora del sistema.

Page 121: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

121

28.13 C 28.14 C *LOVALSETLLFCL005L1 90 028.15 C READ RFC05 90 028.16 C* 028.17 C* 028.18 C *IN90 DOWEQ*OFF 028.19 C CODVTAIFNE *ZEROS 028.20 C EXSR PRIN01 028.21 C ENDIF 028.22 C READ RFC05 90 028.23 C *IN90 IFEQ *ON 028.24 C TIME HORA 60 028.25 C TIME HRDAT 120 17. OPERACIONES DECLARATIVAS Y DE LLAMADA CALL ( Llamada a un programa ) PARM ( identificar parametros ) PLIST ( identificar una lista de parámetros ) RETRN ( Retornar al programa ) FREE ( Desactivar un programa ) DEFN ( Definición de campo ) KLIST ( Definir una clave ) KFLD ( Definir partes de una clave ) CALL ( Llamada a un programa ) Esta operación nos permite transferir el control a un programa especificado en el factor 2. El factor 2 puede contener un nombre de campo, un literal, un elemento de matriz o una constante con nombre los cuales deberán contener el nombre del programa que deseamos llamar y opcionalmente podrá contener el nombre de la biblioteca en el cual se ubica el programa objeto. 0028.05 C* 0028.06 C CALL 'PGM01' 0028.07 C*

Page 122: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

122

En este ejemplo estamos transfiriendo el control del programa al programa PGM01. Si necesitáramos hacer mención a la biblioteca donde se encuentra en programa, podemos especificar el nombre de esta inmediatamente después una barra inclinada y a continuación el nombre del programa 0028.00 C*------------------------------------------------- 0028.01 C*OPERACION CALL 0028.02 C*------------------------------------------------- 0028.05 C* 0028.06 C CALL 'LIB/PGM1' 28.07 C* Pero no encontramos con la limitación de 8 caracteres para hacer referencia a la biblioteca y al nombre del programa. Esto lo podemos solucionar mediante la definición de una constante con nombre en la hoja 'I' de la siguiente manera. 0012.02 I 'PGM01' C C0001 0012.03 I 'V40LBDHE/PGM02' C C0002 0028.00 C*------------------------------------------------- 0028.01 C*OPERACION CALL 0028.02 C*------------------------------------------------- 0028.05 C* 0028.06 C CALL C0001 0028.07 C* 0028.08 C CALL C0002 0028.09 C*

Page 123: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

123

PARM ( identificar parámetros ) Esta operación nos permite declarar los parámetros que componen una lista de parámetros (PLIST) que deseamos transferir hacia otro programa. Observemos el ejemplo, hemos definido dos parámetros, el parámetro CLIENT de 8 posiciones y el parámetro CUENTA de 12 posiciones los que serán utilizados por el programa NSA01. Las sentencias PARM deberán estar en el orden esperado por el programa llamado. Estas sentencias PARM pueden especificarse en cualquier lugar de la hoja de calculo, calculo de totales o cortes de control. 0028.05 C* 0028.06 C CALL 'NSA01' LPARAM 0028.07 C LPARAM PLIST 0028.08 C PARM CLIENT 8 0028.09 C PARM CUENTA 12 0028.10 C* PLIST ( identificar una lista de parámetros ) Esta operación nos permite definir un nombre simbólico único para una lista de parámetros que deseamos especificar en una operación CALL. 0028.05 C* 0028.06 C CALL 'NSA01' LPARAM 0028.07 C LPARAM PLIST 0028.08 C PARM CLIENT 8 0028.09 C PARM CUENTA 12 0028.10 C* En el ejemplo que estamos utilizando este nombre simbólico esta representado por LPARAM y el programa llamado tendrá acceso a

Page 124: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

124

todos los parámetros comprendidos en la operación PLIST definidos por las operaciones PARM campos - CLIENT y CUENTA -. RETRN ( Retornar al programa ) Esta operación produce el retorno del programa llamado al programa llamador. Tenemos nuestro programa PG056 ( el llamador ) y realizamos una operación CALL al programa NSA01(llamado) 0028.05 C* 0028.06 C CALL 'NSA01' LPARAM 0028.07 C LPARAM PLIST 0028.08 C PARM CLIENT 8 0028.09 C PARM CUENTA 12 0028.10 C* En el programa NSA01 en un lugar especificado en la hoja de calculo nos encontraremos con la operación RETRN que devolverá el control al programa llamador. 0028.21 C* 0028.22 C TASAP MULT CAPIT CAPTOT 0028.23 C EXSR IMPRE 0028.24 C* 0028.25 C ZONA IFGT ZONAS 0028.26 C EXSR PROCE 0028.27 C EXSR PRIN1 0028.28 C ENDIF 0028.29 C* 0028.30 C RETRN FREE ( Desactivar un programa ) La operación FREE elimina un programa de la lista de programas activados, liberando el almacenamiento estático y asegurando la inicialización de programa para la próxima vez que se lo llame. Esta operación no cierra archivos ni desbloquea áreas de datos. El factor 2 deberá contener el nombre del programa a desactivar pudiendo contener un nombre de campo, una constante con nombre, una

Page 125: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

125

literal o un elemento de matriz que contenga el nombre del programa a desactivar. En las columnas 57 y 58 podremos codificar un indicador que se activara si esta operación no se completa satisfactoriamente. 0028.05 C* 0028.06 C CALL 'NSA01' LPARAM 0028.07 C lPARAM PLIST 0028.08 C PARM CLIENT 8 0028.09 C PARM CUENTA 12 0028.10 C* 0028.30 C* 0028.31 C FREE 'NSA01' 72 0028.32 C* Hemos llamado al programa NSA01, este ha realizado su función y al regresar al programa llamador en algún lugar de la hoja de calculo hemos liberado al mismo por medio de la operación FREE. Si al realizar esta operación se produjera un error en el ejemplo se activara el indicador de resultado 72. DEFN ( Definición de campo ) La operación declarativa DEFN nos permite definir un campo en base a los atributos de otro campo o definir un campo como un área de datos. Supongamos que tenemos definidos los siguientes campos: CAM01 de caracteres de 6 posiciones CAM02 numérico de 5 dígitos con 2 posiciones decimales

Page 126: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

126

0028.02 C*------------------------------------------------- 0028.05 C* 0028.06 C EXSR INI 0028.07 C* 0028.08 C* CAM03 DEFINIDO CON LOS MISMOS ATRIBUTOS QUE CAM01 0028.09 C* 0028.10 C *LIKE DEFN CAM01 CAM03 0028.11 C* 0028.12 C* 0028.13 C* CAM04 DEFINIDO DE 8 CARACTERES 0028.14 C* 0028.15 C *LIKE DEFN CAM01 CAM04 + 2 0028.16 C* 0028.17 C* CAM05 DEFINIDO DE 5 CARACTERES 0028.18 C* 0028.19 C *LIKE DEFN CAM01 CAM05 - 1 0028.20 C* 0028.21 C* 0028.22 C* CAM06 DEFINIDO DE 7 DIGITOS 2 DECIMALES 0028.23 C* 0028.24 C *LIKE DEFN CAM02 CAM06 + 2 0028.25 C* 0028.26 C *LOVAL SETLLMOVI 90 Prompt type . . . C Sequence number . . . 0028.24 Level N01N02N03 Factor 1 Operation Factor 2 Result *LIKE DEFN CAM02 CAM06 Decimal Length Positions H/N/P HI LO EQ Comment + 2 Podemos utilizar las posiciones 49 a 51 ( longitud de campo ) para modificar la longitud del campo a definir. Un signo '+' en la posición 49 incrementara su longitud y un signo '-' indicara una reducción.

Page 127: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

127

KLIST ( Definir una clave ) Esta operación es una operación declarativa que da un nombre a una lista de KFLD. Esta lista la podemos utilizar como argumento de búsqueda para recuperar registros de archivos que tienen una clave compuesta. Una operación KLIST puede especificarse en cualquier lugar de la hoja de cálculos. 0028.25 C* 0028.26 C CLAVE KLIST 0028.27 C 0028.28 C* En el ejemplo anterior el campo CLAVE contendrá la clave de acceso para acceder a nuestra base de datos. KFLD ( Definir partes de una clave ) Esta operación nos permite definir los campos que conformaran la clave o argumento de búsqueda de una operación KLIST 0028.25 C* 0028.26 C CLAVE KLIST 0028.27 C KFLD CLIENT 0028.28 C KFLD TIPCBT 0028.29 C KFLD NUMCBT Ahora siguiendo con nuestro ejemplo el campo CLAVE estará compuesto por los campos CLIENT,TIPCBT,NUMCBT , cliente, tipo de comprobante y numero de cliente respectivamente., o sea hemos definido una clave compuesta para acceder a nuestra base de datos.

Page 128: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

128

18. SUBFILE A continuación desarrollaremos un ejemplo donde veremos en sencillo programa la utilización de SUBFILE . Nuestro programa consistirá en desarrollar un visualizador del maestro de vendedores y desde este visualizador poder acceder a la estadística de venta y movimientos de facturación del vendedor seleccionado. DDS utilizadas en el programa ejemplo: Archivo maestro de vendedores : *************** Beginning of data *************** 0000.01 A* --------------------------------------------------------------- 0000.02 A* DHEL SYSTEM BUENOS AIRES REPUBLICA ARGENTINA 0000.03 A* GOLETA SARANDI 0000.04 A* --------------------------------------------------------------- 0000.05 A* FILE MAEVEN 0000.21 A* DATE 2002 0000.22 A* AUTOR DANIEL HUGO ENRIQUEZ LEIVAS 0000.31 A*---------------------------------------------------------------- 0000.40 A R RMAEVN 0000.41 A CODVEN 4S 0 TEXT('COD.VENDEDOR') 0000.42 A AYNV 35A TEXT('A Y N VENDEDOR') 0000.43 A COMIS 7S 2 TEXT('COMISION') 0001.00 A K CODVEN ****************** End of data ************ Archivo Estaditica de venta trimestral por vendedor: *************** Beginning of data ******************* 0000.01 A* --------------------------------------------------------------- 0000.02 A* DHEL SYSTEM BUENOS AIRES REPUBLICA ARGENTINA 0000.03 A* GOLETA SARANDI 0000.04 A* --------------------------------------------------------------- 0000.05 A* FILE ESTAART 0000.21 A* DATE 2002 0000.22 A* AUTOR DANIEL HUGO ENRIQUEZ LEIVAS

Page 129: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

129

0000.31 A*---------------------------------------------------------------- 0000.40 A R RESTAV 0000.41 A VENDE 4S 0 TEXT('COD.VENDEDOR') 0000.42 A VENT01 11S 2 TEXT('V.TRIM 01') 0000.43 A VENT02 11S 2 TEXT('V.TRIM 02') 0000.44 A VENT03 11S 2 TEXT('V.TRIM 03') 0000.45 A VENT04 11S 2 TEXT('V.TRIM 04') 0001.00 A K VENDE ****************** End of data ****************** Archivo movimientos de facturacion: *************** Beginning of data ********************* 0000.01 A* ------------------------------------------------------------ 0000.02 A* DHEL SYSTEM BUENOS AIRES REPUBLICA ARGENTINA 0000.03 A* GOLETA SARANDI 0000.04 A* ------------------------------------------------------------ 0000.05 A* FILE MOVFAC 0000.21 A* DATE 2002 0000.22 A* AUTOR DANIEL HUGO ENRIQUEZ LEIVAS 0000.31 A*------------------------------------------------------------- 0000.40 A R RMOVFA 0000.41 A CBTE 2A TEXT('TIP.COMPROB') 0000.42 A NUMERO 6S 0 TEXT('NUMERO') 0000.43 A CLIENT 5S 0 TEXT('CLIENTE') 0000.44 A VEND 4S 0 TEXT('VENDEDOR') 0000.45 A IMPORT 11S 2 TEXT('IMPORTE') ****************** End of data ******************* Archivo movimientos de facturacion. Lógico indexado por vendedor: *************** Beginning of data **************** 0000.01 A* -------- - - ------ 0000.02 A* SISTEMA FACTURACION 0000.03 A* ARCHIVO MOVFAC 0000.21 A* LOGICO MOVFACL5 0000.23 A* AUTOR DANIEL HUGO ENRIQUEZ LEIVAS 0000.31 A*------------------------------------------------------------ 0000.40 A R RMOVFA PFILE(V40LBDHE/MOVFAC) 0000.41 A K VEND ****************** End of data *************** Pantalla PROG60FM :

Page 130: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

130

FMT A* .....A*. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+.. *************** Beginning of data ********************************* 0000.10 A*%%TS SD 20030118 115826 GOLETA REL-V5R1M0 5722-WDS 0000.20 A*%%EC 0000.30 A DSPSIZ(24 80 *DS3) 0000.40 A REF(*LIBL/MAEVEN) 0000.50 A R PAN6001 SFL 0000.60 A SFLNXTCHG 0000.70 A*%%TS SD 20030112 182939 GOLETA REL-V5R1M0 5722-WDS 0000.80 A CODVEP 4S 0O 10 7COLOR(YLW) 0000.90 A AYNP 35A O 10 21COLOR(YLW) 0001.00 A OP 1A B 10 63COLOR(RED) 0001.10 A R CPAN6001 SFLCTL(PAN6001) 0001.20 A*%%TS SD 20030117 174159 GOLETA REL-V5R1M0 5722-WDS 0001.30 A SFLSIZ(9999) 0001.40 A SFLPAG(0007) 0001.50 A CF03 0001.60 A OVERLAY 0001.70 A KEEP 0001.80 A 40 SFLEND 0001.90 A 41 SFLDSP 0002.00 A 42 SFLDSPCTL 0002.10 A 43 SFLCLR 0002.20 A 2 31'DHEL' 0002.30 A COLOR(BLU) 0002.40 A 2 36'SISTEMAS' 0002.50 A COLOR(BLU) 0002.60 A 3 25'VISUALIZADOR DE VENDEDORES 0002.70 A COLOR(BLU) 0002.80 A 5 11'1= ESTADISTICA DEL VENDEDO 0002.90 A F3 = EXIT' 0003.00 A COLOR(WHT) 0003.10 A 4 4'__________________________ 0003.20 A ___________________________ 0003.30 A COLOR(RED) 0003.40 A 6 4'__________________________ 003.60 A COLOR(RED) 0005.00 A R PAN6002 0005.10 A*%%TS SD 20030112 115639 GOLETA REL-V5R1M0 5722-WDS 0005.20 A WINDOW(2 2 6 73) 0005.30 A OVERLAY 0005.40 A CF03 0005.50 A CF05 0005.60 A 4 17'trim 01' 0005.70 A COLOR(RED) 0005.80 A 4 32'trim 02' 0005.90 A COLOR(RED) 0006.00 A 4 47'trim 03' 0006.10 A COLOR(RED) 0006.20 A 4 61'trim 04' 0006.30 A COLOR(RED) 0006.40 A CV 4A O 3 18COLOR(BLU)

Page 131: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

131

0006.50 A AYN 35A O 3 29COLOR(BLU) 0006.60 A 1 17'Estadistica trimestral del vendedor: 0006.70 A r:' 0006.80 A COLOR(WHT) 0006.90 A 1 10'!' 0007.00 A COLOR(WHT) 0007.10 A 2 10'!' 0007.20 A COLOR(WHT) 0007.30 A 3 10'!' 0007.40 A COLOR(WHT) 0007.50 A 4 10'!' 0007.60 A COLOR(WHT) 0007.70 A 1 2'DHEL' 0007.80 A COLOR(WHT) 0007.90 A 2 1'________' 0007.10 A 2 10'!' 0007.20 A COLOR(WHT) 0007.30 A 3 10'!' 0007.40 A COLOR(WHT) 0007.50 A 4 10'!' 0007.60 A COLOR(WHT) 0007.70 A 1 2'DHEL' 0007.80 A COLOR(WHT) 0007.90 A 2 1'________' 0008.00 A COLOR(WHT) 0008.10 A 3 1'F3=EXIT' 0008.20 A COLOR(WHT) 0008.30 A 2 12'__________________________ 0008.40 A _________________________' 0008.50 A COLOR(WHT) 0008.60 A 1 58'Bs.As. Arg.' 0008.70 A COLOR(WHT) 0008.80 A 4 1'________' 0008.90 A COLOR(WHT) 0009.00 A T1 11 2O 5 14EDTCDE(1) 0009.10 A COLOR(WHT) 0009.20 A T2 11 2O 5 29EDTCDE(1) 0009.30 A COLOR(WHT) 0009.40 A T3 11 2O 5 44EDTCDE(1) 0009.50 A COLOR(WHT) 0009.60 A T4 11 2O 5 59EDTCDE(1) 0009.70 A COLOR(WHT) 0009.80 A 5 10'!' 0009.90 A COLOR(WHT) 0010.00 A 5 1'F5=OVD' 0010.10 A COLOR(WHT) 0010.20 A*-------------------------------------------- 0010.30 A R PAN6101 SFL 0010.40 A*%%TS SD 20030118 115826 GOLETA REL-V5R1M0 5722-WDS 0010.50 A CBTP 2 O 4 4COLOR(YLW) 0010.60 A NUMERP 5 0O 4 7COLOR(YLW) 0010.70 A CLIENP 6 0O 4 14COLOR(YLW) 0010.71 A IMPORP 11 0O 4 22COLOR(YLW) 0010.80 A EDTCDE(1)

Page 132: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

132

0010.90 A R CPAN6101 SFLCTL(PAN6101) 0011.00 A*%%TS SD 20030118 115826 GOLETA REL-V5R1M0 5722-WDS 0011.10 A SFLSIZ(9999) 0011.20 A SFLPAG(0006) 0011.30 A WINDOW(11 2 10 42) 0011.40 A CF03 0011.50 A OVERLAY 0011.60 A KEEP 0011.70 A 40 SFLEND 0011.80 A 41 SFLDSP 0011.90 A 42 SFLDSPCTL 0012.00 A 43 SFLCLR 0012.10 A 2 1'__________________________ 0012.20 A ______' 0012.30 A 1 34'F3=EXIT' 0012.40 A COLOR(WHT) 0012.50 A 1 3'cbt nro client impor 0012.60 A COLOR(RED) ****************** End of data ****************** PROGRAMA PROG60 FMT * ..... *. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+. *************** Beginning of data ******************************** 001.00 H*------------------------------------------------- 002.00 H* UTILIZACION DE SUBFILE 002.01 H* AUTOR : DANIEL HUGO ENRIQUEZ LEIVAS 005.00 H* PROGRAM : PROG60 005.01 H* DATE : 03-11-2002 006.00 H* BUENOS AIRES - REPUBLICA ARGENTINA 009.00 F*------------------------------------------------- 009.01 FPROG60FMCF E WORKSTN 009.02 F NRR1 KSFILE PAN6001 009.03 F NRR2 KSFILE PAN6101 009.04 FMAEVEN IF E K DISK 009.07 FESTAVEN IF E K DISK 009.08 FMOVFACL5IF E K DISK 012.02 F*------------------------------------------------- 012.03 C* 012.04 C* CARGA DEL SUBFILE PAN6001 0028.05 C* 0028.08 C EXSR CARGA 0028.09 C* 0028.10 C *INKC DOWEQ*OFF 0028.11 C* 0028.12 C MOVEA'11' *IN,41 0028.13 C EXFMTCPAN6001 0028.14 C MOVEA'00' *IN,41 0028.15 C* 0028.15 C*

Page 133: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

133

0028.16 C *INKC IFEQ *ON 0028.17 C LEAVE 0028.18 C ENDIF 0028.19 C* 0028.20 C*CONTROL DE OPCION 1 = ESTADISTICA DE VENTAS 0028.21 C* 0028.22 C Z-ADD1 X 20 0028.23 C MOVEA'00' *IN,90 0028.24 C *IN90 DOWNE*ON 0028.25 C X CHAINPAN6001 9091 0028.26 C *IN91 IFEQ *ON 0028.27 C LEAVE 0028.28 C ENDIF 0028.29 C OP IFEQ '1' 0028.30 C MOVEL' ' OP 0028.31 C UPDATPAN6001 0028.32 C CODVEPCHAINESTAVEN 80 0028.33 C CLEARPAN6002 0028.34 C *IN80 IFEQ *OFF 0028.35 C MOVELCODVEP CV 0028.36 C MOVELAYNP AYN 0028.37 C Z-ADDVENT01 T1 0028.38 C Z-ADDVENT02 T2 0028.39 C Z-ADDVENT03 T3 0028.40 C Z-ADDVENT04 T4 0028.41 C ENDIF 0028.42 C EXFMTPAN6002 0028.43 C *INKE IFEQ *ON 0028.44 C EXSR FACTU 0028.45 C ENDIF 0028.49 C ENDIF 0028.50 C ADD 1 X 0028.51 C ENDDO 0028.52 C MOVE '0' *INKC 0028.53 C ENDDO 0028.54 C* 0028.54 C* 0028.55 C MOVE *ON *INLR 0028.56 C* 0053.00 C*------------------------------------------------ 0054.00 C* CARGA EN SUBFILE DE VENDEDORES - PAN6001 0055.00 C*------------------------------------------------ 0056.00 C CARGA BEGSR 0056.01 C* 0056.02 C* INIZIALIZO EL SUBFILE 0056.03 C* 0056.04 C SETON 43 0056.05 C Z-ADD*ZEROS CODVEP 0056.06 C MOVEL*BLANKS AYNP 0056.07 C WRITECPAN6001 0056.09 C SETOF 4340 0056.10 C*

Page 134: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

134

0056.12 C Z-ADD1 NRR1 50 0056.13 C *LOVAL SETLLMAEVEN 91 0056.14 C READ MAEVEN 90 0056.15 C* 0058.00 C *IN90 DOWNE*ON 0058.02 C Z-ADDCODVEN CODVEP 0058.03 C MOVELAYNV AYNP 0058.05 C MOVEL*BLANKS OP 0058.06 C WRITEPAN6001 0058.07 C ADD 1 NRR1 0058.08 C* 0058.09 C READ MAEVEN 90 0058.10 C *IN90 IFEQ *ON 0058.11 C SETON 40 0058.12 C LEAVE 0058.13 C ENDIF 0058.14 C* 0061.02 C ENDDO 0061.06 C* 0062.00 C ENDSR 0067.00 C*------------------------------------------------- 0068.00 C* CARGA EN SUBFILE MOVIMIENTOS DE FACTURACION 0069.00 C*------------------------------------------------- 0070.00 C FACTU BEGSR 0071.00 C* INIZIALIZACION DEL SUBFILE 0072.00 C* 0073.00 C SETON 43 0077.00 C MOVEL*BLANKS CBTP 0078.00 C Z-ADD*ZEROS NUMERP 0079.00 C Z-ADD*ZEROS CLIENP 0080.00 C Z-ADD*ZEROS IMPORP 0080.01 C WRITECPAN6101 0082.00 C SETOF 4340 0083.00 C* 0084.00 C* CARGA DEL SUBFILE MOVIMIENTOS DE FACTURACION 0085.00 C* 0086.00 C EXSR CARGA2 0087.00 C* 0088.00 C* 0089.00 C* MOSTRAR SUBFILE 0090.00 C* 0091.00 C *INKC DOWNE*ON 0092.00 C MOVEA'11' *IN,41 0093.00 C EXFMTCPAN6101 0094.00 C MOVEA'00' *IN,41 0095.00 C *INKC IFEQ *ON 0095.01 C MOVE '0' *INKC 0096.00 C LEAVE 0097.00 C ENDIF 0098.00 C ENDDO 0101.00 C* 0101.01 C MOVE '0' *INKC 0101.02 C ENDSR 0103.00 C*-------------------------------------------------

Page 135: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

135

0104.00 C* RUTINA DE CARGA DEL SUBFILE 0105.00 C*------------------------------------------------- 0106.00 C CARGA2 BEGSR 0107.00 C Z-ADD1 NRR2 50 0108.00 C MOVEA'00' *IN,90 0108.01 C MOVE CODVEP CODV 40 0110.00 C CODV SETLLMOVFACL5 91 0111.00 C READEMOVFACL5 90 0112.00 C *IN90 DOWNE*ON 0117.00 C MOVELCBTE CBTP 0118.00 C Z-ADDNUMERO NUMERP 0119.00 C Z-ADDCLIENT CLIENP 0120.00 C Z-ADDIMPORT IMPORP 0121.00 C WRITEPAN6101 0122.00 C ADD 1 NRR2 0123.00 C READEMOVFACL5 90 0124.00 C *IN90 IFEQ *ON 0125.00 C SETON 40 0126.00 C LEAVE 0127.00 C ENDIF 0128.00 C ENDDO 129.00 C ENDSR 130.00 C*------------------------------------------------- ****************** End of data **************** DESARROLLO DE NUESTRO EJEMPLO: Observemos la hoja 'F" en ella se encuentra definida una pantalla llamada PROG60FM que contiene varios formatos de registro dos de los cuales son SUBFILE los que se encuentran controlados por numero relativo de registro, en nuestro ejemplo hemos codificado dos campos que manejaran los números relativos de registros NRR1 y NRR2 para los formatos de registro de pantalla PAN6001 y PAN6101 respectivamente. En esta hoja también vemos la definición de los archivos MAEVEN - maestro de vendedores - ESTAVEN - estadística de venta - y MOVFACL5 - movimientos de facturación - ( archivos lógico indexado por código de vendedor ). Comienza la hoja de calculo bifurcando a la rutina CARGA la que tiene el objetivo de cargar en el subfile PAN6001 los datos de todos los vendedores , en nuestro caso CODVEN - código de vendedor - y AYNV - apellido y nombre del vendedor -. Una vez en la rutina CARGA deberemos inicializar el subfile ( todo subfile antes de ser utilizado deberá ser inizializado ). Observe la DDS de la pantalla PROG60FM - pagina 138 - en la línea 0000.50 vera la definición de un nombre de registro ( R ) el cual hemos denominado PAN6001 y la palabra SFL - subfile - asociada , la cual indica que este será un formato de registro de subfile. En este formato de registro almacenaremos los datos de todos

Page 136: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

136

los vendedores. Todo subfile tiene asociado un registro de control que en nuestro ejemplo lo encontrara en la línea numero 0001.10 - R CPAN6001 y su palabra asociada SFLCTL (nombre de subfile ) - . En este formato de subfile control vemos la utilización de palabras como SFLSIZ, SFLPAG, SFLEND, SFLDSP, SFLDSPCTL Y SFLCLR. Comenzaremos por comentar que SFLSIZ indica la cantidad de registro que almacenara nuestro subfile y SFLPAG la cantidad de registro que mostrara por pagina - léase pantalla - en nuestro ejemplo podremos cargar 9999 registro de vendedores y mostraremos 7 por cada pantalla. Ahora observe las líneas de la DDS desde la 0001.80 a la 0002.10 vemos codificados indicadores y palabras asociadas las cuales explicaremos a continuación comenzando por la palabra SFLCLR. Esta palabra se encuentra asociada al indicador 43 el cual si se encuentra activo nos permitirá inicializar el subfile utilizando la operación WRITE. Luego de ejecutar esta ultima operación deberemos desactivar el indicador por medio de una operación SETOF - véase sentencia 0056.09 -. A continuación establecemos el campo NRR1 en '1' el cual nos permitirá acceder a nuestro subfile por numero relativo de registro. Comenzamos la lectura del archivo MAEVEN y grabamos los registros en el SUBFILE por medio de la operación WRITE - véase sentencia 0058.06 -. Una vez finalizada la rutina CARGA el control del programa continuara ejecutando las operaciones que estén codificadas a partir de la sentencia 0028.09. Mientras no este activado el indicador *INKC - mandato 3 - se ejecutara el DOWxx y por desplegara el formato de registro de pantalla CPAN6001 . Observe que antes de esta operación hemos activados los indicadores 41 y 42 que en nuestra DDS se encuentran asociados a las palabras SFLDSP - Display subfile y SFLDSPCTL display subfile control respectivamente y veremos en nuestra terminal la pantalla VISUALIZANDO LOS VENDEDORES DEL MAESTRO DE VENDEDORES - Estado 1 que se muestra en la hoja 148. Ahora el programa estará esperando algún evento como por ejemplo presionar 'F3' lo que hará que el programa finalice o que el usuario seleccione un vendedor por medio de un digito '1' lo que hará que por ese numero de vendedor se muestre la estadística trimestral de ventas sentencia 0028.42 VISUALIZANDO LA ESTADISTICA TRIMESTRAL DE VENTA PARA EL VENDEDOR SELECCIONADO - Estado 2 , formato de pantalla PAN6002 con atributo WINDOW - véase línea 0005.20 en la correspondiente DDS. En esta ultima pantalla el programa esta a la espera de que se produzca otro evento el cual puede ser 'F3' que nos devolverá a la pantalla anterior o 'F5' hará que el programa bifurcara el control a la rutina de CARGA2 cuyo objetivo es cargar los movimientos de facturación en un subfile definido en los formatos de registros en la DDS por PAN6101 y CPAN6101 VISUALIZANDO LA ESTADISTICA TRIMESTRAL DE VENTA PARA EL VENDEDOR Y LOS MOVIMIENTOS DE FACTURACION - Estado 3. Este

Page 137: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

137

subfile tiene el atributo de ser un subfile window. En esta ultima rutina la carga y despliegue del subfile es similar a la rutina explicada anteriormente. VISUALIZANDO LOS VENDEDORES DEL MAESTRO DE VENDEDORES - Estado 1 DHEL SISTEMAS VISUALIZADOR DE VENDEDORES _____________________________________________________________________ 1= ESTADISTICA DEL VENDEDOR F3 = EXIT _____________________________________________________________________ 0010 DEBRA DOUB _ 0020 FERNANDA LEBOREIRO DURRIFF _ 0030 EDUARDO ALBERTO ENRIQUEZ _ 0040 ALICIA PEREZ _ 0050 AMALIA LEIVAS S. DE ENRIQUEZ _ 0060 PEDRO MORENO _ 0070 DANIEL LOPEZ _ + VISUALIZANDO LA ESTADISTICA TRIMESTRAL DE VENTA PARA EL VENDEDOR SELECCIONADO - Estado 2 ...........................................................................………………………………. : DHEL ! Estadistica trimestral del vendedor: Bs.As. Arg. : : ________ ! __________________________________________________________ : : F3=EXIT ! 0010 DEBRA DOUB : : ________ ! trim 01 trim 02 trim 03 trim 04 : : F5=OVD! 48,547.00 51,521.00 54,787.54 52,496.30 : : : :.........................................................................………………………………..: 0010 DEBRA DOUB 1 0020 FERNANDA LEBOREIRO DURRIFF - 0030 EDUARDO ALBERTO ENRIQUEZ - 0040 ALICIA PEREZ - 0050 AMALIA LEIVAS S. DE ENRIQUEZ - 0060 PEDRO MORENO - 0070 DANIEL LOPEZ - +

Page 138: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

138

VISUALIZANDO LA ESTADISTICA TRIMESTRAL DE VENTA PARA EL VENDEDOR Y LOS MOVIMIENTOS DE FACTURACION - Estado 3 ..................................................................………………………………….......... : DHEL ! Estadistica trimestral del vendedor: Bs.As. Arg. : : ________ ! ___________________________________________________________ : : F3=EXIT! 0010 DEBRA DOUB : : ________ ! trim 01 trim 02 trim 03 trim 04 : : F5=OVD! 214,545.74 189,824.61 206,373.10 228,935.36 : : : :.........................................................................…………………………………..: 0010 DEBRA DOUB 1 ............................................……………………. : cbt nro client importe F3=EXIT : : ________________________________________ : : : : FC 35266 000110 1,547 : : FC 35355 000020 6,474 : + : FC 35589 000020 2,627 : : NC 00891 000045 67 : : FC 35467 000100 2,425 : : FC 35792 000043 5,262 + : : : :..........................................…………………….:

Page 139: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

139

operación Acción

ADD SUMA ANDxx OPERACION LOGICA ' Y' BEGSR INICIO DE SUBRUTINA BITOF DESACTIVAR BITS BITON ACTIVAR BITS CABxx COMPARAR Y BIFURCAR CALL LLAMADA A UN PROGRAMA CAT CONCATENAR CHAIN ACCESO AL AZAR CHECK COMPROBAR CARACTERES CKEKR COMPROBAR CARACTERES HACIA

ATRAS CLEAR BORRAR CLOSE CLOSE COMIT COMIT COMP COMPARAR DEBUG DEPURACION DEFN DEFINICION DE CAMPOS DELET BORRA UN REGISTRO DIV OPERACION DE DIVIDIR DO HACER DOUxx HACER HASTA DOWxx HACER MIENTRAS DSPLY FUNCION DE VISUALIZACION DUMP VUELCO DE PROGRAMA ELSE CASO CONTRARIO HACER ENDxx FIN DE GRUPO ENDCS ENDDO FIN DE UN DO ENDIF FIN DE UN IF ENDSL FIN GRUPO SELECT ENDSR FIN DE RUTINNA EXCPT SALIDA EN TIEMPO DE CALCULO EXFMT GRABAR/LEER REGISTRO EXSR EJECUTAR UNA SUBRUTINA FEOD FORZAR FIN DE DATOS FORCE FORZAR LECTURA

Page 140: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

140

FREE DESACTIVAR UN PROGRAMA GOTO BIFURCAR A IFxx OPERACION CONDICIONAL IN RECUPERACION DE AREA DE

DATOS ITER ITERAR KFLD DEFINICION DE CLAVES KLIST DEFINICION DE CLAVE

COMPUESTA LEAVE SALIR DEL GRUPO DO LOKUP BUSCAR MHHZO MOVER ZONA MHLZO MOVER ZONA MLHZO MOVER ZONA MLLZO MOVER ZONA MOVE MOVER MOVEA MOVER MATRIZ MOVEL MOVER A LA IZQUIERDA MULT MULTIPLICAR MVR MOVER RESTO NEXT SIGUIENTE OCCUR OBTENER UNA ESTRUCTURA DE

DATOS OPEN ABRIR UN ARCHIVO Orxx OPERACION LOGICA 'O' OTHER CASO CONTRARIO SELECCIONAR OUT GRABAR AREA DE DATOS PARM IDENTIFICAR PARAMETROS PLIST LISTA DE PARAMETROS POST ANOTAR READ LEER UN REGISTRO READC LEER EL SIGUIENTE REGISTRO

MODIFICADO READE LEER IGUAL CLAVE READP LEER REGISTRO ANTERIOR REDPE LEER IGUAL CLAVE ANTERIOR REL LIBERAR RESET RESTAURAR RETRN RETORNAR ROLBK RETROTRAER SCAN EXPLORAR UNA SERIE DE

CARACTERES SELEC COMIENZO DE SELECCION

Page 141: Rpg Tutorial

Lenguaje RPG400

©2002 Daniel Hugo Enríquez Leivas Buenos Aires - Argentina Reproducido con el permiso de su autor para Recursos As/400 -Barcelona - España.

http://www.recursos-as400.com

141

SETGT SITUAR EN MAYOR QUE SETLL SITUAR EN LIMITE INFERIOR SETOF DESACTIVAR INDICADOR SETON ACTIVAR INDICADOR SHTDN DETERMINAR CIERRE DEL SISTEMA SORTA CLASIFICACION DE MATRIZ SQRT RAIZ CUADRADA SUB RESTA SUBST SUBSERIE TAG ETIQUETA TESTB COMPROBACION DE BITS TESTN COMPROBACION NUMERICA TESTZ COMPROBACION DE ZONA TIME HORA UNLCK DESBLOQUEAR/LIBERAR AREA DE

DATOS / REGISTRO UPDAT ACTUALIZAR UN REGISTRO WHxx SELECCIONAR CUANDO SEA

VERDADERO WRITE GRABAR UN REGISTRO XFOOT SUMAR ELEMENTOS DE MATRIZ XLATE CONVERTIR CARACTERES Z-ADD ESTABLECER A CEROS Y SUMAR Z-SUB BORRAR A CERO Y RESTAR

BBUUEENNOOSS AAIIRREESS 440000