BIRT – Display text of a multi-select parameter

 

Normalmente cuando quieres utilizar el texto que se muestra al usuario para un parámetro, en vez del valor, utilizas la propiedad params[«parameterName»].displayText en un «dynamic text» en tu reporte. Si intentas hacer esto con un parámetro que permite la selección de múltiples valores, sólo obtendrás un valor nulo o en blanco. La opción es que utilices un script en el método onFetch del DataSet para reemplazar los valores del parámetro con los valores del campo que utilizas para mostrarlo al usuario.

Necesitas declarar una variable en el método «initialize» del reporte que contendrá las claves de los valores seleccionados, separados por una coma.

parameterSelectedValues=params["parameterName"].value.join(",");

 

después reemplazamos las claves en el método «onFetch» del DataSet

if(parameterSelectedValues.indexOf(row["id"].toString()) != null){
    parameterSelectedValues=parameterSelectedValues.replace(row["id"].toString(),row["name"].toString());
} 

 

y finalmente colocar un DynamicText en tu reporte con el valor

parameterSelectedValues;

 

El ejemplo completo lo encuentras aquí.

 

BIRT – Ajuste de Texto (text wrapping)

Hay ocasiones que los títulos de los reportes, o el valor de algún registro, son demasiado largos como para ser desplegados en una sola línea. En estos casos necesitas hacer el ajuste del texto («word wrapping» o «text wrapping»). Esta es la opción por defecto si utilizas un «Dynamic Text», siempre y cuando, el texto que quieras ajustar contenga palabras separadas por espacios. Si es una cadena larga pero que no contiene espacios, no funcionará. Para esos casos puedes ajustar el texto mediante un script según se explica aquí.

GIMP – Engrosar texto

Existen diversas familias de fuentes que puedes escoger para un texto. Hay algunas que cuentan con variantes de tipo ‘bold’ como ‘Arial’ y su respectiva ‘Arial Black’. Pero ¿cómo hacemos para engrosar un texto que de una familia de fuente que no tiene esta variante?

Existen varias soluciones, como duplicar el texto en una capa y moverla un poco a la derecha o izquierda. Yo prefiero convertir el texto en un trazo (path) y luego trazarla con alguna herramienta de dibujo. Para hacer esto, primero selecciona el texto que quieres engrosar y da clic en ‘Path from Text’

Luego ve a la pestaña de trazos y selecciona el trazo que se generó. Da clic en ‘stroke path’ y selecciona la herramienta de dibujo que prefieras.

     

Fuentes:
http://wahmaholic.com/2009/05/how-to-make-fonts-bold-in-gimp/ 

BIRT – Merge and Split Cells

A la hora de crear un reporte en BIRT es muy util, para cuestiones de diseño, combinar o dividir celdas -pero no necesariamente fácil-.
Para combinar celdas en un reporte simplemente tienes que seleccionarlas y dar clic derecho en «merge cells».
Para dividir una columna que previamente hemos combinado y tiene contenidos -una etiqueta (label) por ejemplo- es un poco mas complicado. Primero tienes que seleccionar la celda en la vista «outline», ya que no podras hacerlo directamente en el editor porque seleccionaras la etiqueta o el contenido de la celda. Una vez seleccionada la celda tienes que dar un clic derecho justo sobre el borde que aparece cuando seleccionamos la celda, como se muestra en la imagen superior, y dar clic derecho en «split cells».
Listo!

Me costo mucho trabajo encontrar la forma de dividir las celdas, creo que no debería ser así. Esperemos que en versiones posteriores (yo tengo la 2.6.1) sea de una forma un poco más sencilla.

Fuentes:
news.eclipse.birt

Java – Concatenar RTF’s

Para concatenar varios archivos RTF’s en un solo RTF lo unico que tenemos que hacer es:

    remover la etiqueta rtf de fin de documento del primer archivo
    remover la etiqueta de inicio de documento y fin de documento de archivos subsecuentes
    remover la etiqueta de inicio de documento del ultimo archivo

esta idea surgio a partir de este post.
El problema es identificar la etiqueta de inicio de documento, ya que depende de la codificacion que se utilizo para crear el archivo. Aqui dejo el codigo que utilicé, espero posteriormente mejorarlo -mediante el uso de expresiones regulares– para que pueda concatenar cualquier RTF (independiente de la codificación). Si alguien sabe como hacer esto, le agradecería deje un comentario ;-).
Los documentos de entrada como el documento que se regresa son representados como bytes, para que sea más fácil su manejo -ej. documentos almacenados en la base de datos-

private byte[] concatenateRTF(List documentos)
throws UnsupportedEncodingException {
StringBuffer rtf = new StringBuffer(), subRtf;
int indexOfEndTag, indexOfBeginTag;
final String CHARSET = «UTF-8»;
final String BEGIN_TAG = «{\\rtf1\\ansi\\ansicpg1252\\uc1 \\deff0\\deflang3082\\deflangfe3082»;
final String END_TAG = «\\par }»;
for (int docNumber = 0; docNumber < documentos.size(); docNumber++) { byte[] contenido = documentos.get(docNumber); if (contenido != null) { if (docNumber == 0) { rtf = new StringBuffer(new String(contenido, CHARSET)); indexOfEndTag = rtf.lastIndexOf(END_TAG); if (indexOfEndTag != -1) rtf = rtf.replace(indexOfEndTag, indexOfEndTag + END_TAG.length(), ""); } else if (docNumber < documentos.size() - 1) { subRtf = new StringBuffer(new String(contenido, CHARSET)); indexOfBeginTag = subRtf.indexOf(BEGIN_TAG); if (indexOfBeginTag != -1) subRtf = subRtf.replace(indexOfBeginTag, indexOfBeginTag + BEGIN_TAG.length(), ""); indexOfEndTag = subRtf.lastIndexOf(END_TAG); if (indexOfEndTag != -1) subRtf.replace(indexOfEndTag, indexOfEndTag + END_TAG.length(), ""); rtf.append(subRtf); } else { subRtf = new StringBuffer(new String(contenido, CHARSET)); indexOfBeginTag = subRtf.indexOf(BEGIN_TAG); if (indexOfBeginTag != -1) subRtf = subRtf.replace(indexOfBeginTag, indexOfBeginTag + BEGIN_TAG.length(), ""); rtf.append(subRtf); } } } return rtf.toString().getBytes(CHARSET); } [/sourcecode] byte!