[SOLUCIONADO] Llamada a Report desde un evento del cuadro

Gente estamos desarrollando un sistema interno en la UNT en toba, para realizar control de facturas, el tema es que nos solicitan que desde un cuadro el cual tiene un evento asociado, al presionar el botón del registro, aparte de realizar el proceso que debe hacer, manda a imprimir un reporte.

Buscando un poco encontramos la siguiente referencia

http://foro.comunidad.siu.edu.ar/index.php?topic=10065.msg43582

Ahí pudimos ver cómo el usuario estaba realizando la llamada. Lo copiamos y cambiamos las cosas que necesitábamos para nuestro proyecto. El tema es que ahora al presionar el botón, nos abre una pantalla de previsualización pero en blanco.

En la traza del error nos muestra lo siguiente:
java_ThrowExceptionProxyFactory->getProxy
Archivo: /home/javier/3/vendor/siu-toba/jasper/JavaBridge/java/Java.inc, lInea 215

java_Arg->getResult 

Archivo: /home/javier/3/vendor/siu-toba/jasper/JavaBridge/java/Java.inc, lInea 388

java_Client->getWrappedResult 

Archivo: /home/javier/3/vendor/siu-toba/jasper/JavaBridge/java/Java.inc, lInea 391

java_Client->getInternalResult 

Archivo: /home/javier/3/vendor/siu-toba/jasper/JavaBridge/java/Java.inc, lInea 569

java_Client->createObject 

Archivo: /home/javier/3/vendor/siu-toba/jasper/JavaBridge/java/Java.inc, lInea 1924

Java->Java 

Archivo: /home/javier/3/vendor/siu-toba/framework/php/nucleo/lib/salidas/toba_vista_jasperreports.php, lInea 133

Y sigue…

El link que genera es el siguiente
localhost/pif/1.0/aplicacion.php?ah=st5f7bdc370da2a3.59151097&ai=pif||3476&tcm=previsualizacion&ai=pif||3476&ts=vista_jasperreports&id_reporte=0

El parámetro id_reporte no lo está tomando y no entiendo porqué no lo toma. No sé si ese es el origen del error o alguna otra cosa.
Alguna sugerencia?

Lo raro es que si al reporte lo llamamos desde una operación diferente, este funciona. O sea el llamado que estamos utilizando no tira errores en una operación que tiene un form y desde ahí realizamos la llamada, nos muestra el reporte perfecto.

Desde ya muchas gracias!

Hola Javier,

esto depende de como lo estes recuperando en el CI que saca el reporte, supongo que lo tendran en el metodo ini().

Lo raro es que si al reporte lo llamamos desde una operación diferente, este funciona. O sea el llamado que estamos utilizando no tira errores en una operación que tiene un form y desde ahí realizamos la llamada, nos muestra el reporte perfecto.
Lo mas probable entonces es que tengan alguna conjuncion de codigo + metadatos que este generando despiole.

Subime el CI aunque sea para ver si veo algo raro.

Saludos

Lo solicitado.

Richard una consulta, si es posible me podrías explicar brevemente, cuál es flujo del programa al solicitar el reporte Jasper?

Muchas gracias!


ci_cierre_diario.rar (1.67 KB)

Hola Javier,

retomo lo de ayer con una inquietud extra, si el reporte funciona cuando es invocado desde otra operacion… entonces el error se produce al querer pasar como parametro la variable $s__id_exp… ya que al estar dentro de la misma operacion tiene valor… pero al venir desde otra distinta deberia estar no seteada, fijate de agregarle un var_dump justo antes de la llamada a $report->set_parametro y retorna antes de eso, aunque sea para que evalues si esta guardando el valor correcto o no.

La cosa seria mas o menos asi:

  • Realizas la invocacion de servicio via JS cuando volves a la pantalla inicial (yo agregaria un chequeo para saber si se mando a cerrar algo o no).
  • Eso crea una solicitud nueva que sigue su camino normal hasta el momento de procesar los servicios (crea objetos, los inicializa, atiende sus eventos… atiende el servicio), ahi reemplaza la generacion de html por la vista.
  • Se crean los objetos para la vista, se le pasan aquellos objetos que forman parte del pedido (creados antes)… sean los de la operacion o uno especifico designado
  • Se genera la salida del reporte y se envia el archivo.

