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

السؤال حذف سجل من أحد جدولين تم فتحهما بجملة select واحدة

بدأه عمرو عماد في 21 مارس 2010 · 10 رد · 1,419 مشاهدة · في لغة Ms Visual Basic 6 وما قبلها من إصدارات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

عذر أخي المشرف لكن الموضوع هم بالنسبة لي

لقد وضعت سؤال في قسم قواعد البيانات علي الرابط التالي

/index.php?showtopic=216891

ولم يجيب عليه أحد وأعتقد نظرا لقلة العدد الذين يتصفحون في هذا القسم

لذ قمت بوضعه مرة أخري في هذا القسم لعلي أجد مجيب

سؤالي مرة أخري

لدي جدولين الأول خاص بالعقود Contracts والأخر خاص بالمشروعات Projects

أستخدمت في جدول المشروعات حقلا غريبا وله علاقة بينه وبين المفتاح الرئيسي في جدول العقود , حيث أنها علاقة one to many

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

RS.Open "Select * From Contracts,Companies where Companies.PID = Contracts.CompanyID", Db, adOpenDynamic, adLockOptimistic

المتغير الذي سيحمل الجدولين أسمه RS

سؤالي الأن . أريد أن أقوم بعمل :

RS.Delete

ليقوم بحذف السجل الحالي من جدول العقود دون حذف السجل الحالي بجدول المشروعات

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

أسف للإطالة

#2

سيدي الفاضل لماذا لم تضع نموزج لبرنامجك لكي يستطيعون التغيير علية

اعتقد ان طلبك ستجدة هنا في الوصلة التالية

ارجو ان يكون هذا ما تريد

/index.php?showtopic=216901

#3

شكرا لسرعة ردك سيدي الفاضل

لكنك لم تفهم ما أريد

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

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

أتمني أن تكون الفكرة قد أتضحت

مازلت أنتظر الحل

#4

السلام عليكم

من الافضل عمل الحذف باستعلام مستقل كمايلي

db.execute "delete from Contracts where id=" & rs!id

حيث Id هو المفتاح الاساسي في جدول العقود

#5

السلام عليكم...

استعمال الوظيفة Delete على مجموعة Recordset تشمل أكثر من جدول غير مضمونة النتيجة، كما حدث معك.

أعتقد أنه ينبغي استعمال ADODB.Command للحذف من الجدول المطلوب ثم إغلاق و إعادة فتح الـ Recordset، مثلاً إذا افترضنا أن حقل المفتاح الرئيسي في الجدول Contracts هو الحقل ContractID وأننا نريد حذف السجل الحالي المحدد في المجموعة Rs

Dim Cmd As New ADODB.Command
Cmd.ActiveConnection = Db
Cmd.CommandText = "Delete From Contracts WHERE (ContractID = " & Rs("ContractID") & ")"
Cmd.Execute
Rs.Close
Rs.Open

* بعد تجهيز الرد وجدت الأخ TareqVB قد سبقني بالفكرة. على أية حال في الزيادة إفادة.

نرجو الاستفادة و السلام.

تم تعديل هذه المشاركة بواسطة najy_zl في 22 مارس 2010 في 13:47

وَ قُلِ اعْمَلُوا فَسَيَرَى اللهُ عَمَلَكُمْ وَ رَسُولُهُ وَ الْمُؤْمِنُونَ

صدق الله العظيم

#6

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

جزاكم الله خيرا علي ردكم ومساعدتي في هذه المشكلة

لكن لي سؤالين :-

الأول لماذا حدث أنه عند أستخدام دالة delete الخاصة بالمتغير rs قام بحذف سجلا من أحد الجدولين والمنطقي أنه يقوم بحذف السجل الحالي من كلا الجدولين .. أعتقد أن لدي تضارب في الفهم وأحتاج إلي تصحيح

الثاني : هل يمكنني عمل ذلك دون غلق جدول وفتحه مرة أخري

أسف لكثرة أسألتي

#7

أجيب علي نفسي في السؤال الثاني :

حيث أنني يمكنني عمل تحديث للجدول بإستخدم الأمر Requery بدلا من إغلاقه وفتحه مرة أخري وهذا سيفي بالغرض لكنه أوقعني في مشكلة وأعتقد أنه حلها سهل وسأقوم بحلها

فمثلا لو أفترضنا أني أقف في أخر سجل في الجدول وقمت بحذف فبعد أن أقوم بعمل Requery سيقوم المؤشر بالإنتقال إلي الصف الأول وهذا ما لا أريد. حيث ما أريده أن يبقي في السجل قبل الأخير (قبل الحذف ) والأخير (بعد الحذف), وعموم هذه المشكلة حيث أني أريد المؤشر دائما يتوقف علي السجل الموجود قبل السجل المحذوف ,وهذه سوف أقوم بحلها . لكنني أحببت أن أشارككم الرأي

