Destacar célula numa tela com FWBrowse | Ti Responde 0238

No vídeo de hoje, vamos demonstrar em como destacar uma coluna em FWBrowse quando o valor for negativo ou positivo.

A dúvida de hoje, nos perguntaram, como poderíamos destacar ou realçar uma célula em FWBrowse, dependendo se o valor fosse positivo ou negativo.

 

Pensando nisso, montamos um exemplo, onde vai ser demonstrado em como adicionar uma legenda, e depois reordenar ela na tela para dar um destaque ficando ao lado da célula.

 

Segue abaixo o vídeo exemplificando:

E abaixo o código fonte desenvolvido:

//Bibliotecas
#Include "tlpp-core.th"
#Include "TOTVS.ch"

//Declaração da namespace
Namespace custom.terminal.youtube
    
/*/{Protheus.doc} User Function video0238
Exemplo de realce de célula caso um valor esteja negativo ou positivo
@type Function
@author Atilio
@since 23/01/2026
@example custom.terminal.youtube.u_video0238()
/*/

User Function video0238()
    Local aArea             := FWGetArea()                  As Array
    Local lOk               := .F.                          As Logical
    Local cLogMessage       := ""                           As Character
    Local nColumns          := 0                            As Numeric
    //Fontes
    Local cFont             := "Tahoma"                     As Character
    Local oFontBigger       := TFont():New(cFont,,-38)      As Object
    Local oFontTitle        := TFont():New(cFont,,-20)      As Object
    Local oFontSubtitle     := TFont():New(cFont,,-20,,.T.) As Object
    Local oFontButtons      := TFont():New(cFont,,-14)      As Object
    //Janela e componentes
    Private oTestDialog                                     As Object
    Private oTempTable                                      As Object
    Private oPanelBrowse                                    As Object
    Private oTempBrowse                                     As Object
    Private aGridColumns    := {}                           As Array
    Private cTempAlias      := GetNextAlias()               As Character
    //Tamanho da janela
    Private aDialogSize     := MsAdvSize()                  As Array
    Private nDialogWidth    := aDialogSize[5]               As Numeric
    Private nDialogHeight   := aDialogSize[6]               As Numeric
    
    //Cria a temporária
    oTempTable := FWTemporaryTable():New(cTempAlias)
        
    //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})
	aAdd(aFields, {"XXREGDEL", "L",   1, 0})
        
    //Define as colunas usadas, adiciona indice e cria a temporaria no banco
    oTempTable:SetFields( aFields )
    oTempTable:AddIndex("1", {"XXCODIGO"} )
    oTempTable:Create()
    
    //Monta a estrutura das colunas
    mountColumns()
    
    //Montando os dados, eles devem ser montados antes de ser criado o FWBrowse
    FWMsgRun(, {|oSay| insertInTable(oSay) }, "Processando", "Buscando grupos")
    
    //Criando a janela
    oTestDialog := TDialog():New(0, 0, nDialogHeight, nDialogWidth, "Teste Tabela Temporária", , , , , , 16777215, , , .T.)

        //Títulos e SubTítulos
        oSayBigger   := TSay():New(004, 003, {|| "FAT"                 }, oTestDialog, "", oFontBigger,  , , , .T., RGB(149, 179, 215), , 200, 30, , , , , , .F., , )
        oSayTitle    := TSay():New(004, 050, {|| "Listagem Genérica de"}, oTestDialog, "", oFontTitle,  , , , .T., RGB(031, 073, 125), , 200, 30, , , , , , .F., , )
        oSaySubtitle := TSay():New(014, 050, {|| "Dados Temporários"   }, oTestDialog, "", oFontSubtitle, , , , .T., RGB(031, 073, 125), , 300, 30, , , , , , .F., , )

        //Botões
        oButtonConfirm := TButton():New(006, (nDialogWidth/2-001)-(0052*02), "Confirmar",          oTestDialog, {|| lOk := .T., oTestDialog:End()}, 050, 018, , oFontButtons, , .T., , , , , , )
        oButtonClose   := TButton():New(006, (nDialogWidth/2-001)-(0052*01), "Fechar",             oTestDialog, {|| oTestDialog:End()}, 050, 018, , oFontButtons, , .T., , , , , , )
    
        //Cria o Painel e o Browse
        oPanelBrowse := tPanel():New(033, 006, "", oTestDialog, , , , RGB(000,000,000), RGB(254,254,254), (nDialogWidth/2 - 13),     (nDialogHeight/2 - 45))
            oTempBrowse := FWBrowse():New()
            oTempBrowse:DisableFilter()
            oTempBrowse:DisableConfig()
            oTempBrowse:DisableReport()
            oTempBrowse:DisableSeek()
            oTempBrowse:DisableSaveConfig()
            oTempBrowse:SetFontBrowse(oFontButtons)
            oTempBrowse:SetAlias(cTempAlias)
            oTempBrowse:SetDataTable()
            oTempBrowse:SetEditCell(.T., {|| .T.}) 
            oTempBrowse:lHeaderClick := .F.
            oTempBrowse:AddLegend(cTempAlias + "->XXQUANTI <  0", "BR_CANCEL",    "Quantidade menor que zero")
            oTempBrowse:AddLegend(cTempAlias + "->XXQUANTI >  0", "CHECKED",      "Quantidade maior que zero")
            oTempBrowse:SetColumns(aGridColumns)

            //Pega o total de colunas, insere um elemento, e fala que será na posição 4 (antes da coluna de quantidade)
            nColumns := Len(oTempBrowse:aColumns)
            aSize(oTempBrowse:aColumns, nColumns + 1)
            aIns(oTempBrowse:aColumns, 4)

            //Copia a primeira posição (que é a legenda) para a quarta, e depois exclui ela do começo
            oTempBrowse:aColumns[4] := oTempBrowse:aColumns[1]
            aDel(oTempBrowse:aColumns, 1)
            aSize(oTempBrowse:aColumns, nColumns)

            //Ativa o Browse
            oTempBrowse:SetOwner(oPanelBrowse)
            oTempBrowse:Activate()

    //Ativa e exibe a janela
    oTestDialog:Activate(, , , .T., , , {|| })
    
    //Se foi confirmado
    If lOk
        cLogMessage := "Abaixo os registros apagados da temporária (campo XXREGDEL): " + CRLF

        //Percorre os dados
        (cTempAlias)->(DbGoTop())
        While ! (cTempAlias)->(EoF())
            //Se tiver apagado, incrementa o log
            If (cTempAlias)->XXREGDEL
                cLogMessage += "+ Código " + (cTempAlias)->XXCODIGO + ";" + CRLF
            EndIf

            (cTempAlias)->(DbSkip())
        EndDo

        //Exibe a mensagem de log
        ShowLog(cLogMessage)
    EndIf

    //Deleta a temporaria
    oTempTable:Delete()
    
    FWRestArea(aArea)
