COBOL - Procesamiento de tablas

Las matrices en COBOL se conocen como tablas. Una matriz es una estructura de datos lineal y es una colección de elementos de datos individuales del mismo tipo. Los elementos de datos de una tabla se ordenan internamente.

Declaración de tabla

La tabla se declara en división de datos. OccursLa cláusula se utiliza para definir una tabla. La cláusula Ocurre indica la repetición de la definición del nombre de los datos. Sólo se puede usar con números de nivel que comienzan del 02 al 49. La cláusula No usar ocurre con Redefine. La descripción de la tabla unidimensional y bidimensional es la siguiente:

Mesa unidimensional

En una tabla unidimensional, occursLa cláusula se usa solo una vez en la declaración. WSTABLE es el elemento de grupo que contiene la tabla. WS-B nombra los elementos de la tabla que ocurren 10 veces.

Syntax

A continuación se muestra la sintaxis para definir una tabla unidimensional:

01 WS-TABLE.
   05 WS-A PIC A(10) OCCURS 10 TIMES.

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-TABLE.
      05 WS-A PIC A(10) VALUE 'TUTORIALS' OCCURS 5 TIMES.     

PROCEDURE DIVISION.
   DISPLAY "ONE-D TABLE : "WS-TABLE.
STOP RUN.

JCL para ejecutar el programa COBOL anterior -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Cuando compila y ejecuta el programa anterior, produce el siguiente resultado:

ONE-D TABLE : TUTORIALS TUTORIALS TUTORIALS TUTORIALS TUTORIALS

Mesa bidimensional

Se crea una tabla bidimensional con ambos elementos de datos de longitud variable. Como referencia, revise la sintaxis y luego intente analizar la tabla. La primera matriz (WS-A) puede ocurrir de 1 a 10 veces y la matriz interna (WS-C) puede ocurrir de 1 a 5 veces. Para cada entrada de WS-A, habrá 5 entradas correspondientes de WS-C.

Syntax

A continuación se muestra la sintaxis para definir una tabla bidimensional:

01 WS-TABLE.
   05 WS-A OCCURS 10 TIMES.
      10 WS-B PIC A(10).
      10 WS-C OCCURS 5 TIMES.
         15 WS-D PIC X(6).

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-TABLE.
      05 WS-A OCCURS 2 TIMES.
         10 WS-B PIC A(10) VALUE ' TUTORIALS'.
         10 WS-C OCCURS 2 TIMES.
            15 WS-D PIC X(6) VALUE ' POINT'.

PROCEDURE DIVISION.
   DISPLAY "TWO-D TABLE : "WS-TABLE.

STOP RUN.

JCL para ejecutar el programa COBOL anterior -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Cuando compila y ejecuta el programa anterior, produce el siguiente resultado:

TWO-D TABLE :  TUTORIALS POINT POINT TUTORIALS POINT POINT

Subíndice

Se puede acceder a los elementos individuales de la tabla utilizando subíndice. Los valores de subíndice pueden oscilar entre 1 y el número de veces que aparece la tabla. Un subíndice puede ser cualquier número positivo. No requiere ninguna declaración en la división de datos. Se crea automáticamente con la cláusula ocurre.

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-TABLE.
      05 WS-A OCCURS 3 TIMES.
         10 WS-B PIC A(2).
         10 WS-C OCCURS 2 TIMES.
            15 WS-D PIC X(3).

PROCEDURE DIVISION.
   MOVE '12ABCDEF34GHIJKL56MNOPQR' TO WS-TABLE.
   DISPLAY 'WS-TABLE  : ' WS-TABLE.
   DISPLAY 'WS-A(1)   : ' WS-A(1).
   DISPLAY 'WS-C(1,1) : ' WS-C(1,1).
   DISPLAY 'WS-C(1,2) : ' WS-C(1,2).
   DISPLAY 'WS-A(2)   : ' WS-A(2).
   DISPLAY 'WS-C(2,1) : ' WS-C(2,1).
   DISPLAY 'WS-C(2,2) : ' WS-C(2,2).
   DISPLAY 'WS-A(3)   : ' WS-A(3).
   DISPLAY 'WS-C(3,1) : ' WS-C(3,1).
   DISPLAY 'WS-C(3,2) : ' WS-C(3,2).
   
STOP RUN.

JCL para ejecutar el programa COBOL anterior -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Cuando compila y ejecuta el programa anterior, produce el siguiente resultado:

WS-TABLE  : 12ABCDEF34GHIJKL56MNOPQR
WS-A(1)   : 12ABCDEF
WS-C(1,1) : ABC
WS-C(1,2) : DEF
WS-A(2)   : 34GHIJKL
WS-C(2,1) : GHI
WS-C(2,2) : JKL
WS-A(3)   : 56MNOPQR
WS-C(3,1) : MNO
WS-C(3,2) : PQR

Índice

