Menggunakan DataSource dengan JasperReport

7 01 2008

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 :D

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 :)


Actions

Information

7 responses to “Menggunakan DataSource dengan JasperReport”

16 01 2008
Muhammad Haris (06:28:59) :

kak,,,
numpang nanya donk??
klo pake jasperreports di JDeveloper gimana ya??
tengkyu…

23 01 2008
sarwono (07:57:38) :

koq waktu di run error, exceptionnya, error retrieving field value ….

23 01 2008
dhiku (09:54:07) :

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.

24 01 2008
sarwono (08:24:13) :

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

5 02 2008
Anditaru (16:52:58) :

Tutorial yang bagus,
Minta bantuan menulis tutorial di javaclopedia.com

Terima kasih dan Salam Kenal

12 02 2008
e-One (04:50:02) :

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

Thank’s & salam kenal….

8 04 2008
RX (09:13:26) :

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.

Leave a comment

You can use these tags : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>