cobol

60
 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 Bego¤a Ramos Barrios LLLLLLLLL I INDICE ANOTACIONES SOBRE ASPECTOS RELEVANTES DEL COBOL II. Cambios en el lenguaje cobol en 1.985 .................... 1 Formatos de programa fuente .............................. 1

Upload: ernesto-lopez

Post on 06-Jul-2015

800 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 1/60

 

CCCCCCCCCCCCCCCCCCCC

CCCCCCCCCCCCCCCC

OOOOOOOOOOOOOOOOOO OOOO OOOOOOOOOOOOOOOOOO

BBBBBBBBBBBBBBBBB BBBBBBBBBBBB BBBBBBBBBB

OOOOOOOOOOOOOOOOOO OOOO OOOOOOOOOOO

OOOOOOO

LLLLLLLLLLLLLLLL

Bego¤a Ramos Barrios LLLLLLLLL

I

INDICE

ANOTACIONES SOBRE ASPECTOS RELEVANTES DEL COBOL II.

Cambios en el lenguaje cobol en 1.985 .................... 1Formatos de programa fuente .............................. 1

Page 2: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 2/60

 

PROGRAMA ANIDADO.

Programa anidado ......................................... 1

CAMBIOS EN LA IDENTIFICATION DIVISION.

Cambios en la Identification Division .................... 1

CAMBIOS EN LA DATA DIVISION.

Comparticion de datos .................................... 2Nuevas clausulas en la definicion de items .......... 2Niveles de tablas ................................... 3

CAMBIOS EN LA PROCEDURE DIVISION.

Operaciones de condicion ................................. 3Otras condiciones ........................................ 4Terminadores explicitos de sentencias .................... 4Llamada a subprogramas ................................... 4LLamadas estaticas ....................................... 5LLamadas dinamicas ....................................... 5Sentencia cancel ......................................... 5Sentencia evaluate ....................................... 6Consideraciones sobre la evaluate ........................ 6

Ejemplos de evaluate ................................ 7Sentencia initialize ..................................... 8Nueva opciones de la perform ............................. 9

Aspectos adicionales ..................................... 10Depuracion con cobol II .................................. 11

Interactivamente .................................... 11Batch ............................................... 11Compilacion ......................................... 12

Compilaciones con programas secundarios .................. 12Llamada entre programas cobol II ......................... 12Transfiriendo control a otros programas .................. 13Programa principal y subprogramas ........................ 13

II

LLAMANDO PROGRAMAS.

Llamando programas ....................................... 15Programas anidados ....................................... 16Estructura de programas anidados ......................... 16Ejemplo .................................................. 17Normas para el uso de estructura de programas anidados ... 18Llamando a programas anidados ............................ 18

Ejemplo .................................................. 19

Page 3: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 3/60

 

CALL ESTATICAS Y DINAMICAS.

Call estaticas y dinamicas ............................... 20Utilizando call estatica ................................. 20Utilizando call dinamica ................................. 20Compartiendo datos usando el atributo external ........... 22Pasando datos mediante by refence or by content .......... 22

Describiendo items comunes en el programa llamante ....... 23Describiendo datos comunes en el programa llamado ........ 24Linkage section .......................................... 24

INSTRUCCIONES DE PROGRAMAS COBOL.

Instruccion inspect ...................................... 25Instruccion initialize ................................... 25

INSTRUCCIONES DE TABLAS.

Instruccion evaluate ..................................... 26Instruccion string ....................................... 28Instruccion unstring ..................................... 28Instruccion read ......................................... 29

COBOL II, SORT.

File section ............................................. 29Procedure division ....................................... 30Release .................................................. 31Return ................................................... 32

Sort-Return .............................................. 32Clausula occurs .......................................... 32

TABLAS.

Tablas ................................................... 35Tablas de longitud variable .............................. 36Descripcion de una tabla ................................. 36Tablas de mas de una dimension ........................... 37Tablas de mas de una dimension ........................... 37Indexacion ............................................... 38

Declaracion 'SET' ........................................ 38Declaracion 'SEARCH' ..................................... 39

III

Opcion 'VARYING' ......................................... 41

Tablas definidas con mas de un indice .................... 41Busqueda binaria ......................................... 42Declaracion 'SEARCH ALL' ................................. 43

Page 4: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 4/60

 

Busqueda dicotomica ...................................... 45Literales ................................................ 46Ficheros ESDS ............................................ 46

PASAR DATOS EN CICS A COBOL II.

Pasar datos en cics a cobol II ........................... 47Instruccion set .......................................... 47Pointer .................................................. 47Ejemplos ................................................. 48

EJEMPLOS DE RUTINAS.

Rutina general de conversion de fechas ................... 49Rutina de conversion de bits a bytes ..................... 51Rutina general de verificacion de digitos ................ 53Rutinas de calculos ...................................... 55

Numero de dias entre dos fechas ..................... 55Numero de meses entre dos fechas .................... 56Restar un periodo a una fecha ....................... 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 comoX3.23 fueron :

en 1.968, en 1.974 y en 1.985.

FORMATO DE PROGRAMA FUENTE=============================

ID DIVISION.----ENVIROMMENT DIVISION.----DATA DIVISION.----PROCEDURE DIVISION.

----END PROGRAM Nom-prog. ------> (identico al de PROGRAM-ID.)

Page 5: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 5/60

 

--------------------- PROGRAMA ANIDADO ---------------------

* Una secuencia de programas COBOL separados (INITIAL)

pueden ser tambien entrada del compilador.

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 programasdentro de los cuales estan contenidos.

* Se dice que un programa "B" esta directamente con-tenido en otro "A", sino hay otro programa contenidoen el "A" que tambien contenga al "B".

2

* Se dice que un programa "B" esta indirectamentecontenido en el "A", si existe un programa contenidoen el "A" que a su vez contiene el "B".

--> COMMON B : es un programa contenido en otro y pue-de ser llamado tambien por otros.

--> INITIAL B: cuando este programa es llamado, el ytodos los que contiene se ponen enestado inicial.

Estas opciones implican el introducir en los programas

COBOL la funcion de recursividad, conjuntamente con ladeclaracion "CANCEL" que se comentara mas adelante.

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

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

* Los datos contenidos en un "EXTERNAL" pueden ser

referenciados por cualquier programa que los tengadescritos.

Page 6: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 6/60

 

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

1) NUEVAS CLAUSULAS EN LA DEFINICION DE ITEMS.

--> GLOBAL B

El dato esta disponible para todo programa contenidodentro del que lo declara.

atributo de nivel 01.

--> EXTERNAL B

La memoria asociada con el ITEM de datos, esta asocia-da con la unidad de ejecucion mas que con el progra-ma en particular dentro de la unidad de ejecucion.

Este ITEM puede ser referenciado por cualquier programadentro de la unidad de ejecucion.

No implica que es global y es un atributo de nivel 01.

--> POINTER B

3

esta clausula define un ITEM de datos "PUNTERO" de ni-vel 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 cabecerade "PROCEDURE DIVISION".

2) NIVELES DE TABLAS.

* pueden tener hasta siete niveles, dimensiones.

* por tanto podra haber hasta siete anidamientos declausulas OCCURS.

* Un ITEM podra referenciarse subscrito o indexado por 7.

* en las tablas de longitud variable (DEPENDING ON) elminimo numero de ocurrencias podra ser cero.

Page 7: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 7/60

 

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

1) OPERACIONES DE CONDICION.

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

IDENTIF-1 IS [ NOT ] GREATER THAN OR EQUAL TO ( >= ) LESS THAN OR EQUAL TO ( <= )

uso de la sentencia SET para cambiar el estado de losnombres de condicion. Ejemplo :

SET ESTADO TO TRUE [ 88 ESTADO VALUE '2'. ] EQUIVALE A MOVER 2 AL NIVEL 01 DE ESTADO.

con lo cual tambien se potencia el uso de los nom-bres de condicion.

4

