Características avanzadas

Para crear informes más complejos y usables necesitamos más características y funciones. La siguiente sección trata sobre estas importantes funciones avanzadas.

Usando expresiones

El editor de informes personalizables maneja expresiones de script usando Qt Script. Qt Script está basado en el lenguaje de script ECMAScript, según el estándar ECMA-262. Los campos pueden estar basados en scripts en lugar de columnas de origen de datos, parámetro o variable. En este caso el generador de informes evalúa el script en cada momento cuando los campos son refrescados. Los elementos del informe también pueden tener la propiedad imprimir solo si la fórmula script es verdadera (para abreviar, la llamaremos “imprimir si”). Se trata también de expresiones de script que devuelven un resultado booleano. Para usar expresiones de script en campos debemos especificar el valor script en la propiedad tipo del origen del campo en el diálogo de propiedades del campo.

Usando referencias en expresiones

Las expresiones pueden contener y evaluar las referencias siguientes: dato de origen de datos, parámetro y variable. Las referencias son siempre sustituidas por su valor actual antes de que la expresión sea evaluada. La sintaxis de las referencias son:

Sintaxis

Descripción

$D{[datasourceID.]column}

Referencia de columna del origen de datos. Devuelve el valor actual de la columna del origen de datos del registro/fila en curso. Si no especificamos [datasource.] se entenderá que es el origen de datos actual por defecto (asignado al detalle actual).

$P{parameterID}

Referencia de parámetro. Devuelve el valor del parámetro por nombre/ID.

$V{variableID}

Referencia de variable. Devuelve el valor actual de la variable por nombre/ID.

$F{fieldID}

Referencia de campo. Devuelve el valor actual del campo especificado. FieldID es el número ID del campo que es generado automáticamente cuando el campo es añadido en una sección.

Si una expresión contiene una referencia insertada de tipo texto/cadena, serán necesarias las comillas al comienzo y al final de la misma. Por ejemplo: "$D{ds.lastname}"=="Smith". No necesitamos comillas para valores numéricos, por ejemplo, $D{price}==750.0 es la sintaxis correcta.

Si en la expresión queremos incluir campos o variables de Velneo, entonces podremos hacer uso del asistente de fórmulas de Velneo para su especificación. Por medio del nuevo asistente de fórmulas para scripts, podremos incluir y editar fórmulas complejas de Velneo con el asistente y aprovechar todas sus funcionalidades.

El asistente permitirá definir una fórmula del tipo $D{""} dentro de un script y editarla, seleccionando el origen adecuado.

Además de facilitar la escritura de fórmulas en scripts, nos permitirá seleccionar el origen de datos que usaremos en la fórmula, con lo que podremos ampliar las funcionalidades de nuestros informes y ajustarlos a nuestras necesidades.

Ejemplos de referencia

Ejemplo usando una expresión de script como campo:

"$D{datasource1.productName}"+" first string "+" second string “+”$P{parametername}"

Ejemplo usando una expresión de script como imprimir sólo si la fórmula script es verdadera:

$D{productPrice}<1500

Probando expresiones de campo

Ahora probaremos cómo trabajan las expresiones con campos. Supongamos que en el detalle de un informe tenemos un campo que imprime el campo ID del artículo y cuyo identificador en el informe es IDProducto, si o editamos podemos cambiar el tipo de origen de datos a expresión y escribir la expresión siguiente:

if ($D{IDProducto}>40) "Producto: "+"$D{NombreProducto}"; else "";

En este caso el generador de informes primero reemplaza las referencias en el código y luego evaluará el código script antes de cada acción de renderizado.

Cuando imprimamos el informe, si el código del artículo es menor que 40, no imprimirá nada.

Este ejemplo es muy gráfico pero no es la forma más efectiva de usar expresiones. En la mayoría de los casos, cuando usamos expresiones en campos no necesitamos un código demasiado complejo. Si se necesita establecer una condición para que un campo sea o no visible, recomendamos usar la propiedad imprimir sólo si la fórmula script es verdadera.

Probando la opción imprimir sólo si la fórmula script es verdadera

