المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : كيف التعامل مع الجداول المترابطة في دلفي؟؟


backar-net
05-08-2010, 10:27 PM
السلام عليكم

MS Access 2007 & Delphi 2010

لدي جدولين في قاعدة بيانات Access بينهما علاقة one-to-many وكنت أحاول بلا جدوى الربط بينهما فكان يصادفني مشاكل دوما

جربت اليوم طريقة INNER JOIN ON جربت البرنامج وتم تنفيذه بلا أخطاء وتوقعت أنها نجحت معي وأخيرا

إلا أن هناك مشكلة جديدة صادفتني وهي أنني عندما أستخدم أحد التابعين Insert أو Delete مع ال ADOQuery فإن التابع يحذف السجل أو ينشئه في الجدولين المربوطين وليس في أحدهما، فالمفروض أن يخذف من طرف many أو FK

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

فكلما أردت إضافة علبة مسحوق غسيل مثلا كمادة : تضاف هذه المادة في جدول المواد ويضاف أيضا الصنف "منظفات" في جدول الأصناف حتى لوكان هذا الصنف موجودا


أشكر مساعدتكم

Lam.Abdeldjalil
05-08-2010, 11:41 PM
و عليكم السلام ورحمة الله وبركاته

مرحبا بك أخ backar-net معنا في المنتدى

قوانين المنتدى

http://www.delphi4arab.com/forum/showthread.php?t=29

لدي جدولين في قاعدة بيانات Access بينهما علاقة one-to-many وكنت أحاول بلا جدوى الربط بينهما فكان يصادفني مشاكل دوما

مانوع المشاكل؟ أذكر كل مشكل على حدى و سوف نقوم بحلها جميعا إن شاء الله


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


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

و السلام عليكم

backar-net
06-08-2010, 04:15 PM
السلام عليكم

لدي الجدولين
Categories(Cat_ID; Cat_Name)
Articles(Art_ID; Art_Name; Cat_ID.....)

أضع في الأول الأصناف الموجودة وفي الثاني المواد المخزنة في المستودع

وبنهما علاقة one-to-many حيث أن الحقل Cat_ID هو مفتاح رئيس في الجدول الأول ومفتاح أجنبي FK في الجدول الثاني

ربطت الجدولين بمكون ADOQuery بعبارة SQL التالية

SELECT * FROM Categories INNER JOIN Articles ON Categories.Cat_ID=Articles.Cat_ID

من أجل إظهار المواد وأصنافها ضمن DBGrid

فوجئت أنني عندما استعمل الدالة Insert بالشكل التالي

ADOQuery1.Insert;
ADOQuery1.Post;

فإن الدالة تضيف حقلا جديدا في كل من الجدوليبن المربوطين
مع أنني أردت أن تضيف في الجدول الذي يحوي FK بالاعتماد على جدول الأصناف

وكذلك الأمر بالنسبة للدالة Delete

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


إخوتي هل لهذه المشكلة حل أم أنني مخطئ في الطريقة أصلا

Lam.Abdeldjalil
06-08-2010, 06:51 PM
و عليكم السلام و رحمة الله

التعامل بهذا النوع من الربط ليس بهذه السهولة

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

و الله أعلم

لذا أقترح عليك حلين :

1- بدأتها Sql أكملها Sql

للإضافة : AdoCommand مع الأخذ بعين الإعتبار أن Art_Id من نوع Autoinc مثال

ADOCommand1.CommandText :='INSERT INTO Articles(Cat_ID, Art_Name) VALUES (CategoriesCat_ID.value,''product name'')' ;
ADOCommand1.Execute ;

للحذف : AdoCommand مثال

ADOCommand1.CommandText :='delete from Articles where Cat_ID ='+inttostr(CategoriesCat_ID.value ) ;
ADOCommand1.Execute ;
2- أما إذا أردت الطريقة السهلة بمثال ( الربط عن طريق Mastersource

http://www.delphi4arab.com/forum/showpost.php?p=18760&postcount=4


بالتوفيق

Lam.Abdeldjalil
30-08-2010, 08:24 PM
السلام عليكم و رحمة الله

وجدت شيئا متعلقا بالتساؤل في هذا الكتاب صفحة 35

Using_ADO_from_Delphi (http://www.delphi4arab.com/forum/showpost.php?p=5250&postcount=1)



Navigating and editing the query


The result set must
contain records from a single table and it must not use any SQL aggregate functions.
Editing of a dataset returned by the ADOQuery is the same as editing the ADOTAble's
dataset.
أي لا تستخدم المناهج Append /Insert /Edit /Post/Delete إذا كنت تستعلم من أكثر من جدول
فهي مخصصة للتعامل مع جدول واحد فقط

والسلام عليكم