Introducción a Rave Reports - Parte II: diseñador visual

By: Ricardo Sosa

Abstract: Esto es una introducción a Rave Reports. La parte II describe cómo trabajar con el diseñador visual

En la parte I de este documento, usted pudo ver cómo trabaja el motor basado en código de Rave Reports. Ahora exploraremos el Diseñador visual.

    El Diseñador visual

Si usted ha trabajado con Quick Reports, el motor para reportes por defecto incluido en las versiones previas de Delphi, usted creaba sus reportes usando el diseñador de formularios de Delphi, y se guardaba en el DFM, incluido como recurso en su ejecutable. Rave trabaja un poco diferente en este aspecto: tiene su propio diseñador de reportes, y guarda el reporte utilizando su propio formato de archivo. Esto tiene algunas ventajas, incluyendo el hecho de que sus reportes pueden hacerse “por sí solos”, y ser usados o actualizados independientemente de su aplicación, o incluso estar disponible en una Intranet o en Internet, usando Rave Report Server de Nevrona. Por supuesto, todavía puede tenerlo guardado en un formulario DFM.

Para empezar con el Diseñador visual de Rave, coloque un componente TRvProject en un formulario. Este conectará su aplicación con los reportes que está desarrollando. Si quiere, puede agregar un TRvSystem y conectar su RvProject con él, a través de su propiedad Engine. El TRvSystem es el objeto responsable de la configuración general de los reportes: la impresora que será utilizada, los márgenes, el número de páginas, y demás. Para comenzar un nuevo proyecto, doble click en el RvProject que agregó en el formulario, o seleccione "Rave Visual Designer…" de su menú contextual. Esta es la interfaz en la que trabajará:

Hide image
Click to see full-sized imageLa interfaz es simple, y puede estar familiarizado con algunas partes de ella desde el IDE de Delphi. En la parte superior está el menú, la barra de herramientas, y la paleta de componentes que contiene los componentes que se utilizarán en los reportes. En la izquierda está el inspector de objetos (Object Inspector), que será utilizado para ajustar las propiedades de los componentes del reporte. En el medio está el diseñador de página (Page Designer) o el editor de eventos (Event Editor), y a la derecha se encuentra la muy útil vista de árbol del proyecto (Project Treeview). Para un vistazo rápido de los componentes en la paleta, puede dirigirse a la página Visual Designer de Nevrona.

Un proyecto de Rave puede tener uno o más reportes. De esta manera puede tener ítems comunes a ellos en un solo lugar, llamado Global Pages. Si expande el nodo de la librería (Report Library) del Project Treeview, podrá ver que en este momento está trabajando en el Report1. Haciendo click en él, se verán sus propiedades en el Object Inspector. Vamos a cambiar su nombre y llamémoslo SimpleReport. Luego, vamos a la pestaña Standard de la paleta de components, y seleccionemos un componente Text, colocándolo en la página. Cambie la propiedad texto, y ajuste su tamaño y posición. Aquí se muestra cómo debería verse:

Hide image
rave visual2Como puede ver, las propiedades que cambiamos de sus valores por defecto se muestran en negrita. En este caso, cambié las propiedades Font, Text y Truncate. Por defecto no se resaltan los cambios en Name, Pos y Size. Si desea verlos, haga click derecho en el Object Inspector y desmarque "Exclude Name, Size and Pos changes" en el menú contextual.

También puede darse cuenta que Rave no posee una propiedad Auto Size. Puede utilizar la propiedad Truncate para obtener ese efecto: si truncate es falso, el tamaño del tiempo del diseño no tendrá ningún efecto.

Puede ver el resultado de este reporte simple en el diseñador: presione F9 o use File/Execute Report para que corra. Ahora hagámoslo en nuestra aplicación. Guarde su proyecto y regrese a Delphi. Cambie la propiedad ProjectFile del RvProject para que apunte al archive que acaba de guarder. Para que corra el reporte, agregue una llamada al método Execute del objeto RvProject en un ButtonClick, por ejemplo.

RvProject.Execute trabajará solamente por ahora porque sólo tenemos un reporte en este proyecto. Si tuviéramos múltiples reportes, deberíamos llamar a SelectReport para elegir uno antes de llamar a Execute, o llamando ExecuteReport directamente.

Aquí está la salida:

Hide image
rave visual3Consejo: si cierra y abre su proyecto antes de ejecutarlo, no necesitará recompilar su aplicación o reiniciarla para ver los cambios que acaba de hacer en el diseñador.

    Interactuando con el proyecto

Si ha trabajado con Quick Reports, quizá manipulaba los objetos en tiempo de ejecución,, cambiando su Position, Text y Visibility. Después de todo, ¡sólo eran TObjects! Aunque esto es possible con Rave, y lo cubriré en un artículo posterior, es un poco más difícil de lo que era en QR. Pero no se preocupe, Rave provee una respuesta diferente para este tipo de problemas.

    Parámetros

Usted puede usar parámetros en sus proyectos. Estos pueden ser definidos usando la propiedad Parameters de cada proyecto, reporte o página. Los parámetros pueden ser definidos en cada uno de estos lugares, están en múltiples ubicaciones para un acceso más fácil.

Usted puede seleccionar un proyecto y un reporte solamente a través del Project Treeview. Sin embardo, una página puede ser seleccionada usando el Project Treeview o haciendo click en su título sobre el diseñador de página.

Entre otros usos, usted puede imprimir parámetros. Entonces, por ejemplo, si el título de su reporte puede ser definido por el usuario, usted puede pasarlo desde su aplicación como un parámetro.

Agreguemos un nuevo reporte a este proyecto para ver cómo funcionan los parámetros. Para esto, haga click en el cuarto botón de la barra de herramientas o elija File/New Report. Llámelo ParametrizedReport, cambiando su nombre desde el object inspector. Este reporte será muy parecido al primero, excepto que el texto será definido por el usuario.

Ahora necesitamos definer el parámetro que queremos imprimir. Para esto, teniendo el reporte como el objeto seleccionado, abra la propiedad Parameters. Allí debería mostrarse una lista con todos los parámetros de este reporte, cada uno en una línea distinta. Agregue un parámetro llamado Nombre, así:

Hide image
rave visual4Los parámetros pueden mostrarse usando un componente DataText, disponible en la pestaña Report de la paleta de componentes. Agregue un DataText en la página, y abra la propiedad DataField. Allí puede elegir qué campo será mostrado, cuando trabaje con reportes DataAware (que serán cubiertos en la parte III de esta serie). También puede elegir Project Variables Parameters y Post-Initialize Variables desde allí.

Entonces elija el parámetro agregado previamente desde el combo Parameters y presione el botón Insert Parameter. La expresión data text es ahora Param.Name (cambiaremos eso después). Presione OK e intente ejecutar el reporte, como antes. No se muestra nada, porque el parámetro no ha sido establecido.

Necesitamos establecer este parámetro antes de mostrarlo. No olvide guardar los cambios, y regrese a Delphi, agregando una llamada a SelectReport antes de Execute, de manera que podamos ver correctamente el reporte. Antes de ejecutarlo, sin embardo, debemos establecer el parámetro que agregamos. Esto se hace usando el método RvProject's SetParam. Así es como queda el código ahora:

procedure TFormMain.ExecuteClick(Sender: TObject);

begin

RvProject.Open;

RvProject.SelectReport('ParametrizedReport',False);

RvProject.SetParam('Nombre','Ricardo');

RvProject.Execute;

RvProject.Close

end;

Ahora, cuando ejecutamos el reporte, veremos la cadena que establecimos como parámetro.

Consejo: puede usar RvProject.GetReportList para obtener una lista de los proyectos disponibles, y agregarlos a un ComboBox o a un RadioGroup, por ejemplo. Esto hace más fácil la selección de reportes.

Pero esto es demasiado simple. Cambiemos la expresión que mostraremos. Regrese a Rave Designer y abra el editor de propiedades del DataText que agregamos. Puede agregar cualquier texto que desee, combinando texto, campos, parámetros y variables. Lo cambié por esto:

Hide image
rave visual6Aquí está el resultado:

    Hide image
rave visual5Variables post-inicializadas

Variables post-inicializadas, o simplemente PI Vars, son variables cuyo resultado sólo se conoce después de que se muestra el reporte. Puede sonar extraño, al principio, pero piensen en el número de páginas de un reporte, por ejemplo. Sólo podemos saber su valor luego de terminado el reporte. En realidad TotalPages es una variable que actúa como una PI var, y puede mostrarse fácilmente utilizando DataTexts como hicimos con los parámetros.

    Páginas globales

Cuando tiene partes de reportes que son comunes a dos o más reportes, puede colocarlos en una página global. Supongamos que agregamos un encabezado con el nombre de nuestra empresa, la fecha y hora en que hacemos el reporte, la página actual y el número de páginas del reporte. Queremos que ese encabezado esté en cada reporte. ¿Cómo podemos hacerlo?

Primero, agregar una página global al proyecto, usando File/New Global Page, o el atajo de la barra de herramientas. En esa página, agregue un componente Section, disponible en la pestaña standard de la paleta de componentes.

