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

تضارب السجل بين المستخدمين

بدأه o9oooo9o في 2 أبريل 2010 · 22 رد · 3,707 مشاهدة · في قواعد بيانات Microsoft Access
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

الاخوة الزملاء المحترمون

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

ارجو مساعدتي في مشكلتي حيث ان لدي نموذجين : نموذج1 ونموذج2 والنموذجين تعمل على الشبكة

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

وتقبلوا تحياتي....

db11.rar

تم تعديل هذه المشاركة بواسطة o9oooo9o في 2 أبريل 2010 في 04:49

d14.gif
#2

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

الأخ الكريم، ليس عليك أن تقلق حيال ذلك، إذ أن الأكسس بنفسه يستطيع معالجة الأمر من خلال خاصية القفل locking على مستوى السجلات. يمكنك ضبط هذه الخاصية كما في الشكل التالي:

post-70171-12701840161335_thumb.jpg

والله أعلم.

#3

استاذي/ أحمد صباح الخير...

لقد قمت بتطبيق عمليتك الموضحة اعلاه ومازالت نفس المشكلة قائمة لدي

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

وتقبل تحياتي.........زز

d14.gif
#4

اخي الفاضل

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

عند العمل على شبكة فمن الممكن حدوث تعارضات عن إدخال المستخدمين البيانات في نفس السجلات ، ويعالج البرنامج اكسس هذه المشكلة بطريقة تإمين السجلات ، Record Locks ، وعند إختيار الخاصية سجل محرر Edited Record ففي هذه الحالة عندما يفتح المستخدم النموذج يكون بجانب السجل الاول رمز مثل القلم وهذا يدل على أن النموذج حر ويمكن استخدامه ، وفي نفس الوقت لو فتح أحد المستخدمين هذا النموذج سيجد رمز القفل وهذا يدل على أن النموذج الآن قيد الاستخدام ولا يمكن إستخدامه في هذا الوقت . حتى يقوم المستخدم الاول بحفظ العمل ، كما نشاهد في الشكل تأمين السجلات في خصائص النموذج .

post-15367-12701917490621_thumb.gif

ملاحظة

يأخذ اكسس تقريباً 60 ثانية حتى يقوم بعرض العلامة ويمكن تغير هذه الفترة الزمنية من

أدوات Tools

خيارات Options

خيارات متقدمة Advanced

ثم من تحديث الفاصل الزمنى Refresh Interval

post-15367-12701918182703_thumb.gif

ثم تغير الزمن من 60 ثانية إلى الوقت المناسب ، ولو كان مثلا 5 يكون أفضل عندما تكون قاعدة البيانات متوسطة الحجم ، ومن نافذة خيارات متقدمة Advanced ، يمكن أن تحدد كثير من الخصائص المتعلقة بتحديث البيانات عند الاستخدام المشترك وتستطيع أن تجرب عدد من التجارب إلى أن تصل إلى أفضل المستويات الممكنة ،

post-15367-12701918947208_thumb.gif

لمزيد من المعلومات راجع

مشاركة قواعد البيانات اكسيس على الشبكة

/index.php?showtopic=78439

بالتوفيق

1
#5

الدكتورة / ام عهود المحترمة

شكراً لكي على مساعدتك ولكن الطريقة التي ذكرتيها لي لم تحل مشكلتي 100% ، لذى ارغب بان يتم مساعدتي في احد الحلين التالية:

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

أو

ان يتم تنبية المستخدمين ان العميل ناصر مشغول للتحديث بحيث يتم وضع كلمة ( مشغول ) في List Box في النموذج 1 بجانب بيانات العميل ناصر.

أرجو منكي مساعدتي...

وجزاااااك الله الف خير.........

تم تعديل هذه المشاركة بواسطة o9oooo9o في 2 أبريل 2010 في 10:50

d14.gif
#6

اخي الفاضل

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

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

اولا : بكل تأكيد طالما انك على الشبكه فهذا يعني ان قاعدة البيانات مقسمه الى قسمين ( قسم به النماذج وقسم به الجداول )

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

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

Private Sub LBox_DblClick(Cancel As Integer)
 On Error GoTo Err_LBox_DblClick
Dim dbcon As ADODB.Connection
Dim recrdst As ADODB.Recordset
Dim x As String
Dim stDocName As String
Dim stLinkCriteria As String

Set recrdst = New ADODB.Recordset
recrdst.CursorType = adOpenKeyset
recrdst.LockType = adLockOptimistic
Set dbcon = New ADODB.Connection
dbcon.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=\\ServerName\MyFolder\DB2.mdb;"

recrdst.Open "SELECT * FROM Mytable", dbcon
Set Me.Recordset = recrdst

	x = Me!LBox.ItemData(Me!LBox.ListIndex + 1)
 	stDocName = "Form2"

 stLinkCriteria = "[CostName]=" & "'" & x & "'"
	DoCmd.OpenForm stDocName, , , stLinkCriteria


recrdst.Close
dbcon.Close
Set recrdst = Nothing
Set con = Nothing

Exit_LBox_DblClick:
	Exit Sub

Err_LBox_DblClick:
If Err <> 2501 Then
	MsgBox Err.Description
End If
	Resume Exit_LBox_DblClick
