Comando SORT | ABAP Warrior

Comando SORT

Comando SORT
É muito comum ordenar uma tabela para que a disposição dos dados fique de acordo com a necessidade. E também é muito importante saber alguns detalhes de como é possível ordenar uma tabela, e conhecer as variações que podem ser aplicadas.

Dentro do ABAP isso é feito através do comando SORT. E ele é essencial para que outros comandos também funcionem. Esta é mais uma postagem da série COMANDOS.







O que é um SORT ?


SORT é um comando da plataforma ABAP usado para ordenar os dados em uma tabela lógica. A ordenação é importante para organizar os dados antes de exibí-los em um relatório, ou para deixar a tabela apta para uma pesquisa ou leitura direta.

Também é usado em conjunto com o comando DELETE ADJACENT DUPLICATES e é essencial para o perfeito funcionamento deste último citado. Outra aplicação em conjunto é com o comando READ TABLE com o parâmetro BINARY SEARCH.

Como funciona o SORT ?


O comando SORT tem algumas variações de uso bem interessantes. Algumas eu nem conhecia, passei a conhecer quando comecei a estudar sobre o tema antes de escrever esta postagem.

A forma mais simples de uso é ordenar uma tabela sem especificar colunas. Se nenhuma coluna for especificada, a ordenação será feita por todas as colunas obedecendo a ordem das colunas, ou seja, da primeira até a última. A não ser que a tabela tenha sido declara com alguma chave, neste caso a ordenação será feita pela chave.

Outro detalhe importante é a questão da direção da ordenação, para dizer se é para ordenar de forma crescente ou decrescente. Para ordenar de forma crescente usar o argumento ASCENDING e de forma descrescente usar o argumento DESCENDING. Se nada for informado quanto à direção, automaticamente será usada a forma crescente.

Um exemplo da forma mais simples ficaria assim:
SORT t_dados.

No exemplo acima a tabela T_DADOS será ordenada no sentido crescente por todas as colunas da primeira até a última. Se a tabela T_DADOS for declarada com alguma chave, a ordenação será feita pelos campos da chave.

Colunas e sentidos de ordenação


Para ordenar especificando uma ou mais colunas, basta usar o complemento BY e em seguida informar as colunas. Se for duas ou mais separe por espaços.

Um exemplo especificando duas colunas ficar assim:
SORT t_dados BY data valor.

No exemplo acima a tabela T_DADOS será ordenada apenas pelas colunas DATA e VALOR. As duas no sentido crescente, pelo fato de não ter o sentido informado.

O exemplo abaixo tem o mesmo efeito do exemplo acima, porém deixando explícito qual o sentido da ordenação:
SORT t_dados BY data ASCENDING valor ASCENDING.

No exemplo acima a tabela T_DADOS será ordenada apenas pelas colunas DATA e VALOR, as duas no sentido crescente.

Quando o sentido da ordenação for o mesmo para todas as colunas, também é possível deixar explícito o sentido antes do BY:
SORT t_dados ASCENDING BY data valor.

No exemplo acima a tabela T_DADOS será ordenada apenas pelas colunas DATA e VALOR, as duas no sentido crescente.

Para que fique claro, usando as três formas abaixo, o resultado será o mesmo. Na primeira deixando o sentido implícito, ou seja, sem informar. Na segunda informando o sentido coluna por coluna. E na terceira informando o sentido para todas as colunas de uma vez.
SORT t_dados BY data valor.
SORT t_dados BY data ASCENDING valor ASCENDING.
SORT t_dados ASCENDING BY data valor.

No caso da ordenação decrescente é necessário informar obrigatoriamente o sentido, ou seja, de forma explícita. Deve ser aplicado como na segunda e terceira formas mostradas acima, com o sentido crescente.

Informando coluna por coluna:
SORT t_dados BY data DESCENDING valor DESCENDING.

Informando para todas as colunas de uma vez:
SORT t_dados DESCENDING BY data valor.

Nos dois exemplos acima a tabela T_DADOS será ordenada apenas pelas colunas DATA e VALOR, as duas no sentido decrescente.

Para que fique claro, usando as duas formas abaixo, o resultado será o mesmo. Na primeira informando o sentido coluna por coluna. E na segunda informando o sentido para todas as colunas de uma vez.
SORT t_dados BY data DESCENDING valor DESCENDING.
SORTt_dados DESCENDING BY data valor.

Outro detalhe importante quando usar o sentido de ordenação antes do BY é que ele será aplicado em todas as colunas. Desta forma, se em alguma coluna for necessário ordenar em outro sentido, o mesmo deverá estar explicito à direta da coluna:
SORT t_dados DESCENDING BY data cidade ASCENDING valor.