2) OTRAS CONDICIONES.

en operaciones aritmeticas : NOT ON SIZE ERRORen operaciones de mover datos : NOT ON OVERFLOWen operaciones de entrada/salida : NOT INVALID KEY

NOT AT ENDNOT AT END-OF-PAGE

3) TERMINADORES EXPLICITOS DE SENTENCIAS

END-ADD END-CALLEND-DIVIDE END-EVALUATEEND-PERFORM END-READEND-SEARCH END-STARTEND-UNSTRING END-WRITE

END-COMPUTE END-DELETEEND-IF END-MULTIPLYEND-RETURN END-REWRITE

END-STRING END-SUBTRACTEND-WRITE

Page 8: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 8/60

 

cuando el compilador encuentra un terminador explicito,lo asocia al ultimo verbo no emparejado.solo son validos en las sentencias con forma condicional.

Ejemplo:

ADD 1 TO CONTADOR ON SIZE ERROR SET ERROR-OPERACION TO TRUE END-ADD

con su uso se puede eliminar practicamente el uso de "."

4) LLAMADA A 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

BY REFERENCE:

el valor del parametro pasado se evalua en el momen-to de la CALL y es asignado al correspondiente delprograma llamado el cual puede procesarlo.

BY CONTENT:

en este caso el programa llamado no puede modificarel valor pasado.

---> en tiempo de compilacion se puede espaci-ficar la opcion DYNAM (llamadas dinamicas)o NODYNAM (llamadas estaticas)

LLAMADAS ESTATICAS-------------------

el programa principal y el subprograma forman partedel mismo modulo, por tanto cuando el control se pasa

Page 9: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 9/60

 

al programa llamado este ya esta en memoria, por loque las siguientes llamadas al subprograma lo encontra-ran en el ultimo estado. (excepto cuando el programallamado tiene el atributo "INITIAL")

LLAMADAS DINAMICAS

-------------------

el programa llamado es un modulo independiente y solose carga en memoria cuando es llamado. Las llamadassucesivas lo encontraran en el ultimo estado.

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

CANCEL IDENTIFI-1 / LITERAL

se cancela un programa llamado, de tal forma que laproxima llamada lo pondra en su estado inicial.

*** los subprogramas han de terminar con GOBACK o EXITPROGRAM

*** los efectos siempre son jerarquicos, en caso de pro-gramas anidados

*** todo ello fortalece la recursividad en el COBOL

6

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

EVALUATE IDENTIFIC-1 LITERAL EXPRESION

TRUE FALSE ALSO ...... (VARIOS) LAS MISMAS EXPRESIONES WHEN FRASE-1 ALSO FRASE-2 .....(VARIAS) SENTENCIA IMPERATIVA

[ WHEN OTHER SENTENCIA IMPERATIVA ]

Page 10: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 10/60

 

--> FRASE-1 puede ser :ANYCONDICION-1TRUEFALSENOT IDENTIFI-1

LITERAL

EXPR.ARIT. THRU (las mismas )

--> FRASE-2 puede ser :ANYCONDICION-2TRUEFALSENOT (igual anterior) THRU (igual)

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

* implanta en COBOL una declaracion que facilita laprogramacion estructurada. ----> equivale a la declara-cion "CASE" de otros lenguajes, cuya carencia en elCOBOL se criticaba.

* facilita la construccion de sentencias de logica com-pleja para las cuales antes era necesario recurrir ala "IF" anidadas.

7

* las expresiones a evaluar se lleman sujeto de la se-leccion y el resultado objeto de la seleccion.

* los pares de sujetos y objetos deben ser de la mis-ma clase (numerico, caracter, condicion TRUE o FALSE).

* usar la EVALUATE para seleccionar el proceso de unconjunto de acciones.

* en una EVALUATE pueden especificarse hasta 255 suje-tos y objetos.

* la ejecucion de una EVALUATE finaliza cuando:- la declaracion asociada con una "WHEN" es seleccionada.- la declaracion asociada con una "WHEN OTHER" es SELECC.- ninguna condicion "WHEN" es seleccionada.

* las "WHEN" son comprobadas en el orden de especifi-cacion, por tanto se codificaran en orden de proba-bilidad.

* Dos operandos relacionados con una "THRU" deben ser

de la misma clase.

* cualquier sujeto u objeto de seleccion en el cual se

Page 11: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 11/60

 

ha especificado como "TRUE" o "FALSE" se le asignaese valor a los ITEMS correspondientes.

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

EVALUATE CAMPO1WHEN 'D'

MOVE 'CONDUCTOR' TO CAMPO1WHEN 'R'

MOVE 'COCHE' TO CAMPO1WHEN SPACE

MOVE SPACES TO CAMPO1END-EVALUATE

---> USANDO IFIF CAMPO1 = 'D'MOVE 'CONDUCTOR' TO CAMPO1

ELSEIF CAMPO1 = 'R'

MOVE 'COCHE' TO CAMPO1ELSE

IF CAMPO1 = SPACEMOVE SPACES TO CAMPO1

END-IFEND-IF

END-IF

8

EVALUATE TRUE ALSO TRUEWHEN EDAD < 18 ALSO SEXO = 'M'

MOVE 'CHICO JOVEN' TO CAMPO1WHEN EDAD < 18 ALSO SEXO = 'F'

MOVE 'CHICA JOVEN' TO CAMPO1WHEN EDAD > 18 ALSO SEXO = 'M'

MOVE 'SE¥OR' TO CAMPO1

WHEN EDAD > 18 ALSO SEXO = 'F'MOVE 'SE¥ORITA' TO CAMPO1WHEN OTHER

MOVE 'NO VALIDO' TO CAMPO1END-EVALUATE

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

INITIALIZE IDENTIF-1 ........

[ REPLACING

Page 12: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 12/60

 

ALPHABETIC ALPHANUMERIC NUMERIC ALPHANUMERIC-EDITED

NUMERIC-EDITED DATA BY INDENTIF-A LITERAL ]

* es equivalente a una o mas "MOVE"

* IDENTIF-1 puede ser :- Un ITEM subscrito

- una tabla completa (no DEPENDING ON)- una estructura

* cuando se usa REPLACING IDENTIF-A/LITERAL deben sercompatibles con IDENTIF-1.

* Si no se usa REPLACING se asume :- Blancos para los ALPHA- Zeros para los NUMERIC

9

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

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

* PERFORM ..... TIMES *

PERFORM [ IDENTIF-1/ENTERO-1 ] TIMES [ SENTENCIA IMPERATIVA ]

END-PERFORM

Page 13: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 13/60

 

* PERFORM CON UNTIL :

PERFORM NOMBRE-PROC1 [ THRU NOMBRE-PROC2 ] [ WITH TEST BEFORE /

AFTER ] UNTIL CONDICION-1 [ DECLARACION-IMPERATIVA END-PERFORM ]

* Si se especifica Nombre-Proc1 no se debe especificarla declaracion imperativa y la END-PERFORM.

* WITH .... para probar la condicion-1 antes o despuesde la ejecucion.BEFORE = DO WHILEAFTER = DO UNTIL (Al menos se ejecuta una vez)

10

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

Page 14: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 14/60

 

END-PERFORM ]

esta modificacion de la "PERFORM" supone implantar enel COBOL el "DO WHILE" y el "DO UNTIL", cuya carenciatambien se le criticaba al COBOL.en resumen el COBOL85 con sus nuevas funciones y am-

pliaciones han cubierto los flancos que le hacian vul-nerables ante las criticas respecto al desfase con lasfunciones que incluian los lenguajes ultimamente desar-rollados ( PASCAL, C).

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

1.- el DB2 R3 suministra un nuevo parametro en la op-

cion HOST del precompilador del DB", "COB2", que sir-ve para indicar si el fuente esta estrito en VSCOBOL II.

2.- la opcion de compilacion DYNAM, que permite la car-ga dinamica de programas, al ser llamados por lasentencia CALL no es aplicable a modulos que usencomandos CICS.

