Menggunakan DataSource dengan JasperReport

Akhir2 ini di milis netbeans-indonesia, sering yang bertanya tentang reporting dengan menggunakan jasperreport. Oleh karena itu gw mau sedikit sharing tentang reporting tools ini. Okay, sebelumnya sharing ini gw asumsikan pembaca sudah pernah menggunakan atau setidaknya pernah mencoba untuk menampilkan report dengan data yang berasal dari database.

Ada banyak cara untuk menampilkan report, yang pertama adalah dengan memasukkan seluruh SQL ke dalam JRXML, namun pendekatan ini menurut gw kurang fleksibel. Kenapa? karena setiap ada perubahan pada tabel database kita harus mengubah kode tsb di JRXML, compile ulang menjadi jasper file, dan memastikan query ditampilkan dengan sempurna. Selain itu manipulasi dan kalkulasi terhadap row-pun sulit dilakukan, dan juga bagaimana kalo pake ORM seperti hibernate? apa mau kembali nulis SQL lagi setelah terbiasa dengan HQL? Thanks but no thanks 😀

JasperReport sudah memfasilitasi hal ini dengan menggunakan konsep DataSource. Intinya adalah proses pengambilan data dipindahkan ke kode Java, dimasukkan ke dalam DataSource, dan DataSource ini tinggal diumpan ke Jasper file (hasil compile JRXML) untuk diisi(fill) dan selanjutnya diexport dalam bentuk report yang diinginkan. Jadi tidak perlu compile2 ulang JRXML lagi jika ada perubahan SQL.

Ada banyak jenis DataSource yang disediakan oleh JasperReport, namun yang paling sering gw gunakan adalah JRBeanCollectionDataSource. Dari namanya pasti bisa ditebak bahwa DataSource ini untuk menyimpan Collection of Object. Selain itu ada juga,

  • JRMapArrayDataSource untuk datasource dari array of map
  • JRMapCollectionDataSource untuk datasource dari collection of map
  • JRBeanArrayDataSource untuk datasource dari array of bean
  • JRTableModelDataSource untuk datasource dari tablemodel di swing
  • JRXmlDataSource untuk datasource dari xml

Oke langsung saja ke contoh,

Objectivenya adalah menampilkan report seluruh user yang terdaftar (yang ada dalam database).

User.java
[sourcecode language=’java’]
public class User {
private String name;
private String email;
private String address;

// Generate getter and setter
}[/sourcecode]
asumsi kita mempunyai tabel
[sourcecode language=’sql’]
CREATE TABLE T_USER (
u_id INT NOT NULL AUTO_INCREMENT,
u_name VARCHAR( 255 ) NOT NULL,
u_email VARCHAR( 255 ) NOT NULL,
u_address VARCHAR( 255 ) NOT NULL,
PRIMARY KEY ( u_id )
)[/sourcecode]
Jika menggunakan SQL maka file user.jrxml kira2 sebagai berikut,
[sourcecode language=’xml’]





[/sourcecode]
jika menggunakan DataSource, langkah2 yang dilakukan adalah,
1. Hilangkan tag queryString
2. Sesuaikan nama field dan tipenya dengan property pada class User
sehingga user.jrxml menjadi,
[sourcecode language=’xml’]



[/sourcecode]
Terakhir adalah membuat class UserReport untuk generate report,
[sourcecode language=’java’]
public class UserReport {

public static void main(String[] args) throws JRException {
// Siapkan datasource
JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(
prepareDataSource());

// Compile JRXML menjadi Jasper
JasperReport jasperReport = JasperCompileManager
.compileReport(“/path_to_jrxml/user.jrxml”);

// Fill report dengan datasource
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport,
new HashMap(), dataSource);

// Export report
JasperExportManager.exportReportToPdfFile(jasperPrint, “path_to_dest/user.pdf”);
}

/**
* Untuk real-case seharusnya nilai ini diambil melalui SQL dengan JDBC atau
* dengan ORM seperti Hibernate.
*
* @return List
*/
public static List prepareDataSource() {
List users = new ArrayList();
users.add(new User(“Hadikusuma Wahab”, “dh1ku.ilkom@gmail.com”, “Jakarta”));
users.add(new User(“Endy Muhardin”, “emuhardin@gmail.com”, “Bogor”));
users.add(new User(“Ifnu Bima”, “ifnubima@gmail.com”, “Bogor”));

return users;
}
}[/sourcecode]
Silahkan dicoba, mudah2an membantu 🙂

