اذهب الي المحتوي
أوفيسنا

منع تكرار القيمة في السجل الواحد


الردود الموصى بها

اصدقائي الاكارم

وردت مواضيع كثيرة عن عدم تكرار القيم في السجلات و لكن لم يرد اي موضوع عن تكرار القيمة في سجل واحد

المرفق التالي فيه نموذج يحتوي على ثمانية حقول في السجل الواحد

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


If Me.item1 = Me.item2 Then

MsgBox "rr"

ElseIf Me.item1 = Me.item3 Then

MsgBox "rr"

ElseIf Me.item1 = Me.item4 Then

MsgBox "rr"

ElseIf Me.item1 = Me.item5 Then

MsgBox "rr"

ElseIf Me.item1 = Me.item6 Then

MsgBox "rr"

ElseIf Me.item1 = Me.item7 Then

MsgBox "rr"

End If

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

هل من طريقة لتحسين هذا الكود ؟؟؟؟

منع تكرار القيمة في نفس السجل.rar

رابط هذا التعليق
شارك

بعد التفكير و التحليل لبعض تطبيقات الاخوة في النتدى توصلت لهذا الكود

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

بعبارة اصح

لنفرض تم ادخال القيمة 10 في الحقل الأول

و تم ادخال القيمة 10 في الحقل الثاني

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

نغير قيمة الحقل 2 الى 20 يبقى الكود يعطي مكرر

ماهو الحل ( بدون استخدام الامر docmd.runcommand accmd saverecord) ؟؟؟؟؟

منع تكرار القيمة في نفس السجل 2.rar

رابط هذا التعليق
شارك

اصدقائي الاكارم

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

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

كما تم منع الكود من مقارنة الحقل مع نفسه ( اي ان الكود لا يقارن الحقل الاول اذا تم ادخال بيانات في الحقل الاول و لا يقارن الحقل الثاني عند ادخال بيانات في الحقل الثاني و هكذا )

هذا هو الكود


Sub testFields()

On Error Resume Next

Dim i, j, k, m As Variant

Dim aa As Recordset

Set aa = Me.Recordset

With aa

For i = 0 To .Fields.Count

j = .Fields(i)

m = .Fields(i).Name

	For k = 0 To .Fields.Count - 1

		If .Fields(k).SourceField <> .Fields(m).SourceField Then

			If j = .Fields(k) Then

			MsgBox "الحقل مكرر"

			Exit Sub

			End If

		End If

	Next k

Next i

End With

End Sub

وفي حدث ( بعد التحديث لاي حقل )

Me.Refresh

Call testFields

كيف يمكنني وضع الكود في وحدة نمطية لاستدعاءه في اي نموذج

وهل يوجد اي تعديل يجعل الكود اكثر مرونة و كفاءة

منع تكرار القيمة في نفس السجل 3.rar

رابط هذا التعليق
شارك

الكود السابق يعمل بشكل جيد ولكن هناك ما يعيبه

وهو ان الكود يبدأ بالمقارنة من اول حقل الى آخر حقل مع قيمة كافة الحقول عند الاستدعاء كل مرة

وبتفصيل اكثر

لنفرض تم ادخال قيمة في الحقل الاول

بدا الكود بمقارنة قيمة الحقل الاول مع الثاني فالثالث .... الخ

ثم يبدا بمقارنة الثاني مع الاول فالثالث ... الخ

ثم الثالث مع الاول فالثاني ... الخ ( دوخة )

وعند ادخال اي قيمة في اي حقل يتم تنفيذ الكود من البداية

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

لنفرض تم ادخال البيانات في الحقل الخامس

يبدا من الحقل الاول الى السابع و ينهي الحلقة

ثم تم ادخال البيانات في الحقل السادس

يبدا من الاول حتى السابع و ينهي الحلقة

اي ان الكود ينفذ مرة واحدة فقط

وانا مازلت بانتظار النتائج

منع تكرار القيمة في نفس السجل 4.rar

رابط هذا التعليق
شارك

أخي العزيز

مسألة مقارنة الحقول في نفس السجل مسألة غير متصورة كثيراً كونها - وأصدقك القول - لم تمَر حاجاتها معي في حياتي البرمجية.

ومنذ ظهر أمس وأنا أفكر في مسألة يلزمني فيها أن أقارن كل حقل بسابقه في النموذج وقبل حفظ السجل ، فلم يخطر ببالي شيئ

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

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

رابط هذا التعليق
شارك

اخي ابو آدم نورت الموضوع

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

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

مثلا تم تكرار مادة تجربة 1 في البند الاول و الثاني و مجموع المادة في البندين 10 ( كل بند 5 )

و كمية المادة الموجودة في المستودع 5

من المفترض ظهور رسالة بان الكمية الحالية هي اقل من الكمية المطلوب بيعها ولكن الكود يقارن كمية المادة الموجودة في المستودع مع كمية المادة المطلوبة في البند الحالي ( 1 او 2 )

لذلك خطرت لي فكرة منع تكرار اسم المادة في الفاتورة الواحدة

رابط هذا التعليق
شارك

اخوي ايمن بارك الله فيك

لقد قمت بتسمية الوحده النمطية ب "TestFields" و قمت بتسمية الاجراء بدخال هذه الوحدة ب "TestFields"

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

رابط هذا التعليق
شارك

اخي الكريم bluemind

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

قمت باعادة تسمية الوحدة النمطية و لكن الكود لا يعمل بشكل صحيح

فعند ادخال اي قيمة يعطي رسالة بتكرار قيمة الحقل

عندما تضع الكود في نفس النموذج يكون كالتالي

Dim aa As Recordset

Set aa = Me.Recordset

