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

وعليكم السلام ورحمة الله وبركاته ..
تستطيع عمل ذلك من خلال هذه الطريقة ...
لنفترض ان لدينا هذا الجدول
لاحظ استخدمنا انواع مختلفة من البيانات
1- في نموذج عرض وادخال البيانات وفي أعلى صفحة الاجراء نعرف متغيرات باسماء حقول المراد التدقيق عليها ونضيف اليها old لكل اسم حقل كتعريف
Dim OldINdate As Date Dim Oldsal As String Dim Oldemp_name, OldTax1 As String
2- في حدث عند الحالي نستعمل الاكواد التالية لحفظ قيمة البيانات لحظة عرضها على النموذج لاستخدامها في عملية التدقيق فيما بعد.
Private Sub Form_Current() On Error Resume Next Call glrEnableButtons([Form]) Oldemp_name = Me!emp_name Oldsal = Me!sal OldTax1 = Me!Tax1 OldINdate = Me!INDate End Sub
3-وعند الحفظ او الانتقال الى سجل جديد سوف نطلب الاجراء التالي الذي يقوم بالتدقيق على الحقول المعدلة فإذا كان أحد الحقول معدل سوف يظهر رسالة تفيد بحفظ أو عدم حفظ السجل الحالي اذا نعم سيحفظ السجل الحالي بدون أي أجراء واذا لا سيقوم بتنفيذ الأمر Undo للتراجع عن الحفظ .
Private Sub UpdateData()
On Error Resume Next
If Oldemp_name <> Nz(Me!emp_name) Then GoTo prag1
If Oldsal <> Nz(Me!sal) Then GoTo prag1
If OldTax1 <> Nz(Me!Tax1) Then GoTo prag1
If OldINdate <> Nz(Me!INDate) Then GoTo prag1
Exit Sub
prag1:
If MsgBox("áÞÏ Êã ÊÍÏíË ÈÚÖ ÇáÈíÇäÇÊ åá ÊÑíÏ ÍÝÙ ÇáÊÍÏíËÇÊ", vbMsgBoxRight + vbYesNo + vbDefaultButton2, "") = vbNo Then
DoCmd.DoMenuItem acFormBar, acEditMenu, acUndo, , acMenuVer70
Else
End If
End Subاستعملنا الدالة nz للسيطرة على الكود عندما تكون قيمة الحقل فراغ أو عند الغاء قيمة الحقل .
4- عند الانتقال من سجل الى آخر نطلب اسم الاجراء السابق شرحه في البند رقم 3
UpdateData
ارجو أن تكون الفكرة مناسبة لك ، وبالتأكيد هناك طرق أخرى ولكن هذا ما استطعت أن أفيدك به .
الكود واضح وسهل ولكني أحببت شرحه لأخواني المبتدئين أمثالي ..
تحياتي ..
تم تعديل هذه المشاركة بواسطة محمد أبو عدنان في 22 نوفمبر 2010 في 12:43

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

بارك الله فيكم وجزاكم الله خير
فكره رائعه جدا
اخي فتى الوادي
هل بالامكان انك تضع لنا مثال بالفكره اللي سويتها
حتى تعم الفائده
وفقك الله ونفع بعلمك
شكرا
اتق الله حيث ماكنت
فتى الوادي كتب:بارك الله فيك وفي علمك ونفع الله بك ...
استخدمت طريقة اخرى بسيطة ومفيدة وأدت الغرض المنشود .. وهي وضعت مربعات نص تقرأ من السجل نفسه ..
وعند ضغط زر حفظ التعديل يعمل مقارنة إذا الحقول هذه تساوي الحقول الأصلية أو لا
فإذا الحقول متساوية معناته أنه لم يدث أي تغيير .. وغذا أحد الحقول مختلف فهذا يعني انه حدث تغيير .
ومن له حيلة فليحتل .
شكرا لك مجدد .
وبك أخي الكريم .. جزاك الله خير ...
يا سيدي الحمد لله تم لك ما أردت بصورة أو بأخرى ..
وكما قلت ... ومن له حيلة فليحتل....فالأحتيال هنا مشروع :wink:
أخي الفاضل at-aziz الأخ الكريم فتى الوادي طبق نفس الطريقة ولكن عوض البند رقم 1 في مثالي فقد عرف مربعات نص في النموذج بنفس الاسماء فقط لا غير .
هذا ما فهمته منه ..واذا أحب التكرم بإرفاق مثاله فهذا كرم منه لتعم الفائدة على الجميع .
تحياتي ..
تم تعديل هذه المشاركة بواسطة محمد أبو عدنان في 22 نوفمبر 2010 في 14:32

