[SOLUCIONADO]Error en JasperReports

Gente, buen día, les escribo por lo siguiente, resulta que en la UNT estamos realizando algunas aplicaciones internas con Toba y al momento de visualizar un reporte, el log tira el siguiente error

[o:Response$UndeclaredThrowableErrorMarker]:“FATAL: UNDECLARED RuntimeException PASSED TO PHP. java.lang.Exception: CreateInstance failed: new java.lang.String((o:array_of_B)null). Cause: java.lang.NullPointerException VM: 1.7.0_65@http://java.oracle.com/” at:
#-9 php.java.bridge.Response.wrapUndeclared(Response.java:92)
#-8 php.java.bridge.Response$Writer.setResultException(Response.java:125)
#-7 php.java.bridge.Response.setResultException(Response.java:547)
#-6 php.java.bridge.JavaBridge.setException(JavaBridge.java:427)
#-5 php.java.bridge.JavaBridge.CreateObject(JavaBridge.java:510)
#-4 php.java.bridge.Request.handleRequest(Request.java:453)
#-3 php.java.bridge.Request.handleRequests(Request.java:491)
#-2 php.java.bridge.http.ContextRunner.run(ContextRunner.java:146)
#-1 php.java.bridge.ThreadPool$Delegate.run(ThreadPool.java:60)
#0 /home/javier/Toba/toba_2.5.0/php/3ros/JavaBridge/java/Java.inc(248): java_ThrowExceptionProxyFactory->getProxy(3, ‘java.util.HashM…’, ‘’, false)
#1 /home/javier/Toba/toba_2.5.0/php/3ros/JavaBridge/java/Java.inc(388): java_Arg->getResult(false)
#2 /home/javier/Toba/toba_2.5.0/php/3ros/JavaBridge/java/Java.inc(391): java_Client->getWrappedResult(false)
#3 /home/javier/Toba/toba_2.5.0/php/3ros/JavaBridge/java/Java.inc(569): java_Client->getInternalResult()
#4 /home/javier/Toba/toba_2.5.0/php/3ros/JavaBridge/java/Java.inc(1924): java_Client->createObject(‘java.lang.Strin…’, Array)
#5 /home/javier/Toba/toba_2.5.0/php/nucleo/lib/salidas/toba_vista_jasperreports.php(106): Java->Java(‘java.lang.Strin…’, NULL)
#6 /home/javier/Toba/toba_2.5.0/proyectos/sni/php/ABM/ci_recibos.php(82): toba_vista_jasperreports->set_parametro(‘numeros’, ‘S’, NULL)
#7 /home/javier/Toba/toba_2.5.0/php/nucleo/lib/salidas/toba_vista_jasperreports.php(244): ci_recibos->vista_jasperreports(Object(toba_vista_jasperreports))
#8 /home/javier/Toba/toba_2.5.0/php/nucleo/toba_solicitud_web.php(329): toba_vista_jasperreports->generar_salida()
#9 /home/javier/Toba/toba_2.5.0/php/nucleo/toba_solicitud_web.php(185): toba_solicitud_web->servicio__vista_jasperreports(Array) #10 /home/javier/Toba/toba_2.5.0/php/nucleo/toba_solicitud_web.php(60): toba_solicitud_web->procesar_servicios()
#11 /home/javier/Toba/toba_2.5.0/php/nucleo/toba_nucleo.php(79): toba_solicitud_web->procesar()
#12 /home/javier/Toba/toba_2.5.0/proyectos/sni/www/aplicacion.php(24): toba_nucleo->acceso_web()
#13 {main}]

Primero busqué en el foro si alguien tuvo un problema similar, y encontré lo siguiente

http://foro.comunidad.siu.edu.ar/index.php?topic=8412.msg35993
Tema: SOLUCIONADO - error con jasper report (Leído 24 veces)

Pero la solución que plantean no me sirvió, ya que arranque varias veces el JavaBridge y no se soluciona.

Lo raro del tema es lo siguiente, en la aplicación la idea es que el reporte surja a partir de que el usuario presiona “Grabar”, por lo tanto en el CI desde donde se lanza el evento tengo lo siguiente

function extender_objeto_js()
{
if ($this->get_id_pantalla() == ‘alta’) {
echo "
{$this->objeto_js}.evt__procesar = function(params) {

				location.href = vinculador.get_url(null, null, 'vista_jasperreports', {'path': params});
				return false;
			}
		";
    }
}

En cambio en otra pantalla en donde se puede hacer una reimpresión del reporte original, el reporte funciona de maravillas, y el código en ese lugar es:

function extender_objeto_js()
{
if ($this->get_id_pantalla() == ‘visualiza’) {
echo "
{$this->dep(‘form’)->objeto_js}.evt__imprimir = function(params) {

				location.href = vinculador.get_url(null, null, 'vista_jasperreports', {'path': params});
				return false;
			}
		";
    }
}

La única diferencia que veo es que en donde el reporte funciona se llama al form que tiene el evento ($this->dep(‘form’)->objeto_js), en cambio en donde genera el error, al no tener form directamente $this->objeto_js.

Alguna idea??

Desde ya y como siempre muchas gracias!

Hola Javier,

Aparentemente el despelote se arma con la siguiente linea:

toba_vista_jasperreports->set_parametro('numeros', 'S', NULL)

Probaste poniendole una cadena vacia en lugar de null?. Lo raro es que deberia tomar el valor por defecto del parametro (que es cero) en cambio evidentemente toma el null y le pasa eso.

Lo raro del tema es lo siguiente, en la aplicación la idea es que el reporte surja a partir de que el usuario presiona "Grabar", por lo tanto en el CI desde donde se lanza el evento tengo lo siguiente function extender_objeto_js() { if ($this->get_id_pantalla() == 'alta') { echo " {$this->objeto_js}.evt__procesar = function(params) {
				location.href = vinculador.get_url(null, null, 'vista_jasperreports', {'path': params});
				return false;
			}
		";
    }
}</blockquote>

Pero con eso no estaria grabando, sino imprimiendo el jasper de un evento que nunca se envio al server… osea, ahi estas cambiando la url antes de hacer el submit, con lo cual aunque no tirara una excepcion jasper… igual no se si encontraria el registro (aunque eso es harina de otro costal).

En cambio en otra pantalla en donde se puede hacer una reimpresión del reporte original, el reporte funciona de maravillas, y el código en ese lugar es: function extender_objeto_js() { if ($this->get_id_pantalla() == 'visualiza') { echo " {$this->dep('form')->objeto_js}.evt__imprimir = function(params) {
				location.href = vinculador.get_url(null, null, 'vista_jasperreports', {'path': params});
				return false;
			}
		";
    }
}

La única diferencia que veo es que en donde el reporte funciona se llama al form que tiene el evento ($this->dep(‘form’)->objeto_js), en cambio en donde genera el error, al no tener form directamente $this->objeto_js.

Quizas el tema no sea de donde se dispara la impresion, sino que para llegar a la pantalla donde esta el form… tuviste que hacer otros pasos y por tanto se cargaron otras variables en el CI, por ahi es una cuestion temporal la que te esta complicando, ya que el llamado es manual, independientemente de donde se dispare.

Yo miraria el estado interno del CI en ambos lugares, si hay diferencias… quizas sea la causa porque entre por distintos codepaths. Tiene toda la pinta de ser algo generado por codigo, como te decia arriba…quizas el null que le pasas a esa funcion, no le gusta con un string.

Saludos

Richard, no te equivocas… el problema está en que los parámetros que estoy enviando son NULL, por lo tanto debería chequear como estoy obteniendo los mismos.

Tengo que aprender a leer los logs… :s

Muchas gracias!!

Vuelvo a abrir el tema pero para hacerte una consulta más. Resulta que el parámetro que tengo que enviar al report es un dato que ingresa el usuario en el form que visualiza en la pantalla. Entonces al presionar el botón guardar se activa primero la extensión JS que llama al reporte y después guarda la información en la BD. Por lo tanto cuando quiero enviar algo que el usuario inserto en el form, antes de guardarlo en la db, el valor del campo me viene null y de ahí el error original.

Cómo puedo hacer para capturar el dato que el usuario ingreso en el form antes de que se ejecute el js???

Me explico?

Nuevamente, muchas gracias!!!

Hola Javier,

ejecutando el guardado antes que la impresion :D. No hay mucha ciencia realmente, tene en cuenta que el JS para navegar a la impresion lo podes sacar en cualquier momento, con lo cual bien podrias hacerlo en el extender_objeto_js del CI mediante un condicional y a nivel global para que se ejecute si o si.

Por otro lado, no pude evitar notar que pasas un parametro ‘path’… ojo al piojo con eso, recorda que esto va por GET y queda en el historial del browser, ademas de ser facilmente visible y modificable incluso por un administrativo, si pasas un path posta… chequealo bien en el destino.

Saludos

Richard, gracias por la respuesta, lo voy a cambiar para grabar antes, parece una obviedad pero no la veia, por eso es bueno consultar!!! :slight_smile:

Ahora consulta por lo siguiente0

Por otro lado, no pude evitar notar que pasas un parametro 'path'... ojo al piojo con eso, recorda que esto va por GET y queda en el historial del browser, ademas de ser facilmente visible y modificable incluso por un administrativo, si pasas un path posta.. chequealo bien en el destino.

Si no le paso el path por aquí como lo seteo?

y la última (espero), al grabar yo tengo el siguiente código

function evt__procesar()
{

        toba::notificacion()->agregar('Se agrego correctamente', 'info');

        $this->dep('dt_recibo')->resetear();
        $this->set_pantalla('alta');
}

Me podrías explicar cómo hago para realizar la llamada JS al Jasper justo despues de haber mostrado la notificación??

Muchas gracias!

Hola Javier,

podes hacer uso del manejo de sesion de toba. Con esto podes pasar el dato de una operacion a otra, solo recorda eliminarlo una vez que ya lo usaste, sino perdura hasta que cierres la sesion.

Saludos

Richard, gracias por la paciencia. Cómo puedo hacer esto último? Estamos tratando de entender el funcionamiento de Toba para poder llevar varias aplicaciones obsoletas en la institución a esta plataforma. Nos falta bastante camino por recorrer como verás!

function evt__procesar() {
        toba::notificacion()->agregar('Se agrego correctamente', 'info');

        $this->dep('dt_recibo')->resetear();
        $this->set_pantalla('alta');

}

Me podrías explicar cómo hago para realizar la llamada JS al Jasper justo despues de haber mostrado la notificación??

Nuevamente gracias!

Hola Javier,

en el mismo CI podrias agregar algo como esto:



function extender_objeto_js()
{
      if ($this->alta_completa) {
          $parametros = array(lo que sea que vaya aca);
          toba::vinculador()->navegar_a(null, null, $parametros);
      }
}

Igual tene en cuenta que dificilmente se vea la notificacion quizas… pero con eso haces el redirect.

Saludos

Muchas gracias Richard!