No exemplo acima a tabela T_DADOS será ordenada apenas pelas colunas DATA, CIDADE e VALOR, sendo primeiro por DATA decrescente, depois por CIDADE crescente e por último por VALOR decrescente.

Ordenação de textos


Um parâmetro muito interessante é o uso do AS TEXT. Ele pode ser usado de forma geral para toda tabela ou especificando em uma ou mais colunas. O uso deste parâmetro faz com que as colunas com tipos alfanuméricos sejam classificadas desconsiderando acentos. Sem este parâmetro, os acentos serão considerados e irão para o fim da ordenação.

Um ótimo cenário de exemplo é usando as vogais. Imagine uma tabela contendo quatro linhas, e que uma das colunas com tipo alfanumérico esteja preenchida com os dados "E", "I", "É" e "A". Repare que uma das vogais está com a acento agudo.

Se ordenar sem o parâmetro AS TEXT a vogal com acento ficará por último.

    A    E    I    É

Se ordenar com o parâmetro AS TEXT a vogal com acento será considerada como se não tivesse o acento, ficando logo depois da mesma vogal sem acento.

    A    E    É    I

Informando o parâmetro em coluna:
SORT t_dados BY cidade AS TEXT.

Informando o parâmetro para todas as colunas da tabela:
SORT t_dados AS TEXT.

No primeiro exemplo acima a tabela T_DADOS será ordenada na forma de texto pela colunas CIDADE.
Já no segundo exemplo a mesma tabela será ordenada na forma de texto por todas as colunas. Este caso apenas funcionará se as colunas alfanuméricas forem as primeiras da tabela.


Ordenação estável


Este parâmetro eu não conhecia e tem uma funcionalidade muito útil. É o parâmetro STABLE. Já o tinha visto algumas vezes na ajuda e nunca tinha entendido até colocar em prática durante o estudo desta postagem.

Quando uma tabela é ordenada por uma coluna que possui dados que se repetem, o que acontece com as outras colunas que não foram informadas no comando? As informações dessas colunas, como não foram informadas na ordenação, serão ordenadas de forma aleatória. Isso quer dizer que a cada novo comando de ordenação esses dados poderão ficar em posições diferentes.

O uso do parâmetro STABLE é para que essa situação não aconteça. Apenas na primeira ordenação os dados das colunas não informadas serão de forma aleatória. Em cada novo comando de ordenação com STABLE os dados serão preservados na mesma posição.

Vamos ver um cenário prático para ajudar a entender. Imagine a tabela T_DADOS com as seguintes colunas e registros:

Tabela T_DADOS para comando SORT

Repare que o cliente "Anderson" se repete em duas linhas com produtos diferentes. Se for aplicado um comando SORT pela colunas CIDADE e CLIENTE, os dados da coluna PRODUTO seriam ordenados de forma aleatória, pois esta coluna não foi especificada no comando. A cada novo comando os produtos "geladeira" e "fogão" podem acabar trocando de lugar. Exemplo do comando:
SORT t_dados BY cidade cliente.

Usando o parâmetro STABLE os produtos "geladeira" e "fogão" não irão ficar trocando de lugar, preservando sempre os dados. Exemplo do comando:
SORT t_dados STABLE BY cidade cliente.

Esse comando é bem funcional quando usado na apresentação de relatórios. Ele garante que os dados não ficarão diferentes ao reprocessar ou atualizar as informações da tela.

Ordenação dinâmica


O que deixei por último não é o menos importante dos parâmetros. Este é um parâmetro interessante para deixar a ordenação de forma dinâmica. Consiste em informar uma tabela contendo as colunas que deverão ser ordenadas. Supondo que a tabela de colunas seja T_COLUNAS, basicamente o comando fica assim:
SORT t_dados BY (t_colunas).

Detalhe para os parenteses. Só assim o comando entende que é uma tabela de colunas. Sem eles o programa nem será ativado.

Para declarar a tabela use o tipo standard ABAP_SORTORDER_TAB que existe exatamente pra isso. Ele possui uma estrutura bem simples, com apenas três colunas. A primeira é a coluna NAME, onde deve ser preenchido o nome da coluna para ordenação. A segunda é a coluna DESCENDING, onde deve ser preenchido com um "X" se o sentido for decrescente. Se o sentido for crescente não preencha nada. E a terceira é a coluna ASTEXT, onde deve ser preenchido com "X" se precisar ser aplicada a ordenação por texto.


E você, já precisou usar alguma das variações? Tem alguma experiência sobre este comando que gostaria de compartilhar? Tem alguma dúvida?
Um grande abraço e até a próxima.
2016-03-31T20:01:00-03:00 2017-04-09T15:39:40Z
Nenhum comentário:
Related Posts Plugin for WordPress, Blogger...