FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Clase y ejemplo para hacer graficos
Posts: 851
Joined: Sun Nov 09, 2014 05:01 PM
Clase y ejemplo para hacer graficos
Posted: Sat Jan 01, 2022 09:30 PM

Saludos estimados colegas
Feliz año nuevo 2022 para todos

Existe alguna clase para hacer graficas?
Algun ejemplo basico en caso de que exista?

Me piden graficas de los articulos mas vendidos en los ultimos 30 dias y al final de año.

"Los errores en programación, siempre están entre la silla y el teclado..."



Fwh 19.06 32 bits + Harbour 3.2 + Borland 7.4 + MariaDB + TDolphin



Carora, Estado Lara, Venezuela.
Posts: 1344
Joined: Wed Nov 16, 2005 09:14 PM
Re: Clase y ejemplo para hacer graficos
Posted: Sat Jan 01, 2022 11:51 PM
Feliz Año José:
Acá te dejo 3 ejemples, un grafico de lineas, uno de barras y uno de torta.
Code (fw): Select all Collapse
#Include "FiveWin.Ch"
#Include "TGraph.Ch"
#include "Tdolphin.ch"
STATIC oFont

**************************************************************************************************************************************
** C O M P R A S 
PROCEDURE Grafica21()
LOCAL oGet3, oGet4, mrta := .f., mtotal, ant, mdesde := DATE(), mhasta := DATE(),;
      oGraf,aSerie := {}, aLeyen := {}, oDlg, oBot1, oBot2, acor, oQry
DEFINE FONT oFont NAME "TAHOMA" SIZE 0,-11.5
DEFINE DIALOG oDlg TITLE "Compras por fecha" FROM 03,15 TO 11,45 ;
       OF oWnd FONT oFont
   acor := AcepCanc(oDlg)
   @ 07, 05 SAY "Desde Fecha:" OF oDlg PIXEL SIZE 40,12 RIGHT
   @ 22, 05 SAY "Hasta Fecha:" OF oDlg PIXEL SIZE 40,12 RIGHT
   
   @ 05, 50 GET oGet3 VAR mdesde  OF oDlg PIXEL CENTER
   @ 20, 50 GET oGet4 VAR mhasta  OF oDlg PIXEL VALID(mhasta >= mdesde) CENTER
   @ acor[1],acor[2] BUTTON oBot1 PROMPT "&Generar" OF oDlg SIZE 30,10 ;
           ACTION ((mrta := .t.), oDlg:End() ) PIXEL
   @ acor[3],acor[4] BUTTON oBot2 PROMPT "&Cancelar" OF oDlg SIZE 30,10 ;
           ACTION ((mrta := .f.), oDlg:End() ) PIXEL
ACTIVATE DIALOG oDlg CENTER ON INIT oGet3:SetFocus()
IF !mrta
   RETURN
ENDIF
oQry := oServer:Query( "SELECT DAY(fecfac) as dia, SUM(importe * IF(tipocomp='NC' OR tipocomp='DE',-1,1)) as cant FROM compras WHERE fecfac >= " + ClipValue2SQL(mdesde) +;
                            " AND fecfac <= " + ClipValue2SQL(mhasta) + " GROUP BY fecfac")
DO WHILE !oQry:EOF()
   AADD(aSerie,oQry:cant)
   AADD(aLeyen,STR(oQry:dia))
   oQry:SKIP()
ENDDO
oQry:End()
IF LEN(aSerie) = 0
   MsgStop("Sin datos para mostrar","Atencion")
   oQry:End() 
   RETURN
ENDIF
      DEFINE DIALOG oDlg RESOURCE "GRAFICA" OF oWnd
      oDlg:lHelpIcon := .f.
      REDEFINE GRAPH oGraf OF oDlg ID 111 TITLE "Compras por dia" 3D XGRID;
                            YGRID XVALUES YVALUES LEGENDS TYPE 2
      oGraf:cTitle := "Compras del " + DTOC(mdesde) + " al " + DTOC(mhasta)
      oGraf:cSubTit:= "En Pesos"
      oGraf:cTitX  := "Pesos"
      oGraf:cTitY  := "Dias"
      oGraf:lPopUp := .T.
      oGraf:AddSerie(aSerie, "Compras por dia", RGB(128,128,255))
      oGraf:SetYVals(aLeyen)
      oGraf:Refresh()
      REDEFINE BUTTON oBot1 ID 102 OF oDlg ACTION Imprime(oDlg)
      REDEFINE BUTTON oBot2 ID 104 OF oDlg ACTION oDlg:End()
      ACTIVATE DIALOG oDlg CENTER
