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

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

قام بنشر

بسم الله الرحمن الرحيم

عرض أخونا أبو عقيل مثال في الصلاحيات والترميز وعمليات المستخدمين وهو مثال قيم

وأردت عرضه على الأعضاء مع التعرض بالشرح لموضوع الصلاحيات

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

==========================================

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

إذا الصلاحيات هي فتح النموذج أو التقرير وبكلامنا العادي أننا إذا صنعنا جدول يتم تحديثه كلما تم فتح البرنامج ليكون موجود به اسم المستخدم الحالي فقط وكلمة السر الخاصة به مع مستويات الصلاحيات له ، وعند فتح أي نموذج يذهب البرنامج إلى الجدول ثم يختبر خلية الصلاحية فإذا كانت بنعم ( أو 1) يفتح النموذج وإذا كانت ( لا أو 2) يغلق النموذج مع رسالة بها اسم المستخدم الحالي تقوله له ليس من حقك فتح هذه الشاشة .

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

وفي مثال أخونا أبو عقيل كانت الأدوات كالتالي مع أشكال توضح خصائص الحقول

أ- الجداول

1- جدول المستخدمين ( tb5) وهو الذي سيحتوي على معلومات جميع المستخدمين ويحتوي على

* حقل Name لاسم المستخدم مفتاح يمنع تكرار أسماء المستخدمين

tab01.jpg

* حقل rmz لرمز المستخدم والغرض الأساسي منه تمييز المدير أو مالك البرنامج بالرمز ( mas ) ليتم تمييزه عن غيره من المستخدمين وهذا التمييز هو الذي سيستخدم لاحقاً في فتح نموذج الصلاحيات نفسه وهو حقل لا يسمح بالتكرار حتى يكون المسئول واحد فقط .

tab02.jpg

* حقل password وهو الخاص بالرمز السري للمستخدم أو الرقم السري وقناع الإدخال يكون password ليكون نجوم ولا يسمح بالتكرار .

tab03.jpg

*بعد ذلك تأتي حقول المستويات ( levels ) وهذا الحقل عبارة عن قائمة من عمودين عمود يحتوي على صفين بهما القيمين (1 ،2) والعمود الآخر قيمتين مناظرتين ( نعم ولا ) وتم تغيير خصائص هذا الحقل ليظهر كعمود واحد به الأربع قيم أسفل بعضهم ويتم تخزين القيمة 1 أو 2 في الحقل

tab04.jpg

tab04-2.jpg

وسبب الاختيار لخصائص هذا الحقل بهذا الشكل لأنه سيتم إدخال قيم هذا الحقل من نموذج الصلاحيات وستكون القيم الظاهرة في النموذج هي نعم أولا بينما يتم تخزين القيم في الحقل ب 1مناظره لنعم أو 2 مناظره لـ لا

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

أما البيانات التي ستخزن في هذا الجدول

فهي اسم المستخدم ورمزه ورقمه السري وصلاحياته والتي سنقرنها بنموذج أو أكثر مقابل لكل level بمعنى أننا لو اعتبرنا أن لدينا نموذج form1 سنقرنه بـ level1 فإذا كانت قيمة حقل level1 =1 سنسمح بفتح النموذج أما إذا كانت قيمته 2 سيتم إغلاق النموذج .

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

2- جدول fbi وهذا الجدول به نفس الحقول السابقة بحيث أنك تستطيع نسخ الجدول السابق مع تغيير اسمه ثم حذف حقل password منه ولكن أخونا أبو عقيل أضاف حقيلن آخرين وهما date و Time ليستخدمهما في تاريخ وتوقيت الحذف والإضافة والتعديل في البيانات وأعتقد أن هذين الحلقين ليس لهما علاقة مباشرة بموضوع الصلاحيات .

tab05.jpg

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

يليه الجزء الثاني وقد تم تجزأة الموضوع لكثرة عدد الصور

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

النماذج والاستعلامات .

=======================

1- نموذج إضافة المستخدمين frm-p2 وهو نموذج بسيط مصدره الجدول tb5 يتكون من حقل name وحقل password وحقل rmz وزر أمر ( ذهاب إلى سجل جديد ) ومكتوب عليه إضافة ...

form01.jpg

