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

كيفية حفظ بيانات جدول وتعديل حقل جدول تاني في نفس الوقت

مغلق
بدأه ميدو صلاح في 24 مايو 2007 · 11 رد · 1,538 مشاهدة · في ADO.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم جميعا ، أنا سويت مشروع عن الأسهم وقمت بعمل الاتصال بقاعدة البيانات وحفظ عمليات الشراء والبيع - وربطت الجداول بعضها عن طريق حقل رقم اسم الشخص ، والحمد لله شغال تمام بس في مشكلة وهي كالتالي :

أريد في كود حفظ عملية الشراء الحالية التي قام بها المستخدم في جدول ( sell ) أن يقوم البرنامج بعمل تعديل في حقل الرصيد الحالي ( في جدول users) حتى يحتفظ بالرصيد الحالي لكل مستخدم بعد كل عملية والكود الذي استخدمته هو كالتالي برجاء التعديل ضروري جدا مشروعي واقف على هذه النقطة والكود هو

	Private Sub processfrm_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
		Con.ConnectionString = "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source =  " & Application.StartupPath & "\mydata.mdb"
		Con.Open()
		StrSQLu = "SELECT userno, crrent FROM users where userno like '%" & Label3.Text & "%'"
		Dau = New OleDb.OleDbDataAdapter(StrSQLu, Con)
		Dau.Fill(Ds, "users") '[تعبئة منظم البيانات]
		Con.Close() '[يمكن إغلاق الإتصال بعد تعبئة مجموعة البيانات]
		StrSQLb = "SELECT * FROM buy where user_no like '%" & Label3.Text & "%'"
		Dab = New OleDb.OleDbDataAdapter(StrSQLb, Con)
		Dab.Fill(Ds, "buy") '[تعبئة منظم البيانات]
		Con.Close() '[يمكن إغلاق الإتصال بعد تعبئة مجموعة البيانات]
		StrSQLs = "SELECT * FROM sell where user_no like '%" & Label3.Text & "%'"
		Das = New OleDb.OleDbDataAdapter(StrSQLs, Con)
		Das.Fill(Ds, "sell") '[تعبئة منظم البيانات]
		Con.Close() '[يمكن إغلاق الإتصال بعد تعبئة مجموعة البيانات]
		MaxRows = Ds.Tables("sell").Rows.Count
 end sub

ثم قمت بكتابة الكود الخاص بعملية الحفظ والتعديل معا والمراد إجراء التعديل عليه وهو

	Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
		Dim CmdB As New OleDb.OleDbCommandBuilder(Das)
		Dim dsNewRow As DataRow '[كائن للإضافة سطر جديد لمجموعة البيانات]
		dsNewRow = Ds.Tables("sell").NewRow()
		dsNewRow.Item("sell_date") = DateTimePicker1.Value
		dsNewRow.Item("sell_sahm") = ComboBox2.Text
		dsNewRow.Item("sell_csahm") = TextBox2.Text
		dsNewRow.Item("sell_ssahm") = TextBox3.Text
		dsNewRow.Item("sell_msahm") = TextBox4.Text
		'   dsNewRow.Item("user_no") = Label3.Text
		Ds.Tables("sell").Rows.Add(dsNewRow) '[الإضافه من مجموعة البيانات إلى قاعدة البيانات]
		Das.Update(Ds, "sell")
		MessageBox.Show("تمت عملية الحفظ في قاعدة البيانات بنجاح", "برنامج أسهي")
		Dim Cmdu As New OleDb.OleDbCommandBuilder(Dau) '[المتغير لإحداث تعديل في قاعدة البيانات نفسها وليس مجموعة البينانات]
		'   Ds.Tables("users").Rows(RowNum).Item("userno") = Label10.Text
		Ds.Tables("users").Rows(RowNum).Item("crrent") = Label8.Text
		Dau.Update(Ds, "users")
		MsgBox("تم تعديل الرصيد الحالي في قاعدة البيانات بنجاح")
	End Sub

برجاء من لدية علم بهذا الأمر إفادتي سريعا لأني متوقف على هذا الزر فقط وشكرا

#2

السلام عليكم

لا ينبغي عليك استخدام العنصر Con لفتح و اغلاق الاتصال , الـ DataAdapter يقوم بذلك بنفسه فلا حاجة لهذا الكود..

ثانياً على اي نسخة تطور 2003 أو 2005 ؟

ثالثاً : استرسل في الشرح من فضلك , الان اي الاكواد التي عرض لا يعطي النتائج المطلوبة؟

إذا كان الجدول Sell هو عبارة عن جدول ابن لأب ما , فلن يغنيك OleDbCommandBuilder

لانه لا يستطيع جلب المفتاح الاساسي لجدول الاب للإبن وهو sell .

