الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

الجدول الرئيسي Master و جدول التفاصيل Detail

مغلق
بدأه Whale في 7 مايو 2007 · 20 رد · 2,686 مشاهدة · في قواعد بيانات Microsoft Access
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

كيف يمكن تصميم نموذج Form يظهر الجدول الرئيسي Master Table و جدول التفاصيل Detail Table بحيث لا يسمح بتخزين أي سجل في الجدول الرئيسي اذا لم يرتبط هذا السجل بسجل واحد على الاقل في جدول التفاصيل.

كنت استخدم في الدلفي اوامر مثل Begin Transaction و Commit Transaction و ال Rollback Transaction لتحقيق المطلوب اعلاه.

هل يعرف احدكم كيف يمكن عمل ذلك في الاكسس.

هل لدى احدكم افكار اخرى غير ماذكرت

مرفق قاعدة بيانات

تحياتي لكم مقدما

MasterDetail.rar

#2

النموذج المرفق بواسطتك هو المطلوب ويفي بالغرض

اين المشكله اذن ؟

#3

الاخ الفاضل احمد الرحمني

شكرا لك على اهتمامك بالموضوع

النموذج المرفق لا يفي بالغرض ابدا و ذلك لانه يسمح لك بادخال سجل في الجدول ال Master بينما لا توجد سجلات مرتبطة به في الجدول Detail

على سبيل المثال هل يجوز ان يحتوي جدول راس الفاتورة (Master) على سجل لا يرتبط بسجل واحد او اكثر من سجلات جدول تفاصيل الفاتورة (Detail) هنا المشكلة!!!

انا متاكد ان معظمكم قد صادف مثل هذه المشكلة و لكن لا ادري كيف تحلوها

ارجو ان يكون السؤال قد و ضح

تحياتي

#4

اخي الكريم... هذا شي غريب...

اولا الادخال يجب ان يتم في الجدول الرئيس ثم يتم الادخال في الجدول المرتبط.. وهذا يعني انه لا يمكن اضافة سجلات في الجدول المرتبط قبل ادخال قيمة في الجدول الرئيس..لان هذا يعد احدد الاسس المهمة في قواعد البيانات...

وهذا يعني انه لا يمكن وجود سجلات في الجدول الفرعي قبل ان يكون لها اب في الجدول الرئيس..

حلوة الرئيس هذه.....

وَمِنَ النَّاسِ مَن يُعْجِبُكَ قَوْلُهُ فِي الْحَيَاةِ الدُّنْيَا وَيُشْهِدُ الله عَلَى مَا فِي قَلْبِهِ وَهُوَ أَلَدُّ الْخِصَامِ

مواضيعي ومشاركاتي

#5

حياك الله اخ همام ابوعرقوب

و مشكور على اهتمامك بموضوعي

اقتباس
اولا الادخال يجب ان يتم في الجدول الرئيس ثم يتم الادخال في الجدول المرتبط.. وهذا يعني انه لا يمكن اضافة سجلات في الجدول المرتبط قبل ادخال قيمة في الجدول الرئيس..لان هذا يعد احدد الاسس المهمة في قواعد البيانات...

انا اعرف هذا الشي تماما.

ساحاول ان اوضح مقصدي بطريقة اخرى.

هناك حالتان لجدول الرئيسي مرتبط بجدول التفاصيل:

1- سجل مدخل في الجدول الرئيسي و سجل او اكثر مدخل في جدول التفاصي يشير لرقم السجل في الجدول الرئيسي.

2 - سجل مدخل في الجدول الرئيسي و لا يوجد سجلات في جدول التفاصي تشير لرقم السجل في الجدول الرئيسي.

ما اريده بالضبط هو منع حدوث الحالة الثانية.

تحياتي

#6

أخي العزيز ... بعد التحية

سؤالك مفهوم ! وهو ألا يتم تخزين البيانات في الجدول الأساسي ( الاب ) إلا بوجود على الأقل سجل واحد في جدول التفاصيل ؟

لديّ قاعدة بيانات تتكون من جدولين أساسي وفرعي وبها نموذج يحتوي على الجدولين وبهذا النموذج يوجد مفتاح تخزين وبدونه لا يتم التخزين ومفتاح خروج ومعناه عدم التخزين ... ممكن الاستفادة من هذه القاعدة .... شكراً.

Accounts.rar

[يمين]

إذا كـان تـرك الـدين يعــنــي تقــدمــاً

فـيا نفــس مـوتــي قبــل أن تتقـدمــي

[/يمين]

#7

