Merancang Laporan Master-Detail Tanpa Subreport


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:

Domain model yang akan dipakai dalam laporan

Domain model yang akan dipakai dalam laporan

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:

Membuat data source baru

Membuat data source baru

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:

Memasukkan kode program pada saat membuat data source

Memasukkan kode program pada saat membuat data source

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:

gambar4

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:

Membuat report query

Membuat report query

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:

Rancangan laporan untuk pelanggan

Rancangan laporan untuk pelanggan

Bila saya men-preview laporan, yang saya dapatkan hanya informasi pelanggan seperti pada gambar berikut ini:

Hasil preview laporan

Hasil preview laporan

Menampilkan Piutang Untuk Masing-Masing Pelanggan

Untuk menampilkan piutang per pelanggan, saya akan menggunakan List component yang dapat ditemukan di palette seperti berikut ini:

List component

List component

Setelah men-drag komponen tersebut ke laporan, iReport akan membuatkan sebuah dataset baru dengan nama dataset1 yang terlihat seperti pada gambar berikut ini:

Dataset yang dihasilkan iReport

Dataset yang dihasilkan iReport

Saya akan mengubah nama dataset tersebut menjadi dsPiutang dan menambahkan beberapa attribute milik class FakturJualOlehSales sehingga dataset tersebut terlihat seperti pada gambar berikut ini:

Dataset yang sudah diubah

Dataset yang sudah diubah

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:

Mengisi expression untuk data source

Mengisi expression untuk data source

Setelah itu, saya bisa men-drag field yang dibutuhkan kedalam List component seperti yang terlihat pada gambar berikut ini:

Rancangan laporan dengan List component berisi piutang

Rancangan laporan dengan List component berisi piutang

Sekarang, bila saya men-preview laporan, saya akan memperoleh hasil seperti pada gambar berikut ini:

Hasil preview laporan

Hasil preview laporan

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:

Table component

Table component

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:

Dataset yang telah diubah

Dataset yang telah diubah

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:

Mengubah ke modus rancangan tabel

Mengubah ke modus rancangan tabel

Setelah itu, saya membuat rancangan tabel seperti pada gambar berikut ini:

Contoh rancangan tabel

Contoh rancangan tabel

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:

Hasil preview laporan

Hasil preview laporan

Laporan master-detail berhasil ditampilkan dengan baik cukup dengan satu laporan tunggal tanpa harus melibatkan subreport.

Perihal Solid Snake
I'm nothing...

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: