Manual de Cobol

Share Embed Donate


Short Description

Download Manual de Cobol...

Description

Manual Básico COBOL.txt

CCCCCCCC CCCCCCCC CC CC CCCCCCCC CCCCCCCC

OOOOOOO OOOOOOOOO OO OO OO OO OOOOOOOOO OOOOOOO

BBBBBBB BBBBBBBB BB BB BBBBBBBB BB BB BBBBBBBB

OOOOOOO OOOOOOOOO OO OO OO OO OOOOOOOOO OOOOOOO

LL LL LL LL LLLLLLLL LLLLLLLLL

I

INDICE

ANOTACIONES SOBRE ASPECTOS RELEVANTES DEL COBOL II. Cambios en el lenguaje cobol en 1.985 .................... Formatos de programa fuente ..............................

1 1

PROGRAMA ANIDADO. Programa anidado .........................................

1

CAMBIOS EN LA IDENTIFICATION DIVISION. Cambios en la Identification Division ....................

1

CAMBIOS EN LA DATA DIVISION. Comparticion de datos .................................... Nuevas clausulas en la definicion de items .......... Niveles de tablas ...................................

Página 1

2 2 3

Manual Básico COBOL.txt CAMBIOS EN LA PROCEDURE DIVISION. Operaciones de condicion ................................. Otras condiciones ........................................ Terminadores explicitos de sentencias .................... Llamada a subprogramas ................................... LLamadas estaticas ....................................... LLamadas dinamicas ....................................... Sentencia cancel ......................................... Sentencia evaluate ....................................... Consideraciones sobre la evaluate ........................ Ejemplos de evaluate ................................ Sentencia initialize ..................................... Nueva opciones de la perform ............................. Aspectos adicionales ..................................... Depuracion con cobol II .................................. Interactivamente .................................... Batch ............................................... Compilacion ......................................... Compilaciones con programas secundarios .................. Llamada entre programas cobol II ......................... Transfiriendo control a otros programas .................. Programa principal y subprogramas ........................

3 4 4 4 5 5 5 6 6 7 8 9 10 11 11 11 12 12 12 13 13

II

LLAMANDO PROGRAMAS. Llamando programas ....................................... Programas anidados ....................................... Estructura de programas anidados ......................... Ejemplo .................................................. Normas para el uso de estructura de programas anidados ... Llamando a programas anidados ............................ Ejemplo ..................................................

15 16 16 17 18 18 19

CALL ESTATICAS Y DINAMICAS. Call estaticas y dinamicas ............................... Utilizando call estatica ................................. Utilizando call dinamica ................................. Compartiendo datos usando el atributo external ........... Pasando datos mediante by refence or by content .......... Describiendo items comunes en el programa llamante ....... Describiendo datos comunes en el programa llamado ........ Linkage section ..........................................

20 20 20 22 22 23 24 24

INSTRUCCIONES DE PROGRAMAS COBOL. Instruccion inspect ...................................... 25 Instruccion initialize ................................... 25

INSTRUCCIONES DE TABLAS. Instruccion Instruccion Instruccion Instruccion

evaluate ..................................... string ....................................... unstring ..................................... read .........................................

26 28 28 29

File section ............................................. Procedure division ....................................... Release .................................................. Return ................................................... Sort-Return .............................................. Clausula occurs ..........................................

29 30 31 32 32 32

COBOL II, SORT.

Página 2

Manual Básico COBOL.txt

TABLAS. Tablas ................................................... Tablas de longitud variable .............................. Descripcion de una tabla ................................. Tablas de mas de una dimension ........................... Tablas de mas de una dimension ........................... Indexacion ............................................... Declaracion 'SET' ........................................ Declaracion 'SEARCH' .....................................

35 36 36 37 37 38 38 39

III

Opcion 'VARYING' ......................................... Tablas definidas con mas de un indice .................... Busqueda binaria ......................................... Declaracion 'SEARCH ALL' ................................. Busqueda dicotomica ...................................... Literales ................................................ Ficheros ESDS ............................................

41 41 42 43 45 46 46

PASAR DATOS EN CICS A COBOL II. Pasar datos en cics a cobol II ........................... Instruccion set .......................................... Pointer .................................................. Ejemplos .................................................

EJEMPLOS

DE

47 47 47 48

RUTINAS.

Rutina general de conversion de fechas ................... Rutina de conversion de bits a bytes ..................... Rutina general de verificacion de digitos ................ Rutinas de calculos ...................................... Numero de dias entre dos fechas ..................... Numero de meses entre dos fechas .................... Restar un periodo a una fecha .......................

49 51 53 55 55 56 57

1

ANOTACIONES SOBRE ASPECTOS RELEVANTES DEL COBOL II ======================================================= WLM.-IBM

CAMBIOS EN EL LENGUAJE COBOL EN 1.985 =========================================== Las tres revisiones mas importantes de lenguaje COBOL, publicadas por el subcomite "COBOL ANS" conocido como X3.23 fueron : en 1.968, en 1.974 y en 1.985.

FORMATO DE PROGRAMA FUENTE ============================= ID DIVISION. ---ENVIROMMENT DIVISION. Página 3

Manual Básico COBOL.txt ---DATA DIVISION. ---PROCEDURE DIVISION. ---END PROGRAM Nom-prog.

------> (identico

al

de

PROGRAM-ID.)

--------------------¦ PROGRAMA ANIDADO ¦ --------------------* Una secuencia de programas pueden ser tambien entrada

COBOL separados del compilador.

(INITIAL)

CAMBIOS EN LA IDENTIFICATION DIVISION ========================================= ¦ ID DIVISION. Nom-Prog is ¦ ¦

COMMON PROGRAM INITIAL PROGRAM

¦ ¦ ¦

* Un programa fuente puede contener a otros y estos referenciar alguno de los recursos de los programas dentro de los cuales estan contenidos. * Se dice que tenido en otro en el "A" que

un programa "B" esta directamente con"A", sino hay otro programa contenido tambien contenga al "B".

2

* Se dice que un programa "B" esta indirectamente contenido en el "A", si existe un programa contenido en el "A" que a su vez contiene el "B". --> COMMON B : es de

un programa ser llamado

contenido en otro y tambien por otros.

pue-

--> INITIAL B: cuando este programa es llamado, el y todos los que contiene se ponen en estado inicial. Estas opciones implican el introducir en los programas COBOL la funcion de recursividad, conjuntamente con la declaracion "CANCEL" que se comentara mas adelante.

CAMBIOS EN LA DATA DIVISION ===============================

COMPARTICION DE DATOS ----------------------*

Los datos contenidos en un referenciados por cualquier descritos.

*

Si un programa esta contenido dentro de otro, ambos pueden referenciar los datos que tengan el atributo "GLOBAL".

1) NUEVAS

CLAUSULAS

EN

LA

"EXTERNAL" pueden ser programa que los tenga

DEFINICION

DE

--> GLOBAL B Página 4

ITEMS.

Manual Básico COBOL.txt El dato esta disponible para dentro del que lo declara. atributo

de

nivel

todo

programa

contenido

01.

--> EXTERNAL B La da ma

memoria asociada con el ITEM de datos, esta asociacon la unidad de ejecucion mas que con el prograen particular dentro de la unidad de ejecucion.

Este ITEM dentro de No

puede ser la unidad

implica

que

es

referenciado por de ejecucion. global

y

es

un

cualquier

atributo

programa

de nivel 01.

--> POINTER B

3

esta clausula define un ITEM de datos "PUNTERO" vel elemental, no numerico y de 4 bytes.

de

puede usarse en operaciones a otros ITEMS "PUNTEROS".

en

"MOVE"

o

cabecera

Tambien -

comparacion

o

en : sentencia SET. En una condicion de relacion. En la "USING" de una "CALL", "ENTRY" de "PROCEDURE DIVISION".

2) NIVELES

DE

TABLAS.

tener

hasta

* pueden

siete

* por tanto podra haber clausulas OCCURS. * Un

de

ni-

ITEM

podra

niveles, dimensiones.

hasta

referenciarse

siete

anidamientos

subscrito

o

de

indexado por 7.

* en las tablas de longitud variable (DEPENDING minimo numero de ocurrencias podra ser cero.

ON)

el

CAMBIOS EN LA PROCEDURE DIVISION ====================================

1) OPERACIONES

DE

CONDICION.

¦IDENTIFICADOR-1 IS [ NOT ] ALPHABETIC-LOWER ¦ ¦ ALPHABETIC-UPPER

¦IDENTIF-1 ¦ ¦

uso de nombres

la de

IS

[ NOT ]

¦ ¦ ¦

