Usar Jasper Chulupí (Preinscripción y 3W)

Hola, para usar Jasper en Chulupí (3W y Preinscripción) se deben seguir los siguientes pasos:

  1. Copiar el Jasper dentro de la carpeta de personalizaciones del proyecto.

  2. Luego se puede basar en como se esta haciendo en G3 3.12.0, ej: función generar_comprobante del archivo src/siu/modelo/transacciones/impresion_actas_examen.php.

Explico un poco lo que se esta haciendo:

  • En la linea 60 crea el objeto para imprimir el Jasper:
$report = new vista_jasperreports();
  • En la linea 64 se esta cargando el Jasper:
$report->set_path_reporte($path);

$path seria la ruta donde copiaste tu Jasper.

  • Si el Jasper tiene parámetros, se pueden pasar como sigue:
$report->set_parametro('titulo', 'S', $titulo);

Ver ej en lineas 84, 85, 93, 94, etc.

  • Para generar la salida (PDF) hacer como se hace en la linea 146:

$report->generar_salida();
$this->descargar_archivo($report->get_nombre_archivo_generado(), 'comprobante.pdf');

Prueben con eso, y cualquier duda nos consultan.

saludos.

Hola, comento lo que se hizo hasta ahora, lamentablemente sin exito:

Se agregaron las librerías de /JasperReports y /JavaBridge en el directorio src/siu/lib/, y la API para utilizar Jasper Reports (creada por el SIU) vista_jasperreports.php en src/siu/lib/kernel/util/. Asi es como se estructuran en G3.

Se modificaron los parámetros de conexión en la clase vista_jasperreports dentro del método configurar_bd(), para conectarse a una base de datos Informix:


...
$con->setDriver("com.informix.jdbc.IfxDriver");
...
$con->setConnectString("jdbc:informix-sqli://192.168.56.102:9088/alumnado_fcm:informixserver=guarani_des");
...
$con->setUser("internet");
$con->setPassword("internet");

(Estos mismos parámetros fueron probados en Guarani3-GESTIÓN y se pudo generar un reporte un reporte con conexión a Informix.)

Se copió el driver de Informix (adjuntado post) dentro de la carpeta /JasperReports y en la maquina virtual de java /usr/lib/jvm/java-7-oracle/jdk1.7.0_80/jre/lib/ext/ que corre en mismo servidor que el Apache.

Se corrió el JavaBridge con:


java -jar /usr/local/proyectos/guarani2/3w/versiones/2.9.1/src/siu/lib/JavaBridge/WEB-INF/lib/JavaBridge.jar SERVLET:8081

Al intentar generar un reporte, el log de Guarani queda en:

clase: java_InternalException
mensaje: 
traza: [TRAZA]

---[ 0 ]-----------------------------------------

- function: java_ThrowExceptionProxyFactory->getProxy
- file: /usr/local/proyectos/guarani2/3w/versiones/2.9.1/src/siu/lib/JavaBridge/java/Java.inc, linea 215
- param: 
	 0: 5	 1: com.informix.jdbc.IfxSqliConnect	 2: 	 3: 1

Que aparenta ser algún problema con el driver para la conexión a Informix. Lo cual sorprende porque como dije, desde Guarani3-GESTION y utilizando este mismo driver, no hubo problemas en generar un reporte con esta conexión.

Buen dia!

¿Alguna novedad al respecto?!

Hola Emiliano, te cometo que estuve tratando de hacerlo funcionar en G2, logre hacerlo pero siempre y cuando sean JASPERs que no posean una query dentro, ya que no logre hacer la conexión con Informix, te comento lo que hice:

cree un archivo Jasper (sin queries ni conexión a la DB) y lo copie en src/pers/pers_jasper/jaspers/CertificadoSegundaPruebaG2.jasper.

NOTA: Fíjate la tipografía que le pones al Jasper, la misma la tenes que tener instalada en el SO. Yo use Arial porque con otra no me funcionaba.

luego cree un controlador con el siguiente código:

src/pers/pers_jasper/operaciones/fecha_examen/controlador.php


<?php
namespace pers_jasper\operaciones\fecha_examen;

