المتابعون للمدونة

السبت، 9 نوفمبر 2013

طباعة التقرير 2


طباعة التقرير 2

 

في الموضوع السابق وضعت لكم كود الفئة ReportPrinter، التي تستخدم لطباعة التقرير مباشرة بدون عرضه أولا في الأداة ReportViewer.

نريد الآن أن نرى كيف يمكننا استخدام هذه الفئة.

كما سبق أن ذكرت، فإن استخدام هذه الفئة سهل للغاية، حيث يمكن أن نطبع التقرير بسطر واحد:

ReportPrinter.Print(Report)

لكن ما يحتاج لبعض الإيضاح، هو كيفية الحصول على كائن التقرير Report الذي سنقوم بطباعته.

مبدئيا، يجب أن تكون قد أنشأت تقريرا في المشروع.. سنفترض أن هذا التقرير اسمه Report1.rdlc وأن المشروع اسمه Project1.. هذا التقرير يتم دمجه في موارد الملف التنفيذ للمشروع Resources، لهذا يمكن الإشارة إلى المورد الخاص به بالاسم Project1.Report1.rdlc.. هذا الاسم سنرسله إلى الخاصية ReportEmbeddedResource الخاصة بكائن التقرير المحلي LocalReport.. كالتالي:

Dim Report As New LocalReport

Report.ReportEmbeddedResource = "Project1.Report1.rdlc"

نحتاج أيضا إلى إمداد التقرير بمصدر ربط البيانات BindingSource الذي سيستخدمه لعرض البيانات.. سنفترض أن التقرير يستخدم في تصميمه مجموعة بيانات اسمها DataSet1.. وأننا نستخدم في المشروع مصدر ربط بيانات اسمه BindingSource1 وضعنا فيه بالفعل البيانات التي نريد طباعتها.. هكذا يتم ربط التقرير بمصدر ربط البيانات:

Dim ReportDs As New ReportDataSource

ReportDs.Name = "DataSet1"

ReportDs.Value = BindingSource1

Report.DataSources.Add(ReportDs)

الآن صار التقرير جاهزا للطباعة:

ReportPrinter.Print(Report)

 

وحتى تريح نفسك من تكرار هذا الكود، يمكنك أن تضيف هذه الدالة إلى الفئة ReportPrinter:

    Public Shared Sub Print(ReportEmbeddedResource As String, DataSetName As String, BindingSource As BindingSource)

        Dim Report As New LocalReport

        Report.ReportEmbeddedResource = ReportEmbeddedResource

        Dim ReportDs As New ReportDataSource(DataSetName, BindingSource)

        Report.DataSources.Add(ReportDs)

        ReportPrinter.Print(Report)

    End Sub

الآن يمكنك طباعة التقرير بسطر واحد من الكود كالتالي:

ReportPrinter.Print("Project1.Report1.rdlc", "DataSet1", BindingSource1)

 

ملاحظات:

1- الدالة الأخيرة التي أضفناها إلى الفئة ReportPrinter تستخدم مورد من موارد المشروع.. لهذا يجب أن تكون الفئة ReportPrinter موجودة داخل نفس المشروع.. أما إذا وضعت هذه الفئة في مشروع (مثل مكتبة ربط dll)، فلن تعمل الدالة Print في صيغتها الأخيرة لأنها لن تستطيع الوصول إلى موارد مشروع آخر، وفي هذه الحالة عليك تهيئة التقرير وإرساله إلى الصيغة الأخرى من الدالة Print التي تستقبل معاملا من النوع LocalReport.

2- هذه الطريقة للطباعة المباشرة تستخدم الطابعة الافتراضية المعرّفة على جهاز المستخدم، وتستخدم إعدادات الطباعة الافتراضية وخصائص الورق المعرّفة في التقرير نفسه.. لهذا تأكد من ضبط هذه الخصائص في التقرير.

3- الطباعة المباشرة لا تغني عن منح المستخدم إمكانية معاينة التقرير قبل طباعته، لهذا يجب أن تضع زرا للمعاينة يعرض التقرير في الأداة ReportViewer، فهي تتيح للمستخدم أيضا التحكم في إعدادات الطباعة، كما أن الطباعة من خلالها تتيح للمستخدم اختيار الطابعة التي يريدها.

 