ماشاء الله ابو عدنان
وحيله جميله من فتى الوادى
وجزاكم الله كل خير على هذه المعلومات الجميله تمنيات لكم بالتوفيق ولكم منى +1
تم تعديل هذه المشاركة بواسطة طالب علم مبتدىء في 22 نوفمبر 2010 في 18:29
طالب علم مبتدىء كتب:ماشاء الله ابو عدنان
وحيله جميله من فتى الوادى
وجزاكم الله كل خير على هذه المعلومات الجميله تمنيات لكم بالتوفيق ولكم منى +1
جزاك الله خير أخي العزيز أحمد .... لم نقدم شئ الى حد الآن يليق بما تعلمناه من هذا المنتدى للأسف :blush: ...
بارك الله بك على هذا التواصل +
تحياتي
تم تعديل هذه المشاركة بواسطة محمد أبو عدنان في 22 نوفمبر 2010 في 22:38

تواضع منك ياابو عدنان
جزاك الله كل خير ابو عدنان وزادك من العلم
تمنياتى لك وللجميع بالتوفيق ومزيد من التقدم وجعله الله فى خدمة المسلمين
بارك الله فى جميع الاخوة
و بعد اذن الجميع
الموضوع ابسط من ذلك بكثير
هناك خاصية للنموذج هى dirty
و خاصية لعناصر التحكم هى oldvalue
يمكننا استخدامها لتحقيق المطلوب
و هذا الكود يوضح ذلك ارجو ان يكون به الفائدة
Sub DataEdits()
If Me.Dirty Then
Dim ctl As Control
For Each ctl In Me.Controls
'If ctl.ControlType = acTextBox Or ctl.ControlType = acComboBox Or ctl.ControlType = acCheckBox Then
If ctl.Value <> ctl.OldValue Then DoCmd.RunCommand acCmdSaveRecord
'End If
Next ctl
End If
End Subتم تعديل هذه المشاركة بواسطة Abo_Yossof في 22 نوفمبر 2010 في 23:32
شكرا لك استاذنا أبا يوسف وبارك الله بك ..
طريقتك فعلا مختصرة ورائعة فقد قمت بتجربتها واستخدمت الخاصية dirty فقط في نفس المثال وتم بها عمل اللزم ..
جعلها الله في ميزان حسناتك ..
ولتسمح لي بتجربة بسيطة جدا نضيفها باستخدام OlDValue مع نظام المصفوفة .
والهدف من كل هذه الطرق تعليمي ،ربما أستفيد منها مع أخواني المبتدئين أمثالي لتعم الفائدة على الجميع ان شاء الله
لاستخدام الطريقة الثانية :
سنلغي البند رقم 1 .
سنلغي البند 2 .
سنغير البند 3 فقط
Private Sub UpdateData()
On Error Resume Next
Dim MsField(4) As String
Dim MsText(4) As String
Dim I As Integer
MsField(0) = Me.ID.OlDValue
MsField(1) = Me.emp_name.OlDValue
MsField(2) = Me.INDate.OlDValue
MsField(3) = Me.sal.OlDValue
MsField(4) = Me.Tax1.OlDValue
MsText(0) = Me.ID.Value
MsText(1) = Me.emp_name.Value
MsText(2) = Me.INDate.Value
MsText(3) = Me.sal.Value
MsText(4) = Me.Tax1.Value
For I = 0 To 4
If MsText(I) <> MsField(I) Then
GoTo prag1
End If
Next I
Exit Sub
prag1:
If MsgBox("áÞÏ ÞãÊ ÈÊÚÏíá ÈÚÖ ÇáÈíÇäÇÊ åá ÊÑíÏ ÝÚáÇ ÍÝÙ ãÇ Êã ÊÚÏíáå..¿", vbMsgBoxRight + vbYesNo + vbDefaultButton2, "") = vbNo Then
DoCmd.DoMenuItem acFormBar, acEditMenu, acUndo, , acMenuVer70
Else
End If
End SubMsField هي مصفوفة قيمة الحقول في السجل الحالي ومصدر بياناتها من الجدول بواسطة الأمر OlDValue .
MsText هي مصفوفة قيمة مربعات النص ومصدر بياناتها من مربعات النص للسجل الحالي
الكود واضح جدا ، هنا استخدمنا المصفوفتان لمقارنة التعديل الذي حدث في مربعات النص بالنموذج .
البند 4 لم يتغير به شئ.
ربما الطريقة طويلة حبتين مقارنة بطريقة أستاذنا أبو يوسف ولكن كل كود ربما له ظروفه عند استخدامه بمنطق البرنامج :wink:
مرفق المثال بعد التعديل كما تم شرحه
تحياتي ..
تم تعديل هذه المشاركة بواسطة محمد أبو عدنان في 23 نوفمبر 2010 في 10:46

بارك الله فيك وجزاك الله خير اخي الفاضل ابو عدنان
مثال رائع
وفقك الله ونفع بعلمك
اتق الله حيث ماكنت
الاخوة المشرفين
الاخ ابو عدنان ...
اذا سمحت لي : لقد عدلت على مثالك بهذا الكود وجدته في احد الامثلة لاحد الاخوة
حيث 1- يظهر في الرسالة التغيير الذي احدثته
2- والاهم انه لاتضطر لاضافة اسماء الحقول في الكود ( ربما يكون هناك اكثر من عشرون حقل في النموذج كما هو عندي الان )
ارجو الاطلاع عليه ربما يحتاج الى تعديل او اضافة حسب طلب الاخ صاحب السؤال ،،
سيد الاستغفار
{ اللهم أنت ربي لا إله إلا أنت خلقتني وأنا عبدك وأنا على عهدك ووعدك ما استطعت أعوذ بك من شر ما صنعت أبوء لك بنعمتك علي وأبوء لك بذنبي فاغفر لي فإنه لا يغفر الذنوب إلا أنت}
من قالها من النهار موقنا بها فمات من يومه قبل أن يمسي فهو من أهل الجنة ومن قالها من الليل وهو موقن بها فمات قبل أن يصبح فهو من أهل الجنة .رواه البخاري
malik2010 كتب:الاخوة المشرفين
الاخ ابو عدنان ...
اذا سمحت لي : لقد عدلت على مثالك بهذا الكود وجدته في احد الامثلة لاحد الاخوة
حيث 1- يظهر في الرسالة التغيير الذي احدثته
2- والاهم انه لاتضطر لاضافة اسماء الحقول في الكود ( ربما يكون هناك اكثر من عشرون حقل في النموذج كما هو عندي الان )
ارجو الاطلاع عليه ربما يحتاج الى تعديل او اضافة حسب طلب الاخ صاحب السؤال ،،
ما شاء الله عليك أخي مالك تعديل ممتاز بارك الله بك وتقريبا نفس فكرة أستاذنا أبو يوسف جزاه الله كل خير والشكر موصول لصاحب الفكرة بمثالك المرفق بارك الله بكم جميعا على هذا التواصل..
اقتباس2- والاهم انه لاتضطر لاضافة اسماء الحقول في الكود ( ربما يكون هناك اكثر من عشرون حقل في النموذج كما هو عندي الان )
كلامك صحيح مئة بالمئة أخي الحبيب ولكن ربما أحيانا تحتاج الى التنبيه الى حقول معينة عند تعديلها أو اجراء آخر يتطلب ذلك فالطريقة الثانية تفي بهذا الغرض أما اذا كان المطلوب جميع الحقول فبالتأكيد هذه الطريقة أفضل :cool:
لنشرحها لتعم الفائدة :
نفس الاكواد بالمثال بالطريقة رقم 2 والتغيير بالند رقم 3 فقط.
Private Sub UpdateData()
Dim ctlControl As Control
If Me.Dirty Then
For Each ctlControl In Me.Controls
If ctlControl.ControlType = acTextBox Then
If Nz(ctlControl.OldValue, "ÞíãÉ ÎÇáíÉ") <> Nz(ctlControl.Value, "ÞíãÉ ÎÇáíÉ") Then
strPrompt = strPrompt & "(" & Nz(ctlControl.OldValue, "ÞíãÉ ÎÇáíÉ") & ")" & " Åáì ÇáÞíãÉ " & "(" & Nz(ctlControl.Value, "ÞíãÉ ÎÇáíÉ") & ")" & vbCrLf
DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70
End If
End If
Next ctlControl
DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70
MsgBox "ÍÕá ÊÛííÑ Ýí ÇáÍÞá ÇáÊÇáí " & vbCrLf & strPrompt, vbInformation + vbMsgBoxRight, "ÊÛíÑ Ýí ÅÍÏì ÇáÍÞæá"
If MsgBox("áÞÏ ÞãÊ ÈÊÚÏíá ÈÚÖ ÇáÈíÇäÇÊ åá ÊÑíÏ ÝÚáÇ ÍÝÙ ãÇ Êã ÊÚÏíáå..¿", vbMsgBoxRight + vbYesNo + vbDefaultButton2, "") = vbNo Then
DoCmd.DoMenuItem acFormBar, acEditMenu, acUndo, , acMenuVer70
End If
Else
MsgBox "áã íÍÕá ÊÛííÑ !!", vbInformation + vbMsgBoxRight
End If
strPrompt = Empty
End Subبعد أذنك أخي مالك أجريت بعض التعديلات على الكود لعدم الحفظ الا بالموافقة من المستخدم ...
جزاك الله خير أخي مالك وإلى الأمام وأرجو أن نكون جميعا استفدنا من هذه التجربة ..++++
تحياتي ..
تم تعديل هذه المشاركة بواسطة محمد أبو عدنان في 23 نوفمبر 2010 في 14:23

