COBOL - Elaborazione tabelle

Gli array in COBOL sono noti come tabelle. Un array è una struttura dati lineare ed è una raccolta di elementi di dati individuali dello stesso tipo. Gli elementi di dati di una tabella vengono ordinati internamente.

Dichiarazione della tabella

La tabella è dichiarata in Divisione dati. Occursla clausola viene utilizzata per definire una tabella. La clausola Occurs indica la ripetizione della definizione del nome dati. Può essere utilizzato solo con i numeri di livello che vanno da 02 a 49. Non utilizzare la clausola si verifica con Redefines. La descrizione della tabella unidimensionale e bidimensionale è la seguente:

Tabella unidimensionale

In una tabella unidimensionale, occursla clausola viene utilizzata solo una volta nella dichiarazione. WSTABLE è l'elemento del gruppo che contiene la tabella. WS-B nomina gli elementi della tabella che ricorrono 10 volte.

Syntax

Di seguito è riportata la sintassi per la definizione di una tabella unidimensionale:

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 per eseguire il programma COBOL di cui sopra -

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

Quando compili ed esegui il programma sopra, produce il seguente risultato:

ONE-D TABLE : TUTORIALS TUTORIALS TUTORIALS TUTORIALS TUTORIALS

Tabella bidimensionale

Viene creata una tabella bidimensionale con entrambi gli elementi di dati a lunghezza variabile. Per riferimento, passare attraverso la sintassi e quindi provare ad analizzare la tabella. Il primo array (WS-A) può verificarsi da 1 a 10 volte e l'array interno (WS-C) può verificarsi da 1 a 5 volte. Per ogni voce di WS-A, ci saranno 5 voci corrispondenti di WS-C.

Syntax

Di seguito è riportata la sintassi per definire una tabella bidimensionale:

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 per eseguire il programma COBOL di cui sopra -

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

Quando compili ed esegui il programma sopra, produce il seguente risultato:

TWO-D TABLE :  TUTORIALS POINT POINT TUTORIALS POINT POINT

Pedice

È possibile accedere ai singoli elementi della tabella utilizzando il pedice. I valori di pedice possono variare da 1 al numero di volte in cui si verifica la tabella. Un pedice può essere qualsiasi numero positivo. Non necessita di alcuna dichiarazione nella divisione dati. Viene creato automaticamente con la clausola si verifica.

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 per eseguire il programma COBOL di cui sopra -

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

Quando compili ed esegui il programma sopra, produce il seguente risultato:

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

Indice

È inoltre possibile accedere agli elementi della tabella utilizzando index. Un indice è uno spostamento di un elemento dall'inizio della tabella. Un indice viene dichiarato con la clausola Occurs utilizzando la clausola INDEXED BY. Il valore dell'indice può essere modificato utilizzando l'istruzione SET e l'opzione PERFORM Varying.

Syntax

Di seguito è riportata la sintassi per la definizione dell'indice in una tabella:

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 per eseguire il programma COBOL di cui sopra -

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

Quando compili ed esegui il programma sopra, produce il seguente risultato:

ABC
DEF
GHI
JKL
MNO
PQR

Set Statement

L'istruzione Set viene utilizzata per modificare il valore dell'indice. Set verbo viene utilizzato per inizializzare, aumentare o diminuire il valore dell'indice. Viene utilizzato con Cerca e Cerca tutto per individuare gli elementi nella tabella.

Syntax

Di seguito è riportata la sintassi per l'utilizzo di un'istruzione 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 per eseguire il programma COBOL di cui sopra.

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

Quando compili ed esegui il programma sopra, produce il seguente risultato:

ABC
JKL

Ricerca

La ricerca è un metodo di ricerca lineare, utilizzato per trovare elementi all'interno della tabella. Può essere eseguito su tabelle ordinate e non ordinate. Viene utilizzato solo per le tabelle dichiarate dalla frase Indice. Inizia con il valore iniziale di index. Se l'elemento cercato non viene trovato, l'indice viene automaticamente incrementato di 1 e continua fino alla fine della tabella.

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 per eseguire il programma COBOL di cui sopra.

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

Quando compili ed esegui il programma sopra, produce il seguente risultato:

LETTER M FOUND IN TABLE

Cerca in tutto

Cerca tutto è un metodo di ricerca binario, utilizzato per trovare elementi all'interno della tabella. La tabella deve essere ordinata per l'opzione Cerca tutto. L'indice non richiede inizializzazione. Nella ricerca binaria, la tabella è divisa in due metà e determina in quale metà è presente l'elemento cercato. Questo processo si ripete finché l'elemento non viene trovato o viene raggiunta la fine.

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 per eseguire il programma COBOL di cui sopra -

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

Quando compili ed esegui il programma sopra, produce il seguente risultato:

RECORD FOUND 
93
MNO