Menu

COBOL - Index Clause


Use o nome de dados do elemento da tabela, juntamente com um valor (chamado índice) que é adicionado ao endereço da tabela para localizar um item (como um deslocamento do início da tabela). Essa técnica é chamada de indexação ou subscrito usando nomes de índice.

Você cria um índice usando a frase INDEXED BY da cláusula OCCURS para identificar um nome de índice.
Por exemplo, INX-A no código a seguir é um nome de índice:

05 TABLE-ITEM PIC X(8) OCCURS 10 INDEXED BY INX-A.

O compilador calcula o valor contido no índice como o número de ocorrência (subscrito) menos 1, multiplicado pelo comprimento do elemento da tabela. Portanto, para a quinta ocorrência de TABLE-ITEM, o valor binário contido em INX-A é (5 - 1) * 8, ou 32.

Você pode usar um nome de índice para fazer referência a outra tabela somente se ambas as descrições de tabela tiverem o mesmo número de elementos de tabela e os elementos de tabela tiverem o mesmo comprimento.

Você pode usar a cláusula USAGE IS INDEX para criar um item de dados de índice e pode usar um item de dados de índice com qualquer tabela. Por exemplo, INX-B no código a seguir é um item de dados de índice:

77  INX-B  USAGE IS INDEX.

........

SET INX-A TO 10.
SET INX-B TO INX-A.
PERFORM VARYING INX-A FROM 1 BY 1 UNTIL INX-A > INX-B
      DISPLAY TABLE-ITEM (INX-A)
END-PERFORM.

O nome do índice INX-A é usado para percorrer a tabela TABLE-ITEM acima. O item de dados de índice INX-B é usado para armazenar o índice do último elemento da tabela. A vantagem deste tipo de codificação é que o cálculo dos deslocamentos dos elementos da tabela é minimizado e nenhuma conversão é necessária para a condição UNTIL.

SET Statement:

Você pode usar a instrução SET para atribuir a um item de dados de índice o valor armazenado em um nome de índice, como na instrução SET INX-B TO INX-A acima.

Por exemplo, ao carregar registros em uma tabela de comprimento variável, você pode armazenar o valor de índice do último registro em um item de dados definido como USAGE IS INDEX. Em seguida, você pode testar o final da tabela comparando o valor do índice atual com o valor do índice do último registro. Essa técnica é útil quando você examina ou processa uma tabela.

Você pode incrementar ou decrementar um nome de índice por um item de dados inteiro elementar ou um literal inteiro diferente de zero, por exemplo:

SET INX-A DOWN BY 3.

O inteiro representa um número de ocorrências. Ele é convertido em um valor de índice antes de ser adicionado ou subtraído do índice.

Inicialize o nome do índice usando uma instrução SET, PERFORM VARYING ou SEARCH ALL. Você pode então usar o nome do índice em SEARCH ou em instruções de condição relacional. Para alterar o valor, use uma instrução PERFORM, SEARCH ou SET.

Como você está comparando um deslocamento físico, você pode usar diretamente itens de dados de índice apenas em instruções SEARCH e SET ou em comparações com índices ou outros itens de dados de índice. Você não pode usar itens de dados de índice como subscritos ou índices.


Exemplo:

Vamos ver outro exemplo para entender o índice na tabela:

IDENTIFICATION DIVISION.
PROGRAM-ID. CBLHELLO.

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).

Output:

ABC
DEF
GHI
JKL
MNO
PQR