33 comments

  1. Coba disesuaikan antara field name yg ada di User.java dan field name yang ada di report. Tipe dan namanya harus sama persis.

    Kalo kamu pke yang inline SQL. berarti field name di report dan column name di tabel musti sama.

  2. koq ttp nggak bisa ya, field name dan tipenya udah sama semua.
    tetap error : exceptionnya, error retrieving field value from bean : ….(field name)
    sekedar info ya aku pakai jdk 6, jasper report 2.0.4.
    mohon pencerahannya

  3. Mas, kalo penggunaan Scriptlet di JasperReport gimana ya….???
    postingin tutorialnya duong…….!!!

    Thank’s & salam kenal….

  4. Mazz Diku, lam kenal nih.
    To the point aja,
    saya masih belum berhasil membuat report dari jasper sesuai dengan keinginan saya, saya sudah membuat semacam variabel List yang diisi dengan List dari hasil query tapi hasilnya malah yang muncul hanya record terakhir nya saja, padahal saya sudah menaruh di band detail untuk setiap record nya.
    Apa yang harus di perbaiki ? java nya ato dari jaspernya ?
    Terus yg lain lagi, sy coba memberikan parameter tipe HashMap ke dalam method fillReport(“/jasper/jasper-sample.jasper”,parameters) tapi hasilnya malah error “java.io.FileNotFoundException” –masih bingung gimana cara mengambil resource path dari file jasper nya itu– begitulah kira..yang masih menjadi pertanyaan saya.

    Thanks in advance.

  5. Mazz Diku, lam kenal nih.

    Saya sudah membuat report dengan jasper, didalamnya saya juga menggunakan sub report. waktu saya view ke html main report dan sub reportnya kelihatan datanya. tapi pada saat saya export ke pdf atau xls hanya main reportnya saja yang kelihatan datanya tapi sub reportnya tidak kelihatan. ada saran mazz? thx

  6. Pak Hadi,

    Jasperreport saya sudah running lama, tp hari ini tiba-tiba tidak bisa login muncul pesan error: org.efs.openreports.providers.ProviderException: Cannot open connection.

    Apa penyebabnya?

    Terima kasih.

    Regards,
    Kristoforus

  7. Salam Kenal,
    Mas Mau minta tolong.. qt sdh buat report lwt jasper..saat dicetak pake OS Windows bisa keluar.. tapi kalo pake linux tertahan di spooler dan ada tulisannya Error.. kira kira knp ya mas? Linuxnya pake PC Linux .. TQ be4

  8. Salam enal semua.

    Buat temen2 yang waktu nge-run masih error(error retrieving field value from bean), kemungkinan setter sama getter belum dibuat.

  9. halo mas diku.
    pernah mengalami heap space memory utk data yg sangat besar.?

    adakah solusi utk permasalahan tersebut. terimakasih

  10. thx pak atas source codenya, sudah bisa.
    mw bertanya sedikit dibagian

    desain reportnya bikin sendiri atau di generate dari ireport ?

    regards
    -wackoSQL-

  11. “Ada banyak cara untuk menampilkan report, yang pertama adalah dengan memasukkan seluruh SQL ke dalam JRXML, namun pendekatan ini menurut gw kurang fleksibel”

    gw gak setuju tuh kalimat diatas, mungkin kalimat itu cocok untuk aplikasi yg skala kecil. Klo udah skala besar, akan terasa bngt repotnya. setiap ada perubahan report hrus ngubek2x file .java nya.

    Klo menurut gw siy lebih fleksibel ubah langsugn lewat iReport nya, baik disainnya dan juga query nya, jadi lebih konsen ke report. daripada ngutak-atik file java nya. Karena menurut gw reporting dan coding adalah bagian yg terpisah jadi jgn di campur aduk tuh. Gw pernah ngalamin, aplikasi dah siap dan udah di deploy ke webserver, trus ada perubahan di reportnya, coba klo pake cara utak-atik java nya lagi, kan malah bikin report re-compile lagi, deploy lagi ke server, klo servernya hanya tomcat siy yahh gak terlalu ngerepotin lah, coba klo udah websphere yang mesinnya dah pke unix, dan kebetulan yg gw alamin skrng webservernya pke websphere dan mesinya pke unix, kerasa bngt repot klo hrus ngutak-atik source javanya lagi, dan export ke .jar nya lagi, trus deploy lagi.

    Jadi mnrt gw lebih efisien menggunakan iReportnya, dicompile langsung dari editor report nya itu, query juga langsung di masukkan kedalan jrxml nya, jadi begitu ada perubahan kita tinggal ngerubah reportnya aja, gak perlu ngerubah source code nya lagi, hasil compile nya yg berupa .jasper langsung aja masukkan kedalam .war nya, tiban file .jrxml yang lama, beres, gak perlu compile java lagi, dan gak perlu deploy ulang lagi, dan server juga gak perlu di restart ulang. done….
    ngapain hrus cape2x ngerubah java hehehehe…..

    dan satu lagi yg paling penting, klo seandainya report ada perubahan maka programmer gak hrus terlibat, cukup disainer report aja yg terlibat. Jadi lebih fleksibel kan dan reuseable..

    1. Good point! dan pragmatis.

      Perlu dipahami bahwa tidak semua project mempunyai resource khusus untuk Report Designer even dia aplikasi skala besar atau menengah. Bayangkan kalau kita mengerjakan aplikasi dengan tim yang sudah punya pengalaman menggunakan OOP dan menggunakan ORM dalam aplikasinya. Tentunya si developer ga bakal mau bekerja di dua dunia yang berbeda, waktu ngerjain aplikasi, tambah proses bisnis tertentu pake ORM dengan cara berpikir OOP tapi pas mau buat report harus mikir query SQL-nya, JOIN, IN, segala macem (itu kenapa muncul konsep ORM karena mismatch antara OOP dengan RDBMS).

      Untuk masalah deploy ulang semua aplikasi, itu bisa diakali paling mudah dengan mem-bundle kelas2 Java (wrapper) yg berhubungan dengan report dalam sebuah jar. Jadi kalo ada perubahan di report, dan kebetulan hanya perubahan desain lgsng dari jrxmlnya bisa, tapi kalau perubahan di data atau formula, tinggal edit java-nya, bundle di jar, cemplungin ke app server. Yang susah dihindari mungkin kebutuhan restart aplikasi, tapi dengan fitur Hot Deploy dari app server misalnya websphere, weblogic, dll.

  12. mas, saya lagi dapat tugas buat report dg iReport. yang jadi masalah, saya masih bingung untuk report jika pada band Detail ada lebih dari satu kolom

    +——————-+
    | header |
    +——————-+
    |—-+—-+———+
    | no | data | keterangan |
    +—+—-+———-+

    data dan keterangan berasal dari parameter dan diproses dengan class com.lowagie.text.pdf.FormatNumberedMultipleRecord.

    yang jadi masalah, baris data dan keterangan kadang tidak pas.

    misal :
    no. 1, data 1, keterangan 1
    no. 2, data 2, keterangan 2

    hasilnya jika data 1 isinya panjang, keterangan 2, masuk sebagai keterangan data 1

    ilustrasi
    no. 1, data 1, keterangan 1
    keterangan 2
    no. 2, data 2,

    mohon bantuan solusinya. terima kasih

  13. bro, bisa gak menampilkan property dari objek?? karena isi datasource-nya adalah list yang berisi beberapa objek.
    misalnya: ingin menamilkan nama mahasiswa yang ada dalam objek mahasiswa.

  14. Mas,
    kl misalnya di dalam list User itu ada objek lg, misalnya objek Fakultas yg punya atribut id, nama, dan keterangan. Kl saya mau tampilin atribut nama Fakultas gitu gimana caranya y mas? field namenya apa? terimakasih…

  15. Maaf mas saya newbie bangt soal ireport dan jasper report ini,
    Mau tanya neh. kalo bikin pake wizard kan querynya langsung dari awal.
    nah bisa ga seh querynya berasal dari user, pas ngejalanin aplikasi..
    makasih mas

  16. numpang nanya mas.
    klo menampilkan record pada jasper report tapi hanya record2 tertentu kayak pkai Crystal report kan ada selectionFormula ny. klau d jasper reportny gmana caranya?
    ap bs d jelaskna?
    thnx

  17. salam kenal mas, aku ada masalah disubreport ne, klo pake subreport, datasourcenya gmn mas??? master reportnya ud aku kc datasource seperti diatas n bisa, subreportnya yang g muncul datanya, wktu create subreport aku pke empty datasource, mohon bantuannya trims …

  18. mas, aq dah nyoba tutor ini, berkali-kali tapi kok gk sukses.
    mohon kiranya untuk mengirmkan source code lengkap ke Email saya.
    trimakasih dtunggu…..

  19. mas, mau tanya. ni kan sample nya menggunakan swing. kalo menggunakan spring mvc, ma hibernate bedanya dimana ya?, saya bingung dengan input data ke datasource-nya. untuk menampilkannya si udah bisa. hanya datanya masih null. ada link yang bagus ga ya mas mengenai hal ini?

  20. mas mau nanya kalo menggunakan empty data source untuk subreport bagaimana caranya…?apakah sama dengan melempar list pada main report…

  21. Salam semua untuk pengguna JasperReport,

    saya ingin bertanya, kalau ingin mengkoneksikan 2 atau lebih datasource gmn yah caranya ? saya buat virtual datasource tapi cara pengaplikasiannya saya blm paham, sekiranya ada yg paham mohon bantuannnya.

    Thanks.

Leave a Reply