Ordenar tabela temporária FWMBrowse

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.)
compartilhar
  • 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
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do TOTVS DevForum!

0 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags advpl fwmbrowse ou faça a sua própria pergunta.