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á!
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.
FELIPE BARBOSA FERREIRA
Até o próximo post!