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

Propiedades del Reporte

Propiedades del Reporte

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

propiedades->import|

propiedades->import

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())

uso del scriptlet

uso del scriptlet

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.

35 pensamientos en “Como usar Scriptlets con iReport 3.5.3 y Netbeans

    • jajaja sin casaca vos, ya me tenía como la chingada .. y en lo que encontraba habían pasos que como que se los saltaban y cosas así. pero sí salio, ahora es de probarlo ya en una app. saludos mano.

  1. Ninguna disculpa 😉 me parece muy bien que hagás este tipo de post también, siempre hay a quién le sirva, lo medio leí porque para mí eso de los «comandos» o no sé como le llaman está como en otro idioma jeje
    Saludos!

    • Gracias!, la verdad si hice este post por dos cosas, una para recordarme por sí algún día lo llego a necesitar y se me ha olvidado jaja y la otra porque si le puede ayudar a alguien.Gracias siempre por pasarte por aquí, saludos!

    • Podés crear una variable en iReports, por ejemplo de nombre Suma, luego te vas a propiedades, y en «calculation» le pones «sum», luego en «Variable Expresion» ingresas el campo de tu tabla que vas a sumar, por ejemplo tu campo «precio», luego eso lo asocias a un «Text Field», yo también estoy aprendiendo, y pues lo de la barra te lo debo.

  2. Hola buenos dias para todos, necesito sumar 2 variables que ya estan totalizadas.
    ejemplo:

    $V{Tvalor_cobrado} guarda el total del campo $F{valor_cobrado}
    $V{Tvalor_pagado} guarda el total del campo $F{valor_pagado}

    MI PREGUNTA O DUDA ES: Nesecito realizar operaciones de (suma,resta,division,multiplicacion de estas 2 variables en una tercera variable..

    COMO HAGO?? GRACIAS. SI ME PUEDEN COLABORAR.

  3. No sé si puedes o pueden ayudarme pero necesito pasar como parámetro una lista. Me explico mejor, quiero que el usuario elija de una lista los valores (1,2,3,4 ó todos) y que este valor se vaya a mi query y me genere el reporte. Estaba tratando pasarle al parámetro una lista y que el usuario eligiera de esa. Será que está bien?., alguien lo habrá hecho?.

    Espero sus respuesta, ojalá escriban. Gracias!! Lorena

  4. Hola quisiera saber como puedo suma dos
    $V{totalRI}
    $V{totalCEDULAS}
    Mi pregunata es la misma que
    MARTIN ARGOTY

    Nesecito realizar operaciones de (suma,resta,division,multiplicacion de estas 2 variables en una tercera variable..
    como puedo solucionar este problema

  5. hola:
    muchas por el tutorial!…y tambien agradesco el tiempo que invirtido junto con las ganas de compartir.

    creo que seguido a calbalidad los pasos descritos pero me da la siguiente advertencia:

    com.jaspersoft.ireport.designer.errorhandler.ProblemItem@18726f1

    java.lang.ClassNotFoundException: Reportes.Factura.UtilidadScriptlets

    starting from ModuleCL@19cd75a[com.jaspersoft.ireport] with possible defining loaders null and declared parents [ModuleCL@77eaf8[org.netbeans.core.multiview], ModuleCL@a23610[org.netbeans.modules.languages], ModuleCL@8ff4cf[org.openide.loaders], ModuleCL@13f136e[org.netbeans.modules.db], ModuleCL@8de462[org.netbeans.modules.queries], ModuleCL@d05c13[org.openide.nodes], ModuleCL@8046f4[org.jdesktop.layout], ModuleCL@15dd910[org.openide.explorer], ModuleCL@1bbd7b2[org.netbeans.modules.editor.mimelookup], ModuleCL@1b273cc[org.openide.dialogs], …12 more] com.jaspersoft.ireport.designer.outline.nodes.StylesNode@171b49e[Name=, displayName=Styles]

    he agregado las clases (tanto los .java como los .class y los .jrxml) al classpath, pero cuando termino de agregar los parametros en las propiedades (Scriptlet class, junto con los import) inmediatamente me aparece la advertencia, y no me deja ejecutar el informe.

    cualquier ayuda seria bienvenido y desde ya les agradesco por la informacion.

  6. Pingback: Los números de 2010 « robertogt’s blog

  7. Gracias, todas las ayudas en este tema son valiosas, alguien podria indicarme como enviar como parametro una lista de valores en Jasper?

  8. Excelente ejemplo.
    Yo lo probe y funciona perfecto solo agregando al path lo siguiente:

    —-
    el path donde estan las clases (todas, no solo las de presentacion.reportes.jasper)

    C:\…..\Proyectos Netbeans\MiProyecto\build\classes

  9. haber….HAY USUARIO QUE LE MANDA ERRORES AL HACER EL SCRIPTLET, ESO SE DEVE COMO ESTÁ DECLARADO TU CLASE…
    public abstract class NumberToLettesConverter 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 Static String convertNumberToLetter(double number) throws JRScriptletException{

    //Aqui ago todo el movimiento….
    }
    }

    –cuando yo ejecutaba la aplicacion en JAVA desde netbeans, me mandaba IReport un Error, decia que no era posible hacer el Scriptlet. NULL
    pues con va ser posible eso, si yo tenia en la clase un Static y Abstract, no era posible.suprimi el static y abstract..TODO ESTO FUNCIONA AL 100% GRACIAS EL QUE PUSO ESTE POST, ME SIRVOIO MUCHO…
    NOTA: NO ES NECESARIO DECLARAR LAS URL EN TU CLASSPATH

  10. Muchas gracias sobre todo por la voluntad de compartir la información, eso es algo valiosísimo en una persona con conocimiento, de verdad muchas gracias, am.. por cierto ubicación se escribe sin H, si aun tienes acceso a modificar el blog cambialo que para un conocimiento tan grande en programación no aguanta ese error ortográfico, espero no lo tomes a mal, saludos!!!

  11. Podria pedir porfavor si alguien ya pudo hacer el reporte… porder subir a internet su proyecto completo porfavor, lo he hecho pero tengo problemas al usar la class donde hago la conversion… Espero que alguien pueda ayudarme con este problema que me esta haciendo perder mucho tiempo

  12. Gracias hermano me salvaste yo queria hacer lo mismo que tu incluso el metodo es el mismo queria pasar un numero a letras y funciono con todo lo que habias hecho segui los pasos y 10 puntos. te agradesco mucho.

    Ahora solo el problema es que al implementaro completamente a mi clase java me sale este enorme error.

    nov 19, 2012 2:47:05 PM net.sf.jasperreports.engine.component.ComponentsEnvironment findBundles
    WARNING: Found two components for namespace http://jasperreports.sourceforge.net/jasperreports/components
    nov 19, 2012 2:47:05 PM net.sf.jasperreports.engine.component.ComponentsEnvironment findBundles
    WARNING: Found two components for namespace http://jasperreports.sourceforge.net/jasperreports/components
    nov 19, 2012 2:47:05 PM net.sf.jasperreports.engine.component.ComponentsEnvironment findBundles
    WARNING: Found two components for namespace http://jasperreports.sourceforge.net/jasperreports/components
    ERROR EN JREXCEPTION Errors were encountered when compiling report expressions class file:
    C:\Documents and Settings\Servidor\Mis documentos\NetBeansProjects\ProyectoAnamnesis\cheque_1353347226859_568094.java:50: error: illegal character: \8216
    private JRFillField field_AÑO_CHEQUE = null;
    ^
    C:\Documents and Settings\Servidor\Mis documentos\NetBeansProjects\ProyectoAnamnesis\cheque_1353347226859_568094.java:50: error: expected
    private JRFillField field_AÑO_CHEQUE = null;
    ^
    C:\Documents and Settings\Servidor\Mis documentos\NetBeansProjects\ProyectoAnamnesis\cheque_1353347226859_568094.java:119: error: illegal character: \8216
    field_AÑO_CHEQUE = (JRFillField)fm.get(«AÑO_CHEQUE»);
    ^
    C:\Documents and Settings\Servidor\Mis documentos\NetBeansProjects\ProyectoAnamnesis\cheque_1353347226859_568094.java:119: error: not a statement
    field_AÑO_CHEQUE = (JRFillField)fm.get(«AÑO_CHEQUE»);
    ^
    C:\Documents and Settings\Servidor\Mis documentos\NetBeansProjects\ProyectoAnamnesis\cheque_1353347226859_568094.java:241: error: illegal character: \8216
    value = ((java.lang.String)field_AÑO_CHEQUE.getValue()); //$JR_EXPR_ID=17$
    ^
    C:\Documents and Settings\Servidor\Mis documentos\NetBeansProjects\ProyectoAnamnesis\cheque_1353347226859_568094.java:241: error: ‘;’ expected
    value = ((java.lang.String)field_AÑO_CHEQUE.getValue()); //$JR_EXPR_ID=17$
    ^
    C:\Documents and Settings\Servidor\Mis documentos\NetBeansProjects\ProyectoAnamnesis\cheque_1353347226859_568094.java:349: error: illegal character: \8216
    value = ((java.lang.String)field_AÑO_CHEQUE.getOldValue()); //$JR_EXPR_ID=17$
    ^
    C:\Documents and Settings\Servidor\Mis documentos\NetBeansProjects\ProyectoAnamnesis\cheque_1353347226859_568094.java:349: error: ‘;’ expected
    value = ((java.lang.String)field_AÑO_CHEQUE.getOldValue()); //$JR_EXPR_ID=17$
    ^
    C:\Documents and Settings\Servidor\Mis documentos\NetBeansProjects\ProyectoAnamnesis\cheque_1353347226859_568094.java:457: error: illegal character: \8216
    value = ((java.lang.String)field_AÑO_CHEQUE.getValue()); //$JR_EXPR_ID=17$
    ^
    C:\Documents and Settings\Servidor\Mis documentos\NetBeansProjects\ProyectoAnamnesis\cheque_1353347226859_568094.java:457: error: ‘;’ expected
    value = ((java.lang.String)field_AÑO_CHEQUE.getValue()); //$JR_EXPR_ID=17$
    ^
    10 errors

    BUILD SUCCESSFUL (total time: 1 minute 32 seconds)

    • sino me equivoco tiene algo que ver con el Field referente al AÑO le devuelve nulo y por eso retorna esta excepcion ahora el problema es que no se por que lo devuelve nulo ya que en el preview del report mi sale todo bien el tema esta en el IDE que no sale ala hora de llamar al reporte…

  13. Pingback: iReport | Annotary

  14. Buena aportación, pero deseaba saber si puedo hacerte una consulta con respecto a agrupar registros, tengo que mostrar el total de las cuentas y el total por rubros de acuerdo al total de cuentas agradecería tú ayuda

  15. mi problemas es cuando genero el jar del proyecto y al ejecutarlo quiero imprimir el total de una venta en letras pero no aparece, en el netbeans funciona todo bien

Deja un comentario