حياك الله اخي ابو عدنان
تلميذك ..
سيد الاستغفار
{ اللهم أنت ربي لا إله إلا أنت خلقتني وأنا عبدك وأنا على عهدك ووعدك ما استطعت أعوذ بك من شر ما صنعت أبوء لك بنعمتك علي وأبوء لك بذنبي فاغفر لي فإنه لا يغفر الذنوب إلا أنت}
من قالها من النهار موقنا بها فمات من يومه قبل أن يمسي فهو من أهل الجنة ومن قالها من الليل وهو موقن بها فمات قبل أن يصبح فهو من أهل الجنة .رواه البخاري
سلمت يداك استاذنا ابو عدنان
لكن كل ما اقصده هو الاقتصاد فى الكود
ما قمت به رائع و جميل و لكن ماذا لو لدينا عدداكبر من عناصر التحكم فى النموذج سيزداد الكود طولا بالطبع
لذلك سأعيد وضع الكود الذى تفضلت به ( بعد اذنك طبعا ) مع دمجه مع الكود الذى وضعته انا من قبل حتى يستفيد من يطلع على الكود بعد ذلك
Private Sub UpdateData()
On Error Resume Next
If Me.Dirty Then
Dim ctl As Control
For Each ctl In Me.Controls
If ctl.ControlType = acTextBox Then
If ctl.Value <> ctl.OlDValue Then
GoTo myupdate
Exit Sub
End If
End If
Next ctl
End If
Exit Sub
myupdate:
If MsgBox("áÞÏ ÞãÊ ÈÊÚÏíá ÈÚÖ ÇáÈíÇäÇÊ åá ÊÑíÏ ÝÚáÇ ÍÝÙ ãÇ Êã ÊÚÏíáå..¿", vbMsgBoxRight + vbYesNo + vbDefaultButton2, "") = vbNo Then
DoCmd.DoMenuItem acFormBar, acEditMenu, acUndo, , acMenuVer70
Else
End If
End Subفقط التعديل على الاجراء updatedata و بدون اى تغييرات اخرى
استخدام الخاصية dirty هنا من الممكن الاستغناء عنها و لن يتأثر الكود نظريا فى أى شىء
و لكن وضعها هنا سيقلل من احتمالية حدوث بطأ فى النموذج اذا كان عدد العناصر كبير
لانك لم لم يحدث اى تعديل لن تكون مضطرا للمرور على كل العناصر لتحديد هل هناك تعديل بها ام لا
و بالتوفيق للجميع
Abo_Yossof كتب:لكن كل ما اقصده هو الاقتصاد فى الكودما قمت به رائع و جميل و لكن ماذا لو لدينا عدداكبر من عناصر التحكم فى النموذج سيزداد الكود طولا بالطبع
شكرا أستاذنا أبا يوسف وبارك الله بك
- كان هذا ردي للاخ مالك على ما تفضلت به بالملاحظة الأولى
محمد أبو عدنان كتب:كلامك صحيح مئة بالمئة أخي الحبيب ولكن ربما أحيانا تحتاج الى التنبيه الى حقول معينة عند تعديلها أو اجراء آخر يتطلب ذلك فالطريقة الثانية تفي بهذا الغرض أما اذا كان المطلوب جميع الحقول فبالتأكيد هذه الطريقة أفضل :cool:
فنحن نتعلم ونحاول وضع عدة حلول وكل واحد يأخذ الأمر الذي يناسبه بمنطق البرنامج هذا ما قصدته بالطرق المختلفة التي أقدمها.
Abo_Yossof كتب:لذلك سأعيد وضع الكود الذى تفضلت به ( بعد اذنك طبعا ) مع دمجه مع الكود الذى وضعته انا من قبل حتى يستفيد من يطلع على الكود بعد ذلك
Private Sub UpdateData() On Error Resume Next If Me.Dirty Then Dim ctl As Control For Each ctl In Me.Controls If ctl.ControlType = acTextBox Then If ctl.Value <> ctl.OlDValue Then GoTo myupdate Exit Sub End If End If Next ctl End If Exit Sub myupdate: If MsgBox("áÞÏ ÞãÊ ÈÊÚÏíá ÈÚÖ ÇáÈíÇäÇÊ åá ÊÑíÏ ÝÚáÇ ÍÝÙ ãÇ Êã ÊÚÏíáå..¿", vbMsgBoxRight + vbYesNo + vbDefaultButton2, "") = vbNo Then DoCmd.DoMenuItem acFormBar, acEditMenu, acUndo, , acMenuVer70 Else End If End Sub
بارك الله بك أخي أبا يوسف مجهود جميل وتشكر عليه وفي ملاحظتين لو سمحت لي طبعا
1- تعديل السطر التالي فقط
If Nz(ctl.Value) <> ctl.OlDValue Then
لانه يقبل الفراغ بالتعديل ودون تنبيه طبعا الموضع بسيط جدا.
أما باقي الكود فما شاء الله تعمل بشكل جيد.
2- أرى أختصار الكود الذي أرفقته الى ما يلي فالأمر Dirty يكفي لاتمام المهمة ولا داعي لبقية الأكواد .
If Me.Dirty Then
If MsgBox("áÞÏ ÞãÊ ÈÊÚÏíá ÈÚÖ ÇáÈíÇäÇÊ åá ÊÑíÏ ÝÚáÇ ÍÝÙ ãÇ Êã ÊÚÏíáå..¿", vbMsgBoxRight + vbYesNo + vbDefaultButton2, "") = vbNo Then
DoCmd.DoMenuItem acFormBar, acEditMenu, acUndo, , acMenuVer70
End If
End If===============================================================
أخواني الأعزاء تم تطوير المثال على الشكل التالي :
1- لا حاجة الى أي أكواد في النموذج فقد تم تعريف أمر الفحص بالوحدة النمطية وتم اضافة الأمر مع أجراء المسمى basNavigate وهو الكونترول الخاص بالتنقل بيم السجلات
هذه هو الكود المضاف الى الوحدة النمطية
Function Up_Data(frm As Form)
On Error Resume Next
If frm.Dirty Then
If MsgBox("áÞÏ ÞãÊ ÈÊÚÏíá ÈÚÖ ÇáÈíÇäÇÊ åá ÊÑíÏ ÝÚáÇ ÍÝÙ ãÇ Êã ÊÚÏíáå..¿", vbMsgBoxRight + vbYesNo + vbDefaultButton2, "") = vbNo Then
DoCmd.DoMenuItem acFormBar, acEditMenu, acUndo, , acMenuVer70
End If
End If
End Function2- لتسطيع استخدام هذا المثال ببرنامجك فقط استورد الوحدة النمطية المرفقة الى برنامجك
ضع في مفتاح الحفظ أو في مفاتيح التنقل بين السجلات الأمر التالي
Call Up_Data([Form])
اذا لم ترغب باستخدام خاصية التدقيق على السجلات المحدثة فلا تضع الأمر السابق ويكفي أمر التنقل .
المثال الآن له وظيفتان بنفس الوقت التنقل بين السجلات مع كونترول بداية ونهاية السجل والتبيه على السجلات المحدثة اليس هذا اختصارا :wink: ..
أرجو أن أكون وفقت بتطوير المثال ..
مرفق المثال بعد التحديث
تحياتي للجميع

