Report RDLC dapat mencetak langsung ke printer

 on Saturday, March 18, 2017  

Selamat malam,

Kali ini saya ingin berbagi bagaimana cara mencetak langsung report ke printer menggunakan RDLC 

Kenapa RDLC? Kenapa tidak Crystal Report?
contoh report rdlc
Well, rdlc yang merupakan standard report yang dibuat oleh microsoft adalah report yang ringan dan mudah untuk digunakan. report rdlc bisa digunakan oleh applikasi kecil maupun besar dan tidak membutuhkan lisensi untuk menggunakannya.

Beda halnya dengan Crystal Report yang merupakan third party product. Crystal Report, tersedia didalam studio visual, tetapi sebetulnya dia merupakan produk mandiri yang tidak dibuat oleh Microsoft secara langsung, sehingga ketika kita ingin menggunakannya di mesin production membutuhkan lisensi

Apakah RDLC bisa mencetak langsung ke printer sebagaimana Crystal Report? jawabannya bisa. begini caranya :

Langkah 1
Buatlah report dengan menggunakan rdlc katakan nama reportnya adalan Customer.rdlc

Langkah 2
Buatlah Class untuk mencetak langsung report rdlc seperti dibawah ini. Class ini dibuat terpisah agar nantinya dapat digunakan berulang-ulang oleh semua form (reusable class). sehingga tidak perlu membuat class/object pencetak report secara langsung.

using Microsoft.Reporting.WinForms;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Printing;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace LogicLayer.Helper
{
    public class Report : IDisposable
    {
        private int m_currentPageIndex;
        private IList m_streams;
        private Stream CreateStream(string name,
          string fileNameExtension, Encoding encoding,
          string mimeType, bool willSeek)
        {
            Stream stream = new MemoryStream();
            m_streams.Add(stream);
            return stream;
        }
        private void Export(LocalReport report)
        {
            string deviceInfo =
              @"
                EMF
                8.27in
                11in
                0.59055in
                0.49213in
                0.49213in
                0.59055in
            ";
            Warning[] warnings;
            m_streams = new List();
            report.Render("Image", deviceInfo, CreateStream,
               out warnings);
            foreach (Stream stream in m_streams)
                stream.Position = 0;
        }
        private void PrintPage(object sender, PrintPageEventArgs ev)
        {
            Metafile pageImage = new
               Metafile(m_streams[m_currentPageIndex]);
            Rectangle adjustedRect = new Rectangle(
                ev.PageBounds.Left - (int)ev.PageSettings.HardMarginX,
                ev.PageBounds.Top - (int)ev.PageSettings.HardMarginY,
                ev.PageBounds.Width,
                ev.PageBounds.Height);
            ev.Graphics.FillRectangle(Brushes.White, adjustedRect);
            ev.Graphics.DrawImage(pageImage, adjustedRect);
            ev.Graphics.DrawLine(Pens.Black, 80, 100, 320, 100);
            m_currentPageIndex++;
            ev.HasMorePages = (m_currentPageIndex < m_streams.Count);
        }
        private void Print()
        {
            if (m_streams == null || m_streams.Count == 0)
                throw new Exception("Error: no stream to print.");
            PrintDocument printDoc = new PrintDocument();
            if (!printDoc.PrinterSettings.IsValid)
            {
                throw new Exception("Error: cannot find the default printer.");
            }
            else
            {
                printDoc.PrintPage += new PrintPageEventHandler(PrintPage);
                m_currentPageIndex = 0;
                printDoc.Print();
            }
        }
        //    Create a local report for Customer.rdlc, load the data,
        //    export the report to an .emf file, and print it.
        public void Print(string reportPath, string reportName, object dataSource, List Params = null)
        {
            LocalReport report = new LocalReport();
            report.ReportPath = reportPath;
            BindingSource bindingSource = new BindingSource();
            bindingSource.DataSource = dataSource;
            ReportDataSource rptSource = new ReportDataSource(reportName, bindingSource);
            if (Params != null)
                report.SetParameters(Params);
            report.DataSources.Add(rptSource);

            Export(report);
            Print();
        }
        public void Dispose()
        {
            if (m_streams != null)
            {
                foreach (Stream stream in m_streams)
                    stream.Close();
                m_streams = null;
            }
        }
    }
}


Langkah 3
Setelah membuat object/class diatas. kita tinggal memanggil print function seperti dibawah ini. datasourse yang digunakan bukanlah Dataset melainkan object list.

        public void Print()
        {
            string reportPath = Directory.GetCurrentDirectory() + "\\Report\\Catalog.rdlc";            
            LogicLayer.Helper.Report rpt = new LogicLayer.Helper.Report();
            var list = CatalogItem.GetAll();
            rpt.Print(reportPath, "Catalog", list);
        }

Adapun kalo ingin menggunakan dataset kita tinggal mengganti object list tersebut dengan dataset. dan jalan lupa pula, ketika diganti dari object list ke dataset setting di report rdlc nya juga dirubah. berikut contoh jika menggunakan dataset
        public void Print()
        {
            string reportPath = Directory.GetCurrentDirectory() + "\\Report\\Catalog.rdlc";            
            LogicLayer.Helper.Report rpt = new LogicLayer.Helper.Report();
            Dataset ds = CatalogItem.GetDataset();
            rpt.Print(reportPath, "Catalog", ds);
        }

Coding diatas sudah ditest menggunakan applikasi desktop C# dan sudah diimplementasikan kedalam applikasi point of sales.

Selamat mencoba..!!!
Report RDLC dapat mencetak langsung ke printer 4.5 5 .NET-1235 Saturday, March 18, 2017 Kenapa RDLC? Kenapa tidak Crystal Report? Well, rdlc yang merupakan standard report yang dibuat oleh microsoft adalah report yang ringan dan mudah untuk digunakan. report rdlc bisa digunakan oleh applikasi kecil maupun besar dan tidak membutuhkan lisensi untuk menggunakannya. Selamat malam, Kali ini saya ingin berbagi bagaimana cara mencetak langsung report ke printer menggunakan RDLC  Kenapa RDLC? Kenapa tida...


No comments:

Post a Comment

Copyright © .Net-1235. All Rights Reserved.