无法将值从一个表单传递到另一个表单 - Ms访问权限

时间:2017-10-14 18:14:19

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

我有多个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还不熟悉。在此先感谢:)

1 个答案:

答案 0 :(得分:3)

为您的基础表添加一个字段,以供该特定记录的所有者使用。 (我刚才叫它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.

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