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.

Veja tambem:



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:
    1. Cada parte da instrução condicional só pode consistir em um teste relacional que envolva uma condição de igualdade.

    2. 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)


Diferenças entre SUBSCRITOS e ÍNDICES
SUBSCRITOS ÍNDICES
Representa uma ocorrência de um array ou elemento de tabela Representa um deslocamento a partir do primeiro endereço no array  ou tabela
Definido em uma entrada separada da WORKING-STORAGE  SECTION. Definido junto com a cláusula OCCURS paa o array ou tabela.
Para mudar o valor de SUB, um subscrito, use uma instrução PERFORM .......... VARYING ou qualquer uma das seguintes  instruções:

MOVE 1 TO SUB
ADD 1 TO SUB
SUBTRACT 1 FROM SUB
Para mudar o valor de X1, um índice, use uma instrução PERFORM .......... VARYING ou qualquer uma das seguintes  instruções:

SET X1 TO 1                Mover 1 para o índice X1
SET X1 UP BY 1            Somar 1 ao índice X1
SET X1 DOWN BY 1      Subtrair 1 to índice X1


Diferenças entre SEARCH e SEARCH ALL
SEARCH SEARCH ALL
SEARCH também é chamado de linear ou sequencial. SEARCH ALL também é chamado de binário.
As entradas não precisam estar em qualquer ordem. As entradas da tabela devem estar em alguma ordem.
É necessário inicializar e incrementar um índice. Apenas a inicialização é exigida de um índice. O incremento é feito automaticamente pelo sistema.
A instrução SET é obrigatória para inicializar o índice antes de seu uso. A instrução SET não é necessária.
Múltiplas condições quando 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.
Ele pode ser usado para matrizes unidimensionais e multidimensionais. Ele é usado apenas para uma matriz dimensional única.
Os dados dentro de uma matriz não precisam estar em ordem de classificação. Os dados devem estar em ordem de classificação.


Um exemplo:
       IDENTIFICATION DIVISION.                                         
       PROGRAM-ID.      SEARCHALL.                                       
       AUTHOR.          DORNELLES CARLOS ALBERTO.                       

       ENVIRONMENT DIVISION.                                            
       CONFIGURATION SECTION.                                           
       SPECIAL-NAMES.                                                   
                        DECIMAL-POINT IS COMMA.                         

       DATA DIVISION.                                                   

       WORKING-STORAGE SECTION.                                         
                                                                        
        01  WS-TABELA-PRODUTOS.                                           
           05 TAB-PRODUTOS.                                              
              10  FILLER       PIC X(021) VALUE "01ARROZ              ".
              10  FILLER       PIC X(021) VALUE "02FEIJAO             ".
              10  FILLER       PIC X(021) VALUE "03SAL                ".
              10  FILLER       PIC X(021) VALUE "04MACARRAO           ".
              10  FILLER       PIC X(021) VALUE "05AZEITE             ".
              10  FILLER       PIC X(021) VALUE "06CARNE              ".
              10  FILLER       PIC X(021) VALUE "07BISCOITO           ".
              10  FILLER       PIC X(021) VALUE "08SABAO              ".
              10  FILLER       PIC X(021) VALUE "09SABONETE           ".
              10  FILLER       PIC X(021) VALUE "10PAPEL HIGIENICO    ".
              10  FILLER       PIC X(021) VALUE "11AGUA SANITARIA     ".
              10  FILLER       PIC X(021) VALUE "12ALFACE             ".
              10  FILLER       PIC X(021) VALUE "13CHEIRO VERDE       ".
              10  FILLER       PIC X(021) VALUE "14REPOLHO            ".
              10  FILLER       PIC X(021) VALUE "15CAFE               ".
              10  FILLER       PIC X(021) VALUE "16NESCAFE            ".
              10  FILLER       PIC X(021) VALUE "17PAO                ".
              10  FILLER       PIC X(021) VALUE "18MEXERICA           ".
              10  FILLER       PIC X(021) VALUE "19LARANJA            ".
              10  FILLER       PIC X(021) VALUE "20ABACATE            ".
              10  FILLER       PIC X(021) VALUE "21MAMAO PAPAIA       ".
              10  FILLER       PIC X(021) VALUE "22MAMAO FORMOSA      ".
              10  FILLER       PIC X(021) VALUE "23MELAO AMARELO      ".
              10  FILLER       PIC X(021) VALUE "24SABAO EM PO        ".
              10  FILLER       PIC X(021) VALUE "25SHAMPOO            ".
              10  FILLER       PIC X(021) VALUE "26CREME RINSE        ".
              10  FILLER       PIC X(021) VALUE "27GEL DENTAL         ".
           05 TAB-PRODUTOS-R    REDEFINES  TAB-PRODUTOS.                  
              07  WS-CAJUGUDU  OCCURS 27 TIMES                          
                               ASCENDING KEY COD-PRODUTO                  
                               INDEXED BY IX-TAB.                       
                  10  COD-PRODUTO   PIC 9(002).                              
                  10  NOME-PRODUTO  PIC X(019).  
                            
       01  WS-AUXILIARES.                                               
           05 NAO-ACHOU-NADA        PIC 9(003) VALUE ZEROES.       
           05 WS-COD-PRODUTO        PIC 9(002) VALUE ZEROES.       
           05 VARIAVEL              PIC X(019) VALUE SPACES. 
           05 WS-X                  PIC 9(002) VALUE ZEROES. 

       PROCEDURE DIVISION. 

           MOVE ZEROES TO NAO-ACHOU-NADA                                
           MOVE 23 TO WS-COD-PRODUTO
           
           SEARCH ALL WS-CAJUGUDU                                        
                  AT END                                                
                     MOVE 1 TO NAO-ACHOU-NADA    
                WHEN COD-PRODUTO (IX-TAB) EQUAL WS-COD-PRODUTO 
                     MOVE NOME-PRODUTO (IX-TAB) TO VARIAVEL                           
           END-SEARCH                                                   

           IF  NAO-ACHOU-NADA EQUAL 0
               DISPLAY "ACHOU - Nome do produto: " VARIAVEL 
           ELSE
               DISPLAY "NAO ACHOU" 
           END-IF. 

	   STOP RUN.

ACHOU - Nome do produto: MELAO AMARELO

           MOVE 29 TO WS-COD-PRODUTO

NAO ACHOU