Pada artikel ini saya akan membahas bagaimana caranya untuk menampilkan dynamic image pada crystal report dengan ASP.NET. Pada program yang saya buat, file gambar saya simpan pada folder di web servernya dengan pertimbangan performance, jika disimpan di database maka performance akan berkurang karena record dalam database menjadi besar, maka saya menyimpan datanya pada folder kemudian menyimpan nama filenya di database.
Adapun design database yang dibuat:
Data gambar disimpan pada folder secimages
Kemudian untuk mengambil data dari database untuk ditampilkan pada crystal report saya menggunakan cara menampungnya dulu kedalam object dataset karena jika mengambil langsung dari database akan menyulitkan jika aplikasi dipindah ke komp server lain (harus merubah computer name pada program).
Maka buat datasetnya dulu untuk datasource pada crystal report
Tambahkan satu field baru pada dataset section yaitu image_stream untuk menampung gambar yang akan kita tampilkan kedalam crystal report, kemudian ubah property DataType pada field image_stream menjadi System.Byte[];
Kemudian pada halaman report-nya (halaman yang ada komponen CrystalReportSource dan CrystalReportViewer) tambahkan kode sebagai berikut:
Web App (ASP.NET)
using System; using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; using System.IO; public partial class operator_ReportSection : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { //menambahkan data kedalam dataset dsReportSection ds = new dsReportSection(); using (DbClass objDb = new DbClass()) { objDb.SQL = "select * from section"; objDb.OpenConnection(); objDb.FillDataSet(ds,"section"); } //ambil image dari folder ~/secimages/ masukan dalam fileds image_stream pada dataset for (int index = 0; index < ds.Tables[0].Rows.Count; index++) { if (ds.Tables[0].Rows[index]["url_gambar"].ToString() != "") { if (File.Exists(Server.MapPath("~/secimages/") + ds.Tables[0].Rows[index]["url_gambar"].ToString())) { LoadImage(ds.Tables[0].Rows[index], "image_stream", Server.MapPath("~/secimages/") + ds.Tables[0].Rows[index]["url_gambar"].ToString()); } } } //tampilkan dalam crystal report crsSection.ReportDocument.SetDataSource(ds.Tables[0]); crvSection.ReportSource = crsSection; } //ambil image pada folder ~/secimages/ private void LoadImage(DataRow objDataRow, string strImageField, string FilePath) { try { FileStream fs = new FileStream(FilePath, System.IO.FileMode.Open, System.IO.FileAccess.Read); byte[] Image = new byte[fs.Length]; fs.Read(Image, 0, Convert.ToInt32(fs.Length)); fs.Close(); objDataRow[strImageField] = Image; } catch (Exception ex) { Response.Write("<font color=red>" + ex.Message + "</font>"); } } }
Contoh Hasil jadinya :
Windows Form App (VB)
Pada win form caranya sama dengan Web, hanya pada kode program ini saya menerapkannya pada kasus yang berbeda yaitu untuk mencetak photo mahasiswa
Imports System.Data Imports System.Data.SqlClient Imports System.Configuration Imports System.IO Public Class FormReportCustomer Private objConn As SqlConnection Private objCmd As SqlCommand Private objDa As SqlDataAdapter Private objDs As dsCustomer Private Sub FormReportCustomer_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load 'buat koneksi Dim strConn As String = ConfigurationManager.ConnectionStrings( _ "ActConnectionString").ConnectionString objConn = New SqlConnection(strConn) Dim strSql As String = "select * from pelanggan" objCmd = New SqlCommand(strSql, objConn) objDa = New SqlDataAdapter() objDs = New dsCustomer() Try objConn.Open() objDa.SelectCommand = objCmd objDa.Fill(objDs, "pelanggan") Catch ex As Exception MessageBox.Show(ex.Message) Finally objCmd.Dispose() objConn.Close() End Try Dim strPath As String = My.Application.Info.DirectoryPath strPath = Path.Combine(strPath, "photo") If objDs.Tables("pelanggan").Rows.Count <> 0 Then For index As Integer = 0 To objDs.Tables(0).Rows.Count - 1 If objDs.Tables(0).Rows(index)("picname").ToString() <> "" Then If File.Exists(Path.Combine(strPath, _ objDs.Tables(0).Rows(index)("picname").ToString())) Then LoadImage(objDs.Tables(0).Rows(index), "image_stream", _ Path.Combine(strPath, _ objDs.Tables(0).Rows(index)("picname").ToString())) End If End If Next rptCustomer1.SetDataSource(objDs.Tables("pelanggan")) CrystalReportViewer1.ReportSource = rptCustomer1 End If End Sub Private Sub LoadImage(ByVal objDataRow As DataRow, _ ByVal strImageField As String, ByVal FilePath As String) Try Dim fs As FileStream = New FileStream(FilePath, _ System.IO.FileMode.Open, System.IO.FileAccess.Read) Dim Image(fs.Length) As Byte fs.Read(Image, 0, CInt(fs.Length)) fs.Close() objDataRow(strImageField) = Image Catch ex As Exception MessageBox.Show(ex.Message) End Try End Sub End Class
Contoh hasil jadinya:
Semoga artikel ini bisa membantu :)
Salam
Erick Kurniawan
Aduh mas terima kasih atas infonya yang bermanfaat, terus aku mau tanya seperti ini:
saya pakai vb6 dan crystal report 4.6, saya ingin membuat laporan dari tgl(awal) s/d tgl(akhir)
Yang menjadi pertanyaan :
saya ingin menampilkan tgl(akhir) pada crystal report
Laporan persediaan dari tgl(awal) s/d tgl(akhir)
Untuk tgl(awal) sudah bisa, tapi tgl(akhir) tidak bisa tampil pada crystal report, kenapa ya mas?
Terima kasih atas jawabanya
Salam kenal mas siswo, tanggal akhir? maksudnya querynya mas? untuk range tanggal?
“SELECT field1, field2 FROM table WHERE tanggal BETWEEN tanggalawal AND tanggal akhir”
pak kayanya ini yang bapak posting di geeks-indonesia.net kan?
yup iya oul hehehe tp sekarang jarang posting ke geeks niy :)
kalau binary image-nya dalam format JP2 gimana ya ? tq
saya blum pernah coba mas? format jp2 untuk apa ya kok malah blum pernah dengar, klo dicontoh diatas saya menggunakan format jpg mas
salam kenal pak Erick,
numpang tanya nih pak, gimana caranya ngambil value dari salah satu formula di report kita en passing it to a variable yg udah kita declare di vb.net 2005?
Halo salam kenal juga wil :), klo passing nilai dari CR ke VB saya belum perna coba, biasanya passing dari VB ke report untuk diolah datanya or ditampilkan, klo boleh tau untuk tuujuan apa ambil value dari report?
karna value dari formula yg saya mau itu, didapat dari formula² yg ada, jadi kalo calculate dari program lagi, saya rasa itu bakalan bikin program saya jadi lambat sekali… sedangkan waktu mau view report ini aja lambat banget..
jadi menurut saya lebih cepet kalo ngambil value dari formula tersebut..
waktu saya searching di gugel, saya cuma dapet 1 petunjuk aja
http://social.msdn.microsoft.com/Forums/en-US/vscrystalreports/thread/91351673-f0f5-438e-b066-0ca2a67ed892/
tapi saya ga gitu ngerti..
bisa gak kyk gini:
dim rpt as new reportdocument
dim getVal as Object = rpt.DataDefinitions.Formula(“@nama_formula”).Text
saya klo ngeset nilai ke CR nya kyk gt.. mgkn sama utk get value nya.
pak yang source code di atas pada crystal reportnya perlu di setting tidak? atau folder imagenya harus ditempatkan pada path tertentu? saya nyoba kok gambarnya tidak mau tampil ya pak??
saya nyoba yang vb.net
ga perlu disetting kok, yup folder image harus ambil dari path tertentu di database cukup disimpan nama filenya saja
lha kalo yang vb contoh bapak itu folder imagenya ditaruh mana??
imagenya ditaruh dalam folder ‘image’ di root folder web app-nya, atau folder ‘bin’ jika menggunakan windows app
pak bagaimana cara /step2 membuat dataset pada crystal report, saya memakat CR 8.5 dan vB 6.0 , supaya saya tidak perlu merubah connection database bila saya install di server lain. mohon petunjuknya terimakasih.
Salam kenal pak erik,
untuk yang report mencetak foto mahasiswa itu misalnya dibuat 2 column gmn???
mohon bimbingannya
thx u
Halo mas dian, kalo mau dibuat 2 kolom tinggal diatur aja di menu untuk crsytal reportnya udah ada kok
Kalo ada contoh utk VB6 & cr 8.5 nya mas :-)
Mas, Erick. Kalo nampilin dinamik image ke crystal report dari vb6. gimana ya?
saya dah coba nyari sana sini tapi ga bisa2. Tolongin dong.
kalo bisa kirim file zipnya ke email saya.
np_world@yahoo.com