الاخ الفاضل kamal alnahhal

شكرا جزيلا لك على البرنامج

الطريقة جيدة فعلا و لكن....

استطعت ان اخزن في الجدول الرئيسي سجل بينما لا يوجد سجل في جدول التفاصيل

كيف تم ذلك؟

ادخلت سجل في الجدول الرئيسي و من ثم ادخل سجل في الجدول التفاصيل (بهذا تم تخزين كلا السجلين) بعد ذلك حذف سجل التفاصيل و بهذا رجعنا لنفس المشكلة

شباب الم تواجهو مثل هذه المشكلة من قبل

تحياتي

#9

لدى فكرة أضف زر Button إلى النموذج ليحذف الحقول من الجدول الرئيسى والتى ليس لها حقول مقابلة فى الجدول الفرعى

كود الزر

Private Sub Command1_Click()
On Error GoTo Err_Command1_Click
Dim dbs As Database, rst As Recordset, strsql As String
Set dbs = CurrentDb

strsql = "SELECT Master.MasterID FROM Master;"
Set rst = dbs.OpenRecordset(strsql)
Do
If chk_found(rst![MasterID]) = False Then rst.Delete
rst.MoveNext
Loop Until rst.EOF

   Me.Requery
Exit_Command1_Click:
	Exit Sub

Err_Command1_Click:
	MsgBox Err.Description
	Resume Exit_Command1_Click

End Sub

كود الدالة chk_found هو

Public Function chk_found(ByVal X As Long) As Boolean
On Error GoTo my_err_trap
Dim dbs As Database, rst As Recordset, strsql As String
Set dbs = CurrentDb
strsql = "SELECT Detail.MasterID"
strsql = strsql & " FROM Detail"
strsql = strsql & " WHERE (((Detail.MasterID)=" & X & "));"


Set rst = dbs.OpenRecordset(strsql)
rst.MoveLast
chk_found = True

Exit Function
my_err_trap:
If Err.Number = 3021 Then

chk_found = False
End If
End Function
#10

يا حضرت السيد Whale

يجب عليك توصيل أسلاك كهرباء 220 لدماغي لعلها تنتعش وأفهم سؤالك لأنني فعلاً واجهة مشكلة كبيرة جداً .

  1. الجدول Master هو الجدول الأساسي في الربط أي ( الرأس ) في العلاقة.
  2. الجدول Detail هو الحدول الفرعي في الربط أي ( أطراف ) في العلاقة.
  3. الذي أعرفه أنه لا يمكن أضافة أي سجل في الجدول الفرعي Detail ما لم يكن له سجل في الجدول الرئيس.

اقتباس

1- سجل مدخل في الجدول الرئيسي و سجل او اكثر مدخل في جدول التفاصي يشير لرقم السجل في الجدول الرئيسي.

2 - سجل مدخل في الجدول الرئيسي و لا يوجد سجلات في جدول التفاصي تشير لرقم السجل في الجدول الرئيسي.

ما اريده بالضبط هو منع حدوث الحالة الثانية

أنت تريد أن لا يُضاف أي سجل في الجدول الرئيس إلا بوجود سجل مرتبط به في الجدول الفرعي والعلاقة تمنع أضافة سجل في الجدول الفرعي المرتبط مالم يكن له سجل في الجدول الرئيس . إذن كيف ستضاف البيانات ؟

أقول الله يخلف علي في دماغي يبدو أنني كبرة وخرفة

#11

/QUOTEأنت تريد أن لا يُضاف أي سجل في الجدول الرئيس إلا بوجود سجل مرتبط به في الجدول الفرعي والعلاقة تمنع أضافة سجل في الجدول الفرعي المرتبط مالم يكن له سجل في الجدول الرئيس . إذن كيف ستضاف البيانات ؟

أقول الله يخلف علي في دماغي يبدو أنني كبرة وخرفة/QUOTE

أخي أبا سارة لا خرفت ولا شي , وأنت خير العارفين , وكما علمتنا أنه لا شيء مستحيل

الراجل طالب أن يعكس التكامل المرجعي , فيطبق في الاتجاهين معا وفي آن , أي لا يضاف سجل إلى الجدول الفرعي حتى يوجد له أب في الجدول الرئيس وهذا أمر مقدور عليه , ولكن وفي الوقت ذاته لا ينضاف أي سجل إلى الجدول الرئيس ما لم يكن له ابن على الأقل في الجدول الفرعي . وهذا غير ممكن إذ الأب سابق عن الإبن , لذلك دالة الجذف التي قدمها أخونا العمرى بن ستكون مفيدة جدا إذ يمكن أن نتحقق قبل الانتقال إلى سجل حديد من وجود ابن على الأقل للسجل الحالي وإلا حذفناه .