عملية ادراج الجدول في النموذج تغنيك عن هذه المتاهات كلها, فلا تقلل من شأنها.

بالتوفيق إن شاء الله.

في المثال يتضح المقال

#3

أخي الكريم أشكرك على سرعة ردك ، ولتوضيح الأمر فأنا استخدم vb.net 2005 وفي هذا النموذج الموضح الكود بعالية قمت بفتح الجدول المسمى sell والخاص بعملية الشراء وكذلك الجدول المسمى users والخاص ببيانات المستخدمين وربطت الجدولين عن طريق الحقل userno تبع جدول users وكذلك الحقل user_no الموجود في جدول sell وعند فتح الفورم قمت باستدعاء جميع بيانات جدول sell الخاص بهذا المستخدم عن طريق sql وفعلا شغال تمام ، أما في الكود الموضح يقوم البرنامج بعملية إضافة البيانات في جدول sell الشراء بنجاح والمشكلة تكمن في أني أريد أن يقوم البرنامج بأخذ قيمة من تكست بوكس قد أعددتها بحيث عند ادخال مبلغ الشراء يأخذ المبلغ ويطرح منه الرصيد الموجود في جدول users حتى يعرض الرصيد الحالي بعد إجراء العملية الحسابية ، وكل ما احتاجه هو كيفية أخذ المبلغ الموجود في التكست الجديد وإجراء عملية التعديل على حقل الرصيد الحالي crrent الموجود في جدول users والمشكلة هي كيفية التعديل في حقل الرصيد الحالي crrent بجدول users في نفس كود زر أمر إضافة البيانات في جدول sell . أرجو أن يكون التوضيح مكتمل وإذا في أي ملاحظة برجاء ارسالها وشاكر لجميع الأخوان المتعاونين معي

تم تعديل هذه المشاركة بواسطة ميدو صلاح في 24 مايو 2007 في 19:18

#4

أخواني هل هذا الأمر مستحيل من خلال البرمجة أم أنا استخدم أكواد خاطئة ، يا ريت حد يخبرني علشان أنا مش عارف أحل المشكلة دي أبدا ، لو سمحتوا اللي عنده أي خبرة بهذا المجال افادتي والله محتاجه ضروري جدا جدا جدا

#5

هذا مثال يوضح كيفية البحث في الـ DataSet و بالتحديد في الجدول users

ثم نبحث عن العامود userno لنتحقق من المفتاح الاساسي الذي نرسله عندما نريد ان نحدث قيمة الحقل crrent

ثم إذا توافق الرقم المرسل من قبلنا لذلك العامود , نتحقق أولاً هل الحقل crrent ليس فارغاً Null

فإذا كان ليس كذلك قمنا بأخذ القيمة منه وحفظناها في المتغير GetCurrentVal مع طرح قيمة الممرر amount

ثم نضيف تلك القيمة في الحقل الحالي وهو crrent ثم نخرج من الحلقة loop مباشرتاً حتى لا يتم الطرح مجدداً .

ننادي هذا السلوك بهذا الشكل.

 UpdateCurrentusers(244, 3)

Private Sub UpdateCurrentusers(ByVal primeryKeyValue As String, _
   ByVal amount As Integer)
		Dim column As DataColumn
		Dim row As DataRow
		Dim GetCurrentVal As Integer = 0
		For Each row In Me.DS.Tables("users").Rows
			For Each column In DS.Tables("users").Columns
				If row("userno") = primeryKeyValue Then
					If row("crrent") IsNot DBNull.Value Then
						GetCurrentVal = CInt(row("crrent").ToString) - amount
						row("crrent") = GetCurrentVal
						Return
					End If
				End If
			Next
		Next
	End Sub

بالتوفيق إن شاء الله.

تم تعديل هذه المشاركة بواسطة الشهاب الحارق في 27 مايو 2007 في 02:50

في المثال يتضح المقال

#6

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

#7

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

فقط قبل الكلمة Return أستدعي الـ DataAdapter التابعة للجدول users و استخدم السلوك Update , فقط لا غير.

في المثال يتضح المقال

#8

أخي الكريم أشكرك على سعة صدرك معي فأنا مبتدأ في استخدام الدوت نت 2005 أما بالنسبة للكود فأنا نفذت فعلا ووضعت جملة update ولكن ظهرت لي رسالة خطأ ما أدري بس معناها تقريبا أنه لم يستطع العثور على العمود المفتروض التعديل عليه بالرغم من عمله كويس داخل البرنامج ويقوم فعلا بأخذ القيمة وإجراء العملية الحسابية عليها ظاهريا والخطأ في الصورة المرفقة على الرابط التالي أرجو الاطلاع عليها مع الكود بعد التعديل .. اعذرني وارجو أن يتسع صدرك لمبتدأ في الدوت نت شكرا لك