use kernel\kernel;
use kernel\util\vista_jasperreports;

class controlador extends \siu\operaciones\fecha_examen\controlador
{

    function accion__generar_pdf(){

        $report = new vista_jasperreports();
        // Se setea la plantilla.
        $path = dirname(__FILE__)."/../../jaspers/CertificadoSegundaPruebaG2.jasper";
        $report->set_path_reporte($path);
        
        $report->set_parametro('nombre', 'S', 'Emiliano');

        $report->generar_salida();
        $this->descargar_archivo($report->get_nombre_archivo_generado(), 'comprobante.pdf');

    }


}

lo que hago aquí es cargar el Jasper y pasarle los parámetros con el método $report->set_parametro().

La idea seria que la query la hagan fuera del Jasper, y le pasen los datos vía parámetros!!!

Ahora bien, para que funcione tuve que anular la conexión a la DB, esto hay que hacerlo en el archivo src/siu/lib/kernel/util/vista_jasperreports.php función completar_con_datos, quedaría así:


       /**
	 * Genera un archivo jrprint y lo agrega al spool de union
	 */
	function completar_con_datos()
	{
		if (! isset($this->path_reporte)) {				//Lo chequeo aca adentro por si la funcion se llama mas de una vez
			throw new \toba_error_def("Falta definir el .jasper con set_path_reporte");
		}	

		if ($this->modo_archivo) {									//Si el conjunto de datos viene de un archivo comun
			$jrl = new \JavaClass("net.sf.jasperreports.engine.util.JRLoader");		
			$jrxmlutil = new \JavaClass("net.sf.jasperreports.engine.util.JRXmlUtils");		
			$jrxpath = new \JavaClass("net.sf.jasperreports.engine.query.JRXPathQueryExecuterFactory");		
			$document = $jrxmlutil->parse($jrl->getLocationInputStream($this->xml_path));
			//Pongo el archivo con los datos como parametro y creo el reporte
			$this->parametros->put($jrxpath->PARAMETER_XML_DATA_DOCUMENT, $document);		
			$print = $this->jasper->fillReport($this->path_reporte, $this->parametros);			
		}  else {													//El conjunto de datos viene de una db o datasource
			$con1 = null;
			//Creo el reporte finalmente con la conexion JDBC
			$print = $this->jasper->fillReport($this->path_reporte, $this->parametros, $con1);
		}		
		$this->lista_jrprint[] = $print;
	}

como ves, a la conexión a la DB le pongo null ($con1 = null;).

Con esa personalización de prueba logro descargar el Jasper accediendo a [b]http://localhost/g3w2/fecha_examen/generar_pdf[/b]

Igualmente vamos a seguir intentando lograr la conexión a la DB de Informix, pero por ahora no lo logramos.

prueben con eso y cualquier cosa nos consultan.

Te adjunto el Jasper que use de prueba, el mismo recibe el parámetro nombre.

saludos.


jaspers.zip (10.9 KB)

Hola, buen dia. Gracias por la respuesta!

Te consulto, el error por la cuestión de la fuente Arial por las dudas no era algo asi:

May 23 09:50:08 VMBridge INFO : 212cb585@6dc220eb Portability warning: public static net.sf.jasperreports.engine.JasperPrint net.sf.jasperreports.engine.JasperFillManager.fillReport(java.lang.String,java.util.Map,java.sql.Connection) throws net.sf.jasperreports.engine.JRException and public static net.sf.jasperreports.engine.JasperPrint net.sf.jasperreports.engine.JasperFillManager.fillReport(java.lang.String,java.util.Map,net.sf.jasperreports.engine.JRDataSource) throws net.sf.jasperreports.engine.JRException both match (o:PhpParserString)(o:HashMap)(o:null)

Perdón por el choclo, pero es lo que nos arroja el motor de javabridge que corre en la maquina.

Por otro lado, el debug de Guarani queda en:

clase: java_InternalException
mensaje: 
traza: [TRAZA]

---[ 0 ]-----------------------------------------

- function: java_ThrowExceptionProxyFactory->getProxy
- file: /usr/local/proyectos/guarani2/3w/versiones/2.9.1/src/siu/lib/JavaBridge/java/Java.inc, linea 353
- param: 
	 0: 7	 1: php.java.bridge.Request$PhpNull	 2: 	 3: 1

Lamentablemente no lo pudimos hacer andar siguiendo los pasos descriptos. ¿Alguna pista?!

Muchas gracias.

Hola Emiliano,
agrego algunas observaciones a las repuestas de Leo que sería importante que tengan en cuenta.
En general, las plantillas en jasper pueden obtener datos a partir de tres medios:

[ol]- A partir de los parámetros enviados a las mismas.

  • A partir de archivos xml enviados a las mismas como fuente de datos.
  • A partir de queries que se realizan en las mismas, contando con una conexión a una base de negocios y que, normalmente, se filtrarán a partir del valor de algún parámetro.[/ol]

En la opción que te propone Leo en la respuesta anterior, es decir que todos los datos que muestre el reporte sean a partir de los parámetros sin utilizar conexión a la base, en el iReports verás que en principio en ReportDataSources deberás elegir la vacía (EmptyDataSource) para poder previsualizar el reporte con esta herramienta. Por otro lado, si tienen como fuente de datos la base, en las propiedades del reporte (haciendo click sobre el nombre del reporte), verás que hay una denominada WhenNoData con opciones: Blank Page, No Pages, etc. Esa propiedad define qué se mostrará en el reporte si no hay datos. Cuando no existe una query asociada al reporte, se considera que no hay datos, por lo tanto deberán tener cuidado de cómo setean esa propiedad si utilizan plantillas sin queries. En la que armé de ejemplo que te enviamos, verás que esa propiedad tiene el valor “All sections, no detail” y por otro lado, que los datos que se quieren mostrar se podrían incluir, más allá del título, en una banda No Data Section. Esa sección les será útil para estos casos, ya que la sección Detail, donde usualmente se ponen los datos, no se mostrará al no haber consulta asociada. Esta opción puede servirles para los casos de reportes y certificados más simples, aunque si requieren listados dinámicos ya no sería factible. En G3 no tenemos reportes ni certificados implementados de esta forma ya que es bastante restrictiva en cuanto a lo que permite diseñar.

Con respecto a la segunda opción, en G3 nosotros la utilizamos mucho cuando previsualizamos un reporte o listado y luego se imprime lo mismo que se ve en pantalla. De esta forma en lugar de volver a realizar la sql en la plantilla, se recuperan los datos que se ven en pantalla en formato xml y se envían a la plantilla. En estos casos lo que se define en el iReports es: en la Query se setea como lenguaje XPath (en lugar de sql), la consulta la definimos como:

/tabla/datos/fila

y cada campo cuyo contenido vendrá en el archivo xml, se define en el reporte como un Field cuya expresión es:

dato[@clave="id_clave_del_campo"]/@valor

En G3 utilizamos directamente un método de Toba vista_xml que recupera ese formato a partir de los componentes como cuadros, etc. Aquí deberían armar el XML ustedes manualmente para luego enviarlo por código:

$report->set_xml(utf8_e_seguro($cadena_con_archivo_xml));

La tercer opción tambíen la utilizamos bastante en G3 y sirve para a partir de algunos parámetros conocidos al momento de la impresión, que la plantilla incluya la query a partir de la cual recupera todos los campos que son mostrados en el texto del Reporte/Certificado. Aquí directamente sólo se setean los parámetros como anteriormente te mostró Leo, y el iReports al definir la plantilla se utiliza la fuente de datos adecuada, definiendo en la query del reporte el lenguaje sql y la consulta deseada (verás que hay una opción “Read Fields” que recupera todos los campos como fields del reporte a partir de la sql especificada). Instalando correctamente el driver para informix, la conexión debería funcionar de igual manera que en postgres.

En la primer parte de este link de constancias y certificados en G3 hay algún detalle de cómo usamos esos diferentes tipos de plantillas en gestión, por si necesitás ampliar algún concepto. Luego hay varias otras opciones y detalles que utilizamos en G3 respecto al diseño de cada plantilla, como el uso de SubDatasets, el uso de cada Sección, las variables internas para conteo de páginas, etc. Si te sirven para diseñas sus plantillas, podés ver ejemplos en los diferentes jrmxl de gestión.

