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