Segunda 29 Abril 2024

A instrução SEARCH procura uma tabela para um elemento que satisfaz a condição especificada e ajusta o índice associado para indicar esse elemento.

 

Pesquisa em série

Read syntax diagramSkip visual syntax diagram>>-SEARCH--identifier-1--+---------------------------+---------->
                         '-VARYING--+-identifier-2-+-'
                                    '-index-name-1-'
 
>--+-------------------------------------+---------------------->
   '-+----+--END--imperative-statement-1-'
     '-AT-'
 
   .-----------------------------------------------.
   V                                               |
>----WHEN--condition-1--+-imperative-statement-2-+-+------------>
                        '-NEXT-SENTENCE----------'
 
>--+------------+----------------------------------------------><
   '-END-SEARCH-'

Quando a tabela que você deseja pesquisar não foi classificada. Use para pesquisar numa tabela ordenada quando pretende pesquisar em série através da tabela ou pretender controlar subíndices ou índices.

 

identifier-1

identifier-1 identifica o quadro que está a ser pesquisada. identifier-1 referências todas as ocorrências dentro dessa tabela.

A descrição entrada de dados para identifier-1 deve conter uma cláusula OCCURS.

A descrição entrada de dados para identifier-1 deve conter uma cláusula OCCURS com a indexado por frase, mas uma tabela pode ser pesquisado usando um índice definido para um apropriadamente descrito tabela diferente.

identifier-1 pode fazer referência a um item de dados que está subordinado a um item de dados que é descrito com um OCCURS (ou seja, identifier-1 pode ser uma tabela subordinada dentro de uma tabela multidimensional). Nesse caso, as entradas de descrição de dados devem especificar uma expressão INDEXED BY para cada dimensão da tabela.

identifier-1 não deve ser subscritas ou referência modificado.

 

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 de série, você deve definir o valor do índice de primeira (ou única) associado com identificador-1 (o índice de pesquisa) para indicar a ocorrência de partida para a 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 declaração SEARCH modifica apenas o valor no índice de pesquisa, e, se VARYING é especificado, o valor em index-name-1 ou identifier-2. Portanto, para pesquisar uma tabela bidimensional completa para sete dimensões, 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 instruções SET.

A instrução SEARCH executa um início de pesquisa serial na configuração atual do índice de pesquisa.

Quando a pesquisa começa, se o valor do índice associado ao identificador-1 não é maior do que o maior número possível ocorrência, as seguintes ações ocorrem:

  • As condições na frase WHEN são avaliadas na ordem em que são escritas.
  • Se nenhuma das condições é satisfeita, o índice de identificador-1 é aumentada para corresponder ao elemento seguinte tabela, e o passo 1 é repetido.
  • Se, após a avaliação um dos WHEN condições é satisfeita, a pesquisa é encerrada imediatamente, e o imperative-statement-2 associado a essa condição é executada. O índice aponta para o elemento de tabela que satisfaz a condição. Se NEXT SENTENCE for especificado, o controle passa para a instrução após o período mais próximo.
  • Se o final da tabela for atingido (isto é, o valor do índice incrementado for maior que o número de ocorrência mais alto possível) sem a condição WHEN ser satisfeita, a pesquisa é encerrada.

Se, quando a busca começa, o valor do índice de-nome associado com identificador-1 é maior do que o maior número possível ocorrência, a busca termina imediatamente.

Quando a pesquisa termina, se a frase AT END for especificado, imperative-statement-1 é executado. Se a frase AT END for omitida, o controle passa para a próxima instrução após a instrução SEARCH.

 

Exemplo: pesquisa serial multidimensional

O fragmento de código que se segue mostra uma busca da dimensão interior (Tabela C ) na terceira ocorrência dentro do subordinador tabela (Tabela I ):

     . . .
     Working-storage section.
     1 G.
       2 R occurs 10 indexed by Rindex.
         3 C occurs 10 ascending key X indexed by Cindex.
           4 X pic 99.
     1 Arg pic 99 value 34.
     Procedure division.
     . . . 
* To search within occurrence 3 of table R, set its index to 3 
* To search table C beginning at occurrence 1, set its index to 1
     Set Rindex to 3	
     Set Cindex to 1	
* In the SEARCH statement, specify C without indexes
     Search C
* Specify indexes for both dimensions in the WHEN phrase
       when X(Rindex Cindex) = Arg
       display "Found " X(Rindex Cindex)
     End-search 
. . .

 

VARYING

 

Index-name-1

Uma das seguintes ações aplica-se:

  • Se index-name-1 é um índice para identificador-1 , este índice é usado para a pesquisa. Caso contrário, o primeiro (ou único) nome de índice é usado.
  • Se índice de-nome-1 é um índice para outro elemento de tabela, em seguida, o primeiro (ou único) índice de nome para identificador-1 é utilizado para a busca; o número de ocorrência representado pelo índice de-name-1 é aumentada na mesma proporção como a busca índice de nome e, ao mesmo tempo.