RETURN

PROCEDURE Grafica22()
LOCAL oGet3, mrta := .f., mdesde := YEAR(DATE()), ;
      oGraf,aSerie := {0,0,0,0,0,0,0,0,0,0,0,0},;
      aLeyen := {"Ene","Feb","Mar","Abr","May","Jun",;
                 "Jul","Ago","Sep","Oct","Nov","Dic"},;
      oDlg, oBot1, oBot2, acor, oQry
DEFINE FONT oFont NAME "TAHOMA" SIZE 0,-11.5
DEFINE DIALOG oDlg TITLE "Compras Anuales" FROM 03,15 TO 10,45 OF oWnd FONT oFont
   acor := AcepCanc(oDlg)
   @ 12, 05 SAY "Año:" OF oDlg PIXEL SIZE 40,12 RIGHT
   
   @ 10, 50 GET oGet3 VAR mdesde  PICTURE "9999" OF oDlg PIXEL
   @ acor[1],acor[2] BUTTON oBot1 PROMPT "&Generar" OF oDlg SIZE 30,10 ;
           ACTION ((mrta := .t.), oDlg:End() ) PIXEL
   @ acor[3],acor[4] BUTTON oBot2 PROMPT "&Cancelar" OF oDlg SIZE 30,10 ;
           ACTION ((mrta := .f.), oDlg:End() ) PIXEL
ACTIVATE DIALOG oDlg CENTER ON INIT oGet3:SetFocus()
IF !mrta   
   RETURN
ENDIF
oQry :=oServer:Query( "SELECT MONTH(fecfac) as mes, SUM(importe * IF(tipocomp='NC' OR tipocomp='DE',-1,1)) as cant FROM compras WHERE YEAR(fecfac) = " + ClipValue2SQL(mdesde) +;
                            " GROUP BY MONTH(fecfac)")
DO WHILE !oQry:EOF()
   aSerie[oQry:mes] := oQry:cant
   oQry:Skip()
ENDDO
oQry:End()
IF LEN(aSerie) = 0
   MsgStop("Sin datos para mostrar","Atencion")
   RETURN
ENDIF
      DEFINE DIALOG oDlg RESOURCE "GRAFICA" OF oWnd
      oDlg:lHelpIcon := .f.
      REDEFINE GRAPH oGraf OF oDlg ID 111 TITLE "Compras por mes" 3D XGRID;
                            YGRID XVALUES YVALUES LEGENDS TYPE 1
      oGraf:cTitle := "Compras Anuales " + STR(mdesde)
      oGraf:cSubTit:= "En Pesos"
      oGraf:cTitX  := "Pesos"
      oGraf:cTitY  := "Mes"
      oGraf:lPopUp := .T.
      oGraf:AddSerie(aSerie, "Mes", RGB(255,128,255))
      oGraf:SetYVals(aLeyen)
      oGraf:Refresh()
      REDEFINE BUTTON oBot1 ID 102 OF oDlg ACTION Imprime(oDlg)
      REDEFINE BUTTON oBot2 ID 104 OF oDlg ACTION oDlg:End()
      ACTIVATE DIALOG oDlg CENTER
RETURN

PROCEDURE Grafica23()
LOCAL oGet3, oGet4, mrta := .f., mtotal, ant, mdesde := DATE(), mhasta := DATE(),;
      oGraf,aSerie := {}, aLeyen := {}, oDlg, oBot1, oBot2, acor,;
      aRubro := {}, aPreci := {}, j, oQry
