Curso de COBOL desde cero

¿Cómo crear archivos indexados con COBOL y leerlos?

Capítulo 27: Crear y leer archivos indexados

Hasta ahora hemos visto cómo leer archivos de arriba a abajo, esto puede ser útil en archivos con pocos registros, pero el problema empieza cuando tenemos que manejar archivos enormes.

En este capítulo veremos cómo crear archivos indexados para poder leerlos en una secuencia diferente del orden físico de los registros en el archivo.
Es decir, por ejemplo, si quisieras consultar los empleados por orden de edad, o por nombre en orden alfabético, etc.

Para empezar este capítulo necesitarás saber los tres tipos de acceso a archivos que tiene cobol:

  • ACCESS MODE SEQUENTIAL. Modo de acceso secuencial o de serie, es decir, pasará por todos los registros anteriores para consultar uno específico.
  • ACCESS MODE RANDOM. Modo de acceso directo, es decir, se desplazará directamente al registro que vayamos a consultar sin necesidad de pasar por los anteriores.
  • ACCESS MODE DYNAMIC. Es el modo de acceso mas utilizado, podemos acceder de forma secuencial o directa cuando mas nos interese dentro de un programa.

También debes saber que podemos especificar una clave primaria con RECORD KEY.

  • RECORD KEY. Clave principal. Se refiere a un campo numérico que debe ser único para cada registro para poder identificarlo inequívocamente, por hacer una similitud con otros lenguajes de programación, podemos decir que es como un ID o la clave primaria de SQL.
  • ALTERNATE RECORD KEY. Clave alternativa. Se refiere a otro campo numérico o alfanumérico para poder darle otro orden al fichero a la hora de consultar. Se pueden hacer hasta 254 claves de este tipo en un sólo archivo.
    Este tipo de claves se suele utilizar para realizar consultas por otro campo que no sea la clave principal, por ejemplo, por fechas o por nombre, etc.
    Por defecto si no se dice nada son claves que no pueden duplicarse y son únicas por registro. Si queremos una clave alternativa que se pudiera repetir hay que indicarle la cláusula WITH DUPLICATES.

En COBOL tendremos que hacer debido a sus limitaciones 3 programas diferentes para hacer funcionar este archivo indexado.
En resumen, el programa 1 crea el archivo, el dos introduce los datos en el archivo y el tercero los ordena cómo queramos con el índice.

Te dejo el código del vídeo para que no tengas que estar escribiendo a medida que explico:

Código del archivo del vídeo capitulo27-4.cbl

IDENTIFICATION DIVISION.
PROGRAM-ID. CAPITULO-27.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
* Archivo físico en modo dinámico.
FILE-CONTROL.
SELECT EMPLEADOS-ARCHIVO
ASSIGN TO "empleados.dat"
ORGANIZATION IS INDEXED
RECORD KEY IS EMPLEADOS-ID
ACCESS MODE IS DYNAMIC.

DATA DIVISION.
FILE SECTION.
* Archivo lógico.
FD EMPLEADOS-ARCHIVO.
01 EMPLEADOS-REGISTRO.
	05 EMPLEADOS-ID PIC 9(6).
	05 EMPLEADOS-NOMBRE PIC X(25).
	05 EMPLEADOS-APELLIDOS PIC X(35).
	05 EMPLEADOS-EDAD PIC 9(3).
	05 EMPLEADOS-TELEFONO PIC X(9).
	05 EMPLEADOS-DIRECCION PIC X(35).

WORKING-STORAGE SECTION.
01  IDENTIFICADOR PIC X(36)
	VALUE "Introduce un ID del nuevo empleado: ".
01  NOMBRE PIC X(33)
	VALUE "Introduce un nombre de empleado: ".
01  APELLIDOS PIC X(25)
	VALUE "Introduce los apellidos: ".
01  EDAD PIC X(19)
	VALUE "Introduce la edad: ".
01  TELEFONO PIC X(33)
	VALUE "Introduce un número de teléfono: ".
01  DIRECCION PIC X(25)
	VALUE "Introduce una dirección: ".

01  SI-NO PIC X.
01  ENTRADA PIC X.
PROCEDURE DIVISION.
MAIN-LOGIC SECTION.
PROGRAM-BEGIN.

PERFORM PROCEDIMIENTO-DE-APERTURA.
MOVE "S" TO SI-NO.
PERFORM AGREGAR-REGISTROS
UNTIL SI-NO = "N".
PERFORM PROCEDIMIENTO-DE-CIERRE.

FINALIZA-PROGRAMA.
STOP RUN.

PROCEDIMIENTO-DE-APERTURA.
OPEN OUTPUT EMPLEADOS-ARCHIVO.

PROCEDIMIENTO-DE-CIERRE.
CLOSE EMPLEADOS-ARCHIVO.