End Sub

لاحظ معي في الكود العبارة التاليه ( Data Source=\\ServerName\MyFolder\DB2.mdb )

قم بتغيير ServerName الى اسم السيرفر لديك

قم بتغيير MyFolder اسم المجلد بما هو لديك اذا كانت قاعدة الجداول موجوده في مجلد واذا لم تكن كذلك قم بحذفه

قم بتغير DB2.mdb اسم قاعدة الجداول الى ما هو موجود لديك

عند قيامك بكافة التغييرات والربط بطريقة سليمه فبمجرد ان تفتح النموذج رقم 1 والنموذج رقم 2 لن يحدث اي مشكله وسترى جميع البيانات ظاهره أمامك

ثالثا : عند قيام اي مستخدم بتحرير اي سجل ولم يقم بحفظه بعد وفي هذه الأثناء قام مستخدم آخر بالدخول على نفس السجل فلن يستطيع التحرير او القيام بأي عملية على السجل وسيكون في حالة عدم تمكين حتى ينتهي المستخدم الأول من نفس السجل وحفظه والخروج منه .

DB.rar

بالتوفيق

1
#7

الدكتورة / أم عهود جزأك الله خير وحفظ الله عائلتك من كل شر على مساعدتك لي.

ولكن لدي استفسار بخصوص النقطة الأخيرة هل يمكن منع المستخدمين الآخرين من الدخول على نفس السجل في النموذج2 وإظهار رسالة تنبيه عند قيام أي مستخدم بتحرير السجل ولم يقم بحفظه بعد .

أو

لايمكن عمل ذلك بسبب إمكانيات الأكسس.

وتقبلي تحياتي ....

تم تعديل هذه المشاركة بواسطة o9oooo9o في 4 أبريل 2010 في 00:09

d14.gif
#8

اخي الفاضل

جرب هذا الكود وضعه في النموذج رقم 2 ( Form2 ) في حدث قبل التحديث فقد تنفع الطريقه

Private Sub Form_BeforeUpdate(Cancel As Integer)
If Forms("Form2").RecordLocks = 2 Then
 MsgBox "عذرا أخي الكريم ... السجل في طور التحديث من قبل مستخدم آخر .. انتظر قليلا", vbCritical + vbMsgBoxRight, "السجل مشغول"
DoCmd.CancelEvent
End If
End Sub

بالتوفيق

تم تعديل هذه المشاركة بواسطة zahrah في 4 أبريل 2010 في 01:30

2
#9

الدكتورة / أم عهود

لقد قمت بتطبيق الحل الموضح أعلاه ووضعت الكود في النموذج رقم 2 ( Form2 ) في حدث قبل التحديث فلم تنفع الطريقة ، حيث انه عند الضغط على بيانات عميل في طور التحديث من قبل مستخدم آخر في FORM1 يتم فتح FORM2 وهذا عكس طلبي ، حيث أن طلبي هوة عدم فتح FORM2 في حالة سجل العميل في طور التحديث من قبل مستخدم آخر وإظهار للمستخدم رسالة تنبيه ( "عذرا أخي الكريم ... السجل في طور التحديث من قبل مستخدم آخر.. انتظر قليلا ).

أسف جداً لإزعاجك وحفظكي الله أنتي وعائلتك من كل شر

وتقبلي تحياتي....

DB.rar

d14.gif
#10

أخي الكريم، أود أن أوضح هنا بعض المفاهيم المتعلقة بالتحديث المتزامن للبيانات، لعلها تسهم في فهمنا للمشكلة، وسبب عدم نفع الحلول المقترحة...

أولاً: مفاهيم عامة

عند وجود عدة مستخدمين لقاعدة بيانات، فإن احتمال محاولة أكثر من مستخدم تحديث نفس البيانات في نفس الوقت يصبح وارداً. مثلاً، قد يحاول مستخدمان تعديل بيانات نفس الزبون في جدول الزبائن في نفس الوقت. هذا التحديث المتزامن يضر بتكامل البيانات في قاعدة البيانات، ونستخدم مفهوم القفل locking من أجل التعامل مع هذه المشكلة.

القفل هنا يعني منع محاولة تحديث جزء من البيانات من قبل أي مستخدم إذا سبق أن وصل أحد المستخدمين إليها. الجزء المقفل من البيانات قد يكون صفحة page (ما مجموعه 4 كيلوبايت من البيانات) أو سجلاً واحداً (كما هو ممكن في Jet 4)، أو جدولاً كاملاً. أيضاً، فإن وقت القفل قد يكون عند فتح نموذج أو تقرير أو تشغيل استعلام، أو عند البدء في تحرير سجل، أو قد يتأخر القفل حتى محاولة حفظ التعديلات على سجل (هذا يكافئ عدم وجود قفل في الحقيقة).

الآن تأمل في الاحتمالات السابقة، ثم قارنها بخيارات القفل التي يوفرها لك الأكسس (انظر المشاركات رقم 2 و4 أعلاه). إذا اخترت خيار No Locks، فهو يعني تأخر القفل حتى وقت محاولة الحفظ الفعلي للسجل (وهذا الخيار يسبب ظهور رسالة خطأ تخبر بوجود تضارب في التحديث بين أكثر من مستخدم، وتعطي خيار التراجع، أو مسح تعديل المستخدم الأول، أو الحفظ في الـclipboard). يسمى هذا القفل أيضاً يالقفل المتفائل Optimistic، لأنه يفترض من باب التفاؤل أنه لن يحاول مستخدمان تحرير نفس السجل في نفس الوقت. الخيار All Records يقفل كامل الجدول عند معاينة أحد المستخدمين لتقرير أو استعلام مبني على هذا الجدول، أو تصفح سجلاته عبر نموذج. الخيار الأخير Edited Record هو الذي يقفل السجل عند بدء أي مستخدم تحرير السجل، فلا يسمح لأي مستخدم بعده بأكثر من معاينة السجل. ينتهي القفل عند الانتقال إلى سجل آخر. يسمى هذا القفل Pessimistic أو القفل المتشائم، لأنه يفترض من باب التشاؤم أنه بعد وصول مستخدم إلى أحد السجلات، والبدء في تحريره، فإن مستخدماً آخر سيحاول الوصول إليه أيضاً من أجل التعديل، ولذلك يحترز بقفل السجل مبكراً. لاحظ أن مربع الاختيار المسمى Open databse using record-level locking الموضح في الشكل في المشاركة رقم 2، هو الذي يضمن القفل على مستوى السجلات، وليس على مستوى الصفحة (الصفحة قد تحوي أكثر من سجل).

ثانياً: ملحوظات على الحلول المقترحة

من الجيد معرفة أنك تستطيع استخدام خيارات الأكسس العامة من قائمة أدوات أو خصائص القفل لكل نموذج، كما أنك تستطيع استخدام خصائص القفل لكائنات ADO recordsets لنفس الغرض. وعلى هذا فإن الكود الذي تفضلت به الأخت زهرة مشكورة في المشاركة رقم 6 هو طريقة أخرى لتأدية نفس المهمة في المشاركات الأولى، لكن عليه ملحوظتين:

1. نوع القفل المستخدم adLockOptimistic يكافئ خيار No Locks، وهو عكس المطلوب تماماً؛ المفروض استخدام adLockPessimistic هنا (يكافئ خيار Edited record).

2. المطلوب هو القفل على سجلات النموذج الثاني Form2 ، وليس سجلات النموذج الأول Form1؛ ولذلك فإن طريقة استخدام الكود ومكانه لم يكن مناسباً:

Set Me.Recordset = recrdst

هنا يتم تعيين مجموعة السجلات (التي يفترض أن تدعم القفل) لسجلات النموذج Form1، ثم يتم فتح النموذج الثاني بشكل طبيعي وبشكل منفصل تماماً عن مجموعة السجلات هذه!

3. الكود الأخير:

Private Sub Form_BeforeUpdate(Cancel As Integer)
If Forms("Form2").RecordLocks = 2 Then
 MsgBox "عذرا أخي الكريم ... السجل في طور التحديث من قبل مستخدم آخر .. انتظر قليلا", vbCritical + vbMsgBoxRight, "السجل مشغول"
DoCmd.CancelEvent
End If
End Sub

غير مناسب أبداً، لا من حيث المكان، ولا من حيث منطق الحل. أما من حيث المكان، فهو في حدث قبل التحديث: إذا كنا سنصل إلى هذه المرحلة، فما الحاجة إذاً للقفل من أساسه؟ وأما من حيث المنطق فإن خاصية RecordLocks ثابتة، وقيمتها هي الخيار الذي اخترته (No Locks، All Records أو Edited Record)، ولا تعكس أبداً الوضع الحالي للقفل. فإذا كنت ستختار الخيار الأخير (ورقمه 2)، فإنك حسب الكود ستعرض الرسالة دائماً للمستخدم، وتمنعه من التحديث، حتى لو كان هو الوحيد الذي يتصل بقاعدة البيانات!

ثالثاً: الحل المقترح هنا

هو تعيين خاصية Record Locks للنموذج Form2 إلى Edited Record، وكذلك من المفيد تعيين الخاصية Record Selectors إلى نعم، حتى ترى إشارة القفل عند فتح سجل يتم تحريره من قبل مستخدم آخر.

الآن قسم قاعدة البيانات إلى جزئين بواسطة معالج التقسيم، ثم انسخ نسخة أو أكثر من جزء الواجهة الأمامية (الجزء الذي يحوي النماذج)، واجعل نسخة لكل مستخدم.

هذا كل شيء. عندما يدخل أحد المستخدمين على Form2 (أي سجل)، ويبدأ في تحرير الإجابة، فإن هذا السجل سوف يقفل، فإذا فتح مستخدم آخر النموذج Form2 على نفس هذا السجل، فإنه سيشاهد علامة القفل، ولن يتمكن من تحرير السجل. دعك من نموذج Form1، فلا شأن له بالقفل هنا، وإنما هو لاختيار سجل من نموذج Form2.

هذا ما أحببت توضيحه، والله أعلم.

#11

الاستاذ / احمد

شكراً لك على الكلام الجميل

لكن هل يوجد حل برمجي لطلبي أو اتوقف هنا بسبب امكانيات الاكسس.

وتقبل فائق التحية والتقدير....

d14.gif
#12

أيها الأخ الكريم، لقد طرحت ما عندي بالفعل في آخر مشاركتي السابقة، تحت بند (ثالثاً: الحل المقترح هنا)، وأعيده هنا بشيء من التفصيل:

الملف الذي أرسلته يدعى db11، يحوي جدولاً ونموذجين. افتح النموذج Form2، وعدل خاصية القفل كالتالي:

post-70171-12705273885925_thumb.jpg

ثم عدل خاصية محدد السجلات كالتالي:

post-70171-12705274007461_thumb.jpg

استخدم الآن معالج التقسيم، من أجل تقسيم قاعدة البيانات إلى ملف يحوي الجدول، وآخر يحوي النموذج:

post-70171-12705274143996_thumb.jpg

اتبع الخطوات القليلة، فتحصل على ملفين: db11 وdb11_be إذا قبلت الاسم الافتراضي. الثاني هو الذي يحوي الجدول، أما الأول فيحوي النموذجين ويرتبط بالجدول في الملف الثاني.

الآن، خذ نسخة أخرى من ملف النموذجين:

post-70171-12705274218999_thumb.jpg

من المفترض أن كل مستخدم سيحصل على نسخة من هذا الملف. لنقم الآن بتجربة بسيطة، فنفتح كلا الملفين. أولاً، افتح النموذج Form2 في أحد النسختين على أحد السجلات (ستختار السجل من نموذج Form1)، ثم

ابدأ في تحرير هذا السجل. افتح النموذج Form2 في النسخة الأخرى على نفس السجل، ولاحظ إشارة القفل. أنت لا تستطيع الآن تحرير هذا السجل من النسخة الأخرى. الصورة التالية توضح هذه التجربة:

post-70171-12705274317439_thumb.jpg

#13

السلام عليكم

هل يعني تعديل الخصائص يجب أن يكون قبل التقسيم ؟؟

وهل عدم وصول الأخ السائل بمحاولاته الى نتيجة من هذا الباب ؟

−1
#14

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

اقتباس
هل يعني تعديل الخصائص يجب أن يكون قبل التقسيم ؟؟

وهل عدم وصول الأخ السائل بمحاولاته الى نتيجة من هذا الباب ؟

كلا بالطبع، يمكن تعيين الخصائص بعد التقسيم، المهم ألا ننسى أن نعين الخصائص لكل النسخ.

#15
أحمد مبارك الحيقي كتب:

ثانياً: ملحوظات على الحلول المقترحة

من الجيد معرفة أنك تستطيع استخدام خيارات الأكسس العامة من قائمة أدوات أو خصائص القفل لكل نموذج، كما أنك تستطيع استخدام خصائص القفل لكائنات ADO recordsets لنفس الغرض. وعلى هذا فإن الكود الذي تفضلت به الأخت زهرة مشكورة في المشاركة رقم 6

هو طريقة أخرى لتأدية نفس المهمة في المشاركات الأولى، لكن عليه ملحوظتين:

1. نوع القفل المستخدم adLockOptimistic يكافئ خيار No Locks، وهو عكس المطلوب تماماً؛ المفروض استخدام adLockPessimistic هنا (يكافئ خيار Edited record).

اخي الفاضل احمد مبارك

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

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

نقول وبالله التوفيق :

بالنسبة لإختيار القفل المستخدم adLockOptimistic فهو اختيار صحيح ولا يوجد به اي خطأ والسبب ان هذا القفل هو الذي من المفترض ان يستخدم في مثل هذه الحالة وهو على اسمه Lock فكيف تقول انه يكافئ No Locks فإن كان هذا القفل المستخدم adLockOptimistic لا يعني قفل السجل / السجلات فمن باب اولى عدم استخدامه بالكلية .

القفل المتفائل : يقوم بقفل السجل / السجلات فقط قبل حفظ التغيير ، ويقوم بالإفراج عن السجل بعد الحفظ .

القفل المتشائم : يقوم بقفل السجل / السجلات بمجرد تحرير السجل/ السجلات مباشرة ، ويبقى مغلقا حتى يتم حفظ السجل / السجلات أو إلغاء التغييرات .

adLockOptimistic: record is locked just before saving the change, and freed again after the save.

adLockPessimistic: record is locked as soon as editing of the record begins, and remains locked until the record is saved or changes are cancelled.

اذاً كلا الخاصيتين تقومان بقفل السجل / السجلات في حالة الإستخدام .

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

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

اذا الخيار المنطقي المفترض العمل به هو الخيار الأول ( القفل المتفائل ) لمرونته وتقليل زمن القفل على السجل / السجلات .

ايضا لا توجد اي مشكله مع البيانات في حالة استخدام أي من الحالتين .

معظم المستخدمين يختارون adLockOptimistic لتقليل وقت القفل ، ويمكن تغييرها عندما يكتشف أنها تخلق بعض مشاكل .

There is no issue with data corruption in either case.

Most users choose adLockOptimistic to minimize lock time, and then change it if and when they discover it is creating problems .

ولزيادة المعلومات عن تلك الخاصييتن

1. الخاصية : adLockOptimistic

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

*. عند استخدام CursorLocation تستطع هذه الخاصية توفير الدعم على جهتين فمره تستطيع استخدامها ناحية الملقم adUseServer او قد تستخدمها ناحية العميل adUseClient

2. الخاصية : adLockPessimistic

*. لا يوجد بها اي مرونه فإن قام شخص ما على الشبكه بتحرير السجل فيفتح الله على باقي المستخدمين وعليهم الإنتظار حتى يتم الإفراج عن هذا السجل .

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

راجع المواضيع التالية :

http://www.developer.com/tech/article.php/721911/Locking-Recordsets-in-Microsoft-Access-2000.htm

/index.php?showtopic=157337

http://dev.mysql.com/tech-resources/articles/vb-cursors-and-locks.html

http://support.microsoft.com/kb/190625

http://support.microsoft.com/kb/249167

http://support.microsoft.com/kb/289675

http://technet.microsoft.com/en-us/magazine/2009.05.scriptingguys.aspx?pr=blog

http://technet.microsoft.com/en-us/library/dd769861%28BTS.10%29.aspx

http://technet.microsoft.com/en-us/library/dd785923%28BTS.10%29.aspx

http://support.sas.com/documentation/tools/oledb/rr_locking.htm

http://www.dbforums.com/microsoft-access/1038342-adlockpessimistic-adlockoptimistic-last-post.html

http://www.sqlteam.com/article/server-side-cursors-and-ado-cursor-types

حسنا استاذنا الفاضل احمد مبارك

اريدك فقط تقوم بالتطبيق وتختار احدى الحالتين في كل مره ( adLockOptimistic ) او ( adLockPessimistic ) وتتأكد بارك الله بك هل يظهر رمز القفل على السجل سواء في الجدول او النموذج اثناء تحرير سجل محرر .

من الضروري تبلغني بالنتيجه بكل أمانه وصدق حتى اقوم بتصحيح معلوماتي التي عفى عليها الزمن وشرب فيحتمل ان يكون رأيي خطأ يحتمل الصواب ورأيك صواب يحتمل الخطأ .

أحمد مبارك الحيقي كتب:

2. المطلوب هو القفل على سجلات النموذج الثاني Form2 ، وليس سجلات النموذج الأول Form1؛ ولذلك فإن طريقة استخدام الكود ومكانه لم يكن مناسباً:

Set Me.Recordset = recrdst

هنا يتم تعيين مجموعة السجلات (التي يفترض أن تدعم القفل) لسجلات النموذج Form1، ثم يتم فتح النموذج الثاني بشكل طبيعي وبشكل منفصل تماماً عن مجموعة السجلات هذه!

اخي الفاضل احمد : هل صحيح ما تقوله في هذه العباره !!!!!!!!!

هذا يعني ان سجلات النموذج الأول Form1 مختلفه تماما عن سجلات النموذج الثاني Form2 !!!!!!!!

وكأنك تقول ان مصدر سجلات النموذج الأول من جدول وسجلات النموذج الثاني من جدول آخر لا علاقة له بالقاعدة .

ياسيدي مصدر السجلات سواء للنموذج الأول او الثاني هو الجدول MyTable ولا يوجد مصدر غيره في القاعده الثانية

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

أحمد مبارك الحيقي كتب:

3. الكود الأخير:

Private Sub Form_BeforeUpdate(Cancel As Integer)
If Forms("Form2").RecordLocks = 2 Then
MsgBox "عذرا أخي الكريم ... السجل في طور التحديث من قبل مستخدم آخر .. انتظر قليلا", vbCritical + vbMsgBoxRight, "السجل مشغول"
DoCmd.CancelEvent
End If
End Sub

غير مناسب أبداً، لا من حيث المكان، ولا من حيث منطق الحل. أما من حيث المكان، فهو في حدث قبل التحديث: إذا كنا سنصل إلى هذه المرحلة، فما الحاجة إذاً للقفل من أساسه؟ وأما من حيث المنطق فإن خاصية RecordLocks ثابتة، وقيمتها هي الخيار الذي اخترته (No

Locks، All Records أو Edited Record)، ولا تعكس أبداً الوضع الحالي للقفل. فإذا كنت ستختار الخيار الأخير (ورقمه 2)، فإنك حسب الكود ستعرض الرسالة دائماً للمستخدم، وتمنعه من التحديث، حتى لو كان هو الوحيد الذي يتصل بقاعدة البيانات!

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

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

الله يصلحك ويهديك

قول آآآآآآآآآمين

أحمد مبارك الحيقي كتب:

ثالثاً: الحل المقترح هنا

هو تعيين خاصية Record Locks للنموذج Form2 إلى Edited Record، وكذلك من المفيد تعيين الخاصية Record Selectors إلى نعم، حتى ترى إشارة القفل عند فتح سجل يتم تحريره من قبل مستخدم آخر.

الآن قسم قاعدة البيانات إلى جزئين بواسطة معالج التقسيم، ثم انسخ نسخة أو أكثر من جزء الواجهة الأمامية (الجزء الذي يحوي النماذج)، واجعل نسخة لكل مستخدم.

هذا كل شيء. عندما يدخل أحد المستخدمين على Form2 (أي سجل)، ويبدأ في تحرير الإجابة، فإن هذا السجل سوف يقفل، فإذا فتح مستخدم آخر النموذج Form2 على نفس هذا السجل، فإنه سيشاهد علامة القفل، ولن يتمكن من تحرير السجل. دعك من نموذج Form1، فلا

شأن له بالقفل هنا، وإنما هو لاختيار سجل من نموذج Form2.

هذا ما أحببت توضيحه، والله أعلم.

بالنسبة لحلك المقترح فقد قمنا بعمله في القاعدة التي قمنا بإرفاقها في المشاركه رقم 6

post-15367-12705497828046_thumb.gif

حاول تقوم بتحميلها فقد تم تحميلها 26 مره

وانظر للمجلد وستجد به قاعدتين db1 وهي الرئيسية وبها النماذج فقط ومرتبطه مع القاعدة الثانية db2 والتي بها الجدول MyTable

افتح خصائص النماذج وستجد انه تم وضع تأمين السجلات على ( سجل محرر )

وعلى قولك هذا ما أحببت توضيحه، والله أعلم.

للإستفادة وزيادة المعرفه راجع المراجع التالية :

http://dev.mysql.com...-and-locks.html

http://technet.micro...y/ee692915.aspx

http://www.adopensta...cursortypes.asp

http://technet.micro...riptingguy.aspx

http://support.microsoft.com/kb/188857

http://support.microsoft.com/kb/283874

http://en.wikipedia....imistic_locking

http://api.rubyonrai...Optimistic.html

http://api.rubyonrai...essimistic.html

http://developer.mim.../feature_15.htm

http://blogs.technet...er-29-2009.aspx

http://en.allexperts...base-lock-1.htm

تم تعديل هذه المشاركة بواسطة zahrah في 6 أبريل 2010 في 17:26

3 −5
#16

بعد اذا الاخوة الافاضل

الاخ السائل

بالتأكيد استخدام خاصية قفل السجلات صحيحة و تعطى النتيجة المرجوة

و لكن على حد علمى القليل لا يمكننا ارجاعها من الكود لتعطى رسالة بأن السجل مغلق

لذلك ففى المرفق طريقة اخرى

حيث يتم الغلق من النموذج عن طريق حقل فى الجدول و يتم الفتح عند اغلاق الجدول

يمكنك ضبط عملية فتح و اغلاق السجل حسب متطلباتك

يمكن تطبيق ذلك على نماذج نقس القاعدة او نماذج قاعدتين مختلفتين مرتبطتين بنفس القاعدة الخلفية

تم الطبيق على النموذج form2 فى القاعدتين

اتمنى ان يفى المرفق بالغرض منه

قفل التعديل لاكثر من مستخدم.rar

2

مدونتى:-

احترف الأكسس مع أبو يوسف

متغيب حاليا لانشغالى الشديد

#17

اخي الفاضل ابا سيف

بارك الله بك وجزاك الله كل خير

على المشاركه وعلى هذا الحل الجميل

+1

بالتوفيق

تم تعديل هذه المشاركة بواسطة zahrah في 6 أبريل 2010 في 14:56

2 −1
#18

اشكرك اختى الفاضلة

و جزاك الله خيرا

اخيكم أبا يوسف

تم تعديل هذه المشاركة بواسطة mrnooo2000 في 7 أبريل 2010 في 01:14

1

مدونتى:-

احترف الأكسس مع أبو يوسف

متغيب حاليا لانشغالى الشديد

#19

بارك الله فيك أخي وحبيبي أبو يوسف ،

وجزاك الله كل خير والأخوة المشاركين ، ومشكور لكل من الأساتذة الكرام على التوضيح . ;)

تم تعديل هذه المشاركة بواسطة hamidymom في 6 أبريل 2010 في 15:39

post-12787-12741339659298.jpg

ومامن يد إلا يد الله فوقها *** وما من ظالم إلا سيبلى بأظلم

تفضل أخي الكريم | موسوعة الحميدي الذهبية | بأجزائها الثلاثة مع هدية الموسوعة .

#20

اخي ابا يوسف

نعم ياخي هذا هوه طلبي ، اعجز عن شكرك فانت تستاهل شي اكثر من ذلك

جزاك الله خير انته والاخوة المشاركين والأساتذة الكرام على التوضيح

+2

شكراً لكم جميعاً وتقبلوا تحياتي

d14.gif
#21

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

وعليكم السلام ورحمة الله وبركاته، وبعد...

أولاً: أنصح نفسي وأختي الكريمة زهرة، بعدم الرد مع الانفعال والتسرع، لأن ذلك يورث الزلل.

ثانياً: سبق أن تكرر هذا السيناريو قريباً في موضوع آخر، وعندما رددت في آخر رد، وشددت قليلاً جداً من لهجتي، مبيناً بعض الأخطاء الفادحة، تم إخفاء المشاركة فوراً. أنا هنا أعود فأقول نفس الكلمات: ببساطة لا أحب القمع! وهذا لا يتنافى مع ميلي دوماً إلى الاقتصاد الشديد في الرد، ولا مع التزامي الرصانة العلمية في النقاش. فقط، أرجو أن يكون نصيب هذا الرد أفضل من نصيب صاحبه (على الأقل، احتراماً للأعضاء الآخرين).

