Yap.. sesuai judul diatas kali ini saya ingin mengembangkan lagi artikel sebelumnya. Saya ingin menampilkan data karyawan menjadi sebuah report, dan tool yang saya gunakan adalah JasperReports. JasperReports merupakan sebuah reporting engine yang sifatnya open source. Jasper Reports bisa didapatkan disini. Untuk mendesain reportnya saya menggunakan plugin iReport yang telah terpasang di Netbeans komputer saya, dan bisa didownload disini.
Hal pertama yang harus dibuat, seperti biasa adalah entity, namun entity disini adalah field-field apa saja yang akan ditampilkan dalam report nanti. Untuk kasus ini saya ingin menampilkan semua field dari table karyawan kecuali field Id. Kemudian saya juga melakukan sedikit perubahahan pada property foto, yang mana sebelumnya saya menggunakan array yang bertipe byte, untuk pembuatan report ini saya menggunakan Image, untuk memudahkan ketika akan menampilkan gambar di JasperReport. Kode entity ini saya letakkan didalam package arya.entity, sehingga entity reportnya menjadi seperti ini.
package arya.entity; import java.awt.Image; import java.util.Date; /** * * @author arya */ public class LaporanKaryawan { private String nama; private String alamat; private String jenisKelamin; private Date tglLahir; private Image foto; public String getAlamat() { return alamat; } public void setAlamat(String alamat) { this.alamat = alamat; } public Image getFoto() { return foto; } public void setFoto(Image foto) { this.foto = foto; } public String getJenisKelamin() { return jenisKelamin; } public void setJenisKelamin(String jenisKelamin) { this.jenisKelamin = jenisKelamin; } public String getNama() { return nama; } public void setNama(String nama) { this.nama = nama; } public Date getTglLahir() { return tglLahir; } public void setTglLahir(Date tglLahir) { this.tglLahir = tglLahir; } }
Untuk selanjutnya seperti biasa kita membuat dulu DAOnya, bagi yang lupa, bisa liat dulu disini atau bisa membaca dari berbagai artikel lainnya. Untuk Dao saya hanya mendeklarasikan method untuk membaca data dan saya letakkan pada package arya.dao, seperti ini.
package arya.dao; import arya.entity.LaporanKaryawan; import java.util.List; /** * * @author arya */ public interface LaporanKaryawanDao { public List<LaporanKaryawan> getByName(String nama); }
Skenarionya adalah user bisa menampilkan seluruh data karyawan atau karyawan tertentu saja berdasarkan nama karyawan tersebut. Sehingga dalam method tersebut saya isi dengan parameter nama yang bertipe String. Jika nama karyawan tidak diinputkan maka secara default yang muncul adalah seluruh data karyawan. Nah berikutnya adalah implementasi dari interface diatas dan saya letakkan pada package arya.dao.impl.
package arya.dao.impl; import arya.dao.LaporanKaryawanDao; import arya.entity.LaporanKaryawan; import java.awt.Image; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.ImageIcon; /** * * @author arya */ public class LaporanKaryawanDaoImpl implements LaporanKaryawanDao{ private Connection connection; public LaporanKaryawanDaoImpl(Connection connection){ this.connection = connection; } public List <LaporanKaryawan> getByName(String nama) { String SQL = "SELECT nama,alamat,jenisKelamin,tglLahir,foto FROM Karyawan WHERE nama LIKE ?"; List <LaporanKaryawan> list = new ArrayList(); LaporanKaryawan laporanKaryawan = null; try { PreparedStatement statement = connection.prepareStatement(SQL); statement.setString(1, "%"+nama+"%"); ResultSet rs = statement.executeQuery(); while (rs.next()){ laporanKaryawan = new LaporanKaryawan(); laporanKaryawan.setNama(rs.getString(1)); laporanKaryawan.setAlamat(rs.getString(2)); laporanKaryawan.setJenisKelamin(rs.getString(3)); laporanKaryawan.setTglLahir(rs.getDate(4)); ByteArrayInputStream inputStream = new ByteArrayInputStream(rs.getBytes(5)); ObjectInputStream stream = new ObjectInputStream(inputStream); ImageIcon icon = (ImageIcon) stream.readObject(); Image image = icon.getImage(); laporanKaryawan.setFoto(image); list.add(laporanKaryawan); inputStream.close(); stream.close(); } } catch (SQLException ex) { Logger.getLogger(LaporanKaryawanDaoImpl.class.getName()).log(Level.SEVERE, null, ex); }catch (IOException ex){ Logger.getLogger(LaporanKaryawanDaoImpl.class.getName()).log(Level.SEVERE, null, ex); }catch (ClassNotFoundException ex) { Logger.getLogger(LaporanKaryawanDaoImpl.class.getName()).log(Level.SEVERE, null, ex); } return list; } }
Ada sedikit perbedaan antara DAO untuk laporan dengan DAO karyawan, dimana untuk DAO laporan ini saya langsung mengubah data foto di database yang bertipe biner atau BLOB menjadi Image. Ini untuk memudahkan ketika akan menampilkan gambar di JasperReportnya. Kemudian mari kita mulai untuk mendesain reportnya. Untuk mendesain report, saya menggunakan iReport yang telah terpasang pada netbeans di komputer saya. Pilih New File —–> Report —–> Empty Report.
Kemudian klik Next, lalu saya beri nama LaporanKaryawan. Lalu pilih dimana kita akan menempatkan report kita. Hal ini penting sekali, karena pada saat kita akan menampilkan reportnya, kita harus mendefinisikan path dimana report itu berada. Untuk itu saya letakkan didalam folde src/arya/Report.
Kemudian klik finish, maka akan muncul sebuah tampilan seperti ini,
Selanjutnya, saya definisikan field apa saja yang akan ditampilkan didalam report ini. Sebagai catatan pada saat membuat field yang akan ditampilkan ke dala report, nama field – field tersebut harus sama dengan nama entity laporan yang telah kita buat sebelumnya. Pilih Report Inspector kemudian klik kanan pada Fields pilih add field. Lalu kita ubah nama field tersebut.Lalu kita definisikan tipe data dari field tersebut, secara default tipe data dari field diatas adalah String. Karena tidak semua field bertipe String maka kita akan menggantinya dengan cara klik field yang akan diganti, lalu pada side bar sebelah kanan pilih properties. Gambar dibawah ini adalah settingan untuk field tglLahir.
Dibawah ini merupakan daftar field yang saya gunakan beserta tipe datanya.
No | Nama Field | Field Class |
1 | nama | java.lang.String |
2 | alamat | java.lang.String |
3 | jenisKelamin | java.lang.String |
4 | tglLahir | java.util.Date |
5 | foto | java.lang.Object |
Jika sudah selesai, kita drag drop field – field tersebut ke dalam reportnya, lalu desain menjadi seperti ini.Khusus untuk field foto, karena yang ditampilkan adalah gambarnya, maka kita harus menambahkan Image dari Palette, akan muncul sebuah dialog untuk mencari file gambar di komputer anda, klik cancel. Lalu pada properties Image tersebut ganti Image Expression menjadi $Foto dan Expression Class menjadi java.awt.Image. Lalu atur Scale Image menjadi Fill Frame.
Untuk field – field yang lain juga sama, kita harus mengganti TextField Expressionnya beserta Class Expressionnya sesuai dengan apa tipe field yang ada. Contoh dibawah ini adalah untuk field tglLahir.
Setelah itu, saya akan memodifikasi kelas Koneksi yang ada pada artikel sebelumnya, yaitu dengan menambahkan LaporanKaryawanDao.
package arya.koneksi; import arya.dao.KaryawanDao; import arya.dao.LaporanKaryawanDao; import arya.dao.impl.KaryawanDaoImpl; import arya.dao.impl.LaporanKaryawanDaoImpl; import com.mysql.jdbc.Driver; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.logging.Level; import java.util.logging.Logger; public class Koneksi { private static Connection connection; private static KaryawanDao karyawanDao; private static LaporanKaryawanDao laporanKaryawanDao; private Koneksi(){ } private static Connection getConnection() { if (connection==null){ try { DriverManager.registerDriver(new Driver()); connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/Coba", "root", "bandenk"); } catch (SQLException ex) { Logger.getLogger(Koneksi.class.getName()).log(Level.SEVERE, null, ex); } } return connection; } public static KaryawanDao getKaryawanDao() { if (karyawanDao==null){ karyawanDao = new KaryawanDaoImpl(getConnection()) } return karyawanDao; } public static LaporanKaryawanDao getLaporanKaryawanDao() { if (laporanKaryawanDao==null){ laporanKaryawanDao = new LaporanKaryawanDaoImpl(getConnection()) } return laporanKaryawanDao; } }
Jika sudah, maka kita sudah selesai mendesain reportnya. Selanjutnya kita desain form untuk menampilkan reportnya. Desain form seperti gambar dibawah ini.
No | Jenis | Nama | Fungsi |
1 | JLabel | jLabel1 | Menampilkan Nama |
2 | JTextField | txtCari | Menampung nama karyawan |
3 | JButton | btnCari | Menampilkan report |
4 | JPanel | jPanel1 | Menampung komponen |
5 | JPanel | pnlReport | Menampilkan report |
Jika sudah selesai kita langsung saja beri kode untuk event btnCari jika di klik. Kodenya adalah seperti dibawah ini.
private void btnCariActionPerformed(java.awt.event.ActionEvent evt) { List <LaporanKaryawan> list = Koneksi.getLaporanKaryawanDao().getByName(txtCari.getText()); Map <String,Object> parameter = new HashMap(); parameter.put("tanggal", new Date()); InputStream is = FrameLaporan.class.getResourceAsStream("/arya/Report/LaporanKaryawan.jasper"); JasperPrint print = null; try { print = JasperFillManager.fillReport(is, parameter, new JRBeanCollectionDataSource(list)); } catch (JRException ex) { Logger.getLogger(FrameLaporan.class.getName()).log(Level.SEVERE, null, ex); } JRViewer viewer = new JRViewer(print); pnlReport.removeAll(); pnlReport.add(viewer, BorderLayout.CENTER); pnlReport.updateUI(); }
Pertama – tama saya menampung data hasil query ke dalam sebuah list, kemudian karena saya akan menampilkan tanggal kapan report itu ditampilkan maka saya membuat sebuah parameter yang bertipe Map dan saya isi dengan tanggal kapan report itu ditampilkan. Lalu kita load file reportnya menggunakan InputStream, sesuaikan dengan path dimana file report itu berada. Kemudian tinggal kita buat objek JasperPrint lalu kita masukkan ke dalam objek viewer yang bertipr JRViewer. Terakhir kita masukkan viewer tersebut ke dalam pnlReport. Lalu compile reportnya, kemudian Build projectnya dan jalankan. Jika berhasil maka akan seperti ini.
Oya, jangan lupa untuk menambahkan library JasperReports kedalam project anda. Selamat mencoba, Semoga bermanfaat 😀
Comments on: "Menampilkan Gambar di Database dengan JasperReports" (46)
kok enggak bisa tampil ya mas ? muncul no docoment page
boleh tau pesan errornya ?
ooo ternyata gambar yang disimpan melalui program ngak bisa di tampilkan di report mas tapi kalau disimpan secara manual melalui mysql bisa di tampilkan gimana ne mas ada solusinya ?
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
List list = DbsUtil.getInterLaporanGuru().getByNip(jTextField1.getText());
Map parameter = new HashMap();
parameter.put(“tanggal”, new Date());
InputStream is = DialogLaporanGuru.class.getResourceAsStream(“/sipejaGS/laporan/newReport.jasper”);
JasperPrint print = null;
try {
print = JasperFillManager.fillReport(is, parameter, new JRBeanCollectionDataSource(list));
} catch (JRException ex) {
Logger.getLogger(DialogLaporanGuru.class.getName()).log(Level.SEVERE, null, ex);
}
JRViewer viewer = new JRViewer(print);
pnlReport.removeAll();
pnlReport.add(viewer, BorderLayout.CENTER);
pnlReport.updateUI();
}
ini syntax nya mas . . .
mohon bantuan nya . . .
tapi ada permasalahan lagi mas saya bisa menampilkan gambar seperti tutorial yang mas kasih tapi ada permasalahan ketika pembuatan report,report data gambar nya tidak mau muncul tapi ketika data gambar di isi manual bisa di munculkan kira kira gimana ya mas ?
Begini mas…
waktu saya nulis kode program di blog ada kekeliruan, mungkin karena saya copy paste…
dan sudah saya perbaiki…
bisa dilihat pada baris yang saya tandai…
oya mas kalau report gambar nya ngak mau tampil gimana ya mas mohon bantuanya lagi butuh buat menyelesaikan TA ?
maap mas kira2 project yang mas buat ne bisa di share biar mudah saya tracking nya . . .
maap kalau merepotkan
waduh mas, udah saya coba upload dari tadi, tpi gagal terus…
mungkin karena ukurannya yang lumayan besar…
maklum koneksi terbatas…
hmmmm . . .
librari nya ngak usah di share mas biar saya cari sendiri mungkin bisa mengurangi file nya . . .
mohon bantuanya mas . . .
o iya2….
udah mas ini linknya…
Save Image + Report
oooo terima kasih banyak mas
tp punya saya ini nya error
kira-kira kenapa ya mas
Aug 18, 2012 11:13:27 AM sipejags.Dialog.NewJFrame jButton1ActionPerformed
SEVERE: null
net.sf.jasperreports.engine.JRException: Error retrieving field value from bean :
at net.sf.jasperreports.engine.data.JRAbstractBeanDataSource.getBeanProperty(JRAbstractBeanDataSource.java:123)
at net.sf.jasperreports.engine.data.JRAbstractBeanDataSource.getFieldValue(JRAbstractBeanDataSource.java:96)
kalo dari pesan errornya sih, dia ga bisa baca beannya…
coba kode program saya dipelajari lagi lagi…
yang buat saya heran mas kalo pakek frame nya punya mas bisa, tapi kalo saya pakek frame yang saya buat sendiri nah keluar tu pesan error
Nah, mungkin ada beberapa kekeliruan pada frame yang mas buat…
jadi coba pelajari lagi kode program saya…
ok mas . .
mohon bantuanya kalau ada pemalahan lagi mas
oya mas blog nya mas sangat bagus dan membantu kalau bisa di tambah lagi artikel tentang java nya . . .
terima kasih banyak mas atas saran dan masukkannya…
di tunggu artikel selanjutnya mas . . .
😀
Wahhh… makasih mas… artikelnya sangat membantu….
ya Sama2….
kalo type data foto berupa byte[] bila ingin menampilkan ke jasperreport codingannya giman ya..??
seperti yang saya jelaskan pada artikel tersebut mas…
type data byte diconvert menjadi image menggunakan ByteArrayInputStream
mas maaf mengganggu saya boleh minta link download programnya ga? soalnya yang 4shared mati downloadnya
filenya masih saya cari mas..
mas maaf nih saya baru pemula ingin mengerjakan tugas TA dengan java saya mencoba membuat program seperti diatas tp tanpa menggunkan tanggal dalam parameternya
contohnya
List list = Koneksi.getdatabase().getByName(txtcari.getText());
Map parameter = new HashMap();
InputStream is = FrameKaryawan.class.getResourceAsStream(“/pencarian/tampilan/tampil.jesper”);
JasperPrint print = null;
try {
print = JasperFillManager.fillReport(is, parameter, new JRBeanCollectionDataSource(list));
} catch (JRException ex) {
Logger.getLogger(FrameKaryawan.class.getName()).log(Level.SEVERE, null, ex);
}
JRViewer viewer = new JRViewer(print);
pnlReport.removeAll();
pnlReport.add(viewer, BorderLayout.CENTER);
pnlReport.updateUI();
kena erorr nya di sini
at net.sf.jasperreports.engine.util.JRLoader.(JRLoader.java:68)
at net.sf.jasperreports.engine.JRPropertiesUtil.loadProperties(JRPropertiesUtil.java:99)
at net.sf.jasperreports.engine.DefaultJasperReportsContext.initProperties(DefaultJasperReportsContext.java:94)
at net.sf.jasperreports.engine.DefaultJasperReportsContext.(DefaultJasperReportsContext.java:71)
at net.sf.jasperreports.engine.DefaultJasperReportsContext.(DefaultJasperReportsContext.java:59)
at net.sf.jasperreports.engine.JasperFillManager.getDefaultInstance(JasperFillManager.java:85)
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:956)
at Pencarian.form.FrameKaryawan.jButton1ActionPerformed(FrameKaryawan.java:136)
at Pencarian.form.FrameKaryawan.access$000(FrameKaryawan.java:31)
at Pencarian.form.FrameKaryawan$1.actionPerformed(FrameKaryawan.java:62)
rasanya ada yang salah ketik, harusnya “tampil.jasper” bukan “tampil.jesper”
mas ini nyambung dari program sebelumnya yah yang save image?
Iya, yng sebelumnya, gambar disimpan di database, yg ini menampilkannya pake jasper report
klo mau menyimpan gambar dengan variabel gambar diganti dari byte ke image giimana mas
statement.setBytes(8, buku.getGambar());
dicoba saja gan, hasilnya seperti apa, tapi klo saya gambarnya saya jadikan ImageIcon, trus diconvert jadi array bertipe byte baru disimpan…
liat contoh program nya donk mas
Ya itu di postingan sebelumnya..
bukan mas program yang ini yang 4 share ga bisa kebuka
Rencananya mau saya upload ulang, tpi filenya di laptop satunya…
ooo ya udah mas tolong ya nanti di upload makasih mas ngerepotin
Ya sama2…
maaf mas mengganggu udah di upload belom?
Numpang share blog saya ya… 🙂
htpp://vyor.wordpress.com
Silahkan, jgn lupa cantumin sumbernya..
mas projeknya gabisa di download
gan boleh minta projectnya?
Mas, pada form data disimpan kemudian otomatis muncul report dari data yang disimpan. Gmn ya Mas cara nya?
Jadi pada saat query simpan sukses menyimpan data.. Anda panggil saja fungsi atau method untuk menampilkan report
Terima kasih banyak.. sangat bermanfaat 🙂
kurang lebih saya sudah buat sama seperti yang mas instruksikan di atas, tapi saya masi tetap mendapat pesan errot seperti yang mas mamat dapat di atas
net.sf.jasperreports.engine.JRException: Error retrieving field value from bean :
saya coba download project yang agan share untuk mempelajari kesalahan saya dalam pembuatan tapi filenya sudah tidak berlaku lagi gan…
bisa di upload ulang gan projectnya, soalnya saya lagi butuh untuk tugas TA juga..
mohon bantuannya gan
bisa di bikin video gak mass. biar jelas cara cara nya … agar yang belum tau juga bisa mengikuti langkah-langkah nya,.. mohon bantuanya mass..
minta bantuanya mas,… kalo bolehhh saya minta kontak person nya biar saya bisa hubungin mass… saya juga lagi cari guru private mass… Ditunggu balasnya mass..
minta tolong di bikin video dong …. maaf nihh baru pemula jadi kurang paham bahasanya..