في المرفق تطبيق لهذه الفكرة

أخوك أبو تماضر

MasterDetail.rar

#12

السلام عليكم

تحية لكل من قرأ الموضوع و لكل من ساهم في محاولة حل هذه المشكلة التي تؤرقني.....

السؤال اصبح واضحا الان ... هذا جيد

الاخ العمرى بن فكرة الكود ذكية فعلا و اصدقك القول بانني لم اكن اتخيل بان تكون بهذا الشكل. كما اشكر الاخ alasomed على المثال الذي وضعه. اذا ان استخدام الاحداث فكرة جيد في كثير من الاحوال...

الان لدي بعض الملاحظات حول ما تفضلتم به:

1- هذا الكود يستهلك الكثير من الذاكرة ووقت المعالج!!! كيف؟؟ لاحظ ان الكود يفحص جميح قيم المفاتيح الرئيسية للجدول الرئيسي بيد انه من الافضل فحص فقط قيمة المتاح الرئيسي لسجل الحالي.

على سبيل المثال اذا كان لدينا 100000 سجل في الجدول الرئيسي فاننا سوف نفتح ال Recordset لهذا العدد و سوف نستدعي الدالة chk_found بنفس العدد اي 100000 مرة!!

2- ماذا اذا حدث خطأ في الكود!! عندها سوف يتم تخزين سجل في الجدول الرئيسي لا يوجد له ابنا في اجدول التفاصيل!!

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

3- ماذا اذا انقطعت الكهربا فجئة!!!! نفس المشكلة ستحدث وقد اختبرت ذلك.

اعلم بعض الاعضاء سيقولون يا Whale انت بتعقد المسائل شوف بالنسبة لانقطاع الكهرباء فيمكنك استخدام ال UPS !! اقول انت كمبرمج كن مستعدا لاشي غير متوقع ماذا اذا عطل ال UPS !!!

باين و الله اعلم ان الحل الوحيد في ال Transactions بس لا ادري كيف تطبق في الاكسس و خصوصا بالنسبة لسؤالي.

سابحث في الموضوع و الله يعين

تحياتي لكم جميعا

تم تعديل هذه المشاركة بواسطة Whale في 20 مايو 2007 في 09:38

#13

وعليكم السلام ورحمة الله

الأخ Whale

شكرا كل الشكر ... لأن بالفعل للموضوع محفز ..

اقتباس
1- هذا الكود يستهلك الكثير من الذاكرة ووقت المعالج!!! كيف؟؟ لاحظ ان الكود يفحص جميح قيم المفاتيح الرئيسية للجدول الرئيسي بيد انه من الافضل فحص فقط قيمة المتاح الرئيسي لسجل الحالي.

فحص السجل الحالي وحده ممكن جدا .. يكفي أن نضيف لاستعلام SQL عبارة الاشتراط WHERE ونحيل على السجل الحالي في النموذج الحالي .. والتعديل بالمرفق

اقتباس
2- ماذا اذا حدث خطأ في الكود!! عندها سوف يتم تخزين سجل في الجدول الرئيسي لا يوجد له ابنا في اجدول التفاصيل!!

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

3- ماذا اذا انقطعت الكهربا فجئة!!!! نفس المشكلة ستحدث وقد اختبرت ذلك.

هذا أمر أرجو أن تتيح لي بعض الوقت لاختباره .. ومن يدري .. قد يكون أحدهم يقوم بالاختبارات الآن .. إيه همتكم يا شباب !!!

MasterDetail.rar

#14

السلام عليكم

اطلع على المشاركة رقم (61 و 62 و 63 ) من موضوع ( مساعدة في مشروع تحليل وتصميم نظام معلوماتي صيدلي ) على الرابط التالي:

/index.ph...84033&st=60

تم تعديل هذه المشاركة بواسطة alibukheet في 20 مايو 2007 في 19:52

العراق - البصرة

#15

طيب أيه رأيك فى الكود ده

Private Sub Command1_Click()
'On Error Resume Next
Dim dbs As Database, rst As Recordset, strsql As String
Dim x As Long
Set dbs = CurrentDb
strsql = "SELECT Master.MasterID, Master.MasterDate"
strsql = strsql & " FROM Master LEFT JOIN Detail ON Master.MasterID = Detail.MasterID"
strsql = strsql & " WHERE  (((Detail.MasterID) Is Null));"
Set rst = dbs.OpenRecordset(strsql)
Do While Not (rst.EOF)
	x = rst![MasterID]
	strsql = "Delete Master.MasterID"
	strsql = strsql & " FROM Master"
	strsql = strsql & " WHERE (((Master.MasterID)=" & x & "));"
	dbs.Execute strsql
	rst.MoveNext
