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

كود التأكد من حفظ التعديلات أو التراجع عن التعديل


rudwan

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

السلام عليكم

لدي نموذج , أريد أن يرسل لي رسالة عند تعديل أي قيمة فيه يخبرني بأن قيمة الحقل [ ]

قد تغيرت فهل تريد حفظ التعديلات أو لا .

فكرت في حل ذلك باحدى طريقتين :

أولا : أن أضع تعليمة لحدث on change لكل حقل بحيث عند تغيير أي قيمة فيه يطلب مني تأكيد حفظ التغير أم لا , و اذا لم يتم تأكيد الحفظ يعمل text.oldvalue

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

ثانيا : وضع التعليمة عند حدث after update للنموذج , و لكن في هذه الحالة أحتاج الى مايلي :

1-في حال عدم الرغبة في حفظ التعديل , هل التعليمة هي :

record.undo

2-أريد أن يخبرني عن الحقل الذي تم تفيير قيمته , كيف ؟

3-حدث after update يعمل أيضا في حالة اضافة سجل جديد , فكيف يمكن حصر اعطاء التعليمة بالتغيير فقط , حيث لم أجد حدث اسمه form_ change

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

اخي الكريم في حدث after update

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

انسخ ثم الصق الكود التالي

msg$ = "هل تريد تعديل رقم الهاتف بالفعل"
Title = "تنبيه عن تعديل "
If [رقم الهاتف].OldValue > 0 Then response = MsgBox(msg, 36, Title)

If response = 6 Then DoCmd.GoToControl "عنوان المشترك"

If response = 7 Then [رقم الهاتف] = [رقم الهاتف].OldValue

Cancel = True

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

شكرا لك على هذا الرد , و لكن توجد عدة ملاحظات :

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

ثانيا : أظن أن هناك خطأ في الكود و هو أنه يجب وضع inputbox

بدلا من msgbox

ثالثا : الحدث يفترض أن يكون before update وليس after ubdate

على كل حال قمت بالتجريب و توصلت الى الحل التالي :

أولا قمت بعمل اجراء خاص في النموذج :

private sub changed ()
     Dim ctlTextbox As Control
     For Each ctlTextbox In Me.Controls
If ctlTextbox.Value <> ctlTextbox.OldValue Then
     MsgBox ctlTextbox.Value
     End If
     Next ctlTextbox
End Sub
ثانيا : عند حدث بعد التعديل على النموذج
Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim m As Integer


Dim intnewrec As Integer

    intnewrec = Me.NewRecord
    If intnewrec = True Then
    MsgBox " you insert a new record "
    Else
Changed
m = InputBox(" save ")
If m = 1 Then

Cancel = True
Me.Undo

Else
Cancel = False
End If
End If




End Sub
و لكن المشكلة أن البرنامج يرسل لي رسالة خطا بالنسبة للاجراء الخاص عند
If ctlTextbox.Value <> ctlTextbox.OldValue Then

بأنني أدخلت قيمة غير معروفة , و أنا بصدد المحاولة ثانية لمعرفة أين الخطأ

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

الحمد لله , تم التوصل بفضل الله الى الحل الصحيح , و هذا هو الكود

Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim m As Integer
Dim ctl As Control

Dim intnewrec As Integer

    intnewrec = Me.NewRecord
    If intnewrec = True Then
    MsgBox " you insert a new record "
    Else

    For Each ctl In Me.Controls
           If ctl.ControlType = acTextBox Or ctl.ControlType = acComboBox Then
            If ctl.OldValue <> ctl.Value Then
             m = InputBox(ctl.ControlName & " value already changed Enter your password to save ?")

If m = 1 Then

Cancel = false

Else
Cancel = true
ctl.Undo
End If


End If
End If


Next ctl
End If

End Sub

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

أما اذا كان السجل الذي تم تعديله مسجل سابقا , فانه يتم الانتقال في السطر 9 لعمل حلقة دورانية لفحص كافة عناصر التحكم ( شرط أن لا تكون عناوين أو صفحات أو غيرها )

فاذا وجد عنصرا قد تغيرت قيمته , يرسل رسالة تبين أن الحقل المسمى " "

قد تغيرت قيمته , و يطالب بادخال كلمة سر للتأكد من صلاحية التعديل , فاذا كانت كلمة السر صحيحة يحفظ التعديلات , و الا يلغي التعديل و يعيد القيمة القديمة للعنصر

و هكذا بالنسبة لبقية العناصر

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

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

أخي الكريم/ rudwan

طريقة رائعة فعلاً

لقد حاولت تطبيق الفكرة على قاعدة مرتبطة بقاعدة موجودة على سيرفير، فبقى المؤشر عالقاً بعد التحديث بدخال الحقل الذي أستخدمت معه الكود.

فهل الكود يصلح للقواعد التي تعمل عبر الشبكة الداخلية ؟

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

السلام عليكم

أخي الكريم أنا لآسف للتأخر في الرد , و لكن النت عندي فقط في المكتب , أي اليوم فقط داومت و اطلعت على رسالتك

بالنسبة لسؤالك , في الحقيقة أنا لم أشتغل قبل الآن على الشبكات , و لا أعرف بالضبط ما يمكن أن تكون المشكلة , هل في طريقة استدعاء الملفات , أي هل يجب تعريف العناصر بامتداداتها الكاملة من قاعدة البيانات أم ماذا ؟ أما عندي فالكود يعمل بشكل فعال جدا .

على كل حال أترك الاجابة على هذا السؤال للسادة الاساتذة فهم أكثر خبرة و معرفة

و شكرا .

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

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