3.- para poder llevar a cabo la depuracion se debe com-pilar con la opcion TEST.

11

4.- un programa es reentrante cuando puede ser ejecuta-do 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 op-cion RESIDENT.

DEPURACION CON COBOL II==========================

ENTORNO COMPILARSOPORTE DE DEPURACIONDEPURACION MODULOS OB.BATCH INTERACTIVA

-------------------------------------------------------------INTERACTIVO TSO SI SI SI SI

CICS/OS 1.7 NO SI SI NO

Page 15: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 15/60

 

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 pro-grama utilizando diferentes valores de datos.

* Inspeccionar y modificar campos de datos en pun-to seleccionados del programa.

------> ES PRERREQUISITO DISPONER DEL ISPF VERSION 2.

BATCH-----

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

12

COMPILACION-----------

las opciones de compilacion pueden especificarse median-te la ficha CBL o su sinonimia PROCESS, tambien viaJCL en la sentencia EXEC que llama al compilador, enla PARM :

//COMPILE EXEC PGM=IGYCRCTL,PARM='XREF,SSRANGE,MAP'

para modificar las opciones por defecto se usa la ma-cro IGYCOPT, que se ensamblara y catalogara como moduloIGYCDOPT.

COMPILACIONES CON PROGRAMAS SECUNDARIOS

==========================================

Page 16: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 16/60

 

cuando se hacen llamadas a programas secundarios desdeprogramas en COBOL II, tamto si el secundario es COBOLII, como si en COBOL OS/VS, los dos tienen que estarcompilados con la misma opcion RES o NORES.Si el programa secundario es COBOL OS/VS, no se permitela compilacion de este con ninguna opcion de DEBUG, puesen tiempo de ejecucion nos daria un ABEND de usuario

1010.Si el programa secundario esta linkeditado con la op-cion RENT, y no es realmente reentrante, en tiempo deejecucion nos puede dar un abend de sistema B0A o 30A.

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

Una RUN UNIT (unidad de ejecucion) incluye uno o mas pro-

gramas objeto y puede incluir otros lenguajes diferentes alCOBOL.

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

Cuando una RUN UNIT consiste en varios programas llamados,estos programas deben estar dispuestos para comunicarse conlos otros programas. Estos necesitan transferir control y u-sualmente necesitan tener acceso a datos comunes.

Otro metodo que puede ser usado para la comunicacion en-tre programas es el de programas COBOL anidados. Esto permi-

te que todos los programas requeridos pro una aplicacion es-ten contenidos dentro del MAIN PROGRAM y de este modo soloes necesario una simple compilacion.

13

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

En la Procedure Division un MAIN PROGRAM puede llamar a unsubprograma, y un subprograma puede, asimismo, todavia llamar aotro programa. El programa A llama al B. El A se denominaPROGRAMA LLAMANTE y el B PROGRAMA LLAMADO.

El programa COBOL llamado empieza a ejecutarse al principiode la Procedure Division. Es posible especificar otro punto deentrada (ENTRY POINT) donde empiece la ejecucion utilizando la

etiqueta ENTRY el PROGRAMA LLAMADO. Sin embargo, esta no es unapractiva recomendada en la programacion estructurada.

Page 17: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 17/60

 

Cuando el PROGRAMA LLAMADO se ha procesado completamentepuede tambien devolver control al LLAMANTE o finalizar laUNIT RUN.

Un programa llamado no debe, directa o indirectamente, eje-cutar a su llamador. Ejemplo:

EL PROGRAMA X LLAMA AL Y

EL Y LLAMA AL ZY EL Z LLAMA AL X

A esto se le denomida una RECURSIVE CALL. Si se intenta eje-cutar una CALL RECURSIVA a un programa COBOL la RUN UNITtermina anormalmente (ABEND).

