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.
Opa Dan, tudo joia? Queria saber se tem como adicionar uma lista de opções em cada campo da FWTemporaryTable. Pelo configurador daria de setar isso em cada campo da tabela que queres, se souber agradeço. Tenha um ótimo dia.
Bom dia Gabriel, tudo joia graças a Deus e você?
Você queria fazer um combobox de opções em um FWBrowse? Se sim, veja se esse link consegue te ajudar: https://terminaldeinformacao.com/2023/09/27/como-fazer-um-combo-em-um-fwbrwcolumn/
Tenha um ótimo e abençoado fim de semana.
Um forte abraço.