يعتبر برنامج الاكسس Microsoft Access من البرامج المميزة في اداة قواعد البيانات, بالطبع لا يوفر البرنامج الكثير من الميزات والخصائص التي توفرها برامج ادارة قواعد البيانات الاخرى مثل SQL Server ولكن يعتبر برنامج مناسب جداً للمنشئات الصغيرة جداً ويفضله الكثير من المستخدمين لسهولة استخدماه وتثبيته على الاجهزة الخاصة بالمؤسسات.
يواجه الكثير من مبرمجي اكسس صعوبة كبيرة في انشاء نظام مجموعات وصلاحيات قوي يمسح لمدير البرنامج بتحديد صلاحيات المستخدمين بشكل دقيق وذلك بهدف حماية البيانات وعدم السماح لغير المخولين بالاطلاع عليها وتعديلها.
لذك نقدم لكم شرح تفصيلي لطريقة انشاء نظام صلاحيات مميز يمكنك تطبيقة على كافة قواعد البيانات التي تعمل عليه.
يعتبر هذا الدرس هو درس متقدم في الاكسس ولن يتم شرح اساسيات الاكسس خلال هذا الدرس تفادياً لاضاعة الوقت والخوض في تفاصيل بعيدة عن موضوع الدرس.
مع ذلك سيتم شرح طريقة انشاء النظام بشكل تفصيلي ولكي تستطيع تطبيق الدرس بشكل سليم يجب ان يكون لديك خبرة في اساسيات الاسس بالاضافة الى خبرة مقبولة في البرمجة بلغة VBA.
وسأترك لكم في نهاية الشرح رابط لتحميل قاعدة البيانات التي تم الشرح عليها لتتمكنو من الاطلاع عليها واستخدام الاكواد الخاصة بنظام الصلاحيات. بالاضافة الى العديد من الشاشات والاكواد المنشأة في قاعدة البيانات هذه يمكنكم الاستفادة منها في العديد من الامور.
اولاً: انشاء الجداول اللازمة لنظام الصلاحيات والمجموعات
سنحتاح لانشاء 4 جداول خاصة للنظام. بخصوص اسماء الجداول والحقول يمكنك ان تختارها بما يناسبك ولا يشترط ان تكون كما هي في الشرح لكن انصحك بشدة استخدام نفس المسميات وذلك لا يحدث لديك مشاكل لاحقا في نرحلة البرمجة:
1- جدول المستخدمين (tblUsers):
ثانياً: برمجة شاشات اضافة وادارة المستخدمين
1- شاشة اضافة مستخدم جديد (FRM_NewUser):
يتم تصميم شاشة كما في الصورة التالية وسأقوم بعرض الاكواد المستخدمة في برمجة الشاشة لكن لن اقوم بشرحها بكشل مفصل حيث ان هذه الكواد يفترض انها بسيطة ولديكم معلومات كافية عن طريقة كتابتها
If Me.txtID.Value <> "" Then Dim rst As Recordset Set rst = CurrentDb.OpenRecordset("SELECT * FROM tblUsers WHERE User_Name = '" & Me.txtID.Value & "'") If rst.RecordCount = 0 Then MsgBox "NO DATA", vbCritical, "Ok" Else ARname = rst!UserFullName Me.txtname.Value = ARname Me.btnsearch.Enabled = True Me.btnsavenew.Enabled = False End If Else MsgBox "Please Enter USERNAME First", vbCritical, "Error" End If
Me.txtID.Value = "" Me.txtname.Value = "" Me.btnsearch.Enabled = True Me.btnsavenew.Enabled = True
Dim StrSQL As String If Me.txtID.Value <> "" And Me.txtname.Value <> "" Then StrSQL = "INSERT INTO tblUsers (User_Name,UserFullName,New_User) VALUES ('" & Me.txtID.Value & "','" & Me.txtname.Value & "',True );" DoCmd.SetWarnings False DoCmd.RunSQL StrSQL DoCmd.SetWarnings True MsgBox "User Addedd Successfully", vbInformation, "MSG" Else MsgBox "Please Fill all Data First", vbCritical, "error" End If
If Me.txtID.Value <> "" Then Dim rst As Recordset Set rst = CurrentDb.OpenRecordset("SELECT * FROM tblUsers WHERE User_Name = '" & Me.txtID.Value & "'") If rst.RecordCount = 0 Then MsgBox "NO DATA", vbCritical, "error" Me.txtID.SetFocus Else ARname = rst!UserFullName pass = rst!User_PASS PassCount = rst!PASS_COUNT Roll_ID = rst!Roll_ID Me.txtname.Value = ARname Me.txtpass.Value = pass Me.txtpasscount.Value = PassCount Me.cbxRollId.Value = Roll_ID Me.btnsearch.Enabled = True Me.txtpass.Enabled = False Me.txtID.Enabled = False Me.btnsave.Enabled = True End If Else MsgBox "Please Select USERNAME First", vbCritical, "error" Me.txtID.SetFocus End If
Me.txtpass.Enabled = True Me.txtpass.Value = "" Me.txtpass.SetFocus
Dim db As dao.Database Set db = CurrentDb If Me.txtpass.Enabled = True Then db.Execute "UPDATE tblUsers SET UserFullName= '" & Me.txtname.Value & "', User_PASS= '" & Me.txtpass.Value & "' , PASS_COUNT = " & Me.txtpasscount.Value & " , IS_New = True , Roll_ID = " & Me.cbxRollId.Value & " WHERE User_Name= '" & Me.txtID.Value & "'" Else db.Execute "UPDATE tblUsers SET UserFullName= '" & Me.txtname.Value & "', User_PASS= '" & Me.txtpass.Value & "' , PASS_COUNT = " & Me.txtpasscount.Value & ", Roll_ID = " & Me.cbxRollId.Value & " WHERE User_Name= '" & Me.txtID.Value & "'" End If MsgBox "Changes Saved Successfully", vbInformation, "MSG" Me.txtID.Value = "" Me.txtname.Value = "" Me.txtpass.Value = "" Me.txtpasscount.Value = "" Me.cbxRollId.Value = "" Me.txtID.Enabled = True Me.txtID.SetFocus Me.btnsave.Enabled = False
If Me.txtID.Value <> "" Then Dim rst As Recordset Set rst = CurrentDb.OpenRecordset("SELECT * FROM tblUsers WHERE User_Name = '" & Me.txtID.Value & "'") If rst.RecordCount = 0 Then MsgBox "User Not Exist", vbCritical, "Warning" Else IS_NEW = rst!New_User If IS_NEW = True Then Me.lblStstus.Visible = True Me.lblStstus.Caption = "Blocked" Me.btnActive.Enabled = True Me.btnStop.Enabled = False Else Me.lblStstus.Visible = True Me.lblStstus.Caption = "Active" Me.btnActive.Enabled = False Me.btnStop.Enabled = True
If Me.lblStstus.Visible = True Then Dim dbs As dao.Database Dim qdf As QueryDef Set dbs = CurrentDb dbs.Execute "UPDATE tblUsers SET New_User= false WHERE User_Name= '" & Me.txtID.Value & "'" MsgBox "Activated Successfully", vbInformation, "MSG" Me.lblStstus.Caption = "Active" Me.btnActive.Enabled = False Me.btnStop.Enabled = True End If
If Me.lblStstus.Visible = True Then Dim dbs As dao.Database Dim qdf As QueryDef Set dbs = CurrentDb dbs.Execute "UPDATE tblUsers SET New_User= True WHERE User_Name= '" & Me.txtID.Value & "'" MsgBox "Blocked Successfully", vbInformation, "MSG" Me.lblStstus.Caption = "Blocked" Me.btnActive.Enabled = True Me.btnStop.Enabled = False End If
ثالثاً: برمجة شاشات اضافة وادارة المجموعات
If Me.txtID.Value <> "" Then Dim rst As Recordset Set rst = CurrentDb.OpenRecordset("SELECT * FROM tblRolls WHERE Roll_ID = " & Me.txtID.Value & "") If rst.RecordCount = 0 Then MsgBox "áÇ íæÌÏ ÈíÇäÇÊ áÑÞã ÇáãÌãæÚÉ ÇáãÏÎá", vbCritical, "ÊäÈíå" Else ARname = rst!Roll_Name Me.txtname.Value = ARname Me.btnsave.Enabled = True Me.btndelete.Enabled = True Me.btnsearch.Enabled = True Me.btnsavenew.Enabled = False End If Else MsgBox "íÑÌì ÇÏÎÇá ÑÞã ÇáãÌãæÚÉ ÇæáÇ", vbCritical, "ÊäÈíå" End If
Me.txtID.Value = "" Me.txtname.Value = "" Me.btnsave.Enabled = False Me.btndelete.Enabled = False Me.btnsearch.Enabled = True Me.btnsavenew.Enabled = True
If Me.txtID.Value <> "" Then Dim dbs As dao.Database Dim qdf As QueryDef Set dbs = CurrentDb dbs.Execute "UPDATE tblRolls SET Roll_Name= '" & Me.txtname.Value & "'WHERE Roll_ID= " & Me.txtID.Value & "" MsgBox "Êã ÍÝÙ ÇáÊÚÏíáÇÊ", vbInformation, "ÑÓÇáÉ" Me.QURROLLS_subform.Requery End If
Dim StrSQL As String If Me.txtID.Value <> "" And Me.txtname.Value <> "" Then StrSQL = "INSERT INTO tblRolls VALUES (" & Me.txtID.Value & ",'" & Me.txtname.Value & "' );" DoCmd.SetWarnings False DoCmd.RunSQL StrSQL DoCmd.SetWarnings True MsgBox "Êã ÍÝÙ ÇáãÌãæÚÉ", vbInformation, "ÑÓÇáÉ" Me.QURROLLS_subform.Requery Else MsgBox "íÑÌì ÇßãÇá ÇáÈíÇäÇÊ", vbCritical, "ÊäÈíå" End If
رابعاً: برمجة شاشات الوظائف ومنح الصلاحيات
Dim StrSQL As String Dim DatDiff As Integer If Me.txtFromName.Value <> "" And Me.txtArName.Value <> "" Then StrSQL = "INSERT INTO tblForms VALUES ('" & Me.txtFromName.Value & "','" & Me.txtArName.Value & "');" DoCmd.SetWarnings False DoCmd.RunSQL StrSQL DoCmd.SetWarnings True MsgBox "Successfully Saved", vbInformation, "MSG" Me.QUR_FUNCTIONS_subform.Requery Me.txtArName.Value = "" Me.txtFromName.Value = "" Me.txtArName.SetFocus Else MsgBox "Please Fill all Data First", vbCritical, "Error" Me.txtArName.SetFocus End If
Me.QUR_RollsAccess_subform.Requery
Dim StrSQL As String If Me.cbxroll.Value <> "" And Me.cbxform.Value <> "" Then StrSQL = "INSERT INTO tblRollsAccess VALUES (" & Me.cbxroll.Value & ",'" & Me.cbxform.Value & "',True );" DoCmd.SetWarnings False DoCmd.RunSQL StrSQL DoCmd.SetWarnings True MsgBox "Roll have Access Now", vbInformation, "MSG" Me.QUR_RollsAccess_subform.Requery Else MsgBox "Please Fill All Data First", vbCritical, "Error" End If
خامساً: انشاء شاشة تسجيل الدخول
Dim RS As Recordset Dim db As dao.Database '==================\ Dim dbs As dao.Database Dim qdf As QueryDef Set dbs = CurrentDb '=================== Set db = CurrentDb Set RS = db.OpenRecordset("tblUsers", dbOpenSnapshot, dbReadOnly) RS.FindFirst "User_Name ='" & Me.txtUserName & "'" If Me.txtUserName.Value <> "" And Me.txtPassowrd.Value <> "" Then If RS!New_User = True Then MsgBox "ÇäÊåÊ ÝÊÑÉ ÕáÇÍíÉ ÇáãÓÊÎÏã", vbCritical, "ÊäÈíå" Exit Sub End If If RS.NoMatch = True Then Me.lblUserError.Visible = True Me.txtUserName.SetFocus Exit Sub End If Me.lblUserError.Visible = False If RS!PASS_COUNT >= 3 Then MsgBox "ÊÌÇæÒ ÚÏÏ ãÍÇæáÇÊ ßáãÉ ÇáãÑæÑ", vbCritical, "ÊäÈíå" Exit Sub End If If RS!User_PASS <> Me.txtPassowrd Then Me.lblPassError.Visible = True dbs.Execute "UPDATE tblUsers SET PASS_COUNT= PASS_COUNT + 1 WHERE User_Name= '" & Me.txtUserName.Value & "'" Me.txtUserName.SetFocus Exit Sub End If Me.lblPassError.Visible = False TempVars("Roll_ID") = RS!Roll_ID.Value TempVars("User_Name") = RS!User_Name.Value TempVars("UserPass") = RS!User_PASS.Value If RS!IS_NEW = False Then dbs.Execute "UPDATE tblUsers SET PASS_COUNT= 0 WHERE User_Name= '" & Me.txtUserName.Value & "'" DoCmd.OpenForm "MFRM_MAINFORM" Else DoCmd.OpenForm "FRM_PasswordChange" End If DoCmd.Close acForm, Me.Name
If RS!PASS_COUNT >= 3 Then MsgBox "تجاوو عدد محاولات الدخول", vbCritical, "تنبيه" Exit Sub
Else DoCmd.OpenForm "FRM_PasswordChange"
Dim dbs As dao.Database Dim qdf As QueryDef Set dbs = CurrentDb If Me.txtOldPass.Value = TempVars("UserPass") Then If Me.txtNewPass.Value = Me.txtReNewPass.Value Then If Me.txtNewPass.Value <> "" And Me.txtOldPass.Value <> "" And Me.txtReNewPass.Value <> "" Then dbs.Execute "UPDATE tblUsers SET User_PASS= '" & Me.txtNewPass.Value & "',IS_New=False WHERE User_Name= '" & TempVars("User_Name") & "'" MsgBox "Êã ÍÝÙ ÇáÊÚÏíáÇÊ", vbInformation, "ÑÓÇáÉ" DoCmd.Close acForm, Me.Name DoCmd.OpenForm "FRM_LOGIN" Else MsgBox "íÑÌì ÇÏÎÇá ßÇÝÉ ÇáÈíÇäÇÊ", vbCritical, "ÊäÈíå" End If Else MsgBox "ßáãÉ ÇáÓÑ ÛíÑ ãØÇÈÞÉ", vbCritical, "ÊäÈíå" End If Else MsgBox "ßáãÉ ÇáãÑæÑ ÛíÑ ÕÍíÍÉ", vbCritical, "ÊäÈíå" End If
سادساً: تطبيق نظام الصلاحيات
Public Function UsersAccess(Form_Name As String) As Boolean UsersAccess = Nz(DLookup("HasAccess", "tblRollsAccess", "Roll_ID = " & TempVars("Roll_ID") & " AND Form_Name = '" & Form_Name & "'"), False) End Function
DoCmd.OpenForm "FRM_LOADSETTSUB"
If Globals.UsersAccess("FRM_LOADSETTSUB") = False Then MsgBox "You do not have Permission to Access this Functionality", vbCritical, "Warning" Else DoCmd.OpenForm "FRM_LOADSETTSUB" End If