El PROGRAMA LLAMANTE y todos los LLAMADOS deben estar (to-dos compilados con la opcion del compilador: RESIDENT oNORESIDENT, a menos que haya sido especificada la opcionMIXRES en tiempo de ejecucion.

PROGRAMA PRINCIPAL Y SUBPROGRAMAS.-------------------------------------

No hay sentencias especificas u opciones para identificarsi un programa COBOL es principal o es un subprograma. Nor-malmente el primer programa COBOL que empieza la ejecucionde una RUN UNIT es el MAIN PROGRAM (programa principal).Todos los otros programas COBOL en la RUN UNIT (unidad deejecucion) 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

Page 18: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 18/60

 

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 oGOBACK. La siguiente vez que es llamado en la RUN UNIT (u-nidad de ejecucion) sus valores internos estaran como fuerondejados, excepto los valores de retorno para las instruccionesPERFORM que seran restaurados a su valor inicial. Por el con-trario, un programa principal es inicializado cada vez que esllamado. Hay dos excepciones:

1ra.- Un subprograma que es llamado dinamicamente por unprograma COBOL OS/VS o COBOL II VS y luego es can-celado, con la opcion RESIDENT estara en el estadoinicial la siguiente vez que es llamado.

2da.- Un programa con el atributo INITIAL estara en elestado inicial cada vez que es llamado.

15

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

Se pueden usar diferentes metodos para transferir controla otro programa. Esto incluye :

1.- CALLs a programas anidados.

2.- CALLS estaticas a otros programas COBOL II VS compiladosseparadamente.

3.- CALLs dinamicas a otros programas COBOL II VS compiladosseparadamente.

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

Page 19: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 19/60

 

Las CALL a programas anidados te permiten crear aplicacio-nes utilizando las tecnicas de programacion estructurada. Pue-den tambien ser utilizadas en lugar de procesos PERFORM pa-ra prevenir modificaciones a items inintencionadamente. Las CALLa programas anidados pueden usar bien la instruccion CALL-literal- o bien CALL -identificador-.

Una CALL estatica es utilizada para llamar a un programacompilado separadamente que es link-editado dentro del mismomodulo de carga que el programa LLAMANTE.

Una CALL dinamica es utilizada para llamar a un programacompilado separadamente que ha sido link-editado en un modulode carga separado del programa LLAMANTE. En este caso el mo-dulo del subprograma es cargado en memoria la primera vezque es llamado.

Una CALL estatica ocurre cuando se usa la instruccionCALL-literal en un programa que es compilado con la opcion

NODYNAM.

Las CALL estaticas son ejecutadas mas rapidamente que lasCALL dinamicas y utilizan u ocupan menos memoria.

El uso de la instruccion CALL -identificador- O CALL -literal-compilado con la opcion DYNAM da como resultado una CALLdinamica.

Se deberia considerar la utilizacion de una call dinami-ca 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 ejecu-ten en la modalidad de direccionamiento de 31 BITS.

4.- El nombre del programa que va a ser llamado se co-noce en tiempo de ejecucion.

16

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

Los programas anidados proporcionan un metodo mediante elcual se pueden crear funciones modulares (modular functions)para la aplicacion mantenimiento de tecnicas de programacionestructurada. Se pueden utilizar como procesos PERFORM con lacapacidad adicional de proteger los items locales.

Los programas anidados tambien dan flexibilidad para depu-rar los programas antes de ser incluidos en la aplicacion y

dar la capacidad para compilar la aplicacion con una simpleinvocacion al compilador.

Page 20: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 20/60

 

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

Un programa COBOL puede contener otros programas COBOL. Los

programas contenidos pueden ellos mismos contener otros progra-gramas. Un programa contenido puede ser directamente o indirec-tamente contenido dentro de un programa.

17

EJEMPLO:--------

+-- Programa X -------- ....... Call X1 Call X2

....... Stop run

Page 21: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 21/60

 

+-- 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+-- End Program X

18

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

Hay varias normas que aplicar cuando se utilizan estructurasde programas anidados:

1.- La IDENTIFICATION DIVISION es requerida en cada pro-grama. Todas las otras divisiones son opcionales.

2.- El nombre de programa debe ser unico.

3.- Los programas contenidos no pueden tener la COMFIGU-RATION SECTION. El programa outermost (mas exterior)

Page 22: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 22/60

 

debe especificar cualquiera de las opciones CONFIGU-RATION SECTION que pueda ser requerida.

4.- Cada programa contenido (llamado) es incluido en elprograma continente (llamante) inmediatamente antes desu cabecera END-PROGRAM.

5.- Programas llamados y llamantes deben ser terminadoscon END-PROGRAM.

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

Un programa contenido (llamado) solamente puede ser llamadodirectamente por su programa llamante, a menos que el llamadoidentificado como COMMON en su clausula PROGRAM-ID. En este ca-

so el programa COMMON puede tambien ser llamado por cualquierprograma que este contenido directa o indirectamente dentro delmismo programa que el programa COMMON.

Solamente programas contenidos (llamados) pueden ser COMMON.

Las CALL recursivas no son permitidas.

19

EJEMPLO:--------

+-- Program-id. A ----------- +-- Program-id. A1 -----------

+-- Program-id. A11 -----------

Page 23: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 23/60

 

+-- Program-id. A111 ----------- +-- End Program A111 +-- End Program A11

+-- End Program A1 +-- Program-id. A2 is COMMON ----------- +-- End Program A2 +-- Program-id. A3 is COMMON ----------- +-- End Program A3

+-- End Program A

La siguiente tabla describe la 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 +----------+----------------+-----------------------+ 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 yno esta contenido en A2

.- que A111 no puede llamar a A11 porque eso seria unaCALL RECURSIVA.

.- que A1 puede llamar a A2 porque A2 es COMMON.

Page 24: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 24/60

 

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

Cuando un subprograma es llamado puede estar ya en memoriay puede ser Linkeditado en el mismo modulo de carga con elprograma LLAMANTE (Call estatica) o puede ser cargado solamente

al tiempo que es llamado (Call dinamica). Con la carga dinami-ca el programa llamado es cargado solamente cuando se necesita.cargado solamente cuando se necesita.

El proceso de Link-edit difiere dependiendo de si se trata deprogramas con Call dinamica o estatica.

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

La instruccion CALL-literal- (donde-literal- = nombre subprogra-ma) es tratada por el compilador como una CALL estatica cuan-do la opcion del compilador NODYNAM esta activa.

Una CALL estatica es ejecutada mas rapidamente que una di-namica y es la preferida si la aplicacion no requiere losservicios de una Call dinamica. Los programas llamados por unaCall estatica no pueden ser deleteados (con cancel), por tantoel uso de CALLs estaticas puede ocupar mas memoria principal.Si la memoria IS A CONCERN OF YOURS considerar el uso deCALLs dinamicas.

Si la opcion del compilador NODYNAM esta activa todas lasCALLs de el formato CALL -literal- en ese programa seranCALLs estaticas.

UTILIZANDO CALL DINAMICA.---------------------------

Una Call dinamica carga el subprograma en tiempo de ejecucion.

Se debe utilizar una instruccion CALL dinamica cuando:

21

1.- Los subprogramas llamados con CALL -literal- son usadosinfrecuentemente o son muy grandes.Si los subprogramas son llamados pocas veces, las CALLdinamicas tienen la ventaja de que trae el subprogra-ma a memoria solamente cuando se necesita.

2.- Se quiera llamar a Subprogramas en su UNUSED STATE.Con el atributo INITIAL el subprograma sera posicio-

Page 25: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 25/60

 

nado en su INITIAL UNUSED STATE cada vez que esllamado.

Se puede, tambien, selectivamente preparar el ESTADO NOUSADO o INICIAL mediante el proceso CALL y CANCEL.Este es un proceso mas engorroso y fastidioso peroda control del estado si eso es lo esencial. Para

hacer esto se utiliza una combinacion de CALL dina-mica y la instruccion CANCEL y se compila el progra-ma con la opcion RESIDENT. Cuando se cancela el sub-programa que fue inicialmente llamado por un COBOLOS/VS o COBOL II VS, la siguiente CALL causara queel subprograma sea reinicializado a su UNUSED STATE.El comando cancel no toma accion alguna para borrarde memoria los subprogramas que fueron cargados dina-micamente y bifurcados mediante programas no COBOL.

3.- El nombre del programa a ser llamado solo se conoceen tiempo de ejecucion :

- En este caso utiliza el formato CALL -identifi-cador- donde -identificador- es el item que con-tendra el nombre del programa llamado en tiempode ejecucion. En la proctica se deberia utilizarCALL -identificador- cuando el programa a serllamado varia dependiendo de las condiciones delprograma llamante.

- CALL -identificador- es siempre dinamica, inclusosi se utiliza la opcion de compilacion NODYNAM.Para que todas las CALL -literal- hechas en unprograma sean dinamicas utilizar la opcion decompilacion DYNAM.

Cuando se utilice la opcion de compilacion NODYNAM, no sedebe mezclar CALL -identificador- dinamica y una CALL -literal-estatica para el mismo subprograma. Esto desperdicia espacioporque dos copias del subprograma son cargadas en memoria yno se garantiza que el subprograma sea dejado en su LAST--USED-STATE.

Cuando se tienen CALLs dinamicas en un programa, se debecompilar utilizando la opcion RESIDENT.

Las CALLs dinamicas toman mas procesamiento pero pueden uti-

lizar menos memoria principal que las CALLs estaticas.

22

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

Los programas compilados separadamente (incluyendo los progra-mas dentro de una secuencia batch) pueden compartir items me-diante el uso del atributo EXTERNAL.

EXTERNAL es especificado en el nivel 01 de la descripciondel dato en la working de un programa y se aplican las si-

Page 26: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 26/60

 

guientes reglas:

1.- Los items subordinados a un grupo de items EXTERNAL,son ellos mismos EXTERNAL.

2.- El nombre usado para el item no puede ser usado enotro item EXTERNAL dentro del mismo programa.

3.- La clausula VALUE no puede ser especificada para cual-

quier grupo de item o items subordinados EXTERNAL.

Cualquier programa COBOL dentro de la RUN UNIT (Unidad deejecucion) que tenga la misma descripcion para el item que elprograma 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 lamisma descripcion en su working.

Cualquier programa que pueda acceder a un item EXTERNALpuede cambiar su valor. No se debe utilizar este atributo pa-ra items que es nesario proteger.

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

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

BY CONTENT significa que el programa llamante esta pasandosolamente el contenido del -literal- o -identificador-.

Con una CALL ... BY CONTENT, el programa llamado no puedecambiar el valor del -literal- o -identificador- en el pro-grama llamante, incluso si se modifica la variable en la cualse recibe el -literal- o el -identificador-.

Si se quiere que el subprograma reciba datos del llamante ycompartirlos se debe especificar:CALL ... BY REFERENCE -IDENTIFICADOR-

23

Cualquier cambio que el subprograma haga afecta al dato enel programa llamante.

Un -identificador- en la frase USING de la instruccion CALL... BY REFERENCE puede ser un nombre de fichero ademas de unnombre de item. Si el -identificador- es un nombre de fichero

para un fichero secuencial el compilador COBOL pasa la direc-cion de la DCB (Data Control Block) AS THIS ENTRY OF THEPARAMETER LIST. El -identificador- no puede ser el nombre de

Page 27: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 27/60

 

un fichero VSAM.

NOTA: Este mecanismo no puede ser usado para ficheros com-partidos entre programas COBOL. Esto es solamente parapasar 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 NAME-

El subprograma recibe el ADDRESS SPECIAL REGISTER (Registro es-pecial de direccion) para el nombre de registro que se espe-cifico.

Se debe definir el nombre de registro como un nivel 01 o77 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 -IDENTIFICADOR-

El programa llamante pasa la longitud del -identificador-desde su LENGTH special register (registro especial de longitud).

Cuando los literales son pasados mediante BY CONTENT el pro-grama llamado no puede cambiar el valor.

Si se quiere pasar ambos (el item y su longitud) a un sub-programa se especificara una combinacion de BY REFERENCE y BYCONTENT, por ejemplo :

CALL 'ERRPROC' USING BY REFERENCE ABY CONTENT LENGHT OF A.

Los items en un programa llamante pueden estar descritos enla LINKAGE SECTION de todos los programas que llama directa oindirectamente. En este caso, la memoria para estos items es a-locada en el programa llamante de nivel superior. Esto es, elprograma A llama al B, el cual llama al C. Los items en elprograma A pueden ser descritos en la LINKAGE SECTION de losprogramas B y C y estar disponibles a los tres programas.

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

En el programa llamante, los items comunes son descritos enla DATA DIVISION de la misma manera que otros items. A menos

24

que ellos esten en la LINKAGE SECTION, la memoria es alocadapara esos items en el programa llamante. Si se referencian da-tos en un fichero, este debe estar abierto cuando el dato seareferido. Se codificara la clausula USING en las instrucciones

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

Page 28: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 28/60

 

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

En el programa llamado los items comunes son descritos en

la LINKAGE SECTION. Codificar la clausula USING despues de lacabecera PROCEDURE DIVISION para recibir los datos.

EJEMPLO:--------

Descripcion del Prog. Descripcion del Prog.LLAMANTE 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). +----------------------------+ +------------------------+

