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

تتبع ومراقبة تغيير او تعديل البيانات في البرنامج


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

السلام عليكم

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

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

ويتم من خلاله رصد التالي :

- معرف السجل

- اسم الحقل

- اسم النموذج

- القيمة الأساسية ( قبل التعديل )

- القيمة الجديدة (بعد التعديل )

- اسم المستخدم

- تاريخ ووقت التعديل 

مع امكانية التصفية والبحث بين تاريخين

--------------------------------------------------------------

كل ما عليك عمله هو :

اولا :

نقل الكائنات التالية (جدول/نموذج/وحدة نمطية) الى برنامجك : modAudit / frmAudit  / tblAudit

ثانيا :

اي نموذج في مشروعك ترغب في تتبع التعديلات التي تجري عليه .. فقط الصق فيه هذا الكود في حدث قبل التحديث

 

Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim x As Integer
        If Not IsNull(Me!ID) Then
        x = WriteAudit(Me, Me!ID)
    End If
End Sub

ID  يمثل الحقل الفريد داخل النموذج

 

هذا كل شيء ...

----------------------------------------------------------------------------------------------------------------------------------------

نأتي للتفاصيل التي استبعدتها وهي محل النقاش لمن اراد المشاركة  .

وهي ان الوظيفة تخص تتبع الحقول النصية فقط ، واريد ضم مربع التحرير

وكما هو ظاهر في المثال المرفق .. قيمة مربع التحرير "رقمية" والمطلوب اظهار القيمة "النصية" الأساسية ( التي تم تغييرها) ، اظهارها في جدول التتبع

اما بالنسبة للقيمة الجديدة فلا اشكال فيها 

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

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

و لأخي @Moosak  خاصه تعقيبا على تعليقه هنا 

------------------------------------------------------------------------------------

وقد اجاب الاستاذ موسى والاستاذ فادي وأجادا  بمثالين احترافيين شاملين  فجزاهما الله خيرا

1- المرفق Database2 وهو خاص بالحقول النصية

2- المرفق  Track Changes - Moosak  شامل الحقول النصية ومربعات التحرير

3- المرفق Database5 شامل الحقول النصية ومربعات التحرير

بقي الاختيار لك فاختر ما يناسبك .

 

Track Changes - Moosak.accdb

Database2.rar

Database5.accdb

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

  • Moosak pinned this topic

أبدعت أستاذنا ومعلمنا الفاضل @ابوخليل  :clapping:

بارك الله فيك ، وغفر لك ولوالديك ، وجعله في ميزان حسناتك .

اسمح لي بمداخلة صغيرة تتعلق بتوسيع عدسة المراقبة للتغييرات لتشمل أيضاً الـ Combobox ؛ بإضافة بسيطة على الجزء التالي :-

4 ساعات مضت, ابوخليل said:
If TypeOf ctlC Is TextBox Then

ليصبح على هذا النحو ؛

If TypeOf ctlC Is TextBox Or TypeOf ctlC Is ComboBox Then

 

 

 

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

4 ساعات مضت, Foksh said:

أبدعت أستاذنا ومعلمنا الفاضل @ابوخليل  :clapping:

بارك الله فيك ، وغفر لك ولوالديك ، وجعله في ميزان حسناتك .

اسمح لي بمداخلة صغيرة تتعلق بتوسيع عدسة المراقبة للتغييرات لتشمل أيضاً الـ Combobox ؛ بإضافة بسيطة على الجزء التالي :-

ليصبح على هذا النحو ؛

If TypeOf ctlC Is TextBox Or TypeOf ctlC Is ComboBox Then

 

 

 

هذا ما تحدثت عنه في ذيل الموضوع 

لو قرأت بتمعن .. لقد وقعت في الشبكة:smile:

جرب بعد الاضافة .. ماذا يظهر لك عندما تغير الجنسية  .. في القيمة الأساسية ؟؟

سيظهر رقم .. صح ؟؟  اريد اظهار القيمة النصية 

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

منذ ساعه, ابوخليل said:

لقد وقعت في الشبكة

نعم صحيح ، لقد وقعنا في الفخ هههههههه

 

على العموم ، توصلت لفكرة جلب القيمة بعد التغيير ، وبقي لي جلب القيمة قبل التغيير :rol:

 

وهذه مشاركتي التي توصلت اليها :wallbash:

Database2.accdb

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

سرعة القراءة عندك عالية جدا :wallbash:

هذا ما كتبته انا في ذيل موضوعي :

12 ساعات مضت, ابوخليل said:

 

وكما هو ظاهر في المثال المرفق .. قيمة مربع التحرير "رقمية" والمطلوب اظهار القيمة "النصية" الأساسية ( التي تم تغييرها) ، اظهارها في جدول التتبع

اما بالنسبة للقيمة الجديدة فلا اشكال فيها 

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

 

 

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

لا بالعكس ، سرعة قراءتي بطيئة جداً صدقني هههه :smile:

 

لكني انا عرضت فكرتي ، ولا اعلم ما هي فكرتك التي أشرت إليها في ذيل موضوعك :rol:

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

اخي وحبيبي الله يحفظك

فكرتي اختصرتها في هذا السطر

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

 

انا اذا لم احصل على حل احترافي مختصر فسوف اضطر الى رفع مثالي الآخر والذي يحتوي على معالجة مربع التحرير بطريقتي

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

ما شاء الله استاذي ابا خليل

دائما مبدع فيما نقلت او ما كان من امهات افكارك

وعندي سؤال استاذي كيف لو كان النموذج رئيسي وليس له مصدر سجلات وبه مربعات نص غير منتظمة

ما شاء الله استاذي @ابوخليل

دائما مبدع فيما نقلت او ما كان من امهات افكارك

وعندي سؤال استاذي كيف لو كان النموذج رئيسي وليس له مصدر سجلات وبه مربعات نص غير منتظمة

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

19 دقائق مضت, محمد القدسي said:

وعندي سؤال استاذي كيف لو كان النموذج رئيسي وليس له مصدر سجلات وبه مربعات نص غير منتظمة

 

هذا النموذج خارج الاهتمام ..

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

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

هذا النموذج خارج الاهتمام ..

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

الذي اقصده استاذي اذا كان التعامل مع الجداول عن طريق DAO.Recordset من حيث الاضافة rstTo.AddNew او التعديل rstTo.Edit للبيانات من النموذج 

 

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

في 11‏/2‏/2024 at 11:06, ابوخليل said:

و لأخي @Moosak  خاصه تعقيبا على تعليقه هنا 

أسعد الله صباحك عمي @ابوخليل 🌹 

إبدعت وأجملت 👍🏻🙂 ..
حاولت بالطرق السهلة أن أحصل على القيمة السابقة للعمود الثاني ولكن لم أفلح .. ولم أجد خاصية مدمجة تدعم ذلك ..

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

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

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

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

image.png.bb5dedd6a0b08f0c164c00b908f97db6.png

           وهذا ينطبق على مربعات النص والقوائم المنسدلة .. إلا أن القوائم المنسدلة متعددة الأعمدة تكتب ( تم التعديل إلى : ... ) فقط هكذا :
image.png.16ce64b0a660321f74dd63a6d0beeccd.png

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

أهلا اخي موسى .. كنت بانتظارك

اقتباس

الأولى : عند إضافة سجل جديد حينها ستتخزن القيمة كإدخال جديد .

هذه ستعمل زحمة على الجدول لا داعي لها .. لأن من قام بالاضافة موجود اصلا ضمن السجل

اقتباس

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

هذا بيت القصيد

ولكن قد لا يوجد تعديل سابق

انا توصلت الى طريق اقرب ( هل تذكر موضوعي الذي ابحث فيه عن اسم الجدول مصدر بيانات مربع التحرير ؟ :smile: )

 

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

