مشاهدة النسخة كاملة : كيف التعامل مع الجداول المترابطة في دلفي؟؟
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 إذا كنت تستعلم من أكثر من جدول
فهي مخصصة للتعامل مع جدول واحد فقط
والسلام عليكم
vBulletin® , Copyright ©2008-2012