الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مثال عملي على Linq To Dataset مع استخدام Lambda Expressions

بدأه محمد سامر أبو سلو في 6 مايو 2008 · 7 رد · 4,491 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

الهدف من المثال

1. حفظ بيانات DataSet في ملف xml واستعادتها منه والتعامل معها بدون الحاجة لوجود قاعدة بيانات

2. الاستعلام من الـ DataSet باستخدام Linq ومن أكثر من جدول وإدخال بعض الحسابات في جملة الاستعلام واستخدام عبارة Join لمنع التكرار الخاطئ للبيانات

3. استخدام Lambda Expressions للقيام بالحسابات من أجلنا والاستفادة من ميزة رفع المتغيرات

4. إظهار نتيجة استعلام Linq في DataGridView مباشرة

من أجل ترك الموضوع عام وبما أن مجموعة البيانات DataSet يمكن ربطها مع أي قاعدة بيانات سأقوم بالعمل على مجموعة بيانات غير مربوطة مع قاعدة بيانات حيث يمكنك تطبيق الأفكار الواردة هنا على أي قاعدة بيانات يمكن ربطها مع أي DataSet وسيكون مثالي الذي سنسير عليه هنا معتمد على خدمة مصرفية تدعى بالودائع لأجل

افتح أي إصدار من فيجول ستوديو 2008 وأنشئ مشروعا جديدا من نوع Windows Forms Application ثم من قائمة Project اختر الأمر Add New Item وأضف DataSet للمشروع وقم بتسميتها MyDataSet

في محرر التصميم الرسومي لمجموعة البيانات انقر بزر الفأرة اليميني واختر الأمر DataTable من قائمة Add في قائمة السياق ثم قم بإعادة تسميته ليصبح اسمه Customers

أضف للجدول Customers الحقول التالية مع الخصائص الموضحة

الحقل ID الخاصية AutoIncrement بالقيمة True والخاصيتان AutoIncrementSeed و AutoIncrementStep كلتاهما إلى القيمة 1 و نوع البيانات System.Int32 ثم انقر بزر الفأرة اليميني على الحقل ID واختر الأمر Set Primary Key من قائمة السياق لتحديد الحقل كمفتاح أساسي

الحقل CustomerName نوع البيانات System.String و MaxLength بالقيمة 25

الحقل CurrentAccountNumber نوع البيانات System.String و MaxLength 25

حيث أن الحقل ID هو معرف الزبون و CustomerName هو اسم الزبون والحقل CurrentAccountNumber هو رقم الحساب الجاري لدى المصرف

أضف جدول آخر لمجموعة البيانات باسم Wadaeaa وأضف له الحقول التالية

الحقل WadeaaNumber بنوع بيانات String

الحقل CustomerID بنوع بيانات Int32

الحقل InterestRate بنوع بيانات Decimal و NullValue مساوية لـ 7.5

الحقل WadeeaPeriod بنوع بيانات Int16 و BullValue مساوية لـ 3

الحقل StartDate بنوع بيانات DateTime

الحقل WadeaaAmount بنوع بيانات Int32 و NullValue بقيمة 10000

حيث WadeaaNumber هو رقم الوديعة و CustomerID هو حقل مرتبط بجدول الزبائن و InterestRate نسبة الفائدة و WadeeaPeriod فترة الوديعة بالأشهر و StartDate تاريخ فتح الوديعة و WadeaaAmount قيمة الوديعة

سنضيف الآن علاقة بين الجدولين: انقر بزر الفأرة اليمني على الجدول Customers ومن القائمة الفرعية Add اختر Relation ثم اضبط Parent Table إلى Customers و Child Table إلى Wadaeaa ثم اختر Key Columns ليضم الحقل ID فقط و Foreign Key Columns ليضم الحقل CustomerID فقط ثم اختر الخيار Both Relations And Foreign Key Constraint ثم اضغط Ok من أجل حفظ العلاقة ثم اختر الأمر Save All من القائمة File

انتقل إلى محرر النماذج الخاص بـ Form1 واجعل مساحة Form1 كبيرة كفاية لتتسع لـ 2 × DataGridView مع شريط أدوات وبعض التحكمات الأخرى التي سنضيفها لاحقا ثم انتقل لنافذة Data Sources واسحب الجدول Customers ثم ألقه على سطح Form1 فيتم إضافة DataGridView و شريط أدوات للنافذة

من نافذة Data Sources انقر إشارة + بجانب الجدول Customers لتظهر لك قائمة بالحقول الخاصة به كما نلاحظ وجود نسخة من الجدول Wadaeaa كجدول فرعي ضمن Customers وذلك بسبب العلاقة التي قمنا بإنشائها بين الجدولين الآن قم بسحب الجدول Wadaeaa الموجود كجدول فرعي لـ Customers وليس الجدول الخارجي إلى سطح Form1 ليتم إنشاء DataGridView أخرى على النافذة ثم قم بتنسيق النافذة بشكل جيد وتأكد من أن الـ DataGridView الخاصة بـ Customers في الأعلى و الأخرى في الأسفل

اختر CustomersDataGridView وانقر على السهم الصغير الذي يظهر في زاويتها اليمينية العليا واختر الأمر Edit Columns واضبط الخاصية Visible للحقل ID إلى False ثم كرر العملية بالنسبة للحقل CustomerID في WadaeaaDataGridView

في شريط الأدوات في الأعلى انقر بزر الفأرة اليميني على زر الحفظ – يمتلك أيقونة قرص – واختر الأمر Enabled لتفعيله ثم انقر عليه نقرا مزدوجا لننتقل إلى محرر الكود ثم أدخل الكود التالي في حدث النقر على زر الحفظ حيث نستخدم الوظيفة WriteXml لتخزين محتويا مجموعة البيانات في ملف xml

		Try
			MyDataSet.WriteXml("d:\TestData.xml")
		Catch ex As Exception
			MsgBox(ex.Message)
		End Try

أنشئ إجراء لمعالجة الحدث Load للنموذج وأدخل فيه الكود التالي الذي سيقوم بتحميل البيانات من ملف xml لاحظ ظهور رسالة خطأ عند تشغيل البرنامج لأول مرة وقبل حفظ البيانات حيث أن ملف البيانات لم يتم إنشاؤه بعد وهذا السبب في استخدام بلوك Try … Catch من أجل اصطياد الخطأ وتجنب إفشال عملية بدء البرنامج وقد استخدمنا الوظيفة ReadXml لتحميل البيانات من ملف xml إلى مجموعة البيانات

		Try
			MyDataSet.Clear()
			MyDataSet.ReadXml("d:\TestData.xml")
		Catch ex As Exception
			MsgBox(ex.Message)
		End Try

شغل البرنامج وأدخل فيه بعض البيانات في كلا الـ DataGridView وتأكد من أنك قد قمت بتعبئة جميع الحقول في كلتا شبكتي البيانات وقم بالحفظ وأغلق البرنامج ثم أعد فتحه من جديد للتأكد من أن عملية الحفظ قد تمت بشكل صحيح وانتبه إلى أن الحقل WadeeaPeriod هو عبارة عن عدد أشهر فترة الوديعة لذا حاول الالتزام بالقيم 1 أو 3 أو 6 أو 12 كقيمة لهذا الحقل من أجل تجربة إجرائية الاحتساب لاحقا

نريد الآن إظهار قيم الاحتسابات الخاصة بكل وديعة عند المرور عليها وكذلك تاريخ استحقاق هذه الوديعة

أضف أربعة حقول نصية للنافذة ورتبها أسفل شبكتي البيانات وأعطها الأسماء التالية txtEndDate لتاريخ الاستحقاق و txtInterest لقيمة الفائدة و txtRayaa لضريبة الريع و txtIdara لضريبة الإدارة المحلية

أضف الاستيراد التالي في بداية ملف الكود الخاص بـ Form1 من أجل تمكيننا من استخدام الوظائف الموجودة في مجل الأسماء Math

Imports ma = System.Math