GREATER THAN OR EQUAL TO ( >= ) ¦ ¦ LESS THAN OR EQUAL TO ( en tiempo de compilacion se puede espacificar la opcion DYNAM (llamadas dinamicas) o NODYNAM (llamadas estaticas)

LLAMADAS ESTATICAS ------------------el programa principal y el subprograma forman parte del mismo modulo, por tanto cuando el control se pasa al programa llamado este ya esta en memoria, por lo que las siguientes llamadas al subprograma lo encontraran en el ultimo estado. (excepto cuando el programa llamado tiene el atributo "INITIAL")

LLAMADAS DINAMICAS ------------------el programa llamado es un modulo independiente y solo se carga en memoria cuando es llamado. Las llamadas sucesivas lo encontraran en el ultimo estado.

SENTENCIA CANCEL =================

¦CANCEL IDENTIFI-1 / LITERAL

¦

se cancela un programa llamado, de tal forma que proxima llamada lo pondra en su estado inicial. *** los subprogramas PROGRAM

han

de

*** los efectos siempre gramas anidados

son

*** todo

la

terminar

ello

fortalece

con

GOBACK

jerarquicos, en

recursividad

la

en

o

caso

el

EXIT

de

pro-

COBOL

6

SENTENCIA EVALUATE ===================

¦EVALUATE ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦

IDENTIFIC-1 LITERAL EXPRESION TRUE FALSE

ALSO ...... (VARIOS) LAS MISMAS EXPRESIONES

Página 7

¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦

Manual Básico COBOL.txt ¦WHEN FRASE-1 ¦ ¦ ALSO FRASE-2 .....(VARIAS) ¦ ¦ SENTENCIA IMPERATIVA ¦ ¦ ¦[ WHEN OTHER SENTENCIA IMPERATIVA ]

--> FRASE-1

puede

ser : ANY CONDICION-1 TRUE FALSE NOT IDENTIFI-1 LITERAL EXPR.ARIT.

--> FRASE-2 puede

¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦

THRU (las mismas )

ser : ANY CONDICION-2 TRUE FALSE NOT (igual anterior) THRU (igual)

CONSIDERACIONES SOBRE LA EVALUATE ====================================

* implanta en COBOL una declaracion que facilita la programacion estructurada. ----> equivale a la declaracion "CASE" de otros lenguajes, cuya carencia en el COBOL se criticaba. * facilita la construccion de sentencias de logica compleja para las cuales antes era necesario recurrir a la "IF" anidadas.

7

* las expresiones a evaluar se lleman sujeto de la leccion y el resultado objeto de la seleccion. * los pares de sujetos y objetos deben ser ma clase (numerico, caracter, condicion TRUE * usar la conjunto

EVALUATE para de acciones.

* en una EVALUATE tos y objetos.

pueden

seleccionar

especificarse

* la ejecucion de una EVALUATE - la declaracion asociada con - la declaracion asociada con - ninguna condicion "WHEN" es * las "WHEN" cacion, por bilidad.

el

de la miso FALSE).

proceso

hasta

se-

de

255

un

suje-

finaliza cuando: una "WHEN" es seleccionada. una "WHEN OTHER" es SELECC. seleccionada.

son comprobadas en el orden de especifitanto se codificaran en orden de proba-

* Dos operandos relacionados de la misma clase.

con

una

"THRU"

deben

ser

* cualquier sujeto u objeto de seleccion en el cual se ha especificado como "TRUE" o "FALSE" se le asigna ese valor a los ITEMS correspondientes. Página 8

Manual Básico COBOL.txt

EJEMPLOS DE EVALUATE ----------------------

EVALUATE CAMPO1 WHEN 'D' MOVE 'CONDUCTOR' TO CAMPO1 WHEN 'R' MOVE 'COCHE' TO CAMPO1 WHEN SPACE MOVE SPACES TO CAMPO1 END-EVALUATE

---> USANDO IF IF CAMPO1 = 'D' MOVE 'CONDUCTOR' TO CAMPO1 ELSE IF CAMPO1 = 'R' MOVE 'COCHE' TO CAMPO1 ELSE IF CAMPO1 = SPACE MOVE SPACES TO CAMPO1 END-IF END-IF END-IF

8

EVALUATE TRUE ALSO TRUE WHEN EDAD < 18 ALSO SEXO = 'M' MOVE 'CHICO JOVEN' TO CAMPO1 WHEN EDAD < 18 ALSO SEXO = 'F' MOVE 'CHICA JOVEN' TO CAMPO1 WHEN EDAD > 18 ALSO SEXO = 'M' MOVE 'SEÑOR' TO CAMPO1 WHEN EDAD > 18 ALSO SEXO = 'F' MOVE 'SEÑORITA' TO CAMPO1 WHEN OTHER MOVE 'NO VALIDO' TO CAMPO1 END-EVALUATE

SENTENCIA INITIALIZE =====================

¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦

* es

INITIALIZE IDENTIF-1 ........ [ REPLACING ALPHABETIC ALPHANUMERIC NUMERIC ALPHANUMERIC-EDITED NUMERIC-EDITED DATA BY INDENTIF-A LITERAL ]

equivalente

a

una

o

mas

"MOVE"

Página 9

¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦

Manual Básico COBOL.txt * IDENTIF-1

puede

ser : - Un ITEM subscrito - una tabla completa (no DEPENDING ON) - una estructura

* cuando se usa REPLACING IDENTIF-A/LITERAL compatibles con IDENTIF-1. * Si

no

se

usa

deben

ser

REPLACING se asume : - Blancos para los ALPHA - Zeros para los NUMERIC

9

NUEVAS OPCIONES DE LA PERFORM =================================

Conjuntamente con la EVALUATE refuerza el lenguaje COBOL como lenguaje adaptado a la programacion estructurada. en principio distinguir entre la PERFORM en linea (la cual se representa con el delimitador END-PERFORM) y la PERFORM fuera de linea, que es la PERFORM tradicional.

* PERFORM ..... TIMES * ¦PERFORM [ IDENTIF-1/ENTERO-1 ] TIMES ¦ ¦ [ SENTENCIA IMPERATIVA ] ¦ ¦END-PERFORM

* PERFORM ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦

*

Si la

CON

¦ ¦ ¦ ¦ ¦

UNTIL :

PERFORM NOMBRE-PROC1

[ WITH TEST

[ THRU NOMBRE-PROC2 ]

¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦

BEFORE /

AFTER ]

UNTIL CONDICION-1

[ DECLARACION-IMPERATIVA

END-PERFORM ]

se especifica Nombre-Proc1 no se debe especificar declaracion imperativa y la END-PERFORM.

* WITH .... para probar la condicion-1 antes de la ejecucion. BEFORE = DO WHILE AFTER = DO UNTIL (Al menos se ejecuta una

o

despues

vez)

10

Página 10

Manual Básico COBOL.txt ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦

PERFORM PROC-1 [ THRU PROC-2 ] [ WITH TEST BEFORE / AFTER ] VARYING IDENT-1 FROM IDENT-2 INDEX-1

INDEX-2 LITERAL

BY IDENT-3

UNTIL CONDICION-1

INDEX-3

AFTER

...

FROM .....

BY ....

UNTIL ...

[ DECLARACION IMPERATIVA END-PERFORM ]

¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦

esta modificacion de la "PERFORM" supone implantar en el COBOL el "DO WHILE" y el "DO UNTIL", cuya carencia tambien se le criticaba al COBOL. en resumen el COBOL85 con sus nuevas funciones y ampliaciones han cubierto los flancos que le hacian vulnerables ante las criticas respecto al desfase con las funciones que incluian los lenguajes ultimamente desarrollados ( PASCAL, C).

ASPECTOS ADICIONALES =====================

1.- el DB2 R3 suministra un nuevo parametro en la opcion HOST del precompilador del DB", "COB2", que sirve para indicar si el fuente esta estrito en VS COBOL II. 2.- la opcion de compilacion DYNAM, que permite la carga dinamica de programas, al ser llamados por la sentencia CALL no es aplicable a modulos que usen comandos CICS. 3.- para poder llevar a pilar con la opcion

cabo la TEST.

depuracion

se debe

com-

11

4.- un programa es reentrante cuando puede ser ejecutado por varios usuarios o tareas al mismo tiempo, en COBOL II, la opcion es RENT. Si se especifica esta opcion, tambien es necesario especificar la opcion RESIDENT.

DEPURACION CON COBOL II ========================== Página 11

Manual Básico COBOL.txt

ENTORNO

¦COMPILAR¦SOPORTE DE ¦DEPURACION¦DEPURACION ¦ ¦MODULOS OB.¦BATCH ¦INTERACTIVA ------------------------------------------------------------INTERACTIVO TSO ¦ SI ¦ SI ¦ SI ¦ SI ¦ ¦ ¦ ¦ CICS/OS 1.7 ¦ NO ¦ SI ¦ SI ¦ NO ¦ ¦ ¦ ¦ IMS ¦ NO ¦ SI ¦ NO ¦ SI(BTS) ¦ ¦ ¦ ¦ BATCH MVS ¦ SI ¦ SI ¦ SI ¦ SI ¦ ¦ ¦ ¦ se

puede

utilizar:

INTERACTIVAMENTE ---------------* en

al

modo

FULL

SCREEN.

* en modo de edicion de linea. utilizarlo de forma interactiva, el * Controlar * Alterar

y

visualizar

temporalmente

el la

flujo

programador

logica

del

puede:

programa.

del

programa.

* Ejecutar y re-ejecutar todo o parte de un programa utilizando diferentes valores de datos. * Inspeccionar y modificar campos to seleccionados del programa. ------> ES

PRERREQUISITO

DISPONER

DEL

de

datos

ISPF

en

VERSION

pun-

2.

BATCH ----Las peticiones de depuracion se proporcionan en un fichero, creado previa la ejecucion del programa. los programas CICS se pueden depuran en modalidad BATCH.

12

COMPILACION ----------las opciones de compilacion pueden especificarse mediante la ficha CBL o su sinonimia PROCESS, tambien via JCL en la sentencia EXEC que llama al compilador, en la PARM : //COMPILE EXEC PGM=IGYCRCTL,PARM='XREF,SSRANGE,MAP' para modificar las opciones por defecto se cro IGYCOPT, que se ensamblara y catalogara IGYCDOPT.

usa la macomo modulo

COMPILACIONES CON PROGRAMAS SECUNDARIOS ==========================================

cuando se hacen llamadas a programas secundarios desde programas en COBOL II, tamto si el secundario es COBOL II, como si en COBOL OS/VS, los dos tienen que estar compilados con la misma opcion RES o NORES. Si el programa secundario es COBOL OS/VS, no se permite la compilacion de este con ninguna opcion de DEBUG, pues Página 12

Manual Básico COBOL.txt en tiempo de ejecucion nos daria un ABEND de usuario 1010. Si el programa secundario esta linkeditado con la opcion RENT, y no es realmente reentrante, en tiempo de ejecucion nos puede dar un abend de sistema B0A o 30A.

LLAMADAS ENTRE PROGRAMAS COBOL II =====================================

Una gramas COBOL.

es

RUN UNIT (unidad de ejecucion) incluye uno o mas proobjeto y puede incluir otros lenguajes diferentes al

El primer programa cobol que se ejecuta en la usualmente, el MAIN PROGRAM (programa principal).

RUN

UNIT

Cuando una RUN UNIT consiste en varios programas llamados, estos programas deben estar dispuestos para comunicarse con los otros programas. Estos necesitan transferir control y usualmente necesitan tener acceso a datos comunes. Otro metodo que puede ser usado para la comunicacion entre programas es el de programas COBOL anidados. Esto permite que todos los programas requeridos pro una aplicacion esten contenidos dentro del MAIN PROGRAM y de este modo solo es necesario una simple compilacion.

13

TRANSFIRIENDO CONTROL A OTROS PROGRAMAS -------------------------------------------

En la Procedure Division un MAIN subprograma, y un subprograma puede, otro programa. El programa A llama PROGRAMA LLAMANTE y el B PROGRAMA

PROGRAM puede llamar a un asimismo, todavia llamar a al B. El A se denomina LLAMADO.

El programa COBOL llamado empieza a ejecutarse al principio de la Procedure Division. Es posible especificar otro punto de entrada (ENTRY POINT) donde empiece la ejecucion utilizando la etiqueta ENTRY el PROGRAMA LLAMADO. Sin embargo, esta no es una practiva recomendada en la programacion estructurada. Cuando el PROGRAMA LLAMADO se ha procesado completamente puede tambien devolver control al LLAMANTE o finalizar la UNIT RUN. Un cutar

programa llamado no debe, directa o a su llamador. Ejemplo: EL PROGRAMA X EL Y Y EL Z

indirectamente, ejeLLAMA AL Y LLAMA AL Z LLAMA AL X

A esto se le denomida una RECURSIVE CALL. Si cutar una CALL RECURSIVA a un programa COBOL termina anormalmente (ABEND).

se intenta ejela RUN UNIT

El PROGRAMA LLAMANTE y todos los LLAMADOS deben estar (todos compilados con la opcion del compilador: RESIDENT o NORESIDENT, a menos que haya sido especificada la opcion MIXRES en tiempo de ejecucion.

Página 13

Manual Básico COBOL.txt PROGRAMA PRINCIPAL Y SUBPROGRAMAS. ------------------------------------No hay sentencias especificas u opciones para identificar si un programa COBOL es principal o es un subprograma. Normalmente el primer programa COBOL que empieza la ejecucion de una RUN UNIT es el MAIN PROGRAM (programa principal). Todos los otros programas COBOL en la RUN UNIT (unidad de ejecucion) son Subprogramas. Hay

diferentes

maneras

de

finalizar

un

programa:

14

+--------------+-------------+-------------------------------------+ ¦Tipo programa ¦Finaliza con:¦ Efectos que causa ¦ +--------------+-------------+-------------------------------------+ ¦ MAIN PROGRAM ¦ STOP RUN ¦ Termina la RUN UNIT y deletea ¦ ¦ (programa ¦ ¦ todos los programas llamados di- ¦ ¦ (programa ¦ ¦ los programas llamados dinamicamen- ¦ ¦ principal) ¦ ¦ namicamente en la RUN UNIT y ¦ ¦ ¦ ¦ todos los programas linkeditados ¦ ¦ ¦ ¦ con aquellos. El control es de- ¦ ¦ ¦ ¦ vuelto al llamador del programa ¦ ¦ ¦ ¦ PRINCIPAL que usualmente suele ¦ ¦ ¦ ¦ ser el sistema operativo ¦ +--------------+-------------+-------------------------------------+ ¦ MAIN PROGRAM ¦ GOBACK ¦ Tiene el mismo efecto que ¦ ¦ (programa ¦ ¦ STOP RUN ¦ ¦ principal) ¦ ¦ ¦ +--------------+-------------+-------------------------------------+ ¦ MAIN PROGRAM ¦EXIT PROGRAM ¦ No tiene ningun efecto ¦ ¦ (programa ¦ ¦ ¦ ¦ principal) ¦ ¦ ¦ +--------------+-------------+-------------------------------------+ ¦ SUBPROGRAMA ¦EXIT PROGRAM ¦ Devuelve control a su inmediato ¦ ¦ ¦ o ¦ llamador sin finalizar la RUN UNIT ¦ ¦ ¦ GOBACK ¦ ¦ +--------------+-------------+-------------------------------------+ ¦ SUBPROGRAMA ¦ STOP RUN ¦ el efecto es el mismo que en ¦ ¦ ¦ ¦ un programa principal: Todos los ¦ ¦ ¦ ¦ programas COBOL en la RUN UNIT ¦ ¦ ¦ ¦ son terminados y se devuelve ¦ ¦ ¦ ¦ control al llamante. ¦ +--------------+-------------+-------------------------------------+ ¦ SUBPROGRAMA: Una sentencia EXIT PROGRAM implicita es gene- ¦ ¦ rada si no hay una instruccion siguiente eje-¦ ¦ cutable ¦ +------------------------------------------------------------------+

Un subprograma es usualmente dejado en su ultimo estado de uso (LAST-USED STATE), cuando termina con EXIT PROGRAM o GOBACK. La siguiente vez que es llamado en la RUN UNIT (unidad de ejecucion) sus valores internos estaran como fueron dejados, excepto los valores de retorno para las instrucciones PERFORM que seran restaurados a su valor inicial. Por el contrario, un programa principal es inicializado cada vez que es llamado. Hay dos excepciones: 1ra.- Un subprograma que es llamado dinamicamente por un programa COBOL OS/VS o COBOL II VS y luego es cancelado, con la opcion RESIDENT estara en el estado inicial la siguiente vez que es llamado. 2da.- Un programa con el estado inicial cada

atributo vez que

INITIAL estara es llamado.

Página 14

en

el

Manual Básico COBOL.txt

15

LLAMANDO PROGRAMAS -------------------

a

Se pueden usar diferentes metodos otro programa. Esto incluye : 1.- CALLs

a

programas

para

transferir

control

anidados.

2.- CALLS estaticas separadamente.

a

otros

programas

COBOL II VS

compilados

3.- CALLs dinamicas separadamente.

a

otros

programas

COBOL II VS

compilados

4.- CALLs a programas en otros FORTRAM, y COBOL OS/VS.

lenguajes

incluyendo

PLI,

Las CALL a programas anidados te permiten crear aplicaciones utilizando las tecnicas de programacion estructurada. Pueden tambien ser utilizadas en lugar de procesos PERFORM para prevenir modificaciones a items inintencionadamente. Las CALL a programas anidados pueden usar bien la instruccion CALL -literal- o bien CALL -identificador-. Una CALL estatica es utilizada para llamar a un programa compilado separadamente que es link-editado dentro del mismo modulo de carga que el programa LLAMANTE. Una CALL dinamica es utilizada para llamar a un programa compilado separadamente que ha sido link-editado en un modulo de carga separado del programa LLAMANTE. En este caso el modulo del subprograma es cargado en memoria la primera vez que es llamado. Una CALL CALL-literal NODYNAM.

estatica ocurre en un programa

Las CALL estaticas son CALL dinamicas y utilizan

cuando se usa la instruccion que es compilado con la opcion

ejecutadas mas rapidamente u ocupan menos memoria.

que

las

El uso de la instruccion CALL -identificador- O CALL -literalcompilado con la opcion DYNAM da como resultado una CALL dinamica. Se deberia considerar la utilizacion de una call dinamica cuando: 1.- los subprogramas llamados con una instruccion CALL -literal- son usados infrecuentemente o son muy grandes. 2.- Se quiera llamar a subprogramas en su UNUSED STATE. 3.- Se tiene un programa AMODE(24) en la misma RUN UNIT con programas COBOL II VS que quieren que se ejecuten en la modalidad de direccionamiento de 31 BITS. 4.- El nombre del programa que va a ser llamado se conoce en tiempo de ejecucion.

16

PROGRAMAS ANIDADOS -------------------

Los programas anidados proporcionan un metodo mediante el cual se pueden crear funciones modulares (modular functions) Página 15

Manual Básico COBOL.txt para la aplicacion mantenimiento de tecnicas de programacion estructurada. Se pueden utilizar como procesos PERFORM con la capacidad adicional de proteger los items locales. Los programas anidados tambien dan flexibilidad para depurar los programas antes de ser incluidos en la aplicacion y dar la capacidad para compilar la aplicacion con una simple invocacion al compilador.

ESTRUCTURA DE PROGRAMAS ANIDADOS -----------------------------------

Un programa COBOL puede contener otros programas COBOL. Los programas contenidos pueden ellos mismos contener otros progragramas. Un programa contenido puede ser directamente o indirectamente contenido dentro de un programa.

17

EJEMPLO: -------+-- Programa X ¦ -------¦ ....... ¦ Call X1 ¦ Call X2 ¦ ....... ¦ Stop run ¦ ¦ +-- Programa X1 ¦ ¦ -------¦ ¦ ¦ ¦ ........ ¦ ¦ Call X11 ¦ ¦ Call X12 Página 16

Manual Básico COBOL.txt ¦ ¦ ........ ¦ ¦ Stop run ¦ ¦ ¦ ¦ +-- Programa X11 ¦ ¦ ¦ -------¦ ¦ ¦ ¦ ¦ ¦ ........ ¦ ¦ ¦ ........ ¦ ¦ ¦ Exit Program ¦ ¦ ¦ ¦ ¦ +-- End Program X11 ¦ ¦ ¦ ¦ +-- Programa X12 ¦ ¦ ¦ -------¦ ¦ ¦ ¦ ¦ ¦ ........ ¦ ¦ ¦ ........ ¦ ¦ ¦ ¦ ¦ ¦ Exit Program ¦ ¦ ¦ ¦ ¦ +-- End Program X12 ¦ ¦ ¦ +-¦ ¦ +-- Programa X2 ¦ ¦ -------¦ ¦ ¦ ¦ ......... ¦ ¦ ......... ¦ ¦ Exit Program ¦ ¦ ¦ +-- End Program X2 ¦ +-- End Program X

18

NORMAS PARA EL USO DE ESTRUCTURA DE PROGRAMAS ANIDADOS --------------------------------------------------------------

de

Hay varias normas que programas anidados:

aplicar

cuando

se

utilizan

estructuras

1.- La IDENTIFICATION DIVISION es requerida en cada programa. Todas las otras divisiones son opcionales. 2.- El

nombre

de

programa

debe

ser

unico.

3.- Los programas contenidos no pueden tener la COMFIGURATION SECTION. El programa outermost (mas exterior) debe especificar cualquiera de las opciones CONFIGURATION SECTION que pueda ser requerida. 4.- Cada programa contenido (llamado) es incluido en el programa continente (llamante) inmediatamente antes de su cabecera END-PROGRAM. 5.- Programas llamados con END-PROGRAM.

y

llamantes

deben

ser

terminados

LLAMANDO A PROGRAMAS ANIDADOS --------------------------------

Un programa contenido (llamado) solamente puede ser llamado directamente por su programa llamante, a menos que el llamado identificado como COMMON en su clausula PROGRAM-ID. En este caso el programa COMMON puede tambien ser llamado por cualquier programa que este contenido directa o indirectamente dentro del Página 17

mismo

programa

que

el

Solamente

programas

Las

recursivas

CALL

Manual Básico COBOL.txt COMMON.

programa

contenidos (llamados) pueden no

son

ser

COMMON.

permitidas.

19

EJEMPLO: -------+-- Program-id. A ¦ ----------¦ ¦ +-- Program-id. A1 ¦ ¦ ----------¦ ¦ ¦ ¦ +-- Program-id. A11 ¦ ¦ ¦ ----------¦ ¦ ¦ ¦ ¦ ¦ +-- Program-id. ¦ ¦ ¦ ¦ ----------¦ ¦ ¦ ¦ ¦ ¦ ¦ +-- End Program ¦ ¦ ¦ ¦ ¦ +-- End Program A11 ¦ ¦ ¦ +-- End Program A1 ¦ ¦ +-- Program-id. A2 is ¦ ¦ ----------¦ ¦ ¦ +-- End Program A2 ¦ ¦ +-- Program-id. A3 is ¦ ¦ ----------¦ ¦ ¦ +-- End Program A3 ¦ +-- End Program A

La

siguiente

tabla

describe

la

A111

A111

COMMON

COMMON

jerarquia

de

las

CALL:

+----------+----------------+-----------------------+ ¦ El ¦ Puede llamar ¦ y Puede ser llamado ¦ ¦ Programa ¦ a los programas¦ por los programas ¦ +----------+----------------+-----------------------+ ¦ A ¦ A1,A2,A3 ¦ Ninguno ¦ +----------+----------------+-----------------------+ ¦ A1 ¦ A11,A12,A2,A3 ¦ A ¦ +----------+----------------+-----------------------+ ¦ A11 ¦ A111,A12,A2,A3 ¦ A1 ¦ Página 18

Manual Básico COBOL.txt +----------+----------------+-----------------------+ ¦ A111 ¦ A12,A2,A3 ¦ A11 ¦ +----------+----------------+-----------------------+ ¦ A12 ¦ A2,A3 ¦ A1,A11,A111 ¦ +----------+----------------+-----------------------+ ¦ A2 ¦ A3 ¦ A,A1,A11,A111,A12,A3 ¦ +----------+----------------+-----------------------+ ¦ A3 ¦ A2 ¦ A,A1,A11,A111,A12,A2 ¦ +----------+----------------+-----------------------+

20

Observar: .- que A2 no puede llamar a no esta contenido en A2 .- que A111 no puede CALL RECURSIVA. .- que

A1

puede

llamar

llamar

a

A1

a

proque

A2

A11

no

COMMON

y

eso

seria

una

porque

porque

es

A2

es

COMMON.

CALL ESTATICAS Y DINAMICAS. ------------------------------

Cuando un subprograma es llamado puede estar ya en memoria y puede ser Linkeditado en el mismo modulo de carga con el programa LLAMANTE (Call estatica) o puede ser cargado solamente al tiempo que es llamado (Call dinamica). Con la carga dinamica el programa llamado es cargado solamente cuando se necesita. cargado solamente cuando se necesita. El proceso de Link-edit difiere dependiendo programas con Call dinamica o estatica.

de

si

se

trata

de

UTILIZANDO CALL ESTATICA. ---------------------------

La instruccion CALL-literal- (donde-literal- = nombre subprograma) es tratada por el compilador como una CALL estatica cuando la opcion del compilador NODYNAM esta activa. Una CALL estatica es ejecutada mas rapidamente que una dinamica y es la preferida si la aplicacion no requiere los servicios de una Call dinamica. Los programas llamados por una Call estatica no pueden ser deleteados (con cancel), por tanto el uso de CALLs estaticas puede ocupar mas memoria principal. Si la memoria IS A CONCERN OF YOURS considerar el uso de CALLs dinamicas. Si CALLs CALLs

la opcion del de el formato estaticas.

compilador NODYNAM CALL -literal- en

esta activa todas las ese programa seran

UTILIZANDO CALL DINAMICA. --------------------------Una Se

Call debe

dinamica utilizar

carga una

el

subprograma

instruccion

CALL

en

tiempo

dinamica

Página 19

de

cuando:

ejecucion.

Manual Básico COBOL.txt 21

1.- Los subprogramas llamados con CALL -literal- son usados infrecuentemente o son muy grandes. Si los subprogramas son llamados pocas veces, las CALL dinamicas tienen la ventaja de que trae el subprograma a memoria solamente cuando se necesita. 2.- Se quiera llamar a Subprogramas en su UNUSED STATE. Con el atributo INITIAL el subprograma sera posicionado en su INITIAL UNUSED STATE cada vez que es llamado. Se puede, tambien, selectivamente preparar el ESTADO NO USADO o INICIAL mediante el proceso CALL y CANCEL. Este es un proceso mas engorroso y fastidioso pero da control del estado si eso es lo esencial. Para hacer esto se utiliza una combinacion de CALL dinamica y la instruccion CANCEL y se compila el programa con la opcion RESIDENT. Cuando se cancela el subprograma que fue inicialmente llamado por un COBOL OS/VS o COBOL II VS, la siguiente CALL causara que el subprograma sea reinicializado a su UNUSED STATE. El comando cancel no toma accion alguna para borrar de memoria los subprogramas que fueron cargados dinamicamente y bifurcados mediante programas no COBOL. 3.- El en

nombre del programa a ser llamado solo se conoce tiempo de ejecucion : - En este caso utiliza el formato CALL -identificador- donde -identificador- es el item que contendra el nombre del programa llamado en tiempo de ejecucion. En la proctica se deberia utilizar CALL -identificador- cuando el programa a ser llamado varia dependiendo de las condiciones del programa llamante. - CALL -identificador- es siempre dinamica, incluso si se utiliza la opcion de compilacion NODYNAM. Para que todas las CALL -literal- hechas en un programa sean dinamicas utilizar la opcion de compilacion DYNAM.

Cuando se utilice la opcion de compilacion NODYNAM, no se debe mezclar CALL -identificador- dinamica y una CALL -literalestatica para el mismo subprograma. Esto desperdicia espacio porque dos copias del subprograma son cargadas en memoria y no se garantiza que el subprograma sea dejado en su LAST-USED-STATE. Cuando se tienen CALLs dinamicas en compilar utilizando la opcion RESIDENT.

un

programa, se

debe

Las CALLs dinamicas toman mas procesamiento pero pueden lizar menos memoria principal que las CALLs estaticas.

uti-

22

COMPARTIENDO DATOS USANDO EL ATRIBUTO EXTERNAL. ----------------------------------------------------

Los programas compilados separadamente (incluyendo los programas dentro de una secuencia batch) pueden compartir items mediante el uso del atributo EXTERNAL. EXTERNAL es especificado en el nivel del dato en la working de un programa guientes reglas: 1.- Los

items

subordinados

a

un

grupo

01 de la descripcion y se aplican las si-

de

Página 20

items

EXTERNAL,

Manual Básico COBOL.txt son ellos mismos EXTERNAL. 2.- El nombre usado para el item no puede ser usado en otro item EXTERNAL dentro del mismo programa. 3.- La clausula VALUE no puede ser especificada para cualquier grupo de item o items subordinados EXTERNAL. Cualquier programa COBOL dentro de la RUN UNIT (Unidad de ejecucion) que tenga la misma descripcion para el item que el programa que contiene el item puede acceder y procesar el item.

Ejemplo: -------Si

el programa A tuviera la siguiente descripcion: 01 EXT-ITEM1 PIC 99 EXTERNAL. El programa B podria acceder a ese item si tuviera misma descripcion en su working.

la

Cualquier programa que pueda acceder a un item EXTERNAL puede cambiar su valor. No se debe utilizar este atributo para items que es nesario proteger.

PASANDO DATOS MEDIANTE BY REFENCE OR BY CONTENT ------------------------------------------------------

BY REFERENCE significa que el subprograma esta y procesando el item en la working del programa vez de trabajar sobre una copia del dato.

refiriendose llamante en

BY CONTENT significa que el programa llamante esta pasando solamente el contenido del -literal- o -identificador-. Con una CALL ... BY CONTENT, el programa llamado no puede cambiar el valor del -literal- o -identificador- en el programa llamante, incluso si se modifica la variable en la cual se recibe el -literal- o el -identificador-. Si se quiere que compartirlos se debe

el subprograma reciba datos del llamante y especificar: CALL ... BY REFERENCE -IDENTIFICADOR-

23

el

Cualquier programa

cambio que llamante.

el

subprograma

haga

afecta

al

dato

en

Un -identificador- en la frase USING de la instruccion CALL ... BY REFERENCE puede ser un nombre de fichero ademas de un nombre de item. Si el -identificador- es un nombre de fichero para un fichero secuencial el compilador COBOL pasa la direccion de la DCB (Data Control Block) AS THIS ENTRY OF THE PARAMETER LIST. El -identificador- no puede ser el nombre de un fichero VSAM. NOTA: Este mecanismo no puede ser usado para ficheros partidos entre programas COBOL. Esto es solamente pasar la DCB a programas assembler. Si se quiere programa llamado

pasar la direccion del area de registro a un se debe especificar : CALL ... BY REFERENCE ADDRESS OF -RECORD NAME-

El subprograma recibe el pecial de direccion) para cifico. Se

debe

compara

definir

el

ADDRESS SPECIAL REGISTER (Registro esel nombre de registro que se espe-

nombre

de

registro

como

Página 21

un

nivel

01

o

77

en Si

El desde

la se

LINKAGE quiere

SECTION

de

Manual Básico COBOL.txt los programas llamante

y llamado.

pasar

la longitud del item se especificara: CALL ... BY CONTENT LENGTH OF -IDENTIFICADOR-

programa llamante pasa la longitud del -identificadorsu LENGTH special register (registro especial de longitud).

Cuando los grama llamado

literales no puede

son pasados mediante cambiar el valor.

BY

CONTENT

el pro-

Si se quiere pasar ambos (el item y su longitud) a un subprograma se especificara una combinacion de BY REFERENCE y BY CONTENT, por ejemplo : CALL 'ERRPROC' USING BY REFERENCE A BY CONTENT LENGHT OF A. Los items en un programa llamante pueden estar descritos en la LINKAGE SECTION de todos los programas que llama directa o indirectamente. En este caso, la memoria para estos items es alocada en el programa llamante de nivel superior. Esto es, el programa A llama al B, el cual llama al C. Los items en el programa A pueden ser descritos en la LINKAGE SECTION de los programas B y C y estar disponibles a los tres programas.

DESCRIBIENDO ITEMS COMUNES EN EL PROGRAMA LLAMANTE --------------------------------------------------------

la

En el programa llamante, los items DATA DIVISION de la misma manera

comunes son descritos en que otros items. A menos

24

que ellos esten en la LINKAGE SECTION, la memoria es alocada para esos items en el programa llamante. Si se referencian datos en un fichero, este debe estar abierto cuando el dato sea referido. Se codificara la clausula USING en las instrucciones

*****

CALL *********************

DESCRIBIENDO DATOS COMUNES EN EL PROGRAMA LLAMADO -------------------------------------------------------

En el programa llamado los items comunes son descritos la LINKAGE SECTION. Codificar la clausula USING despues de cabecera PROCEDURE DIVISION para recibir los datos.

EJEMPLO: -------Descripcion del Prog. LLAMANTE ----------------------

Descripcion del Prog. LLAMADO ----------------------

WORKING STORAGE SECTION. LINKAGE SECTION. +----------------------------+ +------------------------+ ¦ 01 PARAM-LIST. ¦ ¦ 01 USING-LIST ¦ ¦ 05 PARTCODE PIC A. ¦ ¦ 10 PART-ID PIC X(5) ¦ ¦ 05 PARTNO PIC X(4). ¦---->>¦ 10 SALES PIC 9(5) ¦ ¦ 05 U-SALES PIC 9(5). ¦ ¦ ¦ +----------------------------+ +------------------------+ . ¦ . ¦ . ¦ . ¦ . ¦ . ¦ . ¦ . ¦ Página 22

en la

Manual Básico COBOL.txt . ¦ PROCEDURE DIVISION PROCEDURE DIVISION ¦ . USING+----------+ . ¦USING-LIST¦ . +----------+ CALL CALLED-PROG +----------+ USING ¦PARAM-LIST¦ +----------+ ¦ ¦ ¦ ¦ ¦

LINKAGE SECTION -----------------

Se debe conocer lo que se va a pasar desde el programa llamante y la estructura de la LINKAGE, para aceptarlo. No importa que clausula de la instruccion CALL se utilice para pasar los datos (BY REFERENCE o BY CONTENT). En cualquier caso el programa llemado debe describir los datos que esta recibiendo. Hace esto en la LINKAGE SECTION.

25

************************************************************************ ******** INSTRUCCIONES DE PROGRAMAS COBOL ******* ************************************************************************

INTRUCCION INSPECT ------------------

INSPECT DATA-1 TALLYING CONTADOR FOR CHARACTERS AFTER INITIAL 'S' REPLACING ALL 'A' BY 'O' INSPECT DATA-1 TALLYING CONTADOR FOR LEADING '0' REPLACING FIRST 'A' BY '2' AFTER INITIAL 'C' INSPECT DATA-1 REPLACING CHARACTERS BY ZEROS BEFORE INITIAL QUOTE INSPECT DATA-1 CONVERTING 'abcedfg' TO 'ABCEDFG' AFTER INITIAL '/' BEFORE INITIAL '?'

INSTRUCCION INITIALIZE ----------------------

INITIALIZE ALFANUMERIC-1 REPLACING ALPHANUMERIC DATA BY ALPHANUM-3 INITIALIZE CAMPO-NUMERICO REPLACING NUMERIC DATA BY CAMPO-NUMERICO-2 INITIALIZE CAMPO-EDICION REPLACING ALPHANUMERIC-EDITED DATA BY CAMPO-EDICIION-2

Un item de datos INDEX no se puede inicializar con INITIALIZE. La sentencia INITIALIZE no se puede usar para inicializar tablas de longitud variable (OCCURS...DEPENDING ON...)

01

TABLA-ENTRADA. 05 ENTRADA OCCURS 100 TIMES. Página 23

Manual Básico COBOL.txt 10 NOMBRE-TAB PIC X(5). 100 TRUE

INDICADOR TRUE

FALSE

ANY

27

Página 24

Manual Básico COBOL.txt EVALUEATE TRUE WHEN DD-31 WHEN DD-30 ............. ............. CONTINUE WHEN OTHER ............. ............. ............. END-EVALUATE.

TRUE MM-31 MM-30

TRUE AA-NORMAL AA-NORMAL

EVALUATE CANTIDAD * 4 WHEN NOT NUMERIC .................. .................. WHEN 1 THRU 10 .................. .................. WHEN NOT 11 THRU 20 .................. .................. END-EVALUATE.

EVALUATE CAMPO-1 CAMPO-2 CAMPO-3 WHEN 1 1 1 MOVE 'A' TO INDICADOR-FINAL WHEN 1 1 0 MOVE 'B' TO INDICADOR-FINAL WHEN OTHER ................. END-EVALUATE.

EVALUATE CAMPO-1 CAMPO-2 WHEN 0 1 THRU 3 ................ ................ WHEN NUMERIC ANY ................ ................ END-EVALUEATE.

CAMPO-3 5

NOT NUMERIC

28

INSTRUCCION STRING. -------------------

STRING CAMPO-1 CAMPO-2 DELIMITED BY CAMPO-3 CAMPO-4 DELIMITED BY SIZE FILE-NAME1 : *-->> ASCENDING DESCENDING :

*-->> DATA-NAME1 :

¦ ¦ ¦ ¦ ¦ section-name2 ] ¦ ¦ ¦ ¦ ¦ --

__

_ ¦ ¦ ¦ ¦ --

¦ ¦ ¦ ¦ ¦ section-name4 ] ¦ ¦ ¦ ¦ ¦ --

Nombre del fichero definido en la SD.

Indica la secuencia en la que se va a ordenar el fichero, ascendente ( de menor a moyor) o descendente. Campo en el que tenemos que basar la ordenaPágina 27

Manual Básico COBOL.txt cion, tiene que estar relacionado con el fichero, estar situado en la misma posicion y tener la misma longitud que en el fichero de entrada.

31

*-->> COLLATING SEQUENCE :

*-->> USING :

Especifica la secuencia a seguir para usar en las comparaciones no numericas para el campo clave en la opercion de ordenar.

Cuando se especifica esta opcion todos los registros en file-name2, son transferidos automaticamente a file-name1. Los ficheros de entrada tienen que tener organizacion secuencial.

*-->> INPUT PROCEDURE :

*-->> GIVING :

Especifica el nombre de la seccion que va a seleccionar o modificar registros de entrada antes que la operacion de ordenacion comienze. Puede tener uno o mas parrafos escritos consecutivamente y que no formen parte de la OUTPUT PROCEDURE.

Cuando se especifica esta opcion todos los registros ordenados en file-name1 son transferidos automaticamente al fichero de salida file-name3. El fichero de salida debe tener organizacion secuencial, y debe estar definido en la FD.

*-->> OUTPUT PROCEDURE :

Especifica el nombre de seccion que va a seleccionar o modificar registros de salida. Puede tener uno o mas parrafos escritos consecutivamente y que no formen parte de la INPUT PROCEDURE.

RELEASE =======

Equivale a un WRITE, para grabar los registros en el fichero del SORT. RELEASE -------

record-name [FROM identifier] ----

Transfiere registros desde un area de entrada/salida a la fase inicial de una operacion de ordenacion. Solo se puede usar en SORT INPUT PROCEDURE. El record-name tiene que estar asociado al fichero definido en la SD.

RETURN ======

Equivale a una READ, para leer del fichero del SORT.

32

RETURN ------

file-name

RECORD

[INTO identifier] ---Página 28

Manual Básico COBOL.txt AT END imperative-statement -----[END-RETURN] ---------Transfiere registros desde la fase final del sort o merge a la OTPUT PROCEDURE. Solo se puede usar en la SORT OUTPUT PROCEDURE El file-name tiene que estar definido en la SD

SORT-RETURN ===========

Equivale al return-code. Sort-return PIC S9(4).

CLAUSULA OCCURS ================

FUNCION: Permitir simplificar las inscripciones de campos de datos que se repiten con la misma descripcion.

FORMATO 1: --------OCCURS ------

entero

TIMES

Entero indica el numero de veces que se repite un campo con la misma descripcion; su valor tiene que ser mayor que cero. EJEMPLO.

Se dispone de una cinta magnetica grabada con un solo registro de 3254 caracteres cuyo contenido es el siguiente:

- Un campo de seis caracteres alfabeticos en los que figura el nombre de la empresa. - Un campo de ocho caracteres modelo de automovil fabricado.

alfanumericos en el que figura el

- 1080 campos de tres caracteres numericos cada uno, cuyo contenido es el numero diario de automoviles fabricados durante los años 1971, 72 y 73 (los meses se consideran de 30 dias).

33

Se quiere, partiendo del formato de programador haga la descripcion del mismo: 01

REGISTRO-AUTOS. 02 NOMBRE 02 MODELO 02 DIARIA1 02 DIARIA2 02 DIARIA3 " " " " " " 02 DIARIA1078 02 DIARIA1079 02 DIARIA1080

PICTURE PICTURE PICTURE PICTURE PICTURE " " " PICTURE PICTURE PICTURE

dicho

registro, que el

A(6). X(8). 999. 999. 999. " " " 999. 999. 999. Página 29

Manual Básico COBOL.txt Como se ve, esta descripcion seria muy laboriosa y necesitaria mucho tiempo el llevarla a cabo, ya que serian necesarias varias hojas de codificacion. Pero teniendo en cuenta que al ser los 1080 campos de la misma longitud, y del mismo tipo los caracteres a almacenar, se puede simplificar la descripcion empleando la clausula OCCURS, sustituyendo la anterior descripcion por la equivalente: 01

REGISTRO-AUTOS. 02 NOMBRE 02 MODELO 02 DIARIA OCCURS 1080

PICTURE A(6). PICTURE X(8). PICTURE 999.

- A la descripcion del campo en que entra a formar parte la clausula OCCURS se le da el nombre de tabla. - Al nombre de campo de datos, DIARIA, el cual es comun para los 1080 campos se le denomina: Nombre Generico o Sujeto, y a cada uno de los campos, elementos de la TABLA. - La clausula OCCURS no puede especificarse en una descripcion que lleve nivel 01 o 77.

FORMATO 2: --------OCCURS ------

entero-1

TO --

entero-2

TIMES DEPENDING ON ---------

nombre-de-datos-1

Este formato se emplea cuando el sujeto o nombre generico tiene un numero variable de apariciones. Si en el ejemplo anterior, en vez de haber grabado la cinta con un unico registro conteniendo la produccion de 36 meses, cada uno de treinta dias' se hubieran grabado 36 registros de longitud variable como consecuencia del numero diferente de dias de cada mes; en este caso la descripcion seria:

34

FD

ARCHIVO- AUTOS RECORDING V LABEL RECORD OMITTED.

01

REGISTRO-AUTOS. 02 NOMBRE PIC A(6). 02 MODELO PIC X(8). 02 NUMERO-DIAS PIC 99. 02 DIARIA OCURRS 28 TO 31 TIMES DEPENDING ON NUMERO-DIAS PIC 999.

A la vista de dicha descripcion, entero-1 representa el numero minimo de apariciones y entero-2 el numero maximo. El valor minimo que puede tomar entero-1 es cero y el valor maximo de entero-2 depende del tipo de compilador utilizado, pudiendo llegar a ser superior a 300.000. Existen compiladores para los que correcto describir: 02 02 02

entero-1

es opcional.

Siendo

MODELO PIC X(8). NUMERO-DIAS PIC 99. DIARIA OCCURS 31 TIMES DEPENDING ON NUMERO-DIAS PIC 999.

DEPENDING debe aparecer en la ultima inscripcion de los campos de datos que constituyen el registro y, como consecuencia, nombre-de-datos-1 debe especificarse antes de la descripcion del nombre generico de la clausula OCCURS, cuando forma parte del registro, como se muestra en el ejemplo precedente, ya que no seria correcto escribir:

Página 30

FD 01

Manual Básico COBOL.txt ARCHIVO- AUTOS RECORDING V LABEL RECORD OMITTED. REGISTRO-AUTOS. 02 NOMBRE PIC A(6). 02 MODELO PIC X(8). 02 DIARIA OCCURS 28 TO 31 TIMES DEPENDING ON NUMERO-DIAS PIC 999. 02 NUMERO-DIAS PIC 99.

por no ser DIARIA el ultimo campo del registro. La serie de caracteres de la clausula PICTURE perteneciente a nombre-de-datos-1 debe ser numerica.

FORMATO 3: --------_ _ OCCURS entero-1 TO entero-2 TIMES ¦ DEPENDING ON nombre-de-datos-1 ¦ -----_ ASCENDING --------- DESCENDING ----------

¦

_ _ _ KEY IS nombre-de-datos-2 ¦ nombre-de-datos-3 ¦...¦...

35

_ ¦

INDEXED -

_ _ _ BY nombre-de-indice-1 ¦ nombre-de-indice-2 ¦ ... ¦ -

En este formato incluye a los dos anteriores, añadiendo la clausula ASCENDING o DESCENDING, para indicar si los elementos de la tabla estan ordenados en forma ascendente o descendente por uno o varios campos (nombre-de-datos-2, nombre-de-datos-3 ...), que formen parte de dichos elementos. La utilizacion de este formato es obligatoria, por para localizar a un determinado elemento de la tabla, metodo de busqueda binaria o dicotomica por medio de SEARCH ALL, la cual utiliza como indice para realizar al nombre-de-indice que se describe a continuacion de

ejemplo, cuando se emplee el la declaracion dicha busqueda, INDEXED BY.

Los valores que pueden asignarse a entero-1 y entero-2 mismos que los especificados en el Formato-2.

son los

TABLAS ______

Una TABLA es una serie de datos con el mismo formato consecutivamente en memoria. La serie de datos, con un solo nombre.

al tener el mismo formato,

dispuestos

se puede describir

Las tablas se utilizan con mucha frecuencia en programacion ya que permiten, principalmente: - Disponer de una informacion rapida (estan en memoria). - Acceder a un elemento por su posicion relativa. Elemento de tabla es un campo de datos que, incluye una clausula OCCURS. La

declaracion

OCCURS

especifica

el

en

su

descripcion,

numero

de

elementos que

Página 31

Manual Básico COBOL.txt existen en la tabla. (En una tabla, todas las entradas deben de tener el mismo tamaño y formato). 01

TABLADIAS. 03 UNDIA OCCURS

7

TIMES

PIC

X(9).

Esta partida establece una tabla de siete elementos cada uno de los cuales tiene nueve caracteres de longitud con lo que la tabla tendra una longitud de 63 (9 x 7) caracteres. Al utilizar la siguientes reglas:

declaracion OCCURS

se deben tener en cuenta las

36

- OCCURS no aparece en el nivel 01 sino en el nivel mas bajo. - La declaracion PICTURE aparece en el nivel mas bajo. Como hemos dicho, la reserva de memoria para cada uno de los elementos de la tabla se dispone, fisicamente, en forma lineal, es decir, cada elemento se situa inmediatamente a continuacion del anterior. 01

TABLADIAS. 03 UNDIA OCCURS

7

TIMES

PIC

X(9).

Se hace referencia a cada partida de una tabla por medio de un numero, llamado SUBINDICE, que identifica su posicion en esa tabla. Por ejemplo, en la tabla anterior tendriamos: UNDIA(1) = LUNES UNDIA(3) = MIERCOLES El SUBINDICE se utiliza al nivel de la declaracion OCCURS, es decir, "UNDIA(3)", pero no "TABLADIAS(3)".

TABLAS DE LONGITUD VARIABLE ===========================

La opcion DEPENDING de la clausula OCCURS define una tabla en la que el numero de sus elementos va variando mientras se lleva a cabo la ejecucion del programa. (Seria el caso, por ejemplo, de una tabla en la que se recogiera la fabricacion de coches en un año por meses y por dias laborales; esta claro que en este caso la tabla podria ser de longitud variable en funcion del numero de dias laborables de cada mes).

DESCRIPCION DE UNA TABLA ========================

La descripcion de una tabla puede realizarse en la FILE SECTION o en la WORKING-STORAGE SECTION. Para llenar con datos una tabla habra que tener en cuenta que: - Si se describe en la FILE SECTION, el llenado de la misma se hara, normalmente, desde un medio externo: cinta, disco, etc., donde estaran contenidos los datos, por medio de una declaracion READ. - Si se describe en la WORKING-STORAGE SECTION, se llenara, bien con el contenido existente en otros campos de la memoria y/o los resultados producidos durante el proceso, o bien por una declaracion ACCEPT o READ.

Página 32

Manual Básico COBOL.txt

37

A las tablas que no se espera que cambien (tabla de constantes) se les puede dar valores en la WORKING-STORAGE SECTION de un programa utilizando la declaracion REDEFINES. 01

01

TABLAMES. 02 FILLER 02 FILLER 02 FILLER 02 FILLER

PIC PIC PIC PIC

X(30) X(30) X(30) X(30)

VALUE VALUE VALUE VALUE

'ENERO 'ABRIL 'JULIO 'OCTUBRE

FEBRERO MAYO AGOSTO NOVIEMBRE

MARZO '. JUNIO '. SEPTIEMBRE'. DICIEMBRE '.

RTABLA REDEFINES TABLAMES. 02 UNMES PIC X(10) OCCURS 12 TIMES:

La clausula REDEFINES debe seguir directamente a la partida que redefine y debe estar en el mismo nivel. Puesto que no se puede incluir una clausula VALUE con una declaracion OCCURS, esta es una tecnica util para codificar una tabla de constantes.

TABLAS DE MAS DE UNA DIMENSION ==============================

El COBOL tambien permite tablas de dos y tres dimensiones. Una tabla unidimensional podia representar ya sea una lista de nombres de estudiantes o un conjunto de calificaciones para cada uno de los estudiantes, y una tabla tridimensional podrian incluir el nombre de cada alumno y la nota media para cada uno de los meses del curso. Para definir una tabla bidimensional, la clausula OCCURS se utiliza dos veces. La declaracion PICTURE solo se utilizara despues de la ultima OCCURS. 01

TABLA. 02 ALUM OCCURS 50 TIMES. 03 NOTA OCCURS 10 TIMES PIC 99V99.

Con el fin de hacer referencia a una entrada en una tabla bidimensional se necesitan dos subindices ("I" y "J") escritos de la forma (I, J). El primer subindice se refiere a la variable descrita en la primera declaracion OCCURS y debe estar seguido por una coma y un espacio. El segundo subindice se refiere a la variable descrita por la segunda declaracion OCCURS. Una tabla tridimensional se definiria de la siguiente manera: 01

TABLA. 02 ELE1 OCCURS 3 TIMES. 03 ELE2 OCCURS 3 TIMES. 04 ELE3 OCCURS 2 TIMES PIC X(8).

38

INDEXACION ==========

Con la declaracion OCCURS se puede definir una variable INDICE (INDEX). A esta variable INDICE se le puede dar un valor en una proposicion SET. El indice es muy semejante, en apariencia, al subindice. Cuando se utiliza un indice se puede utilizar una instruccion especial (SEARCH) con la cual se incrementara la variable indice. 01

TABLA. Página 33

Manual Básico COBOL.txt 02

ELE PIC 9(3) OCCURS 20 TIMES INDEXED BY K.

Esto define a TABLA con un indice "K". El elemento (ELE) aun puede estar referenciado por medio de subindices. (No se utiliza la clausula PIC para describir a "K").

DECLARACION "SET" ================

Un indice no puede estar especificado en una proposicion aritmetica (ADD, MULTIPLY, asignar un valor a un indice o para igualar un nombre de dato se utiliza la declaracion

nombre-indice-1

una instruccion MOVE o en etc ...), entonces para el valor de un indice con SET.

nombre-indice-2

SET

... identificador-2

nombre-indice-1

nombre-indice-2

SET

identificador-1

TO

nombre-indice-3 identificador-3 literal

UP BY

identificador

DOWN BY

literal

Los nombres de indice siempre deben tener valores entre "1" tamaño de la tabla.

y

el

El efecto de la declaracion SET es transferir al operando u operandos que siguen a SET el contenido del operando que sigue a la palabra TO, es decir, es una transferencia realizada en sentido contrario a como la realiza la declaracion MOVE. Si se utiliza UP BY o DOWN BY, cada vez que se ejecuta la declaracion SET el contenido de los nombres-de-indice que siguen a dicha declaracion se incrementan (UP BY) o decrementan (DOWN BY) en el valor contenido en el identificador o literal que siga a estas dos opciones.

39

SET INDICE BETA TO SUM. SET INDICE TO 46. SET INDICE UP BY 2.

(Indice y Beta pasan a valer SUM). (Indice pasa a valer 46). (Indice se incrementa en 2).

01

TABLA. 02 ELE PIC 99 OCCURS 10 TIMES INDEXED BY K. .................. .................. PROCEDURE DIVISION. SET K TO ZERO. CALCULO. SET K UP BY 1. IF K NOT > N ADD ELE(K) TO TOTAL GO TO CALCULO. .................. ..................

DECLARACION "SEARCH" Página 34

Manual Básico COBOL.txt ====================

Lleva a cabo la busqueda en forma secuencial de una tabla hasta que el contenido de un elemento de la misma satisfaga una determinada condicion. _ _ SEARCH identificador ¦ AT END declaracion-imperativa-1 ¦ declaracion-imperativa-2 WHEN condicion-1 NEXT SENTENCE _ ¦ WHEN condicion-2 -

declaracion-imperativa-3

_

NEXT SENTENCE

-

¦

La tabla nombrada (identificador) es buscada desde el valor actual del indice (por tanto, si se quiere que la busqueda empiece por el principio de la tabla, se debe inicializar el valor del indice por medio de la declaracion SET). Cuando termina la daclaracion SEARCH, el indice tiene el valor del elemento de la tabla para el cual la condicion es verdadera. Si se desea continuar una busqueda a partir de donde se interrupio se deja ejecutar de nuevo la declaracion SEARCH sin volver a restablecer el indice. El efecto de la declaracion SEARCH es el siguiente:

40

Se incicia una busqueda de la tabla indicada y se prueba la condicion que sigue al primer WHEN, caso de que la prueba resulte cierta se ejecuta la declaracion o delaraciones que siguen a dicha condicion y si no resulta cierta se realiza el mismo proceso para los sucesivos WHEN. Si la prueba resulta falsa para todas las condiciones, el indice se incrementa automaticamente en una unidad para repetir el ciclo con el segundo elemento. Si hecha la prueba de las distintas condiciones con todos los elementos de la tabla no se encuentra alguno que cumpla una de las condiciones, quiere decir que el valor buscado no existe en ningun elemento de la tabla por lo que se da por finalizada la busqueda con lo que pasaria a ejecutar la declaracion que sigue a AT END.

Es decir, de una forma mas esquematica, el proceso seria: a) Se prueba cada condicion o condiciones de la opcion mismo orden de su escritura.

WHEN en el

b) Si no se ha satisfecho ninguna de las condiciones se incrementa el indice de la tabla para poder hacer referencia al siguiente elemento de la misma y se repite el paso a). c) Si despues de la evaluacion se ha satisfecho una de las condiciones que siguen a WHEN, la busqueda concluye pasando a ejecutarse la declaracion imperativa asociada con tal condicion. El indice, en ese momento, contendra el numero del elemento de la tabla que satisfizo la condicion. d) Si se alcanza el final de la tabla sin haber satisfecho ninguna condicion de las que siguen a WHEN, la busqueda concluye pasando a ejecutarse la declaracion imperativa asociada con tal condicion. Si se omite AT END, la secuencia de ejecucion del programa pasa a la sentencia siguiente. e) Puede suceder que, al comienzo de la busqueda, el valor del indice sea superior al numero maximo de elementos de la tabla, en cuyo caso la busqueda concluye inmediatamente, pasando a ejecutar lo especificado en el caso d). Página 35

Manual Básico COBOL.txt

77 01

NOM LINEA1. 02 FILLER 02 NOMIN 02 FILLER 02 VENIM

PIC X(10)

VALUE 'JUAN GOMEZ'.

PIC PIC PIC PIC

VALUE VALUE VALUE VALUE

X(20) X(10) X(2) Z.ZZ9

