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

Advertisements

About Erick Kurniawan

IT Trainer, Consultant, & Microsoft Azure MVP Actual Training (http://actual-training.com)
This entry was posted in Crystal Report .NET and tagged , , . Bookmark the permalink.

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 )

Google+ photo

You are commenting using your Google+ 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 )

w

Connecting to %s