رضا عقيل قام بنشر أغسطس 17, 2003 قام بنشر أغسطس 17, 2003 بسم الله الرحمن الرحيم عرض أخونا أبو عقيل مثال في الصلاحيات والترميز وعمليات المستخدمين وهو مثال قيم وأردت عرضه على الأعضاء مع التعرض بالشرح لموضوع الصلاحيات وهذا الشرح مجرد اجتهاد فقط فلست أنا من صنع المثال وأتمنى أن أكون عند حسن ظنكم فلست خبيراً كما تظنون ولكني طالب علم أجتهد فقط لا غير كما أرجوا أن يسامحنى أبو عقيل أعاده الله إلينا سالماً على هذا الشرح السيئ لمثال عبقري من أمثلته . ========================================== تعتمد طريقة أبو عقيل في الصلاحيات على طريقة الخيارات للمستخدمين في تحديد من المتاح أو المسموح له فتح النماذج أو التقارير إذا الصلاحيات هي فتح النموذج أو التقرير وبكلامنا العادي أننا إذا صنعنا جدول يتم تحديثه كلما تم فتح البرنامج ليكون موجود به اسم المستخدم الحالي فقط وكلمة السر الخاصة به مع مستويات الصلاحيات له ، وعند فتح أي نموذج يذهب البرنامج إلى الجدول ثم يختبر خلية الصلاحية فإذا كانت بنعم ( أو 1) يفتح النموذج وإذا كانت ( لا أو 2) يغلق النموذج مع رسالة بها اسم المستخدم الحالي تقوله له ليس من حقك فتح هذه الشاشة . ومن الأفضل استيراد الكائنات الخاصة بالصلاحيات ثم نسخ الأكواد اللازمة لعملها على النماذج ولكننا سنبدأ من البداية حتى نتعرف على كيفية بنائها وكيفية تطويرها وملاءمتها لبرامجنا . وفي مثال أخونا أبو عقيل كانت الأدوات كالتالي مع أشكال توضح خصائص الحقول أ- الجداول 1- جدول المستخدمين ( tb5) وهو الذي سيحتوي على معلومات جميع المستخدمين ويحتوي على * حقل Name لاسم المستخدم مفتاح يمنع تكرار أسماء المستخدمين * حقل rmz لرمز المستخدم والغرض الأساسي منه تمييز المدير أو مالك البرنامج بالرمز ( mas ) ليتم تمييزه عن غيره من المستخدمين وهذا التمييز هو الذي سيستخدم لاحقاً في فتح نموذج الصلاحيات نفسه وهو حقل لا يسمح بالتكرار حتى يكون المسئول واحد فقط . * حقل password وهو الخاص بالرمز السري للمستخدم أو الرقم السري وقناع الإدخال يكون password ليكون نجوم ولا يسمح بالتكرار . *بعد ذلك تأتي حقول المستويات ( levels ) وهذا الحقل عبارة عن قائمة من عمودين عمود يحتوي على صفين بهما القيمين (1 ،2) والعمود الآخر قيمتين مناظرتين ( نعم ولا ) وتم تغيير خصائص هذا الحقل ليظهر كعمود واحد به الأربع قيم أسفل بعضهم ويتم تخزين القيمة 1 أو 2 في الحقل وسبب الاختيار لخصائص هذا الحقل بهذا الشكل لأنه سيتم إدخال قيم هذا الحقل من نموذج الصلاحيات وستكون القيم الظاهرة في النموذج هي نعم أولا بينما يتم تخزين القيم في الحقل ب 1مناظره لنعم أو 2 مناظره لـ لا وهكذا حتى المستوى الرابع عشر كما في مثالنا ... أما البيانات التي ستخزن في هذا الجدول فهي اسم المستخدم ورمزه ورقمه السري وصلاحياته والتي سنقرنها بنموذج أو أكثر مقابل لكل level بمعنى أننا لو اعتبرنا أن لدينا نموذج form1 سنقرنه بـ level1 فإذا كانت قيمة حقل level1 =1 سنسمح بفتح النموذج أما إذا كانت قيمته 2 سيتم إغلاق النموذج . الشخص الذي سيوضع رمزه ( حسب مثال أبو عقيل ) = mas هو الذي سيكون له الصلاحيات الكاملة بغض النظر عن اسمه أو كلمة السر الخاصة به . وسنقوم بتغيير جميع مستويات الصلاحية الخاصة به في الجدول إلى الرقم 1 2- جدول fbi وهذا الجدول به نفس الحقول السابقة بحيث أنك تستطيع نسخ الجدول السابق مع تغيير اسمه ثم حذف حقل password منه ولكن أخونا أبو عقيل أضاف حقيلن آخرين وهما date و Time ليستخدمهما في تاريخ وتوقيت الحذف والإضافة والتعديل في البيانات وأعتقد أن هذين الحلقين ليس لهما علاقة مباشرة بموضوع الصلاحيات . هذا الجدول لن يتدخل أحد في كتابة بياناته بل سيقوم البرنامج بتحديث بياناته بناءاً على اسم المستخدم الذي سندخله في شاشة الدخول للبرنامج فعندما نكتب اسم المستخدم وكلمة مروره الصحيحة سيقوم البرنامج بتشغيل استعلام تحديث يأخذ بيانات المستخدم كاملة ويحدث بها سجل جدول fbi وكلما تغير المستخدم تغيرت بيانات سجل الجدول fbi حسب المستخدم الجديد . يليه الجزء الثاني وقد تم تجزأة الموضوع لكثرة عدد الصور 1 2
رضا عقيل قام بنشر أغسطس 17, 2003 الكاتب قام بنشر أغسطس 17, 2003 النماذج والاستعلامات . ======================= 1- نموذج إضافة المستخدمين frm-p2 وهو نموذج بسيط مصدره الجدول tb5 يتكون من حقل name وحقل password وحقل rmz وزر أمر ( ذهاب إلى سجل جديد ) ومكتوب عليه إضافة ... وعند إضافة أي مستخدم وبما أن حقل name مفتاح وحقل password لا يتكرر وحقل rmz لا يتكرر بذلك لن يسمح بإدخل مستخدم مرتين مع ملاحظة عند إدخال معلومات المسئول أو المدير يجب أن يأخذ حقل الرمز القيمة mas ( كما في مثالنا ) . وعند إضافة الحقول الثلاثة سيتم إعطاء القيمة 2 لكل مستويات الصلاحية لأنها القيمة الافتراضية . وعندما نريد تغيير هذه القيمة سيكون من نموذج الصلاحيات لاحقاً . . 2- نموذج حذف مستخدم frm-p5 وهو كما بالشكل نموذج مصدر السجل فيه عبارة عن استعلام تم إنشائه عن طريق منشئ الاستعلام ووظيفته تحديد سجل في جدول tb5 بناءاً على الاسم الذي سيتم اختياره من خلية اسم المستخدم .. بمعنى أنه عندما نختار من القائمة اسم مستخدم لنقوم بحذفه يقوم الاستعلام بتحديد ذلك السجل في جدول tb5 والذي يتساوى فيه الاسم الذي تم اختياره من القائمة مع حقل name في الجدول ... كما يوجد بالنموذج زر أمر حذف السجل وتم إنشاؤه بواسطة المعالج مع إضافة 3 أسطر من الكود إليه كما بالشكل 3- نموذج تعديل بيانات مستخدم frm-p5 وهذا النموذج مثل سابقه مصدر السجل فيه عبارة عن جملة sql استعلام تم إنشائه عن طريق منشئ الاستعلامات داخل الخصائص ويتم تحديد السجل الحالي بناءاً على الاسم الذي يتم إدخاله في حقل الاسم في النموذج فعند كتابة اسم مستخدم في حقل الاسم يتم تحديد السجل والذي يتساوى فيه الاسم مع حقل name تمهيداً للتعامل مع هذا السجل مع وضع قيمة الاسم من الجدول في حقل mes المخفي على النموذج وكذلك كلمة السر المناظره للاسم في حقل pasword على النموذج إيضاً في النموذج يوجد حقلين غير منضمين في النموذج وهما name و pas بعد كتابة الاسم المراد تعديل كلمة السر له في الحقل name التأكد من عدم خلو الحقل من البيانات والتأكد من وجود هذا المستخدم ضمن المستخدمين بكود يوضع في خصائص هذا الحقل ( name ) في حدث بعد التحديث إذا كان المستخدم ضمن المستخدمين والاسم صحيح سينتقل المؤشر إلى خلية كلمة المرور السابقة والتي اسمها pas وهي حقل غير منضم وبعد كتابة كلمة المرور يتم التأكد من أن كلمة المرور المدخله تساوي كلمة المرور الخاصة بذلك المستخدم فعلاً وإذا لم تساويها يتم اصدار رسالة تفيد ذلك مع إخلاء الحقل والرجوع لنفس الحقل لكتابته من جديد ويتم ذلك بوضع كود في خصائص الحقل pas في حديث بعد التحديث كما بالشكل التالي وإذا كانت كلمة المرور صحيحة سيتم إظهار حقل 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 ولماذا لم نرى له صلاحية ضمن مستويات الصلاحيات مع أنه محمى ومحجوب عن المستخدمين وممنوح صلاحيته للمدير أو المسئول وهذا ما سنعرفه النموذج مصدره جملة sql تم انشائها عن طريق منشئ الاستعلامات داخل خصائص النموذج كما بالشكل السابق وبنفس أسلو ب وطريق عمل النماذج السابقة .... أما مصدر الصف نفسه للحقل user فهو أيضاً جملة sql مبنيه بمنشئ الاستعلامات داخل الخصائص ومهمتها عرض أسماء المستخدمين جميعاً من الجدول ما عدا المستخدم الذي قيمة الحقل rmz له تساوي mas أي عرض جميع المستخدمين ما عدا المسئول فهو دائماً صلاحياته مفتوحه لا ويحتاج لتعديل صلاحيات نفسه .... وعند اختيار اسم المستخدم سيتم تحديث حقول 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 يليه الجزء الثالث
رضا عقيل قام بنشر أغسطس 17, 2003 الكاتب قام بنشر أغسطس 17, 2003 الآن نصل لأهم نقطه وهى كيفية تعريف الصلاحية للنموذج يتم إنشاء حقل يوضع على كل نموذج نريد عمل صلاحية له أو أي تقرير نريد عمل صلاحية له وهذا الحقل به دالة وهنا الصلاحية تنقسم إلا قسمين الأول == صلاحيات للمسئول فقط الثاني == صلاحيات للمستخدمين قلنا من قبل أن لكل نموذج أو تقرير يوجد مستوى صلاحية مناظر له وكل ما علينا هو استحضار قيمة هذا المستوى من جدول 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 حقل الصلاحية هو الحقل الغير مرئي للمستخدم 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 عندما يدخل المستخدم اسماً في حقل اسم المستخدم 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 طبعاً بالإعلان عن متغيرات مع عد لعدد المحاولات وإذا وجد القيمين متطابقين يدخل البرنامج وإلا يخرج من البرنامج بعد عدد معين من المحاولات أما الاستعلام الوحيد الخارجي الذي استخدمه أبو عقيل في الصلاحيات فهو الاستعلام q6 وهو استعلام تحديث يقوم بأخذ قيم سجل المستخدم الحالي بعد أن أدخل اسمه وكلمة مروره الصحيحه ويحدث بها بيانات الجدول fbi ليكون هذا الجدول دائماً هو جدول المستخدم الحالي . ملاحظات : هناك ملاحظة هامة على المثال وهي نقطة ضعف وتلافاها أبو عقيل في مثال آخر ولكني لم أعثر عليه .... وهي أنك تستطيع حذف وتعديل جميع المستخدمين وبل وتصنع من نفسك المسئول ذو الصلاحيات الكاملة وذلك بفتح الجدول tb5 والتعديل فيه بحذف النجوم وكتابة ما تريد وسيظهر على أنه نجوم ولكنك تعرف ما كتبت داخل اسم المستخدم وكلمة المرور بما أنك تعرف وظيفة كل حقل وهذه النقطة تم تلافيها بأن يقوم البرنامج بتشفير كلمة المرور والاسم عند إدخالها وتحويلها إلى شفره يتم استعادتها عند الدخول مره اخرى ... وقد تم عمل مثال عليها بعد التشفير ولكنى لم أعثر عليه ... وهناك حل آخر تفضل به الأستاذ المبدع اشرف خليل وهو إضافة كود لإخفاء الجدول وسأقوم بإضافته مع نموذ بإذن الله هذا كل شيء أتمنى أن أكون وفيت الشرح حقه فسلت أنا من صنع المثال ولذلك ما تجدونه من أخطاء فأرجوا تصحيحها دون سابق إنذار فلست خبيراً كما تظنون ولكني أجتهد فحسب أعانني الله وإياكم وأعاد إلينا أبو عقيل سالماً وأتمنى ألا يزعل على لأني أسأت بهذا الشرح السيء لمثالة الذي يعد من أجمل موضوعات البرمجة وهي الصلاحيات ...... مع تحياتي أخوكم رضا عقيل 1
محمد طاهر عرفه قام بنشر أغسطس 18, 2003 قام بنشر أغسطس 18, 2003 مشكور أخ رضا :) و نرجو ارفاق الملف نفسه ، لتكتمل الفائدة مع تحياتي
رضا عقيل قام بنشر أغسطس 18, 2003 الكاتب قام بنشر أغسطس 18, 2003 المثال مرفق مع خالص تحياتي الصلاحيات_اكس_بي.zip
الردود الموصى بها
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.