domingo, 1 de julho de 2018

Search VS Search ALL

Olá!

No COBOL temos algumas formas para percorrer uma lista/tabela.

Sim!

Além do bom e simples PERFORM UNTIL utilizado para a realização de loops, temos as opções: SEARCH ou SEARCH ALL. Que dependendo do processamento a ser realizado podem apresentar melhor performance no tratamento dos dados.

Por exemplo, pense na situação que você possui uma lista com milhares de registros, e será necessário verificar se há um registro com um valor específico. Ou seja, terá que realizar no mínimo uma iteração na lista e uma expressão condicional em cada registro iterado.

No primeiro momento logo se pensa em fazer um PERFORM UNTIL e dentro dele utilizar um IF para verificar cada registro. Não é? Sim. Entretanto, por outro lado, podemos fazer uma solução mais elegante e mais performática com o uso do SEARCH ou SEARCH ALL.

Antes de conhecer a sintaxe dos comandos SEARCH e SEARCH ALL, vamos ter um duelo para visualizar as características de cada um. Vamos lá!

FELIPE BARBOSA FERREIRA Características do comando Search VS Search ALL
Características do comando Search VS Search ALL

Cuidados importantes ao utilizar o SEARCH ALL
  • Se a tabela estiver preenchida parcialmente e ordenada de forma ascendente, inicializar os campos não populados com HIGH-VALUES
  • Se a tabela estiver preenchida parcialmente e ordenada de forma descendente, inicializar os campos não populados com LOW-VALUES
  • Na declaração da tabela adicionar ASCENDING ou DESCENDING KEY IS

Declaração da tabela:
     *
     * -- Tabela ALUNO: Matricula - Nome - Idade
      01 TABELA-ALUNO.
          03 TAB-ALU OCCURS  0 TO 500 TIMES
                     DEPENDING ON GDA-QT-ALU
                 ASCENDING KEY IS TAB-ALU-MTC
                       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).
     *

Os comandos:
  • SEARCH
     * -- Realiza a pesquisa na tabela
          SEARCH TAB-ALU VARYING PSC-ALUNO
     *        Quando não encontrado
              AT END
                  MOVE 'Aluno não encontrado' TO GDA-NM-ALU
     *
     *        Quando encontrado
              WHEN TAB-ALU-MTC(NDX-TAB-ALU) EQUAL MATRICULA-ALU
                  MOVE TAB-ALU-NM(NDX-TAB-ALU) TO GDA-NM-ALU
     *
          END-SEARCH.
     *

  • SEARCH ALL
     * -- Realiza a pesquisa na tabela
          SEARCH ALL TAB-ALU
     *        Quando não encontrado
              AT END
                  MOVE 'Aluno não encontrado' TO GDA-NM-ALU
     *
     *        Quando encontrado
              WHEN TAB-ALU-MTC(NDX-TAB-ALU) EQUAL MATRICULA-ALU
                  MOVE TAB-ALU-NM(NDX-TAB-ALU) TO GDA-NM-ALU
     *
          END-SEARCH.
     *

Visualmente são os mesmos comandos, pois neste exemplo somente o uso do ALL é a diferença entre os comandos. 

Mas lembre-se das características de cada um, pois a maior diferença está no processamento dos dados e não na escrita do comando. Também, na se esqueça da devida atenção ao se utilizar o SEARCH ALL, tanto na lista a ser processada como na declaração da tabela.

Consultar a relação de Termos e Abreviaturas acesse aqui.

FELIPE BARBOSA FERREIRA
Até o próximo post!