Scompattare un CLOB in Jasper Report

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.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *