Merancang Laporan Master-Detail Tanpa Subreport
21 Mei 2014 Tinggalkan komentar
Pengenalan
Pada artikel ini, saya akan membuat sebuah laporan master-detail dengan iReport. Sebagai latihan, laporan master-detail yang akan saya buat adalah laporan piutang pelanggan dimana dalam setiap piutang disertakan informasi pembayaran yang telah dilakukan. Laporan akan dikelompokkan berdasarkan setiap pelanggan. Sebagai contoh, berikut ini adalah domain model yang sudah ada pada aplikasi:
Karena saya sudah memiliki domain model, maka saya akan memakai instance dari domain model tersebut secara langsung pada laporan.
Langkah pertama yang saya lakukan adalah membuat laporan baru di iReport dengan memilih menu File, New. Saya akan memberinya nama berupa laporan_sisa_piutang. Setelah laporan baru selesai dibuat, saya perlu membuat data source yang mewakili data yang akan ditampilkan dalam laporan nantinya. Tapi sebelumnya, saya memastikan terlebih dahulu bahwa JAR untuk proyek saya sudah terdaftar dengan memilih menu Tools, Options, Classpath.
Menyiapkan Data Source
Saya menambahkan data source baru dengan men-klik tombol Report Datasources seperti pada gambar berikut ini:
Pada dialog yang muncul, saya men-klik tombol New. Saya kemudian memilih JavaBeans set datasource. Saya akan menggunakan kode program Groovy berikut ini untuk menghasilkan data random yang dipakai dalam men-preview laporan:
import domain.penjualan.* import domain.faktur.* import org.joda.time.* import java.util.Random void tambahFaktur(Konsumen k) { Random r = new Random() (r.nextInt(10)+1).times { FakturJualOlehSales f = new FakturJualOlehSales(tanggal: LocalDate.now(), status: StatusFakturJual.DITERIMA) f.nomor = "F${r.nextInt(1000)}" def jumlahPiutang = r.nextInt(10000000) f.piutang = new KewajibanPembayaran(jumlah: jumlahPiutang) def jumlahPembayaran = r.nextInt(10) (r.nextInt(10)+1).times { Pembayaran p = new Pembayaran(tanggal: LocalDate.now(), jumlah: r.nextInt((int)f.sisaPiutang(false))) if (r.nextInt(10) > 5) { p.bilyetGiro = new BilyetGiro(nomorSeri: 'AA-123') } if (r.nextInt(10) > 8) { p.potongan = true } f.piutang.bayar(p) } k.listFakturBelumLunas << f } } Konsumen k1 = new Konsumen(nama: 'Konsumen A', listFakturBelumLunas: []) Konsumen k2 = new Konsumen(nama: 'Konsumen B', listFakturBelumLunas: []) Konsumen k3 = new Konsumen(nama: 'Konsumen C', listFakturBelumLunas: []) tambahFaktur(k1) tambahFaktur(k2) tambahFaktur(k3) [k1,k2,k3]
Untuk kebutuhan pribadi, saya sempat melakukan modifikasi pada iReport (di https://github.com/JockiHendry/ireport-fork) agar bisa memasukkan kode program Groovy secara langsung seperti pada gambar berikut ini:
Bila memakai iReport yang resmi, saya harus membuat kode program Groovy di atas pada proyek yang sudah ada, kemudian menyertakan nama class dan nama method yang mengembalikan Collection
di dialog ini.
Saya kemudian men-klik tombol Test untuk memastikan bahwa kode program dapat berjalan secara lancar. Setelah itu, saya men-klik tombol Save.
Berikutnya, saya men-klik tombol Report Query seperti pada gambar berikut ini:
Pada dialog yang muncul, saya memilih tab JavaBean Datasource. Kemudian saya mengisi Class name dengan domain.penjualan.Konsumen
dan men-klik tombol Read attributes. Karena saya merancang domain model berdasarkan aturan di domain driven design, maka saya hanya perlu men-query root aggregate secara langsung. Pada contoh ini, Konsumen
adalah root aggregate yang memiliki informasi piutang dan pembayarannya (dalam bentuk atribut). Oleh sebab itu, saya menambahkan beberapa atribut yang dibutuhkan dengan memilihnya dan men-klik Add selected field(s) seperti pada gambar berikut ini:
Setelah selesai, saya men-klik tombol Ok.
Pada laporan ini, terdapat 3 hierarki informasi yang hendak ditampilkan: pelanggan (diwakili class Konsumen
), piutang untuk masing-masing pelanggan (diwakili oleh Konsumen.listFakturJualBelumLunas
), dan pembayaran untuk masing-masing piutang (diwakili oleh Konsumen.listFakturJualBelumLunas.piutang.listPembayaran
). Bila menggunakan fasilitas subreport, saya perlu membuat 3 laporan berbeda dan memanggilnya dalam sebuah laporan. Cara ini cukup merepotkan dan sulit dikelola. Oleh sebab itu, pada artikel ini, saya akan memakai cara yang lebih sederhana tanpa perlu membuat subreport, dengan menggunakan fasilitas List component dan Table component dari JasperReports.
Menampilkan Pelanggan
Ini adalah tugas paling mudah. Saya hanya perlu men-drag beberapa field sehingga menghasilkan rancangan seperti pada gambar berikut ini:
Bila saya men-preview laporan, yang saya dapatkan hanya informasi pelanggan seperti pada gambar berikut ini:
Menampilkan Piutang Untuk Masing-Masing Pelanggan
Untuk menampilkan piutang per pelanggan, saya akan menggunakan List component yang dapat ditemukan di palette seperti berikut ini:
Setelah men-drag komponen tersebut ke laporan, iReport akan membuatkan sebuah dataset baru dengan nama dataset1 yang terlihat seperti pada gambar berikut ini:
Saya akan mengubah nama dataset tersebut menjadi dsPiutang dan menambahkan beberapa attribute milik class FakturJualOlehSales
sehingga dataset tersebut terlihat seperti pada gambar berikut ini:
Berikutnya, saya men-klik kanan pada List component yang ada di laporan dan memilih menu Edit list datasource. Saya kemudian mengisi kotak dialog yang muncul sehingga terlihat seperti pada gambar berikut ini:
Setelah itu, saya bisa men-drag field yang dibutuhkan kedalam List component seperti yang terlihat pada gambar berikut ini:
Sekarang, bila saya men-preview laporan, saya akan memperoleh hasil seperti pada gambar berikut ini:
Menampilkan Pembayaran Untuk Masing-Masing Piutang
Untuk menampilkan daftar pembayaran per piutang/faktur, saya akan menggunakan Table component. Untuk itu, saya men-drag Table component dari palette ke dalam List component yang sudah ada. Table component memiliki icon yang terlihat seperti pada gambar berikut ini:
Pada table wizard yang muncul, saya men-klik tombol New dataset. Saya kemudian mengisi nama dataset dengan dsPembayaran, memilih Create an empty dataset, lalu men-klik tombol Finish. Saya kemudian men-klik tombol Next dua kali. Pada step ke-3, saya memilih Use a JRDataSource expression dan mengisi ekspresi-nya dengan:
new net.sf.jasperreports.engine.data. JRBeanCollectionDataSource($F{piutang}.listPembayaran)
Saya men-klik tombol Next dan melakukan pengaturan seadanya di step ke-4 sebelum akhirnya men-klik tombol Finish.
Selanjutnya, saya menambahkan attribut milik Pembayaran
pada dsPembayaran
sehingga dataset tersebut terlihat seperti pada gambar berikut ini:
Sekarang saya siap untuk merancang tabel. Agar dapat merancang tabel, saya perlu beralih ke rancangan tabel dengan men-klik Table 1 di bagian bawah layar seperti yang terlihat pada gambar berikut ini:
Setelah itu, saya membuat rancangan tabel seperti pada gambar berikut ini:
Setelah rancangan selesai, saya dapat kembali halaman utama laporan dengan men-klik tombol Main report di bagian bawah layar. Saya dapat melakukan perubahan lagi agar laporan terlihat rapi. Hasil akhirnya, bila saya men-preview laporan, sekarang laporan akan terlihat seperti:
Laporan master-detail berhasil ditampilkan dengan baik cukup dengan satu laporan tunggal tanpa harus melibatkan subreport.
Anda harus log masuk untuk menerbitkan komentar.