ثم أضف الإجراء التالي كإجرائية للاحتساب وهنا أرجو أن تكون قد تابعت دروسي المتعلقة بـ Lambda Expressions لأنها الأساس في إجرائية الاحتساب

Private Sub DisplayWaeaaCalcs(ByVal Amount As Integer, ByVal StartDate As Date, _
	   ByVal EndDate As Date, ByVal Interest As Decimal)

		Dim DaysNum = DateDiff(DateInterval.Day, StartDate, EndDate)
		Dim Rayaa As Decimal

		Dim Rayya_Calc = Function(Intrst As Decimal) ma.Ceiling(Intrst * 7.5 / 100)
		Dim Idara_Calc = Function() ma.Ceiling(Rayaa * 10 / 100)
		Dim Intrst_Calc = Function() _
							 ma.Ceiling(Amount * DaysNum * Interest / 36500)

		Dim Intr = Intrst_Calc()
		Rayaa = Rayya_Calc(Intr)
		Dim Ida = Idara_Calc()

		Me.txtEndDate.Text = EndDate.ToString("dd/MM/yyyy")
		Me.txtInterest.Text = Intr.ToString("#,###.00")
		Me.txtRayaa.Text = Rayaa.ToString("#,###.00")
		Me.txtIdara.Text = Ida.ToString("#,###.00")
	End Sub

حيث استخدمنا في البداية الدالة DateDiff للحصول على عدد أيام الفترة التي سنقوم بالاحتساب عنها وكنا قد مررنا قيم المبلغ و تاريخ البداية وتاريخ النهاية ونسبة الفائدة كمحددات لإجرائية الاحتساب ثم عرفنا تعبير لمدا يقوم باحتساب قيمة ضريبة الريع Rayya_Calc بناء على مبلغ الفائدة الممررة له وفي تعبير لمدا والضريبة الأخرى لم نمرر لها قيمة ولكنها استخدمت متغير محلي من أجل الاحتساب وهنا أنصحك بمراجعة قسم رفع المتغيرات في مواضيعي المتعلقة بتعابير لمدا إن لم تكن قد قرأته حتى الآن وتعبير لمدا الأخير Intrst_Calc يستخدم أيضا خاصية رفع المتغيرات ولكنه هنا يستخدم المحددات الممررة للإجراء كمتغيرات مرفوعة ثم نقوم باستخدام هذه التعابير للاحتساب ثم نظهر القيم في صناديق النصوص المناسبة

من أجل أن نقوم باحتساب القيم الموافقة لكل وديعة عند المرور عليها سنقوم بعمل إجراء معالجة للحدث CellEnter لكلا شبكتي البيانات بإجراء واحد – أدخل الكود التالي كإجراء لمعالجة الحدث CellEnter لكلا الشبكتين لاحظ ما بعد عبارة Handles في بداية تعريف جسم الإجراء وأيضا أنني لم أقم بتمرير أية بارامترات لإجراء معالجة الحدث حيث يمكنني فعل ذلك بما أنني متأكد من أنني لن أحتاج لاستخدامها

Private Sub WadaeaaDataGridView_CellEnter() _
						Handles WadaeaaDataGridView.CellEnter, CustomersDataGridView.CellEnter

		Try
			Dim EdDat = From a In MyDataSet.Wadaeaa _
				Where a.CustomerID = Me.CustomersDataGridView.CurrentRow.Cells(0).Value _
				And a.WadeaaNumber = Me.WadaeaaDataGridView.CurrentRow.Cells(0).Value _
				Select a.WadeaaNumber, a.WadeaaAmount, a.StartDate, _
				EndDate = DateAdd(DateInterval.Month, a.WadeeaPeriod, a.StartDate), _
				a.InterestRate

			If EdDat.Count > 0 Then
				DisplayWaeaaCalcs(EdDat.First.WadeaaAmount, EdDat.First.StartDate, _
								  EdDat.First.EndDate, EdDat.First.InterestRate)
			End If
		Catch ex As Exception
			Me.txtEndDate.Text = String.Empty
			Me.txtInterest.Text = String.Empty
			Me.txtRayaa.Text = String.Empty
			Me.txtIdara.Text = String.Empty
		End Try
	End Sub