Loop
Me.Requery
Set dbs = Nothing
rst.Close
End Sub
#16

السلام عليكم

اطلعت على المشاركات التي وجهتني إليها , بل وقرأت الموضوع برمته ولا أنكر أني استفدت الكثير من الأفكار والمعرفة على الأقل بمخاطبي , ولكن أخي علي لم أجد رابطا لما نحن فيه الآن هناك .. ربما لم أدقق كفاية .. أرجو المساعدة وشكرا

أخوك ابو تماضر

#17

الاخ العمرى ب شكرا لك .. الطريقة التي ذكرت ممتازة.

المهم ان المشاكل التي ذكرت في مشاركتي السابقة مازالت موجودة ولا اعتقد ان الكود اعلاه يعالجها كلها

بالمناسبة هل اطلعت على الموضوع التالي فهو له علاقة وثيقة بما نحن في صدد معالجته من مشاكل

العمليات Transactions

تحياتي

Whale

#18

اخ alasomed

لاحظ ان في سؤال الاخ Whale كان يتحدث عن مشكلة صادفت اغلب الاعضاء في المنتدى و هي فاتورة مبيعات او حسابات او فاتورة مخزنية ( المعلومات الرئيسية للفاتورة و التفاصيل ) حيث طلب كيفية معالجتها هذه هي المشكلة الاساسية بالنسبة لبرنامجه و لم يتحدث عن تكامل مرجعي ذو طرفين اذ لو كان كذلك اي وجود تكامل مرجعي ذو طرفين لاستلزم عدم ادخال اي سجل في اي من الجدولين حيث ان عملية ادخال البيانات في الجدول الرئيسي تمنع ادخال البيانات في جدول التفاصيل لانها تطلب ادخال سجل غير موجود في جدول التفاصيل و العكس يحدث ايضا عند ادخال بيانات في جدول التفاصيل غير موجودة في الجدول الرئيسي ولو ان العملية هذه منطقية لكانت ضمنت ضمن تطبيق الاكسس و هي غير منطقية و هو لم يطلب هذا التعقيد كما تصورت.

لذا احلته للطلاع على الرابط الموجود في مشاركتي السابقة حيث فيها طريقة لعملية ربط بين النموذج الرئيسي و نموذج التفاصيل لمستند مخزني طريقة معالجته او عمله شبيهه جدا بفاتورة حسابات مالية او مخزنية .

و يجب الانتباه الى ان الجدول الرئيسي يفترض ان يحتوي دائما على قيد او سجل واحد فقط !! ؟ .

تم تعديل هذه المشاركة بواسطة alibukheet في 21 مايو 2007 في 09:49

العراق - البصرة

#19

بسم الله الرحمن الرحيم

أخ Whale لقد قرأت المشاركة التى أشرت إليها والتى أدعو الله أن يجزيك عنها خيراً ولكن مع قوتها فأنى أضم صوتى للأخ أبو تماضر alasomed إذ أنها لا ترتبط بما نحن فيه الآن

إنها لا تحل

المشكلة التى أشرت إليها فى هذا المشاركة الحالية

..............................

أخى Whale يبدو أنك لم تراجع الكود الثانى جيدا هذا الكود الثانى يحل المشكلة الإولى المتعلقة بزيادة عدد السجلات أما المشكلة الثانية الخاصة بالقسمة على صفر فإنها غير موجودة أصلا ولو وجدت سنجد لها حل إن شاء الله

أما مشكلة إطفاء الكهرباء فإن إحتمال ما تسببه من مشاكل فى هذه المشاركة هو نفسه فى المشاركة التى أشرت إليها

أين الفرق...............................................

أنا أسف

عسى خير إن شاء الله

كبر دمغاك

#20

أخي العزيز Whale ... بعد التحية

سبق لي أن أرفقت لك القاعدة ... لكني لم أوضح لك طريقة العمل :

أولاً : يوجد مفتاحين 1. تخزين . 2. خروج

ثانياً : عند الضغط على تخزين يتم الحفظ للقيد حتى لو لم تدخل في النموذج الفرعي أي بيانات ، ولتلافي المشكلة اضغط على مفتاح خروج فلا يتم التخزين لا في النموذج الاساسي ولا في النموذج الفرعي... القاعدة موجودة في المشاركة السابقة رقم 8 الصفحة الاولى.