تمام اخى الحبيب أبو عدنان
هكذا الموضوع اسهل عند استخدامه من قبل الاخوة
لكن فى ملاحظة على استخدام الخاصية dirty
لان استخدامها وحده سيجعلك تشغل الكود عند حدوث تعديل او محاولة للتعديل
بمعنى
اذا عدلت فى قيمة مربع النص و رجعت بعد ذلك الى القيمة القديمة ( الان انت لم تعدل شىء ) سيعتبر النموذج هذا تعديلا .
عموما سلمت يداك الاخوة الان امامهم الكثير من الخيارات
و كلا يختار ما يناسبه
بسم الله الرحمن الرحيم
بارك الله فيكم جميعا اخواني
الحقيقة مجهود رائع لتطوير الكود ارجو ان يستمر حال منتدانا الحبيب على ذلك
Abo_Yossof كتب:اذا عدلت فى قيمة مربع النص و رجعت بعد ذلك الى القيمة القديمة ( الان انت لم تعدل شىء ) سيعتبر النموذج هذا تعديلا .
مشكور أخي ابو يوسف على المتابعة والمثال يعدل البيانات 100% بفعل التأكيد على الحفظ أو عدمه بارك الله بك .
شكرا أخي sx1 وان شاء الله راضي عنا هذه المرة ....سامحنا على التقصير .. :blush:
تحياتي ..
تم تعديل هذه المشاركة بواسطة محمد أبو عدنان في 24 نوفمبر 2010 في 12:10