وعند إضافة أي مستخدم وبما أن حقل name مفتاح وحقل password لا يتكرر وحقل rmz لا يتكرر بذلك لن يسمح بإدخل مستخدم مرتين مع ملاحظة عند إدخال معلومات المسئول أو المدير يجب أن يأخذ حقل الرمز القيمة mas ( كما في مثالنا ) . وعند إضافة الحقول الثلاثة سيتم إعطاء القيمة 2 لكل مستويات الصلاحية لأنها القيمة الافتراضية . وعندما نريد تغيير هذه القيمة سيكون من نموذج الصلاحيات لاحقاً . .

2- نموذج حذف مستخدم frm-p5

form02.jpg

form03.jpg

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

كما يوجد بالنموذج زر أمر حذف السجل وتم إنشاؤه بواسطة المعالج مع إضافة 3 أسطر من الكود إليه كما بالشكل

form04.jpg

3- نموذج تعديل بيانات مستخدم frm-p5

وهذا النموذج مثل سابقه مصدر السجل فيه عبارة عن جملة sql استعلام تم إنشائه عن طريق منشئ الاستعلامات داخل الخصائص ويتم تحديد السجل الحالي بناءاً على الاسم الذي يتم إدخاله في حقل الاسم في النموذج فعند كتابة اسم مستخدم في حقل الاسم يتم تحديد السجل والذي يتساوى فيه الاسم مع حقل name تمهيداً للتعامل مع هذا السجل مع وضع قيمة الاسم من الجدول في حقل mes المخفي على النموذج وكذلك كلمة السر المناظره للاسم في حقل pasword على النموذج إيضاً

form05.jpg

form06.jpg

في النموذج يوجد حقلين غير منضمين في النموذج وهما name و pas

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

form07.jpg

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

form08.jpg

وإذا كانت كلمة المرور صحيحة سيتم إظهار حقل password وهو لتغيير كلمة المرور .

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

وزر الأمر حفظ مهمته إخلاء جميع الحقول مره ثانيه تمهيداً لتعديل مستخدم آخر أو إيذاناً بانتهاء التعديلات المطلوبة .

4- نموذج صلاحيات المستخدمين (( النموذج الأساس )) frm-p6

هذا النموذج هو الذي سنقوم بإعداد الصلاحيات للمستخدمين من خلاله ولكن قبل إعداد هذا النموذج يجب عليك تحديد مستويات الصاحيات أولاً .. بمعنى

لدينا الآن 14 مستوى صلاحيات قابل للزيادة مع التعديل في الاستعلامات ومن الممكن استخدام أي عدد منهم وترك الباقي وفي مثال أبو عقيل استخدم 7 مستويات فقط

مقابل هذه المستويات يجب أن يكون هناك نماذج أو تقارير

أي النموذج رقم واحد مقابل للمستوى واحد ..... فإذا كان للمستخدم القيمة (1) في level1 يقوم البرنامج بالسماح له بفتح النموذج واحد وإذا كانت القيمة 2 لا يسمح له بفتح النموذج

وبالنسبة لمثال أبو عقيل كانت المستويات كالتالي

Level1 ========> نموذج f1 تسجيل موظف جديد

Level2 ========> نموذج f2-3 تعديل معلومات موظف

Level6 ========> نموذج frm-p2 تسجيل مستخدم جديد

Level7 ========> نموذج frm-p5 حذف مستخدم

Level3 ========> نموذج f-rturn إعادة موظف

Level8 ========> نموذج name معلومات المنشأة

Level9 ========> نموذج tar أساسيات البرنامج

ولنرى الآن النموذج frm-p6 ولماذا لم نرى له صلاحية ضمن مستويات الصلاحيات مع أنه محمى ومحجوب عن المستخدمين وممنوح صلاحيته للمدير أو المسئول وهذا ما سنعرفه

form09.jpg

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

form10.jpg

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

DoCmd.Requery  'تحديث النموذج لعرض الحقول 

DoCmd.GoToControl "level1"  'الذهاب إلى الحقل الأول
الآن بعد اختيار اسم المستخدم وعرض صلاحياته نستطيع التعديل فيه بتغيير قيم levels من لا إلى نعم والتي ستقوم بتخزين القيم 1 بدلاً من نعم في الجدول والقيمة 2 بدلاً من لا كما أسلفنا في الحديث عن الجداول . وبعد تعديل الصلاحيات للمستخدم وبالضغط على زر أمر حفظ التغييرات الجديدة للمستخدم يتم الحفظ مع إخلاء حقل user وكذلك تحديث النموذج ليعود كما تم الفتح عليه تمهيداً للتعديل في مستخدم جديد مع وضع الكود التالي في حدث عند الضغط لزر الأمر
DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70

    DoCmd.GoToControl "user"

    Me![user] = Null

    DoCmd.Requery

