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.