Article image
Vagner Bellacosa
Vagner Bellacosa26/11/2021 12:53
Compartilhe

Descubra SEARCH e SEARCH ALL : Comandos COBOL

  • #Estrutura de dados
  • #Informática Básica
  • #Arquitetura de Sistemas

Cobol e o fabuloso comando SEARCH

Salve jovem padawan, vamos falar sobre velharias do tiozão, vou apresentar um comando COBOL, único, grande amigo da performance e gerando grandes economias de ciclos de CPU, ao trazer uma tabela externa para o interior do programa.

Imagine uma tabela secundaria com alguns parâmetros, um programador preguiçoso codificaria um joiner, gerando consumo de SQL indevidamente, pois imagine se a tabela pai possuir 10.000 registros, teríamos que acessar esta tabela 10.000 vezes num SUBSELECT com opens e closes de cursor; ou sobrecarregando o SGBD com SELECT e Joiner para exibir tuplas de dados multi-tabelas.

O maior inimigo da performance e otimização são as querys malfeitas, os programadores que especificaram a linguagem COBOL, criaram um comando que varre um array através de chaves.

Visando evitar problemas com consumo excessivo de Base de Dados, recomendo o uso de Tabelas Dinâmicas.

O que são Tabelas Dinâmicas?

Muito usada em programação, nada mais é que o uso de arrays, para criarem tabelas unidimensional ou multidimensional, carregadas em tempo de execução, visando economizar paradas e passagens de ponteiro para rotinas externas ao programa, possui alguns malefícios, devendo ser analisado caso a caso, para ver qual a melhor estratégia.

Conheça o comando SEARCH

É um comando que permite a navegação por tabelas de modo incremental, semelhante ao PERFORM UNTIL e pesquisa por chave. Otimizado para auxiliar o processamento dinâmico, criando tabelas em tempo de execução.

image

Sua sintaxe básica é

        SEARCH indetificador1                                          
               AT END                                               
                  MOVE valor TO contador                          
             WHEN ocorrência-chave (índice) EQUAL chave-de-pesquisa               
                  MOVE ocorrência-item TO variável                          
        END-SEARCH                                                  

A seguir deixo um código exemplo, que permite pesquisar uma tabela através da Sigla da Unidade da Federação retornando o nome do Estado.

Sua sintaxe é simples e intuitiva, permitindo um fácil entendimento, depuração e inclusão de novos membros, podendo ser criada dinamicamente através de leitura a arquivo sequencial, acesso simples ao banco de dados, ou uma maneira menos performática em hard coded.

   *-----------------------------------------------------------------
    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 instruções necessárias
        END-IF. 

 

SEARCH VERSUS SEARCH ALL

Conheça as vantagens e desvantagens entre cada comando

 

SEARCH

  • Pesquisa realizada de forma linear/sequencial
  • Leitura dos dados é lenta
  • Os itens do array/tabela dinâmica nao precisam estar em qualquer ordem
  • Uma ou mais condições WHEN podem ser codificadas 
  • O campo chave nao precisa estar ordenado 
  • inicialização do index é necessária 
  • pode ser usado na expressão condicional os operadores = > < >= <= not=
  • funciona tanto para matrizes unidimensionais como para multidimensionais

  SEARCH ALL

  • Pesquisa realizada de forma binaria
  • Leitura realizada de forma binaria 
  • As entradas da tabela devem estar ordenadas
  • Somente uma condição WHEN pode ser codificada
  • é necessário que os dados do campo chave estejam ordenados
  • incrementarão do index é feita automaticamente pelo sistema
  • Somente o operador de igualdade pode ser usado
  • é usado apenas para uma matriz unidimensional

 

O que é código "Hard Coded"?

 

É uma técnica não recomendada, trata-se de um mau costume de deixar parâmetros importantes, fixos dentro do código do programa, obrigando em caso de mudanças a edição, compilação e guarda em produção de um programa.

 

Uma técnica arriscada, pois pode gerar bugs ocultos e abends em programas saudáveis, desta forma, o mais aconselhável é criar um Função dentro de um sub-programa ou num arquivo sequencial.

 

Tabelas dinâmicas

 

É uma tabela com dados carregados em tempo de execução, permitindo a busca de parâmetros atualizados em tempo real e evitando o uso de hard coded e ajudando a evitar o uso de joiner em SQL, que em alguns casos, geram paradas e sobrecargas ao sistema desnecessariamente.

Uma boa pratica, mas deve usar com moderação, com o risco de sobrecarregar o servidor, esgotando a memória da aplicação.

 

Conclusão

Jovem padawan, aprendemos “en passant” o uso de tabelas dinâmicas e sua consulta através do comando SEARCH e SERCH ALL. Foi falado sobre os problemas de performance, uso excessivo de memoria e problemas derivado do hard coded.

 

Concluímos que não existe solução perfeita, mas sim ótima, de acordo com o problema, podemos usar pontualmente técnicas não recomendadas, mas necessárias naquela solução. Por isso antes de transformar-se em evangelista de uma causa, analise o problema, converse com outros analistas e veja qual a melhor resolução.

 

Atualmente as instalações estão reduzindo o pessoal técnico, recorrendo a consultorias chave na mao, que tem objetivos de entregar o produto ao menor custo e tempo, geralmente não preocupando-se com longo prazo, deixando os problemas a surgir para a pobre equipe de mantimento.

  

Espero ter ajudado ate o próximo artigo.

image

image Mais momento jabá, visita ao Instituto Geográfico da UNICAMP com um belo museu repleto de fosseis e curiosidades, visite meu vídeo e veja para onde fui desta vez: https://www.youtube.com/watch?v=9yvJ-4-bfMw

Bom curso a todos.

image https://www.linkedin.com/in/vagnerbellacosa/

image https://github.com/VagnerBellacosa/

Pode me dar uma ajudinha no YouTube?

image https://www.youtube.com/user/vagnerbellacosa

Compartilhe
Comentários (1)

LS

Lucas Soares - 02/08/2024 11:40

Artigo muito útil para os coboleiros de plantão!!! Parabéns.