Juli, Pupi, Pat y Pott
Imaginemos que en nuestro nuevo fichero físico tenemos los siguientes datos:
Figura 1: Listado del contenido de EMPREC.
Queremos listar la cantidad de horas del departamento 501.
Sencillamente lo que haremos será buscar si hay registros correspondientes al departamento 501 y posteriormente (en caso de que los haya) los sumaremos.
Primer problema que nos encontramos es no disponer de los registros ordenados por la clave del departamento, bueno, para todo problema puede haber una solución, crearemos una vista de los datos o lo que es lo mismo: un fichero lógico. eso nos permitirá hablar de ellos.
Para ello crearemos nuestro fichero lógico con la sentencia:
STRSEU SRCFILE(MYLIB/QDDSSRC) SCRMBR(Nombre_Fichero_Lócigo) TYPE(LF) TEXT('Vista particular').
Si EMPREC era el fichero físico el lógico lo bautizaremos como EMPRECL.
Figura 2: Creación de la vista particular de EMPREC llamada EMPRECL.
Editaremos el código y añadiremos las claves de ordenación:
Figura 3: Definición de la vistapara EMPRECL.
Para compilarlo utilizaremos la instrucción:
CRTLF FILE(MYLIB/EMPRECL) SRCFILE(MYLIB/QDDSSRC) SRCMBR(EMPRECL)
Nota: tengamos la precaución de tener en la lista de librerías MYLIB, para ello usar el comando EDTLIBL.
Crearemos nuestro primer fichero IL RPG con la instrucción:
STRSEU SRCFILE(MYLIB/QRPGLESRC) SRCMBR(EMPRPT) TYPE(RPGLE) OPTION(2)
Entraremos el siguiente código:
FEMPRECL IF E DISK RENAME(EMPREC:File)
D Res S 4B 0 INZ(0)
C *START SETLL EMPRECL
C READ File 71
C *IN71 DOWEQ *OFF
C IF EDEPT = 501
C ADD ENHRS Res
C ENDIF
C READ File 71
C ENDDO
* Fin de programa
C EVAL *INLR = '1'
La primera línea del código es la definición del fichero lógico EMPRECL, cabe destacar que hay que renombrarlo para más tarde poder utilizarlo, sino el compilador generará un error.
La segunda línea corresponde a una declaración de variable local binaria de 4 posiciones.
La siguiente estructura corresponde a una iteración entre los datos del programa en forma de bucle Do While.
A esta forma de programación se la llama ILE RPG en formato fijo.
Ahora en cambio observemos este listado:
FEMPRECL IF E DISK
D Res S 4B 0 INZ(0)
/FREE
setll *START EMPRECL;
read EMPRECL;
dow not %eof(EMPRECL);
if EDEPT = 501;
Res = Res + ENHRS;
endif;
read EMPRECL;
enddo;
// Fin de programa
*INLR = *on;
/END-FREE
Es el mismo programa pero con notación libre. A diferencia del anterior de formato fijo el libre el código encerrado entre las cláusulas /FREE y /END-FREE, eso sí, se ha de tener la precaución de finalizar cada linea con un ";".
En programación fija cada sentencia tiene una posición que ha de respetarse, para programadores que provienen de lenguajes como el C, C++, java, PHP y otros de alto nivel se hace muy costoso y difícil de comprender, además, heredado de anteriores versiones de RPG los programadores tienen la tendencia de usar del GOTO rompiendo las bases de la programación estructurada.
Ahora una tercera versión del mismo código:
D Res S 4B 0 INZ(0)
C/EXEC SQL
C+ SELECT SUM(ENHRS) INTO :Res
C+ FROM EMPRECL
C+ WHERE EDEPT=501
c/end-exec
// Fin de programa
C EVAL *INLR = '1'
¡Podemos usar sentencias SQL!
La forma de compilar este código es diferente, ejecutaremos:
CRTSQLRPGI OBJ(MYLIB/EMPRPT) SRCFILE(MYLIB/QRPGLESRC) COMMIT(*NONE)
Opcionalmente añadiremos la depuración de código fuente DBGVIEW(*SOURCE).
Podemos crear el fichero para ser editado con la instrucción:
STRSEU SRCFILE(MYLIB/QRPGLESRC) SRCMBR(Nombre_Fichero) TYPE(SQLRPGLE) OPTION(2)
Queda a elección del programador usar un tipo y otro, yo personalmente prefiero el formato libre, y si puedo añadir sentencias SQL... mejor que mejor.