32 دقائق مضت, ابوخليل said:

هذه ستعمل زحمة على الجدول لا داعي لها .. لأن من قام بالاضافة موجود اصلا ضمن السجل

هذه ليست مجرد رفاهية .. إنما أريد معرفة من أضاف السجل أيضا 😅🖐🏻️
 

 

32 دقائق مضت, ابوخليل said:

ولكني توصلت الى طريق اقرب ( هل تذكر موضوعي الذي ابحث فيه عن اسم الجدول مصدر بيانات مربع التحرير ؟ :smile: )

نترقب بشغف :rol:

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

42 دقائق مضت, Moosak said:

هذه ليست مجرد رفاهية .. إنما أريد معرفة من أضاف السجل أيضا 😅🖐🏻️

اعرفه من السجل نفسه

اي سجل يتم ادراجه في اي جدول يتم ادراج المستخدم والوقت آليا

ولمعرفته هناك طريقان .

الاول : تخصيص استعلام للبحث في السجلات وهذا طويل خاصة اذا تعددت الجداول

الثانية : احترافية : بالنقر المزدوج على معرف السجل تظهر رسالة صغيرة باسم المدخل ووقت الادخال

النقر المزدوج هذا مشروط بصاحب صلاحية محددة

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

4 ساعات مضت, Moosak said:

نترقب بشغف :rol:

  الحقيقة انها صعبة وغير ممكن الحصول عليها بكود مباشر   لأن القيمة الأساسية التي تم عليها التغيير  هي فعلا رقم  وأكسس يأخذ هذا الرقم في الذاكرة  OldValue  ونحن سنتعامل مع هذا الرقم فقط بينما القيمة الجديدة الحالية (بعد التغيير ) سنتعامل مع  Object له خصائصه فنجلب منه ما نريد .

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

الآن لمعرفة النص الذي تم تغييره انقر نقرا مزدوجا على الرقم

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

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

Database4.rar

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

عمي أبو خليل @ابوخليل تقبل الله اجتهاداتك وسعيك 🙂 

قمت بتغيير الاستراتيجية قليلا وحصلت على نتائج طيبة 😉

جرب المرفق وأخبرني رأيك 🙂 

 

Track Changes - Moosak.accdb

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

النتيجة رائعة .. والطريقة اجمل وأروع

احترافية بمعنى الكلمة وهذا ما كنت ابحث عنه 

ولكن عجبي !!!!

ما الحدث الذي ينفذ الوظيفة ؟؟

حاولت ولكني لم اهتد اليه

 

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

16 ساعات مضت, محمد القدسي said:

هذا النموذج خارج الاهتمام ..

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

الذي اقصده استاذي اذا كان التعامل مع الجداول عن طريق DAO.Recordset من حيث الاضافة rstTo.AddNew او التعديل rstTo.Edit للبيانات من النموذج 

 

برمجيا اعتقد يمكن تحقيقه.. لا يوجد كثير فرق ..

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

 

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

منذ ساعه, ابوخليل said:

ولكن عجبي !!!!

ما الحدث الذي ينفذ الوظيفة ؟؟

حاولت ولكني لم اهتد اليه

توقعتك تسأل .. 😄🖐🏻️ .. هذه واحدة من الطرق الجميلة لتطبيق دالة معينة على مجموعة من العناصر مرة واحدة ..
قمت بتحديد جميع العناصر ثم كتبت اسم الدالة في حدث بعد التحديث هكذا ( ()AddToAudit= ) وهذه الطريقة أسهل من كتابة الحدث لكل عنصر على حده .. 🙂 

ولها شروط سأذكرها لك ..

image.png.810428f3c252179012a39a3e6324d956.png

 

