اذهب الي المحتوي
أوفيسنا
بحث مخصص من جوجل فى أوفيسنا
Custom Search

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

قام بنشر

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

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

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

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


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

قام بنشر

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

اسعد الله صباحكم بكل خير

 

اساتذتي الكرام

حاولت اطبق كلامكم على برنامجي

ولكن لم افلح

دلوني اين الخطأ

Untitled.png

قام بنشر
في ٢٢‏/٩‏/٢٠١٦ 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
قام بنشر

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

مساء الخير

 

اساتذتي الكرام

 

ممكن مساعدتي في برنامجي

والذي يحتوي على نفس مشكلة التكرار

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

زائر
اضف رد علي هذا الموضوع....

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

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

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

Important Information