INTRODUCCIN TIPOS DE DATOS TIPOS DE PALABRAS REAS DE TRABAJO TIPOS DE CONSTANTES
CAPITULO II ESTRUCTURA DEL COBOL
IDENTIFICATION DIVISION ENVIRONMENT DIVISION DATA DIVISION PROCEDURE DIVISION
CAPITULO III VERBOS DE ENTRADA/SALIDA/ASIGNACIN/UTILITARIOS
DISPLAY ACCEPT MOVE
CAPITULO IV VERBOS ARITMETICOS
ADD SUBTRACT MULTIPLY DIVIDE COMPUTE
CAPITULO V CONDICIONALES
IF
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 2
EVALUATE
CAPITULO VI VERBOS DE CONTROL
PERFORM o BSICO o ANIDADOS o TIMES o UNTIL o THRU o VARYING o COMBINADO o LINEA TIMES UNTIL VARYING
CAPITULO VII FORMATOS DE EDICION
MASCARAS
CAPITULO VIII TABLAS DE MEMORIA
OCCURS DEPENDING ON ORDENAMIENTOS BUSQUEDAS
CAPITULO IX ARCHIVOS SECUENCIALES
OPEN CLOSE READ WRITE REWRITE
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 3
LINEAS DE BALANCE BUSQUEDAS EN ARCHIVOS
CAPITULO X ARCHIVOS INDEXADOS
OPEN CLOSE READ WRITE REWRITE START DELETE
CAPITULO XI SUBPROGRAMACION CALL LINK COPY
CAPITULO XII BUSQUEDAS EN ARCHIVOS
SIMPLES LINEAS DE BALANCES
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 4
CURSO DE COBOL
CAPITULO INTRODUCCIN Y GENERALIDADES
INTRODUCCION
C COMMAND O B BUSINESS O ORIENTED L LANGUAJE
HISTORIA
1959 1974 ANSI 1985 RMCOBOL/85 1991 COBOL ENTERPRISE (HOST) 2002 (COBOL ANSI-2002) 2007 Se esta preparando una nueva versin.
Existen varios compiladores que permiten emplear COBOL como lenguaje de scripting y de servicio Web, Tambin existen compiladores que permiten generar cdigo COBOL para la plataforma .NET Y EJB(Enterprise Java Beans).
REAL COBOL COBOL-I COBOL-II MICROFOCUS COBOL VICOBOL.
TIPOS DE DATOS
TIPO DATO FORMATO LONGITUD VALORES
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 5
ALFABETICOS A 256 car. A..Z, a..z NUMERICOS 9 18 dig. 0..9 ALFANUMERICO S X 256 car. A..Z, a..z,0..9, caracteres especiales.
TIPOS DE PALABRAS
USUARIO 30 Caracteres mximo No caracteres especiales (-)
EJM: LEER-ARCHIVO-MAESTRO
-CONTADOR CONTADOR-
RESERVADAS READ, DISPLAY, MOVE,etc.
REAS DE TRABAJO
A Columnas 8 a la 11 B Columnas 12 a la 72
1-6 Enumeracin automtica de las lneas 7 * - 73-80 No se utilizan
IDENTIFICATION DIVISION ENVIRONMENT DIVISION DATA DIVISION PROCEDURE DIVISION
8 IDENTIFICATION DIVISION. PROGRAM-ID. Nombre del programa. AUTHOR. Nombre del autor. INSTALLATION. Lugar donde est instalado. DATE-WRITTEN. Fecha de creacin. DATE-COMPILED. (Fecha de compilacin.) REMARKS. Comentarios.
EJM: 8 IDENTIFICATION DIVISION. PROGRAM-ID. PRUEBA. AUTHOR. SERGIO OSWALDO ROJAS BERNAL. INSTALLATION. BBVA COLOMBIA. DATE-WRITTEN. 23-AGO-2010. DATE-COMPILED. REMARKS. PROGRAMA QUE GENERA UNA PRUEBA DE COBOL.
8 12 ENVIRONMENT DIVISION. CONFIGURATION SECTION.
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 8
SOURCE-COMPUTER. Ordenador donde se escribi el fuente. OBJECT-COMPUTER. Ordenador donde se ejecuta el objeto. SPECIAL-NAMES. Cambiar valores para constantes del lenguaje, pueden variar en cada compilador. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT [OPTIONAL] Nombre-de-archivo ASSIGN TO Tipo-de-dispositivo ORGANIZATION IS Tipo de organizacion ACCESS MODE IS Mode de acceso al fichero RECORD KEY IS Clave del registro ALTERNATE RECORD KEY IS Claves alternativas registro WITH DUPLICATES FILE STATUS IS Variable de estado del fichero.
Para la linea de SPECIAL-NAMES el uso mas habitual es el de cambiar el punto decimal usado por los ingleses por la coma y asi poder especificar los puntos para los miles, su formato sera el siguiente:
SPECIAL-NAMES. DECIMAL-POINT IS COMMA.
Tambin podramos cambiar el valor del smbolo de la moneda con:
CURRENCY SIGN IS literal , suele ser un solo caracter y no puede coincidir con ninguno de los que usamos para definir las variables, es decir ni A,ni Z,ni 9,ni -,ni +,ni X, etc...
EJM: 8 12 ENVIRONMENT DIVISION. CONFIGURATION SECTION. SOURCE-COMPUTER. IBM 390. OBJECT-COMPUTER. IBM 390. SPECIAL-NAMES.
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 9
DECIMAL-POINT IS COMMA. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT NOMINA ASSIGN TO DISK DATOS ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL FILE STATUS IS VAR-ESTADO.
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 10
8 12 DATA DIVISION. FILE SECTION. WORKING-STORAGE SECTION. LINKAGE SECTION. COMMUNICATION SECTION. SCREEN SECTION. REPORT SECTION.
Niveles : 01 y 77 Subniveles : 02..49 Subnivel : 88 nombres de condicin
8 12 FILE SECTION. FD Nombre del fichero. BLOCK CONTAINS Numero de registros por bloque RECORDS RECORD CONTAINS Nmero de caracteres por registro CHARACTERS LABEL RECORD Etiqueta de registro DATA RECORD Nombre del registro. 01 Nombre del registro. 02 CAMPO 1. 02 CAMPO 2. 02 CAMPO 3. 02 CAMPO 4. . . 02 CAMPO n.
8 12 WORKING-STORAGE SECTION. 01 VAR-ENTERA PIC 9(8) VALUE ZEROS.
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 11
01 VAR-ENTERA PIC 99999999 VALUE ZEROS. 01 VAR-ALFABE PIC A(30) VALUE SPACES. 01 VAR-ALFANU PIC X(50) VALUE SPACES 01 RAYA PIC X(80) VALUE ALL -. 01 VAR-REAL PIC 9(8)V99 VALUE ZEROS. 01 VAR-REAL2 PIC 9(8)V9(2) VALUE ZEROS. 01 VAR-SIGNO PIC S9(8)V99 VALUE ZEROS. 77 IVA PIC 9V99 VALUE 0.16.
COMMUNICATION SECTION. SCREEN SECTION. REPORT SECTION.
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 12
8 12 PROCEDURE DIVISION (USING Variable, Variable ...). DECLARATIVES. Nombre-seccionSECTION. USE AFTER ERROR PROCEDURE ON tipo. Nombre-parrafo. Sentencias. ..... END DECLARATIVES. Nombre-seccion SECTION. Nombre-parrafo. Sentencias.
PROCEDURE DIVISION (USING Variable, Variable ...). Cuando especificamos USING en la linea de PROCEDURE DIVISION , despus deberemos de dar los nombres de variables que hayamos definido en la LINKAGE SECTION, para compartir en el programa, lo que nos indicar que ste ha sido llamado por otro programa y que esas variables traern un valor procedente del programa llamador, que a su vez utiliz la instruccin CALL con las mismas variables.
Se pondran tantos prrafos y secciones como quisieramos controlar, siempre teniendo en cuenta que sta se acaba cuando se indique END DECLARATIVES. Si no quisieramos utilizar sta seccin, podriamos de igual manera controlar los errores en nuestro programa preguntando siempre por la variable de error de cada fichero que se defini como FILE STATUS en la FILE-CONTROL.
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 13
CAPITULO III VERBOS DE ENTRADA/SALIDA/ASIGNACIN Y UTILITARIOS
ACCEPT: Verbo de Entrada
Formato para aceptar datos del sistema o variables de entorno.
ACCEPT variable FROM (DATE, DAY, DAY-OF-WEEK, TIME, CENTURY- DATE, CENTURY-DAY, ESCAPE-KEY,
Segn la opcin escogida, as ser el valor que contendr la variable usada, una vez completada la sentencia. Veamos cada una de las opciones:
DATE, devuelve la fecha en formato AAMMDD, por lo que la variable debe de estar definida con PIC 9(6). CENTURY-DATE, igual que DATE, pero acepta la fecha con 8 dgitos en formato SSAAMMDD. Definir con PIC 9(8). DAY, devuelve el ao y el da del ao en que estamos con el formato AADDD, siendo el valor 1, para el 1 de Enero y as sucesivamente. Debe de estar definida con PIC 9(5). CENTURY-DAY, igual que DAY, pero acepta 4 dgitos para el ao, quedando el formato AAAADDD. Definir con PIC 9(7). DAY-OF-WEEK, devuelve un dgito que indica el da de la semana, siendo 1 el Lunes, 2 el Martes, ... Aqu, la variable debe de estar definida como PIC 9. TIME, devuelve la hora con formato HHMMSSMM, la variable debe de estar como PIC 9(8). ESCAPE-KEY, devuelve el cdigo de la tecla de excepcin pulsada, debe de estar definida con PIC 99 y segn el compilador los valores pueden ser distintos, pero los bsicos suelen ser los mismos, por ejemplo: ENTER=13, FLECHA ARRIBA=52, FLECHA-ABAJO=53 y las teclas de funcin desde F01 hasta F8 tomaran los valores del 1 al 8, TAB=9. EJEMPLO: ACCEPT VAR-ENTERA ACCEPT VAR-FECHA FROM DATE
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 14
MOVE variable, valor TO variable, variable, variable, ....
EJEMPLO: A=B
MOVE B TO A
A= 0
MOVE 0 TO A MOVE ZEROS TO A
INITIALIZE, se utiliza para inicializar variables segn su tipo, es decir pondr a ceros todas las variables numricas o de edicin y a espacios en blanco las alfabticas y alfanumricas. WORKING-STORAGE SECTION. 01 CANCEN1-REG. 10 EL1LOT-EMISORA PIC X(10).
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 15
INSPECT, esta sentencia se utiliza para contar, reemplazar o contar y reemplazar caracteres o grupos de caracteres dentro de un campo. Se puede contar las veces que aparece un caracter, o cambiar todos esos caracteres por otros, etc ...
Esta instruccin tiene formatos diferentes segn lo que se desee hacer, as que vamos a ver cada uno de ellos por separado.
Formato 1:
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 16
INSPECT campo1 TALLYING variable1 FOR ( CHARACTERS) (( BEFORE/AFTER) INITIAL) Cadena1 (ALL)(LEADING) Cadena2 ... (Se puede repetir de nuevo)
Este formato es el utilizado para contar el nmero de veces que aparece Identificador1 en el campo1 y guardar el valor en la variable1 que previamente hayamos definido en la WORKING.
CHARACTERS, indica que cuente todos los caracteres del campo incluso los espacios en blanco. ALL, indica que tiene que buscar en todos los caracteres del campo, la cadena especificada en Cadena2. LEADING, indica que tiene que buscar la cadena especificada en Cadena2, pero solo hasta que encontremos uno diferente, si nada mas empezar es diferente el resultado sera directamente 0. BEFORE INITIAL, busca solo hasta que aparezca la cadena especificada como Cadena1. AFTER INITIAL, empieza a buscar justo despus de la cadena especificada en Cadena1.
EJEMPLO: WORKING-STORAGE SECTION. WORKING-STORAGE SECTION. 77 TEXTO PIC X(15) VALUE "PAGINA DE COBOL". 77 CONTA PIC 9(8). ... PROCEDURE DIVISION. INICIO. INSPECT TEXTO TALLYING CONTA FOR CHARACTERS. ... El valor de conta ser de 15 que son los caracteres que tiene la variable TEXTO.
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 17
INSPECT TEXTO TALLYING CONTA FOR ALL "A". ... El valor de conta ser de 2 que son las veces que aparece la letra A en la variable TEXTO.
INSPECT TEXTO TALLYING CONTA FOR LEADING "A". ... El valor de conta ser de 0 porque no aparece ninguna A en el primer carcter de la variable TEXTO.
INSPECT TEXTO TALLYING CONTA FOR ALL "A" BEFORE INITIAL "N". ... El valor de CONTA ser de 1 que son las veces que aparece la letra A en la variable TEXTO hasta la aparicin del caracter N.
INSPECT TEXTO TALLYING CONTA FOR ALL "A" AFTER INITIAL "G". ... El valor de CONTA ser de 1 que son las veces que aparece la letra A en la variable TEXTO, empezando a contar desde el caracter G. 77 TEXTO PIC X(15) VALUE "PAGINA DE COBOL". 77 CONTA PIC 9(8).... Formato 2:
INSPECT campo1 REPLACING variable1 CHARACTERS BY Cambio1 (( BEFORE/AFTER) INITIAL)Cadena1 (ALL)(LEADING)( FIRST) Cadena2... (Se puede repetir de nuevo)
Con este formato podemos cambiar caracteres de Campo1, su funcionamiento es igual que el anterior formato solo que en vez de contar reemplaza.
WORKING-STORAGE SECTION. 77 TEXTO PIC X(15) VALUE "PAGINA DE COBOL". 77 CONTA PIC 9(8). ...
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 18
PROCEDURE DIVISION. INICIO. INSPECT TEXTO REPLACING CHARACTERS BY "H". ... El valor de TEXTO ser "HHHHHHHHHHHHHHH", es decir cambia todos los caracteres por el caracter H.
INSPECT TEXTO REPLACING ALL "A" BY "I". ... El valor de TEXTO ser "PIGINI DE COBOL", es decir ha cambiado todas las A por I.
INSPECT TEXTO REPLACING FIRST "A" BY "O". ... El valor de TEXTO ser "POGINA DE COBOL", solo cambia la primera A por una O.
MOVE "PAGIPATOPETOPA" TO TEXTO. INSPECT TEXTO REPLACING ALL "PA" BY "--" AFTER INITIAL "G" BEFORE INITIAL "T". ... Complicando un poco mas, el valor de TEXTO despus de la sentencia INSPECT ser PAGI--TOPETOPA, es decir se cambia todas las PA por -- pero empezando a buscar a partir de la primera letra G y justo hasta la letra T.
MOVE "PAGIPATOPETOPA" TO TEXTO. INSPECT TEXTO TALLYING CONTA FOR ALL "PA" REPLACING ALL "TO" BY "PO" AFTER INITIAL "OP". ... Aqu hemos mezclado ambos formatos y el resultado es el siguiente. El valor de CONTA es 3 que son las veces que aparece la cadena PA en TEXTO y despus se ejecuta el REPLACING y el resultado da que TEXTO vale PAGIPATOPEPOPA, ya que ha cambiado todos los TO por PO pero despus de la cadena OP.
Formato 3:
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 19
INSPECT campo1 CONVERTING Identificador1 TO Identificador2 (( BEFORE/AFTER) INITIAL) Cadena1 ... (Se puede repetir de nuevo)
Con este formato convertimos los caracteres que se especifiquen en identificador1 por los que pongamos en identificador2, respetando el orden.
Veamos algunos ejemplos, se suele utilizar mucho para que al aceptar un campo nos de igual se ha sido introducido en maysculas o en minsculas ya que lo convertiramos a alguno de los formatos.
WORKING-STORAGE SECTION. 77 TEXTO PIC X(15) VALUE "PAGINA DE COBOL". ... PROCEDURE DIVISION. INICIO. INSPECT TEXTO CONVERTING "AO"TO "12". ... El valor de TEXTO ser "P1GIN1 DE C2B2L", convertir todas las A por 1 y todas las O por 2.
INSPECT TEXTO CONVERTING " ABCDEFGHIJKLMNOPQRSTUVWXYZ" TO "abcdefghijklmnopqrstuvwxyz". ... El valor de TEXTO ser "pagina de cobol" ya que ha convertido todas las letras maysculas por minsculas.
STRING, se utiliza para unir o concatenar campos o partes de estos y el resultado almacenarlo en otro campo. En la unin se pueden incluir tanto variables como literales o constantes de texto.
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 20
STRING campo1, literal1 DELIMITED BY (campo2, literal2)(SIZE) INTO Campo3 (WITH POINTER Identificador1) ( ON OVERFLOW Sentencia1) ( NOT ON OVERFLOW Sentencia2)
DELIMITED BY, indica hasta donde vamos a "coger" del campo para concatenar sin contar ese caracter o cadena que se especifique en campo2 o literal2, es decir si tenemos un campo con un valor = "HOLA" y especificamos DELIMITED BY "L" a la hora de la concatenacin nos hubiera cogido solo el HO, ya que al encontrarse la primera L hubiera parado. SIZE, indica que se pasar todo el contenido del campo1 o literal1 sin limitaciones. INTO, con esto indicamos en que variable se guardar el resultado, campo3. WITH POINTER, si incluimos esta clusula el valor de identificador1 ser en la posicin en que empezar a contener datos la variable que recibe el STRING. Ese identificador1 debe estar definido como binario. Por defecto el valor es 1. ON OVERFLOW, se ejecutara Sentencia1 si hubiera habido un error al hacer la concatenacin, por ejemplo si se especifica Identificador1 con un valor superior al tamao del Campo3. NOT ON OVERFLOW, se ejecutar Sentencia2 si no existe error en la operacin.
EJEMPLO:
STRING "HOY ES " VAR-DIA " DE " VAR-MES " DE " VAR-ANO DELIMITED BY SIZE INTO VAR-ENCADENA
Obtendriamos en VAR-ENCADENA: HOY ES 16 DE AGOSTO DE 2010 .
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 21
MOVE 4 TO PUNTO. STRING "HOY ES " DIA " DE " DELIMITED BY SIZE TMES (MES) DELIMITED BY " " " DE " ANIO DELIMITED BY SIZE INTO CONSTRING WITH POINTER PUNTO.
Es decir habr empezado a concatenar a partir de la posicin 4 del campo CONSTRING. Si el valor de CONSTRING previamente era espacios habra dejado 3 espacios en blanco y si hubiera sido cualquier otro hubiera respetado los 3 primeros caracteres que tuviera. UNSTRING, hace exactamente lo contrario de que hemos visto que haca STRING, es decir divide el contenido de un campo en otros.
UNSTRING campo1, literal1 DELIMITED BY (campo2, literal2)(ALL) OR (campo2, literal2)(ALL) (Se puede repetir de nuevo) INTO Campo3, Campo4, .... ( DELIMITER Identificador1) ( COUNT Identificador2) (Se puede repetir de nuevo) (WITH POINTER Identificador3) (TALLYING Identificador4) ( ON OVERFLOW Sentencia1) ( NOT ON OVERFLOW Sentencia2)
DELIMITED BY, indica el lmite hasta donde vamos cogiendo el campo1 para partirlo. Igual que en STRING, solo que con la funcin a la inversa. OR, es igual que DELIMITED y se utiliza si hay varios delimitadores sobre los que buscar. INTO, indica en que campo o campos se guardar la informacin que vaya fragmentando. DELIMITER, va a contener en cada caso el elemento separador, si hemos incluido en DELIMITED varios, Identificador1 guardar el carcter que de los elegidos ha sido el causante de la fragmentacin. COUNT, cuenta el nmero de caracteres incluidos en la fragmentacin. DELIMITER y COUNT, se podrn usar si se ha especificado DELIMITED. Podemos usar tantos DELIMITER y COUNT como campos
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 22
se vayan a crear en la fragmentacin. TALLYING, si especificamos esta opcin la instruccin nos guardar en Identificador4 el nmero de campos que se han utilizado en la fragmentacin. POINTER, indica desde que posicin va a ser examinado el campo que desea desfragmentar, por defecto su valor es 1, es decir desde el primer caracter. ON OVERFLOW, se ejecutara Sentencia1 si hubiera habido un error al hacer la operacin. NOT ON OVERFLOW, se ejecutar Sentencia2 si no existe error en la operacin.
WORKING-STORAGE SECTION. 01 LAFECHA PIC X(30) VALUE "HOY ES 16 DE AGOSTO DE 2010". 01 TEXTOS. 02 TEXTO1 PIC X(20). 02 TEXTO2 PIC X(20). 02 DIA 02 TEXTO3 PIC X(20). 02 ELMES PIC X(10). 02 TEXTO4 PIC X(20). 02 ELAO PIC X(10).
PROCEDURE DIVISION. INICIO. UNSTRING LAFECHA DELIMITED BY " " INTO TEXTO1 TEXTO2 DIA TEXTO3 ELMES COUNT LETRAS TEXTO4 ANIO.
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 23
REDEFINES.
Esta clusula permite dar a un campo o a un rea de memoria mas de un nombre y mas de un formato. Su formato es el siguiente: FILLER REDEFINES nombre de dato-2 nombre de dato-1
La clusula REDEFINES ha de ser la primera que siga al nombre de datos.
Los campos nombre de dato-1 y campos nombre de dato-2 han de estar declarados al mismo nivel, pero no a nivel 88.
La redefinicin de un campo compuesto se hace inmediatamente despus del ltimo de los campos elementales que forman parte de aquel.
Esta clusula va a permitir poder inicializar una tabla en el momento de declararla.
WORKING-STORAGE SECTION. 01 VAR-FECHA PIC X(10). 01 VAR-FECHA-PAR REDEFINES VAR-FECHA. 02 AO PIC 9(4). 02 FILLER PIC X(1). 02 MES PIC 9(2). 02 FILLER PIC X(1). 02 DIA PIC 9(2).
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 24
CAPITULO IV VERBOS ARITMETICOS
ADD SUBTRACT MULTIPLY DIVIDE COMPUTE
ADD: Suma
FORMATOS: 12 1.- ADD variable1 variable 2.... TO variable (ROUNDED) (ON SIZE ERROR ) instruccin NOT ON SIZE ERROR instruccin END-ADD
2.- ADD variable1 variable 2... GIVING variable (ROUNDED) (ON SIZE ERROR ) instruccin NOT ON SIZE ERROR instruccin END-ADD
A = A + B
ADD B TO A
A = A + B + 10 + J
ADD J 10 B TO A
A = B + J + C + D + 10
ADD 10 D C J B GIVING A
SUBTRACT: Resta
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 25
FORMATOS:
1.- SUBTRACT variable1 variable 2... FROM variable (ROUNDED) (ON SIZE ERROR ) instruccin NOT ON SIZE ERROR instruccin END-SUBTRACT
2.- SUBTRACT variable1 variable 2... FROM variable GIVING variable (ROUNDED) (ON SIZE ERROR) instruccin NOT ON SIZE ERROR instruccin END-SUBTRACT
A = A - B
SUBTRACT B FROM A
A = A - B - 10 - J
SUBTRACT J 10 B FROM A
A = B - J - C - D - 10
SUBTRACT 10 D C J FROM B GIVING A
MULTIPLAY: Multiplicacin.
FORMATOS:
1.- MULTIPLY variable BY variable ( ROUNDED) (ON SIZE ERROR ) instruccin NOT ON SIZE ERROR instruccin
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 26
END-MULTIPLY
2.- MULTIPLY variable literal BY variable literal GIVING variable (ROUNDED) (ON SIZE ERROR ) instruccin NOT ON SIZE ERROR instruccin END-MULTIPLY
A = A * B
MULTIPLY B BY A
C = A * B
MULTIPLY B BY A GIVING C
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 27
DIVIDE: Divisin
FORMATOS:
1.- DIVIDE variable literal INTO variable (ROUNDED) (ON SIZE ERROR ) instruccin (REMAINDER ) variable NOT ON SIZE ERROR instruccin END-DIVIDE
2.- DIVIDE variable literal (BY INTO) variable literal GIVING variable (ROUNDED) (REMAINDER ) variable (ON SIZE ERROR ) instruccin NOT ON SIZE ERROR instruccin END-DIVIDE
A = A / B
DIVIDE B INTO A
C = A / B
DIVIDE B INTO A GIVING C
C = A / B; Residuo en R
DIVIDE B INTO A GIVING C REMAINDER R
*Usando el BY
A = A / B
DIVIDE A BY B GIVING A
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 28
C = A / B
DIVIDE A BY B GIVING C
C = A / B; Residuo en R
DIVIDE A BY B GIVING C REMAINDER R
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 29
COMPUTE: Combinacin de operadores aritmticos.
COMPUTE , con sta orden podemos realizar todos los clculos aritmticos posibles en una sola instruccin, utilizando los operadores +(suma) -(resta) *(multiplicacin) /(divisin) **(potenciacin), adems de utilizar parntesis para especificar mejor la operacin a realizar.
FORMATO:
1.- COMPUTE variable (ROUNDED) = expresin aritmtica (ON SIZE ERROR) instruccin NOT ON SIZE ERROR instruccin END-COMPUTE
Jerarquas:
1. ( ) 2. ** 3. * / 4. + -
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 30
CAPITULO V CONDICIONALES
CONDICIONALES
1. IF
La sentencia IF toma una decisin referente a la accin a ejecutar en un programa, basndose en el resultado, verdadero o falso, de una condicin. Su formato es: IF [THEN] NEXT SENTENCE NEXT SENTENCE ELSE [END-IF] condicin accin-1 accin-2
El mbito de la sentencia IF finaliza de cualquiera de las formas siguientes:
1- Por un punto. 2- Por la clusula END-IF.
TIPOS DE IF CLASE SIGNO RELACION NOMBRES DE CONDICION ANIDADOS
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 31
CLASE: Nos permiten saber el contenido de un identificador o variable
Permiten saber si un campo es numrico o alfabtico. nombre datos IS [NOT] NUMERIC ALPHABETIC
ALPHABETIC-UPPER ALPHABETIC-LOWER
SIGNO: Permiten determinar si el valor de un campo numrico de una expresin aritmtica es positivo, negativo o cero. El formato general es el siguiente: nombre datos expr-aritmetica IS [NOT] POSITIVE NEGATIVE ZERO
RELACION:
El formato general para formar un condicin de relacin es: [NOT] [NOT] [NOT] [NOT] [NOT] [NOT] THAN THAN TO EQUAL LESS GREATER > < = nombre dato-1 literal expr-aritmetica IS nombre dato-1 literal expr-aritmetica
Condiciones combinadas.
Una condicin combinada esta formada por un conjunto de condiciones simples unidas por los operadores OR y AND. El formato es el siguiente: condicin simple condicin simple AND OR
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 32
Nombres de Condicin:
Permiten probar si un nombre de condicin al que se le ha asociado un determinado valor, coincide con el valor del campo de datos del cual depende.
ANIDADOS: Las sentencias IF...THEN pueden estar anidadas. Esto quiere decir que como accin-1 o accin-2, de acuerdo con el formato, puede escribirse otra sentencia IF.
La estructura presentada a continuacin, aparece con bastante frecuencia y es por lo que la damos un tratamiento por separado. Esta estructura es consecuencia del anidamiento de sentencias IF. IF ELSE IF [END-IF] ELSE condicin-1 sentencias-1 . . . condicin-2 sentencias-2 . condicin-3 ELSE IF . . sentencias-3 sentencias-n . .
2. EVALUATE
EVALUATE identificador/valor lgico ALSO identificador/valor lgico WHEN valor/nom-con Sent1 ALSO valor/nom-con Sent1 WHEN valor/nom-con Sent2 ALSO valor/nom-con Sent2 WHEN valor/nom-con Sent3 ALSO valor/nom-con Sent3
WHEN OTHER ALSO ANY
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 33
END-EVALUATE EJEMPLO EVALUATE TIPO WHEN 1 MOVE C TO VAR-DESCRI WHEN 2 MOVE T TO VAR-DESCRI WHEN 3 MOVE N TO VAR-DESCRI WHEN OTHER DISPLAY ERROR DE TIPO END-EVALUATE
EVALUATE EDAD ALSO SEXO WHEN 18 ALSO M ADD 1 TO CON-MUJERES WHEN 18 ALSO H ADD 1 TO CON-HOMBRES WHEN 30 ALSO ANY ADD 1 TO CON-EDAD-30 WHEN OTHER ADD 1 TO CON-OTROS END-EVALUATE
EVALUATE TRUE WHEN MUJER ADD 1 TO CON-MUJERES WHEN HOMBRE ADD 1 TO CON-HOMBRES WHEN OTHER ADD 1 TO CON-OTROS END-EVALUATE
CAPITULO VI VERBOS DE CONTROL
PERFORM CALL LINK
PERFORM
La sentencia PERFORM es utilizada para transferir explcitamente el control a uno o mas procedimientos y devolver el control implcitamente, cuando la
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 34
ejecucin del procedimiento especificado, finalice.
La sentencia PERFORM se puede utilizar para controlar la ejecucin de una o mas sentencias, las cuales estn dentro del mbito de la sentencia PERFORM.
Los tipos de PERFORM que maneja el COBOL son:
BSICO ANIDADOS TIMES UNTIL THRU VARYING COMBINADO LINEA o TIMES o UNTIL o VARYING
8 12 000223-ARMA-REG-SOL. MOVE SAP- CANAL TO SOL-COD-CAN
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 35
MOVE SAP-FEC-SOL-ULTI TO SOL-FEC-SOL INITIALIZE VARIABLES-FECHA MOVE '2' TO WS-OPC-FEC MOVE SAP-FECINI TO WS-FEC-08. .
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 36
ANIDADO o Dentro del mbito de una sentencia PERFORM, puede especificarse otra sentencia PERFORM, aunque hay que tener presentes las siguientes reglas: o 1- El procedimiento PERFORM ejecutado desde el mbito de otro PERFORM debe ser totalmente exterior o totalmente interior a este. o 2- Los mbitos de dos PERFORM se pueden solapar cuando las sentencias de llamada para su ejecucin estn fuera de estos mbitos. o 3- Las sentencias PERFORM pueden ser anidadas libremente. o 4- Un procedimiento PERFORM puede llamarse asimismo, esto es, la recursividad esta permitida.
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 40
PERFORM WITH TEST BEFORE AFTER procedimiento-1 VARYING FROM BY UNTIL nombre indice-1 nombre dato-1 literal nombre dato-2 nombre indice-2 nombre indice-3 nombre dato-3 condicin-1 AFTER FROM BY nombre indice-4 nombre dato-4 literal-2 nombre dato-5 nombre indice-5 nombre indice-6 nombre dato-6 UNTIL condicin-2
Realiza el PERFORM de la siguiente forma:
1- El nombre dato-1 y el nombre dato-4 se inicializan a los valores respectivos que siguen a cada FROM. 2- Se evala la condicin-1. Si es cierta, se da por finalizada la ejecucin de la sentencia PERFORM y se pasa a la sentencia siguiente en el programa. Si es falsa se pasa al punto 3. 3- Se evala la condicin-2. Si es cierta, el nombre dato-4 se inicializa al valor especificado por literal-2 o nombre dato-4 que sigue a FROM, tambin se suma a nombre dato-1 el valor especificado por nombre dato-3 que sigue a BY y se continua en el punto 2. Si es falsa se pasa al punto 4. 4- Se ejecutan las sentencias entre procedimiento-1 y procedimiento-2, si ha sido especificado. 5- Se suma a nombre dato-4 el valor especificado por nombre dato-6 que sigue a BY, y se vuelve al punto 3.
Los nombres dato y/o pueden ser enteros o reales, positivos o negativos y cero excepto los nombres de ndice que deben ser enteros.
EJEMPLO:
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 41
Hacer la suma de todos los elementos de una tabla de 2 dimensiones. 01 TABLA. 05 FILAS OCCURS 10 TIMES. 10 COLUMNAS OCCURS 10 TIMES PIC 99.
PROCEDURE DIVISION. INICIO. ................ PERFORM SUMA VARYING INDICE1 FROM 1 BY 1 UNTIL INDICE1 > 10 AFTER INDICE2 FROM 1 BY 1 UNTIL INDICE2 > 10. ..................... SUMA. ADD COLUMNAS ( INDICE1, INDICE2 ) TO ACUMULADOR.
Nota: El Orden con que se incrementa el Acumulador es el Sgte.
ADD COLUMNAS ( 1, 1 ) TO ACUMULADOR. ( 1, 2 ) TO ACUMULADOR. ( 1, 3 ) TO ACUMULADOR. . ( 1, 10 ) TO ACUMULADOR. ( 2, 1 ) TO ACUMULADOR. ( 2, 2 ) TO ACUMULADOR. ( 2, 3 ) TO ACUMULADOR. . ( 2, 10 ) TO ACUMULADOR. .
( 10, 1 ) TO ACUMULADOR. ( 10, 2 ) TO ACUMULADOR. ( 10, 3 ) TO ACUMULADOR. .
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 42
( 10, 10) TO ACUMULADOR.
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 43
COMBINADOS
o THRU CON VARYING PERFORM WITH TEST BEFORE AFTER [THRU procedimiento-1 procedimiento-2] VARYING FROM BY UNTIL nombre indice-1 nombre dato-1 literal nombre dato-2 nombre indice-2 nombre indice-3 nombre dato-3 condicin
o THRU CON UNTIL
PERFORM WITH TEST BEFORE AFTER [THRU procedimiento-1 procedimiento-2] UNTIL condicin
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 44
EN LINEA
o UNTIL EN LINEA
FORMATO: PERFORM WITH TEST AFTER BEFORE UNTIL END-PERFORM {sentencia} condicin ...
Cuando se emplea este formato, la sentencia PERFORM ejecuta el conjunto de sentencias que hay entre PERFORM y END-PERFORM hasta que la condicin sea verdad. Un punto, como final de alguna de las sentencias de esta estructura, dara lugar a un error, ya que se entendera como final de la sentencia PERFORM.
EJEMPLO:
021100-INICIALIZA-MAPA. MOVE 1 TO WRK-IND-X PERFORM UNTIL WRK-IND-X > 10 MOVE SPACES TO SAP-SELEC(WRK-IND-X) SAP-LINEA(WRK-IND-X) ADD 1 TO WRK-IND-X END-PERFORM SET CAA-88-ACCION-TERMINAL TO TRUE SET CAA-88-ESTADO-CONTIN TO TRUE MOVE 100 TO VAR-NUM.
VARYING EN LINEA
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 45
FORMATO: PERFORM WITH TEST BEFORE AFTER VARYING FROM BY UNTIL nombre indice-1 nombre dato-1 literal nombre dato-2 nombre indice-2 nombre indice-3 nombre dato-3 condicin
La ejecucin, si no se ha especificado la opcin TEST AFTER, se realiza de la forma siguiente: 1- El nombre dato-1 se inicializa al valor especificado por literal o nombre dato-2 que sigue a FROM. 2- Se evala la condicin. Si es cierta, se da por finalizada la ejecucin de la sentencia PERFORM y se pasa a la sentencia siguiente en el programa. Si es falsa se pasa al punto 3. 3- Se ejecutan las sentencias entre PERFORM y END-PERFORM. 4- Se suma a nombre dato-1 el valor especificado por nombre dato-3 que sigue a BY, y se vuelve al punto 2.
EJEMPLO:
021100-INICIALIZA-MAPA. MOVE 1O TO WRK-IND PERFORM VARYING X FROM 1 BY 1 UNTIL X > 5 MOVE SPACES TO SAP-LINEA(X) END-PERFORM SET CAA-88-ACCION-TERMINAL TO TRUE SET CAA-88-ESTADO-CONTIN TO TRUE MOVE 100 TO VAR-NUM. TIMES EN LINEA
Cuando se emplea este formato, la sentencia PERFORM ejecuta el numero de veces especificado por entero o por nombre de datos, el conjunto de sentencias que hay entre PERFORM y END-PERFORM. Un punto, como final de alguna de las sentencias de esta estructura, dara lugar a un error,
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 46
ya que se entendera como final de la sentencia PERFORM.
PERFORM TIMES END-PERFORM entero nombre datos {sentencia}.....
EJEMPLO:
021100-INICIALIZA-MAPA. MOVE 1 TO X PERFORM 5 TIMES MOVE SPACES TO SAP-LINEA(X) ADD 1 TO X END-PERFORM SET CAA-88-ACCION-TERMINAL TO TRUE SET CAA-88-ESTADO-CONTIN TO TRUE MOVE 100 TO VAR-NUM.
CAPITULO VII FORMATOS DE EDICION
Se utilizan para presentar de una forma clara por pantalla o por la impresora los campos o datos numricos.
El significado de cada uno de estos caracteres es el siguiente:
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 47
Z Representa una cifra del 0 al 9. Si la cifra a escribir se corresponde con un 0 no significativo, se escribe en su lugar un espacio en blanco. * Representa una cifra del 0 al 9. Si la cifra a escribir se corresponde con un 0 no significativo, se escribe en su lugar un *. Los caracteres Z y * no pueden ir precedidos, pero si seguidos del carcter 9. . El punto hace que se inserte un punto decimal para separar la parte entera de la parte decimal. , La coma hace que se inserte este mismo carcter en el lugar que se indica en la especificacin de formato.
La clusula DECIMAL-POINT IS COMMA en la ENVIRONMENT DIVISION, permite invertir el papel del punto y la coma en las especificaciones de formato en la edicin. B Permite que se inserte un espacio en blanco en el lugar que se indica en la especificacin de formato. 0 Permite que se inserte un cero en el lugar de que se indica en la especificacin de formato. / Permite que se inserte una barra en el lugar de que se indica en la especificacin de formato. CR Smbolo bancario indicativo de crdito. Solo puede colocarse a la derecha de la especificacin de formato. CR aparece sobre la lnea que se imprime si el valor es negativo. Si el valor es positivo aparecern en su lugar 2 espacios en blanco. DB Smbolo bancario indicativo de dbito. Solo puede colocarse a la derecha de la especificacin de formato. DB aparece sobre la lnea que se imprime si el valor es negativo. Si el valor es positivo aparecern en su lugar 2 espacios en blanco. $ Un carcter $ colocado en el primer lugar en la especificacin de formato, permite la aparicin de este carcter en el lugar indicado. + Un carcter + colocado en primer o ultimo lugar en la especificacin de formato, permite la aparicin de un + para valores positivos y de un - para valores negativos en el lugar indicado. - Un carcter + colocado en primer o ultimo lugar en la especificacin de formato, permite la aparicin de un espacio en blanco para valores positivos o un - para valores negativos en el lugar indicado.
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 48
$$.. . La aparicin en una especificacin de formato de n caracteres $, permite editar un valor de n-1 cifras. Si la cifra a escribir se corresponde con un 0 no significativo, se escribe en su lugar un espacio en blanco, excepto a la izquierda de la primera cifra significativa que se inserta un carcter $. ++.. . La aparicin en una especificacin de formato de n caracteres +, permite editar un valor de n-1 cifras. Si la cifra a escribir se corresponde con un 0 no significativo, se escribe en su lugar un espacio en blanco, excepto a la izquierda de la primera cifra significativa que se inserta un carcter + para los valores positivos o un - para los valores negativos. -- La aparicin en una especificacin de formato de n caracteres +, permite editar un valor de n-1 cifras. Si la cifra a escribir se corresponde con un 0 no significativo, se escribe en su lugar un espacio en blanco, excepto a la izquierda de la primera cifra significativa que se inserta un carcter - para los valores negativos.
CAPITULO VIII TABLAS DE MEMORIA
DEFINICION Es un conjunto de valores almacenados en posicin de almacenamiento consecutivo y con un nombre de dato asignado. La referencia a un elemento especifico de la tabla se hace mediante el uso de un slo nombre con un subndice que identifica la posicin de un elemento en particular. CLAUSULA OCCURS:
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 49
Define el tamao de la tabla. No puede aparecer en lneas a nivel 01, ni 77, ni 88. FORMATO A: OCCURS entero1 [TIMES]
FORMATO B: OCCURS entero1 [TIMES] PIC ...
Ejemplo: Crea una tabla de 5 elementos y cada elemento compuesto por 2 campos con la picture indicada.
Ejemplo: Crea una tabla de 100 elementos de 2 caracteres numricos.
01 TABLA. 05 ELEMENTOS OCCURS 100 PIC 99.
01 TABLA. 05 ELEMENTOS OCCURS 100 PIC 99 VALUE ZERO.
CLAUSULA REDEFINES EN TABLAS
FUNCION:
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 50
Redefine una zona de memoria: Obligatoriamente debe siempre ir despus del campo que redefinimos Tiene que llevar el mismo nmero de nivel que el campo que redefinimos. No puede ponerse una clusula REDEFINES junto con una instruccin OCCURS.
Ejemplo: Redefinimos un campo alfanumrico en una tabla en la que cada elemento es un mes del alto. 01 MESES. 05 NOMBRE-MESES 10 FILLER PIC X(9) VALUE "ENERO ". 10 FILLER PIC X(9) VALUE "MARZO ". . . . 10 FILLER PIC X(9) VALUE "DICIEMBRE". 05 TABLA-MESES REDEFINE NOMBRE-MESES. 10 MES PIC X(9) OCCURS 12 TIMES.
INSTRUCCION MOVE EN TABLAS El uso de la instruccin MOVE TABLA TO ..... da como resultado el movimiento de todos sus elementos. Para referenciar un elemento de la tabla se indica el nombre de dicho elemento y el ndice entre parntesis separado por un espacio.
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 51
Cuando hacemos referencia a un grupo de elementos se consideran alfanumricos para propsitos del MOVE. Ejemplo: Mover un elemento de la tabla a una variable. 01 TABLA. 05 ELEMENTO OCCURS 50 TIMES. 10 ELE1 PIC 9(6)V99. 10 ELE2 PIC 9(6)V99. . . . MOVE ELE1 ( 34 ) TO IMPORTE.
Ejemplo: Mover las letras de la A a la F a una tabla. 01 TABLA. 05 LETRAS OCCURS 6 TIMES PIC X. . . . MOVE "ABCDEF" TO TABLA.
TABLAS DE VARIAS DIMENSIONES El concepto de DIMENSIN se refiere a categorias por medio de las cuales los datos son organizados dentro de las tablas. Puede haber tablas de hasta 7 dimensiones. La forma de referenciar un elemento es por medio de tantos subndices como sea la dimensin de la tabla, separados por espacios.
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 52
Ejemplo: Crear un tabla que tenga 5 departamentos y dentro de cada departamento 5 vendedores con sus ventas. 01 TABLA-DEPARTAMENTOS. 05 DEPARTAMENTOS OCCURS 5 TIMES. 10 VENTAS OCCURS 5 TIMES PIC 9(7).
Preguntar si el vendedor 5 del departamento 1 ha vendido ms de $ 25.000.
IF VENTAS ( 1, 5 ) > 25.000
TABLAS VARIABLES Se dice que una tabla es variable cuando su tamao vara de una ejecucin a otra.
FORMATO: OCCURS entero-1 TO entero-2 TIMES DEPENDING ON numero-datos
El campo entero-1 y entero-2 son el mnimo y el mximo nmero de elementos que puede contener la tabla, dependiendo del valor que tenga numero-datos.
Ejemplo: Una tabla que tenga de 100 a 200 elementos segn el nmero de artculos existentes. 01 TABLA. 05 ARTICULOS OCCURS 100 TO 200 DEPENDING ON N-ARTICULOS.
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 53
PERFORM VARYING EN EL MANEJO DE TABLAS FUNCION: Se utiliza para hacer recorridos por los elementos de una tabla. EJEMPLO: Hacer la suma de todos los elementos de una tabla de 2 dimensiones. 01 TABLA. 05 FILAS OCCURS 10 TIMES. 10 COLUMNAS OCCURS 10 TIMES PIC 99.
PROCEDURE DIVISION. INICIO. ................ PERFORM SUMA VARYING INDICE1 FROM 1 BY 1 UNTIL INDICE1 > 10 AFTER INDICE2 FROM 1 BY 1 UNTIL INDICE2 > 10. ..................... SUMA. ADD COLUMNAS ( INDICE1, INDICE2 ) TO ACUMULADOR.
Nota: El Orden con que se incrementa el Acumulador es el Sgte.
ADD COLUMNAS ( 1, 1 ) TO ACUMULADOR. ( 1, 2 ) TO ACUMULADOR. ( 1, 3 ) TO ACUMULADOR. . ( 1, 10 ) TO ACUMULADOR. ( 2, 1 ) TO ACUMULADOR. ( 2, 2 ) TO ACUMULADOR. ( 2, 3 ) TO ACUMULADOR. . ( 2, 10 ) TO ACUMULADOR. . ( 10, 1 ) TO ACUMULADOR. ( 10, 2 ) TO ACUMULADOR. ( 10, 3 ) TO ACUMULADOR.
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 54
. ( 10, 10) TO ACUMULADOR.
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 55
TABLAS INDEXADAS
FUNCION: Nos permite indexar una tabla para posteriormente hacer bsquedas sin necesidad de recorrerla entera. FORMATO: ASCENDING OCCURS entero TIMES KEY IS dato-1 [dato2...] DESCENDING
[INDEXED BY indice-1 [indice-2...]]
La opcin ASCENDING o DESCENDING KEY IS slo se utiliza en el caso de que la tabla se encuentre ordenada por una o varias claves. La opcin INDEXED BY indica el o los ndices que vayamos a utilizar, son obligatorios en caso de utilizar la instruccin SEARCH. Los ndices-1 e ndice-2, si se ponen hay que declararlos en la WORKING-STORAGE SECTION como USAGE IS INDEX.
Ejemplo: 01 CAMPOS. 05 INDICE USAGE IS INDEX. 01 TABLA. 05 ELEMENTOS OCCURS 10 INDEXED BY INDICE.
INSTRUCCION SET
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 56
FUNCION: Para inicializar ndices o cambiar su contenido. Slo los declarados como USAGE INDEX. FORMATO: TO entero SET indice UP BY DOWN BY variable
El parmetro TO inicializa el ndice al valor que pongamos en entero o variable. El parmetro UP BY suma al ndice el valor que pongamos en entero o variable. El parmetro DOWN BY resta al ndice el valor que pongamos en entero o variable.
Ejemplo: Inicializar el indice en 2. SET INDICE TO 2.
Ejemplo: Restar 3 al indice. SET INDICE DOWN BY 3.
INSTRUCCION SEARCH
FUNCION:
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 57
Sirve para buscar un elemento o varios en una tabla. Esta opcin puede ser utilizada con subndices pero es mucho mas lenta. FORMATO: ndice SEARCH identificador VARYING AT END accin-1 variable
WHEN condicin-1 accin-2 [WHEN condicin-2 accin-3 ]
El identificador es el elemento de la tabla donde se va a hacer la bsqueda. AT END accin-1 es lo que tiene que hacer en caso de que la tabla se haya terminado y el elemento no lo haya localizado. Condicin-1 y opcionalmente condicin-2 son las condiciones que tienen que cumplir un determinado elemento de la tabla al cual se est buscando. La opcin VARYING ndice, hace que el vare el ndice de indexacin de la tabla. Ejemplo: Hacer un DISPLAY de el precio del pan. 01 CAMPOS. 05 INDICE USAGE INDEX. ...................... 01 TABLA-ARTICULOS. 05 ARTICULOS OCCURS 50 TIMES PIC X(10) INDEXED BY INDICE.
01 TABLA-PRECIOS. 05 PRECIOS OCCURS 50 TIMES PIC 9(5). ....................................... PROCEDURE DIVISION. INICIO. ............ SEARCH ARTICULOS AT END PERFORM ART-INEXISTENTE WHEN ARTICULOS ( INDICE ) = "PAN "
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 58
DISPLAY PRECIOS ( INDICE ).
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 59
CAPITULO IX ARCHIVOS SECUENCIALES
DEFINICION:
De sta organizacin se deriva el formato del fichero, SEQUENTIAL si los registros se graban secuencialmente conforme se dan entrada sin importar si estn o no repetidos, un ejemplo claro son los archivos de impresora, todos los listados son secuenciales.
Clusula SELECT para ficheros secuenciales:
SELECT [OPTIONAL] ASSIGN TO ORGANIZATION IS [RECORD] LINE SEQUENTIAL nombre-fichero-1 dispositivo [FILE STATUS IS nombre-de-dato] [ACCESS MODE IS SEQUENTIAL]
Clusula SELECT es aqui donde especificamos el nombre lgico que va a tener el fichero dentro del programa, suele ser una palabra que identifique lo mas claro posible el contenido del fichero, por ejemplo ARTICULOS, PROVEEDORES, CLIENTES.
Clusula OPTIONAL si indicamos esta opcin al hacer un OPEN I-O, si el archivo no existe, se crea. Con lo cual nos evitamos tener que abrirlo como OUTPUT y cerrarlo, antes de poder utilizarlo por primera vez.
Clusula ASSIGN aqui especificamos el tipo de dispositivo, si es una impresora PRINTER, si es un fichero sobre el que vamos a grabar RANDOM o DISC, se pueden utilizar otros como INPUT, INPUT-OUTPUT, CASSETTE, MAGNETIC- TAPE, pero sin duda los mas utilizados son los dos primeros para identificar si el fichero utilizar una salida impresa o se utilizar sobre disco.
Clusula ORGANIZATION aqui indicamos la organizacin de los registros de
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 60
nuestro fichero, Donde debe ser SEQUENTIAL
Si se omite la clusula ORGANIZATION se asume organizacin secuencial y si se omite la clusula ACCESS se asume acceso secuencial.
La organizacin RECORD SEQUENTIAL, se refiere a un fichero secuencial estndar. En este, la longitud de cada registro se especifica por dos bytes que preceden al propio registro. La organizacin LINE SEQUENTIAL, es la opcin por defecto, y hace que cada registro vaya seguido de un carcter fin de lnea que acta como delimitador.
En la clusula SELECT tambin se puede especificar el fichero como un fichero en mltiples carretes de cinta magntica, mediante la frase ASSIGN TO MULTIPLE REEL FILE nombre-externo-del-fichero.
FILE SECTION. En esta seccin describiremos los campos que van a componer el registro de cada uno de los archivos con los que vamos a trabajar, sta sera su sintaxis:
Clusula FD para ficheros secuenciales: 8 12 FD nombre del fichero
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 61
LABEL RECORD [RECORDING MODE IS] [BLOCK CONTAINS] [RECORD CONTAINS] [DATA RECORD IS]
Clusula FD nombre del fichero que previamente habiamos descrito en la clusula SELECT de la INPUT-OUTPUT SECTION en la ENVIRONMENT DIVISION.
Clusula BLOCK CONTAINS cuando queremos que por cada bloque en disco se graben mas de un registro, aqui especificamos el nmero de ellos que va a contener cada bloque, (512, 1024), si no se especifica se supone que cada registro va a ocupar un bloque de memoria, o bien ser el propio compilador el que haga el clculo mas apropiado.
Clusula RECORD CONTAINS el nmero de caracteres que tiene el registro sumando todos sus campos, puede ser fija o variable. Si es fija utilizamos un valor y si es variable un rango desde hasta, si no se espicifica ser el propio compilador quien la determine.
Clusula LABEL RECORD puede tener dos valores STANDARD u OMITTED , el primer caso indica que cada vez que se accede a un registro el compilador har las comprobaciones estandares descritas por el propio compilador y en el segundo stas sern omitidas. Para el caso de los ficheros de datos en disco se suele poner STANDARD y cuando el fichero es de impresora se indica OMITTED.
Clusula DATA RECORD debido a que un mismo fichero puede tener varias descripciones de registro, aqui indicamos los nombre de stas que debern estar descritas a nivel 01. Normalmente no se utiliza y casi siempre se suele utilizar una sola descripcin por fichero, por lo que no suele aparecer en casi ningn programa.
Sentencia OPEN:
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 62
La operacin de abrir un fichero, establece una comunicacin entre el rea de E/S asociada a ese fichero y el dispositivo externo que lo soporta, comprueba las etiquetas en los ficheros de entrada y las crea para los ficheros de salida, y sita el puntero de lectura-escritura en el primer registro o al final del fichero dependiendo del modo en que se haya abierto el fichero.
Formato 1: OPENINPUT fichero-1 REVERSED WITH NO REWIND LOCK ...
Formato 2:
OPENOUTPUT fichero-1 REVERSED WITH NO REWIND LOCK ...
Formato 3:
OPEN I-O {fichero-3 [WITH LOCK ]}...
Formato 4:
OPEN EXTEND {fichero-4 [WITH LOCK ]}...
EJEMPLO
OPEN INPUT NOMINA OPEN OUTPUT CARGOS OPEN I-O SALDOS OPEN EXTEND SALIDAS
Si el fichero esta almacenado en un soporte que permite la operacin de rebobinar y se especifica la clusula REVERSED, los datos para una sentencia READ
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 63
quedan disponibles en orden inverso, esto es, comenzando por el ultimo. La clusula NO REWIND hace que el carrete de cinta no se rebobine. Esto puede ser muy til cuando en una cinta hay mltiples ficheros.
Si se especifica la frase WITH LOCK, el efecto es equivalente a especificar LOCK MODE EXCLUSIVE en la sentencia SELECT correspondiente a este fichero, esto es, el fichero no puede ser compartido por otros procesos.
Un fichero abierto en modo OUTPUT es implcitamente un fichero no compartible. Para que mas de un proceso puedan compartir un fichero hay que abrirlo en modo I-O.
Cuando se especifica la clusula INPUT, se abre el fichero especificado para leer. El puntero de lectura se sita en el primer registro. Si el fichero no existe se produce un error.
Cuando se especifica la clusula OUTPUT, se abre el fichero especificado para escribir. Si el fichero que se abre existe, se destruye su contenido actual crendose as de nuevo. Si no se existe se crea.
Cuando se especifica la clusula I-O, se abre el fichero especificado para leer y escribir. El puntero de lectura-escritura se sita en el primer registro. Si este no existe se crea. En este caso una operacin de lectura dara lugar a una condicin de fin de fichero y una operacin de escritura dara lugar a un error. Este modo no se puede utilizar con una organizacin LINE SEQUENTIAL.
Cuando se especifica la clusula EXTEND, significa que se van aadir datos a un fichero con modo de acceso secuencial. De esta forma podemos aadir mas registros a un fichero existente. Si el fichero no existe se crea.
Sentencia CLOSE.
Esta sentencia finaliza el proceso de uno o varios ficheros. CLOSE REEL UNIT WITH NO REWIND LOCK ... fichero-1
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 64
EJEMPLO
CLOSE NOMINA CLOSE CARGOS CLOSE SALDOS SALIDAS
Cada fichero abierto por medio de una sentencia OPEN, debe ser cerrado por una sentencia CLOSE bien cuando finaliza el programa o bien cuando se desea abrirlo de modo diferente. Una sentencia CLOSE puede cerrar uno o mas ficheros.
Las opciones REEL y UNIT se utilizan con cintas magnticas y discos magnticos respectivamente para indicar que le fichero tratado es multivolumen.
La opcin NO REWIND se utiliza para anular la operacin de rebobinado que se produce normalmente al cerrar un fichero contenido en cinta magntica.
La opcin WITH LOCK hace que el fichero cerrado no pueda volverse a abrir durante el resto de la ejecucin del proceso en cuestin.
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 65
Sentencia WRITE:
Cuando se ejecuta esta sentencia se efecta una operacin de salida o de escritura de un registro lgico con destino a un fichero de salida o de entrada- salida. Estas transferencias de informacin se hacen a travs del rea de memoria asignada al fichero aunque esta operacin es transparente al usuario.
WRITE registro [FROM nombre-dato-1] BEFORE AFTER [LINE[S]] [LINE[S]] ADVANCING PAGE TAB FORMFEED nombre-de-dato-2 entero AT END-OF-PAGE EOP sentencia-1 AT END-OF-PAGE EOP sentencia-1 NOT [END-WRITE]
Registro identifica el nombre del registro lgico que se desea escribir. Este estar declarado en la FILE SECTION o en la DATA DIVISION. El fichero asociado debe abrirse en modo OUTPUT o EXTENDED.
Si se especifica la opcin FROM, primero se mueve el contenido del campo referenciado por nombre-de-dato-1 al campo referenciado por registro y a continuacin se efecta la operacin de escribir.
Las opciones BEFORE o AFTER ADVANCING se aplican solamente a ficheros de salida impresos e indican, escribir el registro antes de (BEFORE) o despus de (AFTER) avanzar, entero o nombre-de-dato-1 lneas, pagina (PAGE o FORMFEED), o tabulacin vertical (TAB).
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 66
Nombre mnemnico es un nombre creado por el programador con el fin de asociarlo en el prrafo SPECIAL-NAMES a una palabra reservada COBOL.
Si se especifica END-OF-PAGE o su equivalente EOP, debe especificarse la clusula LINAGE en la descripcin del fichero (FD) en el cual estamos escribiendo. EOP es una condicin que es cierta cuando se alcanza el final de la pagina lgica, en cuyo caso se ejecuta sentencia-1.
Sentencia-1 y sentencia-2 son sentencias imperativas, esto es, no condicionales.
Cuando en la descripcin de un fichero se utiliza la clusula LINAGE no se puede utilizar ADVANCING nombre-nemonico.
END-WRITE solo se puede utilizar con END-OF-PAGE y sirve para delimitar el mbito de la sentencia WRITE.
Si el tipo de organizacin es RECORD SEQUENTIAL y en la sentencia WRITE no se utiliza la opcin ADVANCING, se asume el avance automtico equivalente a haber especificado, BEFORE ADVANCING 1 LINE.
EJEMPLO
WRITE REG-NOMINA END-WRITE
WRITE REG-NOMINA FROM TITULO-1 AFTER PAGE END-WRITE
WRITE REG-NOMINA FROM DETALLE AFTER 1 END-WRITE.
Sentencia READ:
Cuando se ejecuta esta sentencia se deja disponible un registro lgico en el rea de entrada, para ser procesado.
READ fichero RECORD [INTO nombre de dato] [WITH [NO] LOCK] [AT END sentencia-1]
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 67
[NOT AT END sentencia-2] [END-READ]
Fichero es el nombre simblico del fichero del cual se quiere leer un registro. Este fichero tiene que ser abierto en modo INPUT o I-O.
Cuando se abre el fichero el puntero de lectura-escritura apunta al primer registro a leer y cada vez que se ejecuta una sentencia READ se lee un registro y el puntero de lectura-escritura avanza para apuntar al siguiente registro a leer.
Si se especifica la opcin INTO, la sentencia READ adems de dejar disponible un registro lgico en el rea de entrada, esto es, en el registro de entrada esta definido en la FD, mueve el contenido de este registro al rea de datos especificada por nombre de datos.
La opcin INTO no puede ser utilizada cuando el fichero contiene registros de varios tipos.
La frase AT END es una condicin que es cierta cuando al ejecutarse una sentencia READ se detecta el final del fichero, en cuyo caso se ejecuta la sentencia-1. Si la condicin resulta ser falsa, entonces se ejecuta, despus de haberse realizado la operacin de lectura, la sentencia-2, si la frase NOT AT END ha sido especificada, y se pasa a la sentencia siguiente.
Sentencia-1 y sentencia-2 son sentencias imperativas, esto es, no condicionales.
Aunque la frase AT END sea opcional, debe especificarse cuando se acceda secuencialmente a los registros de un fichero, para poder detectar cuando se llega al final del mismo.
END-READ delimita el mbito de la sentencia READ
En un fichero secuencial abierto en modo INPUT, la sentencia READ o READ WITH LOCK no puede leer un registro en modo exclusivo.
En un fichero abierto en modo I-O con LOCK MODE AUTOMATIC, a menos que se especifique la opcin WITH NO LOCK, cada registro en el momento de leerse es exclusivo, no compartido, siendo liberado cuando finaliza la lectura.
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 68
En un fichero abierto en modo I-O con LOCK MODE MANUAL, cada registro en el momento de leerse no es exclusivo a menos que se especifique la opcin WITH LOCK en la sentencia READ.
EJEMPLO:
READ SALDOS AT END MOVE 1 TO FDA NOT AT END PERFORM CALCULOS END-READ
READ SALDOS INTO REG-SALIDA AT END MOVE 1 TO FDA NOT AT END PERFORM CALCULOS END-READ
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 69
Modificar un registro secuencial:
Si el fichero se abre en modo I-O, es posible modificar el ultimo registro ledo por medio de la sentencia REWRITE, la cual presentamos a continuacin.
Sentencia REWRITE.
Este sentencia permite reemplazar un registro existente en un fichero en disco por otro registro.
REWRITE registro [FROM nombre-de-dato] [END-REWRITE]
Registro es el nombre de un registro lgico especificado en la FILE SECTION de la DATA DIVISON. El fichero asociado con este registro debe ser un fichero residente en disco y abierto en modo I-O.
El numero de caracteres del registro a reemplazar debe ser igual al numero de caracteres del registro que lo va a reemplazar.
Para ficheros en los que el modo de acceso es secuencial la ultima sentencia ejecutada antes de la ejecucin de la sentencia REWRITE, debe ser una sentencia READ. El registro reemplazado ser lgicamente el registro ledo.
La posicin indicada por el puntero de lectura-escritura ser la misma despus de haber ejecutado una sentencia REWRITE.
EJEMPLO:
REWRITE REG-SALDOS FROM REG-DATOS END-REWRITE
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 70
CAPITULO X ARCHIVOS INDEXADOS
DEFINICION
Un fichero indexado es un fichero con organizacin secuencial indexada. La organizacin secuencial indexada o de ndices es un modelo de almacenamiento de datos que se apoya en una tabla de ndices que acta como ndice y en un fichero de datos.
SELECT [OPTIONAL] ASSIGN TO RESERVE NO ALTERNATE AREA AREAS ORGANIZATION IS ACCESS MODE IS SEQUENTIAL nombre-fichero-1 DISK entero-1 [LOCK MODE IS modo-de-cierre] [FILE STATUS IS nombre-de-dato-3] INDEXED RANDOM DYNAMIC RECORD KEY IS nombre dato-1 clave-m = nombre dato-4,[nombre dato-5] ... ALTERNATE RECORD KEY IS nombre dato-1 clave-m = nombre dato-6,[nombre dato-7] ...
Clusula SELECT es aqui donde especificamos el nombre lgico que va a tener el fichero dentro del programa, suele ser una palabra que identifique lo mas claro posible el contenido del fichero, por ejemplo ARTICULOS, PROVEEDORES, CLIENTES.
Clusula OPTIONAL si indicamos esta opcin al hacer un OPEN I-O, si el archivo
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 71
no existe, se crea. Con lo cual nos evitamos tener que abrirlo como OUTPUT y cerrarlo, antes de poder utilizarlo por primera vez.
Clusula ASSIGN aqui especificamos el tipo de dispositivo, si es una impresora PRINTER, si es un fichero sobre el que vamos a grabar RANDOM o DISC, se pueden utilizar otros como INPUT, INPUT-OUTPUT, CASSETTE, MAGNETIC- TAPE, pero sin duda los mas utilizados son los dos primeros para identificar si el fichero utilizar una salida impresa o se utilizar sobre disco. Para identificar ficheros utilizados para clasificar utilizaremos SORT.
Clusula ORGANIZATION aqui indicamos la organizacin de los registros de nuestro fichero, INDEXED. Es la mas utilizada e identifica a ficheros que sus registros son accesibles mediante una clave unica e irrepetible o por varias que pueden estar duplicadas, cualquier fichero de mantenimiento, por ejemplo de ARTICULOS, podra ser INDEXED, y cada cdigo ser nico para cada artculo y con el nos iremos a su posicin y podremos ver todos los demas datos que hagan referencia al registro.
Existe tambin para los archivos de texto, tipo AUTOEXEC.BAT la posibilidad de asignarlos directamente especificando LINE SEQUENTIAL en sta clausula.
Clusula ACCESS MODE indica el modo de acceso al fichero, puede ser SEQUENTIAL, RANDOM o DYNAMIC, si no se especifica ninguno o si el fichero es SEQUENTIAL entiende que el modo ser SEQUENTIAL. RANDOM indica que accederemos a el aleatoriamente por su clave y DYNAMIC (la mas utilizada) con la que podremos acceder al fichero en el modo que queramos dentro del programa, unas veces secuencialmente, si nos interesa, otras veces por su clave.
Clusula RECORD KEY se utiliza solo si el fichero es indexado y en el decimos cual es el nombre de la clave por la cual accederemos a los registros. Esta deber ser alfanmerica y tendr que estar especificada en la FD del fichero. Si el archivo fuera RELATIVE, esta clausula se sustituira por RELATIVE KEY e indicar el nmero de registro del fichero, deber estar declarado en la WORKING- STORAGE SECTION como una variable numrica sin signo.
Clusula ALTERNATE RECORD KEY solo para ficheros indexados e identifican una o mas claves alternadas para nuestros registros, por ejemplo en un fichero de clientes cuya clave principal sera el cdigo, podramos asignar como clave
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 72
alternativa el NIF, y podramos acceder a el por las dos claves, bien por cdigo o bien por NIF, ser tambin alfanumrico y deber tambin estar declarado en la FD. Si aparece WITH DUPLICATES, indica que sta clave alternativa pudiera estar duplicada, por ejemplo si hubieramos escogido como clave alternada adems del NIF, el Nombre del cliente, podra darse el caso de que dos clientes tuvieran el mismo nombre.
Clusula FILE STATUS aqui damos un nombre de una variable que especificaremos en la WORKING como un campo alfanumrico de dos caracteres donde el programa depositar el cdigo de error que ocurra en el fichero, dependiendo del valor nosotros podremos operar o hacer alguna accin en concreto.
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 73
Sentencia OPEN:
Para ficheros indexados el formato de esta sentencia es el siguiente:
OPEN{{ INPUT OUTPUT I-O [WITH LOCK]}...}
EJEMPLO
OPEN INPUT NOMINA OPEN OUTPUT CARGOS OPEN I-O SALDOS
Sentencia CLOSE:
Para ficheros indexados el formato de esta sentencia es el siguiente:
CLOSE fichero-1 [WITH LOCK] [fichero-2 [WITH LOCK] ] ...
EJEMPLO
CLOSE NOMINA CLOSE CARGOS CLOSE SALDOS SALIDAS
Sentencia READ:
Para ficheros indexados el formato de esta sentencia es el siguiente:
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 74
Formato 1: (acceso secuencial)
READ fichero NEXT PREVIOUS RECORD [INTO nombre dato-1] [WITH KEPT NO LOCK] [AT [NOT END END AT sentencia-1] sentencia-2] [END-READ]
EJEMPLO:
Formato 2: (Acceso aleatorio) READ fichero RECORD [INTO nombre dato-1] [WITH KEPT NO LOCK] [INVALID [NOT KEY sentencia-3] sentencia-4] [END-READ] INVALID KEY KEY IS nombre-de-dato-2 clave-m
Cuando el modo de acceso es secuencial, el acceso a los registros del fichero indexado se hace en orden ascendente de la clave, la cual viene dada por el campo descrito a continuacin de la clusula RECORD KEY.
Cuando se utiliza el formato 2, antes de que se ejecute la sentencia READ, es necesario haber cargado el campo descrito a continuacin de la clusula
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 75
RECORD KEY, el valor de la clave del registro que se quiere leer.
La opcin NEXT o PREVIOUS debe especificarse cuando en un fichero en modo de acceso DYNAMIC los registros se leen secuencialmente.
Si la opcin PREVIOUS se ha especificado, despus de ejecutarse una sentencia READ el puntero de lectura-escritura pasa a apuntar al registro anterior. Si el puntero ya se encontraba en el primer registro. Si el puntero que se encontraba en el primer registro, entonces se da una condicin de fin de fichero (AT END).
En un fichero abierto I-O con LOCK MODE MANUAL WITH LOCK ON RECORD, una sentencia READ puede adquirir un registro en modo exclusivo solamente si la frase WITH LOCK ha sido especificada.
En un fichero abierto I-O con LOCK MODE MANUAL WITH LOCK ON MULTIPLE RECORDS, una sentencia READ puede adquirir un registro en modo exclusivo solamente si la frase WITH KEPT LOCK ha sido especificada. Esto es, KEPT debe ser incluido, cuando manualmente se desea hacer exclusivos mltiples registros.
En un fichero abierto I-O con LOCK MODE AUTOMATIC, a menos que se especifique la opcin WITH NO LOCK, cada registro es en el momento de leerse exclusivo, no compartido, siendo liberado cuando finaliza la lectura.
Si se especifica la opcin KEY la clave utilizada para recuperar un registro viene dada por nombre-dato-2 o por clave-m. Si esta opcin no se especifica, para recuperar un registro se utiliza la clave principal, que viene dada por el campo descrito a continuacin de la clusula RECORD KEY.
Cuando se ejecuta una sentencia READ, descrita de acuerdo con formato- 2, el contenido del campo especificado como clave, es comparado con los valores contenidos en los correspondientes campos de los registros del fichero, hasta que se encuentre un valor igual, en cuyo caso se recupera el registro y se ejecuta la sentencia-4 si la frase NOT INVALID KEY ha sido especificada. Si no se encuentra el registro entonces se ejecuta sentencia-3 descrita a continuacin de la frase INVALID KEY, si esta opcin ha sido especificada.
EJEMPLO:
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 76
READ SALDOS NEXT AT END MOVE 1 TO FDA NOT AT END PERFORM CALCULOS END-READ
El valor de la clave principal debe ser nico en el fichero.
El nombre de dato que especifica la clave principal, debe ser puesto por el programa al valor deseado, antes de ejecutar la sentencia WRITE.
Si el modo de acceso es SEQUENTIAL, los registros deben ser emitidos al sistema en orden ascendente de la clave principal.
Si el modo de acceso es RANDOM o DYNAMIC los registros pueden ser emitidos al sistema en cualquier orden.
Si la opcin INVALID KEY se ha especificado, sentencia-1 se ejecutar en los siguientes casos:
a) Cuando se ha especificado modo de acceso secuencial para un fichero abierto para escribir (OUTPUT) y la clave del registro no es mayor que la del registro anterior. b) Cuando el fichero se ha abierto en modo OUTPUT o I-O y la clave del registro a escribir existe ya en el fichero. c) Cuando el fichero se ha abierto en modo OUTPUT o I-O y la clave alternativa del registro a escribir ya existe en el fichero. d) Cuando el disco esta lleno.
EJEMPLO:
WRITE REG-SALDOS INVALID KEY PERFORM YA-EXISTE NOT INVALID KEY ADD 1 TO CONTA-GRABADOS
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 78
END-WRITE
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 79
Sentencia REWRITE:
Para ficheros indexados el formato de esta sentencia es el siguiente:
El fichero asociado con registro debe ser un fichero residente en disco y abierto en modo I-O.
Para ficheros en los que el modo de acceso es SEQUENTIAL, la ultima sentencia ejecutada antes de la ejecucin de la sentencia REWRITE debe ser una sentencia READ, la cual localiza el registro a reemplazar por el valor contenido en le campo que hace referencia a la clave principal.
Para ficheros en los que el modo de acceso es RANDOM o DYNAMIC, el registro a reemplazar viene dado por el contenido del campo que hace referencia a la clave principal. No es necesario ejecutar previamente una sentencia READ.
Si la opcin INVALID KEY se ha especificado, la sentencia-1 se ejecutar en los siguientes casos:
a) Cuando se ha especificado modo de acceso secuencial y el valor contenido en el campo clave del registro que ha de ser reemplazado no es igual al valor del campo clave del ultimo registro ledo.
b) Cuando el valor del campo que referencia la clave principal no coincide con el valor de la clave de alguno de los registros del fichero.
c) Cuando el valor del campo que referencia la clave alternativa existe ya en el fichero.
EJEMPLO:
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 80
REWRITE REG-SALDOS INVALID KEY PERFORM NO-EXISTE NOT INVALID KEY ADD 1 TO CONTA-MODIFICADOS END-REWRITE
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 81
Sentencia START:
Esta sentencia permite iniciar el proceso de acceso a los registros de un fichero con organizacin indexada o relativa a partir de una clave especificada y no a partir del principio del fichero.
START [KEY IS [WITH SIZE entero] [INVALID KEY sentencia-1] INVALID KEY sentencia-2] [NOT [END-START] nombre-dato] fichero EQUAL TO THAN NOT OR = GREATER > LESS THAN NOT < THAN GREATER EQUAL TO > = LESS THAN < THAN GREATER NOT > NOT EQUAL TO OR THAN LESS < =
Fichero es el nombre de un fichero indexado abierto en modo INPUT o I-O, con modo de acceso SEQUENTIAL o DYNAMIC.
Nombre-dato es un campo alfanumrico que debe ser declarado en una clusula RECORD KEY asociada con el fichero.
Nombre-dato puede ser tambin un campo subordinado al campo especificado en la clusula RECORD KEY. Este campo subordinado debe ser la posicin del carcter mas a la izquierda, se corresponda con la posicin del carcter mas a la izquierda del campo especificado en la clusula RECORD KEY, esto es, el primer campo subordinado.
Previamente a la ejecucin de una sentencia START el programa debe cargar en nombre-dato el valor de la clave correspondiente al registro en el que nos queremos posicionar.
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 82
La comparacin indicada por la operacin de relacin especificada a continuacin de KEY, ocurre entre el valor del campo clave de los registros del fichero y el valor del contenido en el campo-dato. Si la longitud de los campos comparados no son iguales, el campo mas largo se trunca a la longitud del mas corto.
Si la frase KEY no se especifica, la operacin de relacin que se asume es EQUAL TO (=) y la comparacin anterior se hace con respecto al campo declarado en la clusula RECORD KEY.
Si el operador de relacin especifica que la clave debe ser mayor que, o mayor o igual que nombre-dato, entonces el puntero de lectura escritura del fichero se posiciona en el primer registro lgico cuya clave satisfaga la condicin.
Si el operador de relacin especifica que la clave debe ser menor que, o menor o igual que nombre-dato, entonces el puntero de lectura escritura se posiciona en el ultimo registro lgico del fichero cuya clave satisfaga la condicin.
Si la condicin no es satisfecha por alguno de los registros del fichero, entonces se da la condicin INVALID KEY y se ejecuta la sentencia 1, si la frase ha sido especificada.
Si se especifica la opcin WITH SIZE, entonces se ignora el operador de relacin especificado a continuacin de KEY. Esta opcin especifica el numero de caracteres de la clave que se van a utilizar en la comparacin (EQUAL TO).
EJEMPLO:
START SALDOS KEY IS = COD-PRODUCTO INVALID KEY PERFORM NO-EXISTE NOT INVALID KEY PERFORM LEER-ARCHIVO END-START
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 83
Sentencia DELETE:
Esta sentencia permite borrar un determinado registro de un fichero con organizacin indexada o relativa.
Fichero es el nombre de un fichero indexado abierto en modo I-O.
Antes de que se ejecute una sentencia DELETE, es necesario haber cargado en el campo descrito a continuacin de la clusula RECORD KEY, el valor de la clave del registro al que se quiere acceder.
Para ficheros en los que el modo de acceso es SEQUENTIAL la ultima sentencia ejecutada antes de la ejecucin de la sentencia DELETE debe ser la sentencia READ, la cual localiza el registro a borrar por el valor contenido en el campo que hace referencia a la clave principal.
Para ficheros en los que el modo de acceso es RANDOM o DYNAMIC, el registro a borrar viene dado por el contenido del campo que hace referencia a la clave principal. No es necesario ejecutar previamente una sentencia READ.
Cuando se ejecuta la sentencia DELETE, el contenido del campo especificado como clave, es comparado con los valores contenidos en los correspondientes campos de los registros del fichero, hasta que se encuentre un valor igual, en cuyo caso se borra el registro y se ejecuta la sentencia-2 si la frase NOT INVALID KEY ha sido especificada. Si no se encuentra un valor igual a la clave dada, entonces se ejecuta la sentencia-1 descrita a continuacin de la frase INVALID KEY, si esta ha sido especificada.
La frase INVALID KEY no puede ser especificada con una sentencia DELETE que haga referencia a un fichero con modo de acceso secuencial.
EJEMPLO:
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 84
DELETE SALDOS INVALID KEY PERFORM NO-EXISTE NOT INVALID KEY ADD 1 TO CONTA-BORRADOS END-DELETE
FORMATO 2:
DELETE FILE { fichero } ...
Esta sentencia borra los ficheros especificados, los cuales deben ser cerrados previamente.
EJEMPLO:
DELETE FILE SALDOS
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 85
CAPITULO XI SUBPROGRAMACION
SUBPROGRAMACION
Es un mtodo de programacin que se basa en la utilizacin de un programa principal comunicado con uno o ms subprogramas. Los objetivos de la subprogramacin son: 1) Evitar programas demasiado largos Cuanto mas dividimos las funciones de un programa, mejor podremos manejarlo, y en modificaciones futuras tendremos muchas ms felicidades. 2) Evitar redundancias Existen tareas comunes a varios programas para lo que se crear un subprograma que realice esta tarea y que pueda ser llamado por todos aquellos programas que lo necesiten. En la subprogramacin existe un programa principal que ser el "llamador" y l os subprogramas los "llamados". Tanto el programa principal como los subprogramas son programas individuales y compilados a parte unos de otros. Sin embargo, los subprogramas dependen del programa principal, ya que es el nico ejecutable. El programa principal se ejecuta, y cuando en su PROCEDURE se encuentra con un CALL nombre-programa', transferir el control al subprograma en cuestin. Cuando este termine su ejecucin, devolver el control al programa principal mediante la instruccin EXIT-PROGRAM. En subprogramacin hay que tener en cuenta que se sigue una especie de jerarqua: El programa principal se puede comunicar con todos los subprogramas.
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 86
Un subprograma puede ser llamado por un subprograma de nivel superior, pero nunca al contrario.
En este formato s se intercambian datos. Su uso ms comn es la de transmitir datos del programa principal al subprograma, donde son tratados y posteriormente le es devuelto el resultado. El funcionamiento de la instruccin es la siguiente:
BY REFERENCE CALL nombre-programa USING nombre- variable-1 BY CONTENT
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 87
Llamamos (CALL) al subprograma (nombre-programa) y le mandamos datos, usando (USING) las variables (nombre-variable-1, nombre-variable-2 ...), que anteriormente ya han sido definidos en la DATA DIVISION. La diferencia entre BY REFERENCE y BY CONTENT es que con la 1 opcin los datos pasados al subprograma podan ser modificados, sin embargo en el BY CONTENT nicamente puede ser consultados pero no permite su modificacin. El subprograma adems de tener en la WORKING sus propias variables de trabajo, debe definir unas variables en la LINKAGE SECTION para recibir los datos de las variables que se transfieren desde el programa principal. El nombre de estas variables podr ser el mismo, o distinto, ya que ello no supone ningn condicionante en el buen desarrollo del subprograma: Lo que si es importante son las siguientes consideraciones: Si no queremos tener problemas en la transmisin, definir las variables en la LINKAGE con la misma PICTURE que sus homlogas. La relacin entre las variables de un programa y otro se efecta de la siguiente forma: Programa Principal:
CALL PROGRAMA USING CAMPO-A, CAMPO-CAMPO-B, CAMPO-C Subprograma: PROCEDURE DIVISION USING CAMPO-D, CAMPO-E, CAMPO- F.
CAPITULO XII BUSQUEDAS EN ARCHIVOS
BUSQUEDAS EN ARCHIVOS BUSQUEDAS SIMPLE
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 88
En el proceso de bsqueda de datos intervienen dos archivos de entrada los cuales deben estar ordenados por la misma llave. El proceso que se describe a continuacin se ajusta para estructuras de bsqueda 1 1 y N 1.
1-INICIO-PROCESO. INITIALIZE VARIABLES * (CARGAR TABLAS EN MEMORIA SI ES NECESARIO) OPEN INPUT ARCHIVO1 (ENTRADA) INPUT ARCHIVO2 (ENTRADA) OUTPUT ARCHIVO3 (SALIDA O SALIDAS DE IMPRESION) PERFORM LEER-ARCHIVO1 PERFORM LEER-ARCHIVO2.
2-PROCESO. PERFORM LEER-ARCHIVO2 UNTIL SI-FIN-ARCHIVO2 OR LLAVE-1 >= LLAVE-2 IF LLAVE-2 = LLAVE-1 AND NOT SI-FIN-ARCHIVO2 PERFORM ( ENCONTRO DATO) ELSE PERFORM ( NO ENCONTRO DATO) END-IF PERFORM LEER-ARCHIVO1. *********************************************************
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 89
Recordar los contadores para registros encontrados y registros no encontrados, que se mostraran al final del proceso.
Que hay que mirar si esta estructura no arroja los resultados esperados:
1. Revisar que los archivos se encuentren ordenados por la supuesta llave. 2. Revisar que las llaves de los archivos tengan la misma estructura. 3. Que las condiciones de comparacin de las llaves se encuentren invertidas 4. Que el final de alguno de los archivos no este bien controlado
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 90
LINEAS DE BALANCE
El funcionamiento bsico de una lnea de balance consiste evaluar el contenido de la llave primaria de cada archivo de entrada as: (SE MANEJA LLAVE UNICA)
Si Llave-1 < Llave-2 el dato que se busca no esta en archivo-2 y debe leer el siguiente registro de archivo-1. Si Llave-1 > Llave-2 se debe leer el siguiente registro de archivi-2. Si Llave-1 = Llave-2 se encontr el dato que se buscaba y debe leer el siguiente registro de archivo-1 y archivo-2.
RUTINA:
PROCEDURE DIVISION. PERFORM 1-INICIO-PROCESO PERFORM 2-PROCESO UNTIL SI-FIN-ARCHIVO1 OR SI-FIN-ARCHIVO2 IF SI-FIN-ARCHIVO1 PROCESA-2 UNTIL SI-FIN-ARCHIVO2 ELSE PROCESA-1 UNTIL SI-FIN-ARCHIVO1 END-IF PERFORM 3-FIN-PROCESO STOP RUN.
1-INICIO-PROCESO. INITIALIZE VARIABLES OPEN INPUT ARCHIVO1 (ENTRADA) INPUT ARCHIVO2 (ENTRADA)
MANUAL DE COBOL
Elaborado por Sergio Oswaldo Rojas Bernal Pgina 91