Jasper Report e Java

313 views
Skip to first unread message

fol

unread,
Mar 18, 2014, 9:47:30 PM3/18/14
to jugp...@googlegroups.com
Cao a tutti mi sto rompendo la testa da qualche settimana con Jasper Report.
Sono arrivato alla necessità di richiamare una funzione java da un report.
Sto stampando l'orario scolastico settimanale dei professori di una classe.
Uso l'elemento crosstab: nella riga metto il professore, nelle colonne metto il giorno della settimana (lun, mar,, mer, giov, ecc ....) all'incrocio fra riga e colonna metto l'orario di quel professore per quel giorno (se c'è).
Il problema nasce dal fatto che vicino al nome del professore voglio mettere la foto.
Non posso mettere il campo in un'altra colonna del componente perché è di tipo io.inputstream e non implementa l'interfaccia comparable (scusate gli errori di sintassi ma sto andando a memoria ed ormai l'ho persa tutta ;) )
Quello che mi è venuto in mente è quello di mettere in una colonna a fianco di quella del professore un codice che mi consenta di recuperare l'immagine dal database.
Ho cercato quindi il sistema per poter fare una funzione che dato in input il codice dell'immagine vada sul database a recuperarla.
Ho trovato due strade:
Gli scriptlet di cui però ho trovato poca documentazione goggolando in giro e poi le librerie di funzioni custom, ho trovatpo questo breve tutorial:
che sembrerebbe fare al caso mio.
L'ho seguito passo passo, e non è neanche difficile, solo che non sono riuscito a fare quello che nel tutorial sembra una banalità.
Faccio tutti i passaggi ma alla fine il report che mi viene fuori non aggancia la libreria di funzioni appena creata e quindi se vado in preview mi da' errore dicendo che non trova la funzione e se vado nell'editor delle espressioni non mi fa' vedere la libraria delle funzioni appena creata.
Qualcuno è riuscito a far funzionare una libreria di funzioni custom, come nel link su citato, oppure riesce a spiegarmi come usare gli scriptlet ?
Un grazie di cuore a chi può dare una mano (ci sono sopra da 2 giorni e 2 notti)

Ciao
Andrea

Alessandro Carraro

unread,
Mar 19, 2014, 4:36:10 AM3/19/14
to jugp...@googlegroups.com
Ciao,
in realtà usare gli scriptlets l'ho trovato piuttosto facile, con jasperreports, tuttavia jaspersoft-studio non l'ho mai utilizzato, per cui non sono riuscito a capire molto del tutorial. Nel senso, non sono sicuro che "l'estensione di funzioni" citate nel link siano legate agli scriptlet (che non sono itati nell'articolo).

btw, io sono un matusa che usa ancora iReport (3.7.1!)....

nel tag radice "jasperReport" c'è un attributo scriptletClass, gli metti il FQN della tua classe di scriptlet che deve (o può?, non sono sicuro...) estendere net.sf.jasperreports.engine.JRDefaultScriptlet. In questa ci metti tutte le funzioni aggiuntive che vuoi. Poi nel report le puoi referenziare in questo modo (in questo caso invoco una funzione di nome foo, con 1 parametro Stringa di valore "param":

                <textFieldExpression class="java.lang.String"><![CDATA[$P{REPORT_SCRIPTLET}.foo("param")]]></textFieldExpression>

Ovviamente, nel tuo caso non sarà un textField ma una immagine, la dovrai settare in modo che ritorni uno stream e dovrai richiamare un metodo che torni lo stesso datatype

ciao

Alex
--
Hai ricevuto questo messaggio perché sei iscritto al gruppo "JUG Padova" di Google Gruppi.
Per annullare l'iscrizione a questo gruppo e non ricevere più le relative email, invia un'email a jugpadova+...@googlegroups.com.
Per postare in questo gruppo, invia un'email a jugp...@googlegroups.com.
Visita questo gruppo all'indirizzo http://groups.google.com/group/jugpadova.
Per ulteriori opzioni, visita https://groups.google.com/d/optout.

Mirco Attocchi

unread,
Mar 19, 2014, 5:49:21 AM3/19/14
to jugp...@googlegroups.com
Ciao Andrea,
scusa se ti rispondo al volo ...

io sono riuscito a far girare codice custom (ma non ho mai provato le
scriptlet) e ne approfitto anche per qualche altro consiglio.

Nel report le immagini possono tranquillamente stare in una cartella,
e con un oggetto image puoi visualizzarle impostando il path letto da
un campo del database (non quindi il binario delle immagini ma
semplicemente da dove prenderle). Devi per forza leggere l'immagine
come campo dal database?

Una qualsiasi tua classe, pacchettizata in un jar che poi sarà nel
classpath di iReport od il "programma" che utilizzerà il report e'
richiamabile all'interno del report, io ne ho fatte alcune per la
manipolazione delle Date ad esempio e le uso all'interno del report
richiamandone sia metodi statici che istanziandola.

Mirco

Massimo Rabbi

unread,
Mar 19, 2014, 7:28:52 AM3/19/14
to jugp...@googlegroups.com
Ciao Andrea,
prova a controllare questo screencast che ho registrato poco fa: http://screencast.com/t/g8W8vSP5z
Se non riesci ad utilizzare/visualizzare le funzioni in Preview e Expression Editor verifica di aver fatto il build (CTRL+B) se non hai il build automatico abilitato.
Se il problema persiste prova a chiudere e riaprire l'editor del JRXML corrente. In caso estremo prova a riavviare Jaspersoft Studio. 

In uno dei questi ultimi due casi, potrebbe essere che ci sia qualche problema di classloading e di come le estensioni JR vengono caricate/gestite. 
Eventualmente apri pure un bug nell'apposita sezione: http://community.jaspersoft.com/bug-tracker?field_bug_project_target_id=496 o utilizzando il sistema interno di bug submission di JSS.
Ti chiedo pero' se per cortesia puoi registrare uno screencast per riprodurre il problema, usando Jing o software simili.

Ciao.
Massimo.


Andrea Adami

unread,
Mar 19, 2014, 12:16:57 PM3/19/14
to jugp...@googlegroups.com
Ciao Andrea,
scusa se ti rispondo al volo ... 


Figurati sono solo invidioso anch'io vorrei volare ...


io sono riuscito a far girare codice custom (ma non ho mai provato le
scriptlet) e ne approfitto anche per qualche altro consiglio.

Nel report le immagini possono tranquillamente stare in una cartella,
e con un oggetto image puoi visualizzarle impostando il path letto da
un campo del database (non quindi il binario delle immagini ma
semplicemente da dove prenderle). Devi per forza leggere l'immagine
come campo dal database? 

si sono contenute in una colonna bytea in postgresql (praticamente un array di byte)

Una qualsiasi tua classe, pacchettizata in un jar che poi sarà nel
classpath di iReport od il "programma" che utilizzerà il report e'
richiamabile all'interno del report, io ne ho fatte alcune per la
manipolazione delle Date ad esempio e le uso all'interno del report
richiamandone sia metodi statici che istanziandola.

Scusa ma sono nuovo anche di java come fai a chiamare le tue classi java dal report ? 
In particolare cosa scrivi nel : textFieldExpression ? (poniamo che si usi una semplice textField per esporre il dato)

Grazie
Andrea

Andrea Adami

unread,
Mar 19, 2014, 10:43:22 PM3/19/14
to jugp...@googlegroups.com
Sono riuscito a far andare un po di scriptlet.
Ho creato uno script nel nodo Scriptlet della struttura del report e l'ho chiamato "Scuola247".
Ho indicato nel campo "Classe" la mia Classe "org.scuola247.jasper.Scriptlet"
Nel reporto ho messo un immagine e poi come espressione ho usato:
"$P{Scuola247_SCRIPTLET}.persona_foto_miniatura( $F{persona} )"
Dove persona_foto_miniatura è la funzione che ho definito nella mia classe e $F{persona} è il campo del database contenente il codice da cercare.

Le difficoltà incontrate sono state:

Non si capisce come richiamare la funzione creata.
Ho faticato un pò a capire che dovevo usare la sintassi $P{<nome dato allo scriptlet>_SCRIPTLET}.<nome funzione>
Anche perchè finchè non si è salvato, chiuso e riaperto il report la sintassi è:
 $P{Scriptlet1_SCRIPTLET}.<nome funzione>

Inoltre non avevo la build automatica attivata.

Dalla documentazione trovata in giro si dovrebbe riuscire a ricevere gli eventi del report (ogni qualvolta viene stampato il dettaglio ad esempio) ma non sono riuscito a farlo.

Un grazie a tutti

Ciao
Andrea


Alessandro Carraro <carraro.a...@gmail.com> , 19/03/2014 9:32:

Andrea Adami

unread,
Mar 19, 2014, 11:15:46 PM3/19/14
to jugp...@googlegroups.com
Grazie dello screencast, forte del fatto che doveva funzionare ho capito cosa non andava: non avevo la build automatica abilitata.
Come vedi dallo screencast che ti allego: http://screencast.com/t/97ka34eSRw sono riuscito a portare a termine il wizard e effettivamente il report di esempio funziona ma poi non riesco a far "vedere" a jasperstudio le modifiche fatte al progetto appena creato, come vedi dallo screencast duplico una funzione creata dal wizard e gli cambio solo il nome ma non riesco a visualizzarla nell'editor delle funzioni.

Qualche idea ?

Ciao e grazie
Andrea


Massimo Rabbi <massim...@gmail.com> , 19/03/2014 12:24:

Massimo Rabbi

unread,
Mar 20, 2014, 5:57:40 AM3/20/14
to jugp...@googlegroups.com
Ciao Andrea,
devi aggiungere anche le entry corrispondenti per name e description della funzione all'interno del file jasperreports_messages.properties che hai dentro il package.
Poi dovrebbe essere visibile.

Ciao.
Massimo.


Per annullare l'iscrizione a questo gruppo e non ricevere più le sue email, invia un'email a jugpadova+...@googlegroups.com.

Per postare in questo gruppo, invia un'email a jugp...@googlegroups.com.
Visita questo gruppo all'indirizzo http://groups.google.com/group/jugpadova.
Per altre opzioni visita https://groups.google.com/d/optout.

Alessandro Carraro

unread,
Mar 20, 2014, 10:12:44 AM3/20/14
to jugp...@googlegroups.com

Ciao, sai che citavo come classe base per gli scriptlets net.sf.jasperreports.engine.JRDefaultScriptlet? Se guardi i metodi che dichiara,  vedi la lista degli eventi a cui verrai notificato se ne sovrascrive il corpo. A questo punto ne fai l' overdose e integri la tua logica

Per annullare l'iscrizione a questo gruppo e non ricevere più le sue email, invia un'email a jugpadova+...@googlegroups.com.

Per postare in questo gruppo, invia un'email a jugp...@googlegroups.com.
Visita questo gruppo all'indirizzo http://groups.google.com/group/jugpadova.

Andrea Adami

unread,
Mar 24, 2014, 8:11:25 AM3/24/14
to jugp...@googlegroups.com
Rieccomi qua con scriptlet e function library.
Sono riuscito a far funzionare sia gli scriptlet sia le function library.
Non sono però riuscito a risolvere il problema originale che, per chi si è perso le puntate precedenti, ricordo essere una funzione, da richiamare all'interno di un crosstbab, che dato in input un codice (nella fattispecie l'id del professore) restituisca la foto corrispondente prendendola dal db corrente.
Non sono riuscito a risolvere perchè nel crosstab non riesco a definire uno scriptlet e non sono riuscito a trovare la maniera di passarlo.
A dire il vero si può definire un parametro nel crosstab ma poi non ho capito come fare per impostare il valore.
La funzione riesco a raggiungerla dal crosstab ma non sono riuscito a capire come raggiungere il db: non riesco a recuperare la connessione corrente come facevo con gli scriptlet con:

(Connection)(this.getParameterValue( JRFillParameter.REPORT_CONNECTION))

essendo infatti le funzioni STATIC non ha senso il this ....

e non riesco nemmeno a capire come poterla passare come parametro alla funzione.

In sostanza con lo scriptlet riesco a raggiungere il db ma non riesco a raggiungere lo scriptlet dal crosstab,  la funzione riesco a raggiungerla dal crosstab ma non riesco a raggiungere il db.

Sto brancolando nel buio: qualcuno ha l'interuttore della luce a portata di mano ?

Ciao a tutti 

Andrea Adami



Massimo Rabbi <massim...@gmail.com> , 19/03/2014 12:24:
Ciao Andrea,
Reply all
Reply to author
Forward
0 new messages