domingo, 23 de abril de 2017

Mostrar o valor do índex de uma tabela

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: 

FELIPE BARBOSA FERREIRA - Erro ao usar o index da tabela em 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:
  • 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:
FELIPE BARBOSA FERREIRA - Resposta programa exemplo mostrar valor do index da tabela
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.

Para Ctrl + C do código acesse aqui.
Consultar a relação de Termos e Abreviaturas acesse aqui.
FELIPE BARBOSA FERREIRA

Até o próximo post!

Nenhum comentário:

Postar um comentário