Areas de datos: Qué son y cómo usarlas en programas CL
Aprenda qué son las áreas de datos (Data Areas) en AS400 - iSeries, los comandos relacionados con su uso, y un ejemplo de programas CL que se comunican mediante la Local Data Area (*LDA), para conocer su comportamiento.
Un Area de Datos (Data Area) está representada en el AS400 - iSeries por un objeto de tipo *DTAARA que puede ser creado en cualquier biblioteca de QSYS, y permite almacenar datos que luego pueden ser accedidos por cualquier job que esté corriendo en el sistema.
Podría asimilarse un área de datos a un archivo físico de datos con un único registro que contiene información de tamaño limitado, que puede ser modificada, pero pueden ser utilizadas independientemente de la existencia de cualquier procedimiento, programas o archivos dentro del sistema. Si bien un área de datos tiene que estar creada antes que cualquier aplicación la pueda utilizar, no es necesario "declararla" dentro de la misma, y los valores almacenados pueden ser recuperados (leidos) desde cualquier programa CL, RPG o COBOL.
También hay que considerar que un usuario podrá acceder a un objeto de tipo *DTAARA siempre y cuando cuente con los permisos apropiados, similarmente a lo que ocurre cuando se accede a cualquier objeto dentro del AS400.
Utilizar áreas de datos en AS400 puede ser conveniente para propósitos diferentes. Por ejemplo:
- pasar información entre aplicaciones que estén corriendo en el mismo job o en jobs diferentes, proveyendo un área común donde almacenar datos que pueden ser recuperados desde otro programa o aplicación.
- proveer un campo que permita cambiar de manera fácil y frecuente, referencias de control dentro de un job, como por ejemplo, el próximo número de factura a ser asignado o el siguiente número de comprobación.
- proveer un campo constante que pueda ser usado por distintos trabajos en el sistema, como tasas impositivas o listas de distribución.
Comandos que operan con Areas de Datos
Creación de un área de datos - Comando CRTDTAARA
Para que un Area de datos pueda ser utilizada por los diferentes programas que se ejecutan en el AS400, ya sea aplicaciones que corren en el mismo trabajo o en trabajos diferentes, es necesario crear el objeto que la represente mediante la ejecución del comando CRTDTAARA (Create Data Area - Crear área de datos).
Como sucede con cualquier objeto creado en AS400, el comando CRTDTAARA requiere el nombre del área de datos a crear y el nombre de la biblioteca en donde será creada.
Además, cuando se crea un área de datos es necesario indicar qué tipo de valor contendrá el área de datos que se está creando (parámetro TYPE en el comando CRTDTAARA). El tipo puede ser un valor de tipo carácter, un valor decimal o un valor lógico (1 ó 0), o bien puede crearse un área de datos DDM (gestión de datos distribuidos). Si no se especifica la longitud, se determina por default para cada tipo: *CHAR, longitud default 32 caracteres, y tiene un máximo de 2000 caracteres. Para el tipo *DEC: longitud por default 15 dígitos y un máximo de 24. Es posible también crear un área de datos conteniendo un valor inicial, que podrá ser cambiado con posterioridad.
Ejemplo:
CRTDTAARA DTAARA(TEKTCL/AREAPRU) TYPE(*CHAR) LEN(100) VALUE('POSITIVO')
La sentencia indicada creará un área de datos de nombre AREAPRU en la biblioteca TEKTCL, de tipo caracter, de longitud 100 y con valor inicial 'POSITIVO'.
Una vez creada el área de datos, es posible cambiar el área de datos modificando el valor inicial si estuviese especificado o agregando un nuevo valor en determinadas posiciones del total de caracteres disponibles para almacenamiento, especificado en el momento de su creación. También, un programa puede leer (recuperar) el valor almacenado en posiciones específicas del área de datos y almacenarlo en una variable definida en el programa para su uso dentro del mismo. Además, se puede visualizar el o los valores almacenados en esa área de datos. Asimismo, con los permisos adecuados, es posible suprimir de una biblioteca un objeto de tipo *DTAARA.
Cambio del contenido de un área de datos - Comando CHGDTAARA
El comando CHGDTAARA (Change Data Area) permite cambiar todo o parte del valor especificado dentro del área de datos, pero no cambia ningún otro atributo del objeto *DTAARA. El nuevo valor puede ser una constante o una variable CL. El nuevo valor debe ser del mismo tipo y tener una longitud menor o igual a la longitud del area de datos o a la longitud del substring especificado.
Si el comando se ejecuta dentro de un programa o procedimiento CL, no es necesario que ya exista el área de datos en el momento en que se crea el programa.
Ejemplo:
GHGDTAARA DTAARA(TEKTCL/AREAPRU (10 20)) VALUE(DICIEMBRE)
La ejecución del comando anterior hará que el área de datos AREAPRU de la biblioteca TEKTCL contenga a partir de la posición 10 con longitud 10 (10 20) un nuevo valor: 'DICIEMBRE'. En la posición 1 hasta la 10 sigue teniendo el valor que se le dio inicialmente (POSITIVO) en el momento de crearla.
Visualización (mostrar contenido) de un área de datos - Comando DSPDTAARA
Es posible visualizar el valor que un área de datos tiene en determinado momento mediante el comando DSPDTAARA (Display data Area). También, con la ejecución de este comando se visualizan los atributos del área de datos (nombre, biblioteca, tipo, longitud y texto descriptivo). La salida del comando puede obtenerse por pantalla o dirigida a un archivo en spool.
Ejemplo: Al ejecutar el comando DSPDTAARA DTAARA(TEKTCL/AREAPRU)
Se mostrará la siguiente pantalla:
Notar que como el área de datos fue definida de longitud 100, el despliegue de los datos se realiza en "dos filas" (Desplaz. 0 y 50) de longitud 50. Los valores que cambiaron ven afectadas las primeras posiciones, por ese motivo se visualizan los datos en la "primera fila" (Desplaz. 0)
Recuperación del contenido de un área de datos - Comando RTVDTAARA
El comando RTVDTAARA (Retrive Data Area) tiene que ser ejecutado dentro de un programa CL y recupera todo o parte del contenido de un área de datos especificada y lo asigna a una variable CL.
El área de datos no necesita estar creada en el momento de la compilación y la variable CL no necesita tener el mismo nombre que el área de datos.
Tener en cuenta que este comando recupera los datos, pero NO altera los contenidos del área de datos especificada.
Ejemplo:
Suponer que se ejecutó un comando CRTDTAARA para crear el área de datos AREAPRU en la biblioteca TEKTCL, de tipo *CHAR con longitud 5 y con valor inicial 'MARZO' y que dentro del programa donde se usa el comando RTVDTAARA existe una declaración de variable para &VAR1 como DCL VAR(&VAR1) TYPE(*CHAR) LEN(5):
Entonces, al ejecutar el programa donde la sentencia RTVDTAARA DTAARA(TEKTCL/AREAPRU) RTNVAR(&VAR1) está incluida, el resultado será que en la variable &VAR1 estará copiado el string 'MARZO'. En este caso recupera todo el contenido del área de datos en la variable indicada para su posterior utilización de ese valor dentro del programa.
Supresión de un área de datos - Comando DLTDTAARA
El comando DLTDTAARA (Delete Data Area) suprime una o más áreas de datos especificadas por nombre genérico de una biblioteca indicada.
Ejemplo:
DLTDTAARA DTAARA(TEKTCL/AREA*)
Luego de la ejecución del comando anterior, ya no existirán los objetos *DTAARA que comienzan con AREA en la biblioteca TEKTCL.
Trabajar con Areas de datos - Comando WRKDTAARA
El comando WRKDTAARA (Work with Data Areas) permite mostrar una lista de áreas de datos de una o más bibliotecas. Se puede especificar una área de datos con la que trabajar, un valor genérico o *ALL, pero sólo se mostrarán las áreas de datos en las que el usuario que ejecuta el comando posee autorización. Además, sólo se buscará en las bibliotecas sobre las que tenga autorización de uso (*USE).
Ejemplo:
WRKDTAARA DTAARA(TEKTCL/AREA*)
La ejecución de la sentencia anterior devolverá una lista de áreas de datos que comiencen con AREA y que se encuentren en la biblioteca TEKTCL.
Qué es la Local Data Area (*LDA)
En el sistema AS400 existe la posibilidad de trabajar con un área de datos que no es un objeto: la "Local Data Area" (*LDA), que merece una mención aparte.
La Local Data Area (Area de Datos Local), denominada también *LDA, es un atributo del trabajo, es decir, cada trabajo que arranca (no importa su tipo, puede ser interactivo, batch, transcriptor, o de cualquier otro tipo) tiene asociada su propia *LDA. Por lo tanto la *LDA es un área de datos privada a ese job (no puede hacerse referencia a ésta *LDA desde otro job), es decir que "nace" y "muere" con ese job, pero NO es un objeto que se pueda crear, por lo tanto no existe un objeto con ese nombre en ninguna biblioteca.
Al ser un "atributo" del trabajo, es interesante resaltar que cualquier job interactivo tiene esta área disponible para almacenamiento en TODO momento, cuyo contenido es "visible" por todos los programas que se ejecuten dentro del mismo job, hasta que ese job finalice. Se puede utilizar la *LDA como método para el pasaje de parámetros entre programas del mismo job sin la necesidad de especificar una lista de parámetros.
La *LDA es de tipo *CHAR y tiene como longitud máxima 1024 caracteres, e inicialmente contiene "blancos". Sin embargo, se puede agregar o modificar su contenido como con cualquier área de datos de caracteres creada como objeto (como se describió en párrafos anteriores), sólo que tiene un espacio de almacenamiento limitado a 1024 caracteres y no a 2000.
Cuando se "somete" un trabajo con el comando SBMJOB, se realiza una copia del valor que en ese momento tuviera la *LDA del trabajo que lo somete a la *LDA del trabajo batch sometido.
A excepción de los comandos CRTDTAARA y DLTDTAARA (que operan sobre los objetos *DTAARA), los restantes comandos que ya fueron tratados en este tip y que están relacionados con áreas de datos son aplicables también al área de datos local (*LDA) del trabajo con el que se está operando.
Si se desea trabajar con la *LDA, en vez de especificar el nombre de un área de datos se debe indicar *LDA en la palabra clave DTAARA de los comandos CHGDTAARA, DSPDTAARA y RTVDTAARA, comandos donde es posible referirse a la Local Data Area. También es posible especificar *LDA en la función substring del lenguaje CL %SST.
Consideraciones
Además de las áreas de datos tratadas en este tip, existen otros tipos de áreas de datos en las que no entraremos en detalle: *GDA (Group data area) que el sistema crea cuando un trabajo interactivo "se convierte en un trabajo de grupo", Remote data areas (*DDM), que especifican áreas de datos sobre un sistema remoto, usando DDM (Data Distribuited Management) o *PDA (que especifica el área de datos del parámetro de inicialización del programa. Este valor sólo es válido si es un trabajo de prearranque.
Ejemplo de una comunicación entre dos programas CL operando con *LDA
Presentaremos dos programas CL simples que "se comunican" operando con la *LDA.
El primer programa CL recupera la fecha actual del sistema (RTVSYSVAL) en una variable (para saber por ejemplo cuándo ese programa fue ejecutado por última vez) y su valor es almacenado en la *LDA.
El segundo programa CL recupera de la *LDA (RTVDTAARA) el valor dejado por el primer programa y muestra el contenido por pantalla. Los dos programas DEBEN operar en el mismo job para que esta comunicación pueda establecerse. Ejecutar el programa 1 y luego el segundo para obtener la salida esperada.
Código del primer programa: PGMTIP1
Donde:
1) El comando RTVSYSVAL recupera la fecha en una variable &FECHA
2) El comando CHGDTAARA cambia la *LDA a partir de la posición 51 con longitud 6 (la longitud asociada a variable que almacena la fecha)
Código del segundo programa: PGMTIP2
Donde:
3) el comando RTVDTAARA recupera la fecha dejada por el primer programa y la asigna a una variable &FECHAREC
4) el comando CGHDTAARA almacena en la misma Local Data Area, pero a partir de la posición 101 la fecha recuperada en 3) precedida por un texto.
5) el comando DSPDTAARA visualiza el resultado
6) Finalmente, el comando CHGDTAARA "blanquea" el area de datos local.
Tener en cuenta que para obtener la salida que se muestra a continuación, es necesario ejecutar los dos programas en secuencia dentro del mismo job (recordar que *LDA es un atributo del trabajo).
La fecha visualizada a partir de la posición 51 de *LDA es el resultado de la ejecución del Programa 1. Lo ubicado a partir de la posición 101, es el resultado de la ejecución del programa 2.
Es importante considerar que si se hubiera operado con objetos *DTAARA (y no con *LDA como en los ejemplos), si el primer programa cambia el área de datos, ese valor permanece más allá del job que realiza la acción, por lo tanto hubiera podido ser leída desde otro programa corriendo en OTRO job.
Para tener en cuenta ...
- Para usar el comando CHGDTAARA, el usuario debe tener autoridad *CHANGE para el área de datos que está siendo cambiada, y *EXECUTE sobre la biblioteca en la cual está almacenada.
- Para usar el comando DSPDTAARA y RTVDTAARA, el usuario debe tener autoridad *USE para el área de datos que quiere visualizar y *EXECUTE para la bilbioteca.
- Para usar el comando DLTDTAARA, el usuario debe tener la autoridad *OBJEXIST para el área de datos que desea suprimir, y *EXECUTE sobre la biblioteca que contiene el área de datos a suprimir.
- Un área de datos puede ser bloqueada para un único usuario previniendo de esta manera que otros usuarios puedan procesar un cambio al mismo tiempo (cusando el comando ALCOBJ). Las áreas de datos de tipo *LDA no pueden ser bloqueadas (no son objetos).
- En la programación RPG, se recupera (se lee) el área de datos con la instrucción "IN" y se la actualiza con la instrucción "OUT".
- Especialista AS400
- Supervisor editorial Teknodatips
Copyright 2012 Teknoda S.A.
IMPORTANTE:
“Notas técnicas de AS/400 - IBM i" se envía con frecuencia variable y sin cargo como servicio a nuestros clientes IBM i - AS/400. Contiene notas/tutoriales/artículos técnicos desarrollados en forma totalmente objetiva e independiente. NS iTech - Teknoda es una organización de servicios de tecnología informática y NO comercializa hardware, software ni otros productos.
Si desea suscribir otra dirección de e-mail para que comience a recibir las Notas Técnicas AS400 - IBM i, envíe un mensaje desde esa dirección a info@nsitech.com.ar o a letter400@nsitech.com.ar, aclarando nombre, empresa, cargo y país del suscriptor.
AS400 , iSeries, System i, IBM Power Systems, IBM i son marcas registradas de IBM. IBM no es el editor de esta publicación y no es responsable de la misma en ningún aspecto. La información contenida en esta publicación ha sido generada por nuestros especialistas a partir de fuentes consideradas confiables y del ejercicio profesional cotidiano. No obstante, por la posibilidad de error humano, mecánico, cambio de versión u otro, NS iTech - Teknoda no garantiza la exactitud o completud de la misma.
COPYRIGHT NS iTech - TEKNODA S.A. PROHIBIDA SU REPRODUCCION TOTAL O PARCIAL SIN CONSENTIMIENTO DE NS iTech - TEKNODA