Jumat, 21 September 2012

Menampilkan Report Menggunakan DataSource

Sebelumnya kita telah mencoba pendekatan pertama untuk menampilkan report yaitu dengan menyimpan kode SQL di dalam report. Kekurangan dari pendekatan ini adalah dari sisi code maintability, karena kode SQL terpisah dari source code aplikasi. Akibatnya akan terjadi banyak duplikasi, misalnya kita sudah punya
kode SQL di source code aplikasi untuk menampilkan seluruh daftar Person dan kemudian kita ingin menampilkan report daftar Person dalam bentuk PDF. Maka yang selanjutnya dilakukan adalah copy-paste kode SQL dari source code aplikasi ke dalam report. Bayangkan jika kita mempunyai 10 report yang menampilkan daftar Person dengan kode SQL yang sama dengan source code aplikasi lalu kita mengubah salah satu nama kolom dari tabel T_PERSON, maka tentu seluruh report harus diubah dan dicompile ulang. JasperReport menyediakan solusi untuk hal ini dengan menggunakan DataSource. DataSource berfungsi untuk menyimpan data yang ingin ditampilkan, misalkan dari database, kemudian dikirim ke dalam report untuk selanjutnya ditampilkan. Ada berbagai jenis DataSource yang dapat kita gunakan berdasarkan tipe data yang ingin disimpan,

  ● JRMapArrayDataSource untuk menyimpan tipe data array of map
  ● JRMapCollectionDataSource untuk menyimpan tipe data collection of map
  ● JRBeanArrayDataSource untuk menyimpan tipe data array of bean
  ● JRBeanCollectionDataSource untuk menyimpan tipe data collection of bean
  ● JRTableModelDataSource untuk menyimpan tipe data tablemodel di swing
  ● JRXmlDataSource untuk menyimpan tipe data xml

DataSource yang umum digunakan adalah JRBeanCollectionDataSource. Kita akan menampilkan daftar Person, dengan membuat Collection dari Person bean yang kemudian akan diberikan ke JRBeanCollectionDataSource. Pertama dibuat terlebih dahulu Person.java,

public class Person {
private int id;
private String name;
private String email;
// Generate getter and setter
}

Buka file PersonReport.jrxml yang dibuat sebelumnya melalui iReport dengan text editor misalnya, notepad. Kurang lebih hasilnya seperti ini,

<jasperReport name="PersonReport">
<queryString>
<![CDATA[select * from T_PERSON]]>
</queryString>
<field name="id" class="java.lang.Integer"/>
<field name="name" class="java.lang.String"/>
<field name="email" class="java.lang.String"/>
<!desain
report >
</jasperReport> 

Kita dapat langsung menggunakan file PersonReport.jrxml di atas agar dapat menampilkan DataSource. Yang perlu dilakukan adalah,

  ● Hilangkan tag queryString
  ● Sesuaikan nama field dan tipenya dengan property pada class Person , sehingga PersonReport.jrxml menjadi,
Berikut file PersonReport.jrxml setelah diubah,

<jasperReport name="PersonReport">
<field name="id" class="java.lang.Integer"/>
<field name="name" class="java.lang.String"/>
<field name="email" class="java.lang.String"/>
<!desain
report >
</jasperReport>

Selanjutnya adalah membuat PersonReport.java untuk mengenerate report,

public class PersonReport {
public static void main(String[] args) throws
JRException {
// Siapkan datasource
JRBeanCollectionDataSource dataSource = new
JRBeanCollectionDataSource(prepareDataSource());
// Compile JRXML menjadi Jasper
JasperReport jasperReport = JasperCompileManager
.compileReport(
"/home/dhiku/jasper/PersonReport.jrxml");
// Fill report dengan datasource
JasperPrint jasperPrint =
JasperFillManager.fillReport(jasperReport,
new HashMap(), dataSource);
// Export report
JasperExportManager.exportReportToPdfFile(
jasperPrint,
"/home/dhiku/jasper/PersonReport.pdf");
}
public static List prepareDataSource() {
List users = new ArrayList();
users.add(new Person("1", "Hadikusuma Wahab",
"dh1ku.ilkom@gmail.com"));
users.add(new Person("2", "Endy Muhardin",
"emuhardin@gmail.com"));
users.add(new Person("3", "Ifnu Bima",
"ifnubima@gmail.com"));
return users;
}
}

Biasanya untuk kasus nyata, daftar Person pada method prepareDataSource() dipanggil dengan menggunakan SQL query. Setelah kelas PersonReport dijalankan maka hasil report dapat dilihat di /home/dhiku/jasper/PersonReport.pdf.

Tidak ada komentar:

Posting Komentar