SPACES. SPACES. SPACES. ZEROS.

41

01

TABLA. 02 ELEM OCCURS 45 TIMES INDEXED BY I. 03 NOMBRE PIC X(10). 03 VENTA PIC 9(4). ........................... ........................... PROCEDURE DIVISION. ........................... ........................... BUSQUEDA. SET I TO 1. SEARCH ELEMEN AT END GO TO NOEXISTE WHEN NOMBRE(I) = NOM MOVE NOMBRE(I) TO NOMIN MOVE VENTA(I) TO VENIM WRITE ................. GO TO FIN. NOEXISTE. ........................... ...........................

OPCION "VARYING" ================

Especificando en una declaracion SEARCH la opcion VARYING permite incrementar simultaneamente el indice asociado a la tabla en que se realiza la busqueda y una variable,identificador u otro indice asociado a otra tabla. (Es frecuente el empleo de esta opcion ya que hay trabajos en los que, ademas de buscar en una tabla al elemento que reuna determinadas condiciones, se necesita conocer el numero de orden que ocupa en la misma para, por ejemplo, acceder a otra tabla). SEARCH ELEMEN VARYING OTRO AT END ... ----

TABLAS DEFINIDAS CON MAS DE UN INDICE =====================================

En la definicion de una tabla puden utilizarse varios indices. En este caso es necesario conocer cual de esos indices es el que va a utilizar el sistema para la busqueda en la tabla. El empleo de uno