DEFINE FONT oFont NAME "TAHOMA" SIZE 0,-11.5
DEFINE DIALOG oDlg TITLE "Compras por cuenta" FROM 03,15 TO 11,45 OF oWnd
   acor := AcepCanc(oDlg)
   @ 07, 05 SAY "Desde Fecha:" OF oDlg PIXEL SIZE 40,12 RIGHT
   @ 22, 05 SAY "Hasta Fecha:" OF oDlg PIXEL SIZE 40,12 RIGHT
   
   @ 05, 50 GET oGet3 VAR mdesde  OF oDlg PIXEL CENTER
   @ 20, 50 GET oGet4 VAR mhasta  OF oDlg PIXEL VALID(mhasta >= mdesde) CENTER
   @ acor[1],acor[2] BUTTON oBot1 PROMPT "&Generar" OF oDlg SIZE 30,10 ;
           ACTION ((mrta := .t.), oDlg:End() ) PIXEL
   @ acor[3],acor[4] BUTTON oBot2 PROMPT "&Cancelar" OF oDlg SIZE 30,10 ;
           ACTION ((mrta := .f.), oDlg:End() ) PIXEL
ACTIVATE DIALOG oDlg CENTER ON INIT oGet3:SetFocus()
IF !mrta   
   RETURN
ENDIF
oQry := oServer:Query( "SELECT r.nombre as rubro, SUM(v.importe* IF(v.tipocomp='NC' OR v.tipocomp='DE',-1,1)) as cant FROM compras v "+;
                            "LEFT JOIN plancont r ON r.codigo = v.codcue "+;
                            "WHERE v.fecfac >= " + ClipValue2SQL(mdesde) +;
                            "  AND v.fecfac <= " + ClipValue2SQL(mhasta) + " GROUP BY r.nombre")
DO WHILE !oQry:Eof()
   AADD(aLeyen,oQry:rubro)
   AADD(aPreci,oQry:cant)      
   oQry:Skip()
ENDDO
IF LEN(aLeyen) = 0
   MsgStop("Sin datos para mostrar","Atencion")
   RETURN
ENDIF
      
      DEFINE DIALOG oDlg RESOURCE "GRAFICA" OF oWnd
      oDlg:lHelpIcon := .f.
      REDEFINE GRAPH oGraf OF oDlg ID 111 TITLE "Compras por cuenta" 3D XGRID;
                            YGRID XVALUES YVALUES LEGENDS TYPE 4
      oGraf:cTitle := "Compras por cuenta del " + DTOC(mdesde) + " al " + DTOC(mhasta)
      oGraf:cSubTit:= "En Pesos"
      oGraf:cTitX  := "Pesos"
      oGraf:cTitY  := "Cuenta"
      oGraf:lPopUp := .T.
      
      oGraf:AddSerie(aPreci, "Cuenta", RGB(255,128,255))
      oGraf:SetYVals(aLeyen)
      oGraf:Refresh()
      REDEFINE BUTTON oBot1 ID 102 OF oDlg ACTION Imprime(oDlg)
      REDEFINE BUTTON oBot2 ID 104 OF oDlg ACTION oDlg:End()
      ACTIVATE DIALOG oDlg CENTER
RETURN

Y este es el RC
Code (fw): Select all Collapse
GRAFICA DIALOG DISCARDABLE 58, 37, 670, 367
STYLE WS_POPUP|DS_MODALFRAME|WS_CAPTION|WS_SYSMENU|WS_VISIBLE
CAPTION "Gráficos"
FONT 8, "Tahoma"
{
  CONTROL "", 111, "TGRAPH", WS_TABSTOP|0x000000a1, 0, 13, 668, 335
  CONTROL "&Impimir", 102, "Button", WS_TABSTOP, 212, 352, 50, 14
  CONTROL "&Salir", 104, "Button", WS_TABSTOP, 324, 352, 50, 14
}
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Clase y ejemplo para hacer graficos
Posted: Sun Jan 02, 2022 06:45 AM

Querido César,

muchas gracias por tu constantes ayudas y muy feliz 2022 a todos

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
Re: Clase y ejemplo para hacer graficos
Posted: Sun Jan 02, 2022 07:01 PM
José:

Algo muy sencillo con la clase TGraph, primero debes obtener los valores a graficar (Producto y cantidad vendida)
los metes en dos arreglos, en mi caso son acPro (Productos) y anVez (Cantidad vendida),
llamas a la función Grafica() y el resto es coser y cantar.

Cualquier duda nos pegas un grito

