Total Tayangan Halaman

Selasa, 12 April 2011

MVC, duet: Ubuntu, MySQL, Java, Netbeans, Tomcat, ZK, iReport (Bagian 6)

Laporan Rekap Transaksi - iReport
1. Buka explorer, cari lokasi proyek "pfm" disimpan, buka folder "web", kemudian buat folder dengan nama "laporan".
2. Buka folder "iReport-3.0.0"
3. Klik kanan "open" atau klik ganda saja pada berkas "iReport.sh", apabila ada pertanyaan, pilih "execute".
4. Setelah muncul iReport, tekan tombol "ctrl+n". Muncul jendela "Report properties", sesuaikan pengaturan dengan kehendak, jangan lupa beri nama dengan "rekap transaksi".
5. Tekan "ctrl+s" untuk menyimpan berkas. Berkas disimpan pada folder baru tersebut (folder "laporan").
6. Secara bawaan, terdapat beberapa bagian yang tampil, yakni "title" (hanya muncul di halaman pertama), "pageHeader" (selalu muncul di setiap halaman), "columnHeader", "detail", "columnFooter" (selalu muncul di setiap halaman), "lastPageFooter" (hanya muncul di akhir halaman), dan "summary" (hanya muncul di akhir halaman). Terdapat 1 bagian spesial yang bernama "bacground", di mana gambar latar belakang di atur di sini.
7. Pada tab "document structure" terdapat beberapa kategori, yaitu "parameters" (dikirim dari luar laporan), "fields", "variables" (rumus) dan bagian-bagian yang ada di iReport. Semua tipe data yang ditangani harus ada kesesuaian, baik yang berasal dari laporan itu sendiri (misal: penggunaan ke dalam rumus) atau hasil kiriman dari luar laporan (misal: dari "*.java"), selain itu akan terjadi kesalahan.
8. Untuk menambahkan "parameters" atau "fields" atau "variables", cukup klik kanan pada "document structure", kemudian pilih "add..." dan pilih yang diinginkan.
9. Laporan ini berdasarkan permintaan "v_rekap" yang di dalamnya terdapat kolom "idtransaksi", "idpengguna", "nominal", "bulan", "tahun", "namaitem", "alurkas". Tidak semua kolom ditampilkan. Buatlah "field" pada iReport untuk "nominal" (integer), "namaitem" (string) dan alurkas (boolean). Buatlah "parameter" dengan nama "namapengguna" (string) dan "periode" (string). Buatlah "variable" dengan nama "vnominal" (integer) dan isikan pada "variabel expression" rumus
( $F{alurkas}.booleanValue() == true ? $F{nominal} : new java.lang.Integer (-1 * $F{nominal}.intValue()) )
yang artinya apabila alurkas bernilai benar, maka nominalnya bernilai positif, selain itu nominalnya bernilai negatif.
10. Hilangkan bagian "title", "columnFooter", "lastPageFooter", dan "summary" dengan cara membuat tingginya menjadi 0 atau dirapatkan menggunakan tetikus.
11. Masukkan "field" "namaitem" dan "variabel" "vnominal" ke dalam detail. Atur posisi sesuai dengan kehendak. Apabila item dipilih, maka garisnya akan berubah menjadi oranye dan ada 8 titik yang berwarna ungu apabila item tersebut tidak bertabrakan dengan item yang lain. Apabila item-item bertabrakan, maka titiknya berwarna hijau. Buat 2 buah "static text" ke dalam "columnHeader" serta ubah labelnya menjadi "Nama Item" dan "Nominal". Klik kanan pada "text field" "$V{vnominal}", kemudian pilih "properties". Muncul jendela "rekap transaksi", pilih tab "font". Ubah "horizontally align" menjadi "right". Pilih tab "text field", kemudian tombol "create...". Muncul jendela "pattern editor", pilih "number". Ubah pada "decimal places" menjadi 0 dan centang "use 1000 separator". Klik tombol "apply", kemudian tutup jendela "rekap transaksi".
12. Buat 2 buah "static text" ke dalam "pageHeader" serta ubah labelnya menjadi "Nama Pengguna" dan "Periode" dalam posisi vertikal. Masukkan "parameter" "namapengguna" dan "periode" ke dalam "pageHeader", posisikan sesuai dengan labelnya.
13. Untuk hasil yang terbaik: jangan sampai item-item bertabrakan, tinggi item lebih tinggi daripada tinggi huruf serta kesamaan jenis huruf pada "font" dan "pdf font".
14. Tekan menu "Build" > "Compile". Buka folder "iReport-3.0.0", buka folder "bin" dan kopikan "rekap transaksi.jasper" ke dalam folder "laporan".



Halaman Rekap Transaksi
View: [ Web Pages/laporan/rekap.zul ]
<?xml version="1.0" encoding="UTF-8"?>
<?init class="org.zkoss.zkplus.databind.AnnotateDataBinderInit" arg0="win" ?>

<zk xmlns="http://www.zkoss.org/2005/zul">
<window  width="800px" id="win" apply="control.rekap">
    <panel zindex="2">
        <panelchildren>
            <grid>
                <columns>
                    <column width="150px"/>
                    <column width="600px"/>
                </columns>
                <rows>
                    <row spans="2" align="center">
                        <label value="Rekap Transaksi"/>
                    </row>
                    <row>
                        <label value="Tahun Transaksi mulai" style="font-weight:bold;color:red"/>
                        <hbox>
                            <intbox id="intMulai" />
                            <label value=" s.d. " />
                            <intbox id="intAkhir" />
                            <button  id="btnTampil1" label="Tampilkan" image="../image/presentasi.png" />
                        </hbox>
                    </row>
                    <row>
                        <label value="Tahun Transaksi dalam" style="font-weight:bold;color:red"/>
                        <hbox>
                            <textbox id="txtTahun" />
                            <label value=" pisah dengan tanda koma, misal: 2010, 2011" />
                            <button  id="btnTampil2" label="Tampilkan" image="../image/presentasi.png" />
                        </hbox>
                    </row>
                </rows>
            </grid>
            <jasperreport id="laporan" type="pdf" height="400px" />
        </panelchildren>
    </panel>
</window>
</zk>
Controller: [ Sources Package/control/index.java ]
package control;
import dao.VRekap;
import formater.tipedata;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRField;
import org.zkoss.zk.ui.Sessions;
import org.zkoss.zk.ui.util.GenericForwardComposer;
import org.zkoss.zkex.zul.Jasperreport;
import org.zkoss.zul.Intbox;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Window;

public class rekap extends GenericForwardComposer
{
    static EntityManagerFactory emf     = Persistence.createEntityManagerFactory("dao-persistence-pfmPU");
    static EntityManager        emTabel = emf.createEntityManager();
    private List                dataList;
    private Jasperreport        laporan;
    private Map                 reportParam;
    protected   Window          win;
    protected   Intbox          intMulai, intAkhir;
    protected   Textbox         txtTahun;
    private     String          mode = "";
    public rekap()
    {
    }
    public void onCreate$win()
    {
        if (Sessions.getCurrent().getAttribute("userid") == null)
        {
            win.detach();
            win = null;
            execution.sendRedirect("../index.zul", "_top");
            return;
        }
        intMulai.setFocus(true);
    }
    public void onClick$btnTampil1() throws Exception
    {
        mode = "diantara";
        tampilkanlaporan();
    }
    public void onClick$btnTampil2() throws Exception
    {
        mode = "dalam";
        tampilkanlaporan();
    }
   
