Dicas ABAP

Published on December 9th, 2011 | by Mauricio Cruz

9

Criando/Alterando tabela ordenadas (ou “manha” do BINARY SEARCH)

Nos primórdios da minha vida como ABAPer, uma sábia mestra ABAPai (pra rimar com JEDI, sacou? 🙄  ) me ensinou uma pequena tática para que você consiga alterar ou criar tabelas ordenadas por uma chave qualquer. Recentemente, num curso de performance que ministrei, fiquei surpreso com o fato de que quase ninguém havia usado esse esquema em seus códigos malucos.

Portanto, resolvi explicar e compatilhar essa dica aqui no ABAPZombie. Você pode usar para tabelas internas do tipo STANDARD.

Então vamos lá! 😀

A idéia é você se aproveitar do algoritmo da busca binária para descobrir o sy-tabix de onde o registro deveria estar.

Vamos supor que você tenha uma tabela com os dados:

num
1
2
3
5

Precisamos colocar o número 4 em seu devido lugar!

Se você der um READ TABLE BINARY SEARCH na tabela acima, procurando pelo campo NUM = 4, o sistema vai retornar um SY-SUBRC = 4, porém o SY-TABIX será preenchido com 4, que é o lugar onde o registro de número 4 deveria estar.

Daí é só inserir o danado ali para não quebrar a ordenação!

Vejam o exemplo:

No exemplo acima, você pode montar a tabela T_DESORD com qualquer ordenação, que a tabela T_ORD vai sempre sair certinha. Pode testar 😉

Bom, eu aprendi isso quando era um júnior, e acho que por isso que eu sempre achei que “todo mundo soubesse”. Enfim, pelo menos com esse post espero que mais pessoas saibam! 🙂

Abraços à todos aqueles que curte ordenações!

Share on FacebookTweet about this on TwitterShare on LinkedInShare on Google+Email this to someonePrint this page

Tags:


About the Author

é pasteleiro há alguns anos e criou o ABAPZombie junto com o Mauro em 2010. Gosta de filosofar sobre fundamentos básicos da programação e assuntos polêmicos. Músicas estranhas, artes marciais e games indies são legais. Zumbis não. Converse comigo no twitter e conheça o meu livro de ABAP!



9 Responses to Criando/Alterando tabela ordenadas (ou “manha” do BINARY SEARCH)

  1. Rafael says:

    Bela dica Maurício, essa eu confesso que não sabia, enfim, vivendo e aprendendo.

    Obrigado mais uma vez.

    • Normal! Como disse no post, eu meio que “cresci” tendo essa lógica bem clara na minha cabeça, por isso que me espantei tanto quando algumas pessoas me disseram que não sabiam.

      Mas normal, ninguém tem como saber tudo 🙂

      Abraços!

  2. Mauricio,

    Parabéns pelo post.
    Excelente dica para quem está começando e também para quem já trabalha com ABAP, que resolvia esse problema de uma outra forma e não conhecia essa possibilidade (como eu! rs).

    Obrigado,

    Norberto Silva

  3. Custodio says:

    Boa dica para standard tables, porem desnecessario para SORTED TABLES. Para esse tipo de tabela o comando INSERT faz o trabalho por voce, nao precisa especificar o indice:

    INSERT wa_val INTO TABLE t_ord.

    Abraco

  4. Complementando meu comentario anterior, fiz uns testes aqui para SORTED TABLE com 10, 1.000 e 10.000 registros, e usar INSERT INTO TABLE se mostrou aproximadamente 25% mais veloz.
    Abraco,
    Custodio

    • Olá Custódio, tudo bem?

      Obrigado pela comentário!

      Realmente faz mais sentido usar o INSERT wa INTO TABLE itab, viajei e já estou arrumando. Mesmo para o caso onde o registro já exista (itab com UNIQUE KEY), o sistema retorna o SY-SUBRC = 4 e nos indica que o registro já foi inserido.

      Já ajustei o código. Aliás, vou fazer um post dedicado à tabelas SORTED depois dessa 🙂

      Abraços!

  5. Alexandre says:

    Pessoal,

    Estou com uma dúvida, preciso fazer : read TABLE it_files_in_dir with key name cp ‘*.xml’ into it_files

    O problema é que não sei como fazer um ‘Like’ com read table

  6. Alexandre says:

    Fala Mauricio, obrigado pela dica. Bem que você podia ministrar esse curso de performance de forma online hein, para que pudéssemos ter a oportunidade de participar. Amadureça essa ideia ai…. 🙂

Leave a Reply

Your email address will not be published. Required fields are marked *

Back to Top ↑