ثالثاً: اقتباس من كلام الأخت زهرة

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

أقترح تأجيل هذه الكلمات (غير اللائقة) إلى الأخير، فربما تغير رأيك أختي الكريمة.

=====================================================

اقتباس من كلام الأخت زهرة:

اقتباس
بالنسبة لإختيار القفل المستخدم adLockOptimistic فهو اختيار صحيح ولا يوجد به اي خطأ والسبب ان هذا القفل هو الذي من المفترض ان يستخدم في مثل هذه الحالة وهو على اسمه Lock فكيف تقول انه يكافئ No Locks فإن كان هذا القفل المستخدم adLockOptimistic لا يعني قفل السجل / السجلات فمن باب اولى عدم استخدامه بالكلية .

سبب هذا الكلام هو عدم الدقة في الفهم والنقل. هذه هي كلماتي:

اقتباس
1. نوع القفل المستخدم adLockOptimistic يكافئ خيار No Locks، وهو عكس المطلوب تماماً؛ المفروض استخدام adLockPessimistic هنا (يكافئ خيار Edited record).

فأنا لا أقول أن هذا النوع لا يعني قفل السجلات، بل إنني أثبت في أول كلمتين أنه من أنواع القفل، لكنني أقول أنه يكافئ خياراً من خيارات القفل في الأكسس اسمه No Locks. وهذا صحيح، لأنه يشترك معه في الأثر والناتج النهائي. عوضاً عن الاستطراد في الشرح، أسوق هذا الاقتباس من ملفات المساعدة (وتوجد نسخة منه في إحدى صفحات الموقع msdn لمايكروسوفت):