. .

. .

. .

. . .

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 utilicepara pasar los datos (BY REFERENCE o BY CONTENT). En cualquiercaso el programa llemado debe describir los datos que esta re-cibiendo. Hace esto en la LINKAGE SECTION.

25

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

************************************************************************

Page 29: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 29/60

 

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 ZEROSBEFORE INITIAL QUOTE

INSPECT DATA-1 CONVERTING'abcedfg' TO 'ABCEDFG'AFTER INITIAL '/'BEFORE INITIAL '?'

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

INITIALIZE ALFANUMERIC-1REPLACING ALPHANUMERIC DATA BY ALPHANUM-3

INITIALIZE CAMPO-NUMERICOREPLACING NUMERIC DATA BY CAMPO-NUMERICO-2

INITIALIZE CAMPO-EDICIONREPLACING 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 tablasde 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-ENTRADAREPLACING ALPHANUMERIC DATA BY [ALL] '$'.

--------------------

26

01 TABLA VALUE 'A'.05 ELEMENTO OCCURS 5 TIMES PIC X.

-----------AAAAA-----------

Page 30: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 30/60

 

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 TIMESASCENDING KEY IS KEY1INDEXED 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 TRUEWHEN ESTADO-CASADO

.................WHEN ESTADO-SOLTERO

.................END-EVALUATE.

EVALUATE CODIGO = 'A' VALOR-1 > 100 INDICADORWHEN TRUE TRUE TRUE

..................

..................WHEN TRUE FALSE ANY

....................................END-EVALUATE.

27

EVALUEATE TRUE TRUE TRUE

WHEN DD-31 MM-31 AA-NORMALWHEN DD-30 MM-30 AA-NORMAL.............

Page 31: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 31/60

 

.............CONTINUE

WHEN OTHER.......................................

END-EVALUATE.

EVALUATE CANTIDAD * 4WHEN NOT NUMERIC

..................

..................WHEN 1 THRU 10

..................

..................WHEN NOT 11 THRU 20

..................

..................

END-EVALUATE.

EVALUATE CAMPO-1 CAMPO-2 CAMPO-3WHEN 1 1 1

MOVE 'A' TO INDICADOR-FINALWHEN 1 1 0

MOVE 'B' TO INDICADOR-FINALWHEN OTHER.................

END-EVALUATE.

EVALUATE CAMPO-1 CAMPO-2 CAMPO-3WHEN 0 1 THRU 3 5

................

................WHEN NUMERIC ANY NOT NUMERIC

................

................END-EVALUEATE.

28

INSTRUCCION STRING.

-------------------

Page 32: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 32/60

 

STRINGCAMPO-1 CAMPO-2 DELIMITED BY CAMPO-3CAMPO-4 DELIMITED BY SIZE <-------- TodoINTO CAMPO-7WITH POINTER CAMPO-8. <---------- Contiene el numero de

caracter a transmitir(no < 1 ni > que la

variable receptora).

campo-4 campo-1 campo-2 campo-3___________ ___________ _____ _ 6789*0 123*45 A*B *----------- ----------- ----- -

___________________________________ 123A6789*0bbbbbbbb-----------------------------------

campo-8

__ la opcion11 [ON OVERFLOW sentencia-imperativa]-- se ejecutara cuando se excedan

inicializar a 1 los limitesantes de laejecucion

INSTRUCCION UNSTRING.----------------------

UNSTRING CAMPO-ORIGEN DELIMITED BY DELIMITADOR OR ALLL '*'INTO CAMPO-FINAL-1 DELIMITED IN MARCA-1 COUNT IN CUENTA-1

CAMPO-FINAL-2 DELIMITED IN MARCA-2CAMPO-FINAL-3 DELIMITED IN MARCA-3 COUNT IN CUENTA-3CAMPO-FINAL-4 COUNT IN CUENTA-3

WITCH POINTER APUNTADORTALLYING IN CONTADOR-TOTALON OVERFLOW GO TO .......

delimitadoren ejecucion

?-

campo-origen_________________________________ 123**456??7ABCDEF---------------------------------

29

Page 33: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 33/60

 

campo-final-1 marca-1 cuenta-1___________ _ _ 123bbb * 3----------- - -

campo-final-2 marca-2_________ _ 

456bb ?--------- -

campo-final-3 marca-3 cuenta-3_____ _ _ bbb ? 0----- - -

campo-final-4 cuenta-4_________ _ 7ABCD 5--------- -

apuntador contador-total__ __ 18 05 <-------+------ inicializados a 1-- -- antes de la ejecucion. +------------------------------+

INSTRUCCION READ----------------

READ nombre-ficheroAT END ..........NOT AT END ......

END-READ.

C O B O L II : S O R T=============================

FILE SECTION.------------

SD file-name1DATA RECORD IS .......

01 .........En la SD se define el fichero que vamos a ordenar.

30

PROCEDURE DIVISION.------------------

Page 34: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 34/60

 

SORT file-name1----

_ _  ASCENDING ---------

ON DESCENDING KEY data-name1, data-name2,.... ---------- - --

[COLLATING SEQUENCE IS alphabet-name]--------

__ __  USING file-name2 ... ----- INPUT PROCEDURE --------------- _ _

THROUGH IS section-name1 [ ------- section-name2 ] THRU ---- - -- -- --

__ __  GIVING file-name3 ... ----- OUTPUT PROCEDURE

---------------- _ _ THROUGH IS section-name3 [ ------- section-name4 ] THRU ---- - -- -- --

*-->> FILE-NAME1 : Nombre del fichero definido en la SD.

*-->> ASCENDINGDESCENDING : Indica la secuencia en la que se va a ordenarel fichero, ascendente ( de menor a moyor) odescendente.

*-->> DATA-NAME1 : Campo en el que tenemos que basar la ordena-cion, tiene que estar relacionado con el fi-chero, estar situado en la misma posicion ytener la misma longitud que en el fichero deentrada.

31

Page 35: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 35/60

 

*-->> COLLATING SEQUENCE : Especifica la secuencia a seguir parausar en las comparaciones no numericaspara el campo clave en la opercion deordenar.

*-->> USING : Cuando se especifica esta opcion todos los regis-

tros en file-name2, son transferidos automaticamen-te a file-name1. Los ficheros de entrada tienen quetener organizacion secuencial.

*-->> INPUT PROCEDURE : Especifica el nombre de la seccion queva a seleccionar o modificar registrosde entrada antes que la operacion de or-denacion comienze. Puede tener uno o masparrafos escritos consecutivamente y queno formen parte de la OUTPUT PROCEDURE.