رابط بنوع الخطأ الظاهر

#9

طيب قبل عملية التحديث قومي بالتالي : هذه العملية تقطع عمل الجدول فيكون جاهز للتحديث...

Me.Validate()

Me.UsersBindingSource.EndEdit()

Me.UsersTableAdapter.Update(Me.DSMain.Users)

أو تستخدمين السلوك PerformClick الذي يتولى مجازاً الضغط على زر الحفظ

ذلك الزر الذي من خلاله نقوم بتحديث البيانات الى قاعدة البيانات.

 btnBNSaveItem.PerformClick()

بالتوفيق إن شاء الله.

في المثال يتضح المقال

#10

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

لذا أخي الكريم فقد وضعت لك الفورم المراد التعديل على الكود به مع قاعدة البيانات برجاء التعديل وعمل اللازم عليه ، واعتذر مرة أخرى عن ازعاجي لوقتك ، ولكني آمل من الله أن يكون الحل على يديك وشكرا أخي الكريم

أخوك / ميدو صلاح

:rolleyes:

update_error.rar

#11

في انتظار الرد وبرجاء اخباري هل توجد مشكلة في هذا الزر أم في قاعدة البيانات وشكرا

#12

السلام عليكم

هنالك عدة أخطاء منها ما يخص التصميم و منها ما يخص النصوص البرمجية.

فمن التصميم ان الجدول users لا يملك مفتاح اساسي Primery Key فعلى أي اساس ستقوم بعملية التحديث ,,, إن لم يكن هنالك مفتاح اساسي!!

ومن الاخطاء النصية البرمجية , هو عدم أرسال القيمة الصحيحة لممررات الوظيفة UpdateCurrentusers

فإنت ترسل القيمة amount للمقارنة بالمفتاح الاساسي !!!

وانت في هذا المثال تجلب السطور كلها لكن نحن نقف الان على السطر الاول , وانت ترسل المقارنة في الوظيفة بقيمة السطر الثالث.

لذلك لا يتحقق الشرط.. كذلك أنك تقوم بالتحديث ثم تذهب للجدول users لتقوم بتحديثه , فكان ينبغي عليك أن تقف عن تحريره ثم تقوم بتحديثه.

شاهد النصوص البرمجية لذلك. أو شاهد المرفق لذلك.

للعلم أنني لم استطع ان اشغل مشروعك في الاعلى فقمت بإنشاء مشروع أخر و سحبت من مشروعك النماذج و القوالب.....

 Private Sub Button1_Click(ByVal sender As System.Object, _
	ByVal e As System.EventArgs) Handles Button1.Click
		Dim CmdB As New OleDb.OleDbCommandBuilder(Das) '[المتغير لإحداث تعديل في قاعدة البيانات نفسها وليس مجموعة البينانات]
		Dim dsNewRow As DataRow 
		dsNewRow = Ds.Tables("sell").NewRow()
		dsNewRow.Item("user_no") = userno
		dsNewRow.Item("sell_date") = DateTimePicker1.Value
		dsNewRow.Item("sell_sahm") = ComboBox2.Text
		dsNewRow.Item("sell_csahm") = TextBox2.Text
		dsNewRow.Item("sell_ssahm") = TextBox3.Text
		dsNewRow.Item("sell_msahm") = TextBox4.Text
		Ds.Tables("sell").Rows.Add(dsNewRow)
		UpdateCurrentusers(1, 244)
		MessageBox.Show("تم حفظ عملية الشراء الحالية بنجاح", "برنامج أسهي")
	End Sub

 Private Sub UpdateCurrentusers(ByVal primeryKeyValue As Integer, _
	ByVal amount As Integer)
		Dim column As DataColumn
		Dim row As DataRow
		Dim GetCurrentVal As Integer = 0
		For Each row In Me.Ds.Tables("users").Rows
			For Each column In Ds.Tables("users").Columns
				If row("userno") = primeryKeyValue Then
					If row("crrent") IsNot DBNull.Value Then
						GetCurrentVal = CInt(row("crrent").ToString) - amount
						row("crrent") = GetCurrentVal
						Dim Cmdu As New OleDb.OleDbCommandBuilder(Dau)
						Me.Invalidate()
						Me.BindingContext(Ds, "buy").EndCurrentEdit()
						Me.BindingContext(Ds, "users").EndCurrentEdit()
						Das.Update(Ds, "sell")
						Dau.Update(Ds, "users")
						Return
					End If
				End If
			Next
		Next
	End Sub

WindowsApplication1.rar

في المثال يتضح المقال

هذا الموضوع مغلق.

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…