20 de julio de 2015

Lo nuevo del Generador de Informes en VFP 9.0 - Parte 1

Articulo original: What's New in the Visual FoxPro 9.0 Report Writer
https://msdn.microsoft.com/en-us/library/ms965279.aspx
Autor: Cathy Pountney
Traducido por: Ana María Bisbé York


(Sesión What is new in the Visual FoxPro 9.0 Report Writer? presentada por la autora en la Conferencia DevEssentials Kansas, 2004)

Lea el artículo relacionado, El generador de informes en VFP en acción (Visual FoxPro 9.0 Report Writer In Action: https://msdn.microsoft.com/en-us/library/ms965281.aspx)


Resumen

Aprender sobre las nuevas características del Generador de informes Microsoft Visual FoxPro 9.0, incluyendo los entornos de datos reutilizables, protección de informes, y muchas mejoras en la interfaz de usuario. Aprenderá además, mejoras en el diseño de objetos, mejoras para usuarios internacionales, varias mejoras en la impresión y mejoras en la agrupación de datos. Además, aprenderá sobre dos de los mayores avances del Generador de informes en Visual FoxPro (VFP) 9.0: múltiples bandas de detalles y extensibilidad. Finalmente, aprenderá detalles sobre la estructura de la tabla Visual FoxPro (FRX).

Contenido

  • Introducción
  • Extensibilidad
  • Entorno de datos
  • Protección
  • Mejoras en la interfaz de usuario (UI)
  • Mejoras en el diseño de objetos
  • Características para uso internacional
  • Mejoras en la impresión
  • Mejoras en la agrupación de datos
  • Múltiples Bandas de detalle
  • La tabla FRX
  • Conclusión
  • Biografía

Introducción

Microsoft ha mejorado significativamente el Generador de informes de VFP 9.0, a la vez que reconoce la significativa inversión de los desarrolladores en el informe FRX actual. Sin embargo, el Generador de informes en VFP 9.0 Report Writer es compatible con los informes creados en versiones anteriores de VFP. El generador de informes en VFP 9.0 es una gran mezcla entre lo viejo y lo nuevo.

Extensibilidad

Antes de VFP 9.0, el motor del generador de informes controlaba todo, incluyendo el procesamiento de datos, la posición de los objetos, la generación, la impresión y la vista preliminar. No había forma de entrar en el motor de informes y personalizarlo, como se puede en otras áreas de VFP. Uno de los cambios más significativos en el Generador de informes es su nueva capacidad de extensibilidad. El Diseñador de informes (Report Designer), Motor de informes (Report Engine) y Contenedor preliminar (Preview Container) están expuestos al desarrollador.

Generador de Informes

El Generador de informes (Report Write) en VFP 9.0 incluye una nueva característica en tiempo de diseño llamada Builder Hooks. Varios eventos del Diseñador de informes (Report Designer) están expuestos en un componente Xbase independiente llamado Report Builder, puede ser invocado para ser manipulado. Esta aplicación puede ser utilizada para invocar nuestros propios cuadros de diálogo, aumentar el comportamiento nativo del Diseñador de informes o sobrescribir este comportamiento nativo.

VFP incluye una aplicación extendida en el Generador de Informes, que incluye nuevas características y proporciona una mejor interfaz de usuario para diseño de informes. El Generador de informes es controlado por una nueva variable del sistema, _REPORTBUILDER. Si esta variable está vacía, se muestra el cuadro de diálogo nativo. Para activar el gancho al generador, establezca esta variable a la aplicación correspondiente. Por ejemplo, para utilizar el Generador de informes que viene con VFP 9.0, utilice el siguiente comando:

_REPORTBUILDER = HOME() + "REPORTBUILDER.APP"

Algunas partes de este artículo asumen que está presente el diálogo nativo y la variable de sistema _REPORTBUILDER está vacía. Otros lugares asumen que se encuentra el nuevo cuadro de diálogo y la variable de sistema _REPORTBUILDER tiene valor "REPORTBUILDER.APP." Si no experimenta el comportamiento descrito o no ve los diálogos descritos, puede solucionar el problema, cambiar el valor de _REPORTBUILDER.

Motor de informe (Report Engine)

En el nuevo sistema de salida (Object-Assisted Output), el motor de informe manipula tareas centradas en datos (data-centric chores), como es el movimiento entre los límites y la evaluación de expresiones. Sin embargo, cuando llega el momento de crear la salida, atrasa el trabajo a una nueva clase base llamada ReportListener. La nueva clase genera el contenido del informe en forma más sofisticada, utilizando GDI+, y además ofrece a los usuarios Xbase la posibilidad de interactuar con el proceso de salida. La Figura 1 muestra cómo se ajustan todas las piezas.


Figura 1. Utilice la nueva clase ReportListener para manipular informes.

Para utilizar una clase ReportListener, utilice la cláusula nueva del comando REPORT FORM como se muestra a continuación:

oListener = CREATEOBJECT("ReportListener")
oListener.ListenerType = 1 && Presentación preliminar, o 0 para Imprimir
REPORT FORM <name> <clauses> OBJECT oListener

VFP 9.0 proporciona además una segunda técnica para utilizar una clase ReportListener. Puede establecer el valor para la nueva variable del sistema, _REPORTOUTPUT, al nombre de una aplicación que pueda determinar que clase ReportListener utilizar basada en el tipo de salida que se ha escogido.

Cuando se utiliza (Object-Assisted Output), un informe se procesa utilizando uno de dos modos fundamentales, en dependencia del valor de la propiedad ListenerType. Puede escoger entre estos dos modos print-appropriate (imprimir) y preview-appropriate (presentación preliminar), o page-at-a-time (una página cada vez) y all-pages-at-once (todas las páginas de una vez). En el primer modo, el Listener desencadena un evento OutputPage y prepara cada página, justo como si se enviara cada página a la cola de impresión.

En el segundo modo, el Listener prepara todas las páginas para la generación y las guarda en memoria (caché). Cuando esto finaliza, puede invocar el método OutputPage para preguntar qué página de todas incluidas en la salida por número de página.

Contenedor preliminar (Preview Container)

En VFP 9.0, otra pieza importante en el puzzle de extensibilidad es el Contenedor preliminar. Con este gancho, puede utilizar el nuevo contenedor preliminar que viene con VFP 9.0 o escribir su propio contenedor. El antiguo contenedor preliminar nativo está aún disponible cuando no se está utilizando la nueva salida asistida por objetos.

Una nueva variable de sistema, _REPORTPREVIEW, contiene el nombre de la aplicación que determina qué contenedor preliminar utilizar. De forma predeterminada, esta variable apunta a ReportPreview.app. Esta nueva aplicación contiene un gran número de mejoras sobre el antiguo contenedor preliminar incluyendo: más niveles de zoom, control de la barra de herramientas, control del encabezado, presentación de múltiples páginas, y mejor calidad utilizando GDI+. Las Figuras 2 y 3 muestran las diferencias entre la presentación antigua y la actual.


Figura 2. La salida en el contenedor preliminar antiguo no es muy clara.


Figura 3. El nuevo contenedor preliminar tiene mucha más calidad y opciones más sofisticadas.

Observe la diferencia en calidad entre los contenedores viejo y nuevo. El nuevo contenedor tiene las fuentes mucho más claras que el viejo. Puede comprobarlo utilizando GDI+ para la salida de la información. Observe además, la diferencia en la barra de herramientas anclada. El nuevo estilo de la barra de herramientas tiene opciones nuevas, incluyendo presentación de múltiples páginas.

Salida Tradicional

Un comando nuevo, SET REPORTBEHAVIOR, puede ser utilizado para encender o apagar la salida asistida por objetos. El motor generador de la nueva salida y la nueva superficie Preliminar tienen diferencias significativas entre los estilos de salida antiguo y actual. La alineación, interlineado, y el espaciado es diferente entre GDI y GDI+, con el que podrían haber cambios significativos sobre cómo se vean los informes existentes. Por tanto, se establece de forma predeterminada REPORTBEHAVIOR en 80, lo que apaga la salida asistida por objetos y el informe se procesa como antes de VFP 9.0.

Si desea activar la salida asistida por objetos de forma global, puede cambiar el valor de esta configuración en el cuadro de diálogo Opciones (Options) (mostrado en la Figura 4), o puede escribir el siguiente comando:

SET REPORTBEHAVIOR 90


Figura 4. Utilizar la opción Comportamiento en tiempo de ejecución (Run-time behavior) en el cuadro de diálogo Opciones (Options) para cambiar la configuración de SET REPORTBEHAVIOR.

Cuando REPORTBEHAVIOR se establece en 90, el comando REPORT FORM automáticamente actúa como si pensara que se utiliza la cláusula OBJECT, sin cambios posteriores en su código. VFP utiliza la variable del sistema _REPORTOUTPUT para determinar qué aplicación utilizar para nominar la clase ReportListener apropiada para cada comando REPORT FORM.

Con las nuevas características de extensibilidad en el Generador de informes de VFP 9.0 (Report Writer), es posible tocar el Generador de informes (Report Builder), el Motor de informe (Report Engine), y el área preliminar (Preview surface). Puede activar globalmente las nuevas características o puede activarlas para informes individuales. Puede además dejarlas desactivadas y ejecutar los informes como si estuviera en las versiones anteriores de VFP.

Para más información sobre cómo utilizar la Salida asistida por objetos, vea: El Generador de informes de VFP 9.0 en acción. The VFP 9.0 Report Writer In Action.

Entornos de datos

El Generador de informes de VFP 9.0 (Report Writer) permite ahora compartir Entornos de datos con otros informes. El entorno de datos puede ser guardado como una clase y luego cargado en informes, según la necesidad. Esto brinda nuevas posibilidades para definir y reutilizar entornos en informes con escenarios similares.

Guardar como clase (Save As Class)

Para guardar un Entorno de datos como clase, comience por definir el entorno en el informe, como siempre. Con la ventana Entorno de datos (Data Environment) activa, seleccione la opción Guardar como clase... (Save As Class...) en el menú Archivo (File) (vea Figura 5).

 
Figura 5. Una nueva opción "Guardar como clase..." ("Save As Class...") se muestra en el menú Archivo (File) cuando el Entorno de Datos es la ventana activa.

Después de seleccionar la opción Guardar como clase (Save As Class...) el cuadro de diálogo Guardar como clase (Save As Class) aparece como se muestra en la Figura 6. El botón DataEnvironment del Grupo de opciones Save es el único botón habilitado cuando se guarda un Entorno de datos Data Environment de un informe.


Figura 6. Utilice el cuadro de diálogo Guardar como clase (Save As Class) para declarar el nombre de la nueva clase y la biblioteca de clase para guardar el entorno de datos del informe.

Escriba un nombre para la clase en el cuadro de texto Nombre (Name). Luego, escriba el nombre de la librería de clase en la que desea sea guardada la nueva clase. Si introduce el nombre de una biblioteca de clases que no existe, la nueva biblioteca de clases se crea automáticamente. Puede utilizar el botón de comando elipse (...) para localizar una biblioteca de clases existente. Finalmente puede, opcionalmente, escribir una descripción para la nueva clase.

Cargar un Entorno de datos (DE)

Además de definir manualmente el Entorno de datos para un nuevo informe, VFP 9.0 ofrece la opción de cargar un Entorno de datos de un informe ya existente o de una clase DataEnvironment guardada previamente. La opción Cargar Entorno de datos... (Load Data Environment...) en el menú Informe (Report) (vea Figura 7) permite seleccionar el Entorno de datos a cargar.


Figura 7. Utilizar la opción Load Data Environment... para cargar un Entorno de datos desde un informe existente o una clase DataEnvironment.

Nota La característica Cargar Entorno de datos está disponible sólo a través de los cuadros de diálogo del nuevo ReportBuilder. Debe escribir _REPORTBUILDER = HOME() + "ReportBuilder.app" para poder aprovechar las ventajas de esta característica.

Desde un Informe

Al cargar el Entorno de datos desde otro informe, todo el código y los miembros del Entorno original se copian en el nuevo informe. Esto significa que cualquier cambio que e realice en el Entorno del informe original después de ser copiado no se va a reflejar en el informe creado a partir del informe original.

El cuadro de diálogo Propiedades de informe (Report Properties), aparece, como se muestra en la Figura 8, luego de seleccionar la opción (Load Data Environment...) del menú Informe (Report). Utilice este menú para seleccionar el informe del que desea copiar el entorno al informe actual.

 
Figura 8. Utilice la ficha Entorno de datos (Data Environment) del cuadro de diálogo Propiedades de informe (Report Properties) para seleccionar de qué informe desea copiar el Entorno de datos (Data Environment).

Seleccione el botón Copiar de otro archivo de informe (Copy from another report file) y haga Clic en el botón Seleccionar... (Select...). Esto invoca el cuadro de diálogo Abrir (Open) para que pueda seleccionar a partir de qué informe copiar. Una vez escogido el informe, se muestra un cuadro de diálogo de confirmación (vea Figura 9).


Figura 9. Confirme sus intenciones de copiar un Entorno de datos utilizando este cuadro de diálogo.

VFP 9.0 permite copiar el Entorno de datos de otro informe al informe actual. Sin embargo, VFP 9.0 notifica que sobre-escribirá el Entorno de datos actual y debe hacer Clic en Si (Yes) para continuar. Esto ayuda a recordar que cualquier cosa que se haya definido en el Entorno de datos del informe actual será sobre-escrito. Si hace Clic en No, los cambios no se realizan y el proceso es interrumpido. Cuando hace Clic en Yes, el Entorno de datos es copiado y se notifica con el cuadro de diálogo que se muestra en la Figura 10.


Figura 10. Este cuadro de diálogo confirma que el Entorno de datos ha sido copiado exitosamente al informe actual.

Ya tiene una copia del Entorno de datos. Puede manipularlo según sus necesidades. Sin embargo, recuerde que cualquier cambio que se haga sobre el Entorno de datos del informe original a partir de este momento, no se reflejará en este.

A partir de una clase DataEnvironment

Al cargar un Entorno de datos desde una clase, se agrega código al Entorno de datos del nuevo informe para enlazarlo con la clase DataEnvironment original e instanciarla en tiempo de ejecución. Esto significa que los cambios que pueden realizarse en el futuro sobre la clase DataEnvironment se van a propagar a cualquier informe que emplee esta clase DataEnvironment.

Utilizando el cuadro de diálogo Propiedades de informe (Report Properties), que se muestra en la Figura 8, haga Clic en el botón Enlazar a una clase DE visual (Link to a visual DE class). Luego, haga Clic en el botón Seleccionar... (Select...) para invocar el cuadro de diálogo Abrir (Open) que puede utilizar para seleccionar qué librería de clases y qué clase desea utilizar. Después de seleccionar una clase, se muestra el mismo cuadro de diálogo de confirmación mostrado en la Figura 9. Después de confirmar sus intenciones, el Entorno de Datos es actualizado y se notifica que ha finalizado con el cuadro de diálogo mostrado en la Figura 10.

En este punto, se agrega código a algunos de los métodos del Data Environment. Algunos de los métodos tienen un código tan simple como un único comando DODEFAULT(). La razón para esto es que BindEvents() no funciona si al menos no hay una línea de código.

Código del Entorno de datos

Al cargar un Entorno de Datos a partir de una clase automáticamente agrega código a varios métodos como se muestra y se describe a continuación

Método Init

El siguiente código en el Init es necesario para garantizar que BindEvents() funcione como es esperado.

*---------------------------------------------------------------*
* ESTE CODIGO DE METODO ES AGREGADO POR EL GENERADOR DE INFORME *
*---------------------------------------------------------------*
DODEFAULT()

Método BeforeOpenTables

El siguiente código crea una nueva propiedad en el Data Environment que guarda una referencia de objeto a la clase DataEnvironment que ha sido cargada. Luego, los eventos en este Data Environment se limitan a los eventos de la clase DataEnvironment. Sin embargo, los eventos Init y Destroy no están enlazados. Finalmente, se dispara el evento BeforeOpenTables de la clase DataEnvironment.

*---------------------------------------------------------------*
* ESTE CODIGO DE METODO ES AGREGADO POR EL GENERADOR DE INFORME *
*---------------------------------------------------------------*
LOCAL loMember, laDEEvents[1], liMember, liMembers, loBoundMember
THIS.AddProperty( "BoundDE", NEWOBJECT( "de_insurance", "c:vfp9rwde.vcx" ))
IF VARTYPE( THIS.BoundDE ) = "O" AND UPPER( THIS.BoundDE.BaseClass ) = "DATAENVIRONMENT"
* Enlaza eventos aquí, saltando Init y Destroy.
* El FRX DE y sus miembros solo pueden tener eventos de la clase base,
* por lo que es necesario mucho chequeo de PEMSTATUS:
liMembers = AMEMBERS( laDEEvents, THIS, 3 )
FOR liMember = 1 TO liMembers
IF INLIST( UPPER( laDEEvents[ liMember, 1] ), "INIT", "DESTROY" )
LOOP
ENDIF
IF INLIST( UPPER( laDEEvents[ liMember, 2] ), "EVENT", "METHOD" )
BINDEVENT( THIS, ;
laDEEvents[ liMember, 1], ;
THIS.BoundDE, ;
laDEEvents[ liMember, 1] )
ENDIF
ENDFOR
* Ahora los miembros con verificación apropiada,
* saltándose nuevamente Init y Destroy:
FOR EACH loMember IN THIS.Objects
IF PEMSTATUS( THIS.BoundDE, loMember.Name, 5 ) AND ;
UPPER( PEMSTATUS( THIS.BoundDE, loMember.Name, 3 ) = "OBJECT"
loBoundMember = EVAL( "THIS.BoundDE." + loMember.Name )
IF ( loBoundMember.BaseClass == loMember.BaseClass )
liMembers = AMEMBERS( laDEEvents, loMember, 3 )
FOR liMember = 1 to liMembers
IF INLIST( UPPER( laDEEvents[ liMember, 1] ), "INIT", "DESTROY" )
LOOP
ENDIF
IF INLIST( UPPER( laDEEvents[ liMember, 2] ), "EVENT", "METHOD" )
BINDEVENT( THIS, ;
laDEEvents[ liMember, 1], ;
loBoundMember, ;
laDEEvents[ liMember, 1] )
ENDIF
ENDFOR
ENDIF
ENDIF
ENDFOR
THIS.BoundDE.BeforeOpenTables()
ENDIF

Método AfterCloseTables

El siguiente código en el método AfterCloseTables es necesario para asegurar que el BindEvents() trabaje de la forma esperada.

*---------------------------------------------------------------*
* ESTE CODIGO DE METODO ES AGREGADO POR EL GENERADOR DE INFORME *
*---------------------------------------------------------------*
DODEFAULT()

Método Method

El siguiente código es agregado al método Destroy desenlaza métodos desde el Entorno de datos de este informe a la clase DataEnvironment. El código elimina además la referencia de objeto a la clase DataEnvironment.

*---------------------------------------------------------------*
* ESTE CODIGO DE METODO ES AGREGADO POR EL GENERADOR DE INFORME *
*---------------------------------------------------------------*
LOCAL loMember
UNBIND( THIS )
FOR EACH loMember in THIS.Objects
UNBIND( loMember )
ENDFOR
IF PEMSTATUS( THIS, "BoundDE", 5 ) AND UPPER( PEMSTATUS( THIS, "BoundDE", 3 )) = "PROPERTY"
THIS.BoundDE = NULL
ENDIF

Método Error

El siguiente código en el método Error es necesario para asegurar que el BindEvents() trabaje de la forma esperada.

*---------------------------------------------------------------*
* ESTE CODIGO DE METODO ES AGREGADO POR EL GENERADOR DE INFORME *
*---------------------------------------------------------------*
LPARAMETERS nError, cMethod, nLine
DODEFAULT( nError, cMethod, nLine )

Protección

En VFP 9.0, puede crear protección para uno o más objetos al utilizar el Diseñador de Informes o Diseñador de etiquetas. Esto ofrece la posibilidad de que el usuario pueda modificar un informe, sin permitirle aún hacer determinados cambios.

Configurar las banderas de protección (Setting Protection Flags)

A los objetos se les puede aplicar cinco modos diferentes de protección, los objetos Field tienen una opción de protección adicional. A las bandas se les puede configurar dos modos de protección diferentes. El informe como tal tiene varias opciones de protección.

Nota: La nueva característica Protección está disponible sólo a través de los cuadros de diálogo del nuevo ReportBuilder. Debe escribir _REPORTBUILDER = HOME() + "ReportBuilder.app" para poder aprovechar las ventajas de esta característica.

Proteger un objeto

Para proteger un objeto en el Diseñador de Informes, seleccione el cuadro de diálogo Propiedades (Properties) para el objeto. El cuadro de diálogo Propiedades puede ser invocado desde en menú Informe (Report) después de seleccionar el objeto, desde el menú contextual del objeto, o haciendo doble clic en el objeto. La Figura 11 muestra la ficha Protección (Protection) en el cuadro de diálogo Propiedades para un objeto Field.

 
Figura 11. Utilice la ficha Protección (Protection) del cuadro de diálogo Propiedades (Properties) para establecer los modos de protección a los objetos.

Puede establecer los siguientes modos de protección para los objetos:

  • Marque la casilla de verificación El objeto no puede ser movido ni redimensionado (Object cannot be moved or resized) para evitar que el usuario mueva los objetos a posición diferente en el área de diseño y/o los redimensione.
  • Marque la casilla de verificación El objeto no puede ser modificado (Object cannot be edited) para evitar que el usuario haga cualquier cambio en las propiedades de éste.
  • Marque la casilla de verificación El objeto no puede ser eliminado (Object cannot be deleted) para evitar que el usuario elimine este objeto.
  • Marque la casilla de verificación El objeto no puede ser seleccionado (Object cannot be selected) para evitar que el usuario seleccione este objeto. Cuando se selecciona esta opción, también se seleccionan las opciones de protección: El objeto no puede ser movido ni redimensionado, El objeto no puede ser modificado y El objeto no puede ser eliminado (Object cannot be moved or sized, Object cannot be edited, y Object cannot be deleted.)
  • Marque la casilla de verificación El objeto no está visible en el Diseñador (Object is not visible in Designer) para evitar que este objeto aparezca en el Diseñador de informes en modo protegido. Al seleccionar esta opción, las cuatro opciones restantes también se seleccionan.

La porción Design-time caption de este cuadro de diálogo solo se aplica a los objetos Field. La cadena literal escrita en este cuadro de texto es mostrada en el Diseñador de Informes, en lugar de Expresión (Expression). Esto brinda una oportunidad para mostrar algo que sea familiar al usuario en lugar de una expresión complicada.

Proteger una banda

Para proteger una banda en el Diseñador de Informes, seleccione el cuadro de diálogo Properties para la banda. El cuadro de diálogo Properties puede ser invocado desde la opción Edit Bands... del menú Report, desde el menú contextual de la banda o haciendo doble clic en la barra gris de la banda. La Figura 12 muestra la ficha Protection en el cuadro de diálogo Properties para esa banda.


Figura 12. Utilice la ficha Protección (Protection) del cuadro de diálogo Propiedades de banda (Band Properties) para establecer los modos de protección de la banda.

Puede establecer los siguientes modos de protección para las bandas:

  • Marque la casilla de verificación La banda no puede ser modificada (Band cannot be edited) para hacer inaccesible al usuario el cuadro de diálogo Propiedades de la banda (Band Properties).
  • Marque la casilla de verificación La banda no puede ser redimensionada (Band cannot be resized) para hacer que el usuario no pueda redimensionar la banda.

Proteger un informe

Para establecer protección general al informe, seleccione el cuadro de diálogo Propiedades de informe (Report Properties. Puede llamar este cuadro de diálogo seleccionando Propiedades (Properties) desde el menú Informes (Report) o desde el menú contextual del informe. La Figura 13 muestra la ficha Protección (Protection) en el cuadro de diálogo Propiedades del Informe (Report Properties).


Figura 13. Utilice la ficha Protección (Protection) del cuadro de diálogo Propiedades de Informe para establecer modos generales de protección para el informe.

La parte superior de este cuadro de diálogo permite definir qué fichas del diálogo Propiedades de Informe (Report Properties) están disponibles para el usuario. Para cada selección hecha en esta área, se muestra inhabilitada la correspondiente ficha en el cuadro de diálogo.

La opción Protección (Protection) siempre está seleccionada e inhabilitada. La opción Regla/Rejilla está inhabilitada porque la ficha no puede ser protegida, sin embargo, aparece en el cuadro de diálogo de tal forma que la selección sea consistente con las fichas en el cuadro de diálogo Informes (Report).

La parte inferior de este diálogo permite definir cuáles son las opciones del menú disponibles para el usuario. Para cada selección en esta área, se inhabilita la correspondiente opción del menú.

Respetar banderas de protección

Para invocar la protección durante una sesión del Diseñador de informes o Diseñador de etiquetas, utilice la palabra clave PROTECTED como se muestra en los siguientes ejemplos:

CREATE REPORT MiInforme PROTECTED
MODIFY REPORT MiInforme PROTECTED
CREATE LABEL MiEtiqueta PROTECTED
MODIFY LABEL MiEtiqueta PROTECTED

Si no se utiliza la palabra clave PROTECTED, el Diseñador de Informes trabaja como si no se aplicara protección a los objetos.

Mejoras en la Interfaz de usuario

Se han hecho muchos cambios en la interfaz de usuario para hacer el diseño de informes más fácil e intuitivo. Los menús se han reacondicionado, han cambiado los menús contextuales, y se han agregado nuevas opciones a la barra de herramientas del Diseñador de Informes. El cuadro de diálogo Generador de expresión (Expression Builder) y el cuadro de diálogo Opciones del generador de expresión (Expression Builder Options) tienen un nuevo comportamiento, y se han agregado otras mejoras de de la interfaz de usuario del Generador de informes de VFP 9.0.

Menús

El menú Informes se ha reacondicionado en VFP 9.0 para acomodar nuevas opciones. Además, algunas opciones han sido renombradas para ganar en claridad y otras opciones se repiten en diferentes menús para facilitar el acceso. Las Figuras 14-16 muestran los cambios en los menús nuevos.


Figura 14. La nueva opción "Salvar como clase..." ("Save As Class...") se muestra en el menú Archivo (File).


Figura 15. Se agregó una nueva opción a la barra de herramientas del Diseñador de Informes y se agregaron las líneas horizontales para separar las opciones Grid Lines y Show Position del resto de las opciones.


Figura 16. Se muestran muchos cambios en el menú de informes, incluyendo opciones renombradas, opciones nuevas y agregar la opción Print Preview.

Menús contextuales

Los menús contextuales existentes han sido mejorados con elementos adicionales y más consistencia con los cuadros de diálogos a los que invocan. Otros elementos en el Diseñador de informes que previamente no tenían menús contextuales, ahora sí lo tienen. Las Figuras 17-19 muestran los cambios nuevos.


Figura 17. El menú contextual global tiene nuevas opciones y una opción renombrada.


Figura 18. El nuevo menú contextual para la banda se invoca haciendo Clic derecho en la barra gris de una banda.


Figura 19. El menú contextual para el diseño de objetos se invoca haciendo Clic derecho sobre cualquier objeto del informe.

Barra de herramientas (Toolbar)

La barra de herramientas del Diseñador de informes tiene botones nuevos, como se muestra en la Figura 20.


Figura 20. Se han agregado nuevas opciones para Page Setup y Font Properties en la barra de herramientas del Diseñador de informes.

Cuadro de diálogo Generador de expresiones (Expression Builder)

Se han hecho algunos cambios en el cuadro de diálogo Expresiones de informe (Report Expression). La Figura 21 muestra el cuadro de diálogo Report Expression expandido, lo que permite más espacio para escribir una expresión del informe.


Figura 21. Aprovecha las ventajas del cuadro de edición más grande para "Expresión para el campo en el informe" "Expression for Field on Report:" cuando se introducen expresiones más largas.

Cuando la variable de sistema _REPORTBUILDER está vacía el comportamiento nativo para el cuadro de diálogo Generador de expresión (Expression Builder) es como sigue. Solamente tablas definidas en el Entorno de datos se listan en la lista Campos (Fields). Las tablas abiertas fuera del Entorno de Datos no están disponibles en esta lista.

Cuando la variable de sistema _REPORTBUILDER tiene valor ReportBuilder.app, the el comportamiento para el cuadro de diálogo Generador de expresión (Expression Builder) es algo diferente. Ante todo, es invocado el Generador de expresiones definido en _GETEXPR en lugar del Generador de expresiones nativo. La Figura 22 muestra el cuadro de diálogo Generador de expresión predeterminado.


Figura 22. Utilice el cuadro combinado "Desde la tabla" ("From table") para seleccionar los campos de cualquier tabla abierta.

Este cuadro de diálogo Generador de expresiones tiene un cuadro combinado para seleccionar qué tabla debe ser utilizada al listar los campos en la lista Campos (Fields). Sin embargo, en el cuadro combinado aparecen solamente las tablas que están actualmente en uso. Este es un punto importante a recordar ya que las tablas definidas en el Entorno de datos no se abren automáticamente por el Diseñador de Informes, por tanto, no aparecerán automáticamente en el cuadro combinado.

Esta característica brinda la capacidad de controlar las tablas que están disponibles para el usuario final cuando se permite modificar informes dentro de la aplicación. Puede definir algunas tablas que necesita; pero que no desea que el usuario entre a ellas en el Entorno de datos. Entonces, ya que tiene que abrir específicamente las tablas a las que va a permitir el acceso de los usuarios, puede omitir cualquier tabla que desea mantener fuera de su alcance.

Cuadro de diálogo Opciones del generador de expresiones

El grupo de opciones Alias de campos (Field aliases) se habilita ahora en el cuadro de diálogo Opciones del generador de expresiones como se muestra en la Figura 23. Este grupo de opciones le permite indicar si desea agregar el alias a la expresión de informe cuando se selecciona el campo en el cuadro de diálogo Generador de expresiones.


Figura 23. Utilice el grupo de opciones Field aliases para indicar si las alias de los campos se agregan a los campos seleccionados desde el cuadro de diálogo Generador de expresiones.

Los botones de opciones Agregar Alias siempre (Always add alias) y No agregar nunca Alias (Never add alias) provocan que VFP 9.0 agregue automáticamente el Alias de la tabla, o no agregue el Alias de la tabla, para todos los campos. El comportamiento del botón Add non-selected alias only depende del valor de la variable del sistema _REPORTBUILDER. Si la variable del sistema _REPORTBUILDER está vacía, cualquier campo seleccionado de una tabla que no es InitialSelectedAlias tiene el nombre de la tabla como prefijo. Los campos desde la tabla InitialSelectedAlias no tienen el alias de la tabla como prefijo.

Si la variable del sistema _REPORTBUILDER tiene valor ReportBuilder.app, la opción (Add non-selected alias only) utiliza una lógica diferente, El alias actualmente seleccionada se utiliza en lugar de (InitialSelectedAlias para determinar si se va a poner el prefijo de los alias de tablas a los campos o no.

Además de seleccionar un campo desde el cuadro de diálogo Generador de expresión (Expression Builder) arrastrando un campo desde el Entorno de datos al área de diseño del informe respeta la configuración del grupo de opciones (Field aliases). Además, existe una nueva opción en la ficha Informe (Report) del cuadro de diálogo Opciones (Options) como se muestra en la Figura 24. Esta opción determina que se mantenga la configuración predeterminada de (Field aliases) para todos los informes nuevos.


Figura 24. Utilice la opción del Generador de expresiones (Expression Builder) en la ficha Informes (Reports) del cuadro de diálogo Opciones (Options) para establecer el comportamiento predeterminado para el Generador de expresiones (Expression Builder).

Otras mejoras en la interfaz de usuario

Se han realizado otro grupo de mejoras en la interfaz de usuario que mejoran el diseño de informes.

Cursor del ratón

El cursor del ratón ha cambiado para proporcionar una clave visual de cuando el objeto puede ser redimensionado (vea la Figura 25).


Figura 25. Utilice el nuevo cursor del ratón para saber si un objeto puede ser redimensionado.

Cuadro de diálogo Selección múltiple

En VFP 9.0 existe el cuadro de diálogo Selección múltiple (Multiple Selection) que permite establecer las propiedades Protección (Protection) e Imprimir cuando (Print when) para más de un objeto de diseño a la vez. Permite además cambiar cualquier otra propiedad de Protección a un objeto individual. Para utilizar esta nueva característica, seleccione más de un objeto, y luego haga doble clic en cualquiera de ellos para llamar al cuadro de diálogo Selección múltiple (Multiple Selection) que se muestra en la Figura 26.


Figura 26. Utilice la ficha Selección (Selection) del cuadro de diálogo Selección múltiple (Multiple Selection) para escoger con qué objetos desea trabajar.

Los objetos que fueron seleccionados cuando se ha invocado este cuadro de diálogo se listan en la primera ficha de este cuadro de diálogo. Para trabajar con todos los objetos definidos en un informe, utilice CTRL+A para seleccionarlos todos antes de llamar a este cuadro de diálogo.

La opción Ordenar por (Sort by) permite ordenar la lista de objetos por Tipo (Type) o Ubicación (Location) dentro del informe. El botón Quitar de la lista (Remove from list) elimina los objetos seleccionados en la lista. Hacer Doble-clic en cualquier elemento de la lista, invoca el correspondiente cuadro de diálogo Propiedades (Properties) para el objeto que se ha seleccionado individualmente. La ficha Propiedades (Properties) del cuadro de diálogo Selección múltiple mostrado en la Figura 27, se utiliza para cambiar las propiedades de todos los elementos listados en la ficha Selección (Selection).


Figura 27. Utilice la ficha Propiedades (Properties) del cuadro de diálogo Selección múltiple (Multiple Selection) para cambiar las propiedades Protección (Protection) e Imprimir cuando (Print when) para todos los objetos seleccionados de una vez.

Seleccione Aplicar esta configuración de protección a los objetos seleccionados (Apply these protection settings to the selected objects) para habilitar las opciones de Protección (Protection). Seleccione Aplicar esta condición para los objetos seleccionados una vez guardado (Apply this condition to the selected objects upon saving) para habilitar la opción Imprimir cuando (Print when). Cambie la configuración de Protection y Print when según lo necesite, y luego seleccione Aceptar (OK) para cerrar el cuadro de diálogo y aplicar los cambios a todos los objetos listados en la primera ficha.

Más niveles de Zoom

La ventana Vista previa tiene más niveles de Zoom (vea Figura 28).


Figura 28. Utilice cualquiera de los nuevos niveles de zoom de la vista preliminar de VFP 9.0 para lograr mejor visibilidad.

VFP 9.0 trae muchas mejoras en la interfaz de usuario, incluyendo menús, menús contextuales, y barras de herramientas. Los cambios en el cuadro de diálogo Generador de expresión y Opciones del generador de expresión han incrementado las opciones disponibles al desarrollador. Otras mejoras incluyen el cursor del ratón, el cuadro de diálogo Selección múltiple y más niveles de Zoom.

Mejoras en el diseño de objetos

Se agregaron algunas mejoras al diseño de objetos, incluyendo una opción para controlar caracteres plantilla, un modo Recortar para expresiones de caracteres y posicionamiento relativo y absoluto.

Nota: Para poder aprovechar las ventajas del modo Recortar, debe activar la Salida asistida por objetos, ya sea creando directamente un objeto ReportListener o indirectamente utilizando un comando SET REPORTBEHAVIOR 90.

Caracteres de Plantilla

El cuadro de diálogo Propiedades de campo Field Properties tiene una nueva sección para caracteres de plantilla Template characters, como se muestra en la Figura 29. Las dos opciones disponibles son Cubrir (Overlay) e Intercalar (Interleave). Esto determina el formato en que se utilizan los caracteres especiales.


Figura 29. La opción "Caracteres de Plantilla" determina en que forma se aplican al dato los caracteres de formato especial.

Cuando se utiliza la opción Cubrir (Overlay) los caracteres especiales se tratan como parte del dato y cubre cualquier otro carácter específico en la posición dada. Por ejemplo, cuando la expresión del formato (Format expression) es "999-999," y el dato contiene "123456," el informe muestra "123-56 ." Observe que el "4" se sustituye por un guión en el formato.

Cuando se utiliza la opción Intercalar (Interleave) el carácter especial se inserta entre los caracteres existentes en el dato. Por ejemplo, cuando la expresión de formato es "999-999," y el dato contiene "123456," el informe muestra "123-456." Observe que el guión se inserta entre el "3" y el "4."

Modo Trim (recortar) para expresiones de caracteres

Antes de VFP 9.0, los objetos de tipo campo siempre se recortaban a la palabra más cercana cuando el texto era muy largo. En VFP 9.0, una opción nueva en el cuadro de diálogo Propiedades de campo (Field Properties) permite determinar cómo es recortado el campo (vea Figura 30).


Figura 30. Utilice el modo Recortar para expresiones de caracteres para indicar el método utilizado para recortar textos largos.

Las seis opciones para recortar textos largos son las siguientes:

  • Seleccione Recorte predeterminado (Default trimming) para utilizar el comportamiento predeterminado, que es mismo que la opción Recortar a la palabra más cercana, puntos suspensivos adicionales (Trim to nearest word, append ellipsis). Este comportamiento es similar a las versiones anteriores de VFP, con la excepción de tener puntos suspensivos adicionales.
  • Seleccione Recortar al carácter más cercano (Trim to nearest character) para tener el texto recortado al último carácter escrito que quepa en el área definida.
  • Seleccione Recortar a la palabra más cercana (Trim to nearest word) para tener el texto recortado a la última palabra completa que quepa en el área definida.
  • Seleccione Recortar al carácter más cercano, puntos suspensivos adicionales (Trim to nearest character, append ellipsis) para tener el texto recortado al último carácter que quepa en el área definida una vez que se agrega (...) al texto que imprime.
  • Seleccione Recortar a la palabra más cercana, puntos suspensivos adicionales (Trim to nearest word, append ellipsis) para tener el texto recortado a la última palabra que quepa en el área definida una vez que se agrega (...) al texto que imprime.
  • Seleccione Especificar nombre de archivo (Filespec: Show inner path as ellipsis) para mostrar la carpeta más interna de una ruta larga y el nombre de fichero, con puntos suspensivos adicionales (...) cuando el texto completo no quepa en el área definida.

Tamaño y posición

Otra característica disponible en el diseño de objetos es un mejor control del tamaño y la posición de los objetos, como se muestra en la Figura 31.


Figura 31. Utilice las opciones Tamaño (Size) y Posición (Position) en el cuadro de diálogo Propiedades para controlar la posición relativa y absoluta.

Cuando se agrega un objeto al informe, el valor para las propiedades Desde el borde superior de la página (From page top), Desde el borde izquierdo de la página (From left), Altura (Height) y Ancho (Width) se establecen automáticamente. Es importante observar que la propiedad From page top es relativa al borde superior de la página en el Diseñador de informe, lo que significa que toma en cuenta la altura de cualquier barra gris encima el objeto. Cambiar la propiedad From page top puede mover, sin darse cuenta, el objeto a otra banda.

Posición relativa

La propiedad From page top y la propiedad Height trabajan juntas para determinar si se utiliza posición relativa o absoluta. Cuando la propiedad From page top se establece en un valor que entra dentro del área del Diseñador de informes, y el valor de la propiedad Height es menor o igual a la altura de la banda en la que está localizado el objeto, se utiliza posición relativa. La posición relativa es necesaria para objetos en bandas que no son Encabezado de página (Page Header) y Pie de página (Page Footer).

Posición absoluta

Cuando la propiedad From page top se establece en un valor que entra fuera del área del Diseñador de informes, o el valor de la propiedad Height es mayor que la altura de la banda en la que está localizado el objeto, se utiliza posición absoluta. La posición absoluta significa que el objeto se imprime exactamente en el mismo lugar para cada página.

La posición absoluta puede ser utilizada para crear una marca de agua en el informe. Coloque una imagen gráfica en la banda Encabezado de página (Page Header) y seleccione (Scale contents, retain shape). Cambie la propiedad From page top y la propiedad From left para indicar la esquina superior izquierda de dónde desea que comience la marca de agua. Cambie las propiedades Height y Width para indicar el tamaño total de la marca de agua, asegurándose de no extenderla más allá de los márgenes imprimibles de la impresora.

Características Internacionales

Algunos cambios se han realizado en VFP 9.0 para hacer los informes más funcionales en situaciones internacionales. Específicamente conjuntos de caracteres, lenguaje de scripts, pueden establecerse para fuentes. Unidades (Units) tiene más opciones, así como el comando STRCONV().

FontCharSet

El conjunto de caracteres o lenguaje de scripts, de una fuente, puede ser establecido en el cuadro de diálogo Fuente (Font), como se muestra en la Figura 32. Se puede definir para un objeto específico del informe y además se puede definir la fuente predeterminada para todo el informe.


Figura 32. Utilice el cuadro combinado Script para seleccionar un conjunto de caracteres o lenguaje de script.

Unidades (Units)

El cuadro de diálogo Establecer escala de cuadrícula (Set Grid Scale) tiene tres opciones adicionales en la Escala de regla (Ruler Scale) para permitir especificar la escala en pulgadas o centímetros y apagar la escala. Esto permite un mejor control cuando hay usuarios con varios sistemas predeterminados. La Figura 33 muestra la nueva opción en el cuadro de diálogo Establecer escala de cuadrícula.


Figura 33. Utilice el nuevo cuadro desplegable en el cuadro de diálogo Establecer escala de cuadrícula para un mejor control sobre la regla de escala.

Los mismos cambios que se hicieron sobre el cuadro de diálogo Establecer escala de cuadrícula se hicieron en la ficha Informes del cuadro de diálogo Opciones.

STRCONV()

Otro cambio de VFP 9.0 que ayuda en informes internacionales es el cambio de la función STRCONV(). Ahora se puede utilizar para controlar transformaciones utilizando códigos de páginas y los valores Fontcharset junto con sus IDs locales. La documentación del archivo Ayuda, explica la nueva funcionalidad del comandoSTRCONV().

STRCONV(cExpression, nConversionSetting [,nRegionalIdentifier [,nRegionalIDType]])

nRegionalIDType:
0 - (default) nRegionalIdentifier es LocaleID.
1 - nRegionalIdentifier es código de página.
2 - nRegionalIdentifier es FontCharSet.

Para valores de nConversion iguales a 1, 2, 3, 4, 7, y 8, sólo es soportado nRegionalIdentifier=0

Para diseñar informes en idioma diferente al inglés, las mejoras en FontCharSet, las Unidades, y el comando STRCONV() permiten mayor flexibilidad en el diseño.

Mejoras en la impresión

Algunos comandos existentes y los cuadros de diálogo han sido mejorados para lograr mayor funcionalidad. La función SYS(1037) tiene un nuevo parámetro y devuelve un valor, el comando GetFont() tiene un nuevo estilo, y el comando APrinters() tiene tres columnas.

SYS(1037)

La función SYS(1037) se utiliza para invocar el cuadro de diálogo Configurar impresora Print Setup así como cambiar la impresora predeterminada de VFP. Antes de VFP 9.0, la función SYS(1037) no devolvía un valor significativo. Siempre devolvía una cadena vacía, independientemente de lo que hiciera el usuario. Esto hacía imposible conocer si se había oprimido el botón Cancelar (Cancel).

En VFP 9.0, se agregó un nuevo parámetro a la función SYS(1037) para que devolviera un valor significativo (vea Tabla 1.)

ParámetroDescripciónValor devuelto
SYS(1037)Mismo comportamiento que en versiones anteriores, excepto que ahora devuelve un valor significativo. 0 = Cancelado por el usuario
1 = El Usuario seleccionó Aceptar  OK
SYS(1037,1)Si el área de trabajo actual contiene una estructura que coincida con una estructura FRX y no se ha guardado información de la impresora en el área de trabajo actual, se activa el cuadro de diálogo Configurar página (Page Setup). Si el usuario selecciona Aceptar OK del cuadro de diálogo, VFP escribe los campos EXPR, TAG, y TAG2 en el primer registro del cursor, y luego restablece el cursor al RECNO() anterior.
Si el área actual no contiene la estructura adecuada, no se activa ningún diálogo y devuelve cero.
0 = Cancelado por el usuario o la estructura no es válida
1 = El Usuario seleccionó Aceptar  OK, el FRX se actualiza adecuadamente
 
SYS(1037,2)Si el área de trabajo actual contiene una estructura que coincida con una estructura FRX, la información de impresora predeterminada de VFP se escribe en los campos EXPR, TAG, y TAG2 del primer registro y luego restaura, el cursor al RECNO() anterior.
Si el área actual no contiene la estructura adecuada, no se activa ningún diálogo y devuelve cero.
0 = No se hace ninguna acción, la estructura no es válida
1 = La información de impresora predeterminada de VFP ha sido guardada satisfactoriamente en el FRX
SYS(1037,3)Si el área de trabajo actual contiene una estructura que coincida con una estructura FRX, el Entorno de impresora (Printer Environment) del FRX se guarda como el nueva impresora predeterminada de VFP. Además, sobrescribe, el entorno de impresora en el FRX, en caso de que haya alguna información no válida.
Si el área actual no contiene la estructura adecuada, no se activa ningún diálogo y devuelve cero.
0 = No se hace ninguna acción
1 = Se establece desde el FRX, la información de la Impresora predeterminada de VFP

Tabla 1. Nuevo parámetro y valor devuelto por SYS(1037)

GetFont()

Algunos cambios se hicieron en el comando

Printable Fonts Only

El tercer parámetro de GetFont() tiene un valor nuevo. Al pasar P indica a VFP que sólo muestre las fuentes de impresión para la impresora predeterminada, como se muestra a continuación.

=GetFont(' ', 0, 'P') 

FontCharSet

Como en versiones previas de VFP, se utiliza el cuarto parámetro de GetFont() para identificar el FontCharSet. Sin embargo, se ha hecho un ligero cambio en el significado de pasar 0 o 1 como el cuarto parámetro.

  • Pasar 0 permite que el cuadro desplegable Script, establezca explícitamente "Western script," y devuelva el FontCharSet junto al otro dato.
  • Pasar 1 permite que el cuadro desplegable Script, establezca el valor de la configuración regional de y devuelva el FontCharSet junto al otro dato.

Como en versiones previas, omitir el cuarto parámetro inhabilita el cuadro desplegable Script y no devuelve el FontCharSet como parte del valor devuelto.

APrinters()

Se ha añadido un nuevo parámetro al comando APrinters() para recoger información sobre las impresoras. Si utiliza este segundo parámetro opcional, como se muestra a continuación, provoca que se llene con una columna adicional.

lnPrinters = APrinters(laPrinters, 1) 

Las primeras dos columnas son iguales que en versiones anteriores; Nombre de la impresora (Name of Printer) y Puerto de impresión (Printer Port). Las tres nuevas columnas son (Driver), Comentarios (Comment), y Ubicación (Location).

Al llamar a APrinters() sin el segundo parámetro opcional provoca el mismo comportamiento de versiones anteriores, es decir, se devuelven dos columnas.

Cuadros de diálogos más actuales

El cuadro de diálogo Configuración de impresora (Print Setup) ha sido renombrado como Configuración de página (Page Setup) y se ha modernizado. También se ha modernizado el cuadro de diálogo Impresora (Printer) si se ejecuta bajo Windows 2000 o sistemas operativos posteriores.

Cuadro de diálogo Configurar página (Page Setup)

El cuadro de diálogo (Page Setup), mostrado en la Figura 34, puede ser invocado por algunos de los métodos siguientes:

  • Cuando el diseñador de informes no está activo WONTOP(), seleccione la opción Configurar página (Page Setup) del menú Archivo (File).
  • Cuando el diseñador de informes está activo WONTOP(), seleccione el botón Configurar página (Page Setup) en el cuadro de diálogo Configurar página de informe (Report Page Setup).
  • Utilice SYS(1037).

Figura 34. El nuevo cuadro de diálogo Configurar Página (Page Setup) sustituye al viejo Configurar impresora (Print Setup).

Cuadro de diálogo Imprimir (Print)

El cuadro de diálogo Imprimir (Print), que se muestra en la Figura 35, puede ser invocado por algunos de los métodos siguientes:

  • Seleccione Imprimir (Print) del menú Archivo (File).
  • Utilice la cláusula TO PRINTER PROMPT en comandos, como es REPORT FORM.

Figura 35. El nuevo cuadro de diálogo Imprimir (Print) tiene una apariencia más moderna, cuando se ejecuta bajo Windows 2000 o superior.

... continúa en Lo nuevo del Generador de Informes en VFP 9.0 - Parte 2

6 comentarios :

  1. woooowww! increible! PD: que hago buscando esto? madre mia!

    ResponderBorrar
  2. estimados, necesito una ayuda con el siguiente error, cuando intento modificar un campo u objeto dentro del informe, aparece el siguiente mensaje:

    Report Builder Error
    Variable 'VPOS' is not found
    Line 0 in loadfromrx():
    ...
    fieldexprhandler.Error()

    les agradeceré lo que puedan aportar,
    saludos

    ResponderBorrar

Los comentarios son moderados, por lo que pueden demorar varias horas para su publicación.