Dynamic Image Pada Crystal Report

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:

image

Data gambar disimpan pada folder secimages

image

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

image

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[];

image

Kemudian pada halaman report-nya (halaman yang ada komponen CrystalReportSource dan CrystalReportViewer) tambahkan kode sebagai berikut:

Web App (ASP.NET)

image

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 :

image

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:

image

Semoga artikel ini bisa membantu :)

Salam

Erick Kurniawan

http://lecturer.ukdw.ac.id/erick

20 thoughts on “Dynamic Image Pada Crystal Report

  1. 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

  2. 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?

    1. 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?

  3. 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..

  4. 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.

  5. 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??

  6. 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.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s