delphi4arab منتديات دلفي للعرب

نسخة كاملة : هل عند حذف سجل من ماستر, السجلات المرتبطة معه في الديتال تحذف مباشرة
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
السلام عليكم و رحمة الله و بركاته

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

و لقد و ضعت هذه الرابطة بين الجدولين في الدلفي

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

أو يجب أن أحذفها تباعا(فإن كانت كذلك فما هي أفضل طريقة)

شكر كبير لهذا المنتدى و لكل أعضائه.
و عليكم السلام

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

إذا كانت العلاقة منشأة فقط في Delphi (علاقة Master/Details) دون وجود علاقة حقيقية (Relation) في قاعدة البيانات فإن حذف السجلات الفرعية (Detail) يتم برمجياً باستعمال Command أو Query لتنفيذ جملة SQL تشبه التالية:
كود :
DELETE FROM detail_table WHERE (foreign_key_field = master_id_value)

حيث detail_table اسم الجدول الفرعي. foreign_key_field اسم الحقل في الجدول الفرعي الذي يحتوي على رقم تعريف السجل في الجدول الرئيسي. master_id_value رقم تعريف السجل في الجدول الرئيسي.

أما إذا كانت هناك علاقة بين الجدولين في قاعدة البيانات فإن الأمر يعتمد على ما إذا كان هناك تكامل مرجعي (ٌReferential Integrity) بخصوص حذف السجلات الفرعية عند حذف السجل الرئيسي المرتبط بها (Cascade Delete).
فإذا كان هناك تكامل مرجعي بخصوص الحذف فسيتم حذف السجلات الفرعية تلقائياً عند حذف السجل الرئيسي المرتبط بها، و إلا فستحتاج إلى حذفها برمجياً كما سبق.

نرجو الاستفادة و السلام.
أحسنت أخي. لذا فإن أفضل الطريقتين الاولى و دلك بربط الجداول في sgbd.

جزاك الله كل الخير.
عفوا أقصد الطريقة الثانية.
السلام عليكم

ملاحظة بسيطة
إقتباس :فإذا كان هناك تكامل مرجعي بخصوص الحذف فسيتم حذف السجلات الفرعية تلقائياً عند حذف السجل الرئيسي المرتبط بها،
هذا في حالة ما إذا كانت referential action ـ = CASCADE
على ما أظن أغلب الـ rdbms تدعمها
كود :
http://en.wikipedia.org/wiki/Foreign_key
بالتوفيق
السلام عليكم

اولا :حذف تسجيلة من tablemaster


;(procedure form1.Button1Click(Sender: TObject
begin
;tablemaster.Delete

;end
ثانيا
من الخاصية: Beforedelete ل:tablemaster يتم حذف جميع تسجيلات tabledetail


;(procedure tabledetailBeforeDelete(DataSet: TDataSet
var
;i:integer
begin

for i:=1 to tabledetail.recordcount do
begin try
;tabledetail.Last
;tabledetail.Delete
except
;end;end

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

مجرد نصيحة: لا تستعمل الحلقات في مثل هذا الأمر. إذا كان الأمر يتعلق بحذف 10 سجلات أو 100 سجل فربما يكون مقبولاً، و لكن عند التعامل مع آلاف أو مئات الألاف من السجلات فإن استعمال حلقة في مثل هذا الأمر سيكون بطيئاً جداً جداً، و ربما يؤدي إلى توقف البرنامج عن الاستجابة إلى حين انتهاء الحلقة.

سلام.