في البداية قمنا بإنشاء استعلام Linq للحصول على القيم الخاصة بالوديعة التي نقف عليها حيث أن المتغير a مرتبط بالجدول Wadaeaa ثم في قسم Where ضبطنا الشرط بحيث يجلب الاستعلام فقط الودائع الخاصة بزبون معين عن طريق التأكد من أن قيمة الحقل CustomerID مساوية لقيمة ID الخاصة بالزبون من خلال قراءة قيمة الخلية المناسبة في السطر الحالي وتتمة للشرط وبنفس الطريقة قمنا بضبط الشرط كي يجلب الوديعة ذات الرقم المراد ثم يأتي قسم Select لنحدد فيه قائمة الحقول التي نريد الحصول عليها لاحظ وجود الحقل المحسوب EndDate الذي يتم حساب قيمته من الحقول المعادة من الاستعلام باستخدام الوظيفة DateAdd التي تضيف فترة زمنية معينة حسب المحددات الممررة لها إلى تاريخ ممرر لها وتعيد قيمة التاريخ الجديد وتعاد قيمته مع قائمة الحقول التي يعيدها الاستعلام وبعد الاستعلام نتأكد من أنه قد جلب نتائج فعلا بالتحقق من قيمة الخاصية Count ثم نستدعي الوظيفة DisplayWaeaaCalcs للقيام بالحسابات وإظهار النتائج

شغل البرنامج ولاحظ ظهور قيم الاحتسابات في مربعات النصوص عند التنقل في كلا شبكتي البيانات إذا كانت لديك بيانات قمت بحفظها كما طلبت منك سابقا

من أجل إظهار الودائع التي تبدأ بتاريخ معين وإظهارها أضف نموذج آخر للمشروع باسم Form2 ثم أضف DataGridView له واضبط الخاصية Dock للقيمة Fill لجعل شبكة البيانات تملأ كامل مساحة النموذج ثم نسق النموذج بحيث يكون كبيرا كفاية لعرض البيانات الناتجة عن الاستعلام

أضف زرا للنموذج From1 واجعل إجراء معالجة حدث النقر عليه يماثل الكود التالي

	Private Sub Button1_Click() Handles Button1.Click
		Dim d As Date = CDate(InputBox("Enter Date"))
		Dim Dawa = From a In MyDataSet.Wadaeaa _
				  Join B In MyDataSet.Customers On _
				  a.CustomerID Equals B.ID _
				  Where a.StartDate = d _
				  Select B.CustomerName, B.CurrentAccountNumber, _
				  a.WadeaaNumber, a.WadeaaAmount, a.WadeeaPeriod, a.StartDate, _
				  EndDate = DateAdd(DateInterval.Month, a.WadeeaPeriod, a.StartDate)

		Dim c As New Form2
		c.DataGridView1.DataSource = Dawa.ToList
		c.DataGridView1.Update()
		c.ShowDialog()
	End Sub

لاحظ أنني استخدمت ميزة في فيجول ستوديو تمكنني من حذف محددات إجراء معالجة حدث ما إن كنت على يقين أنني لن أحتاج لاستخدامها

في جملة الاستعلام تلاحظ أنني استخدمت Join للربط بين الجداول عند عملية الاستعلام كي نتجنب مشكلة ظهور بيانات مكررة من أحد الجداول من أجل جميع سطور الجدول الآخر حيث استخدمنا نفس أسلوب العلاقة التي قمنا بإنشائها في البداية بين الجدولين من حيث ربط الحقل CustomerID في الجدول Wadaeaa بالحقل ID في الجدول Customer و استخدمنا في قسم Where شرط لتصفية نتائج الاستعلام بحيث نحصل على الودائع التي تبدأ بتاريخ معين ثم نستخدم عبارة Select لتحديد الحقول التي نريد إظهارها كنتائج الاستعلام

