具有访问级别的 MS Access 2010 登录表单
MS Access 2010 login form with access levels
我的管理层想要一个可以控制哪些用户可以查看表单上的特定字段的访问数据库。例如,如果经理登录,表单将显示绩效评级字段。对于任何其他用户,性能评级字段将不可见。
到目前为止,以下是我的一些选择:
1) 使用VBA 检测访问应用程序的用户名,如果是其管理员名称,则文本框可见。
2) 使用需要用户登录的用户名参考 table。具有特殊访问权限的用户将看到文本框。
3) 在表单上有一个特殊的小按钮,如果有人单击,将加载一个小的密码对话框,然后将文本设置为可见。
哪个选项最难实施?
我已经实施了选项 1 和 2,它们很容易构建。
选项 nr 3 似乎同样困难。
我的工作环境中的问题是哪个选项的(帐户)维护成本低,哪个选项需要用户付出很少的努力。
从这个角度来看,选项 nr.1 更成功。
(我宁愿构建不同的表单也不愿改变字段的视图设置ON/OFF)
使用登录表单获取用户特定信息的想法在 Internet 上随处可见。我建议将您的所有三个想法结合起来就是完美的解决方案。
对于您拥有的两种方法(1 和 2)中的任何一种,您首先需要一个 Table 来保存信息。 table 不需要很复杂(至少现在不需要)。 table 应具有以下结构,
tbl_Employees
-------------
EmpID - Auto Number - PK
EmpNam - Text
EmpUserName - Text
EmpPassword - Text - Input Mask (If required)
IsManager - Yes/No - Default - No
然后您将必须创建一个表单,一个包含三个控件、两个文本框和一个按钮的基本表单。第一个文本框是您输入员工用户名的地方,第二个文本框是输入密码的地方。最后一个按钮,魔术就在它后面发生了。按钮后面的代码(简化)类似于。
Private Sub LogInBtn_Click()
On Error GoTo errOccured
Dim eQryStr As String, empRS As DAO.Recordset
eQryStr = "SELECT EmpID, EmpUserName, EmpPassword, IsManager FROM tbl_Employees WHERE EmpUserName = '" & Me.UserNameTxt & "'"
Set empRS = CurrentDb.OpenRecordset(eQryStr)
If empRS.RecordCount <> 0 Then
If Me.PwdTxt = empRS!EmpPassword Then
If empRS!IsManager Then
DoCmd.OpenForm "ManagerForm"
Else
DoCmd.OpenForm "EmployeeForm"
End If
Me.Visible = False
Else
wrongEntry "Password"
End If
Else
wrongEntry "User Name"
End If
exitOnError:
Set empRS = Nothing
Exit Sub
errOccured:
wrongEntry "User Name/Password"
Resume exitOnError
End Sub
Private Sub wrongEntry(entityStr As String)
MsgBox entityStr & " is incorrect (OR) omitted, please check again.", vbCritical
End Sub
如你所见,我用过
(a) 一个 Recordset 对象比一个简单的 DLookup。我更喜欢记录集对象,您可以使用 DLookup,但您必须确保处理 Null
(如果不满足条件)。
(b) 经理和员工的单独表格。我想象经理表格上会有更多员工表格上没有的内容。如果你不想走这条路,但可以使用一种形式,但你需要通知开放形式谁在登录 - 使用 OpenArgs 属性 OpenForm 方法。
如果您想简单地避免所有麻烦并使用密码框,就可以访问文本框。只需按照此线程上的说明进行操作 - Password Box - A variant of Input Box。然后在您当前拥有的表单上创建一个按钮,然后单击该按钮,您只需编写以下代码。
Private Sub AllowAccessButton_Click()
If Call_Password_Box = "yourPassword" Then
Me.yourHiddenTextBox.Visible = True
Else
MsgBox "Sorry you are not authorised to vies this information (OR) Incorrect Password", vbCritical
End If
End Sub
PS: Hidden text控件应该设置为不可见,最好在Form当前事件中。
希望对您有所帮助。
我的管理层想要一个可以控制哪些用户可以查看表单上的特定字段的访问数据库。例如,如果经理登录,表单将显示绩效评级字段。对于任何其他用户,性能评级字段将不可见。
到目前为止,以下是我的一些选择:
1) 使用VBA 检测访问应用程序的用户名,如果是其管理员名称,则文本框可见。
2) 使用需要用户登录的用户名参考 table。具有特殊访问权限的用户将看到文本框。
3) 在表单上有一个特殊的小按钮,如果有人单击,将加载一个小的密码对话框,然后将文本设置为可见。
哪个选项最难实施?
我已经实施了选项 1 和 2,它们很容易构建。 选项 nr 3 似乎同样困难。
我的工作环境中的问题是哪个选项的(帐户)维护成本低,哪个选项需要用户付出很少的努力。
从这个角度来看,选项 nr.1 更成功。
(我宁愿构建不同的表单也不愿改变字段的视图设置ON/OFF)
使用登录表单获取用户特定信息的想法在 Internet 上随处可见。我建议将您的所有三个想法结合起来就是完美的解决方案。
对于您拥有的两种方法(1 和 2)中的任何一种,您首先需要一个 Table 来保存信息。 table 不需要很复杂(至少现在不需要)。 table 应具有以下结构,
tbl_Employees
-------------
EmpID - Auto Number - PK
EmpNam - Text
EmpUserName - Text
EmpPassword - Text - Input Mask (If required)
IsManager - Yes/No - Default - No
然后您将必须创建一个表单,一个包含三个控件、两个文本框和一个按钮的基本表单。第一个文本框是您输入员工用户名的地方,第二个文本框是输入密码的地方。最后一个按钮,魔术就在它后面发生了。按钮后面的代码(简化)类似于。
Private Sub LogInBtn_Click()
On Error GoTo errOccured
Dim eQryStr As String, empRS As DAO.Recordset
eQryStr = "SELECT EmpID, EmpUserName, EmpPassword, IsManager FROM tbl_Employees WHERE EmpUserName = '" & Me.UserNameTxt & "'"
Set empRS = CurrentDb.OpenRecordset(eQryStr)
If empRS.RecordCount <> 0 Then
If Me.PwdTxt = empRS!EmpPassword Then
If empRS!IsManager Then
DoCmd.OpenForm "ManagerForm"
Else
DoCmd.OpenForm "EmployeeForm"
End If
Me.Visible = False
Else
wrongEntry "Password"
End If
Else
wrongEntry "User Name"
End If
exitOnError:
Set empRS = Nothing
Exit Sub
errOccured:
wrongEntry "User Name/Password"
Resume exitOnError
End Sub
Private Sub wrongEntry(entityStr As String)
MsgBox entityStr & " is incorrect (OR) omitted, please check again.", vbCritical
End Sub
如你所见,我用过
(a) 一个 Recordset 对象比一个简单的 DLookup。我更喜欢记录集对象,您可以使用 DLookup,但您必须确保处理 Null
(如果不满足条件)。
(b) 经理和员工的单独表格。我想象经理表格上会有更多员工表格上没有的内容。如果你不想走这条路,但可以使用一种形式,但你需要通知开放形式谁在登录 - 使用 OpenArgs 属性 OpenForm 方法。
如果您想简单地避免所有麻烦并使用密码框,就可以访问文本框。只需按照此线程上的说明进行操作 - Password Box - A variant of Input Box。然后在您当前拥有的表单上创建一个按钮,然后单击该按钮,您只需编写以下代码。
Private Sub AllowAccessButton_Click()
If Call_Password_Box = "yourPassword" Then
Me.yourHiddenTextBox.Visible = True
Else
MsgBox "Sorry you are not authorised to vies this information (OR) Incorrect Password", vbCritical
End If
End Sub
PS: Hidden text控件应该设置为不可见,最好在Form当前事件中。
希望对您有所帮助。