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

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

قام بنشر

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

 

في إحدى المواضيع التي تم طرحها في "الفعاليات والتحديات الشهرية" ، وتحديداً في التحدي الأول ، كان من أحد الحلول والأفكار المطروحة ؛ تطبيق ماكرو على مستوى الجدول لمنع التحديث والتعديل لأي قيمة داخل الجدول . لكن طبعاً كانت الفكرة قائمة على التنفيذ اليدوي من خلال إضافة ماكرو قبل التحديث للجدول من خصائص الجدول نفسه . الحاصل هنا أنني أريد تطبيق هذه الفكرة برمجياً ، وخصوصاً أن لدي ما يقارب الـ 25 جدول . والهدف هو منع الحقن الخارجي أو التلاعب بالجداول . وقد أرهقتني كثرة المحاولات ولم أصل إلى نتيجة حتمية برمجية صحيحة . حتى بمساعدة الذكاء الإصطناعي 😣 . وقد طرحت السؤال داخل مجموعتنا "مجتمع آكسيس جروب" في الواتس أب ، ولم ألقَ أي إجابة .

أرجو المساعدة بتطبيق الفكرة برمجياً VBA بحيث أحدد اسم (الجدول / الجداول) التي أريد تطبيق حمايتها من التعديل لأي قيمة ، و الحذف لأي سجل . (كلاهما)

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

 

أفيدوني أفادكم الله .

وهذا ملف مرفق كمثال يحتوي جدول بحقول بسيطة وبه 3 سجلات عشوائية .

 

TblMacroVBA.accdb

قام بنشر (معدل)

قبل ما يتم اعطاء الافكار - هل حضرتك طالب الحماية علي مستوى النماذج  ( التي تحتوى على هذه الجداول ال 25 ) و لا على مستوى الجداول نفسها ؟

سأفترض انها على مستوى النماذج التي تحتوى الجداول .

مجرد فكره بسيطة 

1-نعمل جدول و يتم وضع به اسماء الجداول ال 25 المراد حمايتها 

2-نعمل دالة نختبر هل الجدول الحالي ( الذي هو مصدر السجلات للنموذج الحالي مثلا)  من ضمن الجداول ال 25 ام لا 

اذا كان منهم نمنع التعديل و اذا كان ليس منهم نسمح بالتعديل

 

تم تعديل بواسطه mohammed farhat
قام بنشر (معدل)
22 دقائق مضت, mohammed farhat said:

قبل ما يتم اعطاء الافكار - هل حضرتك طالب الحماية علي مستوى النماذج  ( التي تحتوى على هذه الجداول ال 25 ) و لا على مستوى الجداول نفسها ؟

سأفترض انها على مستوى النماذج التي تحتوى الجداول .

مجرد فكره بسيطة 

1-نعمل جدول و يتم وضع به اسماء الجداول ال 25 المراد حمايتها 

2-نعمل دالة نختبر هل الجدول الحالي ( الذي هو مصدر السجلات للنموذج الحالي مثلا)  من ضمن الجداول ال 25 ام لا 

اذا كان منهم نمنع التعديل و اذا كان ليس منهم نسمح بالتعديل

 

شكراً لاستجابتك مهندس محمد ..

انا أريد منع التعديل على الجداول نفسها من داخل الجداول نفسها .

يعني لو فتحت أي جدول وحاولت اعمل عليه تعديل أو حذف سجل ، يمنع التعديل أو الحذف منه .

 

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

Test.accdb

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

تفضل عمي فادي .. جرب 🙂 :

TblMacroVBA.accdb

 

لتطبيق الحماية أو إزالتها على جدول أو مجموعة جداول  :

' Usage (from VBA Immediate Window or code):
'   ApplyTableProtection "Tbl_Cust"               ' single table
'   ApplyTableProtection "Tbl_Cust", "Tbl_Orders"  ' multiple tables
'
'   RemoveTableProtection "Tbl_Cust"
'   RemoveTableProtection "Tbl_Cust", "Tbl_Orders"

 

  • Like 1
قام بنشر (معدل)
1 ساعه مضت, Moosak said:

تفضل عمي فادي .. جرب 🙂 :

شكراً لك من القلب مهندسنا أبا المعتصم :clapping: .. أمسكتني طرف الخيط بشكل محكم ..

ولكن في تجربتك الجميلة والرائعة كانت النتيجة عند تجربة الإضافة والحفظ من داخل نموذج :-

image.gif.bbee6885a1de1bddbf5d91d697aa1bea.gif

 

أي أنه حتى النموذج لم يستطع إضافة سجل 😥 .

أيضاً لو كان لدي 25 جدول على سبيل المثال ، فهل سأضطر إلى كتابة كافة أسماء الجداول في مصفوفة الاستدعاء للحماية أو الحذف 😁 !!

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

حتى النموذج لم يستطع إضافة سجل

حبيبنا .. أنت الآن تمسك الأداة الأساسية بيدك .. وباقي أنك تبدع في استخدامها بعدة أشكال 😁👌

واحد من الحلول : تستدعي دالة فك الحماية في زر الحفظ قبل أمر الحفظ وتعيد الحماية بعد تأكيد الحفظ .. بكذا تضمن أن الحماية تشتغل في الجداول فقط 👍🏻🙂

منذ ساعه, Foksh said:

كان لدي 25 جدول على سبيل المثال ، فهل سأضطر إلى كتابة كافة أسماء الجداول في مصفوفة الاستدعاء للحماية أو الحذف

