O comando executa uma pesquisa em série do elemento da tabela.
Se soubermos de antemão que o elemento a ser pesquisado ocorre a partir de uma determinada ocorrência da tabela
podemos posicionar o indexador na mesma, através do comando SET, antes de executarmos o comando SEARCH.
Este formato admite várias frases WHEN.
Quando da execução do comando SEARCH, tem início uma pesquisa serial, a partir da
ocorrência para a qual estiver setado o indexador (não necessariamente a primeira).
As condições associadas a WHEN são testadas na ordem em que foram escritas.
Se nenhuma das condições especificadas é satisfeita, o valor do indexador é incrementado de 1 e novo teste é realizado.
Se a condição é satisfeita o comando imperativo é executado e o SEARCH termina, deixando
o indexador apontando para a ocorrência da tabela que satifez a condição.
Se nenhuma das condições é satisfeita ao se chegar ao final da tabela o comando imperativo
previsto para a cláusula AT END é executado e o SEARCH termina.
O seu formato geral é:
- identifier-1
- identifier-1 identifica a tabela que deve ser pesquisada. O identifier-1 faz referência a todas as ocorrências nessa tabela.
A entrada de descrição de dados para o identifier-1 deve conter uma cláusula OCCURS.
A entrada de descrição de dados para o identifier-1 deve conter uma cláusula OCCURS com a frase INDEXED BY, mas uma tabela pode ser pesquisada usando um índice
definido para uma tabela diferente adequadamente descrita.
O identifier-1 pode fazer referência a um item de dados subordinado a um item de dados descrito com uma cláusula OCCURS (ou seja, o identifier-1 pode ser uma
tabela subordinada em uma tabela multidimensional).
Nesse caso, as entradas de descrição de dados devem especificar uma frase INDEXED BY para cada dimensão da tabela.
O identifier-1 não deve ser subscrito ou modificado por referência.
- AT END
- A condição que existe quando a operação de pesquisa termina sem satisfazer a condição especificada em qualquer uma das frases WHEN associadas.
Antes de executar uma pesquisa em série, você deve definir o valor do primeiro (ou único) índice associado ao identifier-1 (o índice de pesquisa) para indicar a
ocorrência inicial da pesquisa.
Antes de usar uma pesquisa serial em uma tabela multidimensional, você também deve definir o valor do índice para cada dimensão superordenada.
A instrução SEARCH modifica apenas o valor no índice de pesquisa e, se a frase VARYING for especificada, o valor em index-name-1 ou identifier-2.
Portanto, para pesquisar uma tabela bidimensional a sete dimensional inteira, você deve executar uma instrução SEARCH para cada dimensão.
Nas frases WHEN, você deve especificar os índices para todas as dimensões.
Antes da execução de cada instrução SEARCH, você deve inicializar os índices associados com as instruções SET.
A instrução SEARCH executa uma pesquisa serial iniciando na configuração atual do índice de pesquisa.
Quando a pesquisa começa, se o valor do índice associado ao identifier-1 não for maior que o número de ocorrência mais alto possível, as seguintes ações ocorrerão:
- As condições na frase WHEN são avaliadas na ordem em que são escritas.
- Se nenhuma das condições for atendida, o índice do identier-1 será aumentado para corresponder ao próximo elemento da tabela e a etapa 1 será repetida.
- Se, após a avaliação, uma das condições WHEN for atendida, a pesquisa será encerrada imediatamente e a instrução imperative-statement-2 associada a essa condição será
executada.
O índice aponta para o elemento da tabela que atendeu à condição.
Se NEXT SENTENCE for especificado, o controle passará para a instrução após o período mais próximo.
- Se o final da tabela for atingido (ou seja, o valor do índice incrementado for maior que o número de ocorrência mais alto possível) sem que a condição WHEN
seja atendida, a pesquisa será encerrada.
Se, quando a pesquisa começar, o valor do nome do índice associado ao identifier-1 for maior que o número de ocorrência mais alto possível, a pesquisa será encerrada
imediatamente.
Quando a pesquisa termina, se a frase AT END for especificada, a instrução imperativa-1 será executada.
Se a frase AT END for omitida, o controle passará para a próxima instrução após a instrução SEARCH.
Exemplo: pesquisa serial multidimensional
O fragmento de código a seguir mostra uma pesquisa da dimensão interna (tabela C) na terceira ocorrência na tabela superordenada (tabela R):
. . .
WORKING-STORAGE SECTION.
01 G.
02 R OCCURS 10 INDEXED BY RINDEX.
03 C OCCURS 10 ASCENDING KEY X INDEXED BY CINDEX.
04 X PIC 99.
01 ARG PIC 99 VALUE 34.
PROCEDURE DIVISION.
. . .
* Para pesquisar na ocorrência 3 da tabela R, defina seu índice como 3
* * Para pesquisar na tabela C, começando na ocorrência 1, defina seu índice como 1
SET RINDEX TO 3
SET CINDEX TO 1
* Na instrução SEARCH, especifique C sem índices
SEARCH C
* Especifique índices para ambas as dimensões na frase WHEN
WHEN X(RINDEX CINDEX) = ARG
DISPLAY "FOUND " X(RINDEX CINDEX)
END-SEARCH
. . .
VARYING phrase
- index-name-1
- Uma das seguintes ações se aplica:
- Se o index-name-1 for um índice para o identifier-1 , esse índice será usado para a pesquisa.
Caso contrário, o primeiro (ou único) nome do índice é usado.
- Se o nome-do-índice-1 for um índice para outro elemento da tabela, o primeiro (ou único) index-name para o identifier-1 será usado para a pesquisa;
o número de ocorrência representado por index-name-1 é aumentado na mesma quantidade que o índice de pesquisa e ao mesmo tempo.
Quando a frase VARYING índice-nome-1 é omitida, o primeiro (ou único) index-name para o identifier-1 é usado para a pesquisa.
Se a indexação for usada para procurar uma tabela sem uma frase INDEXED BY, os resultados corretos serão garantidos apenas se a tabela definida com o índice e
a tabela definida sem o índice tiverem elementos da mesma duração e com o mesmo número de ocorrências.
Quando o objeto da frase VARYING é um nome de índice para outro elemento da tabela, uma instrução SEARCH serial passa por dois elementos da tabela ao mesmo
tempo.
- identifier-2
- Deve ser um item de dados de índice ou um item inteiro elementar.
O identifier-2 não pode ser um campo de data em janela.
O identifier-2 não pode ser subscrito pelo primeiro (ou único) nome-índice especificado para o identifier-1.
Durante a pesquisa, uma das seguintes ações se aplica:
- Se o identifier-2 for um item de dados do índice, sempre que o índice de pesquisa for aumentado, o item de dados do índice especificado será aumentado
simultaneamente na mesma quantidade.
- Se o identifier-2 for um item de dados inteiro, sempre que o índice de pesquisa for aumentado, o item de dados especificado será aumentado simultaneamente
em 1.
WHEN phrase (serial search)
- condition-1
- Pode ser qualquer condição descrita em Conditional expressions - Expressões condicionais.
A figura a seguir ilustra uma operação SEARCH no formato 1 que contém duas frases WHEN.
Veja tambem:
|