Fazer um Timer em uma tela com FWmBrowse | Ti Responde 0239

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.

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