Informes Con Visual Foxpro 9
Informes Con Visual Foxpro 9
Informes Con Visual Foxpro 9
CON
VISUAL FOXPRO 9
INDICE
INTRODUCCIN---------------------------------------------- 3
TABLAS USADAS EN ESTE DOCUMENTO -------------------------- 4
LA INTERFAZ CON EL USUARIO ------------------------------- 10
PROTECCIN DEL INFORME ----------------------------------- 11
Proteccin de objetos --------------------------------- 11
Nombres de campos de texto en tiempo de diseo -------- 17
ToolTips en tiempo de diseo -------------------------- 21
DATOS AGRUPADOS ------------------------------------------ 24
INFORMES CON MLTIPLES BANDAS DE DETALLE ----------------- 28
CLCULO DE TOTALES PREVIOS ------------------------------- 37
EL OBJETO REPORT LISTENER -------------------------------- 40
NUEVA VENTANA DE VISTA PREVIA (PREVIEW) ------------------ 43
CREANDO UNA PGINA WEB ----------------------------------- 46
CREANDO UN ARCHIVO XML ----------------------------------- 48
ENVIANDO EL ARCHIVO A UN GRFICO ------------------------- 51
ESTABLECIENDO LA VENTANA DE VISTA PREVIA ----------------- 53
POSICIONAMIENTO ABSOLUTO --------------------------------- 55
RECORTE DE LOS CAMPOS DE TEXTO --------------------------- 56
BARRAS CON COLORES ALTERNADOS ---------------------------- 58
CHECKBOXS EN LOS INFORMES -------------------------------- 59
INFORMES CON CORTES DE CONTROL FLEXIBLES ----------------- 61
CAMBIAR EL TAMAO DEL PAPEL ------------------------------ 65
HACKEANDO UN INFORME ------------------------------------- 67
Tipos de objeto --------------------------------------- 69
Cdigos de objeto ------------------------------------- 70
CONTANDO LA CANTIDAD DE GRUPOS --------------------------- 72
TRUCOS Y CONSEJOS ---------------------------------------- 76
CONCLUSIN ----------------------------------------------- 79
2
Walter R. Ojeda Valiente
INTRODUCCIN
Los informes son cruciales para nuestras aplicaciones, sirven tanto para
analizar los terabytes de datos que generan los usuarios como para que se
recuerden del nmero de telfono de la secretaria.
wrov@hotmail.com
3
Walter R. Ojeda Valiente
TABLA: PAISES
PAI_IDENTI N 2 && Identificador
PAI_NOMBRE C 20 && Nombre del pas
INDEX ON PAI_IDENTI TAG PAI01
INDEX ON PAI_NOMBRE TAG PAI02
TABLA: SUCURSALES
SUC_IDENTI N 2 && Identificador
TABLA: CLIENTES
CLI_IDENTI N 10 && Identificador
4
Walter R. Ojeda Valiente
TABLA: PRODUCTOS
PRD_IDENTI N 10 && Identificador
5
Walter R. Ojeda Valiente
TABLA: COBRANZAS
COB_IDENTI N 10 && Identificador
6
Walter R. Ojeda Valiente
7
Walter R. Ojeda Valiente
8
Walter R. Ojeda Valiente
9
Walter R. Ojeda Valiente
Como puedes ver, hay una pestaa para Page Layout, otra pestaa
para Optional Bands, otra pestaa para Data Grouping, etc. En un solo
cuadro de dilogo tienes todo lo que puedes necesitar.
10
Walter R. Ojeda Valiente
Proteccin de objetos
Si les permites a los usuarios modificar tu informe, entonces puedes
necesitar que exista un nivel de proteccin para que no hagan un desastre.
Ya sabes, usuarios bobos nunca faltan. Es por eso que en Visual FoxPro 9
existe una nueva palabra clave: PROTECTED
Recuerda que los usuarios podrn modificar este informe, tienen esa
posibilidad, nuestra aplicacin se los permite. Lo que haremos ahora ser
limitar la cantidad de errores que ellos puedan cometer.
11
Walter R. Ojeda Valiente
12
Walter R. Ojeda Valiente
13
Walter R. Ojeda Valiente
14
Walter R. Ojeda Valiente
15
Walter R. Ojeda Valiente
16
Walter R. Ojeda Valiente
17
Walter R. Ojeda Valiente
18
Walter R. Ojeda Valiente
Sin embargo, si el usuario hace doble clic sobre el campo Nombre del
Cliente ver la siguiente pantalla:
Captura 19. Al hacer doble clic sobre el campo de texto se ve el nombre real
19
Walter R. Ojeda Valiente
20
Walter R. Ojeda Valiente
21
Walter R. Ojeda Valiente
Ya que si escribimos:
MODIFY REPORT MiInforme PROTECTED
22
Walter R. Ojeda Valiente
Y por ese motivo no se les puede permitir editar los ToolTips o podran
escribir algo fuera de lugar. Si el usuario Luis edita al ToolTip y escribe una
estupidez, luego cuando el usuario Juan modifique al informe no ver al
ToolTip original sino la estupidez que escribi Luis. Evidentemente, eso no
estara bien, no es admisible.
23
Walter R. Ojeda Valiente
DATOS AGRUPADOS
AGRUPACIN SIMPLE
Listado 1.
CLOSE ALL
CLEAR ALL
SELECT 0
USE PAISES
SET ORDER TO TAG PAI01
SELECT 0
USE CLIENTES
SET ORDER TO TAG CLI03
SET RELATION TO CLI_IDEPAI INTO PAISES
24
Walter R. Ojeda Valiente
25
Walter R. Ojeda Valiente
26
Walter R. Ojeda Valiente
Listado 2.
CLOSE ALL
SELECT 0
USE PAISES
SET ORDER TO TAG PAI01
SELECT 0
USE SUCURSALES
SET ORDER TO TAG SUC01
SELECT 0
USE CLIENTES
SET ORDER TO TAG CLI03
SET RELATION TO CLI_IDEPAI INTO PAISES, ;
CLI_IDESUC INTO SUCURSALES
27
Walter R. Ojeda Valiente
28
Walter R. Ojeda Valiente
29
Walter R. Ojeda Valiente
30
Walter R. Ojeda Valiente
Fjate que como muy bien lo indica su nombre, lo que escribimos all
debe ser una expresin. O sea que si queremos poner el nombre de una tabla
o de un cursor, debemos escribirlo entre comillas. Pero tambin podramos
escribir una variable o una funcin, y eso es muy bueno porque nos permite
crear informes muy interesantes.
1. Dejar en blanco, eso significa que la tabla o cursor actual ser utilizado.
Esa es nuestra tabla principal.
2. Escribir el nombre de una tabla hija, la cual debe estar relacionada con
la tabla principal a travs de SET RELATION o a travs del Data
Environment del informe
3. Escribir el nombre de la tabla principal. Esto solamente podemos hacer
en la primera banda de detalles. Sirve para pedirle que procese todos
los registros de la tabla principal antes de pasar a la siguiente banda.
Las bandas de detalle tienen otras opciones ms, tal como habrs
observado en la Captura 29.: permiten empezar en una nueva pgina o en
una nueva columna, empezar en 1 cada vez que son procesadas, imprimir la
cabecera de la banda en cada pgina, y escribir los detalles en una nueva
pgina cuando la cantidad de espacio que resta en una pgina es menor que
un valor establecido.
31
Walter R. Ojeda Valiente
1. Cada una de las tablas de detalles debe estar relacionada con la tabla
de cabecera, no funcionar si no es as. Esa relacin puedes hacerla
mediante el comando SET RELATION o mediante el Data Environement
del informe.
2. Los nombres de los campos de texto deben estar precedidos por los
nombres de sus correspondientes tablas. Eso significa que no debemos
escribir VTC_FECHAX sino VENTASCAB.VTC_FECHAX, anlogamente no
32
Walter R. Ojeda Valiente
33
Walter R. Ojeda Valiente
34
Walter R. Ojeda Valiente
Listado 3
CLOSE ALL
SELECT 0
USE VENTASCAB
SET ORDER TO TAG VTC04 && Indexado por Identificador del Cliente
SELECT 0
USE COBRANZAS
SET ORDER TO TAG COB02 && Indexado por Identificador del Cliente
SELECT 0
USE CLIENTES
SET RELATION TO CLI_IDENTI INTO VENTASCAB, ;
CLI_IDENTI INTO COBRANZAS
35
Walter R. Ojeda Valiente
Cmo funciona?
36
Walter R. Ojeda Valiente
Cmo lo conseguimos?
37
Walter R. Ojeda Valiente
38
Walter R. Ojeda Valiente
Listado 4.
CLOSE ALL
SELECT 0
USE VENTASCAB
SET ORDER TO TAG VTC04
SELECT 0
USE CLIENTES
SET RELATION TO CLI_IDENTI INTO VENTASCAB
39
Walter R. Ojeda Valiente
Para indicarle al Visual FoxPro que queremos usar la forma nueva, hay
dos maneras:
a) Escribir:
SET REPORTBEHAVIOR 90
b) Escribir:
loListener = CreateObject(MiReportListener)
40
Walter R. Ojeda Valiente
Escribiendo:
SET REPORTBEHAVIOR 90
41
Walter R. Ojeda Valiente
Importante:
42
Walter R. Ojeda Valiente
43
Walter R. Ojeda Valiente
44
Walter R. Ojeda Valiente
Otra mejora que tenemos en Visual FoxPro 9 es que las opciones que
elegimos quedan guardadas y la siguiente vez que ejecutemos el informe
sern seleccionadas por defecto. Por ejemplo, si elegimos un zoom de 300%
la siguiente vez que ejecutemos el informe ser con un zoom de 300%.
45
Walter R. Ojeda Valiente
Listado 5.
Local loListener
loListener = .NULL.
CLOSE ALL
SELECT 0
USE VENTASCAB
SET ORDER TO TAG VTC04 && Indexado por Identificador cliente
SELECT 0
USE CLIENTES
SET RELATION TO CLI_IDENTI INTO VENTASCAB
SET REPORTBEHAVIOR 90
46
Walter R. Ojeda Valiente
47
Walter R. Ojeda Valiente
Listado 6.
Local loListener
loListener = .NULL.
CLOSE ALL
SELECT 0
USE VENTASCAB
SET ORDER TO TAG VTC04
SELECT 0
USE CLIENTES
SET RELATION TO CLI_IDENTI INTO VENTASCAB
SET REPORTBEHAVIOR 90
48
Walter R. Ojeda Valiente
En la Captura 45. vemos las primeras lneas del archivo .XML que el
Visual FoxPro 9 cre. El formato es correcto y completamente funcional.
49
Walter R. Ojeda Valiente
Listado 7.
loListener.TargetFileName = "Ventas a clientes 2.xml"
loListener.QuietMode = .F. && No muestra el mensaje
loListener.XMLMode = 2
50
Walter R. Ojeda Valiente
Listado 8.
Local loListener
loListener = CreateObject("ReportListener")
loListener.ListenerType = 3 && Grfico
CLOSE ALL
SELECT 0
USE VENTASCAB
SET ORDER TO TAG VTC04
SELECT 0
USE CLIENTES
SET RELATION TO CLI_IDENTI INTO VENTASCAB
SET REPORTBEHAVIOR 90
51
Walter R. Ojeda Valiente
52
Walter R. Ojeda Valiente
loPreview = .NULL.
with loPreview
.CanvasCount = 2
.ToolBarIsVisible = .T.
.Width = 800
.ZoomLevel = 4
endwith
loListener = CreateObject("ReportListener")
with loListener
.ListenerType = 1 && Vista previa
.PreviewContainer = loPreview
endwith
CLOSE ALL
SELECT 0
USE VENTASCAB
SET ORDER TO TAG VTC04
SELECT 0
USE CLIENTES
SET RELATION TO CLI_IDENTI INTO VENTASCAB
* Se muestra el informe
SET REPORTBEHAVIOR 90
53
Walter R. Ojeda Valiente
54
Walter R. Ojeda Valiente
POSICIONAMIENTO ABSOLUTO
Tal y como puedes ver en la Captura 49., ahora cada objeto se puede
posicionar en un lugar exacto, ya no hace falta que estemos con el mouse
subiendo y bajando y yendo de izquierda a derecha para colocarlo en el lugar
deseado. El posicionamiento absoluto facilita nuestro trabajo.
55
Walter R. Ojeda Valiente
Como puedes ver en la Captura 50., ahora hay 6 formas en las cuales
se puede recortar el texto (trim mode, en ingls).
56
Walter R. Ojeda Valiente
57
Walter R. Ojeda Valiente
58
Walter R. Ojeda Valiente
59
Walter R. Ojeda Valiente
60
Walter R. Ojeda Valiente
Supongamos que el gerente nos pide dos informes sobre las ventas,
contendrn los mismos datos, pero uno de ellos debe estar agrupado por
fechas y el otro debe estar agrupado por clientes. En una situacin as la gran
mayora de los programadores crearan dos informes. Sin embargo la forma
profesional es crear un solo informe.
Por qu?
61
Walter R. Ojeda Valiente
Listado 9.
SELECT ;
VTC_FECHAX, ;
VTC_FECHAX AS MIGRUPO, ;
VTC_NRODOC, ;
VTC_TOTALX, ;
CLI_NOMBRE AS VTC_NOMCLI, ;
VTC_IDECLI ;
FROM ;
VENTASCAB ;
JOIN ;
CLIENTES ;
ON VTC_IDECLI = CLI_IDENTI ;
ORDER BY ;
MIGRUPO ;
INTO CURSOR ;
MICURSOR
SELECT ;
VTC_FECHAX, ;
VTC_NRODOC, ;
VTC_TOTALX, ;
CLI_NOMBRE AS VTC_NOMCLI, ;
CLI_NOMBRE AS MIGRUPO ;
FROM ;
VENTASCAB ;
JOIN ;
CLIENTES ;
ON VTC_IDECLI = CLI_IDENTI ;
ORDER BY ;
MIGRUPO ;
INTO CURSOR ;
MICURSOR
62
Walter R. Ojeda Valiente
Donde como puedes ver, las ventas estn agrupadas por fechas. En la
segunda ejecucin vemos esto:
63
Walter R. Ojeda Valiente
Captura 57. Las ventas estn agrupadas por nombres de los clientes
Donde, como puedes ver, las ventas estn agrupadas por los nombres
de los clientes. En sntesis, hicimos un solo informe pero nos sirvi para
mostrar los registros agrupados con diferentes criterios. Muy bien, as hemos
ahorrado trabajo.
64
Walter R. Ojeda Valiente
Listado 10 (CAMBIAR_TIPO_PAPEL.PRG)
LParameters tcNombreInforme, tcTipoPapel
Local lcAlias
#DEFINE MSG_ICONO_ERROR 16
if Parameters() <> 2
=MessageBox("Debes enviar como parmetros el Nombre del Informe que
deseas cambiar y el tipo de papel que deseas que tenga (Carta, A4,
Oficio, etc.)", MSG_ICONO_ERROR, "Hay un problema")
Return
endif
lcAlias = Alias()
select 0
DO CASE
CASE tcTipoPapel == "A4"
REPLACE EXPR WITH SubStr(EXPR, 1, At("PAPERSIZE", EXPR) - 2) ;
+ "PAPERSIZE=9" ;
+ SubStr(EXPR, At("PAPERSIZE", EXPR) + 12)
REPLACE WIDTH WITH 77433.000
65
Walter R. Ojeda Valiente
USE
if !Empty(lcAlias)
SELECT (lcAlias)
endif
Return
*
*
Todos los informes, aunque sus archivos tienen la extensin .FRX son
en realidad tablas .DBF con otra extensin. Por lo tanto, podemos hacer un
USE de esas tablas/informes. No debemos olvidar colocar la extensin .FRX o
no se abrirn, ya que un USE supone que la extensin ser .DBF
66
Walter R. Ojeda Valiente
HACKEANDO UN INFORME
BROWSE
67
Walter R. Ojeda Valiente
68
Walter R. Ojeda Valiente
Tipos de objeto:
69
Walter R. Ojeda Valiente
Cdigos de objeto:
OBJTYPE OBJCODE
1=Definicin del informe Siempre 53
2 = Obsoleto Ya no se usa
3 = Obsoleto Ya no se usa
4 = Obsoleto Ya no se usa
5 = Etiqueta Siempre 0
6 = Lnea Siempre 0
7 = Rectngulo Siempre 4
8 = Campo de texto Siempre 0
9 = Banda 0 = Ttulo (Title)
1 = Encabezado de pgina (Page Header)
2 = Encabezado de columna (Column Header)
3 = Encabezado de grupo (Group Header)
4 = Detalle (Detail)
5 = Pie de grupo (Group Footer)
6 = Pie de columna (Column Footer)
7 = Pie de pgina (Page Footer)
8 = Resumen (Summary)
9 = Encabezado de detalle (Detail Header)
10 = Pie de detalle (Detail Footer)
10 = Grupo de objetos Siempre 0
17 = Imagen grfica Siempre 0
18 = Variable Siempre 0
21 = Obsoleto Ya no se usa
23 = Fuente Siempre 0
25 = Data Environment Siempre 0
26 = Cursor, Relation Siempre 0
Tabla 1. El significado de los campos OBJTYPE y OBJCODE
70
Walter R. Ojeda Valiente
Esto puede ser muy til para cambiar la impresora, la orientacin del
papel, el tamao del papel, o cualquier otra caracterstica que te interese.
71
Walter R. Ojeda Valiente
72
Walter R. Ojeda Valiente
73
Walter R. Ojeda Valiente
74
Walter R. Ojeda Valiente
Listado 11.
SELECT 0
USE PAISES
SET ORDER TO TAG PAI01
SELECT 0
USE CLIENTES
SET RELATION TO CLI_IDEPAI INTO PAISES
75
Walter R. Ojeda Valiente
TRUCOS Y CONSEJOS
1. Cmo puedo mostrar los nmeros de pgina en la forma Pgina X de
Y, dnde Y es la cantidad total de pginas?
4. Cmo puedo hacer que la impresora por defecto del Windows sea
tambin la impresora por defecto del Visual FoxPro?
SET PRINTER TO DEFAULT
76
Walter R. Ojeda Valiente
ENDIF
? laImpresoras[lnI]
ENDFOR
10. Quiero que los usuarios vean la vista previa pero que no puedan
imprimir el informe. Cmo lo hago?
77
Walter R. Ojeda Valiente
Listado 12.
Local loPreview
DO (_ReportOutput) WITH 1
loPreview = .NULL.
loPreview.AllowPrintFromPreview = .F.
_oReportOutput['1'].PreviewContainer = loPreview
78
Walter R. Ojeda Valiente
CONCLUSIN
wrov@hotmail.com
Walter.
79