Criando Gráfico no Protheus


Criar gráficos no Protheus é algo bem simples de se fazer, podemos trazer a informação de forma mais clara e objetiva para o usuário.

No exemplo a seguir, utilizaremos a classe FWChartFactory, iremos criar uma rotina que irá criar um gráfico trazendo valores de datas específicas.

Podemos criar gráficos do tipo pizza, linha ou barra.

User Function EXP0018()
	Local oScroll
	Local nGrafico := BARCOMPCHART
	
	Static oMonitor

	DEFINE MSDIALOG oMonitor TITLE "Grafico" FROM 0,0  TO 600,900 COLORS 0, 16777215 PIXEL 
	oScroll := TScrollArea():New(oMonitor,01,01,500,800)
	oScroll:Align := CONTROL_ALIGN_ALLCLIENT    
	
	Grafico(oScroll,nGrafico)
	
	oMenu := TBar():New( oMonitor, 48, 48, .T., , ,"CONTEUDO_BODY-FUNDO", .T. )
	DEFINE BUTTON RESOURCE "FW_PIECHART_1"		OF oMenu	ACTION Grafico(oScroll,PIECHART) 	 PROMPT " "	TOOLTIP "Pizza"			
	DEFINE BUTTON RESOURCE "FW_LINECHART_1"		OF oMenu	ACTION Grafico(oScroll,LINECHART) 	 PROMPT " "	TOOLTIP "Linha"			
	DEFINE BUTTON RESOURCE "FW_BARCHART_1"		OF oMenu	ACTION Grafico(oScroll,BARCHART) 	 PROMPT " "	TOOLTIP "Barra"			
	DEFINE BUTTON RESOURCE "FW_BARCOMPCHART_2"	OF oMenu	ACTION Grafico(oScroll,BARCOMPCHART) PROMPT " "	TOOLTIP "Barra"			
	
	ACTIVATE MSDIALOG oMonitor CENTERED
Return
Static Function Grafico(oScroll,nGrafico)
	Local oChart
	Local cQuery:= ""
	
	If Valtype(oChart)=="O"
		FreeObj(@oChart) //Usando a função FreeObj liberamos o objeto para ser recriado novamente, gerando um novo gráfico
	Endif
	
	oChart := FWChartFactory():New()
	oChart := oChart:getInstance( nGrafico ) 
	oChart:init( oScroll )
	oChart:SetTitle("Saldos Bancários", CONTROL_ALIGN_LEFT)
	oChart:SetMask( "R$ *@*")
	oChart:SetPicture("@E 999,999,999.99")
	oChart:setColor("Random") //Deixamos o protheus definir as cores do gráfico
	If nGrafico == PIECHART //se o gráfico tipo pizza, deixamos a legenda no rodapé
		oChart:SetLegend( CONTROL_ALIGN_BOTTOM )
	Endif	
	oChart:nTAlign := CONTROL_ALIGN_ALLCLIENT

	//Uma consulta bem Simples
	cQuery := " SELECT * FROM "+ RETSQLNAME("SE8") + " SE8 "
	cQuery += " WHERE SE8.D_E_L_E_T_='' "
	cQuery += " AND E8_FILIAL='"+xFilial("SE8")+"' "
	cQuery += " AND E8_CONTA='XXXXX-X' AND E8_DTSALAT >= '20190601'"
	cQuery += " ORDER BY E8_DTSALAT"

	If ( SELECT("TRBACD") ) > 0
		dbSelectArea("TRBACD")
		TRBACD->(dbCloseArea())
	EndIf

	TcQuery cQuery Alias "TRBACD" New
	TRBACD->(dbGoTop())

	//Se a série for unica o tipo de variável deve ser NUMÉRICO Ex.: (cTitle, 10)
	//Se for multi série o tipo de variável deve ser Array de numéricos Ex.: (cTitle, {10,20,30} )
	If TRBACD->(!EOF())
		While TRBACD->(!EOF())
			if nGrafico==LINECHART .OR. nGrafico==BARCOMPCHART 
				//Neste dois tipos de graficos temos:
				//(Titulo, {{ Descrição, Valor }})
				oChart:addSerie( "Conta " + TRBACD->E8_CONTA   , { { DTOC(STOD(TRBACD->E8_DTSALAT)), TRBACD->E8_SALATUA   } } )
			Else
				//Aqui temos:
				//(Titulo, Valor)
				oChart:AddSerie(DTOC(STOD(TRBACD->E8_DTSALAT)),TRBACD->E8_SALATUA)
			Endif
			TRBACD->(dbSkip())
		End
		oChart:build()
	Endif

	
Return
 

Simples assim!!!