Return
    
Static Function mountColumns()
    Local nCurrent          As Numeric
    Local aTempStruct := {} As Array
    
    //Adicionando colunas
    //[1] - Campo da Temporaria
    //[2] - Titulo
    //[3] - Tipo
    //[4] - Tamanho
    //[5] - Decimais
    //[6] - Máscara
    //[7] - Editável? .T. = sim, .F. = não
    aAdd(aTempStruct, {"XXCODIGO", "Código",     "C",   6,  0, "",              .F.})
    aAdd(aTempStruct, {"XXDESCRI", "Descricao",  "C",  30,  0, "",              .F.})
    aAdd(aTempStruct, {"XXQUANTI", "Quantidade", "N",   9,  2, "@E 999,999.99", .T.})
    aAdd(aTempStruct, {"XXEMISSA", "Emissão",    "D",   8,  0, "",              .T.})
    aAdd(aTempStruct, {"XXOBSERV", "Observação", "C", 100,  0, "",              .T.})
    
    //Percorrendo e criando as colunas
    For nCurrent := 1 To Len(aTempStruct)
        oColumn := FWBrwColumn():New()
        oColumn:SetData(&("{|| " + cTempAlias + "->" + aTempStruct[nCurrent][1] +"}"))
        oColumn:SetTitle(aTempStruct[nCurrent][2])
        oColumn:SetType(aTempStruct[nCurrent][3])
        oColumn:SetSize(aTempStruct[nCurrent][4])
        oColumn:SetDecimal(aTempStruct[nCurrent][5])
        oColumn:SetPicture(aTempStruct[nCurrent][6])
  
        //Se for ser possível ter o duplo clique
        If aTempStruct[nCurrent][7]
            oColumn:SetEdit(.T.)
            oColumn:SetReadVar(aTempStruct[nCurrent][1])
            //oColumn:SetValid({|| fSuaValid()})
        EndIf
  
        aAdd(aGridColumns, oColumn)
    Next
Return
    
Static Function insertInTable(oSay)
    Local aArea            := GetArea() As Array
    Local nCurrent         := 0         As Numeric
    Local nTotal           := 50        As Numeric
    Local dRefDate         := Date()    As Date
    Local cCurrentId       := "000000"  As Character
    Local cDescription     := ""        As Character
    Local nQuantity        := 0         As Numeric
    Local dDate            := sToD("")  As Date
    
    //Faz um laço de repetição
    For nCurrent := 1 To nTotal
        //Muda a mensagem na regua
        oSay:SetText("Adicionando registro " + cValToChar(nCurrent) + " de " + cValToChar(nTotal) + "...")
  
        //Pega as variáveis que vão ser gravadas
        cCurrentId := Soma1(cCurrentId)
        cDescription := "[" + Time() + "] Teste - " + cCurrentId
        nQuantity := Randomize(-5, 5)
        dDate := DaySub(dRefDate, nCurrent)
  
        //Insere os dados na temporária
        RecLock(cTempAlias, .T.)
            (cTempAlias)->XXCODIGO := cCurrentId
            (cTempAlias)->XXDESCRI := cDescription
            (cTempAlias)->XXQUANTI := nQuantity
            (cTempAlias)->XXEMISSA := dDate
            (cTempAlias)->XXOBSERV := ""
			(cTempAlias)->XXREGDEL := .F.
        (cTempAlias)->(MsUnlock())
    
    Next
    
    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.

1 Response

  1. Divair Zarpelon disse:

    posso ter mais do que uma tratativa ou somente uma, ter outros campos com essa funcionalidade, ja fez isso ? pois pelo exemplo parece que so é possive para uma coluna

Deixe uma resposta

Terminal de Informação