COBOL VSAM Gabriel Alejandro Kordon B o r r a d o r material en preparación CODIFICACIÓN COBOL PARA ARCHIVOS VSAM y Cobol para archivos de longitud variable 1. INSTRUCCIONES DEL LENGUAJE COBOL PARA ARCHIVOS VSAM 1.1 Codificación de Las “select” en la ENVIRONMENT DIVISION: Cláusulas: organization, record key, alternate record key, FILE STATUS y password. 1.2 Access is DYNAMIC: • Instrucción delete • Ejemplos de codificación. 2. ARCHIVOS CON REGISTROS DE LONGITUD VARIABLE 2.1 Generalidades 2.2 Codificación COBOL. Definición de FD: ARCHIVO su descripción. 2.3 Codificación COBOL. Definición de registros 2.4 Clausula APPLY WRITE-ONLY. 1 / 20 COBOL VSAM Gabriel Alejandro Kordon 1. INTRODUCCIONES DEL LENGUAJE COBOL PARA ARCHIVOS VSAM Hay dos divisiones que tienen instrucciones especiales: LA ENVIRONMENT DIVISION y LA PROCEDURE DIVISION. 1.1ENVIRONMENT DIVISION En la ENVIRONMENT DIVISION encontramos algunas opciones nuevas basadas en el siguiente formato: SELECT nombre- archivo- interno ASSIGN TO nombre-archivo-externo ORGANIZATION IS INDEXED ACCESS MODE IS {SEQUENTIAL RANDOM DYNAMIC} RECORD KEY IS nombres- de- datos- 1 ALTERNATE RECORD KEY IS nombre- de- datos- 2 [WITH DUPLICATES] FILE STATUS IS nombre- de- datos- 3 PASSWORD IS nombre- de- datos- 4 2 / 20 COBOL VSAM Gabriel Alejandro Kordon La instrucción ORGANIZATION IS INDEXED explica que ese será un archivo KSDS (VSAM), un archivo secuencial con índice VSAM. Para archivos ESDS (archivos secuenciales bajo VSAM), no se codifica la cláusula ORGANIZATION, siendo obligatoria para un KSDS, ya que de omitirse asume “Organization is sequential”. Las opciones de acceso se indican con ACCESS MODE y al omitir ésta cláusula asume ACCESS MODE IS SEQUENTIAL. El modo de acceso para archivos secuenciales es siempre SEQUENTIAl. Para archivos de organización indexada, puede ser: • SEQUENTIAL • RANDOM • DYNAMIC El modo de acceso DYNAMIC será tratado mas adelante. RECORD KEY hace referencia a un nombre de dato que debe ser un campo dentro de la descripción del registro, la clave de ordenamiento del archivo. La opción ALTERNATE RECORD especifica la clave alternativa para el archivo. Cuando se emplean claves alternadas podemos tener acceso a registros con base en la clave principal, especificada en la cláusula RECORD KEY,o con base en otra ALTERNATE RECORD KEY. La mención de DUPLICATES es para que el valor asociado con la clave de registro alternativa pueda estar duplicado, en cualquiera de los registros del archivo. En ausencia de esta palabra, la presencia de valores de clave duplicadas es una condición de error. Los valores duplicados estarían permitidos solo para claves alternas, pues cada registro debe tener una clave principal única. 3 / 20 COBOL VSAM Gabriel Alejandro Kordon FILE STATUS Al utilizar archivos VSAM en un programa COBOL, tenemos la posibilidad de conocer como ha terminado una instrucción de entrada/ salida relacionada a estos archivos, pues el metodo de acceso VSAM devuelve al programa un código numérico de dos dígitos que indica como ha finalizado la sentencia INPUT/OUTPUT de COBOL. Este código se denomina FILE STATUS y puede ser consultado por el programa COBOL y condicionar la ejecución de determinadas rutinas según el valor indicado en dicho código. En la WORKING- STORAGE SECTION se define un campo elemental para cada archivo VSAM (generalmente con nivel 77) y es mencionado en la SELECT del archivo. Los errores más frecuentes a detectar con FILE STATUS son: 21 22 23 24 30 34 91 92 93 94 Error de secuencia. Clave duplicada. Registro no encontrado. Capacidad excedida- archivo ksds. Error de datos, de paridad o transmisión. Capacidad excedida- archivo Esds. Password erronea. Error lógico. Recurso no disponible. Requerimiento secuencial carente de pointer, falla en el 95 96 Start. información de archivo invalida o incompleta. falta tarjeta dd. 4 / 20 COBOL VSAM Gabriel Alejandro Kordon PASSWORD Los archivos VSAM pueden tener claves de protección, PASWORD, para ser accedidos. Las claves de protección son definidas para cada archivo con el comando DEFINE del AMS. Hay tres tipos de protección, que definen a la clave: - clave de lectura - clave de grabación - clave E/S o Maestra. En la WORKING- STORAGE SECTION se define un campo indicado en la select como PASSWORD IS ......... nombre de campo. Antes de ejecutar el OPEN del archivo protegido se pedirá al operador que ingrese la palabra clave y ésta se deberá alojar en el campo indicado en la select. Cuando se ejecuta la instrucción OPEN, se llama a la ejecución de las rutinas del AMS que controlarán si la clave de PASSWORD es la correcta. De no ser así, terminará la instrucción con FILE STATUS = 91. Estableciendo el programa que acción se deberá realizar. OTRAS de las ventajas del VSAM, es la utilización del acceso secuencial y por indice en forma simultánea (ACCESO DINAMICO) y la eliminación FÍSICA de registros (DELETE). 5 / 20 COBOL VSAM Gabriel Alejandro Kordon 1.2 ACCESO DINAMICO (DYNAMIC) EL ACCESS IS DYNAMIC permite acceder al archivo VSAM en forma “SEQUENTIAL” y “RANDOM” en un programa de aplicación en lenguaje COBOL. En la PROCEDURE DIVISION el siguientes verbos: OPEN proceso sequencial se hará a travez de los I-O WRITE REWRITE START DELETE CLOSE Y el READ con el siguiente formato: READ file- name NEXT RECORD [INTO record- name] AT END instrucción imperativa El formato del START es: START file- name [KEY IS EQUAL TO (=) GREATER THAN (>) NOT LEES THAN (NOT <)} [INVALID KEY instrucción- imperativa] 6 / 20 name] COBOL VSAM Gabriel Alejandro Kordon En el curso por medio de un índice, simultaneo al acceso secuencial, se utilizan los verbos: OPEN I-O READ WRITE REWRITE DELETE CLOSE La instrucción READ con el siguiente formato: READ file- name [INTO record- name] INVALID KEY RECORD instrucción imperativa 1.3 DELETE Instrucción del COBOL para eliminar físicamente registros de archivos VSAM, actualizando el FILE STATUS. DELETE file- name RECORD [INVALID KEY instrucción] Acceso secuencial: Necesita previamente un READ satisfactorio, BORRANDO lo que se acaba de leer. No corresponde utilizar la opción INVALID KEY. Acceso Random y Dynamic: EL BORRADO se produce sobre el registro identificado por la RECORD KEY, siendo válido el uso del INVALID KEY. 7 / 20 COBOL VSAM Gabriel Alejandro Kordon 1.4 EJEMPLOS DE CODIFICACIÓN . La figura 1 nos muestra la codificación de un archivo ESDS, la figura 2 y 3 la carga por programa de un ESDS y la figura 4 un ejemplo de actualización. La figura 5 muestra una codificación de un archivo KSDS, accedido dinamicamente, con una sola clave y utilizando las opciones FILE STATUS y PASWORD. La figura 6 tomo como base la codificación de la figura anterior para que sirva de ejemplo de acceso dinámico. El proceso secuencial o indexado de un archivo es similar a un archuvo secuencial o indexado tradicional (ISAM). 8 / 20 COBOL VSAM Gabriel Alejandro Kordon 9 / 20 COBOL VSAM Gabriel Alejandro Kordon 10 / 20 COBOL VSAM Gabriel Alejandro Kordon 11 / 20 COBOL VSAM Gabriel Alejandro Kordon ARCHIVOS CON REGISTROS DE LONGITUD VARIABLE La presentación de este tema está planteada para todo tipo de archivo que soporte registros de longitud VARIABLE, como sucede con los archivos VSAM. Para archivos VSAM el capitulo referido a la cláusula APPLY es innecesario, pues del uso óptimo del BUFFER se encarga el AMS, el método de acceso del VSAM. El tratamiento COBOL de archivos secuenciales (SAM) con registros variables es similar a los archivos VSAM. 2.1 GENERALIDADES Los registreos físicos (bloques) de longitud variable son precedidos por campos que contienen información de control. Los primeros cuatro (4) bytes de cada bloque contienen información de control que se divide en: LL: 2bytes que contienen la longitud del bloque (en CC hexa) incluyendo el campo CC. BB: 2 bytes recervados para uso del sistema. A su vez los primeros 4 bytes de cada registro lógico también contienen información de control, que se divide en: ll: 2 bytes que contienen la longitud del registro lógico, (en hexa) incluyendo el campo cc. cc bb: 2 bytes reservados para uso del sistema. 12 / 20 COBOL VSAM Gabriel Alejandro Kordon Gráficamente: Registro de longitud variable no bloqueado. 4 4 bytes LL bytes BB ll CC variable bb DATOS cc Registro de longitud variable bloqueado. LL BB ll bb DATOS 1 REGISTRO LOGICO 1 ll bb DATOS 2 REGISTRO LOGICO 2 ll bb DATOS 3 REGISTRO LOGICO 3 Los bytes de control son automáticamente suministrados cuando el archivo es grabado por primera vez y no son comunicados al programador cuando el archivo es leído. 2.2 CONSIDERACIONES EN LOS PROGRAMAS COBOL. 2.2.1 DEFINICIÓN DE FD. SENTENCIA FD: cláusulas afectadas {CHARACTERS BLOCK CONTAINS [integer- l TO] integer- 2 RECORDS} 13 / 20 COBOL VSAM Gabriel Alejandro Kordon • Cuando se utiliza con la opción RECORD el compilador agrega 4 bytes (para el cc) a la longitud del registro lógico y 4 bytes (para el cc) a la longitud del bloque. • Cuando se utiliza con la opción CHARACTERS, el programador debe sumar 4 bytes (para el cc) a la longitud del registro lógico y 4 bytes (para el cc) a la longitud del bloque. Esta cláusula es opcional. Si se omite se asume que los registros no estan bloqueados. RECORDS CONTAINS • integer- 1 TO integer- 2 CHARACTERS Integer- 1 indica el número de caracteres en el registro más pequeño y integer- 2 el número de caracteres en el más largo. Esta cláusula es opcional. Si se omite, la longitud de registro es determinada por el compilador desde la descripción del mismo. Cuando una o más de las entradas de descripción de datos dentro de un registro tiene una cláusula OCCURS con la opción DEPENDING ON, el compilador utiliza el máximo valor de la variable para calcular la longitud del registro. RECORDING MODE IS ( mode = V, o mode = F ) • Los registros pueden ser de longitud fija o variable. • Cada registro lógico debe estar contenido íntegramente en un bloque. • Un bloque puede contener 1 o más registros lógicos. • Cada registro lógico incluye un campo de longitud de registro en (cc), y cada bloque incluye un campo de descripción de bloque (CC). Estos campos no son descriptos en la Data División y no están disponibles para el usuario. 14 / 20 COBOL VSAM Gabriel Alejandro Kordon Esta cláusula es opcional. Si se omite el compilador determina que RECORDING MODE IS V si se trata de un archivo secuencial standard, siempre y cuando el registro tenga una estructura variable (si la estructura del registro es fija, asume F, sin codificar Recording Mode). También asume V o F, de acuerdo a lo indicado n la clausula RECORD CONTAINS (En este caso, que Record Contains especifica registros de longitud variable, la longitud del máximo registro lógico es menor o igual que un bloque. 2.3. CONSIDERACIONES EN LOS PROGRAMAS COBOL. DEFINICIÓN DE REGISTROS. Un registro de longitud variable puede definirse : • Utilizando varios niveles 01 a continuación de la FD, describiendo en cada uno los distintos tipos de registros. • Utilizando un único nivel 01 y dividiendo al registro lógico en 2 partes. - Parte fija: contiene la información común a todos los registros (que está presente en todos) y contiene también uno o más contadores de ocurrencias de la/s parte/s variable/s. - Parte variable: contiene la información variable, que puede o no existir. Se define como una o más entradas con la cláusula OCCURS con la opción DEPENDING ON, y la cantidad de ocurrencias dependerá del contador correspondiente en la parte fija. contador de ocurrencias parte variable DATOS “12” PARTE FIJA PARTE VARIABLE 15 / 20 COBOL VSAM Gabriel Alejandro Kordon 01 REGISTRO- VARIABLE. 05 PARTE- FIJA. 10 DATOS PIC X(5). 10 CONT PIC S99 COMP- 3. 05 PARTE VARIABLE OCCURS 0 TO 99 TIMES DEPENDING ON CONT PIC XX. EJEMPLOS 1. Archivo secuencial, registros de longitud variable no bloqueados. FD FICHVARL RECORDING MODE IS V BLOCK CONTAINS O RECORDS DATA RECORD IS REGVARL LABEL RECORDS ARE STANDARD. 01 REGISTRO-ASISTENCIA. 05 FECHA PIC 9 (6). 05 AUSENTES PIC S999 COMP SYNC. 05 PRESENTES PIC S999 COMP SYNC. 05 TARDE PIC S999 COMP SYNC. 05 NOMBRE- AUS OCCURS 0 TO 500 TIMES DEPENDING ON AUSENTES PIC A (20). 05 NOMBRE- PRES OCCURS 0 TO 500 TIMES DEPENDING ON PRESENTES PIC A (20). 05 NOMBRE- TAR OCCURS 0 TO 500 TIMES DEPENDING ON TARDE PIC A (20). 16 / 20 COBOL VSAM Gabriel Alejandro Kordon 2. Archivo secuencial, registros de longitud variable, no bloqueado. Supongamos que en una escuela con 500 alumnos inscriptos se desea tener un registro por día con la siguiente información: fecha, apellido de todos los alumnos ausentes, apellido de todos los alumnos presentes, apellido de todos los alumnos que han llegado tarde. La descripción del registro podría ser: 01 REGVARL 05 CAMPO- A PIC X (20). 05 CAMPO- B PIC 99. 05 CAMPO- C OCCURS 1 TO 10 TIMES DEPENDING ON CAMPO- B PIC 9 (5). Si se omite la cláusula RECORDING MODE IS V, el compilador asumirá V ya que el registro asociado con FICHVARL varía en longitud dependiendo de los valores de CAMPO- B. La cláusula BLOCK CONTAINS nunca es requerida. Si se omite, el compilador asume no bloqueado. La cláusula RECORD CONTAINS nunca es requerida. El compilador determina la longitud de los registros desde la descripción de los mismos. (ver consideraciones sentencia FD). - Asumiendo que CAMPO- B contiene el valor 02 para el primer registro de un ARCHIVO y el valor 03 para el segundo, los primeros dos registros aparecerán en dispositivos de memoria externa y en áreas buffer de memoria como se muestra en el gráfico. Ejemplo, de Archivo secuencial, con registro de longitud variable, bloqueado con espacio para 3 registros de longitud máxima por bloque. La siguiente FD podría usarse al crear el archivo. 17 / 20 COBOL VSAM Gabriel Alejandro Kordon FD FICHVAR2 RECORDING MODE IS V BLOCK CONTAINS 3 RECORDS RECORD CONTAINS 20 TO 100 CHARACTERS DATA RECORDS ARE REGVARL, REGVAR2 LABEL RECORDS ARE STANDARD. 01 REGVARL. 05 CAMPO- A PIC X (20). 05 CAMPO- B PIC X (80). CAMPO- X PIC X (20). 01 REGVAR2. 05 4. CLAUSULA APPLY WRITE- ONLY Esta cláusula es usada para hacer un uso óptimo del buffer y del espacio de memoria externa cuando se crea un archivo secuencial con registros bloqueados de longitud variable. El uso de esta cláusula hace que el buffer (en el cual se arma el bloque o registro físico a ser grabado) sea truncado solamente cuando el próximo registro lógico a grabar no entre en él. Restricciones y normas de uso • La cláusula APPLY WRITE- ONLY debe codificarse en la I- O- CONTROL de la INPUTOUTPUT SECTION. Formato: APPLY WRITE- ONLY ON nombre Arch. 1 nombre Arch. 2 … 18 / 20 COBOL VSAM Gabriel Alejandro Kordon • El ARCHIVO afectado puede ser abierto solo como OUTPUT. • Toda sentencia WRITE asociada con el ARCHIVO debe usar la opción: WRITE record- name FROM identifier. • Por lo anterior, es necesario armar el registro en la WORKING- STORAGE SECTION y luego grabarlo. • En la FILE SECTION se codificará la FD y el nivel 01 para la descripción del registro. La forma de definirlo será: Nivel 01 - Nombre del registro. Nivel 05 FILLER contador de ocurrencias). parte fija (incluida longitud del Nivel 05 – Parte variable definida en cláusula OCCURS DEPENDING ON xx. Donde xx es el contador de ocurrencias de partes variables del registro definido en la WORKING- STORAGE SECTION. Ejemplo: Generación de un Archivo secuencial, no bloqueado, con registros de longitud variable (FICHVAR). • En la i- o CONTROL: APPLY WRITE- ONLY ON FICHVAR. • En la FILE SECTION: FD FICHVAR RECORDING MODE IS V RECORD CONTAINS 10 TO 55 CHARACTERS DATA RECORD IS REGVAR LABEL RECORDS ARE STANDARD. 19 / 20 COBOL VSAM Gabriel Alejandro Kordon 01 REGVAR. 05 FILLER PIC X (10). 05 VARIABLE OCCURS 0 TO 15 TIMES DEPENDING ON OCU PIC XXX. • En la WORKING- STORAGE SECTION 01 REGVAR- FROM 03 03 FIJO. 05 CAMPO 1 PIC X (8). 05 OCU PIC S99 COMP SYNC. VARI OCCURS 0 TO 15 TIMES DEPENDING ON OCU. • 05 CAMPO2 PIC XX. 05 CAMPO3 PIC X. En la PROCEDURE DIVISION. OPEN OUTPUT FICHVAR. Armado del registro de output en REGVAR- FROM WRITE REGVAR FROM REGVAR- FROM INVALID KEY…………. 20 / 20