Bom dia! Estou tentando implementar uma funcionalidade de ordenar a temporária(após o carregamento sem precisar realizar nova consulta), de acordo com o click no header da tabela. Por exemplo se o click for na coluna "Empresa" que a temporária seja ordenada por esta coluna em ordem ascendente, e descendente se for clicado novamente, e assim por diante. Ainda não tive sucesso.
#include 'totvs.ch'
#include 'parmType.ch'
#include 'fwbrowse.ch'
#include 'fwmbrowse.ch'
User Function COFIN()
Local aColunas := {}
Private cAlias := GetNextAlias()
Private oTempTable:= FWTemporaryTable():New( cAlias )
Private aCampos := {}
Private aCamposBRW:= {}
Private aIndexBRW := {}
aadd( aCampos, {"E1_FILIAL" , "C",030, 0 })
aadd( aCampos, {"E1_NUM" , "C",010, 0 })
aAdd( aCamposBRW, { "Empresa" , "E1_FILIAL" , "C",030, 0, "@!" })
aAdd( aCamposBRW, { "Fatura" , "E1_NUM" , "C",010, 0, "@!" })
oTemptable:SetFields( aCampos )
oTempTable:Create()
U_GETPFINREC()
oBrowse:= FWMBrowse():New()
oBrowse:SetAlias( cAlias )
oBrowse:SetTemporary(.T.)
oBrowse:SetFields( aCamposBRW )
oBrowse:SetColumns(aColunas)
oBrowse:DisableDetails()
oBrowse:SetDescription("Consulta")
oBrowse:Activate()
Return Nil
User function GETPFIN()
Local aPerguntas := {}
Local dDataInicio := sTod("")
Local dDataFim := sTod("")
Private aParam := {}
cDataAtual :=Dtos(DATE())
cTime := TIME()
cHora := SUBSTR(cTime, 1, 2)
cMinutos := SUBSTR(cTime, 4, 2)
aadd(aPerguntas, { 1, "Dt. inicial" , dDataInicio , "", '.T.', "", ".T.", 50, .T.})
aadd(aPerguntas, { 1, "Dt. Final" , dDataFim , "", '.T.', "", ".T.", 50, .T.})
// Tela de Parametros
if !ParamBox( aPerguntas,"Parâmetros",aParam,{||.T.},,,,,,FunName(),.T.,.T.,.T.)
MsgAlert("Cancelado pelo Operador!")
Return(.f.)
else
dDataInicio := DTOS(mv_par01)
dDataFim := DTOS(mv_par02)
dbSelectArea(cAlias)
dbGoTop()
while (cAlias)->(!Eof())
Reclock(cAlias,.f.)
(cAlias)->( dbDelete() )
MsUnlock()
Commit
(cAlias)->( DbSkip() )
endDo
EndIf
Processa({|| U_MPCONFIREC(dDataInicio,dDataFim)}, "Filtrando...")
Return
user Function MPCONFIN(dDataInicio,dDataFim)
Local nTotal := 0
Local nAtual :=0
Local cQuery :=''
Private aParam := {}
cDataAtual :=Dtos(DATE())
cTime := TIME()
cHora := SUBSTR(cTime, 1, 2)
cMinutos := SUBSTR(cTime, 4, 2)
cHoraAtual:=cHora+cMinutos
cQuery +=" select DISTINCT " +CRLF
cQuery +=" E1_FILIAL, E1_NUM " +CRLF
cQuery +=" from SE1010 SE1 " +CRLF
cQuery +=" where SE1.D_E_L_E_T_ = '' " +CRLF
cQuery +=" and E1_VENCREA >= '" +dDataInicio + "' and E1_VENCREA <= '" +dDataFim + "' "+CRLF
oExec := FwExecStatement():New()
OExec:SetQuery(cQuery)
cAliasQRY := oExec:OpenAlias()
dbSelectArea(cAliasQRY)
Count To nTotal
ProcRegua(nTotal)
dbGoTop()
while (cAliasQRY)->(!Eof())
dbSelectArea(cAlias)
Reclock(cAlias, .t.)
(cAlias)->E1_FILIAL := (cAliasQRY)->E1_FILIAL
(cAlias)->E1_NUM := cvaltochar((cAliasQRY)->E1_NUM)
MsUnlock()
Commit
//Incrementa a mensagem na régua
nAtual++
IncProc("Analisando registro " + cValToChar(nAtual) + " de " + cValToChar(nTotal) + "...")
dbSelectArea(cAliasQRY)
(cAliasQRY)->(DBSKIP())
endDo
(cAlias)->(dbGoTop())
cTimeFim:= TIME()
FWAlertSuccess("Sucesso "+cValtoChar(nTotal)+" registros", "Concluído ")
Return(.T.)
Se voce criar um indice na temptable, o browse se encarrega de fazer isso por padrão, mas ele ordena somente em ordem ascendente, exemplo: oTemptable:addIndex("001",{"E1_FILIAL","E1_NUM"})
— Leandro.Santos 17 de Jun de 2024