يليه الجزء الثالث

قام بنشر

الآن نصل لأهم نقطه وهى كيفية تعريف الصلاحية للنموذج

يتم إنشاء حقل يوضع على كل نموذج نريد عمل صلاحية له أو أي تقرير نريد عمل صلاحية له وهذا الحقل به دالة

وهنا الصلاحية تنقسم إلا قسمين

الأول == صلاحيات للمسئول فقط

الثاني == صلاحيات للمستخدمين

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

أما بالنسبة للمسؤل أوالمدير فيتم البحث عن قيم الحقل emz وليس level لأنه هو الوحيد الذي سيكون رمزه mas أي مسئول وعند فتح النموذج إذا وجدنا أن قيمة هذا الحقل هي mas يفتح النموذج وإلا فليس له صلاحية الفتح أي ليس هو المسئول ..

وفي المثال أو صلاحيات المستخدمين (( النموذج الأساس )) frm-p6

يوجد الحقل rmz وهو غير مرئي للمستخدم ويوجد به الدالة التالية

DLookUp("[rmz]";"fbi")
وهي الخاصة بإرجاء القيمة للحقل rmz من جدول fbi ووضعها في هذا الحقل ليتم المقارنه بعد ذلك بالكود وفي حدث عند الفتح للنموذج تم وضع الكود التالي وهو كود الصلاحية في جميع النموذج مع اختلاف طفيف من المسئول إلى المستخدم
Private Sub Form_Open(Cancel As Integer)

If Me![rmz] = "mas" Then   'إذا كان الحقل rmzقيمته تساوي mas

DoCmd.OpenForm "frm-p6"  'افتح النموذج 

Else  ' وإلا 

Beep    'صوت   

Dim zm   'إعلان عن متغير 

zm = DLookup("[user]", "fbi")    'المتغير يساوي اسم المستخدم الحالي 

MsgBox "عفوا يا سيد   " & "( " & zm & " )" & " شاشة الصلاحيات والتحكم من اختصاص المسئول فقط  !!!! ", vbOKOnly, "تحذيـــــــر"

DoCmd.Close    'اغلق النموذج 

End If


End Sub
هذا الكود هو الأساسي وببساطه يقوم مقارنة الحقل rmz في النموذج والذي أخذ قيمته بالدالة السابقة وهل هذه القيمة هي mas أم لا وعلى هذا الأساس يتم فتح النموذج . أ======== أما النسبة للصلاحية للمستخدمين فنأخذ مثال عليها نموذج tar وبه مستوى الصلاحية level9 form11.jpg حقل الصلاحية هو الحقل الغير مرئي للمستخدم level9 وبه دالة
=DLookUp("[level9]";"fbi")  
وهذه الدالة تقوم بإرجاع القيمة داخل الحقل level9 داخل الجدول fbi وفي حدث عند الفتح يتم وضع الكود التالي ونلاحظ أنه يختلف عن الكود السابق بدلاً من القيمة rmz نضع القيمة 1
Private Sub Form_Open(Cancel As Integer)

If Me![level9] = 1 Then  '       موضع الاختلاف في القيمة

DoCmd.OpenForm "tar"

DoCmd.GoToControl "no1"

Else

Beep

Dim zm

zm = DLookup("[user]", "fbi")

MsgBox "عفوا يا سيد /  " & "( " & zm & " )" & " ليس لك الحق بالدخول لهذه الشاشة ", vbOKOnly, "تحذيـــــــر"

DoCmd.Close

End If

End Sub
==== بذلك نكون تطرقنا لجوانب الحماية وبقي شاشة الدخول إلى البرنامج النموذج frm-p1 وهو الخاص بالدخول إلى البرنامج وتسجيل اسم المستخدم وكلمة المرور بنفس أسلوب الكثير من النماذج السابقة كان مصدر هذا النموذج هو جملة sql عن طريق منشئ الاستعلامات داخل الخصائص والمعيار هو اسم المستخدم name form12.jpg عندما يدخل المستخدم اسماً في حقل اسم المستخدم name يتم تحديث الحقل المخفي password ليحتوي على قيمة كلمة المرور المأخوذه من جدول fb5 بناءا على اسم المستخدم ... وللتأكد من وجود المستخدم ضمن المستخدمين من عدمه يوضع الكود التالي في حدث بعد التحديث للحقل name مع إظهار رسالة تفيد عدم وجود المستخدم ضمن المستخدمين المعتمدين
Private Sub name_AfterUpdate()

