Como forçar um refresh de uma FWBrowse | Ti Responde 0100

No vídeo de hoje, vamos demonstrar em como dar um Refresh em uma FWBrowse após apagar todos os dados.

A dúvida de hoje, nos perguntaram, como poderíamos apagar os dados de uma grid, depois popular novamente e acionar um Refresh.

 

Pensando nisso, montamos esse exemplo, onde vamos demonstrar em como apagar os dados através de um Update, criar novamente com RecLock e acionar o Refresh da grid.

 

Segue abaixo o vídeo exemplificando:

 

E abaixo o código fonte desenvolvido:

//Bibliotecas
#Include "Totvs.ch"
    
/*/{Protheus.doc} User Function zVid0100
Função que demonstra em como forçar um refresh em uma grid
@type  Function
@author Atilio
@since  18/03/2024
@version version
/*/
    
User Function zVid0100()
    Local aArea := GetArea()
    //Fontes
    Local cFontUti    := "Tahoma"
    Local oFontAno    := TFont():New(cFontUti,,-38)
    Local oFontSub    := TFont():New(cFontUti,,-20)
    Local oFontSubN   := TFont():New(cFontUti,,-20,,.T.)
    Local oFontBtn    := TFont():New(cFontUti,,-14)
    //Janela e componentes
    Private oDlgGrp
    Private oPanGrid
    Private oGetGrid
    Private aColunas := {}
    Private cAliasTab := GetNextAlias()
    Private oTempTable
    //Tamanho da janela
    Private    aTamanho := MsAdvSize()
    Private    nJanLarg := aTamanho[5]
    Private    nJanAltu := aTamanho[6]
    
    //Cria a temporária
    oTempTable := FWTemporaryTable():New(cAliasTab)
        
    //Adiciona no array das colunas as que serão incluidas (Nome do Campo, Tipo do Campo, Tamanho, Decimais)
    aFields := {}
    aAdd(aFields, {"XXCODIGO",  "C",   6,                    0})
    aAdd(aFields, {"XXDESCRI",  "C",  30,                    0})
    aAdd(aFields, {"XXQUANTI",  "N",   9,                    2})
    aAdd(aFields, {"XXEMISSA",  "D",   8,                    0})
    aAdd(aFields, {"XXOBSERV",  "C", 100,                    0})
        
    //Define as colunas usadas, adiciona indice e cria a temporaria no banco
    oTempTable:SetFields( aFields )
    oTempTable:AddIndex("1", {"XXCODIGO"} )
    oTempTable:Create()
    
    //Monta o cabecalho
    fMontaHead()
    
    //Montando os dados, eles devem ser montados antes de ser criado o FWBrowse
    FWMsgRun(, {|oSay| fMontDados(oSay) }, "Processando", "Buscando informações")
    
    //Criando a janela
    DEFINE MSDIALOG oDlgGrp TITLE "Dados" FROM 000, 000  TO nJanAltu, nJanLarg COLORS 0, 16777215 PIXEL
        //Labels gerais
        @ 004, 003 SAY "FAT"                     SIZE 200, 030 FONT oFontAno  OF oDlgGrp COLORS RGB(149,179,215) PIXEL
        @ 004, 050 SAY "Listagem Genérica de"    SIZE 200, 030 FONT oFontSub  OF oDlgGrp COLORS RGB(031,073,125) PIXEL
        @ 014, 050 SAY "Dados Temporários"       SIZE 200, 030 FONT oFontSubN OF oDlgGrp COLORS RGB(031,073,125) PIXEL
    
        //Botões
        @ 006, (nJanLarg/2-001)-(0052*02) BUTTON oBtnRefr  PROMPT "Refresh"       SIZE 050, 018 OF oDlgGrp ACTION (fAtualiza())   FONT oFontBtn PIXEL
        @ 006, (nJanLarg/2-001)-(0052*01) BUTTON oBtnFech  PROMPT "Fechar"        SIZE 050, 018 OF oDlgGrp ACTION (oDlgGrp:End())   FONT oFontBtn PIXEL
    
        //Dados
        @ 024, 003 GROUP oGrpDad TO (nJanAltu/2-003), (nJanLarg/2-003) PROMPT "Browse" OF oDlgGrp COLOR 0, 16777215 PIXEL
        oGrpDad:oFont := oFontBtn
            oPanGrid := tPanel():New(033, 006, "", oDlgGrp, , , , RGB(000,000,000), RGB(254,254,254), (nJanLarg/2 - 13),     (nJanAltu/2 - 45))
            oGetGrid := FWBrowse():New()
            oGetGrid:DisableFilter()
            oGetGrid:DisableConfig()
            oGetGrid:DisableReport()
            oGetGrid:DisableSeek()
            oGetGrid:DisableSaveConfig()
            oGetGrid:SetFontBrowse(oFontBtn)
            oGetGrid:SetAlias(cAliasTab)
            oGetGrid:SetDataTable()
            oGetGrid:SetEditCell(.T., {|| .T.}) 
            oGetGrid:lHeaderClick := .F.
            oGetGrid:AddLegend(cAliasTab + "->XXQUANTI == 0", "YELLOW", "Quantidade zerada")
            oGetGrid:AddLegend(cAliasTab + "->XXQUANTI <  0", "RED",    "Quantidade menor que zero")
            oGetGrid:AddLegend(cAliasTab + "->XXQUANTI >  0", "GREEN",  "Quantidade maior que zero")
            oGetGrid:SetColumns(aColunas)
            oGetGrid:SetOwner(oPanGrid)
            oGetGrid:Activate()
    ACTIVATE MsDialog oDlgGrp CENTERED
    
    //Deleta a temporaria
    oTempTable:Delete()
    
    RestArea(aArea)
