Вы находитесь на странице: 1из 11

Reportes elsticos con tablas dinmicas y

Visual FoxPro
(Publicado originalmente en UTMag/Rapozine,
http://www.UniversalThread.com/Spanish/Magazine)
Por Hctor Correa.
Este artculo describe cmo programar informes flexibles usando Tablas Dinmicas de
Excel y Visual FoxPro. Con Tablas Dinmicas los usuarios finales pueden rotar filas y
columnas (de all el ttulo de este artculo) para inspeccionar datos desde diferentes
aspectos. La mayora de los usuarios estn muy familiarizados con Excel y, por lo tanto,
el tiempo de entrenamiento se reduce considerablemente. Con Visual FoxPro se puede
consolidar datos desde mltiples fuentes (tablas VFP, SQL Server y/o Oracle) y
automatizar la creacin de estas tablas.

Introduccin a Tablas Dinmicas de Excel


Una tabla dinmica es un tipo especial de tabla de Excel donde usted puede rotar filas y
columnas para ver datos desde diferentes perspectivas. Se usan tablas dinmicas porque
permiten sumarizar grandes cantidades de datos simplemente arrastrando y soltando
campos dentro de sus filas y columnas.
En su forma ms simple, la tabla dinmica se ve como lo muestra la imagen siguiente.
Como puede ver, est compuesta por cuatro elementos bsicos: campos de filas, campos
de columnas, items de datos y campos de pgina.

La imagen siguiente muestra una tabla dinmica con datos tomados desde la base de
datos TestData que viene con VFP 7.

En este ejemplo puede ver ventas por ao/mes y pas. Note que los campos en los
encabezados de filas y columnas son, de hecho, controles drop-down. Esto significa que
cuando hace clic en ellos, la lista desplegable le permite seleccionar los valores que
quiere mostrar (filtro) en la tabla dinmica. En este caso particular, yo seleccion slo
los meses de Abril y Mayo de 1996 para cuatro pases. Una copia de la planilla Excel
con este ejemplo se encuentra en PT_TESTDATA.XLS.
Uno de los aspectos ms excitantes de estas tablas es precisamente que sean dinmicas.
Esto significa que usted puede reestructurar los campos mostrados como filas, columnas
e items de datos para obtener distintas vistas de los mismos datos. Por ejemplo, la
siguiente imagen muestra los mismos datos de la anterior. Sin embargo, en este caso
arrastr el campo "empleado" al rea de fila. Observe como la tabla dinmica
automticamente reestructur la informacin por empleado.

Otra interesante caracterstica de las tablas dinmicas es su capacidad de drill-down.


Usted puede hacer doble-clic en una celda en particular y Excel muestra los registros
especficos que estn detrs de la suma mostrada en la tabla dinmica. Por ejemplo, con
doble-clic en la fila 1996/4, Andrew Fuller -para la columna Canada- muestra el detalle
de dos ventas que constituyen los 1014 dlares mostrados en la tabla dinmica.

Hay muchas otras facilidades que vienen con las tablas dinmicas. Por ejemplo, puede
crear Grficos Dinmicos. Estos grficos se asocian con la tabla dinmica, y se puede
filtrar la informacin que se grafica de la misma forma (es decir por medio de las listas
desplegables). Puede crear tambin campos calculados (p. ej. sumas, cuentas,
promedios) en su tabla dinmica. Adems puede formatear sus tablas dinmicas para
darles un aspecto profesional usando varios estilos que vienen incorporados con Excel.
Aunque las tablas dinmicas son muy flexibles y poderosas, usted todava podra
preguntarse por qu considerar las facilidades de Excel para generar informes, en vez de
usar el generador de reportes de Visual FoxPro o cualquiera de terceras partes. Hay dos

fuertes razones que hacen a las tablas dinmicas mejor candidato que otras tecnologas
para entregar informes a usuarios.
Primero, como Tom Bellmer (http://www.visionds.net/hcorrea) mencion en su artculo,
la mayora de las personas ya tiene Excel y sabe usarlo. Permitirles a sus usuarios crear
informes dinmicos con una herramienta con la que se sienten seguros es algo que
ciertamente apreciarn.
Segundo, dado que las tablas dinmicas son tan flexibles, los usuarios pueden
personalizar sus propios informes simplemente arrastrando y soltando campos. Pueden
bajar al nivel de detalle que necesitan haciendo doble-clic en las celdas.
Adicionalmente, pueden crear grficos usando uno de los motores de graficacin ms
conocidos disponible para usuarios finales. El resultado final es que hay una reduccin
importante en el tiempo empleado para crear informes y un incremento de la
flexibilidad para representar y analizar datos.

Programando Tablas Dinmicas de Excel con Visual


FoxPro
Hay bsicamente dos formas de crear tablas dinmicas en Excel. La primera es usando
Excel interactivamente. Para ello, use el Asistente de Tablas Dinmicas que est en el
sector Datos del men principal de Excel. El segundo mecanismo es programticamente
mediante OLE-Automation.
Este es el mecanismo que describir en este artculo.
Antes de entrar en detalles sobre cmo crear tablas dinmicas programticamente,
echemos un vistazo al proceso general que involucra crear una tabla dinmica. Este
proceso puede ser dividido en tres pasos bsicos:

Primero, usted toma algunos datos guardados en un formato normalizado y crea


una tabla temporal con una versin desnormalizada (archivo plano) de esta
informacin.
Segundo, somete estos datos desnormalizados a Excel y crea la tabla dinmica.
Tercero, una vez que la tabla dinmica se ha creado, usted (o sus usuarios
finales) slo necesita repartir con Excel el archivo que cre. Desde ese
momento, usted (o sus usuarios finales) no necesita estar conectado a la base de
datos normalizada ni a la tabla desnormalizada.

La imagen siguiente muestra este proceso:

Paso 1. De datos normalizados a desnormalizados


En sistemas bien diseados, los datos se guardan en tablas normalizadas. Para crear una
tabla dinmica, antes necesita crear una versin desnormalizada de su base de datos.
Aunque esta desnormalizacin podra parecer un poco ineficiente, el hecho es que
cualquier herramienta de reportes (incluso el Generador de Reportes de VFP) requiere
que estos datos desnormalizados sean creados implcita o explcitamente.
Digamos, por ejemplo, que usted tiene una base de datos como la expuesta en el
siguiente diagrama. Este es el diagrama de la base de datos TestData que viene con VFP
7.

El proceso de crear una tabla desnormalizada es usualmente muy sencillo. Comienza


identificando todos los campos de todas las tablas que desea incluir en la tabla
dinmica. Por ejemplo, si usted quiere mostrar informacin por cliente, necesita incluir
el nombre del cliente (customer.company) en esta tabla desnormalizada. As mismo, si

quiere mostrar informacin por empleado necesita incluir el nombre del empleado
(employee.first_name) asociado a cada registro. En general necesita traer todos los
nombres descriptivos a la tabla desnormalizada y omitir las claves primarias.
Una vez identificada la informacin que desea incluir en la tabla dinmica, usted escribe
un programa en VFP para extraer esta informacin y guardarla en una tabla VFP. El
siguiente fragmento de cdigo muestra como puede crear una tabla desnormalizada para
las tablas expuestas antes (el cdigo completo se encuentra en GETDATA.PRG):
select customer.company,
;
customer.region,
;
customer.country,
;
orders.order_date,
;
employee.last_name as employeelast,
;
products.eng_name as "product",
;
orditems.quantity,
;
orditems.quantity * orditems.unit_price as linetotal;
from
customer
;
inner join orders on customer.cust_id =
orders.cust_id ;
inner join employee on orders.emp_id =
employee.emp_id ;
inner join orditems on orders.order_id =
orditems.order_id ;
inner join products on orditems.product_id =
products.product_id ;
into table data\pt_testdata

La siguiente imagen muestra un fragmento de los datos que se generarn con la


sentencia SQL anterior. Note cmo los campos company name, employee y product
ahora estn desnormalizados.

En el ejemplo anterior, para crear la tabla desnormalizada se necesita una sola sentencia
SQL Select. En aplicaciones de la vida real, sin embargo, el proceso puede ser ms
complejo y requerir varias sentencias SQL Select (potencialmente desde varias bases de

datos) ms una serie de etapas para "masajear" los datos hasta que tengan toda la
informacin que nosotros eventualmente necesitaremos en la tabla dinmica. Con sus
capacidades de manipulacin de datos, es fcil ver como VFP se ajusta bien a esta tarea.
Tenga en mente que, aunque la tabla desnormalizada sea una tabla VFP, no es necesario
que la fuente de datos sea VFP. Puede usar VFP para obtener datos desde cualquier base
de datos (ej. SQL Server u Oracle) va SQL Pass Through o vistas remotas.
Hay otros caminos que puede tomar para crear esta tabla desnormalizada y algunos son
aun ms poderosos que la tcnica usada en este artculo. Un mecanismo comn para
encarar esta tarea es mediante paquetes OLAP (On Line Analytical Processing) como el
que viene incluido en SQL Server. Estos mecanismos estn fuera del alcance de este
artculo. No obstante, usted debera recordar que cuando pasa a paquetes OLAP no
solamente incrementa las capacidades de tabla dinmica, sino tambin el precio y la
complejidad de la solucin.

Paso 2. Creando la tabla dinmica


Una vez que tiene sus datos desnormalizados, hay bsicamente dos mtodos que puede
seguir para crear la tabla dinmica.
Una opcin es copiar sus datos a una hoja dentro de un libro Excel y crear la tabla
dinmica usando estos datos. Aunque esta aproximacin trabaja bien en la mayora de
los casos, tiene una limitacin importante: solamente puede importar 65,000 registros a
una hoja de clculo Excel. Un ejemplo de cmo crear una tabla dinmica usando esta
aproximacin se encuentra en el programa CREATEPT1.PRG.
La otra opcin que usted puede seguir es crear la tabla dinmica desde una fuente de
datos externa (en vez de una hoja de clculo Excel). En este caso, usted pide a Excel
que lea los datos desde una tabla VFP va ODBC u OLE-DB. Excel a su vez lee estos
datos hacia una cach interna (pero sin mostrar los datos en la hoja) y entonces crea la
tabla dinmica. Esta es la tcnica usada en este artculo.
Es muy fcil crear una tabla dinmica desde VFP. Bsicamente, slo necesita usar OLEAutomation para instruir a Excel para que cree la tabla dinmica por usted. El siguiente
fragmento de cdigo muestra cmo crear la tabla dinmica programticamente (el
cdigo completo se encuentra en CREATEPT2.PRG).
* 1. Correr Excel va OLE-Automation.
oExcel = createobject("excel.application")
oExcel.Application.Visible = .T.
* 2. Crear un nuevo libro.
oWorkbook = oExcel.Workbooks.Add()
* 3. Definir un objeto range para volcar los resultados.
oTargetSheet = oWorkbook.Sheets.Add()
oTargetRange = oTargetSheet.range("A2")
* 4. Definir la cadena de coneccin ODBC y la sentencia SQL
* que Excel usar para leer los datos.
dimension aSource[2]

aSource[1] = "Driver={Microsoft Visual FoxPro Driver};" +;


"SourceDB=" + DATAPATH + ";SourceType=DBF;"
aSource[2] = "select * from pt_testdata"
* 5. Crear el objeto tabla dinmica de Excel.
oPivotTable = oExcel.Sheets[1].PivotTableWizard( 2,; && external data.
@aSource, oTargetRange, "PivotTable", .T., .T. )
* 6. Definir cmo se organizarn inicialmente los datos
dinmica.
oPivotTable.PivotFields("country").orientation = 1
&&
oPivotTable.PivotFields("yearmonth").orientation = 2 &&
oPivotTable.PivotFields("linetotal").orientation = 4 &&

en la tabla
row
column
data

Note cmo en el paso 5 estamos usando un mtodo de Excel llamado PivotTableWizard


para crear la tabla dinmica. El parmetro aSource indica a Excel que lea los datos
usando la coneccin ODBC y la sentencia SQL que hemos definido en el paso 4.
Aunque el Asistente de tabla dinmica simplifica el proceso de creacin de la tabla
dinmica, ello no le permite ver como organiza Excel internamente las tablas dinmicas.
La imagen siguiente, tomada del archivo de ayuda de Microsoft Excel Visual Basic
Reference, muestra los principales objetos usados por las tablas dinmicas.

Para crear una tabla dinmica, Excel primero lee los datos hacia un objeto interno (e
invisible) llamado PivotCache. La parte actualmente visible de la tabla dinmica es el
objeto PivotTable. Dentro de la tabla dinmica hay objetos PivotFields (que representan
campos guardados en la fuente de datos) y objetos PivotFormulas (que pueden ser
usados para representar campos calculados).
* 1. Correr Excel va OLE-Automation.
oExcel = createobject("excel.application")
oExcel.Application.Visible = .T.
* 2. Crear un nuevo libro.
oWorkbook = oExcel.Workbooks.Add()
* 3. Definir un objeto range para volcar dentro los resultados.
oTargetSheet = oWorkbook.Sheets.Add()
oTargetRange = oTargetSheet.range("A2")

* 4. Crear un objeto pivot cache.


oPivotCache = oWorkbook.PivotCaches.Add( 2 ) && external data
* 5. Establecer en el objeto pivot cache el OLE-DB provider
* y la sentencia SQL que Excel usar para leer los datos.
oPivotCache.Connection = "OLEDB;Provider=vfpoledb.1;data source=" +
DATAPATH
oPivotCache.Commandtext = "select * from pt_testdata"
* 6. Pedir al objeto pivot cache que cree la tabla dinmica
* con los datos.
oPivotTable = oPivotCache.CreatePivotTable( oTargetRange, "PivotTable"
)
* 7. Definir cmo se organizarn inicialmente los datos
dinmica.
oPivotTable.PivotFields("country").orientation = 1
&&
oPivotTable.PivotFields("yearmonth").orientation = 2 &&
oPivotTable.PivotFields("linetotal").orientation = 4 &&

en la tabla
fila
columna
datos

Los primeros tres pasos en este ejemplo son idnticos al ejemplo anterior. Sin embargo,
en los pasos 4 a 6 crearemos manualmente los objetos pivot cache y pivot table en vez
de usar el Asistente de tabla dinmica. Haciendo esto ahora podremos pedir a Excel que
lea los datos usando un OLE-DB provider en vez de ODBC.
Aunque el uso de un OLE-DB provider sobre un driver ODBC puede a simple vista no
parecer una ventaja, es ciertamente una mucho mejor estrategia si ud. considera que esto
evita totalmente que Excel intente usar Microsoft Query para leer los datos en el
PivotCache. Microsoft Query es un componente adicional que no todos los usuarios de
Excel tienen instalado y que es bastante difcil de configurar programticamente.

Paso 3. Usando la tabla dinmica


Una vez que la tabla dinmica ha sido creada y guardada en un archivo Excel, le toca a
usted decidir qu hacer con el mismo. Puede enviarlo por e-mail a sus usuarios o
ponerlo en un lugar compartido donde ellos puedan accederlo. Recuerde que una vez
creada la tabla dinmica, sus usuarios no necesitarn ms su copia de los datos
desnormalizados ya que Excel guarda su propia copia de los datos como parte del objeto
PivotCache.
Adems, dado que los datos son guardados internamente en el archivo Excel, los
usuarios seguirn teniendo las capacidades drill-down al usar la tabla dinmica, aunque
no estn conectados a la base de datos real ni a la tabla desnormalizada! Como puede
ver, la tarea se reduce a entregar un solo archivo Excel a los usuarios.
Puede agregar alguna funcionalidad extra al archivo Excel usando Visual Basic for
Applications (VBA). Por ejemplo, puede crear formularios (Microsoft Forms) en los
archivos Excel con command buttons y checkboxes. Este tema est fuera del alcance de
este artculo, pero hay muchos libros al respecto.

Allanando el camino

Con este artculo se incluye un set de clases que encapsulan el acceso a las tablas
dinmicas de Excel. La imagen siguiente muestra la jerarqua de estas clases. La nica
clase que usted necesita instanciar es la PivotTable. Esta clase llamar automticamente
a las otras.

El siguiente fragmento de cdigo muestra cmo usar la clase PivotTable para crear una
tabla dinmica para la tabla VFP llamada PT_TESTDATA.DBF (el cdigo completo
est en PT_SAMPLE.PRG y PT_CLASS.PRG).
oPT = createobject("pivottable" )
oPT.cSourceDBF = "c:\efox_pivot\data\pt_testdata.dbf"
oPT.cTargetXLS = "c:\efox_pivot\data\pt_testdata.xls"
oPT.Create()
oPT.SetField( "country", "row" )
oPT.SetField( "yearmonth", "column" )
oPT.SetField( "linetotal", "data" )
oPT.Save()

Como puede ver, esta clase simplifica bastante el proceso de crear la tabla dinmica ya
que usted no necesitar entenderse con Excel directamente, sino con una interfaz mucho
ms simple. Dado que se provee el cdigo fuente de esta clase, puede extenderlo y
adaptarlo a sus necesidades particulares.

Tablas Dinmicas de Excel y sus Usuarios


Las Tablas Dinmicas son una poderosa herramienta que usted puede proveer a sus
usuarios para ayudarlos a analizar datos desde mltiples ngulos. Uno de los beneficios
de esto es que, dado que muchos usuarios estn familiarizados con Excel, el tiempo de
entrenamiento puede ser reducido drsticamente sin sacrificar flexibilidad.
Una ventaja adicional de usar tablas dinmicas es la reduccin en el nmero de hits a la
base de datos activa, al dar a los usuarios informacin de consulta desde un set de datos
fuera de lnea. Los usuarios remotos y mviles apreciarn tambin las capacidades fuera
de lnea.

Finalmente, al dar a los usuarios esta flexible herramienta, puede reducir sus pedidos de
nuevos reportes. Con las tablas dinmicas los usarios pueden crear fcilmente esos
reportes, y tambin grficos, por s mismos, simplemente arrastrando datos a filas y
columnas. No hay nada ms fcil que esto.

Вам также может понравиться