C Modulo 2 Cobol
C Modulo 2 Cobol
INDICE GENERAL
1. LENGUAJE COBOL 3
INTRODUCCION 3
Evolución 3
2. PROGRAMACION COBOL 4
ESTRUCTURA 4
Elementos de lenguaje 5
Juego de caracteres 5
Palabras reservadas 6
Nombres creados por el programador 7
Literales y constantes figurativas
HOJA DE CODIFICACION 10
CONSEJOS PARA HACER PROGRAMAS CLAROS Y ALINEADOS 11
NORMAS A SEGUIR PARA UN BUEN ENTENDIMIENTO DE LOS 13
FORMATOS
3. DIVISIONES EN COBOL 15
5. FICHEROS 86
6. SUBPROGRAMAS 89
MODULO II
PROGRAMACION COBOL/CICS/DB2
CAPITULO 1
LENGUAJE COBOL
REALIZADO POR ARV CHILE S.A. POR ENCARGO DE ACME CHILE S.A.
ENERO A MARZO DE 2002
SANTIAGO - CHILE
1. LENGUAJE COBOL
INTRODUCCION
La palabra COBOL es la abreviatura de Common Business Oriented Language
(Lenguaje Común Orientado a Negocios).
El COBOL es un lenguaje de alto nivel que como su propio nombre indica esta dirigido
a problemas de gestión. Por ello está diseñado para el manejo de gran volumen de
información a los que se podrán aplicar pequeñas operaciones aritméticas para su
tratamiento.
Al ser un lenguaje de alto nivel, su comprensión es muy sencilla ya que su similitud con
el inglés nos permite, aún sin tener grandes conocimientos de COBOL, comprender
fácilmente la finalidad de un programa escrito en este lenguaje.
EVOLUCION
1.961 - COBOL-61.
2. PROGRAMACION COBOL
ESTRUCTURA
Todo programa COBOL tiene una estructura obligatoria que se debe seguir, la cual
consta de 4 divisiones, cada una de las cuales tiene una misión especifica dentro del
programa. Estas divisiones son las siguientes:
IDENTIFICATION DIVISION
ENVIRONMENT DIVISION
DATA DIVISION
PROCEDURE DIVISION
Cada una de ellas a su vez esta dividida en varias secciones, las cuales serán
opcionales dependiendo de la finalidad de nuestro programa y que ya iremos viendo
más detenidamente en capítulos posteriores.
JUEGO DE CARACTERES
Al igual que en otros lenguajes, para crear un programa en COBOL debemos ceñirnos
a una serie de reglas sintácticas.
Caracteres Alfabéticos:
Caracteres Numéricos:
Dígitos del 0 al 9.
Caracteres Especiales:
*/+-$'".,;=<>()
DIGITOS DEL 0 AL 9
CARACTER - (GUION)
PALABRAS RESERVADAS
Son las palabras que utiliza el COBOL para cada una de sus funciones especificas,
son palabras escritas en inglés y no se podrán utilizar para otra cosa distinta a la que le
tiene asignado el compilador.
Serán aquellos nombres creados por el programador para su uso, e irán destinados
generalmente para nombrar variables utilizadas en el programa en cuestión.
El guión " - " no puede ir ni al principio ni al final del nombre creado, ni haber más de un
guión consecutivo.
NOMBRES DE DATOS:
Ejemplo:
FD$$FICHER
LABEL RECORDS STANDARD
BLOCK CONTAINS 10.
01 RFICHER.
05 NOMBRE PIC X(20).
05 DNI PIC X(10).
*
WORKING-STORAGE SECTION.
77 CONTADOR PIC X(4).
NOMBRES DE CONDICION:
NOMBRES ESPECIALES:
SPECIAL NAMES.
DECIMAL-POINT IS COMMA.
PROCEDURE DIVISION.
ABRIR.
OPEN INPUT FICHER
OUTPUT SALIDA.
NUMERICOS
NO NUMERICOS
LITERALES NUMERICOS:
Se dividen en:
A) DE COMA FIJA:
B) DE COMA FLOTANTE:
Son usados para evitar la restricción de 18 dígitos de los literales de coma fija. Están
compuestos de una mantisa, un exponente y opcionalmente un signo.
Ejemplo:-2E+5
LITERALES NO NUMERICOS:
CONSTANTES FIGURATIVAS
SIMBOLOS
ARITMETICOS:
+ SUMA
- RESTA
* MULTIPLICACION
/ DIVISION
** EXPONENCIACION
CONDICIONALES:
= IGUAL A
> MAYOR A
< MENOR A
PUNTUACION:
REGLAS DE PUNTUACION:
HOJA DE CODIFICACION
Para poder codificar nuestro programa y facilitar la edición del mismo, ciñéndonos a las
reglas sintácticas que nos obliga seguir el COBOL, se utiliza una hoja standard
denominada HOJA DE CODIFICACION COBOL.
La hoja de codificación es una hoja cuadriculada que consta de 25 líneas, cada una de
ellas dividida en 80 columnas.
-- Columnas 1 a la 6 --
-- Columna 7 --
Esta línea es utilizada para indicar la continuación de un literal demasiado largo que no
cupo en la linea anterior, para ello colocaremos en esta columna un guión "-".
También esta columna se utilizará para indicar que la línea en la que estamos es una
línea de comentario, para lo que colocaremos un asterisco "*".
-- Columnas 8 a la 11 --
Este márgen también se utiliza para alinear los números de nivel superior de las
variables declaradas en la Data como son los 01 y 77.
-- Columnas 12 a la 72 --
Las Sentencias.
Los números inferiores de nivel de las variables definidas en la Data.
-- Columnas 73 a la 80 --
Estas columnas son ignoradas por el compilador. Suelen ser utilizadas por el
programador para identificar las lineas de programación o para poner cualquier tipo de
comentario.
2. Alinear todos los elementos de nuestro programa que tengan una función similar.
Ejemplos:
En la PROCEDURE DIVISION
MOVE 'PEPE' TO NOMBRE
MOVE 'GARCIA PEREZ' TO APELLIDOS
MOVE 'IBM/PS-30' TO DENOMINACION
MOVE 20 TO CANTIDAD.
Ejemplos:
01 SWITCHES.
05 SW-1 PIC X VALUE SPACES.
05 SW-2 PIC X VALUE SPACES.
05 SW-3 PIC 9 VALUE ZERO.
05 SW-4 PIC 9 VALUE 1.
05 SW-5 PIC 9 VALUE 2.
05 SW-6 PIC 99 VALUE ZEROES.
*
01 ACUMULADORES.
05 ACUM-1 PIC 9(4) VALUE ZEROES.
05 ACUM-2 PIC 9(5) VALUE ZEROES.
05 ACUM-3 PIC 9(4) VALUE ZEROES.
Ejemplo:
PERFORM LECTURA-DE-FICHERO-MAESTRO
UNTIL CODIGO-CLIENTE-SUCURSAL EQUAL "PEDROSO"
OR FINAL-FICHERO EQUAL 'SI'.
Ejemplo:
IF NUMERO-CLIENTE = 1
IF CANTIDAD-SALDO NOT = 0
PERFORM COMPUTAR-RESULTADOS
ELSE
DISPLAY "ERROR EN EL SALDO"
END-IF
ELSE
DISPLAY "CLIENTE ERRONEO"
END-IF.
Ejemplos:
En la DATA DIVISION
*************************************************************
* * * * * DESCRIPCION DEL FICHERO MAESTRO * * * * *
***********************************************************
01 REG-MAESTRO.
05 CODIGO-SUCURSAL PIC 9(4).
05 NUMERO-CUENTA PIC 9(8).
05 NOM-CLIENTE PIC X(20).
05 APELL-CLIENTE PIC X(30).
Ejemplos:
En la PROCEDURE DIVISION
***************************************************************
** * * OPERACIONES DE BALANCE FICHERO MAESTRO * * **
***************************************************************
BALANCE.
MOVE SALDO-CLI TO ACUM-1.
MOVE SALDO-AUX TO ACUM-2.
*
COMPUTE SALDO-AUX = ACUM-1 * ACUM-2 / 12.
En los siguientes capítulos iremos viendo los formatos de todas las divisiones, sus
secciones y las sentencias que las forman.
Ejemplo:
Para que dichos formatos nos queden claros tenemos que tener en cuenta las
siguientes normas:
1./ [ ] CORCHETES.
2./ { } LLAVES.
Las palabras incluídas entre llaves son distintas opciones que tiene una sentencia. Se
tendrá que escoger una de ellas excluyendo las demás.
Ejemplo:
MULTIPLY identificador-1
literal-1
3./ MAYUSCULAS.
Son las palabras reservadas del COBOL. Las palabras reservadas que están
subrayadas y no están entre corchetes y llaves son obligatorias en la sentencia. Las no
subrayadas son opcionales.
Ejemplo:
MULTIPLY
4./ MINUSCULAS.
Ejemplo:
identificador-1
Nos indica que el contenido que hay entre corchetes o llaves puede repetirse un cierto
número de veces.
3. DIVISIONES EN COBOL
LAS CUATRO DIVISIONES
Cada división tiene una misión específica dentro del programa, y aunque en un
programa no sea necesaria la utilización de una de estas divisiones, ésta se deberá
poner:
Ejemplo:
IDENTIFICATION DIVISION. PROGRAM-ID. SUNION.
* En la Environment como vemos
* no se utiliza ninguna seccion
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 VARIABLE PIC X(20) VALUE "SUNION S.A".
PROCEDURE DIVISION.
INICIO.
DISPLAY VARIABLE
STOP RUN.
ENVIRONMENT DIVISION.
[CONFIGURATION SECTION.]
[SOURCE-COMPUTER. nombre computadora.]
[OBJECT-COMPUTER. nombre computadora.]
[SPECIAL-NAMES.]
[INPUT-OUTPUT SECTION.]
[FILE-CONTROL.]
[I-O CONTROL.]
DATA DIVISION.
[FILE SECTION.]
[WORKING-STORAGE SECTION.]
[LINKAGE SECTION.]
[REPORT SECTION.]
PROCEDURE DIVISION.
[DECLARATIVES.
{SECTION nombre seccion.}
END DECLARATIVES.]
{nombre de sección.}
{nombre de párrafo.}
IDENTIFICATION DIVISION
IDENTIFICATION DIVISION.
PROGRAM-ID. EJEMPLO.
AUTHOR. JOSEDU.
INSTALLATION. SUNION CORPORATION.
DATE-WRITTEN. 2 DE ENERO DE 1991.
DATE-COMPILED.
SECURITY. ESTE PROGRAMA QUEDA RESTRINGIDO AL PERSONAL DEL DEPARTAMENTO
DE GRANDES SISTEMAS.
REMARKS. CUIDADITO CON TOCARLO.
ENVIRONMENT DIVISION
ESTRUCTURA DE LA DIVISION :
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
FILE-CONTROL.
SELECT nombre-fichero ASSIGN TO nombre-externo.
SELECT nombre-fichero ASSIGN TO nombre-externo
ORGANIZATION IS SEQUENTIAL
ACCESS MODE IS SEQUENTIAL.
CONFIGURATION SECTION
SOURCE-COMPUTER
OBJECT-COMPUTER
SPECIAL-NAMES
En este párrafo podremos asignar cambios en los nombres utilizados por el COBOL
para identificar los dispositivos de entrada/salida.
INPUT-OUTPUT SECTION
FILE-CONTROL
En este párrafo se asignan nombres físicos a cada uno de los ficheros lógicos del
programa, así como los dispositivos con los que están relacionados. También se
definirán los métodos de acceso y la organización de nuestros ficheros.
Como regla sintáctica de este párrafo indicaremos la obligación de poner un punto para
finalizar cada una de las SELECT que lo componga.
DATA DIVISION
Identifica cada fichero, sus registros, y las áreas de trabajo que van a ser usadas en la
PROCEDURE DIVISION.
DATA DIVISION.
FILE-SECTION.
[descripcion de ficheros].
[descripcion de registros].
WORKING-STORAGE SECTION.
[descripcion de variables].
LINKAGE-SECTION.
REPORT-SECTION.
FD nombre-fichero
CHARACTERES
BLOCK CONTAINS [entero-1 TO] entero-2
RECORDS
RECORD IS STANDARD
LABEL
RECORDS ARE OMITTED
RECORD IS nombre-de-datos-3
DATA
RECORDS ARE nombre-de-datos-4
01 LINEA-SALIDA.
05 ID-ALUMNO PIC X(5).
05 FILLER PIC X(3) VALUE SPACES.
05 NOM-ALUMNO PIC X(20).
05 FILLER PIC X(4) VALUE SPACES.
05 MEDIA PIC 9(2).99 VALUE ZERO.
PICTURE
IS cadena de caracteres
PIC
DISPLAY
COMPUTATIONAL
[USAGE IS] COMP
COMPUTATIONAL-3
COMP-3
JUSTIFIED
RIGHT
JUST
CLAUSULA REDEFINES
Su función es dotar a una zona ya definida de memoria con una nueva definición en
cuanto a tipo y orden de datos. Tiene una importancia primordial en la definición de
tablas con las cláusulas OCCURS y VALUE.
Ejemplo:
05 CODIGO PIC X(6).
05 COD1 REDEFINES CODIGO.
10 COD21 PIC X(4).
10 COD22 PIC X(2).
CLAUSULA USAGE
CLAUSULA JUSTIFIED
CLAUSULA PICTURE
Esta cláusula sirve par definir el tipo y la longitud del campo. Su formato es:
PICTURE
[IS] tira-de-caracteres.
PIC
Consideramos cada uno de los caracteres PICTURE que se pueden usar para escribir
los campos de datos que se definen en la Data Division.
El tamaño del campo del item se indica por el número de caracteres escritos
sucesivamente en la cláusula PIC.
Caracter 9: Indica que una posición de memoria sólo contiene cualquiera de los
dígitos del 0 al 9.
Ejemplo:
Caracter S: Indica que el campo tiene signo operacional. En COBOL, todos los
campos se consideran positivos a no ser que se utilice este caracter. Sólo se puede
usar un caracter S y debe ser el primer caracter de la izquierda.
Ejemplo:
<supuesto> significa que no ocupa lugar en memoria pero que habrá que tenerlo en
cuenta a la hora de realizar operaciones aritméticas.
Ejemplo:
Y EL CAMPO EN EL CAMPO SE
SI LA PICTURE ES Y LA CLASE ES (TIPO)
MEMORIA ES UTILIZA CONO
XXXX AAAA AAAA ALFANUMERICO
AAAA FFBB9 FFBB ALFABETICO
9V99 679 6,79 NUMERICO
9AA99 2MM4389 2MM43 ALFANUMERICO
VP(2)99 55DE 0,0055 NUMERICO
99P(4) 10 100000 NUMERICO
AX(3) LL23 LL23 ALFANUMERICO
S9(4) (+)1234 (+)1234 NUMERICO
S9(2)V99 (-)1234 12,34 NUMERICO
NOTA IMPORTANTE:
CARACTERES DE EDICION
Estos se utilizan para definir campos que van a ser escritos mediante impresora.
Caracter $:
Este caracter separa los dígitos decimales de los enteros de un campo cuando es
editado. No puede haber más de un punto decimal dentro de una misma PIC, como
tampoco usarlo en conjunto con V.
Caracter coma:
Caracter Z:
Contenido Salida
Caracter (-):
Si el campo asociado es positivo y sin signo se imprimirá un blanco en lugar del signo,
de lo contrario si el valor del campo es negativo aparecerá el signo de - cuando se
edita el campo es negativo.
Caracter (+):
VALOR EDICION
05 número PIC 9(3)+ 252 252+
05 número PIC -9(2)V9 -351 -35.1
Caracteres DB:
VALOR EDICION
05 número PIC 9(4)CR 140 0140bb
05 número PIC 9(4)DB -325 0325DB
Caracter B:
Caracter 0:
CLAUSULA VALUE
FORMATO 1:
literal numeric
VALUE IS constante figurativa
literal no numeric
Ejemplos:
WORKING-STORAGE SECTION.
01 CONTADORES.
05 CONT-LDN PIC 99 VALUE ZEROS.
05 CONT-PAG PIC 9(4) VALUE ZEROS.
*
77 TOT-BRUTO PIC 9(7) VALUE ZEROS.
*
01 CABEC-1.
05 FILLER PIC X(50) VALUE SPACES.
05 FILLER PIC X(32) VALUE 'SUNION'.
05 FILLER PIC X(50) VALUE SPACES.
*
01 CABEC-2.
05 FILLER PIC X(50) VALUE SPACES.
05 FILLER PIC X(32) VALUE ALL "=".
05 FILLER PIC X(50) VALUE SPACES.
La cláusula VALUE con la función de inicializar campos sólo puede ser utilizada en
campos elementales.
FORMATO 2:
VALUE IS literal-0
88 nombre-condición VALUE IS literal-1 THRU literal-2
VALUES ARE literal-3 THROUGH literal-4
Un campo elemental puede tener asociado uno o varios valores posibles. Estos valores
los definimos mediante el nivel 88, escrito a continuación de la definición del campo
elemental.
EJEMPLOS:
05 CAMPO A PIC 9(2)
88 TORNILLOS VALUE 01.
88 ARANDELAS VALUE 02.
88 TUERCAS VALUE 03 THRU 05
FD FICHERO-A
01 REG-FICHERO-A
05 NOMBRE PIC X(20)
05 APELLIDO PIC X(30)
05 ESTADO-CLIENTE PIC X
88 NUEVO VALUE 'A'
88 VIEJO VALUE 'V'
88 JEFE VALUE 'J' THRU 'm'.
CLAUSULA JUSTIFIED
Con esta cláusula indicamos que la alineación del campo que lo acompaña a la
derecha.
Su formato es:
JUSTIFIED
RIGHT
JUST
Ejemplo:
05 MEMORIA PIC X (4) VALUE 'mx' JUST RIGHT
CLAUSULA USAGE
Sirve para indicar la forma en la que se van a representar los datos en memoria.
FORMATO:
COMPUTATIONAL-3 ó COMP-3
[USAGE IS] COMP
DISPLAY
INDEX
Hace que el valor del campo se represente en binario puro; ocupa 8 bits de memoria.
c. COMPUTATIONAL-3 O COMP-3
d. OPCION INDEX
Ejemplos:
01 GRUPO-CAMPOS
05 CAMPO-1 PIC 99V99 USAGE COMP
05 CAMPO-2 PIC X(5) USAGE DISPLAY
05 CAMPO-3 PIC ZZV99
CLAUSULA REDEFINES
Su formato es:
número-de-nivel nombre-de-datos REDEFINES nombre-de-datos-2
Ejemplos:
05 nombre-cliente PIC X(20)
05 apellido-cliente PIC X(20)
05 dirección
10 calle PIC X(20)
10 número PIC 9(2)
10 código-postal PIC 9(5)
05 direc-red redefines Dirección PIC X(27)
..
..
..
05 código-cliente PIC X(4)
05 RCOD-cliente redefines código-cliente
10 num-cli PIC 99
10 dep-cli PIC xx
CLAUSULA RENAMES
Su formato es:
66 nombre de dato-1 RENAMES nombre-de-dato-2 (THRU nombre-de-
dato-3)
Ejemplo:
05 nombre-cliente
10 nombre PIC X(10)
10 inicial PIC X(2)
10 apellido PIC x(15)
05 TOTALES
10 bruto PIC 9(6)V99
10 neto PIC 9(6)V99
10 impuestos PIC 9(6)v99
CLAUSULA OCCURS
Con esta cláusula se pueden conformar tablas, usándola en la Data Division, donde el
número asociado indica la cantidad de veces que se repite el elmento en la tabla.
Veremos 3 formatos:
FORMATO 1:
01 TABLA-SUELDOS
05 SUELDO PIC 9(6)V99 OCCURS 12 TIMES
FORMATO 2:
OCCURS (ENTERO-1 TO) ENTERO-2 TIMES DEPENDING ON NOMBRE-DATO-1
Como mínimo va a tener un elemento y como máximo 12 elementos pero el que fija el
número exacto de elementos es el campo mes.
FORMATO 3:
ASCENDING
KEY is nombre-datos 2 [nombre-datos-3]...
DESCENDING
Esta no clasifica la tabla sino que se limita a indicar el campo por el que está
clasificada la tabla añadiendo el ASCENDING o DESCENDING que indica como están
ordenados los elementos de la tabla para uno o más campos (ver capítulo de tablas).
Ejemplo:
01 TABLA-CODIGOS.
05 NUM-CODIGOS PIC 9(5) COMP.
05 DESCRIP-CODIGOS OCCURRS 1 TO 50 TIMES
DEPENDING ON NUM-CODIGOS
DESCENDING KEY IS CODIGO
INDEXED BY INDICE.
05 CODIGO PIC X(3).
05 NOTAS PIC X(35).
CLAUSULA BLANK
Esta cláusula hace que un elemento se complete con espacios en blancos en donde
figuran ceros.
Formato:
BLANK WHEN ZERO
Esta cláusula puede ser simulada con una PICTURE con caracteres 'Z'.
Un dato en esta cláusula es considerado como editado, por lo que tiene que ser
USAGE DISPLAY.
Ejemplo:
Me permite tener uno o más campos de igual nombre pero calificados por nombres de
datos distintos.
Ejemplo:
05 nombres-jefes
10 nombre PIC X(20)
10 apellido PIC X(30)
05 nombres-empleados
10 nombre PIC X(10)
10 apellido PIC X(20)
Ejemplo:
MOVE nombre OF nombres-empleados TO ...
MOVE apellido OF nombres-jefe TO apellido OF nombres-empleados
LINKAGE SECTION
01 A PIC X
01 B PIC 9
01 C PIC XX
PROCEDURE DIVISION
Del mismo modo existirá una sección LINKAGE en el subprograma <SUBPRO> donde
definiremos los campos que recibe del programa que lo llamo.
Subprograma <subpro>
LINKAGE SECTION
01 X PIC X.
01 Y PIC 9.
01 Z PIC XX.
Observamos que no es obligatorio que le llamen igual pero si su tipo y cargo deben
corresponderse.
PROCEDURE DIVISION
FORMATO:
PROCEDURE DIVISION.
[DECLARATIVES.
{SECTION nombre seccion.}
END DECLARATIVES.]
{nombre de sección.}
{nombre de párrafo.}
FUNCION:
Una vez declaradas en las divisiones anteriormente citadas todas las herramientas que
vamos a utilizar en nuestro programa, llámense ficheros, variables de trabajo etc..., nos
queda la división que dentro del programa se encarga de lo que se denomina
PROCESO.
PARRAFOS
SECCIONES
SENTENCIAS
Se denomina párrafo a un conjunto de sentencias a las cuales se les asigna un nombre
con el que poder referenciarlas.
Ejemplo:
INICIO.
PERFORM ABRIR-FICHEROS
PERFORM ESCRIBIR-FICHERO
PERFORM CERRAR-FICHEROS.
FINAL1.
STOP RUN.
*
* ---- Párrafo ABRIR-FICHEROS
*
ABRIR-FICHEROS.
OPEN INPUT FICHERO-1
OUTPUT FICHERO-2.
*
* ---- Párrafo ESCRIBIR-FICHERO
*
ESCRIBIR-FICHERO.
READ FICHERO-1.
WRITE FICHERO-2 FROM FICHERO-1.
*
* ---- Párrafo CERRAR-FICHEROS
*
CERRAR-FICHEROS.
CLOSE FICHERO-1 FICHERO-2.
El nombre de un párrafo nunca deberá ser igual a una palabra reservada del COBOL.
Después del nombre del párrafo siempre debe ir un punto.
Al finalizar el grupo de sentencias que formen el párrafo, este se cerrará con un punto.
SECCIONES
Ejemplo:
INICIO-SECTION.
INICIO.
OPEN INPUT REG-MAESTRO.
FINALES.
CLOSE REG-MAESTRO.
STOP RUN.
SENTENCIAS
Están formadas por palabras reservadas del COBOL y palabras creadas por el
programador.
Ejemplo:
MOVE 3500 TO TOTAL-PESETAS.
Dada la gran cantidad de sentencias o instrucciones que aparecen en esta división, las
vamos a agrupar dependiendo de su utilidad:
INSTRUCCIONES DE ENTRADA/SALIDA.
INSTRUCCIONES DE TRANSFERECIA DE DATOS.
INSTRUCCIONES DE PARADA.
INSTRUCCIONES ARITMETICAS.
INSTRUCCIONES CONDICIONALES.
INSTRUCCIONES DE TRATAMIENTO DE CADENAS DE CARACTERES.
INSTRUCCIONES DE BIFURCACION.
INSTRUCCIONES QUE MANIPULAN EL TEXTO FUENTE
INSTRUCCIONES DE ENTRADA/SALIDA
INSTRUCCION OPEN
FUNCION:
Instrucción que nos permite abrir los ficheros para su posterior tratamiento.
FORMATO:
OPEN INPUT nombre-archivo-1 [WITH NO REWIND] ...
OUTPUT nombre-archivo-2 [WITH NO REWIND] ...
I-O nombre-archivo-3 ...
EXTEND nombre-archivo-4 ...
Abre el fichero.
Comprueba, si la tuviera, la etiqueta asignada al fichero.
Posiciona el puntero en el primer registro.
Hay que tener en cuenta que la instrucción OPEN posiciona el puntero en el primer
registro, pero no lo carga en memoria para su tratamiento, para ello tendremos que
utilizar otras instrucciones que veremos más adelante.
INPUT:
Ejemplo:
Sentencia:
OPEN INPUT FICH-1.
Resultado:
FICH-1
0001 BANESTO <- puntero
0002 CENTRAL
0003 HISPANO
.
.
.
OUTPUT:
Ejemplo:
Sentencia:
OPEN OUTPUT FICH-1
Resultado:
FICH-1
0001 BANESTO <- puntero
0002 CENTRAL
0003 HISPANO
I-O:
EXTEND:
Abre el fichero para escritura, pero posicionándo el puntero a continuación del último
registro del fichero (secuenciales).
Ejemplo:
Sentencia:
OPEN EXTEND FICH-1
Resultado:
FICH-1
0001 BANESTO
0002 CENTRAL
0003 HISPANO
<-- puntero
Ejemplos:
Valor inicial:
FD FICH-1 LABEL RECORD STANDARD.
Sentencias:
OPEN EXTEND FICH-1.
MOVE `0004POPULAR' TO REG-FICH-1.
WRITE REG-FICH-1.
CLOSE FICH-1
Resultado:
FICH-1.
0001 BANESTO
0002 CENTRAL
0003 HISPANO
0004 POPULAR
Ejemplo:
OPEN INPUT FICHERO-1 FICHERO-2
OUTPUT IMPRESO-1 IMPRESO-2.
INSTRUCCION READ
FUNCION:
FORMATO:
Tiene 3 formatos:
FORMATO 1:
FORMATO 2:
FORMATO 3:
En este apartado sólo explicaremos el READ para secuenciales puros. Las demás
opciones las explicaremos en el capítulo de FICHEROS.
Ejemplo:
FICH-1
memoria-central
BANESTO
BANESTO
CENTRAL
Instrucción:
READ FICH-1
Resultado:
memoria-central
FICH-1
POPULAR
BANESTO
POPULAR
CENTRAL <- Puntero
AT END
Cuando la instrucción READ lee el registro con la marca de final de fichero, se ejecuta
la instrucción que va después de AT END.
INTO
Esta opción es muy útil para conservar los datos originales mientras trabaja con los
depositados en la variable de trabajo.
Ejemplos:
Valores iniciales:
FD FICH-1 LABEL RECORD STANDARD.
01 REG-FICH-1 PIC X(80).
WORKING-STORAGE SECTION.
01 REG-TRABAJO PIC X(80).
Sentencia:
PROCEDURE
OPEN INPUT FICH-1
READ FICH-1 INTO REG-TRABAJO
Resultado:
REG-FICH-1 = `BANESTO'
REG-TRABAJO = `BANESTO'
INSTRUCCION WRITE
FUNCION:
FORMATO:
FORMATO 1:
FORMATO 2:
1) Para impresoras:
WRITE nombre-registro-1 [FROM identificador-1]
identificador-2 LINE
BEFORE Entero-1 LINES
ADVANCING nombre-nemotécnico
AFTER PAGE
END-OF-PAGE
AT instrucción imperativa
EOP
END-OF-PAGE
(COBOL 85) NOT AT instrucción-imperativa-2
EOP
y luego escribiendo
WRITE REG-1
La 2ª parte está formada por palabras reservadas que nos permitan "comunicarnos"
con la impresora para controlar nuestro listado.
Control de líneas. Con esta utilidad de la sentencia controlamos los saltos de línea.
WRITE LIS-1 FROM CAMPO-A AFTER ADVANCING 4 LINES.
Esta sentencia lo que haría sería mandar campo-A a imprimir después [AFTER] de
saltar la impresora 4 líneas.
ADVANCING PAGE
END-OF-PAGE
AT Instrucción Imperativa
EOP
Controla el final de página, por el nº de líneas escrito y las características del fichero
que hemos descrito en la FD y ejecuta la instrucción que le pongamos a continuación.
Ejemplo:
WRITE REG-A FROM CAMPO-A AFTER 2 LINES
AT EOP PERFORM CABECERAS.
CLOSE0
FUNCION:
Cerrar ficheros.
FORMATO:
REEL
CLOSE nombre-archivo WITH NO REWIND
UNIT LOCK
La ejecutaremos siempre sobre archivos abiertos anteriormente con una OPEN, porque
en caso contrario nos daría un error al intentar cerrar un fichero que no está abierto.
REEL
NO REWIND
LOCK
Es una forma de proteger la cinta, la cual no se podrá utilizar hasta que el operador no
la desproteja, pulsando una tecla posicionando de nuevo las cabezas de lectura sobre
la cinta.
Ejemplo:
OPEN INPUT FICH-1 FICH-2
OUTPUT LIST-1.
........
CLOSE FICH-1 FICH-2 LIST-1.
INSTRUCCION ACCEPT
FUNCION:
FORMATO 1:
ACCEPT identificador-1
FORMATO 2:
ACCEPT identificador-2 FROM DATE
DAY
DAY-OF-WEEK
TIME
ACCEPT identificador-1
literal-1
LINE
variable-1
literal-2
POSITION
variable-2
LOW
HIGH
TAB
Cuando hemos rellenado el campo entero, debemos de dar a <┘ para pasar a otro
campo.
PROMPT literal
Nos señala en pantalla la longitud del campo mediante el literal que pongamos en la
PROMPT.
OFF
[NO] BEEP
Ejemplo:
Sentencia
Resultado
Se nos posicionaría el cursor en la línea 10, columna 15, los datos introducidos
apareceran en baja luminosidad y no sonaría el pitido al rellenar el CAMPO-A.
DATE
DAY
ACCEPT identificador-2 FROM DAY-OF-WEEK
TIME
Ejemplo:
Valor inicial:
01 CAMPO-A
05 AA PIC XX.
05 MM PIC XX.
05 DD PIC XX.
Sentencia
Resultado
AA = `91'
MM = `12'
DD = `31'
INSTRUCCION DISPLAY
FUNCION:
FORMATO:
identificador-1
DISPLAY ...
literal-1
Ejemplo:
Valores iniciales
CAMPO-A = `PEPE'
CAMPO-B = `MANOLO'
CAMPO-C = `JUAN'
Instrucción
DISPLAY CAMPO-A ', ' CAMPO-B ' Y ' CAMPO-C
Resultado:
PEPE, MANOLO Y JUAN
Al igual que el ACCEPT, trabajando en MICRO, tenemos una serie de palabras que
complementan la instrucción DISPLAY.
BLINK
REVERSE
Ejemplo:
Las instrucciones de transferencia de datos son aquellas que nos permiten tranferir
valores entre las variables que tenemos en nuestro programa. La forma más común
para transferir datos es la utilización del verbo MOVE, pero existen otras formas
distintas de transferir datos como son:
A la hora de transferir datos tenemos que tener dos cosas muy en cuenta:
Si intentamos transferir datos de una variable a una más pequeña existirá lo que
denominamos truncamiento de datos, ya sea por la izquierda o por la derecha,
dependiendo de la naturaleza de los campos.
INSTRUCCION MOVE
FUNCION:
FORMATO:
FORMATO A:
identif-1
MOVE TO {identif-2} [identif-3] ...
literal-1
Este formato transfiere los datos del identif-1 o del literal-1 al identif-2 y al identif-3 etc.
Cuando finaliza la sentencia, las tres variables identif-1, identif-2 e identif-3 contendrán
los mismos datos.
Ejemplo:
Valores Iniciales:
Sentencia:
MOVE CAMPO-A TO CAMPO-B
Resultado:
CAMPO-A = 'JULIA'
CAMPO-B = 'JULIA '
FORMATO B:
CORRESPONDING
MOVE identificador-1 TO identififcador-2
CORR
Transfiere los datos de los campos elementales que forman el identificador-1 a los
campos elementales del identificador-2 que tengan igual nombre.
Ejemplo:
Valores iniciales:
01 CAMPO-A.
05 A PIC X(7) VALUE 'PRIMERO'.
05 B PIC X(7) VALUE 'SEGUNDO'.
05 C PIC X(7) VALUE 'TERCERO'.
01 CAMPO-B.
05 B PIC X(7) VALUE SPACES.
05 D PIC X(7) VALUE SPACES.
05 A PIC X(7) VALUE SPACES.
Sentencia:
MOVE CORRESPONDING CAMPO-A TO CAMPO-B
Resultado:
B OF CAMPO-B = 'SEGUNDO'
D OF CAMPO-B = ' '
A OF CAMPO-B = 'PRIMERO'
INSTRUCCION SET
FUNCION:
FORMATO:
SET nombre-de-condicion TO TRUE
Sentencia:
FINAL-FICHERO = 'SI'
Ejemplo:
Valores iniciales:
01 ESTADO-FICHERO PIC XX.
88 FINAL-FICHERO VALUE 'SI'.
88 NO-FINAL-FICHERO VALUE 'NO'.
Sentencia:
READ FICHERO AT END SET FIN-FICHERO TO TRUE.
IF FINAL-FICHERO
CLOSE FICHERO.
FINAL-FICHERO = 'SI'
INSTRUCCIONES DE PARADA
FUNCION:
FORMATO:
RUN
STOP
literal-1
STOP RUN
Ejemplo:
PROCEDURE DIVISION.
INICIO.
OPEN ......
.
.
.
STOP RUN.
STOP literal:
INSTRUCCIONES ARITMETICAS
Son aquellas instrucciones con las que el COBOL nos permite realizar operaciones
simples como son sumar, restar, multiplicar, etc..
Toda instrucción aritmética esta formada por un verbo aritmético, palabras reservadas
del COBOL (que son comunes a todas las sentencia como son : TO, INTO, FROM
etc...) y variables o literales numéricos.
SENTENCIA ADD
FUNCION:
La sentencia ADD nos permite sumar 2 o mas variables y/o literales y el resultado
almacenarlo en una variable.
FORMATO:
FORMATO A:
identificador-1
ADD TO identificador-2 [ROUNDED]...
literal-1
Ejemplo:
Valores iniciales:
CAMPO-A = 15 CAMPO-B = 45
Sentencia:
ADD CAMPO-A TO CAMPO-B
Resultado:
CAMPO-A = 15 CAMPO-B = 60
El verbo ON SIZE ERROR lo utilizamos para controlar aquellas sumas que desborden
nuestro campo de resultado, lo cual ocasionaría un truncamiento.
Ejemplo:
Valores iniciales:
01 CAMPO-1 PIC 99.
01 CAMPO-2 PIC 9.
CAMPO-1 = 14 CAMPO-2 = 4
Sentencia:
El resultado de la suma sería 18, pero al tener CAMPO-2 una picture de 9, se perdería
el dígito de la izquierda, quedando como resultado de la suma 8, lo que equivaldría a
un dato falso.
ON SIZE ERROR detecta este error y ejecuta la sentencia o sentencias que vayan a
continuación de él. En este caso aparecería en nuestras pantallas:
--ERROR!! TRUNCAMIENTO EN CAMPO-2
El verbo NOT ON SIZE ERROR (COBOL 85) ejecuta una serie de sentencias cuando
la ejecución de la suma ha sido correcta.
Ejemplo:
ADD CAMPO-1 TO CAMPO-SUM ROUNDED
ON SIZE ERROR
DISPLAY 'ERROR EN SUMA'
NOT ON SIZE ERROR
PERFORM CALCULOS
END-ADD
FORMATO B: ...
identif-1 identif-2
ADD TO ... GIVING ident-n [ROUNDED]
literal-1 literal-2
Ejemplo:
Valores iniciales:
CAMPO-1 = 34 CAMPO-2 = 45
Sentencia:
ADD CAMPO-1 TO 60 GIVING CAMPO-2
Resultado:
CAMPO-1 = 34 CAMPO-2 = 94
FORMATO C:
CORRESPONDING
ADD identif-1 TO identif-2 [ROUNDED]
CORR
Ejemplo:
Valores iniciales:
01 CAMPO-1.
05 A PIC 99 VALUE 10.
05 B PIC 99V999 VALUE 5,10.
05 C PIC 9V999 VALUE 1,001.
01 CAMPO-2.
05 B PIC 9V99 VALUE 1,02.
05 A PIC 99V9 VALUE 14,6.
Sentencia:
ADD CORRESPONDING CAMPO-1 TO CAMPO-2
Resultado:
B OF CAMPO-2 = 5.10 + 1.02
A OF CAMPO-2 = 10 + 14.6
SENTENCIA SUBTRACT
FUNCION:
FORMATO:
FORMATO A:
ident-1 ident-2
SUBTRACT ... FROM ident-n [ROUNDED]
lit-1 lit-2
Ejemplo:
Valores iniciales:
CAMPO-A = 34
CAMPO-B = 20
CAMPO-C = 8
Sentencia:
SUBTRACT CAMPO-B CAMPO-C FROM CAMPO-A ROUNDED
ON SIZE ERROR
DISPLAY ' ERROR EN LA RESTA'
NOT ON SIZE ERROR
PERFORM LISTADOS
END-SUBTRACT
Resultado:
CAMPO-A = CAMPO-A – CAMPO-B – CAMPO-C
= 34 - 20 - 8
CAMPO-A = 6
CAMPO-B = 20
CAMPO-C = 8
FORMATO B:
Ejemplo:
Valores iniciales:
CAMPO-A = 23
CAMPO-B = 14
CAMPO-C = 10
CAMPO-D = 56
Sentencia:
SUBTRACT CAMPO-A CAMPO-B FROM CAMPO-D GIVING CAMPO-C
Resultado:
CAMPO-C = CAMPO-D - CAMPO-A - CAMPO-B
= 56 – 23 - 14
CAMPO-A = 23
CAMPO-B = 14
CAMPO-C = 19
CAMPO-D = 56
FORMATO C:
CORRESPONDING
SUBTRACT identif-1 FROM identif-2 [ROUNDED]
CORR
La resta con opción CORRESPONDING, funciona igual que la suma, se utiliza con
campos subdivididos en campos de nivel inferior y de minuendo y de subtraendo se
utizarán los subcampos de igual nombre.
Ejemplo:
Valores iniciales:
01 CAMPO-1.
05 A PIC 99 VALUE 10.
05 B PIC 99V999 VALUE 1.02.
05 C PIC 9V999 VALUE 1.001.
01 CAMPO-2.
05 B PIC 9V99 VALUE 5.04.
05 A PIC 99V9 VALUE 14.6.
Sentencia:
SUBTRACT CORRESPONDING CAMPO-1 FROM CAMPO-2
Resultado:
B OF CAMPO-2 = 5.04 - 1.02
A OF CAMPO-2 = 14.6 - 10
SENTENCIA MULTIPLY
FUNCION:
La sentencia MULTIPLY nos permite multiplicar dos o más variables y/o literales.
FORMATO:
FORMATO A:
identif-1
MULTIPLY BY identificador-2 [ROUNDED]
literal-1
Ejemplo:
Valores iniciales:
01 CAMPO-A PIC 9(3) VALUE 124.
Sentencia:
MULTIPLY 5 BY CAMPO-A
Resultado:
CAMPO-A = 620
FORMATO B:
ident-1 ident-2
MULTIPLY BY GIVING ident-3 [ROUNDED]
lit-1 lit-2
Ejemplo:
Valores iniciales:
01 CAMPO-A PIC 999 VALUE 147.
Sentencia:
MULTIPLY 80 BY 15 GIVING CAMPO-A
ON SIZE ERROR
DISPLAY ' ERROR EN LA MULTIPLICACION '
END-MULTIPLY
Resultado:
CAMPO-A = 80 * 15 = 1200
CAMPO-A = 200 (TRUNCAMIENTO DEL PRIMER DIGITO)
' ERROR EN LA MULTIPLICACION '
SENTENCIA DIVIDE
FUNCION:
FORMATO:
FORMATO A:
identificador-1
DIVIDE INTO identificador-2 [ROUNDED]
literal-1
Ejemplo:
Valores iniciales:
01 CAMPO-A PIC 9(3) VALUE 84.
Sentencia:
DIVIDE 4 INTO CAMPO-A
Resultado:
CAMPO-A = 21
FORMATO B:
ident-1 INTO ident-2
DIVIDE GIVING ident-3 [ROUNDED]
lit-1 BY lit-2
[REMAINDER ident-4]
[ON SIZE ERROR instruccion imperativa-1]
(COBOL-85) [NOT ON SIZE ERROR instruccion-imperativa-2]
(COBOL-85) [END-DIVIDE]
INTO:
BY:
REMAINDER:
Ejemplo:
Valores iniciales:
01 CAMPO-A PIC 9(3) VALUE 80.
01 CAMPO-B PIC 9(3) VALUE 160.
01 CAMPO-C PIC 99V99 VALUE 84.
01 CAMPO-D PIC 9(3) VALUE 23.
Sentencia:
INTO
DIVIDE CAMPO-A CAMPO-B GIVING CAMPO-C
BY
REMAINDER CAMPO-D
ON SIZE ERROR
DISPLAY ' DIVISION POR 0 '
END-DIVIDE.
Resultado:
Utilizando INTO
CUOCIENTE:
CAMPO-C = CAMPO-B / CAMPO-A
= 160 / 80 = 2
RESTO:
CAMPO-D = 0
CAMPO-A = 80
CAMPO-B = 160
CAMPO-C = 2
CAMPO-D = 0
Utilizando BY
CUOCIENTE:
CAMPO-C = CAMPO-A / CAMPO-B
= 80 / 160 = 0,5
RESTO:
CAMPO-D = 0
CAMPO-A = 80
CAMPO-B = 160
CAMPO-C = 0,5
CAMPO-D = 0
SENTENCIA COMPUTE
FUNCION:
FORMATO:
Para construir una expresión aritmética hemos de tener en cuenta las siguientes
observaciones:
+ SUMA
- RESTA
/ DIVISION
* MULTIPLICACION
** POTENCIACION
Potenciación **
Multiplicación y División * y /
Suma y Resta + y -
Ejemplo:
Valores iniciales:
CAMPO-A = 21
CAMPO-B = 5
CAMPO-C = 8
CAMPO-D = 2
Sentencia:
COMPUTE CAMPO-F = CAMPO-A * (CAMPO-B + CAMPO-C) + (CAMPO-D**2)
Resultado :
CAMPO-F = 21 * (5 + 8) + (22)
= 21 * 13 + 4
= 273 + 4
= 277
Dentro del proceso normal de un programa existen situaciones en las que se dispone
de varias opciones, en las que unas expresiones condicionales controlan el flujo del
programa.
Estas expresiones condicionales identifican las condiciones que puedan tener distinta
naturaleza, como son:
Condiciones de relación
Condiciones de clase
Condiciones de nombre-condición
Condiciones de signo
Condiciones complejas
Condiciones de verbo relacionado
INSTRUCCION IF
FORMATO:
IF condicion-1
[THEN] instruc-1 ... [NEXT SENTENCE]
ELSE
instruc-2 ... [NEXT SENTENCE]
END-IF
Las palabras NEXT SENTENCE nos indican que si el flujo del programa pasa por
ahí, se ejecute la siguiente sentencia a la instrucción IF.
Ejemplo:
Valores iniciales:
CAMPO-A = 1
Sentencia:
IF CAMPO-A = 1
THEN
Display `El campo-A tiene valor 1'
ELSE
NEXT SENTENCE
END-IF
MOVE ZERO TO CAMPO-A
Resultado:
Al tener CAMPO-A valor-1 se ejecutará el THEN
'El CAMPO-A tiene valor 1'
Como podemos ver se omite el THEN, ya que su función es sintáctica, por lo que
podemos prescindir de él.
Nota importante: Dentro de una instruccion IF, nunca colocaremos un punto, en caso
contrario el compilador entenderia final de instrucción alli donde estuviera situado el
punto.
CONDICIONES DE RELACION
Estos valores varían dependiendo del ALFABETO con el que trabaja nuestra máquina.
De Menor A Mayor:
Alfabeto ASCII
abcdefghijklmnopqrstuvwxyz{│}»
Alfabeto EBCDIC
FORMATO:
[NOT] LESS
[NOT] <
identificador-1 [NOT] EQUAL TO
IF literal-1 IS [NOT] =
expresion-arit-1 [NOT] GREATER THAN
constante-figurativa-1 [NOT] >
identificador-2
literal-2
expresion-arit-2
constante-figur.-2
COMPARACIONES PERMITIDAS
NATURALEZA DE
Ejemplo:
COMPARACIONES NUMERICAS
Valores iniciales:
CAMPO-A = 15
CAMPO B = 23
Sentencia:
IF CAMPO-A GREATER THAN CAMPO-B
THEN
PERFORM LISTAR
ELSE
PERFORM PROCESO
END-IF
Resultado:
PERFORM PROCESO
COMPARACION NO-NUMERICA
Valores iniciales:
CAMPO-A = 'JULIA'
CAMPO-B = 'JULIO'
Sentencia:
IF CAMPO-B IS LESS THAN CAMPO-A
THEN
DISPLAY CAMPO-B
ELSE
DISPLAY CAMPO-A
END-IF
Resultado:
CONDICIONES DE CLASE
FUNCION:
FORMATO:
NUMERIC
IF identificador-1 IS [NOT] ALPHABETIC
ALPHANUMERIC
COBOL-85 ALPHABETIC-LOWER
ALPHABETIC-UPPER
CONDICIONES PERMITIDAS:
CAMPO CONDICION
Ejemplo:
Valores iniciales:
Sentencia:
IF CAMPO-A IS NOT ALPHABETIC
IF CAMPO-A IS NOT NUMERIC
PERFORM CONSULTAR
END-IF
END-IF
Resultado:
PERFORM CONSULTAR
El contenido no es alfabético por presencia de números y tampoco numérico por la
presencia de letras.
Ejemplo:
Valores iniciales:
CAMPO-A = 'JULIA'
CAMPO-B = 'JULIO'
Sentencia:
IF CAMPO-A IS ALPHABETIC-UPPER OR
CAMPO-B IS ALPHABETIC-LOWER
PERFORM COMPROBAR
END-IF.
Resultado:
PERFORM COMPROBAR
FUNCION:
FORMATO:
IF [NOT] nombre-de-condición
En esta instrucción preguntamos por uno de los valores que puede tener el campo al
que hemos asignados un determinado nombre-de-condición.
Ejemplo:
Valores iniciales:
01 ESTADO-FICHERO PIC X VALUE `N'
88 FINAL-FICHERO VALUE 'S'
88 NO-FINAL-FICHERO VALUE `N'
Sentencia:
IF NO-FINAL-FICHERO
READ FICHERO AT END SET FINAL-FICHERO TO TRUE
END-READ
END-IF
Traducción literal:
Si estado-fichero = `N'
Ver fichero, cuando se encuentre el final mover
'S' a estado-fichero
Final-instrucción-leer
Final condición
Resultado:
CONDICIONES DE SIGNO
FUNCION:
FORMATO:
identificador POSITIVE
IF IS [NOT] NEGATIVE
expresión aritmética ZERO
CONDICIONES COMPLEJAS
FUNCION:
Consiste en unir 2 o más condiciones simples mediante operadores lógicos con AND
OR.
FORMATO:
AND AND
IF condición-simple-1 condición simple-2 ...
OR OR
Ejemplo:
Valores iniciales:
CAMPO-A = 1
CAMPO-B = 2
CAMPO-C = 3
CAMPO-D = 2
Sentencia:
IF (CAMPO-A NOT = CAMPO-C) AND (CAMPO-B = CAMPO-D) OR
└────────────────────┘ └─────────────────┘
└──────────────────────────────────────────┘
1ª condición
2ª condición
PERFORM TABLAS.
Traducción literal:
si se cumple que:
CAMPO-A no es igual a CAMPO-C y CAMPO-B es igual a CAMPO-D
PERFORM TABLAS
si se cumple
CAMPO-B no es igual a campo-C
PERFORM TABLAS
Valores iniciales:
CAMPO-A = 1
CAMPO-B = 2
Sentencias:
1) IF CAMPO-A = 1 AND CAMPO-B = 3
PERFORM SEGUIR.
2) IF CAMPO-A = 1 OR CAMPO-B = 3
PERFORM SEGUIR
Sin embargo, en el 2º ejemplo, el OR nos indica que se debe de cumplir, al menos, una
condición: Al cumplirse la 1ª condición, aunque no se cumple la 2ª, se ejecutaría la
sentencia PERFORM SEGUIR.
CONDICIONES DE VERBO-RELACIONADO
END-OF-PACE
AT WRITE
EOP
ON EXCEPTION CALL
ON OVERFLOW STRING, UNSTRING
ON SIZE ERROR ADD,COMPUTE,DIVIDE,MULTIPLY,SUBTRACT
INSTRUCCIONES DE BIFURCACION
INSTRUCCION PERFORM
FUNCION:
Es una instrucción de bifurcación que nos permite hacer llamadas a párrafos o grupo
de párrafos y repetirlos cuantas veces creamos necesario.
FORMATO:
Dispone de 2 formatos:
FORMATO A/1:
BEFORE
WITH TEST UNTIL condición-1
AFTER
END-PERFORM
FORMATO A/2:
PERFORM
sentencias-imperativas
END-PERFORM
FORMATO B:
THROUGH
PERFORM nombre-de-párrafo-2 nombre-de-párrafo-2
THRU
identificador-1
TIMES
Entero-1
END-PERFORM
Ejemplo:
FORMATO-A/1
PERFORM PARRAFO-A TEST AFTER UNTIL I = 10
.
.
PARRAFO-A
ADD 1 TO I.
Ejemplo:
FORMATO A/2
Ejemplo:
1.- Una vez terminada la instrucción PERFORM se ejecutará la sentencia que vaya
detrás de ellas y no detrás del párrafo.
2.- Si no ponemos TEST AFTER o TEST BEFORE, por omisión tendremos BEFORE.
INSTRUCCION EVALUATE
FUNCION:
FORMATO:
identificador-1 identificador-2
literal-1 literal-2
EVALUATE expresión-1 ALSO expresión-2
TRUE TRUE
FALSE FALSE
END-EVALUATE
frase-1:
ANY
condición-1
TRUE
FALSE
identificador-3 THROUGH identificador-4
[NOT] literal-3 literal-4
expres-aritmét-1 THRU expres-aritmét-2
frase-2:
ANY
condición-2
TRUE
FALSE
identificador-5 THROUGH identificador-6
[NOT] literal-5 literal-6
expres-aritmét-1 THRU expres-aritmét-3
Ejemplo:
EVALUATE CAMPO-A
WHEN 1
PERFORM PRIMERO
WHEN 2
PERFORM SEGUNDO
WHEN 3
PERFORM TERCERO
WHEN OTHER
PERFORM OTRO
END-EVALUATE.
Ejemplo:
EVALUATE TRUE
WHEN CODIGO-A > CODIGO-B
PERFORM A
WHEN CODIGO B > CODIGO-A
PERFORM B
WHEN CODIGO-C > (CODIGOA+CODIGOB)
PERFORM B
WHEN OTHER
PERFORM OTRO
END-EVALUATE.
Ejemplo:
EVALUATE CAMPO-A ALSO CAMPO-B
END-EVALUATE.
Ejemplo:
EVALUATE PEP-1 ALSO PEP-2
END-EVALUATE
Traducción literal:
Cuando Pep-1 = 1 y para cualquier valor de PEP = 2
Perform COMPROBAR
Ejemplo:
EVALUATE COD-2
WHEN 1
PERFORM PE-1
WHEN 2
PERFORM PE-2
WHEN OTHER
PERFORM OTROS.
END-EVALUATE.
INSTRUCCION GO
FUNCION:
FORMATO:
Dispone de 2 Formatos:
FORMATO A:
GO TO nombre-de-párrafo-1
FORMATO B:
GO TO nombre-de-párrafo-1 [nombre-de-párrafo-2] ...
DEPENDING ON identificador-1
Ejemplo:
MOVE COD-A TO COD-B
IF COD-B = 1
GO TO CODIGO-B
.
.
CODIGO-B
MOVE COD-B TO ...
.
.
.
STOP RUN.
Ejemplo:
MOVE 2 TO CONTADOR
GO TO LINEA-1 LINEA-2 LINEA-3
DEPENDING ON CONTADOR.
.
.
.
LINEA-1.
.
.
.
LINEA-2.
.
.
.
LINEA-3.
.
.
.
Orden de ejecución
2.- GO TO LINEA-2
3.- LINEA-2.
.
.
INSTRUCCION EXIT
FUNCION:
FORMATO:
EXIT
Ejemplo:
INSTRUCCION COPY
FUNCION:
Nos permite copiar en nuestro texto fuente, un texto que tendremos almacenado en
una biblioteca.
FORMATO:
OF
COPY nombre-texto-1 nombre-biblioteca-1
IN
Con este formato indicamos que donde esté el COPY situado en el programa se
copiará el texto(nombre-texto-1) que está situado en una biblioteca determinada.
Ejemplo:
Contenido
05 nombre PIC X(10)
05 dirección PIC X(20)
Sentencia:
01 REGISTRO-CLIENTES
COPY Clientes
Resultado en la compilación:
01 REGISTRO-CLIENTES
05 NOMBRE PIC X(10)
05 DIRECCION PIC X(20)
Esta instrucción nos es muy útil en la FD, con ficheros que se utilizan en muchos
programas. De esta manera creamos un fichero modo texto, y en cada uno de los
programas se incluiría mediante un COPY.
También podemos utilizar la opción REPLACING que nos permitirá modificar parte del
texto que estamos copiando.
Ejemplo:
Valores iniciales:
Nombre del texto: FICHERO-1
Contenido:
Sentencia:
01 REG-MAESTRO.
COPY FICHERO-1 REPLACING CAMPO-A BY NOMBRE
CAMPO-B BY LOCALIDAD
CAMPO-C BY EDAD
Resultado:
01 REG-MAESTRO
05 NOMBRE PIC X(10).
05 LOCALIDAD PIC X (7).
05 EDAD PIC 99.
4. TRATAMIENTO DE TABLAS
DEFINICION
CLAUSULA OCCURS:
FUNCION:
Define el tamaño de la tabla. No puede aparecer en líneas a nivel 01, ni 77, ni 88.
FORMATO A:
OCCURS entero1 [TIMES]
FORMATO B:
OCCURS entero1 [TIMES] PIC ...
(COBOL-85) [VALUE ...]
Ejemplo:
Crea una tabla de 5 elementos y cada elemento compuesto por 2 campos con la
picture indicada.
01 TABLA.
05 ELEMENTO OCCURS 5.
10 N-VENDEDOR PIC XXX.
10 TOTAL-VENDIDO PIC 9(6).
Ejemplo:
01 TABLA.
05 ELEMENTOS OCCURS 100 PIC 99.
(COBOL-85)
01 TABLA.
05 ELEMENTOS OCCURS 100 PIC 99 VALUE ZERO.
FUNCION:
FORMATO:
Ejemplo:
Ejemplo:
Ejemplo:
El concepto de DIMENSIÓN se refiere a categorias por medio de las cuales los datos
son organizados dentro de las tablas.
Ejemplo:
TABLAS VARIABLES
Se dice que una tabla es variable cuando su tamaño varía de una ejecución a otra.
FORMATO:
OCCURS entero-1 TO entero-2 TIMES DEPENDING ON numero-datos
Ejemplo:
Una tabla que tenga de 100 a 200 elementos según el número de artículos existentes.
01 TABLA.
05 ARTICULOS OCCURS 100 TO 200 DEPENDING ON N-ARTICULOS.
FUNCION:
FORMATO:
PERFORM [nombre-procedimiento1] [THRU nombre-procedimiento2]
nombre-indice1 identificador2
VARYING FROM nombre-indice2
identificador1 literal2
identificador3
BY UNTIL condicion1
literal3
nombre-indice4 identificador5
[AFTER FROM nombre-indice5
identificador4 literal5
identificador6
BY UNTIL condicion2 ] ......
literal6
Ejemplo:
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.
TABLAS INDEXADAS
FUNCION:
Nos permite indexar una tabla para posteriormente hacer búsquedas sin necesidad de
recorrerla entera.
FORMATO:
ASCENDING
OCCURS entero TIMES KEY IS dato-1 [dato2...]
DESCENDING
La opción INDEXED BY indica el o los índices que vayamos a utilizar, son obligatorios
en caso de utilizar la instrucción SEARCH.
Ejemplo:
01 CAMPOS.
05 INDICE USAGE IS INDEX.
01 TABLA.
05 ELEMENTOS OCCURS 10 INDEXED BY INDICE.
INSTRUCCION SET
FUNCION:
Para inicializar índices o cambiar su contenido. Sólo los declarados como USAGE
INDEX.
FORMATO:
TO entero
SET indice UP BY
DOWN BY variable
Ejemplo:
Inicializar el indice en 2.
SET INDICE TO 2.
Ejemplo:
Restar 3 al indice.
SET INDICE DOWN BY 3.
INSTRUCCION SEARCH
FUNCION:
Sirve para buscar un elemento o varios en una tabla. Esta opción puede ser utilizada
con subíndices pero es mucho mas lenta.
FORMATO:
índice
SEARCH identificador VARYING AT END acción-1
variable
AT END acción-1 es lo que tiene que hacer en caso de que la tabla se haya terminado
y el elemento no lo haya localizado.
Condición-1 y opcionalmente condición-2 son las condiciones que tienen que cumplir
un determinado elemento de la tabla al cual se está buscando.
Ejemplo:
5. FICHEROS INDEXADOS
La organización indexada permite la recuperación de un registro en un momento dado
sin leer los registros lógicos anteriores.
Definicion:
ENVIRONMENT DIVISION
SELECT nombre-fichero ASSIGN TO DISK
SEQUENTIAL
ORGANIZATION
INDEXED
SEQUENTIAL
ACCESS RANDOM
DYNAMIC
PROCEDURE DIVISION.
OPEN I-O nombre-fichero
Se puede leer y escribir en el mismo registro. El fichero tiene que estar creado.
(OPEN INPUT-OUTPUT nombre-fichero)
INSTRUCCIONES:
LECTURA DE REGISTROS
INSTRUCCION READ
READ nombre-fichero [INTO nombre-variable] [NEXT]
[AT END accion]
[INVALID KEY accion]
Si el acceso es DYNAMIC:
READ nombre-fichero NEXT RECORD AT END acción
INSTRUCCION START
FUNCION:
Posiciona de forma directa en una clave determinada y una vez posicionado, comienza
una lectura secuencial.
FORMATO:
EQUAL
START nombre-fichero KEY NOT LESS nombre-campo
GREATER
[INVALID KEY accion]
ESCRITURA DE REGISTROS
INSTRUCCION WRITE
FUNCION:
INSTRUCCION REWRITE
FUNCION:
FORMATO:
WRITE
nombre-registro [FROM campo] [INVALID KEY accion]
REWRITE
BORRADO DE REGISTROS
INSTRUCCION DELETE
FORMATO:
DELETE nombre-fichero RECORD [INVALID KEY accion]
6. SUBPROGRAMACION
Es un método de programación que se basa en la utilización de un programa principal
comunicado con uno o más subprogramas.
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.
Sin embargo, los subprogramas dependen del programa principal, ya que es el único
ejecutable.
En subprogramación hay que tener en cuenta que se sigue una especie de jerarquía:
BY REFERENCE
CALL nombre-programa USING nombre-variable-1
BY CONTENT
El nombre de estas variables podrá ser el mismo, o distinto, ya que ello no supone
ningún condicionante en el buen desarrollo del subprograma:
Programa Principal:
Subprograma:
PROCEDURE DIVISION USING CAMPO-D, CAMPO-E, CAMPO-F
01 CAMPO-A PIC XX
01 CAMPO-B PIC 99V99
01 CAMPO-C PIC AAA
01 CAMPO-D PIC XX
01 CAMPO-E PIC 99V99
01 CAMPO-F PIC AAA
CODIGO- SUPERVISOR 1 2 3 4 5 6
PIEZAS
X(3) X(2)
1 mes
12 meses
PROCEDURE DIVISION.
PASOI.
ISPLAY (1,1) ERASE
ISPLAY PANTA1
CCEPT CAPTURA
IF OPCION = '1`
OPEN OUTPUT INDEXADO
IF SW = 1
WRITE REG
ELSE
NEXT SENTENCE.
ELSE
PERFORM MANTENER THRU FMANTENER.
CLOSE INDEXADO
STOP RUN.
MANTENER
OPEN INPUT SECU
I-O INDEXADO
READ SECU AT END MOVE 1 TO SW1
PERFORM PROCESO THRU FPROCESO UNTIL SW1=1
CLOSE SECU.
FMANTENER
EXIT.
PROCESO.
MOVE CO-PIEZAS TO COD-PIEZAI
READ INDEXADO INVALID KEY PERFORM ALTAS THRU FALTAS
READ SECU AT END MOVE 1 TO SW.
PROCESO.
EXIT.
ALTAS
MOVE 0 TO ACUDED
ACUSERV
PERFORM ETABLA THRY FETABLA VARYING I FROM 1 BY 1
UNTIL I > 12
COMPUTE PORCENTAJE = (ACUM-DEV/ACUM-SERV)* 100
MOVE SUPERV-SECU TO SUPERV-INDEX
WRITE REG-INDEX
FALTAS.
EXIT.
ETABLA.
ADD TOT-SERV (I) TO ACUM-SERV
ADD TOT-DEV (I) TO ACUM-DEV
FETABLA
EXIT.