O tema Binary Search não é bem agilidade, mas esse temido comando do ABAP pode nos fazer perder muito tempo. Eu já perdi muito tempo tentando resolver um deifeito que era decorrente apenas de uma clausula dessas. Para tentar exemplificar o que é o Binary Search, vou explicar rapidamente a estrutura de seleção de dados de banco de dados do SAP.
A grande maioria dos dados são selecionados e armazenados em tabelas temporárias. Essas tabelas funcionam como um vetor ou um cursor em outras linguagens de programação. Para selecionar uma linha em especial, usa-se um comando chamado read com as chaves do registro da tabela temporária que deseja retornar. Simples, não? Mas o SAP tem outra peculiaridade, ele é dividido em camadas (serviço de banco de dados e serviço de aplicação). Dizem, que o serviço de aplicação é muito forte, por isso, seria mais vantagioso, por exemplo, selecionar várias linhas de uma tabela de banco de dados e depois filtrá-la através de comandos como read e etc.
Porém, com um volume enorme de linhas, mesmo um read na camada de aplicação acaba tornando-se demorado, então-se tem a clausula Binary Search que pode ser adicionada em um comando read. O que ela faz? A leitura não é feita mais sequencialmente, e sim quebrando a tabela pela metade, tornando o acesso mais rápido. Mas temos que ter os registros em ordem, pois caso contrário, pode-se ter um retorno errado. Exemplo: Temos a tabela temporária abaixo com apenas 1 campo na ordem conforme está:
01 |
02 |
07 |
05 |
06 |
08 |
09 |
10 |
Se usarmos um read com a clausula Binary Search, nessa tabela e procurármos pelo valor 07, o retorno será que o mesmo não existe. Mas porquê? A tabela será dividida em 2, primeiramente, será testado se o valor procurado é menor ou maior que esse valor. Imaginamos que o meio seja o número 05. Então, saberíamos que o valor estaria no subconjunto ente 06 e 10. Faríamos um segundo acesso a tabela e saberíamos que estaria no subconjunto entre 06 e 08 e tendo apenas esses elementos o 07 não existe no conjunto.
Isso tudo acontece, por que a clausula Binary Search tem como pré-requisito que a tabela interna deva estar ordenada, e quando ela não está, o resultado pode ser diferente do que o esperado. Ahh bom, simples então: vou apenas ordenar a tabela interna e está tudo resolvido.
Concordo plenamente com essa afirmação, o problema é ter certeza que ninguem nunca mais irá alterar a ordem desa tabela e sempre ficará na ordem esperada pelo read.
Para apimentar mais ainda tudo isso, algumas consultorias da SAP não tem muito critério técnico na contratação de desenvolvedores de software. Então imagine, alguém que não tenha um conhecimento técnico de desenvolvimento usando uma clausula dessa? É certo que algum dia irá falhar.
Quanto tempo já perdemos com Binary Search!
Eu mesmo não entendia porque as vezes um read table nao trazia resultados, sendo que os dados estavam na tabela interna.
Acabei retirando vários BINARY SEARCH dos meu códigos por não saber que primeiro precisava ordenar a tabela com o campo específico.
Abraços…
Que bom que conseguimos te ajudar, Haroldo