السلام عليكم
MS Access 2007 & Delphi 2010
لدي جدولين في قاعدة بيانات Access بينهما علاقة one-to-many وكنت أحاول بلا جدوى الربط بينهما فكان يصادفني مشاكل دوما
جربت اليوم طريقة INNER JOIN ON جربت البرنامج وتم تنفيذه بلا أخطاء وتوقعت أنها نجحت معي وأخيرا
إلا أن هناك مشكلة جديدة صادفتني وهي أنني عندما أستخدم أحد التابعين Insert أو Delete مع ال ADOQuery فإن التابع يحذف السجل أو ينشئه في الجدولين المربوطين وليس في أحدهما، فالمفروض أن يخذف من طرف many أو FK
فأنا مثلا أحذف سجل مادة ما من جدول المواد وإذا بالتابع قام بحذف سجل المادة وسجل صنف المادة من جدول الأصناف المرتبط به
والعكس فإذا أردت أن أضيف مادة من صنف موجود أصلا في جدول الأصناف قام التابع بتكرار هذا الصنف في الجدول
فكلما أردت إضافة علبة مسحوق غسيل مثلا كمادة : تضاف هذه المادة في جدول المواد ويضاف أيضا الصنف "منظفات" في جدول الأصناف حتى لوكان هذا الصنف موجودا
أشكر مساعدتكم
و عليكم السلام ورحمة الله وبركاته
مرحبا بك أخ backar-net معنا في المنتدى
قوانين المنتدى
http://www.delphi4arab.net/forum/showthread.php?tid=29
إقتباس :لدي جدولين في قاعدة بيانات Access بينهما علاقة one-to-many وكنت أحاول بلا جدوى الربط بينهما فكان يصادفني مشاكل دوما
مانوع المشاكل؟ أذكر كل مشكل على حدى و سوف نقوم بحلها جميعا إن شاء الله
إقتباس :فأنا مثلا **** أن أحذف سجل مادة ما من جدول المواد وإذا بالتابع قام بحذف سجل المادة وسجل صنف المادة من جدول الأصناف المرتبط به
والعكس فإذا أردت أن أضيف مادة من صنف موجود أصلا في جدول الأصناف قام التابع بتكرار هذا الصنف في الجدول
ضع الكود كل من الإضافة و الحذف ليتم دراسته
مع وضع الإستعلام في الربط
و السلام عليكم
السلام عليكم
لدي الجدولين
كود :
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
فكما ذكرت في المثال فلو أن لدي علبة منظفات أردت أن أحذفها لحذف أيضا الصنف منظفات من جدول الأصناف
إخوتي هل لهذه المشكلة حل أم أنني مخطئ في الطريقة أصلا
و عليكم السلام و رحمة الله
التعامل بهذا النوع من الربط ليس بهذه السهولة
في استعلامك المعطى تقوم بإختيار كل الحقول من الجدولين نظريا عند الإضافة يضاف حقل في كلا الجدولين ( إذا لم تحدد قيمة المفتاح الأساسي بالنسبة للجدول الأصناف و لايمكن تحديده إذا كان من نوع 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.net/forum/showpos...ostcount=4
بالتوفيق
السلام عليكم و رحمة الله
وجدت شيئا متعلقا بالتساؤل في هذا الكتاب صفحة 35
Using_ADO_from_Delphi
إقتباس :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 إذا كنت تستعلم من أكثر من جدول
فهي مخصصة للتعامل مع جدول واحد فقط
والسلام عليكم