Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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
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
20
22
22
23
24
24
evaluate .....................................
string .......................................
unstring .....................................
read .........................................
26
28
28
29
29
30
31
32
32
32
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
41
41
42
43
45
46
46
47
47
47
48
EJEMPLOS DE 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
COMMON PROGRAM
INITIAL PROGRAM
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 un programa contenido en otro y puede ser llamado tambien por otros.
--> 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.
3
esta clausula define un ITEM de datos "PUNTERO" de nivel elemental, no numerico y de 4 bytes.
puede usarse en operaciones de comparacion o en "MOVE"
a otros ITEMS "PUNTEROS".
Tambien en :
- sentencia SET.
- En una condicion de relacion.
- En la "USING" de una "CALL", "ENTRY" o cabecera
de "PROCEDURE DIVISION".
2) NIVELES DE TABLAS.
* pueden tener hasta siete niveles, dimensiones.
* por tanto podra haber hasta siete anidamientos de
clausulas OCCURS.
* Un ITEM podra referenciarse subscrito o indexado por 7.
* en las tablas de longitud variable (DEPENDING ON) el
minimo numero de ocurrencias podra ser cero.
ALPHABETIC-UPPER
4
2) OTRAS CONDICIONES.
en operaciones aritmeticas
: NOT ON SIZE ERROR
en operaciones de mover datos : NOT ON OVERFLOW
en operaciones de entrada/salida : NOT INVALID KEY
NOT AT END
NOT AT END-OF-PAGE
3) TERMINADORES EXPLICITOS DE 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
ADD 1 TO CONTADOR
4) LLAMADA A SUBPROGRAMAS
CALL [ IDENTIFICADOR-1 / LITERAL ]
*
USING BY REFERENCE ADDRESS OF NOMBRE-REG .....
LENGTH OF IDENTIF-3
5
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 CONTENT:
en este caso el programa llamado no puede modificar
el valor pasado.
---> 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
-------------------
SENTENCIA CANCEL
=================
CANCEL IDENTIFI-1 / LITERAL
se cancela un programa llamado, de tal forma que la
proxima llamada lo pondra en su estado inicial.
*** los subprogramas han de terminar con GOBACK o EXIT
PROGRAM
*** los efectos siempre son jerarquicos, en caso de programas anidados
*** todo ello fortalece la recursividad en el COBOL
6
SENTENCIA EVALUATE
===================
EVALUATE IDENTIFIC-1
LITERAL
EXPRESION
TRUE
FALSE
ALSO ...... (VARIOS)
WHEN
FRASE-1
SENTENCIA IMPERATIVA
NOT IDENTIFI-1
LITERAL
EXPR.ARIT. THRU (las mismas )
--> FRASE-2 puede ser :
ANY
CONDICION-2
TRUE
FALSE
NOT (igual anterior) THRU (igual)
7
* las expresiones a evaluar se lleman sujeto de la seleccion y el resultado objeto de la seleccion.
* los pares de sujetos y objetos deben ser de la misma clase (numerico, caracter, condicion TRUE o FALSE).
* usar la EVALUATE para seleccionar el proceso de un
conjunto de acciones.
* en una EVALUATE pueden especificarse hasta 255 sujetos y objetos.
* la ejecucion de una EVALUATE
- la declaracion asociada con
- la declaracion asociada con
- ninguna condicion "WHEN" es
finaliza cuando:
una "WHEN" es seleccionada.
una "WHEN OTHER" es SELECC.
seleccionada.
* las "WHEN" son comprobadas en el orden de especificacion, por tanto se codificaran en orden de probabilidad.
* Dos operandos relacionados con una "THRU" deben ser
de la misma clase.
* 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.
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 'SEOR' TO CAMPO1
WHEN EDAD > 18 ALSO SEXO = 'F'
MOVE 'SEORITA' TO CAMPO1
WHEN OTHER
MOVE 'NO VALIDO' TO CAMPO1
END-EVALUATE
SENTENCIA INITIALIZE
=====================
INITIALIZE IDENTIF-1 ........
[ REPLACING
ALPHABETIC
ALPHANUMERIC
NUMERIC
ALPHANUMERIC-EDITED
NUMERIC-EDITED
DATA BY INDENTIF-A
LITERAL ]
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 CON UNTIL :
PERFORM NOMBRE-PROC1
[ THRU NOMBRE-PROC2 ]
10
INDEX-2
LITERAL
BY IDENT-3
UNTIL CONDICION-1
INDEX-3
AFTER ...
FROM .....
[ DECLARACION IMPERATIVA
END-PERFORM ]
sus nuevas funciones y amflancos que le hacian vulrespecto al desfase con las
lenguajes ultimamente desar-
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 cabo la depuracion se debe compilar con la opcion TEST.
11
4.- un programa es reentrante cuando
do por varios usuarios o tareas
en COBOL II, la opcion es RENT.
esta opcion, tambien es necesario
cion RESIDENT.
COMPILARSOPORTE DE DEPURACIONDEPURACION
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 modo FULL SCREEN.
* en modo de edicion de linea.
al utilizarlo de forma interactiva, el programador puede:
* Controlar y visualizar el flujo del programa.
* Alterar temporalmente la logica del programa.
* Ejecutar y re-ejecutar todo o parte de un programa utilizando diferentes valores de datos.
* Inspeccionar y modificar campos de datos en punto seleccionados del programa.
------> ES PRERREQUISITO DISPONER DEL ISPF VERSION 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
te
JCL
la
opciones de compilacion pueden especificarse medianla ficha CBL o su sinonimia PROCESS, tambien via
en la sentencia EXEC que llama al compilador, en
PARM :
//COMPILE EXEC PGM=IGYCRCTL,PARM='XREF,SSRANGE,MAP'
para modificar las opciones por defecto se usa la macro IGYCOPT, que se ensamblara y catalogara como modulo
IGYCDOPT.
tre
te
ten
es
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
EL PROGRAMA X LLAMA AL Y
EL Y LLAMA AL Z
Y EL Z LLAMA AL X
A esto se le denomida una RECURSIVE CALL. Si se intenta ejecutar una CALL RECURSIVA a un programa COBOL la RUN UNIT
termina anormalmente (ABEND).
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.
14
+--------------+-------------+-------------------------------------+
Tipo programa Finaliza con:
Efectos que causa
+--------------+-------------+-------------------------------------+
MAIN PROGRAM STOP RUN
Termina la RUN UNIT y deletea
(programa
+--------------+-------------+-------------------------------------+
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
control al llamante.
+--------------+-------------+-------------------------------------+
SUBPROGRAMA: Una sentencia EXIT PROGRAM implicita es gene-
cutable
+------------------------------------------------------------------+
Un subprograma es usualmente
de uso (LAST-USED STATE), cuando
GOBACK. La siguiente vez que es
nidad de ejecucion) sus valores
dejados, excepto los valores de
PERFORM que seran restaurados a
trario, un programa principal es
llamado. Hay dos excepciones:
dinamicamente por un
II VS y luego es canestara en el estado
es llamado.
15
LLAMANDO PROGRAMAS
------------------Se pueden usar diferentes metodos para transferir control
a otro programa. Esto incluye :
1.- CALLs a programas anidados.
2.- CALLS estaticas a otros programas COBOL II VS compilados
separadamente.
3.- CALLs dinamicas a otros programas COBOL II VS compilados
separadamente.
4.- CALLs a programas en otros lenguajes incluyendo PLI,
FORTRAM, y COBOL OS/VS.
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-.
16
PROGRAMAS ANIDADOS
------------------Los programas anidados proporcionan un metodo mediante el
cual se pueden crear funciones modulares (modular functions)
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.
17
EJEMPLO:
-------+-- Programa X
------- .......
Call X1
Call X2
.......
Stop run
+-- Programa X1
-------
........
Call X11
Call X12
........
Stop run
+-- Programa X11
-------
........
........
Exit Program
+-- End Program X11
+-- Programa X12
-------
........
........
Exit Program
+-- End Program X12
+-
+-- Programa X2
-------
.........
.........
Exit Program
+-- End Program X2
18
NORMAS PARA EL USO DE ESTRUCTURA DE PROGRAMAS ANIDADOS
-------------------------------------------------------------Hay varias normas que aplicar cuando se utilizan estructuras
de programas anidados:
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.
19
EJEMPLO:
-------+-- Program-id. A
----------
+-- Program-id. A1
----------
+-- Program-id. A11
----------
+-- Program-id. A111
----------
+-- End Program A111
+-- End Program A11
+-- End Program A1
+----------+----------------+-----------------------+
A
A1,A2,A3
Ninguno
+----------+----------------+-----------------------+
A1
A11,A12,A2,A3 A
+----------+----------------+-----------------------+
A11
A111,A12,A2,A3 A1
+----------+----------------+-----------------------+
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 A1 proque no es COMMON y
no esta contenido en A2
.- que A111 no puede llamar a A11 porque eso seria una
CALL RECURSIVA.
.- que A1 puede llamar a A2 porque A2 es COMMON.
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
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 01 de la descripcion
del dato en la working de un programa y se aplican las siguientes reglas:
1.- Los items subordinados a un grupo de items EXTERNAL,
23
Cualquier cambio que el subprograma haga afecta al dato en
el programa llamante.
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 compartidos entre programas COBOL. Esto es solamente para
pasar la DCB a programas assembler.
Si se quiere pasar la direccion del area de registro a un
programa llamado se debe especificar :
CALL ... BY REFERENCE ADDRESS OF -RECORD NAMEEl subprograma recibe el ADDRESS SPECIAL REGISTER (Registro especial de direccion) para el nombre de registro que se especifico.
Se debe definir el nombre de registro como un nivel 01 o
77 en la LINKAGE SECTION de los programas llamante y llamado.
Si se quiere pasar la longitud del item se especificara:
CALL ... BY CONTENT LENGTH OF -IDENTIFICADOREl programa llamante pasa la longitud del -identificadordesde su LENGTH special register (registro especial de longitud).
Cuando los literales son pasados mediante BY CONTENT el programa llamado no puede cambiar el valor.
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.
01 USING-LIST
05 PARTCODE PIC A.
+----------------------------+
+------------------------+
.
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.
10 NOMBRE-TAB PIC X(5). <------ '$bbbb' o '$$$$$'.
10 NOMBRE-TAB PIX 9(5).
INITIALIZE TABLA-ENTRADA
REPLACING ALPHANUMERIC DATA BY [ALL] '$'.
-------------------26
01
----------AAAAA
----------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.
INDICADOR
TRUE
ANY
27
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
___________
___________
_____
6789*0
123*45
A*B
------------------------___________________________________
123A6789*0bbbbbbbb
----------------------------------campo-8
__
11
-inicializar a 1
antes de la
ejecucion
campo-3
_
*
-
la opcion
[ON OVERFLOW sentencia-imperativa]
se ejecutara cuando se excedan
los limites
INSTRUCCION UNSTRING.
---------------------UNSTRING CAMPO-ORIGEN DELIMITED
INTO 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
en ejecucion
_
?
campo-origen
_________________________________
123**456??7ABCDEF
---------------------------------
29
campo-final-1
___________
123bbb
-----------
marca-1
_
*
-
cuenta-1
_
3
-
campo-final-2
_________
456bb
---------
marca-2
_
?
-
campo-final-3
_____
bbb
-----
marca-3
_
?
-
campo-final-4
_________
7ABCD
---------
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 ..........
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
----------
--
----
INPUT PROCEDURE
--------------_
_
THROUGH
---
---
__
__
GIVING file-name3 ...
----
OUTPUT PROCEDURE
---------------_
_
THROUGH
---
---
31
*-->> COLLATING SEQUENCE : Especifica la secuencia a seguir para
usar en las comparaciones no numericas
para el campo clave en la opercion de
ordenar.
*-->> USING : 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 : 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.
*-->> GIVING : 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]
----
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
33
PICTURE
PICTURE
PICTURE
PICTURE
PICTURE
"
"
"
PICTURE
PICTURE
PICTURE
A(6).
X(8).
999.
999.
999.
"
"
"
999.
999.
999.
PICTURE A(6).
PICTURE X(8).
PICTURE 999.
FORMATO 3:
--------_
_
OCCURS entero-1 TO entero-2 TIMES DEPENDING ON nombre-de-datos-1
-----_ ASCENDING
_
_ _
--------- KEY IS nombre-de-datos-2 nombre-de-datos-3 ......
- DESCENDING
----------
35
_
_
_
_
INDEXED BY nombre-de-indice-1 nombre-de-indice-2 ...
En este formato incluye a los dos anteriores, aadiendo 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.
TABLAS
______
Una TABLA es una serie de datos con el mismo formato dispuestos
consecutivamente en memoria.
La serie de datos, al tener el mismo formato, se puede describir
con un solo nombre.
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, en su
incluye una clausula OCCURS.
descripcion,
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 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 '.
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.
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 nombre-indice-2
SET
... TO
nombre-indice-3
identificador-3
literal
UP BY
identificador
DOWN BY
literal
identificador-1 identificador-2
39
SET INDICE BETA TO SUM.
SET INDICE TO 46.
SET INDICE UP BY 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"
====================
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
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 WHEN en el
mismo orden de su escritura.
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).
77 NOM
01 LINEA1.
02 FILLER
02 NOMIN
02 FILLER
02 VENIM
PIC X(10)
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 ...
----
(1)
SET I1 TO 125.
SEARCH FDIARIA AT END GO TO FIN
WHEN ......................
........................
........................
(2)
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
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
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
x-1
> numero de elementos de la tabla > 2
PIC X(10)
01 TABLA.
02 ELEM 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 ...
45
BUSQUEDA DICOTOMICA
===================
MENOR : PRIMER VALOR -1
MAYOR : ULTIMO VALOR +1
I : INDICE
______________
INICIALIZAR
MAYOR
MENOR
-------------
___________________________________
_______
SI
NO ----- ESTA
-------
NO
____________________
MAYOR - MENOR
I = -------------
-------------------
TABLA(I)
______
=
. .
>
__________
-----. .
TO MAYOR
BUSQUEDA
---------
<
__________
MOVE I
----------
46
LITERALES.
____________
Para incluir un apostrofe (') en un literal hay que poner dos.
EJEMPLO:
01 LITERAL
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'.
47
PASAR DATOS EN CICS COBOL II.
______________________________
INSTRUCCION SET: FORMATO 5.
_________________________
>>___SET________identif-4____________TO___identif-6_____________><
_ADDRESS OF identif-5__
_ADDRESS OF identif-7_
______NULL____________
-----Campo receptor-----
-----Campo emisor------
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 APUNTADOR-1 USAGE IS POINTER.
01 RAPUN-1 REDEFINES APUNTADOR-1 PIC S9(8) COMP.
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:
PARAMETROS:
1. Opcion (De 1 a 6)
PIC X.
Requerido en entrada
De
De
De
De
De
Juliana a AAMMDD
Juliana a DDMMAA
AAMMDD a Juliana
DDMMAA a Juliana
AAMMDD a Juliana semestral
50
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:
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
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
PIC X.
PIC X.
PIC
PIC
PIC
PIC
PIC
X.
X.
X.
X.
X.
05 BIT2
05 BIT1
05 BIT0
PIC X.
PIC X.
PIC 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 BIT7 un 1 se refieren a
organismos.
53
RUTINA GENERAL DE VERIFICACION DE DIGITOS
*****************************************
FUNCION:
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
(enviar
(enviar
(enviar
(enviar
12
12
9
12
dig.)
" )
" )
" )
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
02 DIGIT
PIC 9(6).
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.
55
R U T I N A S
D E C A L C U L O
************************************
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.
****************************************************
----- NUMERO DE MESES ENTRE DOS FECHAS
----****************************************************
WORKING-STORAGE SECTION.
********
01 CAMPOS-NUMERICOS.
03 MESES
PIC S9(3) COMP-3 VALUE +0.
03 CONTANOS
PIC S9(3) COMP-3 VALUE +0.
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.
****>>>>>>>> TABLA DE MESES CON DIAS
01 FILLER.
03 T1-DIAS
PIC X(48) VALUE
'013102280331043005310630073108310930103111301231'.
****************************************************
----- RESTAR UN PERIODO A UNA FECHA
----****************************************************
WORKING-STORAGE SECTION.
********
01 CAMPOS-NUMERICOS.
03 MESES
PIC S9(3) COMP-3 VALUE +0.
03 CONTANOS
PIC S9(3) COMP-3 VALUE +0.
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.
****>>>>>>>> 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.