*-->> GIVING : Cuando se especifica esta opcion todos los regis-

tros ordenados en file-name1 son transferidosautomaticamente al fichero de salida file-name3.El fichero de salida debe tener organizacion secu-encial, y debe estar definido en la FD.

*-->> OUTPUT PROCEDURE : Especifica el nombre de seccion que vaa seleccionar o modificar registros desalida. Puede tener uno o mas parrafosescritos consecutivamente y que no for-men parte de la INPUT PROCEDURE.

RELEASE=======

Equivale a un WRITE, para grabar los registros en el ficherodel SORT.

RELEASE record-name [FROM identifier]------- ----

Transfiere registros desde un area de entrada/salida a lafase inicial de una operacion de ordenacion. Solo se puede usar

en SORT INPUT PROCEDURE.

El record-name tiene que estar asociado al fichero definidoen la SD.

RETURN======

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

32

Page 36: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 36/60

 

RETURN file-name RECORD------

[INTO identifier]----AT END imperative-statement------

[END-RETURN]----------

Transfiere registros desde la fase final del sort o merge ala 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 datosque se repiten con la misma descripcion.

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

OCCURS entero TIMES------

Entero indica el numero de veces que se repite un campo con lamisma 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 nombrede la empresa.

- Un campo de ocho caracteres alfanumericos en el que figura elmodelo de automovil fabricado.

- 1080 campos de tres caracteres numericos cada uno, cuyo contenidoes el numero diario de automoviles fabricados durante los a¤os1971, 72 y 73 (los meses se consideran de 30 dias).

33

Page 37: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 37/60

 

Se quiere, partiendo del formato de dicho registro, que elprogramador haga la descripcion del mismo:

01 REGISTRO-AUTOS.02 NOMBRE PICTURE A(6).

02 MODELO PICTURE X(8).02 DIARIA1 PICTURE 999.02 DIARIA2 PICTURE 999.02 DIARIA3 PICTURE 999." " " "" " " "" " " "02 DIARIA1078 PICTURE 999.02 DIARIA1079 PICTURE 999.02 DIARIA1080 PICTURE 999.

Como se ve, esta descripcion seria muy laboriosa y necesitaria

mucho tiempo el llevarla a cabo, ya que serian necesarias variashojas de codificacion.

Pero teniendo en cuenta que al ser los 1080 campos de la mismalongitud, y del mismo tipo los caracteres a almacenar, se puedesimplificar la descripcion empleando la clausula OCCURS, sustituyendola anterior descripcion por la equivalente:

01 REGISTRO-AUTOS.02 NOMBRE PICTURE A(6).02 MODELO PICTURE X(8).02 DIARIA OCCURS 1080 PICTURE 999.

- A la descripcion del campo en que entra a formar parte la clausulaOCCURS se le da el nombre de tabla.

- Al nombre de campo de datos, DIARIA, el cual es comun para los1080 campos se le denomina: Nombre Generico o Sujeto, y a cada unode los campos, elementos de la TABLA.

- La clausula OCCURS no puede especificarse en una descripcion quelleve 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 unnumero variable de apariciones.

Si en el ejemplo anterior, en vez de haber grabado la cinta conun unico registro conteniendo la produccion de 36 meses, cada uno detreinta dias' se hubieran grabado 36 registros de longitud variablecomo consecuencia del numero diferente de dias de cada mes; en estecaso la descripcion seria:

34

Page 38: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 38/60

 

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 numerominimo de apariciones y entero-2 el numero maximo. El valor minimoque puede tomar entero-1 es cero y el valor maximo de entero-2depende del tipo de compilador utilizado, pudiendo llegar a sersuperior a 300.000.

Existen compiladores para los que entero-1 es opcional. Siendo

correcto describir:

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

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

FD ARCHIVO- AUTOS RECORDING V LABEL RECORD OMITTED.

01 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 _ _ _  --------- KEY IS nombre-de-datos-2 nombre-de-datos-3 ......

- DESCENDING----------

Page 39: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 39/60

 

35

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

En este formato incluye a los dos anteriores, a¤adiendo laclausula ASCENDING o DESCENDING, para indicar si los elementos de latabla estan ordenados en forma ascendente o descendente por uno ovarios campos (nombre-de-datos-2, nombre-de-datos-3 ...), que formenparte de dichos elementos.

La utilizacion de este formato es obligatoria, por ejemplo, cuandopara localizar a un determinado elemento de la tabla, se emplee elmetodo de busqueda binaria o dicotomica por medio de la declaracionSEARCH ALL, la cual utiliza como indice para realizar dicha busqueda,al nombre-de-indice que se describe a continuacion de INDEXED BY.

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

TABLAS______ 

Una TABLA es una serie de datos con el mismo formato dispuestosconsecutivamente en memoria.

La serie de datos, al tener el mismo formato, se puede describircon un solo nombre.

Las tablas se utilizan con mucha frecuencia en programacion ya quepermiten, 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 descripcion,incluye una clausula OCCURS.

La declaracion OCCURS especifica el numero de elementos queexisten en la tabla. (En una tabla, todas las entradas deben de tenerel 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 delos cuales tiene nueve caracteres de longitud con lo que la tablatendra una longitud de 63 (9 x 7) caracteres.

Al utilizar la declaracion OCCURS se deben tener en cuenta lassiguientes reglas:

Page 40: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 40/60

 

36

- OCCURS no aparece en el nivel 01 sino en el nivel masbajo.

- La declaracion PICTURE aparece en el nivel mas bajo.

Como hemos dicho, la reserva de memoria para cada uno de loselementos de la tabla se dispone, fisicamente, en forma lineal,es decir, cada elemento se situa inmediatamente a continuacion delanterior.

01 TABLADIAS.03 UNDIA OCCURS 7 TIMES PIC X(9).

Se hace referencia a cada partida de una tabla por medio de unnumero, llamado SUBINDICE, que identifica su posicion en esa tabla.Por ejemplo, en la tabla anterior tendriamos:

UNDIA(1) = LUNESUNDIA(3) = MIERCOLES

El SUBINDICE se utiliza al nivel de la declaracion OCCURS, esdecir, "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 cabola ejecucion del programa. (Seria el caso, por ejemplo, de una tablaen la que se recogiera la fabricacion de coches en un a¤o por mesesy por dias laborales; esta claro que en este caso la tabla podria serde longitud variable en funcion del numero de dias laborables de cadames).

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

La descripcion de una tabla puede realizarse en la FILE SECTION oen 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 mismase hara, normalmente, desde un medio externo: cinta,disco, etc., donde estaran contenidos los datos, pormedio 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.

Page 41: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 41/60

 

37

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

01 TABLAMES.02 FILLER PIC X(30) VALUE 'ENERO FEBRERO MARZO '.02 FILLER PIC X(30) VALUE 'ABRIL MAYO JUNIO '.02 FILLER PIC X(30) VALUE 'JULIO AGOSTO SEPTIEMBRE'.02 FILLER PIC X(30) VALUE 'OCTUBRE NOVIEMBRE DICIEMBRE '.

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

La clausula REDEFINES debe seguir directamente a la partida queredefine y debe estar en el mismo nivel. Puesto que no se puedeincluir una clausula VALUE con una declaracion OCCURS, esta es unatecnica 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 nombresde estudiantes o un conjunto de calificaciones para cada uno de losestudiantes, y una tabla tridimensional podrian incluir el nombre decada alumno y la nota media para cada uno de los meses del curso.

Para definir una tabla bidimensional, la clausula OCCURS seutiliza dos veces. La declaracion PICTURE solo se utilizara despuesde 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 tablabidimensional se necesitan dos subindices ("I" y "J") escritos de laforma (I, J). El primer subindice se refiere a la variable descritaen la primera declaracion OCCURS y debe estar seguido por una coma yun espacio. El segundo subindice se refiere a la variable descritapor 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).

Page 42: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 42/60

 

38

INDEXACION==========

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

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 puedeestar 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 instruccion MOVE o en

