Manual Básico COBOL.txt

Anuncio
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 ( <= ) ¦
sentencia SET para
condicion. Ejemplo :
cambiar
el
Página 5
estado
de
los
Manual Básico COBOL.txt
¦ SET ESTADO TO TRUE [ 88 ESTADO VALUE '2'. ]
¦
¦
¦
¦ EQUIVALE A MOVER 2 AL NIVEL 01 DE ESTADO.
¦
con lo cual tambien
bres de condicion.
se
potencia
el
uso
de
los
nom-
4
2) OTRAS
en
en
en
CONDICIONES.
operaciones
operaciones
operaciones
3) TERMINADORES
aritmeticas
:
de mover datos
:
de entrada/salida :
EXPLICITOS
DE
NOT
NOT
NOT
NOT
NOT
ON SIZE ERROR
ON OVERFLOW
INVALID KEY
AT END
AT END-OF-PAGE
SENTENCIAS
END-ADD
END-DIVIDE
END-PERFORM
END-SEARCH
END-UNSTRING
END-CALL
END-EVALUATE
END-READ
END-START
END-WRITE
END-COMPUTE
END-IF
END-RETURN
END-STRING
END-WRITE
END-DELETE
END-MULTIPLY
END-REWRITE
END-SUBTRACT
cuando el compilador
lo asocia al ultimo
solo son validos en
encuentra un terminador explicito,
verbo no emparejado.
las sentencias con forma condicional.
Ejemplo:
¦ ADD 1 TO CONTADOR
¦
ON SIZE ERROR SET ERROR-OPERACION TO TRUE
¦ END-ADD
con
su
uso
4) LLAMADA
se
A
puede
eliminar
practicamente
¦
¦
¦
el uso de "."
SUBPROGRAMAS
¦ CALL [ IDENTIFICADOR-1 / LITERAL ]
¦
¦
USING BY REFERENCE IDENTIF-2 .................
¦
¦ *
USING BY REFERENCE ADDRESS OF NOMBRE-REG .....
¦
¦
USING BY CONTENT IDENTIF-3 ....... / LITERAL /
¦
¦
LENGTH OF IDENTIF-3
5
Página 6
¦
¦
¦
¦
¦
¦
¦
¦
¦
Manual Básico COBOL.txt
BY
REFERENCE:
el valor del parametro pasado se evalua en el momento de la CALL y es asignado al correspondiente del
programa llamado el cual puede procesarlo.
BY
en
el
CONTENT:
este caso el
valor pasado.
programa
llamado
no
puede
modificar
---> 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). <------ '$bbbb' o '$$$$$'.
10 NOMBRE-TAB PIX 9(5).
INITIALIZE TABLA-ENTRADA
REPLACING ALPHANUMERIC DATA BY [ALL] '$'.
--------------------
26
01
TABLA VALUE 'A'.
05 ELEMENTO OCCURS 5 TIMES PIC X.
----------¦A¦A¦A¦A¦A¦
----------1 2 3 4 5
INSTRUCCIONES DE TABLAS
-----------------------
01 TABLA-1.
05 TABLA-ENTRY OCCURS 10 TIMES INDEXED BY IND-1.
10 TABLA-ENTRY2 OCCURS 5 TIMES
ASCENDING KEY IS KEY1
INDEXED BY IND-3.
20 KEY1
PIC X(5).
20 KEY2
PIC X(10).
SET IND-1 TO 2.
SEARCH TABLA-1
AT END ..............
WHEN tabla-ENTRY3 (IND-1, IND-2, IND-3) = '.......'
WHEN .........
WHEN .........
WHEN .........
END-SEARCH.
INSTRUCCION EVALUATE.
---------------------
EVALUATE TRUE
WHEN ESTADO-CASADO
.................
WHEN ESTADO-SOLTERO
.................
END-EVALUATE.
EVALUATE
WHEN
CODIGO = 'A'
TRUE
..................
..................
WHEN
TRUE
..................
..................
END-EVALUATE.
VALOR-1 > 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 <-------- Todo
INTO CAMPO-7
WITH POINTER CAMPO-8. <---------- Contiene el numero de
caracter a transmitir
(no < 1 ni > que la
variable receptora).
campo-4
campo-1
campo-2
___________
___________
_____
¦6¦7¦8¦9¦*¦0¦
¦1¦2¦3¦*¦4¦5¦
¦A¦*¦B¦
------------------------___________________________________
¦1¦2¦3¦A¦6¦7¦8¦9¦*¦0¦b¦b¦b¦b¦b¦b¦b¦b¦
----------------------------------campo-8
__
campo-3
_
¦*¦
-
la opcion
Página 25
¦11¦
-inicializar a 1
antes de la
ejecucion
Manual Básico COBOL.txt
[ON OVERFLOW sentencia-imperativa]
se ejecutara cuando se excedan
los limites
INSTRUCCION UNSTRING.
----------------------
UNSTRING
INTO
CAMPO-ORIGEN DELIMITED
CAMPO-FINAL-1 DELIMITED
CAMPO-FINAL-2 DELIMITED
CAMPO-FINAL-3 DELIMITED
CAMPO-FINAL-4
WITCH POINTER APUNTADOR
TALLYING IN CONTADOR-TOTAL
ON OVERFLOW GO TO .......
BY
IN
IN
IN
DELIMITADOR OR ALLL '*'
MARCA-1 COUNT IN CUENTA-1
MARCA-2
MARCA-3 COUNT IN CUENTA-3
COUNT IN CUENTA-3
delimitador
en ejecucion
_
¦?¦
campo-origen
_________________________________
¦1¦2¦3¦*¦*¦4¦5¦6¦?¦?¦7¦A¦B¦C¦D¦E¦F¦
---------------------------------
29
campo-final-1
___________
¦1¦2¦3¦b¦b¦b¦
-----------
marca-1
_
¦*¦
-
campo-final-2
_________
¦4¦5¦6¦b¦b¦
---------
marca-2
_
¦?¦
-
campo-final-3
_____
¦b¦b¦b¦
-----
marca-3
_
¦?¦
-
campo-final-4
_________
¦7¦A¦B¦C¦D¦
---------
cuenta-1
_
¦3¦
-
cuenta-3
_
¦0¦
cuenta-4
_
¦5¦
-
apuntador
contador-total
__
__
¦18¦
¦05¦ <-------+------ inicializados a 1
--¦
antes de la ejecucion.
¦
¦
+------------------------------+
INSTRUCCION READ
----------------
READ nombre-fichero
AT END ..........
Página 26
Manual Básico COBOL.txt
NOT AT END ......
END-READ.
C O B O L
II : S O R T
=============================
FILE SECTION.
-----------SD file-name1
DATA RECORD IS .......
01 .........
En la SD se define el fichero que vamos a ordenar.
30
PROCEDURE DIVISION.
------------------
SORT file-name1
---_
ON
¦
¦
¦
¦
_
ASCENDING
--------DESCENDING
----------
-
¦
¦
¦
¦
--
KEY
data-name1, data-name2,....
[COLLATING SEQUENCE IS alphabet-name]
-------__
USING
file-name2 ...
----INPUT PROCEDURE
--------------_
¦ THROUGH
IS section-name1 [¦ ------¦ THRU
¦ ----
¦
¦
¦
¦
¦
¦
¦
¦
¦
¦
__
_
¦
¦
¦
¦
--
--
__
GIVING file-name3 ...
----OUTPUT PROCEDURE
---------------_
¦ THROUGH
IS section-name3 [¦ ------¦ THRU
¦ ----
¦
¦
¦
¦
¦
¦
¦
¦
¦
¦
--
*-->> 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
Descargar