DoCmd.Requery

If (Eval("[Forms]![frm-p1]![pasword] Is Null")) Then

Beep

MsgBox "åÐÇ ÇáãÓÊÎÏã ÛíÑ ãæÌæÏ Öãä ÇáãÓÊÎÏãíä ÇáãÚÊãÏíä ÈÇáÍÇÓÈ..  ÊÃßÏ ãä ÇÓã ÇáãÓÊÎÏã ÃæáÇ !!!", vbInformation, "ÑÓÇáÉ ÊÍÐíÑíÉ"

DoCmd.GoToControl "name"

Me![name] = Null

 End If

  If (Eval("[Forms]![frm-p1]![pasword] Is Not Null")) Then

  DoCmd.GoToControl "zm"

  End If

End Sub
وعند وجود المستخدم فعلاً يتم نقل المؤشر إلى خانة كلمة المرور الحقل zm لكتابة كلمة المرور وبعد تحديث هذا الحقل يتم تشغيل الكود التالي ليتأكد البرنامج أن كلمة المرور التي كتبها المستخدم مطابقة لتلك المخزنة له في الجدول tb5 والكود التالي يوضع في حدث بعد التحديث للحق zm
For r = 1 To 3

x = Me![pasword]

If Me.zm = "12369874" Then

DoCmd.SetWarnings False

DoCmd.OpenQuery "q4", acNormal, acEdit   ' هذا الاستعلام غير موجود في المثال

DoCmd.SetWarnings True

DoCmd.Close

End

End If

If Me.zm = x Then

DoCmd.SetWarnings False

DoCmd.OpenQuery "q6", acNormal, acEdit ' استعلام إلحاق بيانات المستخدم الحالي بالجدول fbi

DoCmd.SetWarnings True

DoCmd.Close

'docmd.OpenForm " "

End

Else

Beep

MsgBox "كلمة المرور خاطئة ... حاول مرة أخرى", 48, ""محاولة أخرى

End

End If

Next r

MsgBox "لا محاولات أخرى فضلاً اتصل على المبرمج على الرقم 55555555  !", 48, ""خروج نهائي من البرنامج

DoCmd.Quit

End Sub

ولي ملاحظة على هذا الكود أولاً القسم الأول منه يختبر الحقل zm فإذا ساوى الرقم 12369874 يتم تشغيل استعلام q4 وهذا الاستعلام أساساً غير موجود في المثال وأتوقع انه يقوم بحذف جميع المستخدمين من الجدول tb5 بما فيهم المدير أو المسئول حتى يتسنى للمبرمج إضافة مسؤول جديد وكلمة مرور جديدة له ... وهذا يحدث عند تحميل البرنامج لأول مره مثلاً .. وهذه الملاحظة مجرد استنتاج فكما تعلمون لست أنا من صنع المثال ..

والجزء الثاني من الكود يقوم باختبار نفس الحقل zm فإذا وجده يساوي الحقل password طبعاً بالإعلان عن متغيرات مع عد لعدد المحاولات وإذا وجد القيمين متطابقين يدخل البرنامج وإلا يخرج من البرنامج بعد عدد معين من المحاولات

form13.jpg

أما الاستعلام الوحيد الخارجي الذي استخدمه أبو عقيل في الصلاحيات فهو الاستعلام q6 وهو استعلام تحديث يقوم بأخذ قيم سجل المستخدم الحالي بعد أن أدخل اسمه وكلمة مروره الصحيحه ويحدث بها بيانات الجدول fbi ليكون هذا الجدول دائماً هو جدول المستخدم الحالي .

ملاحظات :

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

وهناك حل آخر تفضل به الأستاذ المبدع اشرف خليل وهو إضافة كود لإخفاء الجدول وسأقوم بإضافته مع نموذ بإذن الله

هذا كل شيء

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

مع تحياتي

أخوكم رضا عقيل

  • Like 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.

  • تصفح هذا الموضوع مؤخراً   0 اعضاء متواجدين الان

    • لايوجد اعضاء مسجلون يتصفحون هذه الصفحه
×
×
  • اضف...

Important Information