Como ordenar uma tabela decrescente (com campo data) utilizando FWTemporaryTable

Hoje vou mostrar como criar um índice decrescente de campo data utilizando FWTemporaryTable em AdvPL.

A função Descend era uma mão na roda para criar índices decrescentes com campos do tipo Data em tabelas temporárias, porém ela não funciona com o novo tipo de criação de tabela com FWTemporaryTable.

Na página oficial no TDN sobre a função Descend – https://tdn.totvs.com/pages/viewpage.action?pageId=23889338 -, tem uma observação dizendo que ela foi descontinuada. Mas então como resolver?

Obs.: Antes de começarmos, se você pode gerar a massa de dados via consulta SQL, basta usar o ORDER BY com o comando DESC, mas se não tiver como fazer isso, aí pode prosseguir com a leitura abaixo.

Existe uma forma, mas para isso, será necessário criar um índice com uma coluna numérica, que iremos chamar de XXSEQUEN. Ai quando formos popular ela, iremos gravar a diferença de dias entre a data atual, e a data de registro.

Então supondo que eu estou buscando a informação do campo E5_DATA, considerando que o dia de hoje seja 31/05/2020, eu teria o seguinte cenário:

  • E5_DATA = 20200531, XXSEQUEN será 0
  • E5_DATA = 20200521, XXSEQUEN será 10
  • E5_DATA = 20200511, XXSEQUEN será 20
  • E5_DATA = 20200501, XXSEQUEN será 30

Pronto, temos a lógica de como deve funcionar o XXSEQUEN, agora vamos colocar na prática, sendo que o primeiro passo é criar ele na estrutura de campos da temporária, e criar um índice com ele:

//Adicionando o campo XXSEQUEN na estrutura da temporaria
aAdd(aStru, {"XXSEQUEN", "N", 18, 0})
               
//Cria a Temporaria, e cria o indice 1 com o campo de sequencia
oTempTable := FWTemporaryTable():New(cAliasTmp)
oTempTable:SetFields(aStru)
oTempTable:AddIndex("1", {"XXSEQUEN"} )
 
//Por último, no carregamento da temporária, gravamos a informação necessária com o DateDiffDay
 
//Criando o registro
RecLock(cAliasTmp, .T.)
    //...
    (cAliasTmp)->XXSEQUEN := DateDiffDay(Date(), QRYSE5->E5_DATA)
(cAliasTmp)->(MsUnlock())

Agora quando formos ordenar a tabela, ela irá por esse campo numérico, e ele terá a ordem de datas “decrescente” sem usar a função Descend.

Update 13/08/2021:

O grande Thiago Andrrade ( LinkedIn ), mandou uma dica bem interessante, é possível usar a função OrdDescend (documentação do TDN), junto com uma estrutura temporária, ficaria então da seguinte forma:

//Cria a tabela temporária
oTempTable:= FWTemporaryTable():New(cAliasTmp)
oTempTable:SetFields( aCampos )
oTempTable:AddIndex("1", {"CODIGO"} )
oTempTable:Create()

//Agora quando for usar o setorder, basta usar a função OrdDescend em seguida
(cAliasTmp)->(DbSetOrder(nOrder))
OrdDescend(nOrder, cValToChar(nOrder), .T.)
(cAliasTmp)->(DbGoTop())

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan Atilio (Daniel Atilio)
Especialista em Engenharia de Software pela FIB. Entusiasta de soluções Open Source. E blogueiro nas horas vagas.

Deixe uma resposta