Menggunakan DataSource dengan JasperReport
7 01 2008Akhir2 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
public class User {
private String name;
private String email;
private String address;
// Generate getter and setter
}
asumsi kita mempunyai tabel
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 ) )
Jika menggunakan SQL maka file user.jrxml kira2 sebagai berikut,
<jasperReport name="UserReport">
<queryString>
<![CDATA[select * from T_USER]]>
</queryString>
<field name="u_name" class="java.lang.String"/>
<field name="u_email" class="java.lang.String"/>
<field name="u_address" class="java.lang.String"/>
<!-- desain report -->
</jasperReport>
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,
<jasperReport name="UserReport"> <field name="name" class="java.lang.String"/> <field name="email" class="java.lang.String"/> <field name="address" class="java.lang.String"/> <!-- desain report --> </jasperReport>
Terakhir adalah membuat class UserReport untuk generate report,
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;
}
}
Silahkan dicoba, mudah2an membantu ![]()







kak,,,
numpang nanya donk??
klo pake jasperreports di JDeveloper gimana ya??
tengkyu…
koq waktu di run error, exceptionnya, error retrieving field value ….
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.
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
Tutorial yang bagus,
Minta bantuan menulis tutorial di javaclopedia.com
Terima kasih dan Salam Kenal
Mas, kalo penggunaan Scriptlet di JasperReport gimana ya….???
postingin tutorialnya duong…….!!!
Thank’s & salam kenal….
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.