u

otro indice para realizar la busqueda esta Página 36

Manual Básico COBOL.txt en funcion de que se especifique o no, en la declaracion SEARCH, la opcion VARYING, es decir:

42

a) Si no se especifica la opcion VARYING, la busqueda en la tabla se realizara utilizando el primer indice de los que figuran en la clausula INDEXED BY. b) Si se especifica la opcion VARYING junto con el nombre de uno de los indices que figuran en la clausula INDEXED BY, este sera el que se utilice para realizar la busqueda. c) Puede suceder que en la opcion VARYING se especifique un indice distinto de los que figuran en la definicion de la tabla objeto de la busqueda (por ejemplo, el indice de otra tabla); en este caso la busqueda en dicha tabla se realiza, como en el apartado a), utilizando el primer indice que sigue a INDEXED BY.

01

TABLA. 02 FDIARIA OCCURS 1080 TIMES INDEXED BY I1, I2, I3. 03 AUTOS PIC 9(3). 03 CAMIONES PIC 9(2). ........................ ........................ SET I3 TO 125. SEARCH FDIARIA VARYING I3 AT END GO TO FIN WHEN ...................... ........................ ........................

(1)

SET I1 TO 125. SEARCH FDIARIA AT END GO TO FIN WHEN ...................... ........................ ........................

(2)

En (1) se utilizara I3 (de acuerdo con el apartado b)) y en (2) se utilizara I1 (conforme con el apartado a)).

BUSQUEDA BINARIA ================

La instruccion SEARCH ejecuta una busqueda secuencial, es decir, aun si la partida que se esta buscando esta cercana al final de la tabla, se examinan todas las partidas anteriores hasta que se llega a la que se busca. Este proceso se puede utilizar si los valores de los elementos de la tabla estan en secuencia o si no lo estan. Si las entradas de la tabla estan en secuencia se puede realizar un tipo de busqueda mas eficiente llamada busqueda BINARIA. Una busqueda binaria requiere un campo clave en cada entrada de la tabla. Se busca comprobando primero el valor del campo clave en el punto medio de la tabla. Si el valor que se esta

43

buscando es mayor, entonces se comprueba el valor del campo clave en el punto medio de la parte superior de la tabla. Y continua haciendo bisecciones en las partes restantes de la tabla hasta que se localiza la clave deseada. La busqueda binaria corta Página 37

Manual Básico COBOL.txt drasticamente el tiempo de acceso para muchas tablas (*). La descripcion de una tabla que procesara una busqueda binaria requiere de una entrada KEY (clave) ademas del indice. 01

TABLA. 02 ELEMEN