post-70171-12705756325565_thumb.jpg

=======================================================

اقتباس من كلام الأخت زهرة:

اقتباس
القفل المتفائل : يقوم بقفل السجل / السجلات فقط قبل حفظ التغيير ، ويقوم بالإفراج عن السجل بعد الحفظ .

القفل المتشائم : يقوم بقفل السجل / السجلات بمجرد تحرير السجل/ السجلات مباشرة ، ويبقى مغلقا حتى يتم حفظ السجل / السجلات أو إلغاء التغييرات .

ولهذا بالضبط قلت إن الخيار الأول عكس مطلوب الأخ السائل (راجعي السؤال من فضلك). أما بشكل عام، فقد كنت شخصياً أستخدم دوماً القفل المتفائل عندما كنت أستخدم ADO فيما مضى.

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

=======================================================

اقتباس من كلام الأخت زهرة:

اقتباس
اخي الفاضل احمد : هل صحيح ما تقوله في هذه العباره !!!!!!!!!

هذا يعني ان سجلات النموذج الأول Form1 مختلفه تماما عن سجلات النموذج الثاني Form2 !!!!!!!!

وكأنك تقول ان مصدر سجلات النموذج الأول من جدول وسجلات النموذج الثاني من جدول آخر لا علاقة له بالقاعدة .

