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

Si necesitas modificar el query de un dataset, en tiempo de ejecución, por cualquier motivo. Puedes utilizar la sección “Property Binding” en el editor o modificar la consulta en el evento “beforeOpen” del DataSet. Recuerda que el código que utilices en BIRT es javascript.

Por ejemplo, podemos utilizar un esquema dinámico de la siguiente forma


var query="SELECT FRECEPCION  FROM @ESQUEMA.DOCUMENTOS WHERE ID = ?";

query.replace(/@ESQUEMA/g,params["Esquema"].value);

El esquema lo recibimos como parámetro. En la función “replace” utilizamos la forma global para que reemplace todas las ocurrencias de “@ESQUEMA”, de lo contrario sólo sustituiría la primera.

Fuentes:
http://vhspiceros.blogspot.mx/2008/12/replace-all-en-javascript.html
http://www.w3schools.com/jsref/jsref_replace.asp

En el título de un reporte necesitaba poner el valor de un párametro, el detalle es que el párametro está enlazado a un DataSet, por lo tanto tiene un value y un displayText. En mi caso es un listado de oficinas, cada una tiene su clave y su nombre, p. ej. BIBL – BIBLIOTECA
Si pongo un DynamicText en el encabezado con el valor
params[“OFICINA”].displayText //despliega BIBLIOTECA
pero únicamente cuando genero el reporte desde Eclipse o en el Report Viewer con la operación “frameset”.
En mi aplicación tengo un botón para imprimir el reporte, que únicamente abre el enlace

http://jboss.midominio.com:8080/ReportViewer/run?__format=pdf&__report=rptInformeMensual.rptdesign&OFICINA=BIBL

para generar el reporte en un documento PDF.
El problema es que en el título, en vez de mostrar “BIBLIOTECA” me aparece el texto “NULL”.
Cómo de todos modos tengo el título de la oficina seleccionada en mi aplicación, decidí enviarla como un parámetro extra y así no tuve ningún problema.
La URL finalmente quedó así
http://jboss.midominio.com:8080/ReportViewer/run?__format=pdf&__report=rptInformeMensual.rptdesign&OFICINA=BIBL&TITULO=BIBLIOTECA
y mi DynamicText del encabezado
params[“TITULO”];

Si tu parámetro es de selección multiple (multi-select) tal vez te interesa ver esto.