طباعة
التقرير 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، فهي
تتيح للمستخدم أيضا التحكم في إعدادات الطباعة، كما أن الطباعة من خلالها تتيح
للمستخدم اختيار الطابعة التي يريدها.
السلام عليكلم
ردحذفلقد اتبعت خطواتك خطوة خطوة ، لكن لم تعمل الطباعة ، هل بالامكان انزال source code كامل او مشروع صغير يعمل ب ReportPrinter
وعليكم السلام.. يجب أن تتعلم إنشاء التقارير أولا بالأداة report Viewer.. هناك قديوهات مفيدة على يوتيوب بالعربية.. ابح في جوجل عن شرح report viewer:
حذفhttps://www.google.com.eg/#q=%D8%B4%D8%B1%D8%AD+report+viewer
السلام عليكم و شكرا على الرد ، انا اقوم بانشاء التقارير بالاداة Report Viewer ولكن الطياعة مباشرة لم اتوصل لحل لها ، هل يمكنك ان تنزل الكود كمشروع صغير في المدونة، لاني حاولت طريقتك ولم تنجح معي.
حذفربما تكون المشكلة من اختلاف إصدار أداة التقارير.. حاول تتبع المشكلة بنفسك لأني مشغول في أمور مختلفة حاليا ولا أستطيع العودة إلى هذا الأمر.
حذفتحياتي
في مشكلة صغيرة بالطباعة انه بيطلع 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)
حاول استخدام إصدار Repoert viewer 2012 وجرب حتى أن تعدل إعدادات لمشروع للعمل على نسخة أقدم من إطار العمل Framework (مثل 4.5 أو 4)، فربما حدثت اختلافات في الإصدارات الأحدث هي سبب المشكلة.
حذفتحياتي