【问题标题】:Unable to pass value from one form to another - Ms access无法将值从一种形式传递到另一种形式 - 女士访问
【发布时间】:2018-03-26 15:32:57
【问题描述】:

我有多个 VBA 表单,第一个表单从组合框中获取用户名并将其保存在全局变量中,代码如下:

Option Compare Database
Public emplID_global

Private Sub OKLogin_Click()


 If Not IsNull(Me.Combo_emplID) Then
  emplID_global = Me.Combo_emplID.Column(1)
  DoCmd.Close
  DoCmd.OpenForm "NavFrm", acNormal
 End If
End Sub

现在在我的其他表单中,我有一个组合框,我想在加载表单时自动填充该变量的值,我使用以前的表单保存,下面是代码:

Private Sub Form_Load()
 Me.AdvName = emplID_global
 Me.DataForm.Form.Recordset.MoveLast

End Sub

但它不起作用,它什么也没做。我想在所有表单中都使用这种代码。

有人可以建议我的代码中的错误是什么,我对 VBA 还很陌生。在此先感谢:)

【问题讨论】:

  • 如果表单上的一条记录是可编辑的,那么它们都是可编辑的。如果要控制对单个记录的访问,可能需要 SQLServer 之类的东西。保护 Access db 是一个常见的话题。

标签: database ms-access vba ms-access-2010 ms-access-forms


【解决方案1】:

为该特定记录的所有者在基础表中添加一个字段。 (我只是叫它Owner。)

将以下代码添加到您的表单中:

Private Sub Form_BeforeInsert(Cancel As Integer)
Owner = Environ("username")
End Sub

Private Sub Form_Current()
Dim editable As Boolean

if nz(Owner,"")="" then
    editable=true
else
    editable = (Environ("username") = Owner)
    End If

Form.AllowDeletions = editable
Form.AllowEdits = editable

End Sub

这是一个相当通用的解决方案,可以完成这项工作。 Environ("username") 返回用户的 windows 用户名。这不一定是所有 安全的。一个人可以转到命令提示符并编辑username 环境变量,使他们看起来像另一个人。这绝对不会将 NSA 或其他任何具有一点计算机知识和恶意的人拒之门外。但它让诚实的人保持诚实。

说明: BeforeInsert 在保存新记录时运行。在这种情况下,它将记录的 Owner 字段设置为用户的 Windows 用户名。

OnCurrent 部分在每次显示新记录时运行。该代码将检查当前 Windows 用户名是否与存储在记录的 Owner 字段中的用户名匹配,并相应地设置表单 AllowEditsAllowDeletions 标志。此外,如果Owner 字段为null(如在新记录的情况下),则editable 将设置为true。如果您想真的强调用户不应该更改内容这一事实,您还可以启用/禁用各个文本框...

TextBox1.Enabled=editable
ComboBox2.Enabled=editable
... etc.

简单的解决方案。防止诚实的人覆盖彼此的工作。我经常使用这种方法。

【讨论】:

  • 不错。如果您想在不使用 API 调用的情况下获得更好的安全性,请使用 CreateObject("WScript.Network").UserName 而不是 Environ("username")
  • thanx @xpofer,这是一个非常好的方法,我会试试这个并回复你。你真棒,
  • 嘿@xpofer 我不认为我可以阻止用户编辑彼此的数据,因为我的用户在表单及其数据输入模式下限制了编辑,它会在提交按钮单击时保存表单,然后重新查询。我不允许用户查看表单中的数据,但我附上了一个子表单数据表,用户可以通过它查看或编辑表中的数据(因为我已经为他们禁用了所有访问功能)所以问题是如何只让拥有该特定条目的用户在子表单中编辑或删除他们的条目。
  • 如果我理解正确,您应该也可以将 Form_Current 代码添加到您的子表单中。应该完全一样。即使在连续表单的子表单中,每次将焦点移到新行时仍会触发 Form_Current 事件。如果您的“提交”按钮在主窗体上,您可以将插入用户名的代码移动到按钮。让我知道你是否能让这个工作。如果没有,我们将讨论更多细节,我们会弄清楚的。
  • @xpofer,我再次编辑了这个问题,因为人们对这个问题投了反对票,所以我无法提出另一个问题,请你帮我解决这个新问题
猜你喜欢
  • 2015-06-23
  • 2015-06-06
  • 1970-01-01
  • 2012-03-11
  • 1970-01-01
相关资源
最近更新 更多