    //Laporan
    public class SumberDataLaporan implements JRDataSource
    {
        private Object[][] data;
        private int index = -1;
        public SumberDataLaporan() throws Exception
        {
            data = setDataToReport();
        }
        @Override
        public boolean next() throws JRException
        {
            index++;
            return (index < data.length);
        }
        @Override
        public Object getFieldValue(JRField field) throws JRException
        {
            Object value = null;
            LinkedList llBuff   = getField();
            for (int i=0; i<llBuff.size(); i++)
                if (llBuff.get(i).equals(field.getName()))
                {
                    value = data[index][i];
                    i = llBuff.size();
                }
            return value;
        }
    }
    public Object[][] setDataToReport() throws Exception
    {
        VRekap  buffer_objek;
        if (mode.equals("diantara"))
            dataList = emTabel.createNamedQuery("VRekap.findByTahunBetween")
                                .setHint("eclipselink.refresh", "true")
                                .setParameter("tahun1", intMulai.getValue())
                                .setParameter("tahun2", intAkhir.getValue())
                                .setParameter("idpengguna", tipedata.keInt(Sessions.getCurrent().getAttribute("id")))
                                .getResultList();
        else
        {
            LinkedList<Integer> periode = new LinkedList<Integer>();
            StringTokenizer st = new StringTokenizer(txtTahun.getValue(),",");
            while(st.hasMoreTokens())
                periode.add(tipedata.keInt(st.nextElement().toString().trim()));
            dataList = emTabel.createNamedQuery("VRekap.findByTahunIn")
                                .setHint("eclipselink.refresh", "true")
                                .setParameter("tahun", periode)
                                .setParameter("idpengguna", tipedata.keInt(Sessions.getCurrent().getAttribute("id")))
                                .getResultList();
        }
        Object[][] xBuffer = new Object[dataList.size()][3];
        int x = 0;
        for (Iterator it = dataList.iterator(); it.hasNext();)
        {
            buffer_objek = (VRekap) it.next();
            xBuffer[x][0]   = buffer_objek.getNamaitem();
            xBuffer[x][1]   = buffer_objek.getNominal();
            xBuffer[x][2]   = tipedata.keBoolean(buffer_objek.getAlurkas());
            x++;
        }
        dataList    = null;
        return xBuffer;
    }
    public LinkedList getField()
    {
        LinkedList ll = new LinkedList();
        ll.add("namaitem");
        ll.add("nominal");
        ll.add("alurkas");
        return ll;
    }
    public void tampilkanlaporan() throws Exception
    {
        laporan.setSrc("/laporan/rekap transaksi.jasper");
        reportParam = new HashMap();
        reportParam.put("namapengguna", Sessions.getCurrent().getAttribute("userid"));
        if (mode.equals("diantara"))
            reportParam.put("periode", intMulai.getValue() + " s.d. " + intAkhir.getValue());
        else
            reportParam.put("periode", txtTahun.getValue());
        laporan.setParameters(reportParam);
        laporan.setDatasource(new SumberDataLaporan());
    }
}
Tambahan:
1. Tambahkan skrip pada:
@NamedQuery(name = "VRekap.findByTahunBetween", query = "SELECT v FROM VRekap v WHERE v.tahun BETWEEN :tahun1 AND :tahun2 AND v.idpengguna = :idpengguna")
dan
@NamedQuery(name = "VRekap.findByTahunIn", query = "SELECT v FROM VRekap v WHERE v.tahun IN :tahun AND v.idpengguna = :idpengguna")
pada "dao-persistence-pfm/dao/VRekap.java", kemudian simpan. Penjelasan:
1. Pada "
Web Pages/laporan/rekap.zul" terdapat method "SumberDataLaporan" untuk mengirimkan data dari java ke jasper.
2. Method "SumberDataLaporan" tersebut membutuhkan data yang dikembalikan oleh method "
setDataToReport". Pada method "setDataToReport" menggunakan permintaan bernama "VRekap.findByTahunBetween" untuk mengimplementasikan klause "between" dan "VRekap.findByTahunIn" untuk mengimplementasikan klausa "in" yang membutuhkan tipedata List (list/arraylist/linkedlist). Ingat! Tipe data harap disesuaikan pada java dan iReport.
3. Mapping field terjadi pada method "getField". Nama yang tercantum harus sama pada java dan iReport.
4. Konfigurasi laporan terdapat pada method "tampilkanlaporan".

Tidak ada komentar: