Olá!
Uma das estruturas básicas para a declaração de uma tabela no COBOL, é:
03 NOME-TABELA OCCURS 0 TO QUANTIDADE-REGISTROS TIMES
DEPENDING ON
QUANTIDADE-REGISTROS-INSERIDOS.
05 VAR-1 PICTURE
05 VAR-2 PICTURE
05
VAR-n PICTURE
Entretanto, dependendo da aplicação a ser realizada, pode ser necessário trabalhar com o índex da tabela, desde modo a declaração da tabela deve ser feita conforme:
03 NOME-TABELA OCCURS 0 TO QUANTIDADE-REGISTROS TIMES
DEPENDING ON
QUANTIDADE-REGISTROS-INSERIDOS
INDEXED BY NOME-INDEX.
05 VAR-1 PICTURE
05 VAR-2 PICTURE
05
VAR-n PICTURE
O detalhe é que esse índex é para utilização de processamento lógico, o que quero dizer é: a variável índex da tabela, não é uma variável comum e requer um tratamento específico. Pois, por exemplo, os comandos:
Erro com a variável índex da tabela |
Retornam erro relativo ao uso ilegal dessa variável.
- Note que se utilizado diretamente no comando Display é retornado erro. Então como mostrar o valor do índex da tabela?
Para exibir o valor dessa variável é necessário criar uma auxiliar numérica PIC 9(n) e atribuir o valor do índex para ela. E para realizar a movimentação do valor, deve ser usado o comando SET, veja:
SET VAR-AUXILIAR
TO NOME-INDEX.
Exemplo prático:
O comando Search é utilizado para realizar a pesquisa de um registro em uma tabela, e para usar esse comando é necessário realizar a declaração da tabela com o índex.
No programa de exemplo foi criado uma tabela para armazenar os alunos ganhadores de uma competição, sendo que a ordem de colocação do aluno é definida pela ordem de cadastrado na tabela, ou seja, o primeiro registro é equivalente ao ganhador do primeiro lugar da competição. Assim, com o uso do Search é possível apresentar a posição de um determinado aluno.
Então, quando o Search encontrar o aluno, o valor contido no índex da tabela é referente à posição do registro.
Veja abaixo as declarações básicas e comandos principais para o código de exemplo:
Veja abaixo as declarações básicas e comandos principais para o código de exemplo:
- Declaração das variáveis:
*
* -- Quantidade de alunos
77 GDA-QT-ALU PIC 9(004).
*
* -- Index para loop
77 NDX PIC 9(001) VALUE ZEROS.
*
* -- Para ser usado no SEARCH
77 MATRICULA-ALU PIC 9(004) VALUE ZEROS.
*
* -- Armazenar a posicao do aluno na premiacao da competicao
77 POSICAO-PREMIACAO PIC 9(004) VALUE ZEROS.
*
*----------------------------------------------------------------*
* -- Tabela para armazenar os alunos ganhadores
*----------------------------------------------------------------*
*
* -- Tabela ALUNO: Matricula - Nome - Idade
01 TABELA-ALUNO-PREMIADOS.
03 TAB-ALU OCCURS 0 TO 5 TIMES
DEPENDING ON GDA-QT-ALU
INDEXED BY NDX-TAB-ALU.
05 TAB-ALU-MTC PIC 9(004).
05 TAB-ALU-NM PIC X(050).
05 TAB-ALU-IDD PIC 9(004).
*
- Comando Search
* -- Realiza a pesquisa na tabela
SEARCH TAB-ALU
* Quando nao encontrado
AT END
SET POSICAO-PREMIACAO TO 9999
*
* Quando encontrado
WHEN TAB-ALU-MTC(NDX-TAB-ALU) EQUAL MATRICULA-ALU
SET POSICAO-PREMIACAO TO NDX-TAB-ALU
*
END-SEARCH.
*
Note que quando o aluno é encontrado o valor do índex da tabela (NDX-TAB-ALU) é movimentado para a variável (POSICAO-PREMIACAO) por meio do comando SET, está variável é usada de forma auxiliar para exibir o valor contido no índex da tabela.
- Mostrar o valor do índex da tabela, e demais dados do aluno
* -- Mostrar os dados do aluno premiado
*
IF POSICAO-PREMIACAO EQUAL 9999
DISPLAY 'Não foi premiado o aluno com matrícula: '
MATRICULA-ALU
ELSE
DISPLAY 'Posição ' POSICAO-PREMIACAO ' - '
TAB-ALU-NM(POSICAO-PREMIACAO)
END-IF.
Resposta da execução do programa para o exemplo:
Resposta da execução do código de exemplo |
a
Enfim, quando a aplicação requer a utilização do índex da tabela, tenha cuidado e atenção com os comandos que serão utilizados para manipular o valor dessa variável.