martes, 13 de noviembre de 2012

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.


lunes, 12 de noviembre de 2012

Nuestro primer fichero físico

¿Dónde se guardan los datos? En los ficheros físicos. Normalmente definiremos la estructura del fichero o DDS (Data Description Especification) la ubicaremos en el miembro QDDSSRC, mientras que el fichero físico estará compilado en la librería.

Pongamos como ejemplo un registro típico de empleado:

Para más información sobre las DDS en este enlace.

Las columnas que definen la DDS son:
Dec.
Tipo de Form.Tipo de nombreNombreRef.Long.Tipo de DatosPos.Funciones


En la primera línea encontramos la definición del nombre del fichero diferenciada por el tipo de nombre R, en nuestro caso EMPREC (empleado-registro).
En las última línea encontramos la definición de las claves por el tipo de nombre K, en nuestro caso solo tenemos una, que será el campo ENUM.
Entre el nombre de registro y las claves tendremos los campos del fichero.

En los campos tendremos:
A*****************************************************************
A* DESCRIPCIÓN: Estas son las DDS del archivo físico EMPREC. *
A* Contiene un formato de registro llamado EMPREC. *
A* Este archivo contiene un registro para cada *
A* de la empresa. *
A*****************************************************************
A*
AREMPREC
A ENUM 5 0 TEXT('NÚMERO DE EMPLEADO')
A ENAME 20 TEXT('NOMBRE DE EMPLEADO')
A ETYPE 1 TEXT('TIPO DE EMPLEADO')
A EDEPT 3 0 TEXT('DEPARTAMENTO DE EMPLEADO')
A ENHRS 3 1 TEXT('HRS SEMAN. NORMALES DE EMPLEADO')
AKENUM
  • Tipo de Form. : "A"
  • Tipo de nombre : vacío
  • Nombre : corresponde al nombre del campo
  • Ref.: vacío
  • Long. : Longitud del campo
  • Tipo de Datos : ver más adelante
  • Pos.Dec. : Posición/Decimales
  • Funciones : dependerá de la situación.

Tipos de datos: En esta columna se pueden determinar los siguientes tipos de datos
  • P - Decimal empaquetado
  • S – Decimal por zona
  • B – Binario
  • F – Punto flotante
  • A – Carácter
Para intrudir la DDS tan sencillo como ejecutar el SEU:
STRSEU SRCFILE(MYLIB/QDDSSRC) SCRMBR(Nombre_Fichero) TYPE(PF) TEXT('Registro empleado').
Como no nos cabe todo en una sola línea escribiremos STRSEU y pulsaremos F4, llenaremos los diferentes campos con los datos que deseamos:
 Inmediatamente disponemos del SEU para introducir la definición del fichero:




Para compilar el fichero físico tan solo ejecutaremos el comando:
CRTPF FILE(MYLIB/Nombre_Fichero) SRCFILE(MYLIB/QDDSSRC) SIZE(*NOMAX)

Ya tenemos nuestro primer fichero físico!!!!



viernes, 9 de noviembre de 2012

Las librerías en AS/400

Las librerías son el concepto básico en el que AS/400 estructura la información. En ellas podremos encontrar objetos de todo tipo, ficheros físicos, programas, pantallas, código fuente, etc. Dentro de las librerías encontraremos "miembros", estos son la única jerarquía que encontraremos a parte de las librerías, es decir, AS/400 no tiene estructura de árbol, en un primer nivel están las librerías y en un segundo nivel los miembros.
La biblioteca “QSYS” es la que contiene todas las descripciones de las bibliotecas del sistema. Generalmente cuando trabajemos con AS/400 tendremos una librería para un proyecto en concreto y dentro de ella dispondremos de diferentes miembros según los lenguajes a utilizar, así como la definición de los ficheros físicos y lógicos (donde irá la información). Es habitual usar el mismo nombre para definir los miembros de una librería, por ejemplo:
  • QDDSSRC: Fuente de los ficheros físicos y lógicos.
  • QRPGLESRC: Fuente para programas escritos en ILE RPG.
  • QCLSRC: Fuente para programas escritos en CLP.
  • QCSRC: Fuente para programas escritos en C.
  • QCPPSRC: Fuente para programas escritos en C++.
Si conectamos con nuestro AS/400 mediante el emulador de terminal de IBM podremos introducir mandatos para trabajar con nuestras librerías.
Figura 1: Cliente de Access de IBM a la espera de introducir mandatos.

En el apartado selección introduciremos la opción 5 (ejecutar mandato) y en el apartado mandato podremos introducir "EDTLIBL". Con este mandato visualizaremos las librerias en curso y podremos añadir o quitar las que deseemos.
Figura 2: Salida de la ejecución de EDTLIBL.

Crear nuestra primera librería es muy sencillo, usaremos el mandato CRTLIB LIB(MYLIBRARY) TYPE(*PROD) TEXT('My First Library').

Si escribimos CRTLIB y directamente pulsamos F4 nos permetirá introducir los campos por separado, obtendremos el mismo resultado:

Figura 3: Salida de pulsar F4 sobre el mandato CRTLIB.

Ya hemos creado nuestra primera librería.

AS/400 For dummies

¿Qué es AS/400?
Lo más fácil es leer lo que dice la wikipedia, ilustra ampliamente el concepto de AS/400 e iSeries de IBM y encontraremos la historia de la familia AS/400, es una lectura interesante para sentar bases.

A modo simplificado baste decir que se conoce como AS/400 a un sistema multiusuario que corre un sistema operativo OS/400, el cual está basado en un sistema de objetos y bibliotecas fuertemente integrados en la base de datos DB2/400.

El sistema operativo esta dotado de herramientas para la creación, compilación y depuración de objetos y librerías que serán integrados en la base de datos DB2, los cuales nos permitiran interactuar con la misma.

De forma sencilla podemos abstraer a las librerías como los contenedores de los datos del SGBD, mientras que los objetos serán código que nos permitirá interactuar con las librerías.

Aunque todos ellos estarán ubicados en librerías podemos decir que los ficheros físicos son los datos, los lógicos vistas de los datos, en cambio los objetos serían programas, pantallas, plantillas de impresión, etc.

El OS/400 permite trabajar con los lenguajes de programación RPG, CL, ILE-RPG, PHP, C y C++, Java, COBOL, SQL, BASIC y REXX. También se dispone de varias herramientas CASE, como ADP/400, Synon, AS/SET, Lansa, Delphi/400 for Windows y Delphi/400 for PHP o Visual RPG (el cual uso yo).

A una máquina AS/400 podemos acceder directamente mendiante un cliente de telnet o el Client Access de IBM. Si usamos la herramienta proporcionada por IBM a parte del emulador dispondremos de muchas otras herramientas útiles como el Operations Navigator, que nos facilitaran la transferencia de información entre host y cliente.
Figura 1: Captura de pantalla del emulador "Personal communications AS/400" incluido en el paquete Client Access de IBM.