Quando o VARYING index-name-1 frase é omitido, a primeira (ou única) índice de nome para identifier-1 é usado para a pesquisa.

Se a indexação for usada para pesquisar uma tabela sem a expressão INDEXED BY, os resultados corretos serão assegurados somente se a tabela definida com o índice e a tabela definida sem o índice tiverem elementos de tabela do mesmo comprimento e com o mesmo número de ocorrências.

Quando o objeto da frase VARYING é um nome de índice para outro elemento de tabela, uma instrução serial de busca percorre dois elementos de tabela de uma só vez.

 

Identifier-2

Deve ser um item de dados de índice ou um item de elemento elementar. identificador-2 não pode ser um campo de data de janela. identifier-2 não pode ser subscrita pelo primeiro (ou único) índice de nome especificado para identificador-1. Durante a pesquisa, uma das seguintes ações se aplica:

  • Se identifier-2 é um item de dados de índice e, em seguida, sempre que o índice de pesquisa é aumentada, o item de dados de índice especificado é aumentado simultaneamente pela mesma quantidade.
  • Se identifier-2 é um item de dados inteiro, em seguida, sempre que o índice de pesquisa é aumentada, o item de dados especificado é aumentada em simultâneo por um.

 

WHEN (pesquisa em série)

Condição-1

Pode ser qualquer condição descrita em expressões condicionais .

 

Pesquisa binária

>>-SEARCH ALL--identifier-1------------------------------------->
 
>--+-------------------------------------+---------------------->
   '-+----+--END--imperative-statement-1-'
     '-AT-'
 
>--WHEN--+-data-name-1--+----+--+-EQUAL--+----+-+--+-identifier-3------------+-+-->
         |              '-IS-'  |        '-TO-' |  +-literal-1---------------+ |
         |                      '- = -----------'  '-arithmetic-expression-1-' |
         '-condition-name-1----------------------------------------------------'
 
   .----------------------------------------------------------------------------------.
   V                                                                                  |
>----+------------------------------------------------------------------------------+-+-->
     '-AND--+-data-name-2--+----+--+-EQUAL--+----+-+--+-identifier-4------------+-+-'
            |              '-IS-'  |        '-TO-' |  +-literal-2---------------+ |
            |                      '- = -----------'  '-arithmetic-expression-2-' |
            '-condition-name-2----------------------------------------------------'
 
>--+-imperative-statement-2-+--+------------+------------------><
   '-NEXT SENTENCE----------'  '-END-SEARCH-'
 

Quando quiser pesquisar eficientemente todas as ocorrências em uma tabela. A tabela deve previamente ter sido classificados.

 

identifier-1

identifier-1 identifica o quadro que está a ser pesquisada. identifier-1 referências todas as ocorrências dentro dessa tabela.

A descrição entrada de dados para identifier-1 deve conter uma cláusula OCCCURS com a indexado por e chave é frases.

identifier-1 pode fazer referência a um item de dados que está subordinado a um item de dados que contém um OCCURS (ou seja, identifier-1 pode ser uma tabela subordinada dentro de uma tabela multidimensional). Neste caso, a entrada de descrição de dados deve especificar uma expressão INDEXED BY para cada dimensão da tabela.

identifier-1 não deve ser subscritas ou referência modificado.

 

AT END

A condição que existe quando a operação de pesquisa termina sem satisfazer as condições especificadas na frase WHEN.

A instrução SEARCH ALL executa uma pesquisa binária. O índice associado com identifier-1 (o índice de pesquisa) não precisa ser inicializado pelo instruções SET. O índice de pesquisa é variado durante a operação de pesquisa de modo que seu valor seja em nenhum momento menor que o valor do primeiro elemento de tabela, nem nunca maior do que o valor do último elemento de tabela. O índice utilizado é sempre aquele associado ao primeiro nome de índice especificado na cláusula OCCURS.

Antes de usar uma pesquisa binária em uma tabela multidimensional, você deve executar instruções SET para definir o valor do índice para cada dimensão superordenada.

A instrução SEARCH modifica apenas o valor no índice de pesquisa. Portanto, para pesquisar uma tabela bidimensional completa para sete dimensões, você deve executar uma instrução SEARCH para cada dimensão. Nas frases WHEN, você deve especificar os índices para todas as dimensões.

Se a pesquisa termina sem que a condição WHEN estar satisfeito e a frase AT END for especificado, imperative-statement-1 é executado. Se a frase AT END for omitida, o controle passa para a próxima instrução após a instrução SEARCH.

Os resultados de uma operação SEARCH ALL são previsíveis somente quando:

  • Os dados da tabela são ordenados em ASCENDING KEY ou DESCENDING KEY
  • O conteúdo das chaves ASCENDING ou DESCENDING especificadas na cláusula WHEN fornecem uma referência de tabela exclusiva.

 

WHEN (pesquisa binária)

Se uma condição relação é especificado na frase WHEN, a avaliação da relação baseia-se no uso do item de dados referenciado por data-name-1. O argumento de pesquisa é movido para um item de dados temporário com o mesmo uso como data-name-1, e este item de dados temporário é utilizado para as operações de comparar associada à procura.