و عندما وضعته في وحدة نمطية ظهر خطأ تحت كملة Me

قمت بتغييرها الى Form

ولكن للاسف لم ينجح الكود

منع تكرار القيمة في نفس السجل 7.rar

رابط هذا التعليق
شارك

  • 3 months later...

اخي ابو آدم نورت الموضوع

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

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

مثلا تم تكرار مادة تجربة 1 في البند الاول و الثاني و مجموع المادة في البندين 10 ( كل بند 5 )

و كمية المادة الموجودة في المستودع 5

من المفترض ظهور رسالة بان الكمية الحالية هي اقل من الكمية المطلوب بيعها ولكن الكود يقارن كمية المادة الموجودة في المستودع مع كمية المادة المطلوبة في البند الحالي ( 1 او 2 )

لذلك خطرت لي فكرة منع تكرار اسم المادة في الفاتورة الواحدة

اخي ابو آدم نورت الموضوع

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

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

مثلا تم تكرار مادة تجربة 1 في البند الاول و الثاني و مجموع المادة في البندين 10 ( كل بند 5 )

و كمية المادة الموجودة في المستودع 5

من المفترض ظهور رسالة بان الكمية الحالية هي اقل من الكمية المطلوب بيعها ولكن الكود يقارن كمية المادة الموجودة في المستودع مع كمية المادة المطلوبة في البند الحالي ( 1 او 2 )

لذلك خطرت لي فكرة منع تكرار اسم المادة في الفاتورة الواحدة

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

If QTY.Value < STQ.VALUE Then

DoCmd.CancelEvent

MsgBox "NULL STOCK "

DoCmd.GoToRecord , , acNewRec

حيث ان STQ هي الكمية بالمستودع

و QTY هي الكمية التي تريد اخراجها

رابط هذا التعليق
شارك

  • 4 years later...

استاذ محمد ايمن (شعلة المنتدى)

هل توصلت لحل ؟ اعجبني الموضوع وعند مروري بالصدفة

تحياتي

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

السلام

مساء الخير

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

هذا موضوعي

قد تستفيد

 

تو انتبه انو انت الي عملت لي الكود

ههههه

 

 

 

طيب كمل جميلك معي

واضف لي شرط عدم الكرار ل اسم الدواء بدل الكود او عالاقل 2 مع بعض

رابط هذا التعليق
شارك

تحية طيبة استاذنا الغالي رمهان

هناك مقولة ( كلما ازداد علمي ازداد علمي بجهلي )

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

طبعا كان السبب هو قلة خبرتي في الاكواد في ذلك الوقت ( منذ 4 سنوات تقريبا )

الحمدلله وصلت للحل و لكن ابتعادي عن المنتدى في الفترة الماضية هو ما انساني اكمال الموضوع

منع تكرار القيمة في نفس السجل 10.rar

  • Like 1
رابط هذا التعليق
شارك

جميل استاذ محمد وبوركت

ولدي استفسار : لماذا وضع الاجراء في كلاس وليس وحدة نمطية عامة ؟

وهذه مشاركة بفكرة لعل بها فائدة

 

منع تكرار القيمة في نفس السجل.rar

رابط هذا التعليق
شارك

تحية طيبة استاذي الكريم

الفكرة في المرفق الثاني رائعة لكن لو اردنا تطبيقها على ثلاث نماذج !!!!!!

وكل نموذج يحتوي على عشر حقول يكون الناتج 3*10 =30 سطر

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

 

منذ ساعه, رمهان said:

ولدي استفسار : لماذا وضع الاجراء في كلاس وليس وحدة نمطية عامة ؟

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

رابط هذا التعليق
شارك

تمام استاذ محمد

وضحت الصورة

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

Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim c As New Collection
On Error Resume Next
For Each ct In Me.Section(0).Controls
If ct.Tag = "ramhan" Then c.Add ct, ct: i = i + 1
Next
If c.Count <> i Then Cancel = MsgBox("يوجد تكرار")
End Sub

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

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

بالتوفيق

منع تكرار القيمة في نفس السجل.rar

رابط هذا التعليق
شارك

في ٢٢‏/٩‏/٢٠١٦ at 05:23, رمهان said:

Private Sub Form_BeforeUpdate(Cancel As Integer) Dim c As New Collection On Error Resume Next For Each ct In Me.Section(0).Controls If ct.Tag = "ramhan" Then c.Add ct, ct: i = i + 1 Next If c.Count <> i Then Cancel = MsgBox("يوجد تكرار") End Sub

تحية طيبة استاذ رمهان

ممكن شرح الكود

رابط هذا التعليق
شارك

Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim c As New Collection تعرف متغير من نوع كولشن ليتم استخدام وظائفه
On Error Resume Next الخطأسيحصل عند تكرار احد القيم
For Each ct In Me.Section(0).Controls الدوران على العناصر التي بجزء التفصيل 
If ct.Tag = "ramhan" Then c.Add ct, ct: i = i + 1  الدوران على العناصر التي التاق لديها باسم رمهان واذا هناك تكرار لن يضيف للقائمة
Next If c.Count <> i Then Cancel = MsgBox("يوجد تكرار") this هذا فكرة الحل وهو المقارنة بين عداد عدد العناصر والقيم المضافة فلو حصل تكرار ستكون عدد القيم اقل من عدد الحقول وهذا مؤشر للتكرا
End Sub

هذا ومارايك بالفكرة استاذ محمد ؟

تحياتي

  • Like 2
رابط هذا التعليق
شارك

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان
  • تصفح هذا الموضوع مؤخراً   0 اعضاء متواجدين الان

    • لايوجد اعضاء مسجلون يتصفحون هذه الصفحه
×
×
  • اضف...

Important Information