Como Congelar uma coluna na FWBrowse

No artigo de hoje vamos demonstrar em como congelar uma coluna usando a classe FWBrowse.

Alguns alunos, vira e mexe, acabam me perguntando em como fixar (congelar) uma coluna usando a classe FWBrowse.

O que acontece pessoal, é que a FWBrowse, logo após o Activate, ela tem um atributo chamado “oBrowse”, que esse cara herda os métodos e atributos da TGrid.

Pensando nisso, um dos atributos disponíveis é o nFreeze, onde você passa o número da coluna que quer congelar.

 

Então a lógica do nosso exemplo é:

  1. Criar normalmente nossa grid
  2. Após o método Activate, definimos o atributo nFreeze, apontando para ser a coluna de número 1 (nesse caso, código do produto)
  3. Por mudar o nFreeze, ele muda a altura padrão da linha, então em seguida usamos o método SetRowHeight

 

Abaixo um exemplo de como ficou nossa tela com a primeira coluna congelada:

Exemplo de coluna congelada usando FWBrowse

 

E abaixo o código fonte criado do exemplo acima:

//Bibliotecas
#Include "Totvs.ch"
#Include "TopConn.ch"
    
/*/{Protheus.doc} User Function zBrwFreeze
Função que demonstra como congelar uma coluna em uma grid
@type  Function
@author Atilio
@since  31/10/2023
@version version
/*/
    
User Function zBrwFreeze()
    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 := "TMPSBM"
    //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, {"B1_COD",    "C", TamSX3("B1_COD")[1],     0})
    aAdd(aFields, {"B1_DESC",   "C", TamSX3("B1_DESC")[1],    0})
    aAdd(aFields, {"B1_TIPO",   "C", TamSX3("B1_TIPO")[1],    0})
    aAdd(aFields, {"B1_UM",     "C", TamSX3("B1_UM")[1],      0})
    aAdd(aFields, {"B1_GRUPO",  "C", TamSX3("B1_GRUPO")[1],   0})
    aAdd(aFields, {"BM_DESC",   "C", TamSX3("BM_DESC")[1],    0})
    aAdd(aFields, {"B1_LOCPAD", "C", TamSX3("B1_LOCPAD")[1],  0})
    aAdd(aFields, {"B2_QATU",   "N", TamSX3("B2_QATU")[1],    TamSX3("B2_QATU")[2]})
    aAdd(aFields, {"SAID_PREV", "N", TamSX3("B2_RESERVA")[1], TamSX3("B2_RESERVA")[2]})
    aAdd(aFields, {"ENTR_PREV", "N", TamSX3("B2_SALPEDI")[1], TamSX3("B2_SALPEDI")[2]})
        
    //Define as colunas usadas, adiciona indice e cria a temporaria no banco
    oTempTable:SetFields( aFields )
    oTempTable:AddIndex("1", {"B1_COD"} )
    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 grupos")
    
    //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*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:lHeaderClick := .F.
            oGetGrid:SetColumns(aColunas)
            oGetGrid:SetOwner(oPanGrid)
            oGetGrid:Activate()

            //Após o Activate, o atributo oBrowse é carregado herdando da TGrid
            oGetGrid:oBrowse:nFreeze := 1
            oGetGrid:oBrowse:SetRowHeight(30)
    ACTIVATE MsDialog oDlgGrp CENTERED
    
    //Deleta a temporaria
    oTempTable:Delete()
    
    RestArea(aArea)
Return
    
Static Function fMontaHead()
    Local nAtual
    Local aHeadAux := {}
    
    //Adicionando colunas
    //[1] - Campo da Temporaria
    //[2] - Titulo
    //[3] - Tipo
    //[4] - Tamanho
    //[5] - Decimais
    //[6] - Máscara
    aAdd(aHeadAux, {"B1_COD",    "Código",           "C", TamSX3("B1_COD")[1],     0,                       ""})
    aAdd(aHeadAux, {"B1_DESC",   "Descrição",        "C", TamSX3("B1_DESC")[1],    0,                       ""})
    aAdd(aHeadAux, {"B1_TIPO",   "Tipo",             "C", TamSX3("B1_TIPO")[1],    0,                       ""})
    aAdd(aHeadAux, {"B1_UM",     "Unid.Med.",        "C", TamSX3("B1_UM")[1],      0,                       ""})
    aAdd(aHeadAux, {"B1_GRUPO",  "Grupo",            "C", TamSX3("B1_GRUPO")[1],   0,                       ""})
    aAdd(aHeadAux, {"BM_DESC",   "Descr.Grupo",      "C", TamSX3("BM_DESC")[1],    0,                       ""})
    aAdd(aHeadAux, {"B1_LOCPAD", "Armazém Padr.",    "C", TamSX3("B1_LOCPAD")[1],  0,                       ""})
    aAdd(aHeadAux, {"B2_QATU",   "Saldo Atual",      "N", TamSX3("B2_QATU")[1],    TamSX3("B2_QATU")[2],    PesqPict("SB2", "B2_QATU")})
    aAdd(aHeadAux, {"SAID_PREV", "Saída Prevista",   "N", TamSX3("B2_RESERVA")[1], TamSX3("B2_RESERVA")[2], PesqPict("SB2", "B2_RESERVA")})
    aAdd(aHeadAux, {"ENTR_PREV", "Entrada Prevista", "N", TamSX3("B2_SALPEDI")[1], TamSX3("B2_SALPEDI")[2], PesqPict("SB2", "B2_SALPEDI")})
    
    //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])
  
        aAdd(aColunas, oColumn)
    Next
Return
    
Static Function fMontDados(oSay)
    Local aArea   := GetArea()
    Local nAtual  := 0
    Local nTotal  := 0
    Local cQryAux := ""
    
    //Busca informação de todos os produtos
    cQryAux := " SELECT " + CRLF
    cQryAux += " 	B1_COD, " + CRLF
    cQryAux += " 	B1_DESC, " + CRLF
    cQryAux += " 	B1_TIPO, " + CRLF
    cQryAux += " 	B1_UM, " + CRLF
    cQryAux += " 	B1_GRUPO, " + CRLF
    cQryAux += " 	BM_DESC, " + CRLF
    cQryAux += " 	B1_LOCPAD, " + CRLF
    cQryAux += " 	B2_QATU, " + CRLF
    cQryAux += " 	B2_RESERVA + B2_QPEDVEN AS SAID_PREV, " + CRLF
    cQryAux += " 	B2_SALPEDI AS ENTR_PREV " + CRLF
    cQryAux += " FROM " + CRLF
    cQryAux += " 	" + RetSQLName("SB1") + " SB1 " + CRLF
    cQryAux += " 	INNER JOIN " + RetSQLName("SBM") + " SBM ON ( " + CRLF
    cQryAux += " 		BM_FILIAL = '" + FWxFilial("SBM") + "' " + CRLF
    cQryAux += " 		AND BM_GRUPO = B1_GRUPO " + CRLF
    cQryAux += " 		AND SBM.D_E_L_E_T_ = ' ' " + CRLF
    cQryAux += " 	) " + CRLF
    cQryAux += " 	INNER JOIN " + RetSQLName("SB2") + " SB2 ON ( " + CRLF
    cQryAux += " 		B2_FILIAL = '" + FWxFilial("SB2") + "' " + CRLF
    cQryAux += " 		AND B2_COD = B1_COD " + CRLF
    cQryAux += " 		AND B2_LOCAL = B1_LOCPAD " + CRLF
    cQryAux += " 		AND SB2.D_E_L_E_T_ = ' ' " + CRLF
    cQryAux += " 	) " + CRLF
    cQryAux += " WHERE " + CRLF
    cQryAux += " 	B1_FILIAL = '" + FWxFilial("SB1") + "' " + CRLF
    cQryAux += " 	AND SB1.D_E_L_E_T_ = ' ' " + CRLF
    TCQuery cQryAux New Alias "QRYPROD"

    //Percorre os dados da query
    While ! QRYPROD->(EoF())
        //Muda a mensagem na regua
        nAtual++
        oSay:SetText("Adicionando registro " + cValToChar(nAtual) + " de " + cValToChar(nTotal) + "...")
  
        //Insere os dados na temporária
        RecLock(cAliasTab, .T.)
            (cAliasTab)->B1_COD    := QRYPROD->B1_COD
            (cAliasTab)->B1_DESC   := QRYPROD->B1_DESC
            (cAliasTab)->B1_TIPO   := QRYPROD->B1_TIPO
            (cAliasTab)->B1_UM     := QRYPROD->B1_UM
            (cAliasTab)->B1_GRUPO  := QRYPROD->B1_GRUPO
            (cAliasTab)->BM_DESC   := QRYPROD->BM_DESC
            (cAliasTab)->B1_LOCPAD := QRYPROD->B1_LOCPAD
            (cAliasTab)->B2_QATU   := QRYPROD->B2_QATU
            (cAliasTab)->SAID_PREV := QRYPROD->SAID_PREV
            (cAliasTab)->ENTR_PREV := QRYPROD->ENTR_PREV
        (cAliasTab)->(MsUnlock())
    
        QRYPROD->(DbSkip())
    EndDo
    QRYPROD->(DbCloseArea())
    
    RestArea(aArea)
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