AGREGAR-REGISTROS.
MOVE "N" TO ENTRADA.
PERFORM OBTENER-CAMPOS
UNTIL ENTRADA = "S".
PERFORM ESCRIBIR-REGISTRO.
PERFORM REINICIAR.

OBTENER-CAMPOS.
MOVE SPACE TO EMPLEADOS-REGISTRO.
DISPLAY IDENTIFICADOR.
ACCEPT EMPLEADOS-ID.
DISPLAY NOMBRE.
ACCEPT EMPLEADOS-NOMBRE.
DISPLAY APELLIDOS.
ACCEPT EMPLEADOS-APELLIDOS.
DISPLAY EDAD.
ACCEPT EMPLEADOS-EDAD.
DISPLAY TELEFONO.
ACCEPT EMPLEADOS-TELEFONO
DISPLAY DIRECCION.
ACCEPT EMPLEADOS-DIRECCION.
PERFORM CONTINUAR.

CONTINUAR.
MOVE "S" TO ENTRADA.
IF EMPLEADOS-NOMBRE = SPACE
MOVE "N" TO ENTRADA.

ESCRIBIR-REGISTRO.
WRITE EMPLEADOS-REGISTRO.

REINICIAR.
DISPLAY "¿Desea almacenar otro registro en la base de datos?".
ACCEPT SI-NO.
IF SI-NO = "s"
MOVE "S" TO SI-NO.
IF SI-NO NOT = "S"
MOVE "N" TO SI-NO.

END PROGRAM CAPITULO-27.

Código del archivo del vídeo capitulo27-5.cbl

IDENTIFICATION DIVISION.
PROGRAM-ID. CAPITULO-27.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
* Archivo físico en modo dinámico.
FILE-CONTROL.
SELECT EMPLEADOS-ARCHIVO
ASSIGN TO "empleados.dat"
ORGANIZATION IS INDEXED
RECORD KEY IS EMPLEADOS-ID
ACCESS MODE IS DYNAMIC.

DATA DIVISION.
	FILE SECTION.
* Archivo lógico.
FD EMPLEADOS-ARCHIVO.
01 EMPLEADOS-REGISTRO.
	05 EMPLEADOS-ID PIC 9(6).
	05 EMPLEADOS-NOMBRE PIC X(25).
	05 EMPLEADOS-APELLIDOS PIC X(35).
	05 EMPLEADOS-EDAD PIC 9(3).
	05 EMPLEADOS-TELEFONO PIC X(9).
	05 EMPLEADOS-DIRECCION PIC X(35).

WORKING-STORAGE SECTION.
77  LEE-TODO PIC X.
PROCEDURE DIVISION.
EMPIEZA-PROGRAMA.
PERFORM PROCEDIMIENTO-DE-APERTURA.
MOVE "0" TO LEE-TODO.
PERFORM LEE-SIGUIENTE-REGISTRO.
	IF LEE-TODO = "1"
		DISPLAY "No se encontraron registros en el archivo."
			ELSE
				PERFORM MUESTRA-CAMPOS
				UNTIL LEE-TODO = "1".
				PERFORM PROCEDIMIENTO-DE-CIERRE.
				FINALIZA-PROGRAMA.
				STOP RUN.
				PROCEDIMIENTO-DE-APERTURA.
				OPEN I-O EMPLEADOS-ARCHIVO.
				PROCEDIMIENTO-DE-CIERRE.
				CLOSE EMPLEADOS-ARCHIVO.
				MUESTRA-CAMPOS.
				DISPLAY "ID: " EMPLEADOS-ID
					" Nombre: " EMPLEADOS-NOMBRE " Apellidos: "
					EMPLEADOS-APELLIDOS " Edad: " EMPLEADOS-EDAD " Telefono: "
					EMPLEADOS-TELEFONO " Direccion: " EMPLEADOS-TELEFONO.

				PERFORM LEE-SIGUIENTE-REGISTRO.
				LEE-SIGUIENTE-REGISTRO.
				READ EMPLEADOS-ARCHIVO NEXT RECORD
				AT END MOVE "1" TO LEE-TODO.
END PROGRAM CAPITULO-27.

Comentarios

Si te quedan dudas sobre el temario, sobre COBOL, o cualquier otra cosa relacionada o simplemente quieres agradecer, aquí tienes tu sitio para dejar tu granito de arena. Gracias por tus comentarios y por darle vida a este sitio web.

Programación Fácil YouTube

Suscríbete

Si te ha gustado este curso y crees que el trabajo merece la pena, te agradeceré eternamente que te suscribas a mi canal de YouTube para apoyarme y que pueda seguir haciendo cursos gratuitos.

Además, si te encanta la programación, tienes un montón más de cursos gratuitos para ver.

No solo eso, podrás participar enviándome comentarios con tus sugerencias para temas específicos o cursos completos o incluso las dudas que tengas y las intentaré ir resolviendo en los cursos que estén todavía abiertos.