ومن أجل إظهار النتائج في Form2 قمنا بإنشاء متغير من نوع تلك النافذة ثم ضبطنا قيمة DataSource لشبكة البيانات الموجودة على ذلك النموذج إلى النتيجة المعادة من الاستعلام مستخدمين الطريقة ToList لتحويل النتائج إلى شكل يمكن إظهاره في شبكة البيانات

ومن أجل الحصول على الودائع التي تنتهي بتاريخ معين يمكننا استخدام نفس الكود السابق بعد تعديل بسيط في قسم Where بحيث يصبح الكود كما يلي

	Private Sub Button2_Click() Handles Button2.Click
		Dim d As Date = CDate(InputBox("Enter Date"))
		Dim Dawa = From a In MyDataSet.Wadaeaa _
				  Join B In MyDataSet.Customers On _
				  a.CustomerID Equals B.ID _
				  Where DateAdd(DateInterval.Month, a.WadeeaPeriod, a.StartDate) = d _
				  Select B.CustomerName, B.CurrentAccountNumber, a.WadeaaNumber, _
				  a.WadeaaAmount, a.WadeeaPeriod, a.StartDate, _
				  EndDate = DateAdd(DateInterval.Month, a.WadeeaPeriod, a.StartDate)

		Dim c As New Form2
		c.DataGridView1.DataSource = Dawa.ToList
		c.DataGridView1.Update()
		c.ShowDialog()

	End Sub

لاحظ الاختلاف في قسم Where بين الإجراءين الأخيرين. هل يمكنك شرح عمل الإجراء الثاني بنفسك ؟؟؟؟

تم بعون الله

مرفق الكود الكامل للموضوع هنا الذي أرجو أن لاتقوم بتحميله وفتحه قبل أن تحاول القيام بإنشائه بنفسك

LinqToDataSetExample.zip

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#2

السلام عليكم ورحمة الله

بصراحة شيئ فعلا ممتع ومن خلال الشرح شعرت أنك تدرس في معهد ..

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

فلسطين الزاهية بألوان الحب والسلام

ذلك الطعم الزيتوني الذي يتدفق عسلاً من أفواه بساتينها وحدائقها

تشتاق إليها نفوس المتقين وترنوا للسجود فيها جباه المسلمين

#3

ما شاء الله مثال رائع جدا وبرجاء نشر المزيد من هذه الامثلة الرائعة ، تقبل خالص تحياتى

#4
seahmad كتب:
السلام عليكم ورحمة الله

بصراحة شيئ فعلا ممتع ومن خلال الشرح شعرت أنك تدرس في معهد ..

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

أرجو أن تكون قد حققت الفائدة الكاملة من الدرس وأن تستطيع مستقبلا الاستفادة من المعلومات الواردة هنا

evilgrin كتب:
ما شاء الله مثال رائع جدا وبرجاء نشر المزيد من هذه الامثلة الرائعة ، تقبل خالص تحياتى

إن شاء الله

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#5

درس دسم للغاية

جزيت الفردوس الأعلى

1

فاعلم أنه لا إله إلا الله

#6

شكرا للجميع المرور والردود

يرجد تطوير كبير للمشروع يمكنكم الاستفادة منه في المرفقات في جوابي في الموضوع

اضافة كمبوبوكس الى داتاغريد

تم تعديل هذه المشاركة بواسطة محمد سامر أبو سلو في 13 يناير 2009 في 12:22

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#7

:wub: الموضوع مكرر يا أخي حتى الحقول هي هي وهاهو الرابط

http://vb4arab.com/vb/showthread.php?t=13315

−1
#8

تمام هذا معرفي في منتدى فيجول بايزك للعرب

موضوعي ملكي أنا حر أضعه في أي عدد من المنتديات أشاء

وستجد نسخة من معظم مواضيعي في المنتدى المذكور

قبل أن تشير لتكرار الموضوع تأكد من هو صاحب الموضوع أولا

تم تعديل هذه المشاركة بواسطة محمد سامر أبو سلو في 23 أكتوبر 2009 في 01:00

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

مواضيع مشابهة