una proposicion aritmetica (ADD, MULTIPLY, etc ...), entonces paraasignar un valor a un indice o para igualar el valor de un indice conun nombre de dato se utiliza la declaracion SET.

nombre-indice-1 nombre-indice-2 nombre-indice-3SET ... TO identificador-3

identificador-1 identificador-2 literal

UP BY identificadorSET nombre-indice-1 nombre-indice-2

DOWN BY literal

Los nombres de indice siempre deben tener valores entre "1" y eltama¤o de la tabla.

El efecto de la declaracion SET es transferir al operando uoperandos que siguen a SET el contenido del operando que sigue a lapalabra TO, es decir, es una transferencia realizada en sentidocontrario a como la realiza la declaracion MOVE.

Si se utiliza UP BY o DOWN BY, cada vez que se ejecuta ladeclaracion SET el contenido de los nombres-de-indice que siguen a

dicha declaracion se incrementan (UP BY) o decrementan (DOWN BY) enel valor contenido en el identificador o literal que siga a estas dosopciones.

Page 43: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 43/60

 

39

SET INDICE BETA TO SUM. (Indice y Beta pasan a valer SUM).SET INDICE TO 46. (Indice pasa a valer 46).SET INDICE UP BY 2. (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"

====================

Lleva a cabo la busqueda en forma secuencial de una tabla hastaque el contenido de un elemento de la misma satisfaga una determinadacondicion.

_ _ SEARCH identificador AT END declaracion-imperativa-1

- -declaracion-imperativa-2

WHEN condicion-1

NEXT SENTENCE

_ declaracion-imperativa-3 _  WHEN condicion-2 - NEXT SENTENCE -

La tabla nombrada (identificador) es buscada desde el valor actualdel indice (por tanto, si se quiere que la busqueda empiece por elprincipio de la tabla, se debe inicializar el valor del indice pormedio de la declaracion SET). Cuando termina la daclaracion SEARCH,el indice tiene el valor del elemento de la tabla para el cual lacondicion es verdadera. Si se desea continuar una busqueda a partir

de donde se interrupio se deja ejecutar de nuevo la declaracionSEARCH sin volver a restablecer el indice.

Page 44: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 44/60

 

El efecto de la declaracion SEARCH es el siguiente:

40

Se incicia una busqueda de la tabla indicada y se prueba lacondicion que sigue al primer WHEN, caso de que la prueba resultecierta se ejecuta la declaracion o delaraciones que siguen a dichacondicion y si no resulta cierta se realiza el mismo proceso para lossucesivos WHEN. Si la prueba resulta falsa para todas las condiciones,el indice se incrementa automaticamente en una unidad para repetir elciclo con el segundo elemento.

Si hecha la prueba de las distintas condiciones con todos loselementos de la tabla no se encuentra alguno que cumpla unade las condiciones, quiere decir que el valor buscado no existe enningun elemento de la tabla por lo que se da por finalizada la

busqueda con lo que pasaria a ejecutar la declaracion que sigue a ATEND.

Es decir, de una forma mas esquematica, el proceso seria:

a) Se prueba cada condicion o condiciones de la opcion WHEN en elmismo orden de su escritura.

b) Si no se ha satisfecho ninguna de las condiciones se incrementael indice de la tabla para poder hacer referencia al siguienteelemento de la misma y se repite el paso a).

c) Si despues de la evaluacion se ha satisfecho una de lascondiciones que siguen a WHEN, la busqueda concluye pasando aejecutarse la declaracion imperativa asociada con tal condicion.El indice, en ese momento, contendra el numero del elemento de latabla que satisfizo la condicion.

d) Si se alcanza el final de la tabla sin haber satisfecho ningunacondicion de las que siguen a WHEN, la busqueda concluye pasando aejecutarse la declaracion imperativa asociada con tal condicion.Si se omite AT END, la secuencia de ejecucion del programa pasa ala sentencia siguiente.

e) Puede suceder que, al comienzo de la busqueda, el valor delindice sea superior al numero maximo de elementos de la tabla, encuyo caso la busqueda concluye inmediatamente, pasando a ejecutarlo especificado en el caso d).

77 NOM PIC X(10) VALUE 'JUAN GOMEZ'.01 LINEA1.

02 FILLER PIC X(20) VALUE SPACES.02 NOMIN PIC X(10) VALUE SPACES.02 FILLER PIC X(2) VALUE SPACES.02 VENIM PIC Z.ZZ9 VALUE ZEROS.

Page 45: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 45/60

 

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) = NOMMOVE NOMBRE(I) TO NOMINMOVE VENTA(I) TO VENIMWRITE .................GO TO FIN.

NOEXISTE............................

...........................

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

Especificando en una declaracion SEARCH la opcion VARYINGpermite incrementar simultaneamente el indice asociado a latabla en que se realiza la busqueda y una variable,identificadoru otro indice asociado a otra tabla. (Es frecuente el empleo

de esta opcion ya que hay trabajos en los que, ademas debuscar 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

Page 46: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 46/60

 

va a utilizar el sistema para la busqueda en la tabla.

El empleo de uno u otro indice para realizar la busqueda estaen 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 latabla se realizara utilizando el primer indice de los quefiguran en la clausula INDEXED BY.

b) Si se especifica la opcion VARYING junto con el nombre deuno de los indices que figuran en la clausula INDEXED BY, estesera 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 tablaobjeto de la busqueda (por ejemplo, el indice de otra tabla);en este caso la busqueda en dicha tabla se realiza, como en elapartado 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, esdecir, aun si la partida que se esta buscando esta cercana alfinal de la tabla, se examinan todas las partidas anteriores hastaque 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 sino lo estan.

Page 47: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 47/60

 

Si las entradas de la tabla estan en secuencia se puederealizar un tipo de busqueda mas eficiente llamada busquedaBINARIA. Una busqueda binaria requiere un campo clave en cadaentrada de la tabla. Se busca comprobando primero el valor delcampo 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 claveen el punto medio de la parte superior de la tabla. Y continuahaciendo bisecciones en las partes restantes de la tabla hasta quese localiza la clave deseada. La busqueda binaria cortadrasticamente el tiempo de acceso para muchas tablas (*).

La descripcion de una tabla que procesara una busqueda binariarequiere de una entrada KEY (clave) ademas del indice.

01 TABLA.02 ELEMEN PIC 9(4) OCCURS 20 TIMES

INDEXED BY IASCENDING KEY IS CLA.

La KEY (clave) puede ser ASCENDING (ascendente) o DESCENDING(descendente).

(*) : El numero maximo de busquedas necesarias para localizar a un

elemento de la tabla que contengan un valor determinado se obtienepor la expresion:

x x-12 > numero de elementos de la tabla > 2

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

8 72 > 235 > 2

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

Esta declaracion permite la busqueda binaria en una tabladescrita con la opcion INDEXED BY.

El formato de esta declaracion es el siguiente:

SEARCH ALL identificador AT END declaracion-imperativa-1

declaracion-imperativa-2WHEN condicion

NEXT SENTENCE

Page 48: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 48/60

 

Las direcciones de los elementos de la tabla, a los que se hade acceder hasta localizar al que contenga un valor determinado,los calcula el sistema automaticamente. No hay que inicializar conun 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 ordende su escritura.

b) Si no se ha satisfecho la condicion se incrementa el indicede la tabla para poder hacer referencia al siguiente elementode la misma y se repite el paso a).

c) Si despues de la evaluacion se ha satisfecho la condicionque sigue a WHEN, la busqueda concluye pasando a ejecutarse ladeclaracion imperativa asociada con tal condicion. El indice,en ese momento, contendra el numero del elemento de la tablaque satisfizo la condicion.

d) Si se alcanza el final de la tabla sin haber satisfecho lacondicion que sigue a WHEN, la busqueda concluye y, por tanto,si se ha especificado la opcion AT END se ejecutara ladeclaracion imperativa que sigue a dicha opcion. Si se omite ATEND, la secuencia de ejecucion del programa pasa a la sentenciasiguiente.

