【问题标题】:MS Access Form where user name is selected from list从列表中选择用户名的 MS Access 表单
【发布时间】:2014-07-28 19:48:33
【问题描述】:

我将重新表述我之前发布的一个问题:

我在 access 中构建了一个表单,允许用户输入他们按活动工作的时间(即事务处理、项目时间、假期等)。表单上的字段是:

1) 用户名 2) 开始日期 3) 结束日期 4) 活动 5) 花费的时间

有没有办法让这个表单在用户打开它时自动出现一个提示,强制您从用户列表中选择用户名?一旦选择了用户名,通过此表单输入的所有记录都已经填充了用户名字段(除非表单被关闭并再次重新打开)?

根据提示中的用户名选择,使用“上一个记录”和“下一个记录”箭头切换记录应严格与所选用户名相关。

** 这是我目前的表格**

用于产生下述解决方案的步骤

1) 删除名为“用户名”的组合框
2) 添加一个未绑定的隐藏文本框并命名为 txUN
3) 添加下面加载的 VBA 代码,但将 txtusername 引用更改为 user_full_name,因为这是表中应存储这些记录的列的名称
4) 使用用户名组合框创建下面的表单并将其命名为 cbousername
5) 将 frm_sample 引用更改为 [Specialist - Timesheet Entry]

【问题讨论】:

  • 您不能使用 Environ$("Username") 自动获取用户名吗?还是您希望用户能够选择其他用户的个人资料?

标签: forms ms-access vba prompt


【解决方案1】:

选项,首先打开用户名表单:

创建一个如下所示的表单,其中包含一个名为 txtUN 的隐藏文本框:

后面有以下代码:

Private Sub Form_Current()
  If VBA.Strings.Len(txtUN & "") = 0 Then DoCmd.OpenForm "frm_UserName", acNormal, , , , acDialog
  If VBA.Strings.Len(txtUsername & "") = 0 Then txtUsername = txtUN
End Sub 

然后创建一个如下所示的表单。将下拉列表命名为 cboUserName

后面有以下代码:

Private Sub cboUserName_AfterUpdate()
   Forms!frm_Sample.txtUN = cboUserName
End Sub
Private Sub Form_Unload(Cancel As Integer)
  If (VBA.Strings.Len(cboUserName & "") = 0) Then
     MsgBox "You must supply a user name before proceeding.", , "ERROR: Missing Info."
     Cancel = True
  End If
End Sub

当您打开frm_Sample 时,它会检查txtUN 是否有值。如果不是,它将打开frm_UserName 作为对话框。用户必须选择用户名并关闭表单。当导航到另一条记录时,如果txtUsername 为空,则分配txtUN 包含的任何内容。

【讨论】:

  • 我一直在尝试这个并且收到运行时“440”错误。 “你不能给这个对象赋值。”如果我单击调试而不是突出显示这行代码:Forms![Specialist - Timesheet Entry].txtUN = cbousername
  • txtUN是未绑定的隐藏文本框吗?
  • 我不确定。你怎么把它变成一个隐藏的盒子? txtUsername 指的是什么?
  • 在窗体的设计视图中,如果您将txtUN 文本框的Visible 属性设置为No,它将在普通视图中隐藏。它仅用于存储用户名。 txtUsername 是实际文本框,绑定到表中您要存储用户名的字段。
  • txtUN 仅用于将用户名存储在表单上,​​它根本不影响数据库。当您在记录之间移动时,表单会检查 txtUsername 是否有值,如果没有,它会将 txtUN 包含的内容分配给它。由于txtUN 未绑定到任何字段,因此即使在记录之间移动它也会保持相同的值。
【解决方案2】:

您可以自动将实际的 Windows 用户名传递给您的表单,并通过表格查找获得与您的应用程序相关的用户名。

您的数据库中可能已经有一个表(假设表tblUsers 的字段包含您的用户名,例如fldUsername),用于存储所有有效的用户名。只需在此表中添加一列(名为 fldDomainUser),其中包含域和/或登录用户的用户名。

Environ$("userdomain") + "\" + Environ$("username")

将返回一个包含您的域、一个“\”和您的实际用户名的字符串。

功能

dlookup ("[fldUsername]","[tblUsers]","[fldDomainUser]='"+cstr(Environ$("userdomain") + "\" + Environ$("username"))+"'")

将返回用户名。

在表单的before_insert 事件中设置您的实际用户名

Private Sub Form_BeforeInsert(Cancel As Integer)
   [ctrlUsername] = Environ$("userdomain") + "\" + Environ$("username")
End Sub

这样所有新创建的记录都会自动包含您的用户名。

不要忘记相应地过滤您的表单或其Recordsource

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    • 1970-01-01
    • 2013-10-04
    • 2013-10-09
    • 2021-05-20
    相关资源
    最近更新 更多