هناك 6 تعليقات:

  1. السلام عليكلم
    لقد اتبعت خطواتك خطوة خطوة ، لكن لم تعمل الطباعة ، هل بالامكان انزال source code كامل او مشروع صغير يعمل ب ReportPrinter

    ردحذف
    الردود
    1. وعليكم السلام.. يجب أن تتعلم إنشاء التقارير أولا بالأداة report Viewer.. هناك قديوهات مفيدة على يوتيوب بالعربية.. ابح في جوجل عن شرح report viewer:
      https://www.google.com.eg/#q=%D8%B4%D8%B1%D8%AD+report+viewer

      حذف
    2. السلام عليكم و شكرا على الرد ، انا اقوم بانشاء التقارير بالاداة Report Viewer ولكن الطياعة مباشرة لم اتوصل لحل لها ، هل يمكنك ان تنزل الكود كمشروع صغير في المدونة، لاني حاولت طريقتك ولم تنجح معي.

      حذف
    3. ربما تكون المشكلة من اختلاف إصدار أداة التقارير.. حاول تتبع المشكلة بنفسك لأني مشغول في أمور مختلفة حاليا ولا أستطيع العودة إلى هذا الأمر.
      تحياتي

      حذف
  2. في مشكلة صغيرة بالطباعة انه بيطلع error في السطر Dim pageToPrint As Stream = m_pages(m_currentPage)

    هذا الكود الي موجود بالزر تبع الطباعة
    Dim DT As New DataTable
    DT.Columns.Add("product_name", GetType(String))
    DT.Columns.Add("product_price", GetType(Double))
    DT.Columns.Add("quantity", GetType(Integer))
    DT.Columns.Add("total_price", GetType(Double))
    DT.Columns.Add("recipt_total", GetType(Double))
    DT.Columns.Add("recipt_id", GetType(Integer))
    DT.Columns.Add("recipt_date", GetType(Date))
    For BillData = 0 To MatView.Rows.Count - 1
    Me.Product_moveTableAdapter.AddMove(MatView.Rows(BillData).Cells(0).Value, MatView.Rows(BillData).Cells(1).Value, Double.Parse(MatView.Rows(BillData).Cells(2).Value), Integer.Parse(MatView.Rows(BillData).Cells(3).Value), Double.Parse(MatView.Rows(BillData).Cells(4).Value), FormatDateTime(DateToday.Text, DateFormat.ShortDate), Integer.Parse(ReciptNo.Text))
    DT.Rows.Add(MatView.Rows(BillData).Cells(1).Value, Double.Parse(MatView.Rows(BillData).Cells(2).Value), Integer.Parse(MatView.Rows(BillData).Cells(3).Value), Double.Parse(MatView.Rows(BillData).Cells(4).Value), Double.Parse(TotPrice.Text), Integer.Parse(ReciptNo.Text), FormatDateTime(DateToday.Text, DateFormat.ShortDate))
    Next
    Me.BillsTableAdapter.AddRec(FormatDateTime(Date.Now(), DateFormat.ShortDate), Double.Parse(TotPrice.Text))
    Dim Report As New LocalReport
    Report.ReportEmbeddedResource = "POS.Report1.rdlc"
    Dim ReportDs As New ReportDataSource
    ReportDs.Name = "DataSet1"
    ReportDs.Value = DT
    Report.DataSources.Add(ReportDs)
    ReportPrinter.Print(Report)

    ردحذف
    الردود
    1. حاول استخدام إصدار Repoert viewer 2012 وجرب حتى أن تعدل إعدادات لمشروع للعمل على نسخة أقدم من إطار العمل Framework (مثل 4.5 أو 4)، فربما حدثت اختلافات في الإصدارات الأحدث هي سبب المشكلة.
      تحياتي

      حذف

ملحوظة: يمكن لأعضاء المدونة فقط إرسال تعليق.

صفحة الشاعر