En esta propiedad se ha de usar una expresión que devuelva un resultado booleano, es decir 0 ó 1. Habitualmente se las conoce como expresiones lógicas. Para probarla, simplemente editar las propiedades del campo y escribir la expresión siguiente:

$D{IDProducto}>40

Luego modificar la expresión propiedad campo como sigue:

"Producto: "+"$D{NombreProducto}"

Si en la expresión queremos incluir campos o variables de Velneo, entonces podremos hacer uso del asistente de fórmulas de Velneo para su especificación.

Parámetros

Son datos obtenidos fuera del generador de informes. Los parámetros son evaluados en expresiones de script. Los objetos de campo también pueden tener un parámetro como tipo de origen de datos, para que éstos puedan ser presentados como datos en el informe. Los parámetros los podremos enviar desde procesos de Velneo.

Sintaxis de los parámetros

Por ejemplo, si queremos embeber un parámetro en una consulta o en una expresión, usaremos la sintaxis siguiente:

$P{parameterID}

Enviar parámetros a informes desde procesos Velneo

Los comandos de instrucción de proceso de Velneo que generan informes (informe personalizable: imprimir informe, informe personalizable: previsualizar informe e informe personalizable: exportar a fichero incluyen un parámetro que nos permitirá enviar parámetros a un informe personalizable.

Los parámetros se resolverán del modo siguiente:

"id_param_1:valor 1|id_param2:valor 2″

Para usar estos parámetros en un campo de un informe, tendremos que especificar en la propiedad tipo de origen de campo el valor parámetro y, en la propiedad campo especificar el identificador del campo dado en el comando de instrucción de proceso de Velneo.

Por lo tanto, estos parámetros no se declaran en el informe, sino que se declaran en el comando de instrucción de proceso que genera el informe.

Por ejemplo, supongamos que en el comando de instrucción de proceso de Velneo informe personalizable: previsualizar informe queremos pasar en, sendas variables, la fecha y la hora del sistema. Podríamos resolverlos como sigue:

"fecha:" + currentDate() + "|" + "hora:" + currentTime()

Para crear un campo en el informe para imprimir el parámetro fecha, haríamos:

Si un parámetro lo usamos en scripts, lo usaremos con el prefijo de parámetros: $P{nombreParametro}. Hemos de tener en cuenta que en scripts en que creamos una cadena que el parámetro debe tratarse como una cadena: "$P{nombreParametro}", por lo que ha de ir entrecomillado.

Funciones del origen de datos

Se trata de funciones que nos permitirán obtener determinada información del origen de datos. Son:

rowCount

Devuelve el número de registros del origen de datos.

isAvailable

Devuelve true si el origen de datos tiene al menos un registro.

isValid

El puntero al registro apunta a un registro válido.

isEmpty

No tiene datos de registro.

isNotEmpty

Tiene datos de registro.

update

Fuerza una actualización (requery)

Estas funciones, en expresiones de script, se delimitarán por los caracteres $D{ y }. Ejemplo:

$D{datasource.rowCount()}

Zonas

Las zonas son bandas virtuales dentro de una sección de un informe. Todos los elementos pueden tener un ID de zona específico. Elementos con un mismo ID de zona, como si fuese un grupo, representa una zona como una banda virtual dentro de la sección. Cuando se activa la opción de altura automática de la sección, el generador de informes procesará el renderizado de las zonas en orden según el ID de la zona, uno tras otro. Si el contenido de una zona está vacío debido a la propiedad imprimir sólo si la fórmula script es verdadera devuelve no en todos los elementos de la zona, ésta no será impresa y la sección se encogerá. El orden de renderizado de zonas sigue el orden de los ID de zona.

Para establecer la zona de un ítem del informe editaremos sus propiedades (las del ítem).

En la opción configuración de informe y página, en la pestaña secciones encontraremos dos propiedades relacionadas con las zonas. Estas son:

  • Espaciado de zona: cuando en un informe usamos zonas, el valor que establezcamos en esta propiedad se aplicará como espacio de separación entre las zonas.

  • Salto de página permitido entre zonas: cuando en el informe vayamos a imprimir secciones y controles con altura variable, activaremos esta opción para que, si no caben en una página, continúen imprimiéndose en la siguiente.

Las zonas no son visibles en edición. La región contenida simplemente está determinada por el ID de las zonas asignadas a los distintos elementos del informe.

Impresión en modo documento de texto

Se trata de una característica, con la que los textos enriquecidos basados en QTextDocument pueden ser impresos o renderizados. Con ello, se podrá imprimir un documento QTextDocument desde un fichero o de cualquier origen de datos. En este modo solamente podremos usar cabecera de página, pie de página y una única sección de detalle en el informe. El resultado del informe es un documento de texto, paginado y listo para ser impreso. En este modo de impresión la variable del sistema pegecount también está habilitada.

Pasos de uso

Para crear un documento de texto imprimible usaremos el editor de informes.

  • En el editor de informes seleccionar la opción configuración de informe y página del menú informe. En la propiedad tipo de informe seleccionaremos el valor documento de texto.

  • Añadir un elemento a la única sección de detalle del informe. Establecer las propiedades del texto usando su diálogo de propiedades. El texto puede venir de cualquier origen como de costumbre.

  • Diseñar la cabecera y el pie de página del informe (no es obligatorio).

En este modo solamente se soporta una única sección de detalle con un único elemento de texto. La posición horizontal y el ancho del elemento de texto son seguidas al renderizarlo.

Sistema de subconsulta

Los informes de datos a menudo trabajan con relación de datos maestro/detalle. Por ejemplo, en documentos típicos tales como facturas, pedidos, etc. hay al menos una cabecera y un detalle de una lista de datos relacionados que están enlazados al maestro por una clave. La finalidad del sistema de subconsulta es que las subconsultas sean ejecutadas repetidamente en ejecución en base a una columna ID de su padre.

Supongamos una estructura de informe con tres niveles:

Clientes.

Facturas.

Líneas de factura.

Veamos en la siguiente sección cómo definir orígenes de datos de una relación maestro/detalle. Crearemos esta jerarquía de tres niveles de origen de datos en el siguiente ejemplo.

Definiendo el origen de datos maestro (padre)

En primer lugar, añadiremos el origen de datos maestro en el diálogo de orígenes de datos, que obtendremos al seleccionar la opción orígenes de datos del menú informe. Añadir un nuevo origen de datos del tipo tabla de Velneo. En la opción abriendo/ejecutando rol asignar el valor comienzo del informe. Esto quiere decir que la consulta solamente se ejecutará una única vez al comienzo del informe.

Definiendo los orígenes de datos del detalle (hijo)

En el mismo diálogo habrá que añadir dos nuevos orígenes de datos con la estructura padre/hijo. Haciendo el primero añadir un nuevo origen de datos de Velneo. En la opción abriendo/ejecutando rol asignar el valor origen de datos hijo (subconsulta). Esto significa que la consulta será ejecutada repetidamente cada vez que el siguiente registro maestro sea procesado.

En la opción padre del origen de datos seleccionaremos cuál es el origen de datos padre (que en este ejemplo será la tabla de Clientes).

En la opción proceso del origen de datos seleccionaremos qué proceso usaremos para cargar las facturas de un cliente. El proceso tendrá que ser uno que tenga como entrada una ficha de Clientes y como salida una lista de Albaranes.

Conviene activar la opción permitir origen de datos vacío se puede activar para que el informe pueda ser impreso igualmente en el caso de que un cliente, por ejemplo, no tenga albaranes.

A continuación viene el segundo origen de datos hijo. Se trata del tercer nivel de la relación (las líneas del albarán).

Vemos que la configuración es muy similar al origen Albaranes, pero asignando como origen padre la tabla Albaranes y como proceso uno que carga las líneas de un albarán.

Configurando la sección de detalle

En este paso debemos asignar el origen de datos apropiado a la sección de detalle. Para configurar la sección del detalle ejecutar la opción detalle y agrupamientos del menú informe. Seleccionar el origen de datos definido anteriormente, el de nivel más bajo dentro de la jerarquía, en nuestro ejemplo: artículos.

Cuando definimos una subconsulta, siempre será la consulta del nivel más alto en la jerarquía a la que asociemos a la sección de detalle. Esto es así porque el generador de informes maneja subconsultas por iteración en los registros del origen de datos de nivel del padre.

Para condicionar una sección para que cuando no haya registros no la imprima, debemos usar las siguientes funciones:

!$D{origendedatos.isEmpty()}

Por ejemplo, para que si no hay facturas en una secuencia clientes-facturas-lineas, debemos poner:

!$D{Facturas.isEmpty()} en la sección.

En las líneas debemos poner:

(!$D{Facturas.isEmpty()}) && (!$D{Lineas.isEmpty()})

Diseñando el informe

Después de que hemos definido los orígenes de datos y asignado el origen de datos al detalle, debemos añadir los grupos apropiados al detalle usando el botón agrupamientos. Como de costumbre, cada nivel de origen de datos estará relacionado con un nivel de agrupamiento.

Añadir las otras secciones del informe, los elementos necesarios del informe y alinear.

En el detalle lo que pondremos son controles con origen en la tabla de LÍNEAS DE FACTURA para imprimir la información de cada línea.

Modo de pasada doble

Es una opción del informe que influye en la ejecución del generador de informes. Cuando este modo está habilitado el informe es ejecutado en dos veces -este ciclo de dos ejecuciones es llamado pasada primaria (prueba) y secundaria (real).

¿Por qué es necesaria la doble pasada? En el modo normal (1 pasada) el generador de informes simplemente ejecuta el informe sin contar nada previamente. Esa es la razón por la que el generador de informes no conoce el número total de páginas y la variable del sistema pagecount siempre retorna 0 en el modo normal. Si la variable del sistema pagecount se necesita, será necesario el modo de doble pasada.

Numeración de páginas

En un informe con subconsultas, si en el pie de página usamos las variasbles del sistema pageno y/o pagecout, las páginas comenzarán a numerarse desde 1 hasta n. En el caso de que queramos que cada vez que se genere un nuevo subfinforme éste comience siempre por la página 1, tendremos que activar la propiedad Subinforme resetea número de página de las propiedades del informe.

Informes multi-idioma

Los informes tienen la habilidad de ser multi-idioma. Es un aspecto muy importante en aplicaciones internacionales. La finalidad de esta funcionalidad es que los campos y las etiquetas puedan guardar más de un texto según los idiomas que hayan sido definidos previamente.

Añadiendo idiomas

Para definir idiomas usar la opción configuración de informe y página del menú informe y acceder a la pestaña idioma.

Para añadir un idioma seleccionarlo en el combo box que contiene la lista de idiomas y pulsar el botón añadir.

Dejar el idioma "por defecto" como primer idioma de la lista, ya que este representa el idioma original del informe.

Establecer el rol por defecto si falta traducción. Si no todas las etiquetas o campos son traducidas y la traducción al lenguaje actual no existe, podemos elegir dos opciones. Si usamos la opción usar idioma por defecto, si no existe la traducción se imprimirá el texto por defecto. Si elegimos la opción dejar en blanco, si no existe la traducción al idioma en curso, no se imprimirá el ítem.

Traduciendo los campos y las etiquetas

En el cuadro de propiedades del campo o de la etiqueta aparecerá una pestaña por cada idioma definido. La primera pestaña se corresponderá con la del idioma por defecto.

Si dejamos vacía una pestaña, el texto quedará sin traducir a ese idioma.

Definiendo el idioma en curso

En actual de Velneo carece de la funcionalidad de poder asignar el idioma a un informe en tiempo de ejecución, por lo que habría que proceder del modo siguiente:

Crear el informe, definir idiomas y realizar sus traducciones.

Una vez finalizado, duplicarlo, y a cada copia se le establecerá un idioma por defecto.

A la hora de imprimir, será necesario seleccionar el informe que se corresponda con el idioma deseado.

Tablas de cruce de referencias

Los informes en muchas ocasiones contiene tablas o datos con un diseño tipo tabla. Algunas veces es necesario rotar los resultados para que las columnas sean presentadas horizontalmente y las filas verticalmente. Esto suele ser conocido como crear una TablaPivot®, un informe de referencias cruzadas o rotar datos. En tablas de cruce los registros del origen de datos son representados en en columnas horizontales y las tablas de cruce son impresas como columnas del origen de datos. Las tablas habitualmente tienen totales horizontales o verticales.

Las tablas de cruce tienen asociado un único origen de datos. En el informe solamente se necesita definir un único origen de datos para la tabla. Cuando el generador de informes renderiza las tablas de referencia cruzada, tendrán el comportamiento siguiente:

Expandible horizontalmente

Si la tabla es más ancha que el espacio que hay a la derecha, sería continuada en una tabla nueva debajo.

Expandible verticalmente

Alargamiento vertical: cada fila representa una columna de datos del origen de datos especificado – puede partirse en múltiples páginas.

Estructura de la tabla

Las tablas de cruce son construidas con celdas. Cada celda tiene su propia función, dependiendo de dónde esté situada. El primer nivel de función de elementos de tablas son las filas y las columnas. Las dos figuras siguientes muestran la estructura de la fila y la columna de una tabla de cruce con su función definida.

Filas de tabla:

Secciones verticales: fila de cabecera, filas de datos, y fila de totales.

Columnas de tabla:

Secciones horizontales de tabla: columna de encabezado, columnas de datos, columna de totales.

La imagen siguiente representa la estructura de celdas de tablas:

0: encabezado de esquina.

1: encabezado de columna.

2: parte de encabezado de totales.

  1. Encabezado e fila.

  2. Datos.

  3. Parte de datos de totales.

  4. Encabezado de resumen de fondo.

  5. Datos de resumen de fondo.

  6. Resumen de datos cruzado.

Usando tablas de cruce en el editor de informes

Para añadir una tabla de cruce en un informe, seleccionar la opción tabla de cruce del menú insertar. Al hacerlo en cursor se transformará en una cruz, entonces hacer clic en el área de la sección donde queramos incluirla. Se recomienda que sea en la sección de detalle.

Haciendo esto crearemos un nuevo objeto tabla de cruce en la sección seleccionada y en la posición en la que hemos hecho clic y se abrirá su diálogo de propiedades. En él podremos establecer todas las propiedades de la tabla de cruce.

El diálogo está dividido en las pestañas siguientes: propiedades de la tabla y propiedades de la celda. Como de costumbre, encontraremos la opción imprimir sólo si la fórmula script es verdadera en la parte inferior del diálogo. Si definimos una expresión lógica, tabla será mostrada u ocultada, dependiendo del resultado de la expresión. A continuación describiremos las propiedades de la tabla.

Si la tabla puede ocupar más de una página, activaremos la propiedad "partir tabla cuando hay salto de página".

Propiedades de nivel de la tabla

Origen de datos de la tabla

Este grupo representa las opciones relativas al origen de datos.

ID del origen de datos

Identificador del origen de datos que estará asociado a la tabla. El origen de datos seleccionado tendrá que ser único, esto es, independiente de cualquier origen de datos de cualquier detalle porque las tablas de cruce tienen su propio procesamiento de datos.

Columnas ocultas

Lista, separada por comas, de columnas válidas del origen de datos que no queremos mostrar en la tabla. Estas columnas de datos, lógicamente, han de existir en la definición del origen de datos.

Origen del título de la columna

El ID de columna de datos de los títulos de cabecera de columna. Si no se especifica, aparecerán los números de las columnas.

Tamaño y espacios

Este grupo representa los tamaños generales de los elementos de una tabla de cruce.

Anchos de columna

Ancho general de las columnas.

Altos de fila

Alto general de las filas de tabla.

Margen de celdas

Espacio dentro de las celdas.

Espaciado entre celdas

Espacio entre cada celda.

Espaciado de tablas

Espacio entre las tablas cuando la tabla de cruce es multi-líneas. La tabla es partida a multilínea cuando es más amplia de una página.

Tamaños de sección

Este grupo representa los tamaños de las secciones de una tabla de cruce. Para conocer más sobre secciones, leer el capítulo dedicado a la estructura de tablas. Contiene las opciones siguientes:

Ancho de columna de cabecera

Ancho de la columna de cabecera (izquierda/primera).

Ancho de columna de datos

Anchura de las columnas de datos.

Ancho de columna total

La mayoría de las veces es la última columna de más a la derecha.

Alto de fila de cabecera

Alto de la fila de la cabecera (la primera).

Alto de fila de datos

Altura de las filas de datos.

Alto de la fila total

Altura de la fila de total. La mayoría de las veces es la última fila de la tabla.

Mostrar partes de tabla

Este grupo representa las opciones con las que podemos habilitar o inhabilitar partes concretas de la tabla.

Cabecera de columna

Para mostrar u ocultar la cabecera de columnas.

Cabecera de fila

Para mostrar u ocultar la cabecera de filas.

Acumulado inferior

Para mostrar u ocultar la fila de total.

Acumulado lateral

Para mostrar u ocultar la columna de total.

Partir tabla cuando haya salto de página

Si esta opción está habilitada, la tabla puede partirse entre sus filas cuando se parte la página. Para evitar la partición de la tabla desactivar esta opción.

Propiedades de celda de nivel

Las propiedades de una celda está relacionada con las celdas propiamente dichas. Los nombres de las celdas están representados por su función.

Tabla de eje

En esta sección configuraremos la tabal de eje. Sus propiedades son:

Crear tabla pivote

La activaremos para que se cree la tabla.

Función agreagada

Indicaremos qué se hará cuando dos registros coincidan en la misma fila y columna. Los valores posibles son:

  • Nº de elementos.

  • Acumulado.

  • Media.

  • Desviación estándar.

  • Mínimo y máximo.

Crear tabla eje

Campo que se usará para generar la table de eje.

Origen de las columnas

Campo que se usará para generar las columnas.

Origen valores

El campo que se usará para el cálculo de la función agregada.

Odenar automáticamente datos de la cabecerea

Dejar este campo inactivo ya que, de lo contrario, no funcionarán las función de agregado.

Formato condicional

Esta función permite el uso de dinámicas basadas en datos estilos de texto en los informes según el valor actual de columnas de origen de datos, parámetros, variables o incluso expresiones de script. Esta opción de formato es propiedad solamente de los campos o de las etiquetas. Los textos html pueden ser formateados dinámicamente embebiendo etiquetas dinámicas en el código html.

La definición de formato es un código de texto con símbolos de etiquetas de estilo y expresiones similares al código de estilos CSS genérico. La etiqueta de estilo y su valor/expresión estarán divididos por dos puntos (:). Cada file representa una definición de estilo. Las expresiones de script tienen que ir delimitadas entre llaves ({}).

Etiquetas de estilo

Los siguientes símbolos de etiquetas de estilo pueden ser usados en el código de formato. Están permitidos múltiples símbolos de etiquetas de estilo en el código.

Símbolo de etiqueta

Descripción

Ejemplos

color:

Color del texto

color:#ff0000color:$D{ds.color}color:{if($D{ds.price}>500)“#ff0000”;}

background-color:

Color de fondo del texto

background-color:#ff0000backgroundcolor:$D{ds.bgcolor}

font-family:

Nombre de la fuente

font-family:Arialfont-family::$D{ds.font}

font-bold:

Fuente negrita activado/desactivado

font-bold:truefont-bold:$D{ds.isBold}

font-italic:

Fuente cursiva activado/desactivado

font-italic:truefont-italic:$D{ds.isItalic}

font-weight:

Peso de la fuente en número. Cuanto mayor sea el peso más grueso será el texto.

font-weight:50font-weight:$D{ds.fweight}

font-underline:

Fuente subrayada activado/desactivado

font-underline:true fontunderline:$D{ds.isUnderline}

font-size:

Tamaño de la fuente en puntos. Valor entero.

font-size:12font-size:$D{ds.size}

font-strikeout:

Fuente tachada activado/desactivado

font-strikeout:true fontstrikeout:$D{ds.fstrikeout}

letter-spacing:

Valor del espaciado entre las letras. A mayor valor, mayor espaciado entre letras.

letter-spacing:1.5 letterspacing:$D{ds.letterspacing}

capitalization:

Opción de renderizado para las fuentes a las que se aplique. Un valor de 0-4. Es igual que la propiedad de enumeración de QTFont:Capitalization

capitalization:$D{ds.cap}

Editar el código de estilo en el editor

Para definir un formato de texto condicional de una etiqueta o de un campo hacer clic en el botón formato condicional… del diálogo de propiedades. Entonces se abrirá el diálogo para establecer dicho código. Escribir o pegar el código de formato deseado manteniendo las reglas de sintaxis. Hacer clic en aceptar para guardar el código.

La etiqueta de estilo y su valor deberían estar en la misma línea. Líneas múltiples de definición de estilos no son evaluadas.

Estilo por defecto

Con el fin de usar una condición (script o dato) que devuelva un valor vacío, se aplica la opción de formato de estilo por defecto. La configuración de estilos por defecto son los que establecemos de forma estática en el informe, como de costumbre.

Posición dinámica de controles

Esta funcionalidad permite cambiar la posición en curso del control mediante script. Podremos cambiar la posición x e y del control, el ancho el alto. Si se activa la propiedad offset, el valor donde se pintará el control no será absoluto, sino relativa a la posición del mismo en el informe. Los parámetros establecidos a un control se calculará solamente una vez, esto quiere decir que si se trata de alterar la posición de un control de una línea de detalle, se asignará la misma posición a todas las líneas del detalle.

Iteración de subinforme

La función denominada subinforme significa aquí que todo el proceso de informe repetido al recorrer a través de una fuente de datos específica. Esto es similar al clásico modelo de subinforme, pero que soporta solamente un nivel. Esta función es muy útil cuando un informe complejo o un informe multi-detalle ha de ser repetido por el procesamiento de distintos registros de datos. La función usa un origen de datos padre dedicado como origen de la repetición.

La función de subinforme es una gran oportunidad para crear de un simple a muchos informes relacionados.

Cuando trabajamos con sub-informes, el origen principal, en la propiedad abriendo/ejecutando rol tendrá el valor iteración del subinforme y los orígenes de los subinformes tendrán el valor comienzo del informe.

Origen de datos del subinforme

Para establecer el origen de datos en el que la iteración va a basarse, debemos añadir un origen de datos al informe como de costumbre. Asignar a la opción abriendo/ejecutando rol el valor iteración del subinforme.

Referencia al origen de datos secundario

Es posible imprimir en una misma sección de detalle de un informe datos de dos sub-informes distintos.

También podremos incluir campos del otro subinforme. Teniendo en cuenta lo siguiente:

En el detalle, debemos especificar la tabla correspondiente al subinforme en el origen secundario de la sección.

Debemos especificar como origen del campo el origen del otro subinforme.

En la propiedad imprimir sólo si la fórmula script es verdadera, especificaremos la constante @DS2, esto evitará que, en el caso de que el origen secundario tenga menos elementos que el primario, se repita el último registro en aquellas filas que deban quedar vacías.

Salida de texto general

La salida de texto es una característica muy potente de VReport. Esta funcionalidad da la posibilidad de generar varios tipos de salidas de texto diferentes como HTML, XML, texto plano, etc. La salida de texto requiere de una plantilla adicional para existir. Antes de ejecutar un informe será necesario indicar también la plantilla de texto.

La salida de texto es generada muy rápido, ya que los datos son procesados y sustituidos directamente en la plantilla sin ningún renderizado gráfico.

Gestor de etiquetas de plantillas de texto

Las siguientes palabras clave/etiquetas están disponibles cuando creamos una plantilla de texto. Cada etiqueta de apertura y de cierre representa una sección específica. Las etiquetas se encuentran delimitadas por los caracteres estándar de comentario HTML.

Ejemplos

Los siguientes ejemplos muestran un uso común de una plantilla de texto.

<!-- BEGIN {DH} -->
SIMPLE TEXT REPORT OUTPUT
<!-- END -->
<!-- BEGIN {PH} -->
Customer ID Name Address
-----------------------------------------------
<!-- END -->
<!-- BEGIN {D.Detail1} -->
$D{custid} $D{custname} $D{address}
<!-- END -->

Etiquetas de plantillas de texto

Palabra clave etiqueta

Descripción

<!-- BEGIN {DH} -->

Comienza en encabezado del documento. Documento significa la salida de texto actual. Por ejemplo, la parte del encabezado HTML.

<!-- END -->

Termina la sección.

<!-- BEGIN {DF} -->

Comienza el pie del documento. Por ejemplo, la parte del pie del documento HTML.

<!-- END -->

Termina la sección

<!-- BEGIN {PH} -->

Comienza la sección de cabecera de página.

<!-- END -->

Termina la sección.

<!-- BEGIN {PF} -->

Comienza la sección de pie de página.

<!-- END -->

Termina la sección.

<!-- BEGIN {RH} -->

Comienza la sección de encabezado del informe.

<!-- END -->

Termina la sección

<!-- BEGIN {RF} -->

Comienza la sección de pié de informe.

<!-- END -->

Termina la sección

<!-- BEGIN {D.DetailID} -->

Comienza la sección de detalle. Las secciones serán identificadas por su ID.

<!-- END -->

Termina la sección.

<!-- BEGIN {GH.DetailID.GroupID} -->

Comienza el encabezado de agrupamiento. La sección será identificada tanto por el ID del detalle como por el del agrupamiento.

<!-- END -->

Termina la sección.

<!-- BEGIN {GF.DetailID.GroupID} -->

Comienza el pie de agrupamiento. La sección será identificada tanto por el ID del detalle como por el del agrupamiento.

<!-- END -->

Termina la sección.

Scripts en plantillas de texto

En las plantillas de texto podemos usar scripts. Un script deberá estar delimitado por las etiquetas "<%" y "%>". Veamos un ejemplo: supongamos que en un informe hemos declarado una variable totalizadora llamada IMPORTE_TOTAL y queremos que se imprima con el punto como separador de miles y la coma como separador decimal. Para ello vamos a necesitar un script que en la plantilla de texto se declarará del modo siguiente:

Total general: <%function formatNumber(num) {
    if (!num || num == 'NaN') return '-';
    if (num == 'Infinity') return '&#x221e;';
    num = num.toString().replace(/\$|\,/g, '');
    if (isNaN(num))
        num = "0";
    sign = (num == (num = Math.abs(num)));
    num = Math.floor(num * 100 + 0.50000000001);
    cents = num % 100;
    num = Math.floor(num / 100).toString();
    if (cents < 10)
        cents = "0" + cents;
    for (var i = 0; i < Math.floor((num.length - (1 + i)) / 3) ; i++)
        num = num.substring(0, num.length - (4 * i + 3)) + '.' + num.substring(num.length - (4 * i + 3));
    return (((sign) ? '' : '-') + num + ',' + cents);
}
formatNumber($V{IMPORTE_TOTAL}) %>

Ejemplo del resultado:

Total general: 123.254,33.

Funciones para la gestión de orígenes de datos

Las expresiones de campo pueden contener algunas referencias de funciones simples. Estas funciones ayudarán a aplicar operaciones básicas en los datos u obtener meta información de los orígenes de datos. Las funciones son a nivel de origen de datos.

El nombre de la función se especifica tras el ID del origen de datos, separada por un punto.

La sintaxis de una función de origen de datos es:

IdOrigenDedatos.funcion()

Y en scripts o en plantillas:

$D{IdOrigenDeDatos.funcion()}

Son:

rowCount()

Devuelve el número de filas del origen de datos. Ejemplo:

articulos.rowCount() or $D{articulos.rowCount()}

isEmpty()

Devuelve verdadero si el origen de datos no tiene registros. Ejemplo:

articulos.isEmpty() or $D{articulos.isEmpty()}

isNotEmpty()

Devuelve verdadero si el origen de datos tiene al menos un registro. Ejemplo:

articulos.isNotEmpty() or $D{articulos.isNotEmpty()}

isAvailable()

Devuelve el resultado del método isAvailable() en el origen de datos. Si está disponible, devolverá true, si no lo está, false. Ejemplo:

articulos.isAvailable() or $D{articulos.isAvailable()}

isValid()

Devuelve el resultado del método isValid() en el origen de datos. Si está disponible, devolverá true, si no lo está, false. Ejemplo:

articulos.isValid() or $D{articulos.isValid()}

update()

Fuerza la función update() para el origen de datos. Esto puede se útil si queremos actualizar manualmente un origen de datos definido por el usuario. Forces the update() function on the data source. Usar con precaución. Si por ejemplo, la usamos en el detalle de un informe, por cada línea del mismo estaremos forzando la actualización del origen. Ejemplo:

articulos.update() or $D{articulos.update()}

Última actualización