Return
    
Static Function fMontaHead()
    Local nAtual
    Local aHeadAux := {}
    
    //Adicionando colunas
    //[01] - Campo da Temporaria
    //[02] - Titulo
    //[03] - Tipo
    //[04] - Tamanho
    //[05] - Decimais
    //[06] - Máscara
    //[07] - Editável? .T. = sim, .F. = não
    //[08] - Código da Consulta Padrão
    //[09] - Bloco de Código usado na Validação (ex.: {|| fSuaValid()} )
    //[10] - Alinhamento sendo 0=Centralizado (textos);1=Esquerda; 2=Direita
    aAdd(aHeadAux, {"XXCODIGO",  "Código",        "C",   6,                  0, "",              .F., '',    Nil,                               Nil})
    aAdd(aHeadAux, {"XXDESCRI",  "Descricao",     "C",  30,                  0, "",              .F., '',    Nil,                               Nil})
    aAdd(aHeadAux, {"XXQUANTI",  "Quantidade",    "N",   9,                  2, "@E 999,999.99", .T., '',    Nil,                               Nil})
    aAdd(aHeadAux, {"XXEMISSA",  "Emissão",       "D",   8,                  0, "",              .T., '',    Nil,                               Nil})
    aAdd(aHeadAux, {"XXOBSERV",  "Observação",    "C", 100,                  0, "",              .T., '',    Nil,                               Nil})
    
    //Percorrendo e criando as colunas
    For nAtual := 1 To Len(aHeadAux)
        oColumn := FWBrwColumn():New()
        oColumn:SetData(&("{|| " + cAliasTab + "->" + aHeadAux[nAtual][1] +"}"))
        oColumn:SetTitle(aHeadAux[nAtual][2])
        oColumn:SetType(aHeadAux[nAtual][3])
        oColumn:SetSize(aHeadAux[nAtual][4])
        oColumn:SetDecimal(aHeadAux[nAtual][5])
        oColumn:SetPicture(aHeadAux[nAtual][6])
  
        //Se for ser possível ter o duplo clique
        If aHeadAux[nAtual][7]
            oColumn:SetEdit(.T.)
            oColumn:SetReadVar(cAliasTab + "->" + aHeadAux[nAtual][1]) //Tem que ter o alias na esquerda para poder usar o F3

            //Se tiver Consulta Padrão
        	If ! Empty(aHeadAux[nAtual][8])
        		oColumn:xF3 := aHeadAux[nAtual][8]
        	EndIf
        	
        	//Se tiver Validação
        	If ! Empty(aHeadAux[nAtual][9])
        		oColumn:SetValid(aHeadAux[nAtual][9])
        	EndIf
        EndIf

        //Define o alinhamento
        If ! Empty(aHeadAux[nAtual][10])
            oColumn:nAlign := aHeadAux[nAtual][10]
        EndIf
  
        aAdd(aColunas, oColumn)
    Next
Return
    
Static Function fMontDados(oSay)
    Local aArea   := GetArea()
    Local nAtual  := 0
    Local nTotal  := 50
    Local dDtRef  := Date()
    Local cCodAtu := "000000"
    Local cDescri := ""
    Local nQuanti := 0
    Local dEmissa := sToD("")
    
    //Faz um laço de repetição
    For nAtual := 1 To nTotal
        //Muda a mensagem na regua
        oSay:SetText("Adicionando registro " + cValToChar(nAtual) + " de " + cValToChar(nTotal) + "...")
  
        //Pega as variáveis que vão ser gravadas
        cCodAtu := Soma1(cCodAtu)
        cDescri := "[" + Time() + "] Teste - " + cCodAtu
        nQuanti := Randomize(-5, 5)
        dEmissa := DaySub(dDtRef, nAtual)
  
        //Insere os dados na temporária
        RecLock(cAliasTab, .T.)
            (cAliasTab)->XXCODIGO  := cCodAtu
            (cAliasTab)->XXDESCRI  := cDescri
            (cAliasTab)->XXQUANTI  := nQuanti
            (cAliasTab)->XXEMISSA  := dEmissa
            (cAliasTab)->XXOBSERV  := ""
        (cAliasTab)->(MsUnlock())
    
    Next
    
    RestArea(aArea)
Return


Static Function fAtualiza()
    //Apaga tudo da temporária
    //   Baixar a zExecQry nesse link - https://terminaldeinformacao.com/2021/04/21/como-fazer-um-update-via-advpl/
    cQryUpd := " UPDATE "  + CRLF
    cQryUpd += "    " + oTempTable:GetRealName() + " " + CRLF
    cQryUpd += " SET " + CRLF
    cQryUpd += "    D_E_L_E_T_ = '*', " + CRLF
    cQryUpd += "    R_E_C_D_E_L_ = R_E_C_N_O_ " + CRLF
    u_zExecQry(cQryUpd, .T.)

    //Montando novamente os dados
    FWMsgRun(, {|oSay| fMontDados(oSay) }, "Processando", "Buscando informações")

    //Força a atualização da grid
    oGetGrid:Refresh(.T.)

    /*
    Forma bem antiga que funcionava em LIBs desatualizadas, forçando um GoBottom e depois GoTop
    oBrowseTmp:GoBottom(.T.)
    oBrowseTmp:Refresh(.T.)
    oBrowseTmp:GoTop(.T.)
    oBrowseTmp:Refresh(.T.)
    */
Return

Bom pessoal, por hoje é só.

 

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação