كيف التعامل مع الجداول المترابطة في دلفي؟؟
#1
السلام عليكم

MS Access 2007 & Delphi 2010

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

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

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

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

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


أشكر مساعدتكم
الرد
#2
و عليكم السلام ورحمة الله وبركاته

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

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

http://www.delphi4arab.net/forum/showthread.php?tid=29

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

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


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

و السلام عليكم
الرد
#3
السلام عليكم

لدي الجدولين
كود :
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

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


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

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

في استعلامك المعطى تقوم بإختيار كل الحقول من الجدولين نظريا عند الإضافة يضاف حقل في كلا الجدولين ( إذا لم تحدد قيمة المفتاح الأساسي بالنسبة للجدول الأصناف و لايمكن تحديده إذا كان من نوع 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


بالتوفيق
الرد
#5
السلام عليكم و رحمة الله

وجدت شيئا متعلقا بالتساؤل في هذا الكتاب صفحة 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 إذا كنت تستعلم من أكثر من جدول
فهي مخصصة للتعامل مع جدول واحد فقط

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


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم