Autor Tema: [SOLUCIONADO] Llamada a Report desde un evento del cuadro  (Leído 159 veces)

0 Usuarios y 1 Visitante están viendo este tema.

jzeitune

  • Sr. Member
  • ****
  • Mensajes: 408
    • Ver Perfil
    • Email
  • Institución: UNT
  • Nombre y apellido: Javier Zeitune
  • Sistema: Guarani
  • Utilizo algun sistéma del SIU: Sí
[SOLUCIONADO] Llamada a Report desde un evento del cuadro
« : octubre 06, 2020, 12:06:31 am »
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#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!
« Última Modificación: octubre 13, 2020, 10:06:46 am por jzeitune »

richard

  • Moderador Global
  • *****
  • Mensajes: 2770
    • Ver Perfil
  • Institución: SIU
  • Nombre y apellido: Ricardo Dalinger
  • Sistema: SIU-Toba
Re:Llamada a Report desde un evento del cuadro
« Respuesta #1 : octubre 06, 2020, 02:33:43 pm »
Hola Javier,
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?
esto depende de como lo estes recuperando en el CI que saca el reporte, supongo que lo tendran en el metodo ini().

Citar
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
Twitter es al incontinente verbal,  lo que los dulces al diabetico.

jzeitune

  • Sr. Member
  • ****
  • Mensajes: 408
    • Ver Perfil
    • Email
  • Institución: UNT
  • Nombre y apellido: Javier Zeitune
  • Sistema: Guarani
  • Utilizo algun sistéma del SIU: Sí
Re:Llamada a Report desde un evento del cuadro
« Respuesta #2 : octubre 06, 2020, 10:54:47 pm »
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!
« Última Modificación: octubre 07, 2020, 10:20:03 am por jzeitune »

richard

  • Moderador Global
  • *****
  • Mensajes: 2770
    • Ver Perfil
  • Institución: SIU
  • Nombre y apellido: Ricardo Dalinger
  • Sistema: SIU-Toba
Re:Llamada a Report desde un evento del cuadro
« Respuesta #3 : octubre 07, 2020, 11:30:19 am »
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.

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

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
Twitter es al incontinente verbal,  lo que los dulces al diabetico.

jzeitune

  • Sr. Member
  • ****
  • Mensajes: 408
    • Ver Perfil
    • Email
  • Institución: UNT
  • Nombre y apellido: Javier Zeitune
  • Sistema: Guarani
  • Utilizo algun sistéma del SIU: Sí
Re:Llamada a Report desde un evento del cuadro
« Respuesta #4 : octubre 07, 2020, 11:19:09 pm »
Richard, muchas gracias por el resumen. Después de analizar un poco lo que hice fue esto:

Código: [Seleccionar]
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:
Código: [Seleccionar]
    echo "
                 window.open(vinculador.get_url(null, null,
                'vista_jasperreports', null, [{$this->objeto_js}._id], false, true));
             ";
Y
Código: [Seleccionar]
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!!

richard

  • Moderador Global
  • *****
  • Mensajes: 2770
    • Ver Perfil
  • Institución: SIU
  • Nombre y apellido: Ricardo Dalinger
  • Sistema: SIU-Toba
Re:Llamada a Report desde un evento del cuadro
« Respuesta #5 : octubre 08, 2020, 03:30:00 pm »
Hola Javier,
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.

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

Citar
Código: [Seleccionar]
    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.

Citar
Código: [Seleccionar]
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 imprimir 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
Twitter es al incontinente verbal,  lo que los dulces al diabetico.

jzeitune

  • Sr. Member
  • ****
  • Mensajes: 408
    • Ver Perfil
    • Email
  • Institución: UNT
  • Nombre y apellido: Javier Zeitune
  • Sistema: Guarani
  • Utilizo algun sistéma del SIU: Sí
Re:Llamada a Report desde un evento del cuadro
« Respuesta #6 : octubre 08, 2020, 06:08:07 pm »
Richard
Citar
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!

richard

  • Moderador Global
  • *****
  • Mensajes: 2770
    • Ver Perfil
  • Institución: SIU
  • Nombre y apellido: Ricardo Dalinger
  • Sistema: SIU-Toba
Re:Llamada a Report desde un evento del cuadro
« Respuesta #7 : octubre 09, 2020, 11:55:41 am »
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
Twitter es al incontinente verbal,  lo que los dulces al diabetico.

jzeitune

  • Sr. Member
  • ****
  • Mensajes: 408
    • Ver Perfil
    • Email
  • Institución: UNT
  • Nombre y apellido: Javier Zeitune
  • Sistema: Guarani
  • Utilizo algun sistéma del SIU: Sí
Re:Llamada a Report desde un evento del cuadro
« Respuesta #8 : octubre 13, 2020, 10:06:23 am »
Richard, excelente como siempre!

Muchas gracias por la asistencia!

Saludos