Para modificar la consulta de un DataSet puedes utilizar la sección “Property Binding”

en mi caso necesitaba reemplazar en la conulta el valor de un parámetro.

Para reemplazar una cadena con otra lo puedes hacer en el “Expression Builder” de la siguiente manera



var q=new Packages.java.lang.String("SELECT COUNT(*) AS TOTAL \
FROM @OFICINA.EMPLEADOS A, @OFICINA.PUESTOS R, \
@OFICINA.SALARIOS D, @OFICINA.DEPTOS O \
WHERE A.NID_ACO_EXP= R.NID_ACO \
R.NID_DMD=D.NID_DMD AND R.NORDEN=O.NID_ORDEN \
AND TRUNC(R.FECHA) BETWEEN :INICIO AND :FIN");
q.replaceAll("@OFICINA",params["OFICINA"].value);

el código es javascript, pero podemos utilizar clases Java también. En este caso utilizamos la clase String de Java en vez de Javascript, porque el método de javascript no reemplaza todas las coincidencias.

Fuentes:
birt exchange

Anuncios

Cuando tienes varios reportes, es buena idea crear una librería para reutilizar elementos en los reportes. Un ejemplo común es cuando necesitamos usar el mismo encabezado y pie de página para los reportes.

BIRT nos permite agregar algunos elementos dinámicos -tales como el número de páginas, la fecha e incluso un valor obtenido mediante código javascript en un DynamicText- El problema es que esto dependerá de cada reporte, así que ¿cómo agregamos elementos dinámicos desde una librería a nuestro reporte?

Pues habrá que crear una “master page” en la librería donde pongamos elementos “DynamicText” en el encabezado y que estos desplieguen el valor de un parámetro. Después podemos modificar el valor del parámetro en cada reporte, y así, tener un título personalizado pero manteniendo el formato.

Si además, queremos obtener el título mediante una consulta a la base de datos. Lo que tenemos que hacer es crear el DataSource a la base de datos y un DataSet con la consulta que obtiene el título, por ejemplo


SELECT DESCRIPCION
FROM OFICINAS
WHERE ID=:OFICINA

Luego, debemos poner el siguiente código en el evento “beforeFactory” de nuestro reporte


//public final static int MODE_GENERATION = 1; //This mode is for generate the report document. Typically used in Report Engine run task
//public final static int MODE_PRESENTATION = 2; //This mode is for present data that saved in report document, without further data manipulation operation. Typically used in report engine render task
//public final static int DIRECT_PRESENTATION = 3;//This mode is to execute the data query without create report document. It is used in report engine runAndRender task.
//public final static int MODE_UPDATE = 4; //This mode is used to update the existing report document with new queries. Typicially used in IV.
importPackage( Packages.org.eclipse.birt.report.model.api );
importPackage(Packages.java.lang);
importPackage(Packages.java.util);
importPackage(Packages.org.eclipse.birt.report.data.adapter.api);
importPackage(Packages.org.eclipse.birt.report.model.api);
importPackage(Packages.org.eclipse.birt.data.engine.api.querydefn);
var myconfig = reportContext.getReportRunnable().getReportEngine().getConfig();
var des = DataRequestSession.newSession(myconfig, new DataSessionContext(3));
var dsrc = reportContext.getDesignHandle().findDataSource("dsrcOficina");
var dset = reportContext.getDesignHandle().findDataSet("dsetOficina");
des.defineDataSource(des.getModelAdaptor().adaptDataSource(dsrc));
des.defineDataSet(des.getModelAdaptor().adaptDataSet(dset));
var paramBinding = new InputParameterBinding("param_1", new ScriptExpression("\""+ params['IDOFICINA'].value +"\"") );
queryDefinition = new QueryDefinition( );
queryDefinition.setDataSetName( "dsetOficina" );
queryDefinition.addInputParamBinding( paramBinding );
queryDefinition.setAutoBinding(true);
var pq = des.prepare( queryDefinition );
var qr = pq.execute( null );
var ri = qr.getResultIterator( );
if ( ri.next( ) )
{
params["Titulo"].value = ri.getString("DESCRIPCION");
}
ri.close( );
qr.close( );
des.shutdown( );

