Como usar Scriptlets con iReport 3.5.3 y Netbeans
No estoy acostumbrado a escribír post como este, que tengan que ver con desarrollo y todo mi rollo de informática, pero esto me costo un poco ya que no hay mucha información sobre este rollo en internet, que explicaran paso a paso como hacerlo y por eso decidí dedicarle un post a esto, sé que a los que entran por aquí regularmente no les va a interesar, pido disculpas de una vez
Scriptlets
Se le llama así al uso de metodos, escritos en java, en un reporte hecho en iReport. Por ejemplo en lo que estoy haciendo era necesario jalar de una Base de Datos un valor entero, pero en el mismo reporte tenía que pasar a letras dicho número, esto es fácil hacerlo en código, pero no por medio de SQL, entonces lo más fácil (según yo) era usar una función en java, mandar como parametro mi número y que la función retornara el número en letras.
La Clase a ser usada como Scriptlet
Para que iReport reconozca como scriptlet una clase, esta clase debe de heredar (extend) de JRDefaultScriptlet, en manuales dice que se puede heredar de JRAbstractScriptlet para poder implementar otros métodos que se ejecutaran en distintos puntos del reporte. Pero a mi lo que me interesaba era ejecutar este método cada vez que se imprimia un registro.
Entonces mi clase quedaba definida así:
package presentacion.reportes.jasper;
import net.sf.jasperreports.engine.JRAbstractScriptlet;
import net.sf.jasperreports.engine.JRDefaultScriptlet;
import net.sf.jasperreports.engine.JRScriptletException;
public class NumerosALetrasScriptlet extends JRDefaultScriptlet {
//..... aqui va todo el código de pasar un número a letras
//este sera el metodo que llamaré desde el reporte
public String convertirLetras(int numero) throws JRScriptletException{
num_letras = centena(numero);
return num_letras;
}
}
Entonces el paquete de mi clase es: presentacion.reportes.jasper el archivo se llama NumerosALetrasScriptlet.java
HUBICACION DE LOS ARCHIVOS:
Como estamos trabajando en java, hay una carpeta destinada a los archivos .java y otra para los .class en mi proyecto están así:
Los .java
C:\….\Proyectos Netbeans\MiProyecto\src\presentacion\reportes\jasper
Los .class
C:\…..\Proyectos Netbeans\MiProyecto\build\classes\presentacion\reportes\jasper
El Archivo .jrxml
Este que es el archivo donde hacemos nuestro reporte, los tengo hubicados donde están los .class (aunque sí funciona que este a la par de los .java) es decir en:
C:\…..\Proyectos Netbeans\MiProyecto\build\classes\presentacion\reportes\jasper
EL SCRIPTLET EN IREPORT
Clic derecho sobre el nombre del reporte ->propiedades, y ahi buscamos “Scriptlet Class” y escribimos el paquete junto con el nombre de la clase. En mi caso es presentacion.reportes.jasper.NumerosALetrasScriptlet
IMPORTS
En la parte de “imports” importe el paquete donde esta mi clase:
presentacion.reportes.jasper.*

CLASSPATH
Para agregar carpetas al classpath de iReport lo podemos hacer en “Herramientas -> Opciones” y buscamos la pestaña “classpath”
Aquí yo agregué 3, no estoy seguro de si son necesarios esas tres direcciones que puse, pero así me funcionó y así lo voy a dejar por el momento
1era:
el path donde estan las clases (todas, no solo las de presentacion.reportes.jasper)
C:\…..\Proyectos Netbeans\MiProyecto\build\classes
2da:
El Path donde estan los archivos .java (donde esta el scriptlet)
C:\….\Proyectos Netbeans\MiProyecto\src\presentacion\reportes\jasper
3era:
El Path donde esetan los archivos .class
C:\…..\Proyectos Netbeans\MiProyecto\build\classes\presentacion\reportes\jasper
Estas direcciones son las mismas que había puesto más arriba, pero igual las vuelvo a poner.
USANDO LA FUNCION EN EL REPORTE
Luego de ya tener configurado todo lo anterior, hay que usar el método que querramos de la clase. En mi caso como dije mi metodo se llama
convertirLetras(int numero)
Recibe como parametro un entero.
En la paleta de componentes jalamos un “Text Field” y ya que este en el reporte le damos clic derecho -> Edit Expresion
y ahí para usar el método escribimos
$P{REPORT_SCRIPTLET}.convertirLetras($F{nota}.intValue())
En esta expresion
el parametro REPORT_SCRIPLET es un parametro que por default ya tiene iReport para manejar los scriplets, incluso lo podemos buscar en la ventana de “Report Inspector” y ver que su valor cambia dependiendo de lo que ingresemos en la parte de “Scriplet class” en las opciones del reporte.
A esto
$P{REPORT_SCRIPTLET}
le agregamos el nombre del método “convertirLetras” y le mandamos como parametro nuestro entero para que retorne el valor en letras. En mi caso mi campo traido de la BD se llama “nota” pero es un BigInt … entonces como en mi metodo recibo un “int” por cualquier cosa jale su valor entero. por eso esta como $F{nota}.intValue()
$P{REPORT_SCRIPTLET}.convertirLetras($F{nota}.intValue())
Esto fue lo que hice para que me funcionara el scriplet, tuve muchos problemas al principio porque en ningún lugar encontraba como hacer referencia a mi clase y en donde tenían que estar hubicados los archivos tanto los .class como mi .jrxml En un principio tenia mis .jrxml junto a los archivos .java y no a los .class
Otra cosa, por el momento solo he probado correr esto desde el iReports y no desde una aplicación, por lo que podría darme otros problemas, pero al menos ya estoy seguro de varias cosas que en un principio tuve que estar “adivinando” y probando sin saber si lo que estaba haciendo estaba bien, y al final no se mira tan complicado, lo que me frego fue la hubicación de los archivos creo yo. Gracias a Dios me salio.





Comentarios recientes