Las secciones son grupos lógicos de componentes. Pueden ser usadas para agrupar componentes así pueden ser movidos fácilmente por el reporte, o como contenedor para Mirrors, como haremos ahora.

Dentro de esta sección agregaremos lo que queremos mostrar. En este caso, algunos DataTexts. Mi encabezado se ve así:

Hide image
rave visual8Pista: en lugar de cambiar la propiedad Fuente de varios componentes a la misma fuente, conéctelos a un componente FontMaster, disponible en la pestaña standard, y establezca la fuente desde él. Esta manera es más fácil para cambiar la fuente en el futuro, en caso de necesitarlo.

Ahora agregue otra sección en la página 1 de SimpleReport. Establezca su propiedad Mirror como GlobalPage1.Section1. Verá una copia del encabezado que creó en la página global. Haga lo mismo con ParametrizedReport. Ahora ambos reportes comparten el mismo encabezado. Aquí muestro cómo lo veo:

    Hide image
Click to see full-sized imageImpresión condicional

En ocasiones necesitamos mostrar partes de un reporte dependiendo de alguna condición. Rave tiene una potente herramienta para trabajar con esto. Podemos condicionar los mirrors de las secciones dependiendo de los valores de los campos o parámetros. Creemos un nuevo reporte, llamándolo ConditionalReport.

Finjamos que este nuevo reporte es un truco. El usuario puede elegir el encabezado a mostrar, de dos diferentes tipos de encabezados. También puede elegir mostrar el reporte sin encabezado. Usaremos un parámetro para decirle al reporte qué tipo de encabezado será mostrado, y un DataMirrorSection para seleccionar el encabezado correcto en tiempo de ejecución.

Primero, agregue un parámetro a este nuevo reporte llamado tipo_encabezado. Asumamos que tenemos los valores H0 (sin encabezado), H1 (para el primer encabezado), H2 (para el segundo encabezado). Ahora agregue una nueva sección a la página global (puede encontrarla a través del Project Treeview), con el diseño del segundo tipo de encabezado. Creé un encabezado similar al primero, cambiando la fuente y agregando un borde alrededor de los valores. Se ve así:

Hide image
rave visual9Ahora regrese a la página 1 de ConditionalReport, y agregue un DataMirrorSection, disponible en la pestaña Report de la paleta de componentes. Vaya a su propiedad DataField, y establezca Param.tipo_encabezado como expresión. Ahora vaya al editor de propiedades de los DataMirrors, y agregue dos Data Mirrors: si el valor es H1, debe apuntar al primer encabezado, H2, al segundo. Como H0 no coincide con ningún mirror, no mostrará nada. Debería verse así:

Hide image
rave visual10Note que asigné nombres significativos a cada sección antes.

Pista: puede usar el evento OnMirrorValue de DataMirrorSection para trabajar con rangos de valores.

Ahora regrese a Delphi y agregue el código para establecer los parámetros de acuerdo a la elección del usuario. Agregué un ComboBox con las opciones y mi código aparece así:

procedure TFormMain.ExecuteClick(Sender: TObject);

begin

RvProject.Open;

RvProject.SelectReport(cmbReports.Text,False);

case cmbReports.ItemIndex of

1: RvProject.SetParam('Nombre', ednombre.Text);

2: RvProject.SetParam('Tipo_encabezado', Format('H%d',[cmbEncabezado.ItemIndex]))

end

RvProject.Execute;

RvProject.Close

end;

Ahora se mostrará el encabezado adecuado de acuerdo a la elección del usuario.

    Encajando el Proyecto en el Ejecutable

Cuando usted despliega su aplicación, debe incluir el archivo del proyecto. Puede tenerlo como un archivo separado, así puede actualizarlo más fácilmente, solamente enviando uno nuevo, sin recompilar su aplicación, o incluirlo en su ejecutable. Es fácil de hacer esto: abra el editor de propiedades para la propiedad StoreRAV de RvProject. Allí puede presionar Load para incluir el archive en el DFM, Save para extraer un archivo guardado previamente, y Clear para remover un archivo encajado. Cuando hay un archivo cargado en esta propiedad, no necesita empacar el archivo del proyecto por separado.

    Conclusión

Hemos aprendido cómo trabajar con el diseñador visual, y visto algunos trucos que permiten cierta flexibilidad a los reportes. Puede encontrar un proyecto que contiene los reportes desarrollados como ejemplo en CodeCentral. En la parte III aprenderemos cómo crear reportes DataAware, y operar con bandas.

Server Response from: ETNASC04