No vídeo de hoje, vamos demonstrar em como criar um temporizador num FWmBrowse e já deixar a barra da direita com gráficos habilitada.
A dúvida de hoje, nos perguntaram, como poderíamos criar um temporizador num FWmBrowse e também perguntaram em como já deixar habilitado a barra da direita onde ficam os gráficos.
Pensando nisso, montamos um exemplo, onde vai ser demonstrado tanto a parte de temporizador com o método SetTimer assim como a criação de gráficos e habilitando eles.
Segue abaixo o vídeo exemplificando:
E abaixo o código fonte desenvolvido:
//Bibliotecas
#Include "Totvs.ch"
#Include "FWMVCDef.ch"
//Variveis Estaticas
Static cTitulo := "Grupo de Produtos"
Static cAliasMVC := "SBM"
Static lCliqBarra := .F.
/*/{Protheus.doc} User Function zVid0239
Exemplo de Browse com temporizador
@author Atilio
@since 06/07/2023
@version 1.0
@type function
@see https://tdn.totvs.com/pages/releaseview.action?pageId=166821968#Gr%C3%A1ficoseVis%C3%B5esdoBrowse-_Toc382924274Criandoumgr%C3%A1ficoanexoaobrowseviac%C3%B3digo
/*/
User Function zVid0239()
Local aArea := FWGetArea()
Private oBrowse
Private aRotina := {}
Private oTimer
Private aTextos := {}
Private nTexto := 0
Private oTableAtt
SetFunName('zVid0239')
//Definicao do menu
aRotina := MenuDef()
//Instanciando o browse
oBrowse := FWMBrowse():New()
oBrowse:SetAlias(cAliasMVC)
oBrowse:SetDescription(cTitulo)
oBrowse:DisableDetails()
//Adiciona graficos
oTableAtt := u_zAttSBM()
oBrowse:SetAttach(.T.)
oBrowse:SetOpenChart(.T.)
oBrowse:SetViewsDefault(oTableAtt:aViews)
oBrowse:SetChartsDefault(oTableAtt:aCharts)
oBrowse:SetIDChartDefault('grafSBM')
oBrowse:SetTotalDefault('BM_COD','COUNT','Total de Grupos')
//Define o temporizador para rodar 1s após abrir a tela
oBrowse:SetTimer({|| u_zVerBarra()}, 1000)
//Ativa a Browse
oBrowse:Activate()
//Reseta flag
lCliqBarra := .F.
FWRestArea(aArea)
Return Nil
/*/{Protheus.doc} MenuDef
Menu de opcoes na funcao zVid0239
@author Atilio
@since 06/07/2023
@version 1.0
@type function
/*/
Static Function MenuDef()
Local aRotina := {}
//Adicionando opcoes do menu
ADD OPTION aRotina TITLE "Visualizar" ACTION "VIEWDEF.zVid0239" OPERATION 1 ACCESS 0
ADD OPTION aRotina TITLE "Incluir" ACTION "VIEWDEF.zVid0239" OPERATION 3 ACCESS 0
ADD OPTION aRotina TITLE "Alterar" ACTION "VIEWDEF.zVid0239" OPERATION 4 ACCESS 0
ADD OPTION aRotina TITLE "Excluir" ACTION "VIEWDEF.zVid0239" OPERATION 5 ACCESS 0
ADD OPTION aRotina TITLE "Copiar" ACTION "VIEWDEF.zVid0239" OPERATION 9 ACCESS 0
Return aRotina
/*/{Protheus.doc} ModelDef
Modelo de dados na funcao zVid0239
@author Atilio
@since 06/07/2023
@version 1.0
@type function
/*/
Static Function ModelDef()
Local oStruct := FWFormStruct(1, cAliasMVC)
Local oModel
Local bPre := Nil
Local bPos := Nil
Local bCancel := Nil
//Cria o modelo de dados para cadastro
oModel := MPFormModel():New("zVid0239M", bPre, bPos, /*bCommit*/, bCancel)
oModel:AddFields("SBMMASTER", /*cOwner*/, oStruct)
oModel:SetDescription("Modelo de dados - " + cTitulo)
oModel:GetModel("SBMMASTER"):SetDescription( "Dados de - " + cTitulo)
oModel:SetPrimaryKey({})
Return oModel
/*/{Protheus.doc} ViewDef
Visualizacao de dados na funcao zVid0239
@author Atilio
@since 06/07/2023
@version 1.0
@type function
/*/
Static Function ViewDef()
Local oModel := FWLoadModel("zVid0239")
Local oStruct := FWFormStruct(2, cAliasMVC)
Local oView
//Cria a visualizacao do cadastro
oView := FWFormView():New()
oView:SetModel(oModel)
oView:AddField("VIEW_SBM", oStruct, "SBMMASTER")
oView:CreateHorizontalBox("TELA" , 100 )
oView:SetOwnerView("VIEW_SBM", "TELA")
Return oView
/*/{Protheus.doc} zAttSBM()
Função que monta o gráfico e views relacionadas na tela
@type user function
@author Atilio
@since 25/08/2025
/*/
User Function zAttSBM()
Local oTableAtt := FWTableAtt():New() As Object
//Visões
Local oDSView1 := Nil As Object
Local oDSView2 := Nil As Object
Local oDSView3 := Nil As Object
Local oDSView4 := Nil As Object
//Gráficos
Local oDSChart := Nil As Object
oTableAtt:SetAlias("SBM")
//----------
// Visões
//----------
oDSView1 := FWDSView():New()
oDSView1:SetPublic( .T. )
oDSView1:SetName('Novo')
oDSView1:SetID("Novo")
oDSView1:SetOrder(1)
oDSView1:SetCollumns(FWSX3Util():GetAllFields('SBM',.T.))
oDSView1:AddFilter('Novo', "BM_PROORI == '1'")
oTableAtt:AddView(oDSView1)
oDSView2 := FWDSView():New()
oDSView2:SetPublic( .T. )
oDSView2:SetName('Remanufaturado')
oDSView2:SetID("Remanufaturado")
oDSView2:SetOrder(1)
oDSView2:SetCollumns(FWSX3Util():GetAllFields('SBM',.T.))
oDSView2:AddFilter('Remanufaturado', "BM_PROORI == '2'")
oTableAtt:AddView(oDSView2)
oDSView3 := FWDSView():New()
oDSView3:SetPublic( .T. )
oDSView3:SetName('Reciclado')
oDSView3:SetID("Reciclado")
oDSView3:SetOrder(1)
oDSView3:SetCollumns(FWSX3Util():GetAllFields('SBM',.T.))
oDSView3:AddFilter('Reciclado', "BM_PROORI == '3'")
oTableAtt:AddView(oDSView3)
oDSView4 := FWDSView():New()
oDSView4:SetPublic( .T. )
oDSView4:SetName('Usado')
oDSView4:SetID("Usado")
oDSView4:SetOrder(1)
oDSView4:SetCollumns(FWSX3Util():GetAllFields('SBM',.T.))
oDSView4:AddFilter('Usado', "BM_PROORI == '4'")
oTableAtt:AddView(oDSView4)
//------------
// Gráficos
//------------
oDSChart := FWDSChart():New()
oDSChart:SetID("grafSBM")
oDSChart:SetName("Procedencia")
oDSChart:setTitle("Procedencia dos grupos")
oDSChart:SetPublic(.T.)
oDSChart:setSeries({ {"SBM","BM_PROORI","COUNT"} })
oDSChart:setCategory({ {"SBM", "BM_PROORI"} })
oDSChart:SetType("PIECHART")
oDSChart:SetLegend(CONTROL_ALIGN_BOTTOM)
oDSChart:SetTitleAlign(CONTROL_ALIGN_CENTER)
oDSChart:SetPicture("999,999,999")
oTableAtt:AddChart(oDSChart)
Return oTableAtt
/*/{Protheus.doc} zVerBarra
Função que valida o browse, e dispara os botões
@type user function
@author Atilio
@since 25/08/2025
/*/
User Function zVerBarra()
Local aArea := FWGetArea()
Local nAtual := 0
//Variáveis de controle dos objetos da tela
Private oPai := GetWndDefault()
Private aControles := oPai:aControls
Private nAtuPvt := 0
//Se já foi clicado na barra, desativa o temporizador
If lCliqBarra
oBrowse:SetTimer({|| Nil}, 300000)
oTimer := oBrowse:GetTimer()
oTimer:DeActivate()
EndIf
//Percorrendo os objetos criados da tela
For nAtual := 1 To Len(aControles)
nAtuPvt := nAtual
//Se não foi clicado na barra ainda
If ! lCliqBarra
//Se for um TBtnBmp2 e tiver bLClicked
If Upper(Alltrim(aControles[nAtuPvt]:ClassName())) == "TBTNBMP2" .And. Type("aControles[nAtuPvt]:bLClicked") != "U"
//Se o bloco de código for OpenAction
If GetCBSource(aControles[nAtuPvt]:bLClicked) == "{|| SELF:OPENACTION() }"
//Define o gráfico default no Widget
oWidget := oBrowse:oBrowseUI:oChartWidget
oDropMenu := oWidget:oDropMenu
oDropMenu:aItems[1]:lPriorityOrder := .F. //"Nenhum"
oDropMenu:aItems[2]:lPriorityOrder := .T. //Nosso gráfico
//oWidget:Set?????(oTableAtt:aCharts[1])
//Dispara o clique para expandir a área do Widget
eVal(aControles[nAtuPvt]:bLClicked)
lCliqBarra := .T.
Exit
EndIf
EndIf
EndIf
Next
FWRestArea(aArea)
Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.