تم تعديل هذه المشاركة بواسطة kamal alnahhal في 21 مايو 2007 في 18:29

[يمين]

إذا كـان تـرك الـدين يعــنــي تقــدمــاً

فـيا نفــس مـوتــي قبــل أن تتقـدمــي

[/يمين]

#21

السلام عليكم

الاخ alasomed و الاخ alibukheet و الاخ العمرى بن و الاخ kamal alnahhal شكرا لكم جزيلا على الاهتمام بالموضوع

بالنسبة للخ الفاضل العمرى بن

اقتباس
أخ Whale لقد قرأت المشاركة التى أشرت إليها والتى أدعو الله أن يجزيك عنها خيراً ولكن مع قوتها فأنى أضم صوتى للأخ أبو تماضر alasomed إذ أنها لا ترتبط بما نحن فيه الآن

إنها لا تحل

المشكلة التى أشرت إليها فى هذا المشاركة الحالية

هذا في الظاهر فقط ولكن عندما نستخدم ال Recordset تبع النموذج فربما تتضح الامور (ما زلت ابحث في هذا -- على الاقل الان احضر موضوع عن استخدام ال Transaction مع النموذج) اعترف ان الامور ليست واضحة الان لكن نحن على الاقل مسكنا طرف الخيط, اليس كذلك؟

اقتباس
أخى Whale يبدو أنك لم تراجع الكود الثانى جيدا هذا الكود الثانى يحل المشكلة الإولى المتعلقة بزيادة عدد السجلات أما المشكلة الثانية الخاصة بالقسمة على صفر فإنها غير موجودة أصلا ولو وجدت سنجد لها حل إن شاء الله

بالطبع راجعت الكود وقد اعجبت به وهو فعلا يحل المشكلة الاولى..لاريب في ذلك

لكن بالنسبة لمشكلة القسمة على صفر فاحب ان اوضح ان الغرض منها هو محاكاة الاخطاء التي يمكن ان تطرا على النظام و مدى تاثيرها على الكود وسلامة تكامل البيانات و لم اقصد مشكلة القسمة على صفر بذاتها. ارجو ان يكون قد وضح الان

اقتباس
أما مشكلة إطفاء الكهرباء فإن إحتمال ما تسببه من مشاكل فى هذه المشاركة هو نفسه فى المشاركة التى أشرت إليها

أين الفرق...............................................

الفرق هنا كبير (الفرق بين السماء و الارض) فان استخدام ال Transaction سيمنع تخزين سجل في الجدول الرئيسي لا يوجد له ابناء.

مثال

-----

ادخل سجل في جدول الرئيسي و قبل دخول سجل في جدول التفاصيل انقطعت الكرباء!!!!

في الكود الذي تفضلتم به فسيحدث ان جدول الرئيسي سيحتوي على سجل لا يوجد له ابناء في جدول التفاصيل

اما في حالة استخدام ال Transaction فان العملية برمتها ستلغى اي سيحدف السجل من الجدول الرئيسي و ذلك لان العملية كما قلت ذرية اي اما جميع العمليات تنفذا عندها تقبل جميعا ولا اذا حدث خطا ما (كانقطاع الكهربا) فان جميع العمليات ستلغى

الاخ kamal alnahhal

اقتباس
سبق لي أن أرفقت لك القاعدة ... لكني لم أوضح لك طريقة العمل :

أولاً : يوجد مفتاحين 1. تخزين . 2. خروج

ثانياً : عند الضغط على تخزين يتم الحفظ للقيد حتى لو لم تدخل في النموذج الفرعي أي بيانات ، ولتلافي المشكلة اضغط على مفتاح خروج فلا يتم التخزين لا في النموذج الاساسي ولا في النموذج الفرعي... القاعدة موجودة في المشاركة السابقة رقم 8 الصفحة الاولى.

طريقتك رائعة كطرية اخينا العمرى بن ولكن مازالتا تعاني من مشاكل انقطاع الكهربا فجئة و مشاكل اخطاء النظام ... من منا يضمن نظام وندوز

في النهاية لا ادري اذا كان مفهوم الTransaction قد وصل ام لا

لدي فكرة لم تتبلور بعد وهي استخدام جداول مؤقتة!!! بصراح ما اريد ادوش نفسي بها الان الافضل اركز على ال Transaction اولا

تحياتي لكم جميعا

Whale

هذا الموضوع مغلق.

مواضيع مشابهة