Pero, a diferencia de la SEARCH, en la SEARCH ALL se deben detener en cuenta los siguientes puntos:

1.- Solo puede especificarse una palabra WHEN con unacondicion, y esta condicion solo puede ser del tipo de relacionEQUAL TO (=) o compuesta enlazada por el operador logico AND.

2.- Los elementos de la tabla deben estar ordenados en formaascendente (ASCENDING) o descendente (DESCENDING) por elcontenido del campo objeto de la busqueda.

3.- La variable que sea la KEY (clave) se debe incluir en lacondicion.

77 NOM PIC X(10) VALUE 'JUAN GOMEZ'.

01 TABLA.02 ELEM OCCURS 45 TIMES

INDEXED BY IASCENDING KEY NOMBRE.

03 NOMBRE PIC X(10).03 VENTAS PIC 9(4).

...................................

...................................

BUSQUEDA.

Page 49: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 49/60

 

SEARCH ALL ELEMEN AT END GO TO NOEXISTEWHEN NOMBRE(I) = NOM

MOVE NOMBRE(I) TO ...MOVE VENTAS(I) TO ...GO TO FIN.

45

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

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

I : INDICE

______________  INICIALIZAR MAYOR

MENOR --------------

___________________________________ 

_______ SI NO ------ MAYOR - MENOR = 1 ESTA -------

NO

____________________

MAYOR - MENOR I = ------------- 2 --------------------

TABLA(I)

______ = . . > __________ ESTA ----- ------ ----- MOVE I ------ . . TO MAYOR

BUSQUEDA ----------

<

Page 50: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 50/60

 

__________ 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 obtendre-mos '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 SEQUENTIALACCESS MODE IS SECUENTIALFILE 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 ficheroVSAM vacio de nueva creacion. Para solucionarlo hay que definirlocomo:

SELECT OPTINAL ddname ASSIGN...

.

.FILE STATUS IS st-xxxxxxx.

Page 51: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 51/60

 

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

IF st-xxxxxx = '00' OR = '05'

CORRECTOEND-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 actualdel 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 WORKINGo 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 unregistro especial ADDRESS OFF. Este registro guarda la direcciondel area, si este area esta redefinida la direccion ADDRESS OFsera 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:

Page 52: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 52/60

 

. 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 pointertendra 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 PIC X(290).03 RETORNO 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 esEND-EXEC. equivalente a las dos

anteriores.

49

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

Page 53: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 53/60

 

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 julianoPIC S9(7) COMP-3Campo de entrada/salida segun opcion

3. Fecha en formato DDMMAA o AAMMDDPIC X(6)Campo de entrada/salida segun opcion

OPCIONES :1. De Juliana a AAMMDD2. De Juliana a DDMMAA3. De AAMMDD a Juliana4. De DDMMAA a Juliana5. De AAMMDD a Juliana semestral

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

FORMA DE INVOCAR:

CALL 'SUTLD001' USING FECHA-OPCIONFECHA-JULIANAFECHA-NORMAL

50

EJEMPLO:

..........................................

77 FECHA-OPCION PIC X.77 FECHA-JULIANA PIC S9(7) COMP-3.77 FECHA-NORMAL PIC X(6).

..........................................

MOVE EIBDATE TO FECHA-JULIANA.MOVE '2' TO FECHA-OPCION.

CALL 'SUTLD001' USING FECHA-OPCIONFECHA-JULIANAFECHA-NORMAL.

Page 54: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 54/60

 

..........................................

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

51

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

FUNCION: Convierte los 8 bits de un byte a 8 bytes yviceversa.

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 elconvertido en el otro campo. Si la opcion no fuera ni 1 ni 2se devolveria un 9 en el propio campo de opcion.

FORMA DE INVOCAR:

CALL 'SUTLA002' USING W-SUTLA002

52

Page 55: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 55/60

 

EJEMPLO:

WORKING-STORAGE SECTION.

COPY CUTLD002

01 W-SUTLA002.03 W-OPCION PIC X.03 W-BITS8 PIC X.03 W-BYTES8.

05 BIT7 PIC X.05 BIT6 PIC X.05 BIT5 PIC X.05 BIT4 PIC X.05 BIT3 PIC X.05 BIT2 PIC X.05 BIT1 PIC X.

05 BIT0 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 aorganismos.

53

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

FUNCION: Calcula digito en funcion de la opcion recibida

LENGUAJE: Cobol

PARAMETROS:

1. CODIGO DE RETORNO

Page 56: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 56/60

 

PIC XObtenido en salida' ' : proceso correcto'9' : digito de control enviado no coincide

con el calculado (Salvo en opcion 5)

2. DIGITO.

PIC 9Obtenido en salida (Resultado del calculo)

3. OPCION.

PIC xRequerido en entrada'1' : Digito de tarjetas (enviar 12 dig.)'2' : Digito de cuentas (enviar 12 " )'3' : Digito clave SICA (enviar 9 " )'4' : Digito de Codigo Cliente (enviar 12 " )

'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 RETORNO PIC X.77 DIGITO PIC 9.77 OPCION PIC X.77 DATOS PIC 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 digitoincluido, para ser verificado. Si retorno not = 9 el digito escorrecto.

Page 57: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 57/60

 

Comprobar si la cuenta es correcta devolviendo el codigo deretorno al calcular el digito.

..........................................

77 RETORNO PIC X.

77 DIGIT PIC 9.77 OPCION PIC X.77 DATOS PIC 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-DIGITOMOVE '2' TO OPCIONMOVE CORR CUENTA-DIGITO TO CUENTA-DIGITO2MOVE CUENTA-DIGITO2 TO DATOSCALL 'SUTLA005' USING RETORNO DIGITO OPCION DATOS.IF RETORNO = ' '

DIGITO CORRECTO - CUENTA CORRECTA

ELSEDIGITO ERRONEO - CUENTA INCORRECTA.

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) COMP-3 VALUE +0.03 CONTANOS PIC S9(5) COMP-3 VALUE +0.03 D 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.

Page 58: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 58/60

 

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.

PROCEDURE DIVISION.

XXXX-CALCULO-DIAS.******************

MOVE ZEROS TO NUMDIAS.MOVE MM-DESDE TO D.MOVE AA-DESDE TO CONTANOS.

56

PERFORMUNTIL CONTANOS = AA-HASTA AND

D = MM-HASTAADD DIA(D) TO NUMDIASADD CN-1 TO DIF D > CN-12

MOVE CN-1 TO DMOVE CN-1 TO CONTANOS

END-IFIF CONTANOS = CN-100

MOVE ZEROS TO CONTANOS

END-IFEND-PERFORM.

SUBTRACT DD-DESDE FROM NUMDIASADD DD-HASTA TO NUMDIAS.

XXXX-CALCULO-DIAS-EXIT.***********************

EXIT.

****************************************************

----- NUMERO DE MESES ENTRE DOS FECHAS -----****************************************************

Page 59: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 59/60

 

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.

57

PROCEDURE DIVISION.

XXXX-CALCULO-MESES.*******************

MOVE ZEROS TO MESES.MOVE AA-DESDE TO CONTANOS.PERFORM WITH TEST BEFOREUNTIL CONTANOS = AA-HASTAADD CN-12 TO MESESADD CN-1 TO CONTANOSIF CONTANOS = CN-100

SUBTRACT CN-100 FROM CONTANOSEND-IFEND-PERFORM.ADD MM-HASTA TO MESES.SUBTRACT MM-DESDE FROM MESES.

XXXX-CALCULO-MESES-EXIT.************************

EXIT.

****************************************************

----- RESTAR UN PERIODO A UNA FECHA -----****************************************************

Page 60: COBOL

5/8/2018 COBOL - slidepdf.com

http://slidepdf.com/reader/full/cobol-559abf17a0ffe 60/60

 

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 DIAS01 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.