Code (fw): Select all Collapse
#Include "tgraph.ch"
...
...
...
...
STATIC FUNCTION Grafica()
   LOCAL oGraph
   LOCAL oIcono

    DEFINE ICON oIcono RESOURCE "AppLogo"
   DEFINE WINDOW oWnd FROM 15, 60 TO 45, 180 TITLE "Consumo por producto";
      ICON oIcono

      oGraph:=TGraph():New(0,0,oWnd,oWnd:nWidth()-15,oWnd:nHeight()-40)
         WITH Object oGraph
            :aFont[1] := TFont():New( "Arial", 0, -16, .F., .T., 0 , 0, , .F., .F., .F., 0, 3, 2, 1, ,34 )  // Título de la gráfica
            :aFont[2] := TFont():New( "Arial", 0, -18, .F., .T., 0 , 0, , .F., .F., .F., 0, 3, 2, 1, , 2 )  // Eje de las X
            :aFont[3] := TFont():New( "Arial", 0, -08, .F., .T., 0, 0, , .F., .F., .F., 0, 3, 2, 1, ,34 )   // Eje de las Y
            :aFont[4] := TFont():New( "Arial", 0, -16, .F., .T., 0 , 0, , .F., .F., .F., 0, 3, 2, 1, , 2 )  // Leyendas
            :aFont[5] := TFont():New( "Arial", 0, -16, .F., .F., 0 , 0, , .F., .F., .F., 0, 3, 2, 1, , 2 )  // Sub titulo
            :aFont[6] := TFont():New( "Arial", 0, -18, .F., .T., 900, 0, , .F., .F., .F., 0, 3, 2, 1, , 2 ) // Texto de las X
            :aFont[7] := TFont():New( "Arial", 0, -14, .F., .T., 0 , 0, , .F., .F., .F., 0, 3, 2, 1, ,34 )  // Texto de las Y
            :aFont[8] := TFont():New( "Arial", 0, -20, .F., .T., 0 , 0, , .F., .F., .F., 0, 3, 2, 1, ,34 )  // Valores
            :nType      := GRAPH_TYPE_BAR // GRAPH_TYPE_BAR,GRAPH_TYPE_LINE,GRAPH_TYPE_POINT,GRAPH_TYPE_PIE
            :cTitle     := "Consumo por producto"
            :cSubTit    := "Del " + Date2Txt(oVar:INI) + " al " + Date2Txt(oVar:FIN)
            :lCTitle    := (.T.)
            :cPicture   := "999,999"                              // Picture para el eje X (Línea vertical)
            :cXPicture  := "999"                                  // Picture para el eje X (Línea vertical)
            :SetYVals(acPro)                                      // Valores del eje Y (Línea horizontal)
            :cTitX      := "Cantidad"                             // Título del eje X (Línea vertical)
            :cTitY      := "Productos"                            // Título del eje Y (Línea horizontal)
            :lXVal      := (.T.)                                  // Muestra los valores en el eje X (la línea horizontal)
            :lYVal      := (.T.)                                  // Muestra los valores en el eje Y (la línea horizontal)
            :lTitle     := (.T.)                                  // Muestra el título y sub titulo de la gráfica
            :lLegends   := (.F.)                                  // Para que muestre que significan las barras
            :lPopUp     := (.T.)
            :lDegrade   := (.T.)
            :l3D        := (.T.)
//             :lLine      := (.T.)                               // Pinta una línea amarilla sobre todas la barras
            :AddSerie(anVez,"Consumo por producto",CLR_HBLUE)     // Leyenda y color de las barras
            :Refresh()
         END
   ACTIVATE WINDOW oWnd CENTERED;
      ON PAINT (oGraph:nWidth := oWnd:nWidth()  -  15, ;
               oGraph:nHeight := oWnd:nHeight   -  40, ;
               oGraph:Refresh(.F.))

   oIcono:END()
RETURN(.T.)


Saludos
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Posts: 1344
Joined: Wed Nov 16, 2005 09:14 PM
Re: Clase y ejemplo para hacer graficos
Posted: Mon Jan 03, 2022 10:41 AM
Querido César,

muchas gracias por tu constantes ayudas y muy feliz 2022 a todos

Muchas gracias Antonio, te deseo a vos y a todos los fivewineros un excelente 2022!

Continue the discussion