EasyDelphi Q&A
+2 تصويتات
34 مشاهدات

السلام عليكم 
عندي جدولين لهما علاقة كالاتي

table1
N°bon----------nom-----date
table2
N°SEL-------name----prenom--N°bon

اريد حذف جميع السجلات على الجدولين 
بحيث يتم  حذف تسجلات  الاول table2 ثم يحذف الجدول table1
 بضغطة زر  
دلفي..
قاعدة بيانات اكسس...
بدون استعلام sql ان امكن
وشكرا
سُئل في تصنيف vcl بواسطة (1,230 نقاط) | 34 مشاهدات

1 إجابة واحدة

+1 تصويت

أولا دعني أسمي الجدول الأبن table2 بجدول البائع "Seller" و الجدول الإب  table1 بجدول تذكرة 

الآن دعني أوضح بعض الأمور : مما يبدو من سؤالك أنك تريد حذف كل سجلات جدول البائع المرتبطة بسجل معين في جدول التذكرة . بمعنى أي سجل في جدول البائع يحمل في أحد حقوله نفس الحقل مفتاح من جدول التذكرة المراد حذفه سوف يحذف هو أيضا .

المهم لفعل كل هذا بضغطة زر واحدة و من دون إستعلام سيكوال فهناك طريقتين :

الطريقة الأولى:

يجب تتبع الخطوات التالية:

 أولا قم بفلترة جدول البائع ( الجدول الأبن ) على حسب المفتاح الخارجي للجدول تذكرة الذي تريد حذفه من جدول التذكرة.

ثانيا إعمل لوب على الجدول المفلتر الأبن إما ب FOR أو ب While كالآتي:

for I:= 1 to table2.recordCount do
begin
  table2.Delete;
  // ملاحظة 
  // لا تعمل ناكست لسجلات الجدول لأن عملية الحذف للسجل الأول
  // تفرض بالضرورة عمل سلاكت للسجل الذي يأتي بعده أوتوماتيكيا
  // لذلك إظافة هذا السطر ممنوع بتاتا  (table2.Next;)
  
end; 
table2.filtered := false;

ثالثا و أخيرا قم فقط بحذف السجل المراد حذفه من الجدول الإب .

الطريقة الثانية:

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

لتوضيح الأمور يرجى مشاهدة الفيديو هنا,

و حظا طيبا لك و لمن يهمه الأمر.wink

 

تم الرد عليه بواسطة (19,130 نقاط)
عُدل بواسطة
الجدول الاب هو الجدول 1
الابن هو الجدول 2
اعجبتني طريقة توصيحك لكن هناك خطئ وخلط بالنسبة للجدولين .على كل اعجبني تحليلك
تحصلت على هذا الكود و اشتغل لكن يشتغل في جدول واحد فقط وهو جدول الابن
ADOTable1.First;
   With ADOTable1 do
   begin
     while NOT EOF do
     begin
        Delete;
        next;
     end;
   end;
end;
قمت بتغير table الى الاب فيضهرلي خطء بمعني يجب عليا حذف تسجيلات الابن اولا .
مااريد عمله هو ادراج كود يقوم بحذف سجلات جدول الابن اولا ثم ينتقل الى الاب .
هل ممكن اتلاعب بالكود ليقوم بعمل هذا.
نعم فيما يخص من هو الأب و من هو ألأبن فأنت على حق ...سأقوم بالتعديل أعلاه . مشكور جدا على التصحيح.
أما فيما يخص الكود الذي تستعمله ينقصه فقط حذف السطر ناكست Next و من ثم إستعماله على الجدول الإبن و بعد الإنتهاء من حذف كل سجلات الجدول الإبن المرتبطة بسجل الجدول الأب أضف أمر الحذف لهذا السجل الأخير.المتواجد في الجدول الأب.
نعم فكرة جيدة لم أفهم أنك تريد حذف كل سجلات الجدول الأب (أي تفريغ كل الجدول)
لا تنسى أن تشترك في قناة الفيديو الذي أرسلته لك فهي قناة في المستوى و ستساعدك كثيرا في مشوارك مع قواعد البيانات أكسس .
وجدت حل حل اخير ممكن رايك
قمت بعمل خاصية cascadedelete على الاكسس
وادرجت كود حذف جدول الاب كتالي
procedure TForm3.Button3Click(Sender: TObject);
var
i:integer;
begin
for i := adotable1.RecordCount - 1 downto 0 do
  begin
    adotable1.Delete;
  end;
  adotable1.Refresh;
end;
اشتغل .ولكن عندما يمتلء الجدول بالتسجيلات يصبح الحذف بطيئا جداا
procedure TForm3.Button3Click(Sender: TObject);
var
  i:integer;
begin
 if adotable1.RecordCount = 0 then exit;
 
 adotable1.disableControls;
 adotable2.disableControls;
 for i := 1 to adotable1.RecordCount do
 begin
   adotable1.Delete;
 end;
 adotable1.enableControls;
 adotable2.enableControls;
end;

ملاحظة :

فيما يخص الجدول adotable2 فهو يمثل الجدول الأبن

أما disableControls تقوم بتعطيل كل تحديثات على مستوى ديبيقريد أو ديبيإيديت و غيرها .. و enableControls هي العكس و كل هذا لتسريع عملية الحذف

لا تستخدم حلقة for بين قيمتين يمكن ان تتغير إحداها اثناء المرور في الحلقة  .. هذه قاعدة عامة في سلامة الكود
في الامثلة المكتوبة هنا . استخدام لـ RecordCount . في For وبداخلها Delete . اي تغيير عدد السجلات .
هذا العمل غير آمن . من الافضل استخدام while eof او while recordcount>0 .


while not table.eof do

او

while Recordcount > 0 .

ملاحظة : تم إلغاء الاجابة الافضل .
نعم معك الحق أستاذ سامر...

اسئلة متعلقة

+5 تصويتات
2 إجابة
سُئل أغسطس 19، 2018 في تصنيف SQL Server بواسطة Yamada Fakir (1,690 نقاط) | 122 مشاهدات
+3 تصويتات
1 إجابة
سُئل أغسطس 30، 2018 في تصنيف OOP بواسطة Ammar Salah (2,080 نقاط) | 57 مشاهدات
+1 تصويت
2 إجابة
سُئل منذ 5 أيام في تصنيف vcl بواسطة rm31dz (390 نقاط) | 32 مشاهدات
0 تصويتات
1 إجابة
سُئل يونيو 8 في تصنيف vcl بواسطة hidenpain (1,230 نقاط) | 32 مشاهدات
0 تصويتات
1 إجابة
ادعُ اصدقائك في الفايسبوك لمشاركتك
Comodo SSL

مرحبًا بك إلى EasyDelphi Q&A، حيث يمكنك طرح الأسئلة والحصول على الإجابة عليها من المستخدمين الآخرين.

لا يسمح بطلب او السؤال عن كراك او تفعيل او كسر او فك او اي شيء يخالف اتفاقيات الترخيص  مهما كان السبب ومهما كان البرنامج ونوعه. ولا حتى نشر روابط تحتوي على مثل هذه الاشياء لا في الاسئلة ولا في الاجابات ولا التعليقات . نهائيا

425 سؤال
659 إجابة
1,168 تعليق
248 مستخدم