
22 Dic 2014 Scompattare un CLOB in Jasper Report
Oggi affronteremo una questione abbastanza particolare; non trovando in rete nessun argomento che ne trattava, ho deciso di scrivere questo articolo.
Vi sarete di sicuro imbattuti nel gestire un campo di tipo BLOB o CLOB, e vi sarà di sicuro capitata questa situazione. Analizziamo quindi insieme il problema, prendendo dei dati inventati.
Abbiamo un campo CLOB riempito di valori, separati da un carattere speciale, come può essere il #, e supponiamo che il campo CLOB sia molto grande; di seguito un esempio
A006#A012#A071#A241#A291#A369#A390#A461#A468#A496#A541#A559#A560#A561#A562#A564#A576…
Supponiamo che ciascuna sigla faccia parte di una coppia valore-descrizione, rappresentata all’interno di una tabella in un Database; un esempio che potrei andare a prendere è la coppia valore codice di un Comune – descrizione di un Comune, in questo caso avremo:
A006 -> ABBADIA SAN SALVATORE A012 -> ABETONE A071 -> AGLIANA A291 -> ALTOPASCIO A369 -> ANGHIARI A390 -> ARCIDOSSO A461 -> AREZZO ……
Supponiamo in questo articolo di avere 2 tabelle, così rappresentate
Lo scopo è di voler rappresentare, nel nostro report in Jasper, un elenco di Comuni, i cui codici sono inseriti dentro il CAMPO_CLOB.
Passiamo subito alla pratica.
1) Nella query principale di Jasper abbiamo:
SELECT CAMPO_CLOB FROM TAB_ELENCO
2) Creare una VARIABILE di Tipo java.util.Collection, ad esempio chiamata ELENCO
con Espressione variabile
java.util.Arrays.asList( new java.io.BufferedReader( new java.io.InputStreamReader($F{CAMPO_CLOB}.getAsciiStream()) ).readLine().split(new String("#")) )
3) Creare una Tabella con un Dataset secondario (spiegato a questo Creare una Tabella in Jasper Report ), ed inserire dei PARAMETRI di Tipo Collection, dentro il Dataset; come mostrato in figura, i parametri sono ELENCO_PARTE_UNO, ELENCO_PARTE_DUE e ELENCO_PARTE_TRE
N.B. Ogni parametro è una collezione di al massimo 1000 elementi; quindi creare tanti parametri necessari a gestire tutta la lunghezza del CLOB prevista.
4) Aprire l’Edit table datasource, cliccando con il destro sulla Tabella creata, ed associare i valori ai nuovi Parametri creati.
con espressioni rispettivamente per ELENCO_PARTE_UNO
( ($V{ELENCO}.size()>0) ? java.util.Arrays.asList( java.util.Arrays.copyOfRange( $V{ELENCO}.toArray(new String[1000]), 0, 1000 ) ) : new String[]{"-1"} )
per ELENCO_PARTE_DUE
( ($V{ELENCO}.size()>=1000) ? java.util.Arrays.asList( java.util.Arrays.copyOfRange( $V{ELENCO}.toArray(new String[1000]), 1000, 2000 ) ) : new String[]{"-1"} )
e per ELENCO_PARTE_TRE
( ($V{ELENCO}.size()>=2000) ? java.util.Arrays.asList( java.util.Arrays.copyOfRange( $V{ELENCO}.toArray(new String[1000]), 2000, 3000 ) ) : new String[]{"-1"} )
5) Adesso occupiamoci della query del Dataset
SELECT DISTINCT CODICE, DESCRIZIONE FROM TAB_COMUNI WHERE $X{IN,CODICE,ELENCO_PARTE_UNO} UNION ALL SELECT DISTINCT CODICE, DESCRIZIONE FROM TAB_COMUNI WHERE $X{IN,CODICE,ELENCO_PARTE_DUE} UNION ALL SELECT DISTINCT CODICE, DESCRIZIONE FROM TAB_COMUNI WHERE $X{IN,CODICE,ELENCO_PARTE_TRE} ORDER BY DESCRIZIONE
In questo modo avremo, l’elenco delle descrizioni dei Comuni, che sono all’interno del nostro campo CLOB.
No Comments