COBOL - Processamento de Tabela

Os arrays em COBOL são conhecidos como tabelas. Uma matriz é uma estrutura de dados linear e é uma coleção de itens de dados individuais do mesmo tipo. Os itens de dados de uma tabela são classificados internamente.

Declaração de mesa

A tabela é declarada na Divisão de Dados. Occurscláusula é usada para definir uma tabela. A cláusula Occurs indica a repetição da definição do nome dos dados. Pode ser usado apenas com números de nível começando de 02 a 49. Não use a cláusula ocorre com Redefines. A descrição da tabela unidimensional e bidimensional é a seguinte -

Tabela unidimensional

Em uma tabela unidimensional, occurscláusula é usada apenas uma vez na declaração. WSTABLE é o item do grupo que contém a tabela. WS-B nomeia os elementos da tabela que ocorrem 10 vezes.

Syntax

A seguir está a sintaxe para definir uma tabela 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 executar o programa COBOL acima -

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

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

ONE-D TABLE : TUTORIALS TUTORIALS TUTORIALS TUTORIALS TUTORIALS

Tabela bidimensional

Uma tabela bidimensional é criada com ambos os elementos de dados sendo de comprimento variável. Para referência, leia a sintaxe e tente analisar a tabela. A primeira matriz (WS-A) pode ocorrer de 1 a 10 vezes e a matriz interna (WS-C) pode ocorrer de 1 a 5 vezes. Para cada entrada do WS-A, haverá 5 entradas correspondentes do WS-C.

Syntax

A seguir está a sintaxe para definir uma tabela 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 executar o programa COBOL acima -

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

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

TWO-D TABLE :  TUTORIALS POINT POINT TUTORIALS POINT POINT

Subscrito

Os elementos individuais da tabela podem ser acessados ​​usando subscrito. Os valores subscritos podem variar de 1 ao número de vezes que a tabela ocorre. Um subscrito pode ser qualquer número positivo. Não requer nenhuma declaração na divisão de dados. Ele é criado automaticamente com a cláusula ocorre.

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 executar o programa COBOL acima -

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

Quando você compila e executa o programa acima, ele produz o seguinte 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

Os elementos da tabela também podem ser acessados ​​usando o índice. Um índice é um deslocamento de elemento do início da tabela. Um índice é declarado com a cláusula Occurs usando a cláusula INDEXED BY. O valor do índice pode ser alterado usando a instrução SET e a opção PERFORM Varying.

Syntax

A seguir está a sintaxe para definir o índice em uma tabela -

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 executar o programa COBOL acima -

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

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

ABC
DEF
GHI
JKL
MNO
PQR

Definir declaração

A instrução Set é usada para alterar o valor do índice. Definir verbo é usado para inicializar, incrementar ou decrementar o valor do índice. É usado com Pesquisar e Pesquisar tudo para localizar elementos na tabela.

Syntax

A seguir está a sintaxe para usar uma instrução 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 executar o programa COBOL acima.

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

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

ABC
JKL

Pesquisa

A pesquisa é um método de pesquisa linear, usado para localizar elementos dentro da tabela. Pode ser executado em tabelas ordenadas ou não ordenadas. É usado apenas para tabelas declaradas por frase de índice. Ele começa com o valor inicial do índice. Se o elemento procurado não for encontrado, o índice é automaticamente incrementado em 1 e continua até o final da tabela.

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 executar o programa COBOL acima.

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

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

LETTER M FOUND IN TABLE

Pesquisar tudo

Pesquisar tudo é um método de pesquisa binário, usado para localizar elementos dentro da tabela. A tabela deve estar em ordem de classificação para a opção Pesquisar tudo. O índice não requer inicialização. Na pesquisa binária, a tabela é dividida em duas metades e determina em qual metade o elemento pesquisado está presente. Este processo se repete até que o elemento seja encontrado ou o fim seja alcançado.

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 executar o programa COBOL acima -

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

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

RECORD FOUND 
93
MNO