Leo estuvo probando la instalación del driver y pudo hacer funcionar la conexión a informix, así que en breve te enviará un detalle de cómo modificar el código de Chulupí para realizar la conexión, junto con ejemplos de cada tipo de plantilla que armamos para adjuntarles.

Cualquier cosa no dudes en consultarnos!
Saludos,
Gabriela.

Hola Emilliano,
con respecto al error de las fuentes, no parece ser lo que te está pasando por el mensaje, pero te dejo este foro donde se indica cómo instalar las fuentes que hagan falta para las impresiones.
Qué versión de java tienen instalada? Podés adjuntarnos el log completo? Porque por lo que se ve en el mensaje parece un problema con el pasaje de la conexión a la base.

Saludos,
Gabriela.

Hola Emiliano, agregando a lo que dice Gabriela:

te quería avisar que ya pudimos conectar Jasper con Informix, si necesitas dicha funcionalidad crea un GDS solicitando el parche con los cambios y te lo enviamos.

Igual hay unas consideraciones a tener en cuenta, vas a tener que instalar los .jar del JDBC de Informix:

  1. Los podes descargar de acá.

  2. Para instalarlos podes seguir la siguiente documentación.

Lo que deberías hacer es agregar los .jar en la carpeta $JAVA_HOME/jre/lib/ext, y luego agregar ifxjdbc.jar, ifxjdbcx.jar y opcionalmente ifxlang.jar al CLASSPATH, ej:


export CLASSPATH=/usr/lib/jvm/java-8-oracle/jre/lib/ext/ifxjdbc.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/ifxjdbcx.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/ifxlang.jar:$CLASSPATH

cualquier duda nos consultan, si quieren el parche creen GDS solicitándolo.

NOTA: tener en cuenta que las fonts utilizadas en el Jasper deben estar instaladas en el sistema operativo.

Saludos.

Les paso de ejemplo un Jasper con una Query en Informix:


<?php
namespace jasper\operaciones\fecha_examen;

use kernel\kernel;
use kernel\util\vista_jasperreports;

class controlador extends \siu\operaciones\fecha_examen\controlador
{

    function accion__generar_pdf(){

        $report = new vista_jasperreports();
        // Se setea la plantilla.
        $path = dirname(__FILE__)."/../../jaspers/PlantillaEjConQuery.jasper";
        $report->set_path_reporte($path);

        $report->set_parametro('nro_inscripcion', 'S', 'J0004-1');

        $report->generar_salida();
        $this->descargar_archivo($report->get_nombre_archivo_generado(), 'comprobante.pdf');

    }

}

También adjunto el archivo .jasper, el mismo recibe como parámetro nro_inscripcion (el nro_inscripcion de una persona).

saludos.


jaspers.zip (8.32 KB)

Buenas! Les agradezco todas las repuestas y aprovecho a comentar (por si no se notó jajaj) que nosotros ya hemos utilizado JasperReports sin problemas en G3.

Lamentablemente no hemos podido siquiera lograr que levante un jasper sin conexión. Hemos investigado que puede tener que ver con la version de java. ¿Tal vez alguna incompatibilidad entre la versión con la cual se compiló el .jasper y la versión que lo ejecuta? La versión que corre en el servidor de G2 es la 1.6.0_26, mientras que en G3 corre con 1.7.0_79.

¿Ustedes con cual corrieron estas pruebas?

PD: Adjunto el log completo que arroja Guarani.

Muchisimas gracias!


20170524_103954___3071.log.zip (5.99 KB)

Hola Emiliano,

fíjate el ante ultimo mensaje que envié, a mi me pasaba los mismo y era que me faltaba instalar los .jar del JDBC de Informix.

En cuanto a la creación de las plantillas .jasper, fíjate lo que puso Gabriela. Ya que hay ciertas consideraciones a tener en el iReport cuando creas el Jasper.

Con los Jaspers que te enviamos adjuntos debería funcionar, son ejemplos ya probados.

saludos.