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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
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!!!