Es importante poner los nombres exactamente igual que en el diseñador.
En nuestro caso, el parámetro “IDOFICINA” es de tipo String, así que lo ingresamos de la siguiente manera


var paramBinding = new InputParameterBinding( "param_1",new ScriptExpression("\""+ params['IDOFICINA'].value +"\"") );

si fuera un Integer tendría que ser de la siguiente manera


var paramBinding = new InputParameterBinding( "param_1",new ScriptExpression(params['IDOFICINA'].value) );

El valor de ScriptExpression debe ser un bloque de javascript válido, cómo si lo ingresaramos en la ventana “ExpressionBuilder” 🙂

Fuentes:
eclipse forums
birt exchange

Al crear un DataSet con una consulta con parámetros, BIRT me arrojaba el error

org.eclipse.birt.data.engine.core.DataException: Failed to prepare the query execution for the data set: t_host
Cannot get the type for parameter: 1.
org.eclipse.birt.report.data.oda.jdbc.JDBCException: Cannot get parameter type.
SQL error #1:Unsupported feature

Al parecer el problema sólo se presenta con la base de datos de Oracle y ha sido resuelto a partir de la versión 4.2.1 de BIRT. Así que, si tienes una versión anterior, basta con actualizar para resolver el problema (Help->Check for Updates).

Fuentes:
eclipse forums

Cuando estás diseñando un reporte es muy útil la pestaña de “Preview” para ver los cambios que estás haciendo y probar que todo funcione correctamente.

Con Eclipse for Java Developers versión “Juno” en Ubuntu 12.04 a 64 bits abrí un reporte que tenía y al dar clic en Preview me arrojó el error:

Unhandled event loop exception No more handles [Unknown Mozilla path (MOZILLAFIVEHOME not set)]

Encontré este post que explica el problema y la forma de solucionarlo. Desafortunadamente a mi no me funcionó la solución. Intenté con diferentes versiones de XULRunner -cabe destacar que xulrunner a 64 bits sólo lo encontré a partir de la versión 5.0- y también intenté la opción de utilizar WebKit pero tampoco funcionó.

A veces Eclipse se cerraba de forma inesperada y en la consola registraba el siguiente error

[000:000] Browser XEmbed support present: 1
[000:000] Browser toolkit is Gtk2.
[000:000] Using Gtk2 toolkit
[000:000] Warning(optionsfile.cc:47): Load: Could not open file, err=2
[000:000] No bp log location saved, using default.
[000:001] Browser XEmbed support present: 1
[000:001] Browser toolkit is Gtk2.
[000:001] Using Gtk2 toolkit

Finalmente encontré una solución alterna al problema. Al agregar la opción “-Dorg.eclipse.swt.browser.DefaultType=mozilla” al archivo eclipse.ini y dar clic en Preview, Eclipse muestra el mensaje “Internal browser is not available” pero abre mi navegador por default (Chrome) y muestra el reporte 😀

Al abrir un reporte en Eclipse Juno (en el cual instale BIRT por separado) no me mostraba el diálogo para ingresar los parámetros. Me arrojaba el siguiente error:

HTTP ERROR: 500

Problem accessing /viewer/parameter. Reason: Plug-in “org.eclipse.birt.report.viewer” was unable to instantiate class “org.eclipse.birt.report.servlet.BirtEngineServlet”.

En el log me mostraba también la causa de la excepción:

NoClassDefFoundError: org.apache.axis.transport.http.AxisServlet

Después de mucho intentar y no encontrar una solución, decidí probar con otra instancia de Eclipse. Así que instale -descomprimí- Eclipse IDE for Java and Report Developers (Juno 4.2). Y con eso ya pude abrir el reporte e ingresar los parámetros.

Pero ahora tengo otro problema, me arroja la excepción

Cannot get the type for parameter: 1.

    org.eclipse.birt.report.data.oda.jdbc.JDBCException: Cannot get parameter type.

SQL error #1:Unsupported feature;

java.sql.SQLException: Unsupported feature

Al parecer este error ya fue arreglado, sólo tengo que esperar a que liberen la actualización 😦

Por lo pronto usare Eclipse Indigo (3.7.2) para modificar los reportes :S

 

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í.

 

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í.