يبقي لي السؤال الأول فأنتظر الأجابة وجزاكم الله خيرا

#8

السلام عليكم...

بالنسبة إلى الاستفسار الأول المتعلق بالحذف:

تذكر أن مجموعة السجلات الناتجة من ربط الجدولين لا تمثل سجلات حقيقية (فيزيائية) في قاعدة البيانات، أي أنه لا يوجد لديك في الواقع سجلات تتكون من تلك الحقول إذا أخذت كل جدول على حدة. في هذه الحالة يستطيع محرك قواعد البيانات حذف السجل من الجدول الذي يمثل الجانب (Many) في العلاقة (الجدول الفرعي) لكنه لا يستطيع حذف السجل من الجدول الرئيسي (الجانب One في العلاقة) لأن هناك احتمال أنه توجد سجلات أخرى في الجانب Many مرتبطة بذلك السجل.

لتوضيح الأمر نأخذ مثال بسيط: جدول الزبائن (Customers) يتكون من الحقلين "رقم الزبون" (CustID) و "اسم الزبون" (CustName) حيث الحقل CustID هو المفتاح الأساسي. و جدول الطلبيات (Orders) يتكون من الحقول "رقم الطلبية" (OrdID) و "تاريخ الطلبية" (OrdDate) بالإضافة إلى الحقل CustID الذي يمثل المفتاح الأحنبي (Foreign Key) للربط مع الجدول Customers.

لنفرض أن لدينا زبون رقمه 5 و اسمه Salem و لديه أربع أو خمس طلبيات، و أننا ربطنا الجدولين معاً. ستكون السلات الناتجة كالتالي:

Customers.CustID *** CustName *** OrdID *** OrdDate *** Orders.CustID

5 *** Salem *** 2 *** 20/11/2009 *** 5

5 *** Salem *** 3 *** 15/12/2009 *** 5

5 *** Salem *** 6 *** 01/02/2010 *** 5

5 *** Salem *** 8 *** 12/03/2010 *** 5

5 *** Salem *** 9 *** 19/03/2010 *** 5

نفرض أننا متوقفون عند الطلبية الثالثة (رقم 6) و نفذنا الأمر RS.Delete. ما الذي نتوقعه من محرك قاعدة البيانات؟؟ يمكنه بشكل عادي أن يحذف الطلبية رقم 6 من جدول الطلبيات (إلا إذا كانت له ارتباطات أخرى)، لكن هل سيحذف سجل الزبون Salem من جدول الزبائن؟؟!! الجوا ب: لا. السبب ببساطة هو أنه توجد سجلات أخرى في جدول الطلبيات لا تزال مرتبطة بسجل الزبون Salem. ماذا سيفعل بها محرك قواعد البيانات إذا حذف زبونها؟!!

بالنسبة إلى الجزء الثاني من الاستفسار: يمكنك استعمال الطريقة Requery لتحديث مجموعة السجلات (RS.Requery) لكن أعتقد أنها لا تنجح دائماً في عملية التحديث.

* بعد أن جهزت الرد وجدتك قد أضفت مشاركة أخرى!

على أية حال أرجو الاستفادة و السلام.

وَ قُلِ اعْمَلُوا فَسَيَرَى اللهُ عَمَلَكُمْ وَ رَسُولُهُ وَ الْمُؤْمِنُونَ

صدق الله العظيم

#9

يجزيك ربي خيرا علي مساعدتك لي وأهتمامك بي

وأعذرني لتأخري في الرد ولكن ذلك بسبب أنشغالي قليلا في العمل

لي ردا أخر لكن حينما أفرغ مما أنا فيه

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

#10

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

أولا : أسف لتأخير علي الرد ولكن والله هذا لكثرة المشاغل هذه الأيام أعاذكم الله منها

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

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

Public Function RefreshRS(ByRef Rs As adodb.Recordset, Cpos As Long, Count As Long) As Long
    Rs.Requery
    If Rs.EOF And Rs.BOF Then Exit Function
    If Count = Rs.RecordCount Then
        Rs.AbsolutePosition = Cpos
    ElseIf Cpos = Count Then
        Rs.AbsolutePosition = Count - 1
    ElseIf Cpos < Count Then
        Rs.AbsolutePosition = Cpos
    End If
End Function

أعتقد انك تفهم ما أريد

وجزاك الله خيرا علي ردك ومساعدتك لي

ويبقي لي سؤال أخر ولكني سأضع موضوع منفصلا عنه بعنوان منفصل حتي يمكن البحث عنه فيما بعد

سأضعه غدا أن أستطعت إن شاء الله

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

#11

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

/index.php?showtopic=218427

جزاك الله خير

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