أما بالنسبة للقائمة المنسدلة وضعت لها دالة منفصلة وذلك لحفظ القيمة الحالية في متغير عام قبل التغيير عند حدث ( عند التركيز ) ..
ولو كانت عندك أكثر من قائمة منسدلة حددها جميعا وألصق اسم الدالة لها جميعا مرة واحدة ..

image.png.96a968380903c286bc8e058834b0261c.png

من شروط استخدام هذه الطريقة :

1- أن يكون الكود (الإجرائية) من نوع Function وليس Sub .
2- أن لا يكون لنفس العنصر أي أكواد أخرى في نفس الحدث ..
    وفي حال الحاجة لوضع أكواد أخرى في نفس الحدث يتم العودة للطريقة الإعتيادية لكتابة الكود ويتم مناداة الدالة بالطريقة المعتادة

Call AddToAudit()

 

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

 

وهذه مشاركتي بطريقة أخرى :jump:

تم إجراء تعديلات على الكود الذي يظهر النتيجة برسالة عند النقر المزدوج على الحقل FieldChangedFrom . واستخدامه في حدث ( في الحالي ) للنموذج FrmAudit ، على النحو التالي :-

Private Sub Form_Current()
On Error GoTo flderr
Dim tbl As String
Dim fld As String
tbl = Me.tblNm
fld = FieldChangedFrom
Dim rs As Recordset

Set rs = CurrentDb.OpenRecordset(tbl)
rs.MoveFirst
Do While Not rs.EOF
    If rs.Fields(0) = fld Then
        Me.FieldChangedFrom = rs.Fields(1).Value
        Exit Sub
    End If
    rs.MoveNext
Loop

flderr:
Exit Sub
End Sub

وفي حدث زر تتبع التغييرات ، قمت بإضافة سطرين ليصبح الكود كالتالي :-

Me.Refresh
DoCmd.OpenForm "frmAudit", acNormal
DoCmd.GoToRecord , , acLast
[Forms]![frmAudit]![FieldChangedFrom].SetFocus
[Forms]![frmAudit]![FieldChangedFrom].Requery

 

Database4.accdb

 

 

تم تعديل بواسطه Foksh
  • Like 2
رابط هذا التعليق
شارك

16 دقائق مضت, Moosak said:

توقعتك تسأل .. 😄🖐🏻️ .. هذه واحدة من الطرق الجميلة لتطبيق دالة معينة على مجموعة من العناصر مرة واحدة ..
قمت بتحديد جميع العناصر ثم كتبت اسم الدالة في حدث بعد التحديث هكذا ( ()AddToAudit= ) وهذه الطريقة أسهل من كتابة الحدث لكل عنصر على حده .. 🙂 

ولها شروط سأذكرها لك ..

image.png.810428f3c252179012a39a3e6324d956.png

 

أما بالنسبة للقائمة المنسدلة وضعت لها دالة منفصلة وذلك لحفظ القيمة الحالية في متغير عام قبل التغيير عند حدث ( عند التركيز ) ..
ولو كانت عندك أكثر من قائمة منسدلة حددها جميعا وألصق اسم الدالة لها جميعا مرة واحدة ..

image.png.96a968380903c286bc8e058834b0261c.png

من شروط استخدام هذه الطريقة :

1- أن يكون الكود (الإجرائية) من نوع Function وليس Sub .
2- أن لا يكون لنفس العنصر أي أكواد أخرى في نفس الحدث ..
    وفي حال الحاجة لوضع أكواد أخرى في نفس الحدث يتم العودة للطريقة الإعتيادية لكتابة الكود ويتم مناداة الدالة بالطريقة المعتادة

Call AddToAudit()

 

 

مميز ومبدع :wub:

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

12 دقائق مضت, Foksh said:

وهذه مشاركتي بطريقة أخرى :jump:

 

المستحيل ليس له وجود مع المبدعين :clapping:

الله الله عليك مستر فادي 😄

بس زين لو تشرح الفكرة 🙂

 

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

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.

×
×
  • اضف...

Important Information