Se a frase WHEN não puder ser satisfeita para qualquer definição do índice dentro deste intervalo, a procura não terá êxito. Controle é passado para imperative-statement-1 da frase AT END, quando especificado, ou para a próxima instrução após a instrução de pesquisa. Em ambos os casos, a definição final do índice não é previsível.

Se o WHEN pode ser satisfeito, o controle passa para imperative-statement-2, se especificado, ou para a próxima frase executável se a NEXT SENTENCE é especificado. O índice contém o valor indicando a ocorrência que permitiu que as condições WHEN sejam satisfeitas.

Após imperative-statement-2 é executado, o controle passa para o fim da instrução de pesquisa, a menos imperative-statement-2 termina com uma declaração GO TO.

 

condition-name-1 , condição-name-2

Cada nome de condição especificado deve ter apenas um único valor e cada um deve estar associado a um item de dados ASCENDING KEY ou DESCENDING KEY para este elemento de tabela.

 

data-name-1, data-name-2

Deve especificar ASCENDING KEY ou DESCENDING KEY no elemento tabela referenciada pelo identifier-1 e deve ser subscrita pelo primeiro índice de nome associado identifier-1. Cada nome de dados pode ser qualificado.

data-name-1 deve ser um operando válido para comparação com identifier-3literal-1, ou arithmetic-expression-1 de acordo com as regras de comparação.

data-name-2 deve ser um operando válido para comparação com identifier-4literal-2, ou arithmetic-expression-2 de acordo com as regras de comparação.

data-name-1 e data-name-2 não pode fazer referência:

  • Itens de dados de ponto flutuante;
  • Agrupar itens contendo itens de dados de ocorrência variável;
  • Campos de data de data.

 

identifier-3, identifier-4

Não deve ser uma chave ascendente ou descendente item de dados chave para identifier-1 ou um item que é subscrita pelo primeiro índice de nome para identifier-1.

identifier-3 e identifier-4 não pode ser itens de dados definidos com qualquer POINTER, FUNCTION-POINTER, PROCEDURE-POINTER, ou OBJECT REFERENCE.

identifier-3 e identifier-4 não pode ser em janela campos de data.

Se identifier-3 ou literal-1 é de classe nacional, data-name-1 devem ser da classe nacional.

Se identifier-4 ou literal-2 é de classe nacional, data-name-2 deve ser de classe de âmbito nacional.

 

literal-1, literal-2

literal-1 ou literal-2 deve ser um operando válido para a comparação com os data-name-1 ou data-name-2, respectivamente.

 

Expressão aritmética

Pode ser qualquer uma das expressões definidas em expressões aritméticas , com a seguinte restrição: qualquer identificador na aritmética de expressão não deve ser uma chave ascendente ou descendente item de dados chave para identifier-1 ou um item que é subscrita pelo primeiro índice de nome para identifier-1.

Quando ASCENDING KEY ou DESCENDING KEY item de dados é especificado, explícita ou implicitamente, na WHEN, todos os dados-chave nomes anteriores ASCENDING KEY ou DESCENDING KEY para identifier-1 também deve ser especificado.

 

Considerações sobre instruções de pesquisa

Os itens de dados de índice não podem ser usados ​​como subscritos, devido às restrições de referência direta a eles.

Para garantir a correta execução de uma instrução de pesquisa para uma tabela de comprimento variável, certifique-se o objeto do ocorre dependendo cláusula (data-name-1) contém um valor que especifica o comprimento atual da tabela.

O escopo de uma instrução SEARCH pode ser encerrado por qualquer um dos seguintes:

  • Uma END-SEARCH no mesmo nível de aninhamento;
  • Um período de separação;
  • Uma ELSE ou END-IF associada a uma instrução IF anterior.

 

AT END e WHEN

Após imperative-statement-1 ou imperative-statement-2 é executado, o controle passa para o fim da instrução de pesquisa, a menos imperative-statement-1 ou imperative-statement-2 termina com uma declaração GO TO.

A função da AT END é a mesma para uma pesquisa serial e uma pesquisa binária.

 

NEXT SENTENCE

NEXT SENTENCE transfere o controle para a primeira instrução após o período de separação mais próximo.

Quando NEXT SENTENCE é especificado com END-SEARCH, controle não passa para a instrução após o END-SEARCH. Em vez disso, controle passa para a instrução após o período seguinte mais próximo.

Para o Formato-2 declaração SEARCH ALL, nem imperative-statement-2 nem NEXT SENTENCE é necessária. Sem eles, a instrução SEARCH define o índice para o valor na tabela que corresponde a condição.

A função NEXT SENTENCE é a mesma para uma pesquisa em série e uma pesquisa binária.

 

END-SEARCH

Esse terminador de escopo explícito delimita o escopo da instrução SEARCH. END-SEARCH permite que uma instrução de pesquisa condicional seja aninhada em outra instrução condicional.

A função de END-SEARCH é a mesma para uma pesquisa em série e uma pesquisa binária