Documente Academic
Documente Profesional
Documente Cultură
¿Qué es COBOL?
Estructura de un programa
Ejemplo:
IDENTIFICATION DIVISION.
PROGRAM-ID. Programa1.
AUTHOR. Ismael.
INSTALLATION. WWW.
REMARKS. Programa de prueba.
ENVIRONMENT DIVISION.
DATA DIVISION.
PROCEDURE DIVISION.
IDENTIFICATION DIVISION.
PROGRAM-ID. Prueba.
PROCEDURE DIVISION.
Inicio.
DISPLAY "Hello world"
STOP RUN.
1. 9. Campos numéricos.
2. A. Campos alfabéticos.
3. X. Campos alfanuméricos.
4. S. Variable con signo.
5. V. Variable con punto decimal.
WORKING-STORAGE SECTION.
77 FECHA PIC 9(8).
77 FECHA-EDIT PIC ZZ/ZZ/ZZZZ.
77 IMPORTE PIC S9(8)V99.
77 IMPORTE-EDIT PIC ZZ.ZZZ.ZZZ,ZZ-.
01 ESTADO PIC 9.
88 SOLTERO VALUE 1.
88 CASADO VALUE 2.
88 DIVORCIADO VALUE 3.
01 DOMICILIO.
02 TIPO PIC XX.
02 NOMBRE PIC X(20).
02 NUMERO PIC 9(4).
Algunos ejemplos:
IDENTIFICATION DIVISION.
PROGRAM-ID. PruebaFechas.
AUTHOR. Ismael.
DATA DIVISION.
WORKING-STORAGE SECTION.
* Formato YYMMDD
01 CurrentDate.
02 CurrentYear PIC 9(4).
02 CurrentMonth PIC 99.
02 CurrentDay PIC 99.
* Formato YYDDD
01 DayOfYear.
02 YearDay PIC 9(3).
* El Tiempo en formato HHMMSSss s = S/100
01 CurrentTime.
02 CurrentHour PIC 99.
02 CurrentMinute PIC 99.
PROCEDURE DIVISION.
Inicio.
ACCEPT CurrentDate FROM DATE YYYYMMDD
ACCEPT DayOfYear FROM DAY YYYYDDD
ACCEPT CurrentTime FROM TIME
DISPLAY "La fecha es: " CurrentDay SPACE CurrentMonth
SPACE CurrentYear
DISPLAY "Día nº. " YearDay " Del año " CurrentYear
DISPLAY "Son las " CurrentHour ":" CurrentMinute
STOP RUN.
Asignación de Datos.
Cálculos Aritméticos.
Sumando.
Restando.
Multiplicando.
MULTIPLY 5 BY resultado
Dividiendo.
COMPUTE resultado = 2 + 3 * 5
COMPUTE resultado = (2 + 3) * 5
Debemos tener en cuenta que cuando hacemos varios cálculos
simultáneos hay un orden de preferencia. Primero se hacen los
operadores que hayan entre paréntesis después las
multiplicaciones y divisiones y por último las sumas y las
restas. Por ese motivo estas dos instrucciones dan un resultado
diferente.
Operadores:
IDENTIFICATION DIVISION.
PROGRAM-ID. Calcular.
AUTHOR. Ismael.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 Num1 PIC 9 VALUE ZEROS.
77 Num2 PIC 9 VALUE ZEROS.
77 Result1 PIC 9(2)V9(2) VALUE ZEROS.
77 Result2 PIC 9(2)V9(2) VALUE ZEROS.
77 Result3 PIC 9(2)V9(2) VALUE ZEROS.
77 Result4 PIC S9(2)V9(2) VALUE ZEROS.
77 Result5 PIC 9(2)V9(2) VALUE ZEROS.
PROCEDURE DIVISION.
Inicio.
DISPLAY "Dame el primer numero: "WITH NO ADVANCING
ACCEPT Num1
DISPLAY "Dame el segundo numero: "WITH NO ADVANCING
ACCEPT Num2
ADD Num1 Num2 GIVING Result3
SUBTRACT Num1 FROM Num2 GIVING Result4
MULTIPLY Num1 BY Num2 GIVING Result1
DIVIDE Num1 INTO Num2 GIVING Result2
COMPUTE Result5 = Num1 /2 * (Num2–7)
DISPLAY "Resultado de la multiplicacion es: ", Result1
DISPLAY "Resultado de la division es: ", Result2
DISPLAY "Resultado de la suma es: ", Result3
DISPLAY "Resultado de la resta es: ", Result4
DISPLAY "Resultado de la expresion es: ", Result5
STOP RUN.
Condiciones
Bloque1
Bloque2
IF variable1 < Variable2 THEN
Bloque3
Bloque4
ELSE
Bloque5
END-IF
Operadores Relacionales.
1. Paréntesis.
2. NOT.
3. AND.
4. OR.
Lista de Valores.
02 Departamento PIC X.
88 Desarrollo VALUE I,L,T.
WORKING-STORAGE SECTION.
01 Caracter PIC X.
88 Vocales VALUE "a", "e", "i", "o", "u".
88 Consonantes VALUE "b", "c", "d", "f", "g", "h".
88 Numeros VALUE "0" THRU "9".
…etc.
ACCEPT Caracter.
IF Vocales THEN
DISPLAY "El digito "Caracter "es una vocal"
ELSE
IF Consonantes THEN
DISPLAY "El digito " Caracter " es una consonante"
ELSE
IF Numeros THEN
DISPLAY "El digito " Caracter " es un numero"
ELSE
DISPLAY "El digito introducido es incorrecto"
END-IF
END-IF
END-IF
…
ACCEPT Caracter.
EVALUATE TRUE
WHEN Vocales DISPLAY "Es una vocal"
WHEN Consonantes DISPLAY "Es una consonante"
WHEN Numeros DISPLAY "Es un número"
WHEN OTHER DISPLAY "Digito incorrecto"
END-EVALUATE
…
EVALUATE Caracter
WHEN "0" Sentencias…
WHEN "1" THRU “9” Sentencias…
WHEN "a" Sentencias…
WHEN "x" Sentencias…
END-EVALUATE
Párrafos y bucles
En casi todos los programa que se pueden crear, existen tareas
que pueden o no ser objeto de repetición. A estos procesos se
les llama bucles o estructuras repetitivas.
IDENTIFICATION DIVISION.
PROGRAM-ID. Parrafos.
AUTHOR. Ismael.
* Esto es un ejemplo usando rutinas o párrafos.
PROCEDURE DIVISION.
Inicio.
DISPLAY "Este es el principio del programa"
PERFORM Rutina2
DISPLAY "Ahora voy a terminar el programa"
STOP RUN.
Rutina1.
DISPLAY "Estoy en la rutina1"
PERFORM Rutina3.
Rutina2.
DISPLAY "Ahora estoy en la rutina2"
PERFORM Rutina1.
Rutina3.
DISPLAY "Ahora estoy en la rutina3".
IDENTIFICATION DIVISION.
PROGRAM-ID. Programa4.
AUTHOR. Ismael.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 NOMBRE PIC X(12).
01 APELLIDO PIC X(12).
PROCEDURE DIVISION.
INICIO.
PERFORM PIDENOMBRE THRU PIDEAPELLIDO 3 TIMES
STOP RUN.
PIDENOMBRE.
DISPLAY "DAME TU NOMBRE:"
ACCEPT NOMBRE.
PIDEAPELLIDO.
DISPLAY "DAME TUS APELLIDOS:"
ACCEPT APELLIDO.
IDENTIFICATION DIVISION.
PROGRAM-ID. Programa4.
AUTHOR. Ismael.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 LI PIC 99 VALUE 0.
PROCEDURE DIVISION.
INICIO.
DISPLAY "PROGRAMA DE SALUDO"
PERFORM SALUDAR UNTIL LI =5
STOP RUN.
SALUDAR.
ADD 1 TO LI
DISPLAY "SALUDO Nº.: ", LI.
IDENTIFICATION DIVISION.
PROGRAM-ID. Programa4.
AUTHOR. Ismael.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 LI PIC 99 VALUE 0.
PROCEDURE DIVISION.
INICIO.
DISPLAY "PROGRAMA DE SALUDO"
PERFORM UNTIL LI =5
ADD 1 TO LI
DISPLAY "SALUDO Nº.: ", LI
END-PERFORM
STOP RUN.
Si observamos un poco, la diferencias radican en que ahora
tiene un “fin del bucle”.
IDENTIFICATION DIVISION.
PROGRAM-ID. Programa4.
AUTHOR. Ismael.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 LI PIC 99 VALUE 0.
PROCEDURE DIVISION.
INICIO.
PERFORM VARYING LI FROM 1 BY 1 UNTIL LI >5
DISPLAY "Saludo Nº.: ", LI
END-PERFORM
STOP RUN.
¿Como trabaja el VARYING?. Lo primero que hace es iniciar la
variable LI al valor que indica el FROM, pregunta por la
condición y si no se cumple realiza la sentencias que hay
dentro. A continuación aumenta el valor de LI según lo que
tenga en el BY y vuelve a preguntar por la condición…y así
sucesivamente hasta que se cumpla la condición. En este caso
realizará las sentencias con los valores 1, 2, 3, 4 y 5.
Ficheros.
Los ficheros son archivos de datos donde se almacenan los
valores que necesitemos de un programa a nivel de registro,
algo parecido como ocurre con los registros de las bases de
datos. Aunque COBOL se puede utilizar para procesar otros
tipos de archivo de datos, se utiliza generalmente sólo para
procesar registros.
…
ENVIRONMNET DIVISION.
INPUT-OUTPUT SECTION.
* Esta claúsula nos permite dar el nombre real del fichero en
el disco.
* También podemos indicar el camino, por ejemplo
“c:\ficheros\agenda.dat”
* El nombre que le asignemos en la SELECT debe coincidir con
el de la FD.
SELECT AGENDA ASSIGN TO “AGENDA.DAT”.
DATA DIVISION.
FILE SECTION.
* El nombre interno que le asignamos se llamara agenda.
FD AGENDA.
* A continuación definimos como se llama el registro y como
se estructura.
01 AGENDA-REG.
02 ORDEN PIC 9(2) VALUE ZEROS.
02 NOMBRE PIC X(15) VALUE SPACES.
02 DIRECCION PIC X(30) VALUE SPACES.
02 CODIGO-POSTAL PIC 9(4) VALUES ZEROS.
02 TELEFONO PIC 9(9) VALUES ZEROS.
Vemos como es la sintaxis de la instrucción SELECT:
identification division.
program-id. Ficheros.
author. Ismael.
environment division.
input-output section.
file-control.
select agenda assign to "agenda.dat"
organization is line sequential.
data division.
file section.
fd agenda.
01 agenda-reg.
02 orden pic 9(2).
02 nombre pic X(15).
02 direccion pic X(30).
02 codigo-postal pic 9(5).
02 telefono pic 9(9).
working-storage section.
77 fin-fichero pic 9 value 0.
procedure division.
Inicio.
open output agenda
perform 3 times
perform agregar
perform limpiar-pantalla
end-perform
perform leer-agenda
close agenda
stop run.
agregar.
display "programa de la agenda"
display "dame el orden: "with no advancing
accept orden
display "dame el nombre: "with no advancing
accept nombre
display "dame la direccion: "with no advancing
accept direccion
display "dame el codigo postal: "with no advancing
accept codigo-postal
display "dame el telefono: "with no advancing
accept telefono
write agenda-reg.
limpiar-pantalla.
* usando esta instrucción, puedo llamar a cualquier comando
del S.O.
CALL "SYSTEM" USING "clear".
leer-agenda.
move 0 to fin-fichero
close agenda
open input agenda
perform until fin-fichero=1
read agenda
at end move 1 to fin-fichero
not at end perform leer-registro
end-read
end-perform.
leer-registro.
display "orden: "orden
display "nombre: "nombre
display "direccion: “ direccion
display "codigo postal: "codigo-postal
display "telefono: "telefono.
Organización y Acceso.
CLOSE nombredelficherointerno…
READ.
as
…
file-control.
select agenda assign to "agenda.dat"
organization is indexed
access mode is sequential
record key is orden
alternate record key is nombre
alternate record key is codigo-postal
file status is estado.
…
Agregar.
…
accept telefono
write agenda-reg
invalid key display "error al guardar"
end-write.
Si nos fijamos bien hay que darle un par de datos más, propio
de los ficheros indexados, como son por ejemplo las claves
principales o alternativas, en el caso de que las hubiere. La
variable con la que trabajamos en la “file status” debemos
declararla en la “Working” como es lógico. También existiría
un pequeño cambio a la hora de escribir los registros, ya que
dependemos de una clave principal para guardar los cambios.
WRITE.
REWRITE.
DELETE.
DELETE nombreinternodelfichero
INVALID KEY instrucciones
NOT INVALID KEY instrucciones
END-DELETE
START.
Screen section.
La Screen Section es una parte de la estructura de Cobol,
encargado de realizar las ventanas o el interfaz del programa
en cuestión. Vamos a ver como funciona y a ver sus sintaxis.
Nivel
identificador
[ JUSTIFIED RIGHT ]
[ BLANK WHEN ZERO ]
[ OCCURS integer-1 TIMES ]
[ BELL | BEEP ]
[ AUTO | AUTO-SKIP | AUTOTERMINATE ]
[ UNDERLINE ]
[ OVERLINE ]
[ SECURE ]
[ REQUIRED ]
[ FULL ]
[ PROMPT ]
[ REVERSE-VIDEO ]
[ BLANK LINE | SCREEN ]
[ ERASE EOL | EOS ]
SIGN IS
TRAILING
LEADING
[ SEPARATE CHARACTER ]
LINE NUMBER IS [ PLUS ]
integer-2
identifier-2
COLUMN NUMBER IS [ PLUS ]
integer-3
identifier-3
FOREGROUND-COLOR IS
integer-4
identifier-4
[HIGHLIGHT]
[LOWLIGHT]
BACKGROUND-COLOR IS
integer-5
identifier-5
[ BLINK ]
PICTURE IS picture-string
USING identifier-6
FROM
identifier-7
literal-2
TO identifier-8
VALUE IS literal-1
Valor. Color.
0 negro
1 azul
2 gris
3 cían
4 rojo
5 naranja
6 amarillo
7 blanco
identification division.
program-id. Ventanas.
author. Ismael.
environment division.
data division.
working-storage section.
77 opcion pic x value spaces.
77 pausar pic x value spaces.
screen section.
* Pantalla inicial
01 principal.
03 line 05 col 10 VALUE "Prueba de Screen Section".
03 line 07 col 10 VALUE "Dame a una tecla y te la
muestro: ".
03 line 17 col 10 VALUE "> ".
03 pic x using opcion.
* Borra la pantalla.
01 Limpiar-pantalla.
03 blank screen.
procedure division.
Inicio.
* Mostramos la pantalla inicial y aceptamos la variable.
display principal
accept principal
* Limpiamos la pantalla
display limpiar-pantalla
display "Has pulsado la tecla "opcion
display "Pulsa cualquier letra para salir"
accept pausar with auto
stop run.
Ahora la cláusula ACCEPT podemos añadirle más opciones:
Tablas.
Una tabla es un conjunto campos contiguos, cuya longitud y
tamaño deben ser iguales, unidos todos bajo un mismo
nombre, de manera que accedemos a ellos de forma individual
a través de uno o varios índices. Vamos a hacer un ejemplo
para verlo mas claro:
…
77 lunes pic 9(04).
77 martes pic 9(04).
77 miercoles pic 9(04).
77 jueves pic 9(04).
77 viernes pic 9(04).
77 sabado pic 9(04).
77 domingo pic 9(04).
…
01 cine.
02 visitas pic 9(04) occurs 7 times.
…
move 121 to visitas(1)
move 82 to visitas(2)
move 42 to visitas(3)
move 61 to visitas(4)
move 425 to visitas(5)
move 247 to visitas(6)
move 879 to visitas(7)
01 semanas-textos.
02 texto pic x(21) value "lunmarmiejueviesabdom".
01 semanas redefines semanas-textos.
02 dias pic x(03) occurs 7 times.
Cine:
01 cine.
02 genero occurs 2 times.
03 visitas pic 9(04) occurs 7 times.
Ahora para cargar o mover datos se necesitan dos índices, uno
para la fila y otro para la columna, de manera que quedaría así:
Cine:
01 tabla.
02 trabajadores occurs 100 times.
03 nombre pic x(30).
03 nif pic x(10).
03 salario occurs 12 times.
05 bruto pic s9(08).
05 neto pic s9(08).
05 gastos occurs 10 times.
07 gasto pic s9(08).