PIC 9(4)

La KEY (clave) puede ser (descendente).

OCCURS 20 TIMES INDEXED BY I ASCENDING KEY IS CLA. ASCENDING (ascendente) o

DESCENDING

(*) : El numero maximo de busquedas necesarias para localizar a un elemento de la tabla que contengan un valor determinado se obtiene por la expresion: x

x-1

2

>

numero de elementos de la tabla > 2

en la que "x" indica el numero maximo de busquedas; es decir, si la tabla contiene 235 elementos, el valor de "x" sera igual a "8" ya que: 8 2

7 >

235

> 2

DECLARACION "SEARCH ALL" =======================

Esta declaracion permite la busqueda descrita con la opcion INDEXED BY.

binaria en una tabla

El formato de esta declaracion es el siguiente: SEARCH ALL

identificador

AT END declaracion-imperativa-1 declaracion-imperativa-2 WHEN condicion NEXT SENTENCE

Las direcciones de los elementos de la tabla, a los que se ha de acceder hasta localizar al que contenga un valor determinado, los calcula el sistema automaticamente. No hay que inicializar con un valor el indice con la declaracion SET. El proceso que se sigue en la declaracion SEARCH ALL es el mismo que en la SEARCH, es decir:

44

a) Se prueba cada condicion de la opcion WHEN en el mismo orden de su escritura. b) Si no se ha satisfecho la condicion se incrementa el indice de la tabla para poder hacer referencia al siguiente elemento de la misma y se repite el paso a). c) Si despues de la evaluacion se ha satisfecho la condicion que sigue a WHEN, la busqueda concluye pasando a ejecutarse la declaracion imperativa asociada con tal condicion. El indice, en ese momento, contendra el numero del elemento de la tabla que satisfizo la condicion. d) Si se alcanza el final de la tabla sin haber satisfecho la condicion que sigue a WHEN, la busqueda concluye y, por tanto, si se ha especificado la opcion AT END se ejecutara la declaracion imperativa que sigue a dicha opcion. Si se omite AT END, la secuencia de ejecucion del programa pasa a la sentencia siguiente.

Página 38

Manual Básico COBOL.txt Pero, a diferencia de la SEARCH, en la SEARCH ALL se deben de tener en cuenta los siguientes puntos: 1.- Solo puede especificarse una palabra WHEN con una condicion, y esta condicion solo puede ser del tipo de relacion EQUAL TO (=) o compuesta enlazada por el operador logico AND. 2.- Los elementos de la tabla deben estar ordenados en forma ascendente (ASCENDING) o descendente (DESCENDING) por el contenido del campo objeto de la busqueda. 3.- La variable condicion.

77

NOM

01

TABLA. 02 ELEM

que

sea la KEY (clave) se debe incluir en la

PIC X(10)

VALUE 'JUAN GOMEZ'.

OCCURS 45 TIMES INDEXED BY I ASCENDING KEY NOMBRE. 03 NOMBRE PIC X(10). 03 VENTAS PIC 9(4). ................................... ................................... BUSQUEDA. SEARCH ALL ELEMEN AT END GO TO NOEXISTE WHEN NOMBRE(I) = NOM MOVE NOMBRE(I) TO ... MOVE VENTAS(I) TO ... GO TO FIN.

45

BUSQUEDA DICOTOMICA ===================

MENOR : PRIMER VALOR -1 MAYOR : ULTIMO VALOR +1

I : INDICE

______________ ¦ ¦ ¦ INICIALIZAR ¦ ¦ MAYOR ¦ ¦ MENOR ¦ -------------¦ ¦ ___________________________________ _______ SI ¦ NO ¦ -----¦ ESTA ¦ -------

¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦

MAYOR - MENOR = 1

¦ NO ¦ ____________________ ¦ ¦ MAYOR - MENOR ¦ I = ------------¦ 2

¦ ¦ ¦ ¦ Página 39

Manual Básico COBOL.txt -------------------¦ ¦

______ ¦ ESTA ¦ ------

= -----

¦ ¦ ¦ ¦ TABLA(I) ¦ . . > __________ ¦ ---------¦ MOVE I ¦ ¦ . . ¦ TO MAYOR ¦ ¦ BUSQUEDA ---------¦ ¦ ¦ < ¦ ¦ ¦ __________ ¦ ¦ MOVE I ¦ ¦ ¦ TO MENOR ¦ ---------------------------------------

46

LITERALES. ____________

