JasperServer date input parameters: kaip nustatyti dar gudresnias „default“ vertes

jasper_parametraiSeniai rašiau, kaip JasperServer ataskaitoms suprogramuoti standartines (angl. default) ataskaitos parametrų reikšmes. Po to radau, kaip lengvai ir paprastai galima įjungti ir išjungti SQL užklausos where sąlygas. Nusprendžiau kad iš šių dviejų „metodikų” galima sukergti visai neblogą sprendimą automatiniam/rankiniam ataskaitų generavimui…

Užduotis gan paprasta. Yra ataskaita su duomenų laiko rėžio nustatymo parametrais „Data nuo” ir „Data iki”. Mes norim, kad rankomis generuojant ataskaitą, „Data nuo“ įgautų šio pirmą mėnesio dieną, o „Data iki“ esamą mėnesio dieną. Taip pat norim, kad automatiškai generuojant tą pačią ataskaitą, „Data nuo“ įgautų pirmą praėjusio mėnesio dieną, o  „Data iki“ – esamo mėnesio pirmąją dieną.

Su pirma užduoties dalimi galima susitvarkyti pasinaudojus iReport input parametrų „Default Value Expression“ savybe, kaip kad rašiau anksčiau. O kaip daryti su antra? Kaip privesti Jasper’į vienu atveju imti vienas parametrų vertes, o kitu – kitas? Ir dar turėtų išlikti naudotojo įsikišimo (kitokio laiko rėžio nustatymo) galimybė. Sprendimas slypi paprastume: reikia SQL užklausą sudaryti taip, kad jeigu yra nurodoma parametro vertė, ji ir yra imama, jei nenurodoma – yra imama iš anksto nustatytoji, t. y. panašiai, kaip čia, tik kiek kitaip 🙂

Kiek pagalvojus, man gavosi štai tokia bandomoji SQL užklausa:

with date_interval as (
select
nvl($P{data_nuo_input},ADD_MONTHS(trunc(sysdate,'MM'), -1)) dateFrom
,nvl($P{data_iki_input},trunc(sysdate,'MM')) as dateTo
from dual
)

SELECT  TO_char(dateFrom + (LEVEL-1),'yyyy-mm-dd') AS data
FROM    dual, date_interval di
CONNECT BY LEVEL <= (di.dateTo - di.dateFrom + 1)

Visas fokusas slypi užklausos 3-4 eilutėse: oracle funkcija nvl patikrina, ar parametras turi reikšmę. Jeigu turi – ji ir yra naudojama. Jeigu parametras reikšmės neturi – naudojama iš anksto nustatyta reikšmė. Toliau parametrai yra sušeriami pagrindinei užklausai. Aišku buvo galima nvl konstrukciją funkciją panaudoti pagrindinėje užklausoje, tačiau tada kodas pasidaro šiek tiek sunkiau perskaitomas..

Štai taip visa tai atrodo iš naudotojo pusės:

jasper_parametrai Tik atsidarius ataskaitą, jam yra pasiūlomas „šio mėnesio” datos intervalas, kurį, savaime suprantama, galima keisti. Visiškai ištrynus siūlomas parametrų vertes, SQL užklausoje yra naudojami iš anksto nustatyti parametrai. Tai yra labai svarbu konfigūruojant automatinį ataskaitų generavimą (angl. schedule), nes šiuo metodu sudarytai ataskaitai galima tiesiog nustatyti „tuščius” parametrus ir ji kiekvieną susigeneruos gerai:

jasper_schedule

Norintys pasižaisti namuose, galite atsisiųsti mano bandomąją ataskaitą: date_input_test.zip