Todo esto con el fin de brindar a nuestros usuarios una presentación mas elegante de una consulta de Visual FoxPro en una planilla de Excel.
Si queremos sorprender a nuestros usuarios: ¿Por qué no creamos también un gráfico en la planilla Excel?. De esta forma transformaremos la conocida frase: "una imagen vale mas que mil palabras", en "un gráfico vale mas que mil datos".
En este ejemplo, partimos de dos consultas: 1) Una consulta que acumula las ventas anuales, y 2) Una consulta que acumula las ventas semanales de "n" items.
Para simular los resultados de estas consultas crearemos dos tablas: 1) ANIO.DBF y 2) SEMANA.DBF
Con la primera consulta vamos a crear una planilla ANIO.XLS con un gráfico de líneas como muestra la siguiente figura:

Con la segunda consulta vamos a crear una planilla SEMANA.XLS con un bráfico de barras apiladas, como se muestra abajo:

Podemos ver que a los gráficos se le puede añadir títulos, leyendas al gráfico, a las series y a los ejes, y modificar sus atributos para que estos se vean elegantes.
¿Cómo hacer esto desde VFP?
Una vez que tenemos las tabla o cursor con los resultados de la consulta, lo copiamos a formato XLS con la sentencia COPY TO ... TYPE XL5.
Luego creamos un objeto "Excel.Application" con el cual abrimos la planilla generada y allí creamos el gráfico en una hoja nueva, y le damos el formato deseado.
Una vez finalizado, grabamos y cerramos la planilla. Si queremos que quede abierto el Excel con la planilla generada, no cerramos la planilla y la hacemos visible con la propiedad: loExcel.APPLICATION.VISIBLE = .T.
El código en VFP de este ejemplo que nos genera ambas planillas, es el siguiente y lo podemos descargar de graficos.zip
*-----------------------------
SET DATE DMY
SET SAFETY OFF
*--- Crea las tablas que simulan las consultas
DO CreaArchivos
*--- Genera gráfico anual
DO GraficoAnual
*--- Genera gráfico semanal
DO GraficoSemanal
CLOSE TABLES ALL
RETURN
*-----------------------------
*-----------------------------
* PROCEDURE CreaArchivos
*-----------------------------
* Crea y llena las tablas de
* ejemplo y las copia
* como archivo tipo .XLS
*-----------------------------
PROCEDURE CreaArchivos
LOCAL lnI, ldFechaIni
*--- Inicializo la funcion RAND()
lnI = RAND(-1)
ldFechaIni = DATE(1998,12,27)
*---- Creo tablas
CREATE TABLE Semana (Dia C(10), Item01 N(10,2), ;
Item02 N(10,2), Item03 N(10,2), Item04 N(10,2))
CREATE TABLE Anio (Mes C(10), TOTAL N(10,2))
*--- Cargo datos de los 7 días y los 12 meses
FOR lnI = 1 TO 12
IF lnI <= 7
INSERT INTO Semana ;
(Dia, Item01, Item02, Item03, Item04) ;
VALUES (CDOW(ldFechaIni+lnI), RAND()*1000, ;
RAND()*1000, RAND()*1000, RAND()*1000 )
ENDIF
INSERT INTO Anio (Mes, TOTAL) ;
VALUES (CMONTH(GOMONTH(ldFechaIni,lnI)), RAND()*10000 )
ENDFOR
*--- Guardo como tipo XL5
SELECT Semana
COPY TO Semana TYPE XL5
SELECT Anio
COPY TO Anio TYPE XL5
RETURN
ENDPROC
*-----------------------------
* PROCEDURE GraficoAnual
*-----------------------------
* Creo un gráfico de Lineas en Excel
*-----------------------------
PROCEDURE GraficoAnual
LOCAL lnFil, lnCol, lcRango, lcPlanilla, lcHoja, loExcel
lnFil = RECCOUNT("Anio") + 1
lnCol = FCOUNT("Anio")
lcRango = "A1:" + CHR(64+lnCol) + ALLTRIM(STR(lnFil))
lcHoja = "Anio"
lcPlanilla = SYS(5) + CURDIR() + "Anio.xls"
*--- Creo objeto Excel
loExcel=CREATEOBJECT("Excel.application")
WITH loExcel.APPLICATION
.VISIBLE = .F. && oculto el trabajo en la aplicacion Excel
.workbooks.OPEN(lcPlanilla)
*---- Añado grafico de líneas
.Charts.ADD
.ActiveChart.ChartType = 65 && xlLineMarkers
.ActiveChart.SetSourceData(.Sheets(lcHoja).RANGE(lcRango), 2)
.ActiveChart.Location(1, "Grafico")
.ActiveChart.HasDataTable = .F.
*--- Estilo y ancho línea
.ActiveChart.SeriesCollection(1).SELECT
WITH .SELECTION.BORDER
.Weight = 4 && xlThick
.LineStyle = 1 && xlContinuous
ENDWITH
*--- Titulo gráfico
.ActiveChart.HasTitle = .T.
.ActiveChart.ChartTitle.TEXT = "Ventas acumuladas anuales"
.ActiveChart.ChartTitle.SELECT
WITH .SELECTION.FONT
.NAME = "Arial"
.FontStyle = "Negrita"
.SIZE = 16
ENDWITH
*--- Leyenda
.ActiveChart.HasLegend = .T.
.ActiveChart.Legend.SELECT
.SELECTION.Position = -4160 && xlTop
*--- Ejes
WITH .ActiveChart
.Axes(1, 1).HasTitle = .T.
.Axes(1, 1).AxisTitle.TEXT = "Meses del año"
.Axes(2, 1).HasTitle = .T.
.Axes(2, 1).AxisTitle.TEXT = "Totales en U$S"
.Deselect
ENDWITH
*--- Grabo planilla y cierro
.VISIBLE = .F.
.ActiveWorkbook.SAVE
.workbooks.CLOSE
ENDWITH
RELE loExcel
RETURN
ENDPROC
*-----------------------------
* PROCEDURE GraficoSemanal
*-----------------------------
* Gráfico de Barras Apiladas en Excel
*-----------------------------
PROCEDURE GraficoSemanal
LOCAL lnFil, lnCol, lcRango, lcPlanilla, lcHoja, loExcel
lnFil = RECCOUNT("Semana") + 1
lnCol = FCOUNT("Semana")
lcRango = "A1:" + CHR(64+lnCol) + ALLTRIM(STR(lnFil))
lcHoja = "Semana"
lcPlanilla = SYS(5) + CURDIR() + "Semana.xls"
*--- Creo objeto Excel
loExcel=CREATEOBJECT("Excel.application")
WITH loExcel.APPLICATION
.VISIBLE = .F. && oculto el trabajo en la aplicacion Excel
.workbooks.OPEN(lcPlanilla)
*---- Añado grafico barras apiladas
.Charts.ADD
.ActiveChart.ChartType = 52 && xlColumnStacked
.ActiveChart.SetSourceData(.Sheets(lcHoja).RANGE(lcRango), 2)
.ActiveChart.Location(1, "Grafico")
.ActiveChart.HasDataTable = .F.
*--- Titulo gráfico
.ActiveChart.HasTitle = .T.
.ActiveChart.ChartTitle.TEXT = "Ventas semanales por items"
.ActiveChart.ChartTitle.SELECT
WITH .SELECTION.FONT
.NAME = "Arial"
.FontStyle = "Negrita"
.SIZE = 16
ENDWITH
*--- Leyenda
.ActiveChart.HasLegend = .T.
.ActiveChart.Legend.SELECT
.SELECTION.Position = -4160 && xlTop
*--- Ejes
WITH .ActiveChart
.Axes(1, 1).HasTitle = .T.
.Axes(1, 1).AxisTitle.TEXT = "Días de la semana"
.Axes(2, 1).HasTitle = .T.
.Axes(2, 1).AxisTitle.TEXT = "Totales en U$S"
.Deselect
ENDWITH
*--- Grabo planilla y cierro
.VISIBLE = .F.
.ActiveWorkbook.SAVE
.workbooks.CLOSE
ENDWITH
RELE loExcel
RETURN
ENDPROC
*-----------------------------
Una idea que nos ayudará a crear nuestros gráficos, es abrir la planilla con Excel, y comenzar a grabar una macro; hacemos nuestro gráfico y al terminar, finalizamos la grabación de la macro. El código que genera la macro está en Visual Basic for Applications, y es muy fácil convertirlo a código de Visual FoxPro.Hasta la próxima,
Luis María Guayán
No hay comentarios. :
Publicar un comentario
Los comentarios son moderados, por lo que pueden demorar varias horas para su publicación.