También se puede acceder a los elementos de la tabla usando index. Un índice es un desplazamiento de un elemento desde el inicio de la tabla. Un índice se declara con la cláusula Occurs utilizando la cláusula INDEXED BY. El valor del índice se puede cambiar usando la instrucción SET y la opción PERFORM Varying.

Syntax

A continuación se muestra la sintaxis para definir el índice en una tabla:

01 WS-TABLE.
   05 WS-A PIC A(10) OCCURS 10 TIMES INDEXED BY I.

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-TABLE.
      05 WS-A OCCURS 3 TIMES INDEXED BY I.
         10 WS-B PIC A(2).
         10 WS-C OCCURS 2 TIMES INDEXED BY J.
            15 WS-D PIC X(3).

PROCEDURE DIVISION.
   MOVE '12ABCDEF34GHIJKL56MNOPQR' TO WS-TABLE.
   PERFORM A-PARA VARYING I FROM 1 BY 1 UNTIL I >3 
   STOP RUN.
   
   A-PARA.
   PERFORM C-PARA VARYING J FROM 1 BY 1 UNTIL J>2.
   
   C-PARA.
   DISPLAY WS-C(I,J).

JCL para ejecutar el programa COBOL anterior -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Cuando compila y ejecuta el programa anterior, produce el siguiente resultado:

ABC
DEF
GHI
JKL
MNO
PQR

Establecer declaración

La instrucción Set se usa para cambiar el valor del índice. Set verb se usa para inicializar, incrementar o disminuir el valor del índice. Se utiliza con Buscar y Buscar todo para localizar elementos en la tabla.

Syntax

A continuación se muestra la sintaxis para usar una instrucción Set:

SET I J TO positive-number
SET I TO J
SET I TO 5
SET I J UP BY 1
SET J DOWN BY 5

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-TABLE.
      05 WS-A OCCURS 3 TIMES INDEXED BY I.
         10 WS-B PIC A(2).
         10 WS-C OCCURS 2 TIMES INDEXED BY J.
            15 WS-D PIC X(3).

PROCEDURE DIVISION.
   MOVE '12ABCDEF34GHIJKL56MNOPQR' TO WS-TABLE.
   SET I J TO 1.
   DISPLAY WS-C(I,J).
   SET I J UP BY 1.
   DISPLAY WS-C(I,J).
   
STOP RUN.

JCL para ejecutar el programa COBOL anterior.

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Cuando compila y ejecuta el programa anterior, produce el siguiente resultado:

ABC
JKL

Buscar

La búsqueda es un método de búsqueda lineal, que se utiliza para encontrar elementos dentro de la tabla. Se puede realizar tanto en una mesa clasificada como sin clasificar. Se usa solo para tablas declaradas por frase de índice. Comienza con el valor inicial de index. Si no se encuentra el elemento buscado, el índice se incrementa automáticamente en 1 y continúa hasta el final de la tabla.

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-TABLE.
      05 WS-A PIC X(1) OCCURS 18 TIMES INDEXED BY I.
   01 WS-SRCH PIC A(1) VALUE 'M'.

PROCEDURE DIVISION.
   MOVE 'ABCDEFGHIJKLMNOPQR' TO WS-TABLE.
   SET I TO 1.
   SEARCH WS-A
      AT END DISPLAY 'M NOT FOUND IN TABLE'
      WHEN WS-A(I) = WS-SRCH
      DISPLAY 'LETTER M FOUND IN TABLE'
   END-SEARCH.  

STOP RUN.

JCL para ejecutar el programa COBOL anterior.

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Cuando compila y ejecuta el programa anterior, produce el siguiente resultado:

LETTER M FOUND IN TABLE

Busca todo

Buscar todo es un método de búsqueda binaria, que se utiliza para buscar elementos dentro de la tabla. La tabla debe estar ordenada para la opción Buscar todo. El índice no requiere inicialización. En la búsqueda binaria, la tabla se divide en dos mitades y determina en qué mitad del elemento buscado está presente. Este proceso se repite hasta que se encuentra el elemento o se llega al final.

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-TABLE.
      05 WS-RECORD OCCURS 10 TIMES ASCENDING KEY IS WS-NUM INDEXED BY I.
      10 WS-NUM PIC 9(2).
      10 WS-NAME PIC A(3).

PROCEDURE DIVISION.
   MOVE '12ABC56DEF34GHI78JKL93MNO11PQR' TO WS-TABLE.
   SEARCH ALL WS-RECORD
     AT END DISPLAY 'RECORD NOT FOUND'
     WHEN WS-NUM(I) = 93
     DISPLAY 'RECORD FOUND '
     DISPLAY WS-NUM(I)
     DISPLAY WS-NAME(I)

END-SEARCH.

JCL para ejecutar el programa COBOL anterior -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Cuando compila y ejecuta el programa anterior, produce el siguiente resultado:

RECORD FOUND 
93
MNO