عمل تقرير لعرض سجل معين – 2

18 08 2008

في المرة الماضية عندما طرحت التدوينة : عمل تقرير لعرض سجل معين ذكرت طريقة حل تلك المشكلة باستخدام الباراميترات ، البعض قد يستصعبها ، والبعض قد يسأل من منظور تحسين الكفاءة : لماذا نقوم بتحميل البيانات في الذاكرة ( قد تكون بالآلاف ) طول وقت عرض التقرير  بينما نحن نحتاج الى سجل واحد فقط ؟ سؤال جميل جدا بل مهم واعتقد ان من يسال سؤال كهذا هو من المبرمجين الذين يهمهم ان يعمل برنامجهم بأقل ثقل على الذاكرة .


الطريقة الأخرى اسهل اذا اردنا مجرد عرض سجل واحد فقط ، وهي عمل Filter للبيانات في مصدر التقرير قبل ان تصل التقرير، طبعا بمجرد قيامك بإضافة اداة ReportViewer وتحديد تقرير معين موجود في المشروع سيتم اضافة عدة ادوات تلقائيا الى النافذة منها Dataset,TableAdapter,bindingSource ، فعملية الوصول الى مصدر البيانات من خلال الكود سهله جدا .

الفكرة هنا اننا سنقوم بعمل كائن DataView نستخدمه في فلترة البيانات حسب الحقل المميز للمصدر والذي يكون في العادة ID ، بعد ذلك نقوم بحذف كائن الـ ReportDataSource الخاص بالكائن ReportViewer.LocalReport ، ونضيف كائن جديد نعمله بانفسنا .

في حالتي استخدم الجدول Employees من قاعدة البيانات Northwind ولدي Dataset بالإسم EmployeesDataset وفي التقرير مصدر البيانات DataSource اسمه EmployeesDataset_Employees ،وقد اضفت الى النافذة المطلوبة شريط ادوات ToolStrip به أداة Label,TextBox,Button ليقوم المستخدم بإدخال الـ ID ،

بالنسبه للكود ، فقد قمت بحذف السطر التالي من الحدث Load للنافذة :

رمز:

Me.ReportViewer1.RefreshReport()

ثم قمت بإستيراد فضاء الأسماء :

رمز:

Imports Microsoft.Reporting.WinForms

وفي حدث النقر Click للزر المدعو tsbtnshowReport :

‘adding new ReportDataSource objectDim DS AsNew ReportDataSource

‘making new DataViewObject to get the data and filter it

Dim FilteredData AsNew DataView(Me.EmployeesDataSet.Employees)

‘filtering the data by ID

FilteredData.RowFilter = “ID = “ & Me.tstxtID.Text

’setting the name and value properties of the

‘ReportDataSource Object

DS.Name = “EmployeesDataSet_Employees”

DS.Value = FilteredData

‘Removing the current Datasources of the report

ReportViewer1.LocalReport.DataSources.RemoveAt(0)

‘adding the new report DataSource object

ReportViewer1.LocalReport.DataSources.Add(DS)

‘Viewing the data on the ReportViewer

Me.ReportViewer1.RefreshReport()

 


وقد وضعت تعليقات توضح الكود جيدا ، الفكرة في الكود اننا قمنا بعمل Replace لكائن الـ ReportDataSource بآخر جديد تم اعطاؤه سجل واحد فقط One Row Only لذلك سيتم عرض سجل واحد فقط على التقرير

في الرابط التالي المثال كاملا

تحياتي


الإجراءات

معلومات

تعليق واحد

26 10 2009
أسامة عبد السلام المسيدى

الاخ النبهانى

أرجو مساعدتى فى عمل نموذج استطيع من خلاله التحكم فى عدد استيكرات البار كود التى أريد طباعتها فمثلا لو كان لدى على النموذج تكست لكتابة الرقم العشرى المراد تحويله لرقم الباركود ثم ليبل أقوم من خلاله بتحويل الرقم المكتوب بالتكست الى رقم باركود فى الليبل ثم تكست آخر أقوم من خلاله بوضع رقم استيكرات الباركود التى أريد طباعتها وبالضغط على زرار بتون تتم عملية الطباعه من خلال تقرير معمول بالريبورت فيور يظهر لى عدد استيكرات الباركود التى أريد طباعتها و الحقيقه فى المشكله التى أقابلها لاأعرف كيف أتحكم فى التقرير حتى يظهر لى رقم استيكرات الباركود المراد طباعتها فمثلا لو كتبت فى التكست اننى أريد طباعة 70 استيكر من أى رقم يتم ادخاله و استخدمت بارميتر مع التقرير كيف سيتم تكرار نفس الاستيكر 70 مره على ورقة طباعه A4 عاديه وهل أقوم باضافة تكست بوكس واحد الى التقرير و أضع فيه البارميتر الذى أكتبه فى النموذج فالكود الذى أطلبه تحديدا هو تكرار عدد التكست الواحد فى التقرير أى تكرار عدد الصفوف و الاعمده لنفس التكس بوكس حتى أحصل على العدد المراد طباعته وهو 70

أرجو من سيادتكم الرد

أضف تعليق