Para incluir un apostrofe (') en un literal hay que poner dos.

EJEMPLO: 01 LITERAL

PIC x(5)

VALUE '''DOS'''.

Si imprimimos, displayamos o preguntamos por este valor obtendremos 'DOS'. 01

LITERAL

PIC x(5)

VALUE '''DOS'.

En este caso el resultado sera 'DOS. El doble apostrofe ('') solo ocupa una posicion en el campo (').

FICHEROS ESDS. ________________

SELECT ddname ASSIGN TO AS-ddname (1) ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SECUENTIAL FILE STATUS IS status-file. (1) Si no se especifica AS- la ejecucion cancelara con un FILE STATUS '39'.

FILE STATUS '35'. ___________________

El file status '35' se produce cuando tratamos de leer un fichero VSAM vacio de nueva creacion. Para solucionarlo hay que definirlo como: SELECT OPTINAL ddname ASSIGN... . . FILE STATUS IS st-xxxxxxx.

Y aceptar el FILE STATUS '05' que nos devuelve cuando lo abrimos como correcto.

Página 40

Manual Básico COBOL.txt IF st-xxxxxx = '00' OR = '05' CORRECTO END-IF.

47

PASAR DATOS EN CICS COBOL II. ______________________________

INSTRUCCION SET: FORMATO 5. _________________________ ¦ ¦ V ¦ >>___SET________identif-4____________TO___identif-6_____________>< ¦_ADDRESS OF identif-5__¦ ¦_ADDRESS OF identif-7_¦ ¦______NULL____________¦ -----Campo receptor-----

-----Campo emisor------

La direccion contenida en el emisor reemplaza el contenido actual del receptor. Identif-4. Debe estar definido como USAGE IS POINTER. Identif-5. Debe ser un area a nivel 01 o 77 en la LINKAGE. Identif-6. No puede contener una direccion de la propia WORKING o FILE SECTION. No puede ser un campo de coma flotante. A_OF identif-7. Pasa la direccion del identif-7, no su contenido.

ADDRESS OF... Registro especial. Por cada registro a nivel 01 o 77 de la LINKAGE existe un registro especial ADDRESS OFF. Este registro guarda la direccion del area, si este area esta redefinida la direccion ADDRESS OF sera la misma para todas las definiciones de la misma.

POINTER

Un campo pointer es un item elemental no numerico de 4 bytes. Solo puede usarse en: . La instruccion SET. . En una comparacion. . En la USING de una CALL o en la cabecera de la PROCEDURE. Si se quiere mover un puntero a un campo numerico el pointer tendra que redefinirse como PIC S9(8) COMP.

48

EJEMPLOS. ___________

WORKING SECTION. 01 01

APUNTADOR-1 USAGE IS POINTER. RAPUN-1 REDEFINES APUNTADOR-1 PIC S9(8) COMP. Página 41

Manual Básico COBOL.txt

LINKAGE SECTION. 01

DFHCOMMAREA. 03 APUN-DIRCOM USAGE IS POINTER. 03 DIRCOM REDEFINES APUN-DIRCOM PIC S9(8) COMP.

01

DATOS-RECIBIDOS. 03 MOVTOS290 03 RETORNO

PIC X(290). PIC X.

COPY CWAAREC.

PROCEDURE DIVISION. SET ADDRESS OF DATOS-RECIBIDOS TO APUN-DIRCOM. EXEC CICS ADDRESS CWA(APUNTADOR-1) END-EXEC. SET ADDRESS OF CWAARE TO APUNTADOR-1. EXEC CICS ADDRESS CWA(ADDRESS OF CWAARE) Esta instruccion es END-EXEC. equivalente a las dos anteriores.

49

RUTINA GENERAL DE CONVERSION DE FECHAS **************************************

FUNCION:

Convierte fechas en funcion de la opcion recibida.

PARAMETROS: 1. Opcion (De 1 a 6) PIC X. Requerido en entrada 2. Fecha en formato juliano PIC S9(7) COMP-3 Campo de entrada/salida segun opcion 3. Fecha en formato DDMMAA o AAMMDD PIC X(6) Campo de entrada/salida segun opcion

OPCIONES : 1. 2. 3. 4. 5.

De De De De De

Juliana a AAMMDD Juliana a DDMMAA AAMMDD a Juliana DDMMAA a Juliana AAMMDD a Juliana semestral

En todas las opciones enviar el campo deseado recibiendose el convertido en el otro campo. La opcion 5 calcula la fecha juliana referida al comienzo del semestre.

FORMA DE INVOCAR: CALL 'SUTLD001' USING FECHA-OPCION FECHA-JULIANA FECHA-NORMAL

50 Página 42

Manual Básico COBOL.txt

EJEMPLO: .......................................... 77 77 77

FECHA-OPCION FECHA-JULIANA FECHA-NORMAL

PIC X. PIC S9(7) COMP-3. PIC X(6).

.......................................... MOVE EIBDATE TO FECHA-JULIANA. MOVE '2' TO FECHA-OPCION. CALL 'SUTLD001' USING FECHA-OPCION FECHA-JULIANA FECHA-NORMAL. ..........................................

En este ejemplo enviamos la fecha en juliana y nos sera devuelta en formato DDMMAA.

51

RUTINA CONVERSION DE BITS A BYTES *********************************

FUNCION:

Convierte los 8 bits de un byte a 8 bytes y viceversa.

LENGUAJE:

Assembler

PARAMETROS: 1. Opcion (1 o 2) PIC X. Requerido en entrada 2. Byte que contiene los 8 bits. PIC X. Campo de entrada/salida segun opcion 3. Campo que contiene los 8 bytes. PIC X(8) Campo de entrada/salida segun opcion

OPCIONES : 1. Expande los 8 bits sobre los 8 bytes 2. Comprime los 8 bytes sobre los 8 bits. En las dos opciones enviar el campo deseado recibiendose el convertido en el otro campo. Si la opcion no fuera ni 1 ni 2 se devolveria un 9 en el propio campo de opcion.

FORMA DE INVOCAR: CALL 'SUTLA002' USING W-SUTLA002

52

Página 43

Manual Básico COBOL.txt EJEMPLO: WORKING-STORAGE SECTION. COPY CUTLD002 01

W-SUTLA002. 03 W-OPCION 03 W-BITS8 03 W-BYTES8. 05 BIT7 05 BIT6 05 BIT5 05 BIT4 05 BIT3 05 BIT2 05 BIT1 05 BIT0

PIC X. PIC X. PIC PIC PIC PIC PIC PIC PIC PIC

X. X. X. X. X. X. X. X.

.......................................... PROCEDURE DIVISION. MOVE '1' TO W-OPCION. MOVE BAINDI2I TO W-BITS8. CALL 'SUTLA002' USING W-SUTLA002. ..........................................

En este ejemplo enviamos el BAINDI2I declarado como PIC X a la rutina y nos devolvera su contenido en los 8 bytes de W-BYTES8. Todos los BAINDI2I que tengan en el organismos.

BIT7

un 1

se refieren a

53

RUTINA GENERAL DE VERIFICACION DE DIGITOS *****************************************

FUNCION:

Calcula digito en funcion de la opcion recibida

LENGUAJE:

Cobol

PARAMETROS: 1. CODIGO DE RETORNO PIC X Obtenido en salida ' ' : proceso correcto '9' : digito de control enviado no coincide con el calculado (Salvo en opcion 5) 2. DIGITO. PIC 9 Obtenido en salida (Resultado del calculo) 3. OPCION. PIC x Requerido en '1' : Digito '2' : Digito '3' : Digito '4' : Digito

entrada de tarjetas de cuentas clave SICA de Codigo Cliente Página 44

(enviar 12 dig.) (enviar 12 " ) (enviar 9 " ) (enviar 12 " )

Manual Básico COBOL.txt '5' : Digito DNI Hacienda/Comunitario (enviar 9 " ) En esta opcion se mandan los datos sin digito. El retorno es 9 si lo enviado no es numerico). 4. DATOS (N. tarjeta, N. cuenta etc.) PIC X(16) Requerido en entrada

FORMA DE INVOCAR: CALL 'SUTLD005' USING RETORNO DIGITO OPCION DATOS.

54

EJEMPLO: .......................................... 77 77 77 77

RETORNO DIGITO OPCION DATOS

PIC PIC PIC PIC

X. 9. X. X(16).

.......................................... MOVE '1' TO OPCION. MOVE '453952000125008' TO DATOS. CALL 'SUTLD005' USING RETORNO DIGITO OPCION DATOS. IF RETORNO NOT = '9' .......................................... En este ejemplo se envia un numero de tarjeta VISA con el digito incluido, para ser verificado. Si retorno not = 9 el digito es correcto. Comprobar si la cuenta es correcta devolviendo el codigo de retorno al calcular el digito. .......................................... 77 77 77 77

RETORNO DIGIT OPCION DATOS

PIC PIC PIC PIC

X. 9. X. X(16).

.......................................... 01 CUENTA-DIGITO. 02 AHO PIC 999. 02 OFI PIC 999. 02 CTA PIC 9(6). 02 DIGIT PIC 9. 01 CUENTA-DIGITO2. 02 AHO PIC 999. 02 FILLER PIC X VALUE 0. 02 OFI PIC 999. 02 CTA PIC 9(6). 02 DIGIT PIC 9. CALCULAR-DIGITO. MOVE CUENTA TO CUENTA-DIGITO MOVE '2' TO OPCION MOVE CORR CUENTA-DIGITO TO CUENTA-DIGITO2 MOVE CUENTA-DIGITO2 TO DATOS CALL 'SUTLA005' USING RETORNO DIGITO OPCION DATOS. IF RETORNO = ' ' DIGITO CORRECTO - CUENTA CORRECTA ELSE DIGITO ERRONEO - CUENTA INCORRECTA.

Página 45

Manual Básico COBOL.txt 55

R U T I N A S D E C A L C U L O ************************************

----NUMERO DE DIAS ENTRE DOS FECHAS ----****************************************************

WORKING-STORAGE SECTION. ******** 01 CAMPOS-NUMERICOS. 03 NUMDIAS PIC S9(5) 03 CONTANOS PIC S9(5) 03 D PIC S9(3) 03 FECHA-DESDE PIC 9(6). 03 FILLER REDEFINES FECHA-DESDE. 05 DD-DESDE PIC 99. 05 MM-DESDE PIC 99. 05 AA-DESDE PIC 99. 03 FECHA-HASTA PIC 9(6). 03 FILLER REDEFINES FECHA-HASTA. 05 DD-HASTA PIC 99. 05 MM-HASTA PIC 99. 05 AA-HASTA PIC 99.

COMP-3 VALUE +0. COMP-3 VALUE +0. COMP-3 VALUE +0.

****>>>>>>>> TABLA DE MESES CON DIAS 01 FILLER. 03 T1-DIAS PIC X(48) VALUE '013102280331043005310630073108310930103111301231'. 03 T2-DIAS REDEFINES T1-DIAS OCCURS 12 TIMES. 05 MES PIC 99. 05 DIA PIC 99.

PROCEDURE DIVISION. XXXX-CALCULO-DIAS. ****************** MOVE ZEROS MOVE MM-DESDE MOVE AA-DESDE

TO NUMDIAS. TO D. TO CONTANOS.

56

PERFORM UNTIL CONTANOS = AA-HASTA AND D = MM-HASTA ADD DIA(D) TO NUMDIAS ADD CN-1 TO D IF D > CN-12 MOVE CN-1 TO D MOVE CN-1 TO CONTANOS END-IF IF CONTANOS = CN-100 MOVE ZEROS TO CONTANOS END-IF END-PERFORM. SUBTRACT DD-DESDE ADD DD-HASTA

FROM NUMDIAS TO NUMDIAS.

XXXX-CALCULO-DIAS-EXIT. *********************** EXIT. Página 46

Manual Básico COBOL.txt

**************************************************** ----NUMERO DE MESES ENTRE DOS FECHAS ----**************************************************** WORKING-STORAGE SECTION. ******** 01 CAMPOS-NUMERICOS. 03 MESES PIC S9(3) 03 CONTANOS PIC S9(3) 03 FECHA-DESDE PIC 9(6). 03 FILLER REDEFINES FECHA-DESDE. 05 DD-DESDE PIC 99. 05 MM-DESDE PIC 99. 05 AA-DESDE PIC 99. 03 FECHA-HASTA PIC 9(6). 03 FILLER REDEFINES FECHA-HASTA. 05 DD-HASTA PIC 99. 05 MM-HASTA PIC 99. 05 AA-HASTA PIC 99.

COMP-3 VALUE +0. COMP-3 VALUE +0.

****>>>>>>>> TABLA DE MESES CON DIAS 01 FILLER. 03 T1-DIAS PIC X(48) VALUE '013102280331043005310630073108310930103111301231'. 03 T2-DIAS REDEFINES T1-DIAS OCCURS 12 TIMES. 05 MES PIC 99. 05 DIA PIC 99.

57

PROCEDURE DIVISION. XXXX-CALCULO-MESES. ******************* MOVE ZEROS TO MESES. MOVE AA-DESDE TO CONTANOS. PERFORM WITH TEST BEFORE UNTIL CONTANOS = AA-HASTA ADD CN-12 TO MESES ADD CN-1 TO CONTANOS IF CONTANOS = CN-100 SUBTRACT CN-100 FROM CONTANOS END-IF END-PERFORM. ADD MM-HASTA TO MESES. SUBTRACT MM-DESDE FROM MESES. XXXX-CALCULO-MESES-EXIT. ************************ EXIT.

**************************************************** ----RESTAR UN PERIODO A UNA FECHA ----**************************************************** WORKING-STORAGE SECTION. ******** 01 CAMPOS-NUMERICOS. 03 MESES PIC S9(3) 03 CONTANOS PIC S9(3) 03 FECHA-DESDE PIC 9(6). 03 FILLER REDEFINES FECHA-DESDE.

COMP-3 VALUE +0. COMP-3 VALUE +0.

Página 47

Manual Básico COBOL.txt 05 DD-DESDE PIC 99. 05 MM-DESDE PIC 99. 05 AA-DESDE PIC 99. 03 FECHA-HASTA PIC 9(6). 03 FILLER REDEFINES FECHA-HASTA. 05 DD-HASTA PIC 99. 05 MM-HASTA PIC 99. 05 AA-HASTA PIC 99. ****>>>>>>>> TABLA DE MESES CON DIAS 01 FILLER. 03 T1-DIAS PIC X(48) VALUE '013102280331043005310630073108310930103111301231'. 03 T2-DIAS REDEFINES T1-DIAS OCCURS 12 TIMES. 05 MES PIC 99. 05 DIA PIC 99.

Página 48

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF