COBOL - Comando SEARCH - Pesquisa serial - 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 - Pesquisa serial
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:



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:
      *-----------------------------------------------------------------
       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 'SP'   TO WS-SIGLA-UF                                   
           SET IX-TAB TO 1                                              
           SEARCH 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.