Dantes o ABAP gostava de inverter datas

Todos os dias o ABAP me revela coisas novos. Às vezes coisas que mais valia eu nem saber que existem. Como esta.
A tabela T056P tem um campo com uma data. Fazendo um SELECT a esta tabela filtrando pela data não conseguia obter nada de jeito. Mas o código parecia correcto. Na SE16N descobri que o intervalo de datas também não funcionava conforme esperado: só apresentava resultados quando a data final era colocada no LOW e a inicial no HIGH. Bizarro.
Até que reparei que o elemento de dados se chamava DATAB_INV e que usa o domínio DATUM_INV. Foi ao olhar para o domínio que se fez luz. INV neste caso quer dizer INVertido.
Usei a transacção SE17 (por ser tão antiga que não usa as rotinas de conversão) para ver o conteúdo real da T056P e descobri que as datas são tipo 79949176.
Depois de investigar um bocado descobri que este formato de datas invertido é (ou foi…) standard e que até há uns comandos ABAP para o tratar:
CONVERT INVERTED-DATE dat1 INTO DATE dat2.
CONVERT DATE dat2 INTO INVERTED-DATE dat1.
Comandos esses que são tão obsoletos que nem podem ser usados em ABAP OO.
Só que eu estou a usar ABAP OO e calhou-me na rifa ter de lidar com este tipo de datas. E agora?
E agora, como a SE16N consegue mostrar estas datas correctamente decidi copiar o código das rotinas de conversão e pronto:
METHOD TO_INVERTED_DATE.
DATA: chdat(8) TYPE c,
houtput(8) TYPE n.
r_inverted_date = i_date.
MOVE i_date TO chdat.
houtput = '99999999' - chdat. "Zwischenspeichern in houtput, damit
r_inverted_date = houtput.
ENDMETHOD.
Funcionou.
Espero nunca mais me cruzar com uma data destas.
O Abapinho saúda-vos.
1 de Março de 2017 às 12:11
De pateta não tem nada, aliás era uma técnica bastante astuta, e só quem trabalhou em tempos em que disco, memória e processadores eram muito limitados e em que bases de dados (sejam elas relacionais ou não) eram uma miragem, percebe o porquê de “datas complementadas a noves”.
1 de Março de 2017 às 12:19
Olá Ricardo, obrigado, depois de ler o que escreveste entendo que realmente era uma boa técnica e tens toda a razão, não é pateta. Mas para quem nunca se tinha cruzado com isto foi um choque porque é bastante obscuro. Ainda bem que já não são necessárias! Vou tirar de lá o “pateta” ;)
4 de Maio de 2017 às 16:39
Olá Nuno,
Uma dica, não precisas da SE17, na SE16N em “Extras” -> “Change Settings” podes activar a opção “Output without Conversion Exit”.
Parabéns pelo excelente trabalho que tens desenvolvido neste blog.
5 de Maio de 2017 às 18:42
Olá Rui, obrigado pela dica. É bom saber disso!
Obrigado :)