ياسيدي مصدر السجلات سواء للنموذج الأول او الثاني هو الجدول MyTable ولا يوجد مصدر غيره في القاعده الثانية

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

أولاً: أنا لا أتكلم بتاتاً عن الجداول كمصدر للسجلات؛ هذه هي كلماتي:

اقتباس
هنا يتم تعيين مجموعة السجلات (التي يفترض أن تدعم القفل) لسجلات النموذج Form1، ثم يتم فتح النموذج الثاني بشكل طبيعي وبشكل منفصل تماماً عن مجموعة السجلات هذه!

أنا أتكلم هنا بشكل واضح عن مجموعة السجلات. من المعلوم أن مجموعة سجلات نموذج، هي كائن منفصل عن مجموعة سجلات نموذج آخر، بغض النظر عن مصدر مجموعات السجلات هذه. ليس هذا فحسب، بل إن مجموعة سجلات Form1 هنا هي من نوع ADO recordset، أما مجموعة سجلات النموذج Form2 هي من نوع DAO recordset. هل تبين لك الفرق يا أختي الكريمة؟ (أرجو مراجعة المصادر من أجل المزيد عن مجموعات السجلات والتقنيات المختلفة).

ثانياً: وهو المهم هنا...

اقتباس
2. المطلوب هو القفل على سجلات النموذج الثاني Form2 ، وليس سجلات النموذج الأول Form1؛ ولذلك فإن طريقة استخدام الكود ومكانه لم يكن مناسباً

هذا صحيح، وربما يتضح لك الأمر لو سألتك هذا السؤال: أين يتم التعديل؟ في النموذج Form1 أم النموذج Form2؟ طبعاً في النموذج Form2. فلماذا إذاً تم تعيين خصائص القفل لمجموعة سجلات النموذج Form1، ثم تم إغلاق مجموعة السجلات هذه مباشرة! في الحقيقة، إذا اعتمدنا على هذه الآلية فقط دون تعيين خاصية Recordocks للنموذج Form2 إلى Edited Record، فإن شيئاً لا يحدث!

===================================================

اقتباس من كلام الأخت زهرة:

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

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

الله يصلحك ويهديك

قول آآآآآآآآآمين

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

============================================================

اقتباس من كلام الأخت زهرة:

