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

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

قام بنشر

السلام عليكم

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

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

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

- معرف السجل

- اسم الحقل

- اسم النموذج

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

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

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

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

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

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

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

اولا :

نقل الكائنات التالية (جدول/نموذج/وحدة نمطية) الى برنامجك : 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.accdbFetching info...

Database2.rarFetching info...

Database5.accdbFetching info...

  • Like 2
  • Thanks 3
قام بنشر

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

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

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

  في 11‏/2‏/2024 at 07:06, ابوخليل said:
If TypeOf ctlC Is TextBox Then
Expand  

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

If TypeOf ctlC Is TextBox Or TypeOf ctlC Is ComboBox Then

 

 

 

قام بنشر
  في 11‏/2‏/2024 at 11:48, Foksh said:

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

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

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

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

If TypeOf ctlC Is TextBox Or TypeOf ctlC Is ComboBox Then

 

 

 

Expand  

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

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

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

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

قام بنشر (معدل)
  في 11‏/2‏/2024 at 16:48, ابوخليل said:

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

Expand  

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

 

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

 

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

Database2.accdbFetching info...

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

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

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

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

 

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

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

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

 

Expand  

 

  • Like 1
قام بنشر

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

 

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

قام بنشر

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

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

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

 

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

قام بنشر

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

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

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

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

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

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

قام بنشر
  في 11‏/2‏/2024 at 20:12, محمد القدسي said:

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

 

Expand  

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

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

قام بنشر

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

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

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

 

قام بنشر
  في 11‏/2‏/2024 at 07:06, ابوخليل said:

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

Expand  

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

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

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

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

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

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

image.png.bb5dedd6a0b08f0c164c00b908f97db6.png

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

  • Like 1
قام بنشر

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

  اقتباس

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

Expand  

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

  اقتباس

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

Expand  

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

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

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

 

قام بنشر
  في 12‏/2‏/2024 at 08:36, ابوخليل said:

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

Expand  

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

 

  في 12‏/2‏/2024 at 08:36, ابوخليل said:

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

Expand  

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

قام بنشر
  في 12‏/2‏/2024 at 09:08, Moosak said:

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

Expand  

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

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

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

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

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

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

  • Like 1
قام بنشر
  في 12‏/2‏/2024 at 09:08, Moosak said:

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

Expand  

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

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

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

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

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

Database4.rarFetching info...

قام بنشر

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

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

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

 

Track Changes - Moosak.accdbFetching info...

قام بنشر

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

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

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

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

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

 

  • Like 1
قام بنشر
  في 12‏/2‏/2024 at 00:26, محمد القدسي said:

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

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

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

 

Expand  

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

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

 

قام بنشر
  في 12‏/2‏/2024 at 16:01, ابوخليل said:

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

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

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

Expand  

توقعتك تسأل .. 😄🖐🏻️ .. هذه واحدة من الطرق الجميلة لتطبيق دالة معينة على مجموعة من العناصر مرة واحدة ..
قمت بتحديد جميع العناصر ثم كتبت اسم الدالة في حدث بعد التحديث هكذا ( ()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.accdbFetching info...

 

 

تم تعديل بواسطه Foksh
  • Like 2
قام بنشر
  في 12‏/2‏/2024 at 17:41, Moosak said:

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

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

image.png.810428f3c252179012a39a3e6324d956.png

 

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

image.png.96a968380903c286bc8e058834b0261c.png

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

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

Call AddToAudit()

 

Expand  

 

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

قام بنشر
  في 12‏/2‏/2024 at 17:43, Foksh said:

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

 

Expand  

المستحيل ليس له وجود مع المبدعين :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