COBOL - Comando SEARCH ALL - Pesquisa binária - www.cadcobol.com.br


Volta a página anterior

Volta ao Menu Principal


Desenvolvido por DORNELLES Carlos Alberto - Analista de Sistemas - Brasília DF. - cad_cobol@hotmail.com

SEARCH ALL- Pesquisa binária
A instrução SEARCH ALL é usada para realizar uma pesquisa binária.

Quando você usar SEARCH ALL para executar uma procura binária, não é preciso setar o índice antes do mesmo iniciar.
O índice usado sempre é o associado com o primeiro index-name na cláusula OCCURS, e varia durante execução para maximizar a eficiência de pesquisa.

Para usar a declaração SEARCH ALL, sua tabela deve estar ordenada pelas KEY(s) especificadas dentro da cláusula OCCURS.
Você pode especificar qualquer KEY dentro da condição WHEN, mas tudo que precede os data-names na opção KEY também deve ser testado.
O teste deve ser uma condição EQUAL TO, e o data-name KEY ou tenha que ser o assunto da condição ou o nome de uma variável condicional com que o nome a ser testado.
O condição WHEN também pode ser uma condição de combinação, formada de uma simple condição com AND como o único conetivo lógico.
A KEY e seu objeto de comparação devem ser compatíveis, como declarado na relação regras de teste.

O seu formato geral é:

identifier-1 (binary search)
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 com as frases INDEXED BY e KEY IS.

O identifier-1 pode fazer referência a um item de dados subordinado a um item de dados que contém uma cláusula OCCURS (ou seja, o identifier-1 pode ser uma tabela subordinada em uma tabela multidimensional).
Nesse caso, a entrada de descrição de dados deve 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 as condições especificadas na frase WHEN.

A instrução SEARCH ALL executa uma pesquisa binária.
O índice associado ao identifier-1 (o índice de pesquisa) não precisa ser inicializado pelas instruções SET.
O índice de pesquisa é variado durante a operação de pesquisa para que seu valor não seja menor que o valor do primeiro elemento da tabela, nem seja maior que o valor do último elemento da tabela.
O índice usado é sempre aquele associado ao primeiro nome do í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 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.

Se a procura terminar sem que a condição WHEN seja atendida e a frase AT END seja especificada, a imperative-statement-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.

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

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

WHEN phrase (binary search)

Se uma condição de relação for especificada na frase WHEN, a avaliação da relação será baseada no USAGE 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 à busca.

Se a frase WHEN não puder ser satisfeita para qualquer configuração do índice dentro desse intervalo, a pesquisa não será bem-sucedida.
O controle é passado para a imperative-statement-1 da frase AT END, quando especificada, ou para a próxima instrução após a instrução SEARCH.
Em ambos os casos, a configuração final do índice não é previsível.

Se a frase WHEN puder ser satisfeita, o controle passará para a imperative-statement-2 , se especificada, ou para a próxima sentença executável, se a frase NEXT SENTENCE for especificada.
O índice contém o valor que indica a ocorrência que permitiu que as condições WHEN fossem atendidas.

Depois que a imperative-statement-2 é executada, o controle passa para o final da instrução SEARCH, a menos que a imperative-statement-2 termine com uma instrução GO TO.

condition-name-1, condition-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 da tabela.

data-name-1, data-name-2
Deve especificar um item de dados ASCENDING KEY ou DESCENDING KEY no elemento de tabela referenciado pelo identifier-1 e deve ser subscrito pelo primeiro nome de índice associado aidentifier-1.
Cada nome de dados pode ser qualificado.
data-name-1 deve ser um operando válido para comparação com o identifier-3 , literal-1 ou aritmetic-expression-1 acordo com as regras de comparação.

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

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

  • Itens de dados de ponto flutuante
  • Agrupe itens que contêm itens de dados de ocorrência variável
  • Campos de data com janelas
identifier-3, identifier-4

Não deve ser um item de dados ASCENDING KEY ou DESCENDING KEY para o identifier-1 ou um item que esteja inscrito pelo primeiro nome de índice para o identifier-1.
identifier-3 e identifier-4 não podem ser itens de dados definidos com qualquer um dos usos POINTER, FUNCTION-POINTER, PROCEDURE-POINTER ou OBJECT REFERENCE.

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

Se o identifier-3 ou literal-1 for da classe national, o data-name-1 deverá ser da classe national.

Se o identifier-4 ou literal-2 for da classe national, o data-name-2 deverá ser da classe national.

literal-1, literal-2

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

arithmetic-expression

Pode ser qualquer uma das expressões definidas em Arithmetic expressions, com a seguinte restrição:
Qualquer identificador em expressão aritmética não deve ser um item de dados ASCENDING KEY ou DESCENDING KEY para o identifier-1 ou um item que esteja inscrito pelo primeiro nome de índice para identifier-1.

Pode ser qualquer uma das expressões definidas em Expressões aritméticas, com a seguinte restrição:
Qualquer identificador em expressão aritmética não deve ser um item de dados ASCENDING KEY ou DESCENDING KEY para o identifier-1 ou um item que esteja inscrito pelo primeiro nome de índice para identifier-1.

Considerações sobre a instrução de pesquisa

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

Para garantir a execução correta de uma instrução SEARCH para uma tabela de tamanho variável, verifique se o objeto da cláusula OCCURS DEPENDING ON (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 frase END-SEARCH no mesmo nível de aninhamento
  • Um período separador
  • Uma frase ELSE ou END-IF associada a uma instrução IF anterior
AT END and WHEN phrases
Depois que a imperative-statement-1 ou a imperative-statement-2 é executada, o controle passa para o final da instrução SEARCH, a menos que a imperative-statement-1 ou a imperative-statement-2 terminem com uma instrução GO TO.

A função da frase 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 separador mais próximo.

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

Para a instrução SEARCH ALL do formato 2, nem a imperative-statement-2 nem a NEXT SENTENCE são necessárias.
Sem eles, a instrução SEARCH define o índice para o valor na tabela que corresponde à condição.

A função da frase NEXT SENTENCE é a mesma para uma pesquisa serial e uma pesquisa binária.

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

Para obter mais informações, consulte Delimited scope statements.

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



Diferenças entra as instruções SEARCH e SEARCH ALL

SEARCH SEARCH ALL
Realiza uma pesquisa serial Realiza uma pesquisa binária
As entradas da tabela não precisam estar em qualquer ordem As entradas da tabela devem estar ordenadas pelo argumento da tabela ou mesmo pela função da tabela.
O campo que estiver na ordem é especificado em uma cláusula ASCENDING OU DESCENDING KEY como parte de uma entrada OCCURS
Exige uma instrução SET antes da instrução SEARCH para especificar o ponto inicial da pesquisa Não precisa de uma instrução SET antes da instrução SEARCH ALL
Inicialização e incremento de um índice é necessário. Somente a inicialização é requerida de um índice.
Incrementar é feito automaticamente pelo sistema.
Múltiplo quando as condições podem ser codificadas. Apenas uma condição WHEN pode ser codificada.
Vários operadores aritméticos, como =,>, <,> <=,> =, NOT = podem ser usados. Apenas = operador é permitido.
O acesso é lento. O acesso é mais rápido.
Pode ser usado para arrays unidimensionais e multidimensionais. É usado apenas para matriz dimensional única.


Limitações da instrução SEARCH ALL
 1. A condição após a palavra WHEN só pode fazer um teste de igualdade:
     Válido:    WHEN SIGLA-UF (IX-TAB) EQUAL WS-SIGLA-UF
     Inválido: WHEN SIGLA-UF (IX-TAB) < WS-SIGLA-UF

 2. Se a condição após a palavra WHEN for uma instrição condicional composta:
     a. Cada parte da instrução condicional só pode consistir em um teste relacional que envolva uma condição de igualdade.
     b. A única condição composta permitida é a que utiliza palavras AND e não OR.
         Válido:    WHEN VALOR1 (INDEX) = VLR1
                         AND     VALOR2 (INDEX) = VLR2

         Inválido: WHEN VALOR1 (INDEX) = VLR1
                         OR       VALOR2 (INDEX) = VLR2


 3. Só pode ser usada uma cláusula WHEN com uma instrução SEARCH ALL

 4. A opção VARYING não pode ser usada com a instrução SEARCH ALL

 5. O item OCCURS e seu índice, que define o argumento da tabela, devem aparecer à esquerda do sinal de igualdade.
     Válido:     WHEN VALOR1 (INDEX) = VLR1
      Inválido: WHEN VLR1 = VALOR1 (INDEX)


Um exemplo:

      *-----------------------------------------------------------------
       WORKING-STORAGE SECTION.                                         
      *-----------------------------------------------------------------
                                                                        
       01  WS-TABELA-ESTADOS.                                           
           05 TAB-NOME-UF.                                              
              10  FILLER       PIC X(021) VALUE "ACACRE               ".
              10  FILLER       PIC X(021) VALUE "ALALAGOAS            ".
              10  FILLER       PIC X(021) VALUE "AMAMAZONAS           ".
              10  FILLER       PIC X(021) VALUE "APAMAPA              ".
              10  FILLER       PIC X(021) VALUE "BABAHIA              ".
              10  FILLER       PIC X(021) VALUE "CECEARA              ".
              10  FILLER       PIC X(021) VALUE "DFDISTRITO FEDERAL   ".
              10  FILLER       PIC X(021) VALUE "ESESPIRITO SANTO     ".
              10  FILLER       PIC X(021) VALUE "GOGOIAS              ".
              10  FILLER       PIC X(021) VALUE "MAMARANHAO           ".
              10  FILLER       PIC X(021) VALUE "MGMINAS GERAIS       ".
              10  FILLER       PIC X(021) VALUE "MSMATO GROSSO DO SUL ".
              10  FILLER       PIC X(021) VALUE "MTMATO GROSSO        ".
              10  FILLER       PIC X(021) VALUE "PAPARA               ".
              10  FILLER       PIC X(021) VALUE "PBPARAIBA            ".
              10  FILLER       PIC X(021) VALUE "PEPERNAMBUCO         ".
              10  FILLER       PIC X(021) VALUE "PIPIAUI              ".
              10  FILLER       PIC X(021) VALUE "PRPARANA             ".
              10  FILLER       PIC X(021) VALUE "RJRIO DE JANEIRO     ".
              10  FILLER       PIC X(021) VALUE "RNRIO GRANDE DO NORTE".
              10  FILLER       PIC X(021) VALUE "RORONDONIA           ".
              10  FILLER       PIC X(021) VALUE "RRRORAIAMA           ".
              10  FILLER       PIC X(021) VALUE "RSRIO GRANDE DO SUL  ".
              10  FILLER       PIC X(021) VALUE "SCSANTA CATARINA     ".
              10  FILLER       PIC X(021) VALUE "SESERGIPE            ".
              10  FILLER       PIC X(021) VALUE "SPSAO PAULO          ".
              10  FILLER       PIC X(021) VALUE "TOTOCANTINS          ".
           05 TAB-NOME-UF-R    REDEFINES  TAB-NOME-UF.                  
              07  WS-CAJUGUDU  OCCURS 27 TIMES                          
                               DESCENDING KEY SIGLA-UF                  
                               INDEXED BY IX-TAB.                       
                  10  SIGLA-UF PIC X(002).                              
                  10  NOME-UF  PIC X(019).                              

       01  WS-AUXILIARES.                                               
           05 NAO-ACHOU-NADA             PIC 9(003) VALUE ZEROES.       
           05 WS-SIGLA-UF                PIC X(002) VALUE SPACES.       

      *-----------------------------------------------------------------
       PROCEDURE DIVISION.                                              
      *-----------------------------------------------------------------
                                                                        
           MOVE ZEROES TO NAO-ACHOU-NADA                                
           MOVE SIGLA-DA-UF TO WS-SIGLA-UF                                   
           SEARCH ALL WS-CAJUGUDU                                       
                  AT END                                                
                     MOVE 1 TO NAO-ACHOU-NADA                           
                WHEN SIGLA-UF (IX-TAB) EQUAL WS-SIGLA-UF                
                     MOVE NOME-UF (IX-TAB) TO VARIAVEL                           
           END-SEARCH                                                   

           IF  NAO-ACHOU-NADA EQUAL 1
               codifique as instrições necessarias
           END-IF.