اقتباس
بالنسبة لحلك المقترح فقد قمنا بعمله في القاعدة التي قمنا بإرفاقها في المشاركه رقم 6

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

هذا ما أحببت توضيحه، والله أعلم.

#22

اخي الفاضل أحمد مبارك

بارك الله بك وجزاك الله كل خير على الرد والمشاركه

اولا : احمد الله انني لست متسرعه في الردود على الأعضاء او اثارة حفيظتهم واستفزازهم بل على العكس فقد وهبني الله قوة تحمل قد لا تطيقها انت والصبر وطولة البال .

ولهذا دائما يقال " اتق شر الحليم اذا غضب "

لأنه يصبر ويتحمل ويسكت الى ابعد الحدود ثم اذا غضب قد يتحول الى كارثه .

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

وايضا تكرر السيناريو هنا في هذه المشاركه فأسألك بالله العظيم انت تجيب بكل أمانه وصدق :

1. المشاركه رقم 1 ( العضو يسأل )

2. المشاركه رقم 2 : انت تجيب عليه

3. المشاركه رقم 3 : ( العضو يستفسر )

4. المشاركه رقم 4 : اقوم بالمشاركه والرد على العضو ( من بداية هذه المشاركه هل تعرضت لك او حتى انتقدت اجابتك او عقبت عليها ) ؟؟؟؟؟؟؟؟؟؟؟؟؟

5. المشاركه رقم 5 : ( العضو يستفسر مرة أخرى )

6. المشاركه رقم 6 : اقوم بالرد عليه ( وايضا لم اعرض لك لا من قريب ولا من بعيد ) ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

7. المشاركة رقم 7 : ( العضو يستفسر مرة أخرى )

8 . المشاركه رقم 8 : اقوم بالرد عليه ( وايضا لم اعرض لك لا من قريب ولا من بعيد ) ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

9. المشاركة رقم 9 : تبدأ بتكرار السيناريو السابق وتقوم كما تقول بتصحيح المفاهيم والرد علينا اعتبارا من " ثانياً: ملحوظات على الحلول المقترحة "

( اخبرني الآن من الذي بدأ أنا أم انت )

10 . المشاركة رقم 10 ( لم اعقب عليك في وقتها وكا بإمكاني ذلك )

11. المشاركه رقم 11 ( لم اعقب عليك )

12. المشاركه رقم 12 ( لم اعقب عليك )

13 . المشاركه رقم 13 ( لم اعقب عليك )

14 . المشاركه رقم 14 ( لم اعقب عليك )

15 . المشاركه رقم 15 ( قمت بالتعقيب عليك ) وتصحيح مفهوم الفرق بين الخاصيتين adLockOptimistic و adLockPessimistic

وكما تعلم انني وضعت في الكود الخاصية adLockOptimistic لأنني ارى انها الأنسب والأفضل ليس هذا من رأيي ولكن رأي كل المصادر والخبراء وقد وضعت لك الروابط كي تطلع عليها وتتأكد من دقة المعلومه .

الآن دعنا من كل الكلام السابق واريد منك فقط ان تشرح لنا ولباقي الأعضاء هذه العبارة من كلامك في مشاركتك

أحمد مبارك الحيقي كتب:

المفروض استخدام adLockPessimistic

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

zahrah كتب:

ولزيادة المعلومات عن تلك الخاصييتن

1. الخاصية : adLockOptimistic

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

*. عند استخدام CursorLocation تستطع هذه الخاصية توفير الدعم على جهتين فمره تستطيع استخدامها ناحية الملقم adUseServer او قد تستخدمها ناحية العميل adUseClient

2. الخاصية : adLockPessimistic

*. لا يوجد بها اي مرونه فإن قام شخص ما على الشبكه بتحرير السجل فيفتح الله على باقي المستخدمين وعليهم الإنتظار حتى يتم الإفراج عن هذا السجل .

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

راجع المواضيع التالية :

http://www.developer...Access-2000.htm

http://www.arabteam2...howtopic=157337

http://dev.mysql.com...-and-locks.html

http://support.microsoft.com/kb/190625

http://support.microsoft.com/kb/249167

http://support.microsoft.com/kb/289675

http://technet.micro...ys.aspx?pr=blog

http://technet.micro...8BTS.10%29.aspx

http://technet.micro...8BTS.10%29.aspx

http://support.sas.c.../rr_locking.htm

http://www.dbforums....-last-post.html

http://www.sqlteam.c...do-cursor-types

ولكن اذا عُرف السبب بطل العجب :

والسبب ان الأخت زهره استخدمت الخاصية adLockOptimistic في الكود

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

يا أخي حتى من اسم الخاصية انها متشائم وتنظر للدنيا بنظرة سوداويه :mad: اعاذنا الله واياكم من التشاؤم والمتشائمين .

عموما اخي احمد لم يحصل إلا كل خير وقد يكون هناك اختلاف في وجهات النظر ولكن هذا لا يفسد للود قضيه

والأيام دول مرة عليك ومرات عليك :)

وعلى رأيك هذا ما أحببت توضيحه، والله أعلم.

#23

الأساتذة الكرام

صلو على النبي واذكرو الله ماحصل غير كل خير

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

d14.gif

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