هذي بلمسة بسيطة من أيدك الكريمة وتكون محلولة قدامك .. 😅🖐🏻

هم سطرين لوووب تكتبهم يطبقولك الدالة على كل الجداول 😎

قام بنشر

تتركني في أول الطريق ، وانت صاحب الكود وأدرى بخباياه 😥 ...

بحاول ، وإن لم أخرج بنتيجة ، فنرجوا المساعدة ممن يجود علينا بكرمه 

قام بنشر

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

فوالله أني لم أتعثر حتى بطرف الخيط ، ولم أستدل إلى فكرة حتى لو لم تكن ناجحة 😇

  • Haha 1
قام بنشر
3 ساعات مضت, Foksh said:

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

تقصدني أنا صح ؟ 😅

سواء كانت هذه نيتك أم لا فأنا أشكرك لطرح هذا السؤال حتى يخرج لنا الأستاذ @Moosak بهذه التحفة فقد قدم لنا قطعة من الصلصال وما علينا إلا تشكيلها كما نشاء وهذه كانت تجربتي

111.thumb.gif.91149d08fe6d450a2827780db425e1f1.gif

ولكن هذا تطلب مني تعديل دالة CheckProtection لتصبح على النحو التالي

Public Function CheckProtection(ByVal tblName As String) As Boolean
    On Error GoTo ErrHandler
    
    Dim tmpPath As String
    tmpPath = Environ("TEMP") & "\DataMacro_Check_" & tblName & ".xml"
    
    ' Export the data macro (acTableDataMacro = 12, hidden member)
    Application.SaveAsText AC_TABLE_DATA_MACRO, tblName, tmpPath
    
    ' Read contents using FSO (Unicode)
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    If fso.FileExists(tmpPath) Then
        Dim ts As Object
        Set ts = fso.OpenTextFile(tmpPath, 1, False, -1) ' -1 = Unicode
        Dim result As String
        result = ts.ReadAll
        ts.Close
        
        On Error Resume Next
        Kill tmpPath
        On Error GoTo 0
        
        CheckProtection = True
        
    Else
        Debug.Print "No file was created."
        
        CheckProtection = False
    
    End If
    
    Set fso = Nothing
    Exit Function

ErrHandler:
    blnIsBlocked = False
    Debug.Print "No data macro found on '" & tblName & "': " & Err.Description
    Debug.Print "ERROR: " & Err.Description
    
    CheckProtection = False
    
End Function

 أصبحت نتيجة هذه الدالة من النوع Boolean بدل String لترجع True إذا كان الجدول محمي أو False إذا كان غير محمي

وسؤالي للأخ موسى هل سيسبب هذا التغيير أي مشكلة وأنه من الضروري أن يكون ناتج هذه الدالة ذلك النص الطويل؟

الآن عند النقر على الزر الأول سيتم التحقق من وجود الماكرو فإذا لم يجده سينشئه ثم يفتح النموذج

If CheckProtection("Tbl_Cust") = False Then
    ApplyTableProtection "Tbl_Cust"
End If

DoCmd.OpenForm "frmCust"

يمكن أن يكون هذا الكود خلف حدث الإغلاق للنموذج أو أي مكان آخر

والعكس في الزر الثاني إذا كان موجود سيزيله ثم يفتح النموذج

If CheckProtection("Tbl_Cust") = True Then
    RemoveTableProtection "Tbl_Cust"
End If

DoCmd.OpenForm "frmCust"

صراحة تعجبني الحلول المبتكرة القابلة للتشكيل وفقاً لطريقة عمل كل شخص

برافو أستاذ موسى :clapping:

  • Like 2
قام بنشر
2 ساعات مضت, منتصر الانسي said:

تقصدني أنا صح ؟ 😅

هههههههههه ، تقريباً 😁

الشكر لله من قبل ومن بعد ، وفعلاً قطعة الصلصال هذه فتحت لي باب الأفكااااااار الغريبة التي تراودني . وقد أسعدت بلقاء صوتي جمعني مع أخي موسى وقد شاركني تجربة فريدة وجميلة جداً ، ولكن اتضح أنني أنا اللي كنت غائب في هذه الأيام .

 

وخطر ببالي سؤال عند ملاحظتي لـ blnIsBlocked ، هل تم تعريف هذا المتغير ؟؟

2 ساعات مضت, منتصر الانسي said:

وسؤالي للأخ موسى هل سيسبب هذا التغيير أي مشكلة وأنه من الضروري أن يكون ناتج هذه الدالة ذلك النص الطويل؟

والإجابة هنا لصاحب الفكرة طبعاً ..

 

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

 

 

قام بنشر
8 دقائق مضت, Foksh said:

وخطر ببالي سؤال عند ملاحظتي لـ blnIsBlocked ، هل تم تعريف هذا المتغير ؟؟

لا لا هذا كان نتيجة فكرة كنت طبقتها ثم تراجعت عنها ونسيت حذف هذا السطر :wub:

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

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

صراحة أنا غير ملم بالماكرو خصوصاً ماكرو البيانات ولكن السؤال أثار فضولي للبحث فيه

  • Like 1

انشئ حساب جديد او قم بتسجيل دخولك لتتمكن من اضافه تعليق جديد

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

انشئ حساب جديد

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

سجل حساب جديد

تسجيل دخول

هل تمتلك حساب بالفعل ؟ سجل دخولك من هنا.

سجل دخولك الان
×
×
  • اضف...

Important Information