Clase y ejemplo para hacer graficos

Clase y ejemplo para hacer graficos

Postby JoseAlvarez » Sat Jan 01, 2022 9: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.
User avatar
JoseAlvarez
 
Posts: 726
Joined: Sun Nov 09, 2014 5:01 pm

Re: Clase y ejemplo para hacer graficos

Postby cmsoft » 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: Select all  Expand view

#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: Select all  Expand view

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
}
 
User avatar
cmsoft
 
Posts: 1189
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina

Re: Clase y ejemplo para hacer graficos

Postby Antonio Linares » Sun Jan 02, 2022 6:45 am

Querido César,

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

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41314
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Clase y ejemplo para hacer graficos

Postby Armando » Sun Jan 02, 2022 7: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: Select all  Expand view

#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
User avatar
Armando
 
Posts: 3061
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México

Re: Clase y ejemplo para hacer graficos

Postby cmsoft » 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!
User avatar
cmsoft
 
Posts: 1189
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 79 guests