我正在Microsoft Access中为学校项目创建数据库。我创建了一个登录功能,其中一个企业的员工拥有用户名和密码,并且他们的UserAccess为1或2. 1是用户权限,2是管理员权限。
我设法使用户无法访问数据库中的某些表单,但是,我一直试图让用户的员工无法访问某些按钮。
我创建了一个删除按钮客户表单,以便删除客户。我用宏来做这件事。问题是我不能完全确定如何将其提供给管理员
以下是我的登录表单的代码:
Option Compare Database
Option Explicit
Private Sub btnLogin_Click()
Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset("tblStaff", dbOpenSnapshot, dbReadOnly)
rs.FindFirst "UserName='" & Me.TextUserName & "'"
If rs.NoMatch Then
Me.lblIncorrectUsername.Visible = True
Me.TextUserName.SetFocus
Exit Sub
End If
Me.lblIncorrectUsername.Visible = False
If rs!Password <> Nz(Me.TextPassword, "") Then
Me.lblIncorrectPass.Visible = True
Me.TextPassword.SetFocus
Exit Sub
End If
Me.lblIncorrectPass.Visible = False
TempVars("EmployeeType") = rs!EmployeeTypeID.Value
If rs!EmployeeTypeID = 2 Then
Dim prop As Property
On Error GoTo SetProperty
Set prop = CurrentDb.CreateProperty("AllowBypassKey", dbBoolean, False)
CurrentDb.Properties.Append prop
SetProperty:
If MsgBox("Would you like to turn on the Bypass Key?", vbYesNo,
"Allow Bypass?") = vbYes Then
CurrentDb.Properties("AllowBypassKey") = True
Else
CurrentDb.Properties("AllowBypassKey") = False
End If
End If
DoCmd.OpenForm "Main Menu"
DoCmd.Close acForm, Me.Name
End Sub
为了创建仅向管理员显示按钮的方式,我试图将宏切换到VBA代码并插入代码行:
if EmployeeTypeID= 2 then
me.btnDeleteCustomer.visible = true
else
me.btnDeleteCustomer.visible = false
end if
VBA中完成的宏代码为:
Function Macro1()
If EmployeeTypeID = 2 Then
Me.btDeleteCustomer.Visible = True
Else
Me.btnDeleteCustomer.Visible = False
End If
On Error GoTo Macro1_Err
On Error GoTo 0
DoCmd.RunCommand acCmdDeleteRecord
Macro1_Exit:
Exit Function
Macro1_Err:
MsgBox Error$
Resume Macro1_Exit
End Function
Function Macro1_Sub1()
On Error GoTo Macro1_Sub1_Err
Beep
MsgBox "There is nothing to Delete.", vbOKOnly, ""
Macro1_Sub1_Exit:
Exit Function
Macro1_Sub1_Err:
MsgBox Error$
Resume Macro1_Sub1_Exit
End Function
答案 0 :(得分:0)
您需要将显示/隐藏代码附加到表单加载而不是宏。
这可能对您有所帮助: https://msdn.microsoft.com/en-us/vba/access-vba/articles/form-load-event-access
学习阅读MSDN文章以获得您需要的工作将对您有很大帮助。
答案 1 :(得分:0)
你很亲密。
您正在分配Macro1
,但之后您正在If EmployeeTypeID = 2 Then
中执行此操作:
TempVars
我对Access不是很熟悉,但假设TempVars
是一些全局值集合,请将对数据写入If TempVars("EmployeeType") = 2 Then
变量的读取替换为:
Me.btDeleteCustomer.Visible = (TempVars("EmployeeType") = 2)
或者,简化条件并分配给布尔表达式:
Option Explicit
另外,在包含Macro1
的模块顶部指定EmployeeTypeID
:我怀疑你有编译错误,因为{{1}}看起来像是一个未声明的变量。
注意:此代码演示了变量分配,表格列读取和其他基本机制 - 绝不是安全解决方案。不要在需要实际安全的解决方案中使用此类或类似内容。
答案 2 :(得分:0)
应该有一个开始屏幕(有时称为交换机),它在应用程序打开时始终打开。这应该有一个包含用户ID的文本框。 (可见或不可见)。
然后在任何形式的OnCurrent事件中 - 添加VBA以根据用户ID的值控制控件(即按钮)的可见性。