El cambio sustancial esta en la atencion del servicio donde en lugar de cederle el control al Ci de la operacion, se le pasa a la salida de la vista que en este caso va a intentar contactar un servlet jasper en donde se le haya indicado. No se si alcanzo a contestar tu duda, si necesitas algo mas especifico preguntame derecho viejo… sino no se hasta que profundidad llevarlo.

Saludos

Richard, muchas gracias por el resumen. Después de analizar un poco lo que hice fue esto:

	function extender_objeto_js()
        {
         if ($this->s__imprime) {
             $this->s__imprime = FALSE;
        echo "
                 window.open(vinculador.get_url(null, null, 
                'vista_jasperreports', null, [{$this->objeto_js}._id], false, true));
             ";
         }            
        }

Y seteo la variable en True al momento de seleccionar el registro, porque de otra manera, por lo que llegué a entender, al presionar el botón de selección de la grilla se largaba el evento JS por separado y nunca le llegaba la asignación del parámetro.

Ahora y aprovechando la clase magistral existe alguna diferencia entre:

    echo "
                 window.open(vinculador.get_url(null, null, 
                'vista_jasperreports', null, [{$this->objeto_js}._id], false, true));
             ";

Y

echo "
                 {$this->dep('form')->objeto_js}.evt__imprimir = function(params) {
                      location.href = vinculador.get_url(null, null, 'vista_jasperreports', {'path': params});
                      return false; } ";

Muchas gracias!!

Hola Javier,

En realidad primero se lanza el evento de seleccion y luego cuando se ejecuta el finally vuelve a la pantalla inicial y se envia el JS.
El tema es que si cerraste todos… el JS no deberia salir, ya que no tenes un id puntual para imprimir no?.

``` echo " window.open(vinculador.get_url(null, null, 'vista_jasperreports', null, [{$this->objeto_js}._id], false, true)); "; ```
Esto abre una ventana con destino a la ejecucion de la vista jasper para realizar la impresion, el hecho sucede apenas se termina de parsear el JS y se ejecuta.
``` echo " {$this->dep('form')->objeto_js}.evt__imprimir = function(params) { location.href = vinculador.get_url(null, null, 'vista_jasperreports', {'path': params}); return false; } "; ```
Esto va a ejecutarse unicamente cuando se presione el boton que dispara el evento [b]imprimir[/b] del formulario y se va a abrir en la misma ventana en la que se encuentra. Obviamente, el evento del formulario nunca va a llegar a dispararse en el servidor ya que fue reemplazado por la atencion del servicio vista_jasperreports via GET.

Saludos

Richard

En realidad primero se lanza el evento de seleccion y luego cuando se ejecuta el finally vuelve a la pantalla inicial y se envia el JS. El tema es que si cerraste todos... el JS no deberia salir, ya que no tenes un id puntual para imprimir no?.

Así es, como vos lo indicas. De todas maneras si el flujo de ejecución es como me decís, al hacer

$this->s__id_exp = $seleccion[‘id’];

Ya obtengo el ID que luego paso a mi reporte. En el reporte voy directamente a ese ID y no me importa el estado para poder imprimir. Pero si saco este IF

if ($this->s__imprime) {
$this->s__imprime = FALSE;

Nuevamente caigo en el error. Por eso mi comentario anterior.

Cose e mandinga!!!

Muchas gracias!

Hola Javier,

sin el condicional, dicho JS sale en todos los pedidos de pagina de ese CI con lo cual se va a ejecutar antes de que tengas algo seleccionado.

No tengo a mano la estructura de la operacion… pero es claro que solo necesitas que salga cuando se selecciono el cierre de un elemento en particular, no en otra ocasion.

En la version original el JS se sacaba solo en ‘pant_inicial’, que quizas era la misma donde estaban el filtro y el cuadro con lo cual, estabas haciendo el pedido antes de filtrar inclusive si esto era asi.

Tene en cuenta que tampoco estas limpiando la variable $this->s__id_exp que queda en sesion incluso luego de que se haya producido la impresion, si disparas el evento cerrar_todos luego de haber cerrado uno puntual y se envia el JS probablemente te salga el reporte con el mismo renglon nuevamente.

Son detalles minimos… pero como tenes que hacer interactuar al cliente para generar la impresion, tenes que asegurarte que eso solo pase cuando vos queres que asi sea y en los terminos que lo necesitas.

Saludos

Richard, excelente como siempre!

Muchas gracias por la asistencia!

Saludos