Taip jau buvo, taip nutiko, kad prisireikė vienoje ataskaitoje dinamiškai „sukirsti” Oracle ir MS SQL Server duomenis. Klasikinis variantas šioje situacijoje yra vienos DB duomenų replikavimas/sinchronizavimas į kitą. Toks variantas gal ir yra pats geriausias/patikimiausiais, tačiau jis toli gražu nėra trivialus. Pirmiausia, aš pats nei vienos iš tų DB neadministruoju, todėl nagų kišti į vidų kaip ir negaliu. Antra, abiejų DB duomenų modeliai yra skirtingi, todėl norint gražiai perkelti duomenis, reiktų juos perskaičiuoti ir „pritraukti” iki vienos iš DB struktūros. Kol DBA keiksnodami bando įsivertinti darbų apimtis, nusprendžiau užduotį atlikti Jasper priemonėmis. Tiesa pasakius, kol pats nepabandžiau net nebuvau tikras, ar Jasperis iš vis gali imti duomenis iš kelių skirtingų DB vienu metu, bet tai atrodė visai logiška, nes Jasperis leidžia vienoje ataskaitoje manipuliuoti keliais tos pačios DB Dataset’ais. Jei jau galima kurti skirtingus datasetus, kodėl gi būtų negalima jų kurti iš skirtingų DB šaltinių?
Pasirodo, kad vienas iš būdų susieti vienos DB duomenis su kitos DB duomenimis yra subataskaita (angl. subreport). Subataskaita yra kuriama ir įkeliama į pagrindinę ataskaitą įprastai, kaip ir bet kokia kita subataskaita. Vienintelis dalykas, kuris skiriasi, yra subataksaitos „connection expression„.
Vietoje to, kad kaip įprastai naudotume „Use the same connection used to fill the master report„, renkamės punktą „Use another connection” ir su savo prisijungimo duomenimis įrašome štai tokią eilutę:
java.sql.DriverManager.getConnection( "jdbc:oracle:thin:@//server_name:server_port/SID_name", "user", "password")
Visa skirtingų DB duomenų susiejimo magija vyksta per subataskaitos parametrus. Šioje vietoje reiktų pagrindinės ataskaitos (angl. master report) SQL užklausos rezultatus susieti su subataskaitos SQL užklausos parametrais. Mano atveju „pagrindinė” SQL traukė duomenis iš MS SQL Server, o subataskaita – iš Oracle:
Gavosi štai toks duomenų atvaizdavimo kelias: pagrindinė ataskaita sugeneruoja aibę „master query” užklausos rezultatų eilučių, iš kurių kiekvieną paeiliui paduoda subataskaitai. Subataskaita yra „prasukama” su iš „master query” gautais parametrais. Subataskaitos rezultatas yra gražinamas į pagrindinę ataskaitą. Procesas kartojasi. Žodžiu, visa eiga atrodo taip:
Paskutinis dalykas, kurį liko padaryti, yra sukelti sukurtas ataskaitas į JasperServer ir išbandyti. Hibridinė ataskaita gali neveikti dėl dviejų pagrindinių priežasčių: blogai parinkta atskaitos ir/ar subataskaitos „kalba” arba blogai parinktas į JasperServer įkeltos ataskaitos „Data Source”.
Ataskaitos ir subataskaitos „kalba” turėtų būti parinkta Java. Nei su Groovy, nei su JS aprašomas metodas neturėtų veikti.
Pagrindinės ataskaitos „Data Source” yra nustatomas per JasperServer administravimo aplinką, dešiniu pelės klavišu paspaudus ant konkrečios ataskaitos ir išsirinkus punktą „Edit”. Nukeliavus į nustatymus „Data Source”, reikia nustatyti būtent tą duomenų šaltinį, iš kurio pagrindinė ataskaita turės traukti duomenis. Mano atveju, tai buvo MS SQL Server.
Informacijos šaltiniai:
- https://www.packtpub.com/books/content/jasperreports-36-using-multiple-relational-databases-generate-report
- http://community.jaspersoft.com/wiki/how-use-two-different-connections-databases-ireport
- http://community.jaspersoft.com/questions/535964/subreport-using-completely-different-datasource
- http://stackoverflow.com/questions/11843618/error-evaluating-expression-with-multiple-database-in-ireport