无法传递值从一种形式到另 - MS访问

无法传递值从一种形式到另 - MS访问

问题描述:

我有一个多VBA形式,第一种形式从组合框需要用户名和一个全局变量保存它,代码如下:无法传递值从一种形式到另 - MS访问

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 

现在在我的其他形式我有,我想自动填充的valueOf变量,在形式,我会用以前的格式保存的负荷组合框,下面是代码:

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

End Sub 

但不工作,它没有做任何事情。我想在所有表单中使用这种代码。

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

+0

如果表单上的一条记录是可编辑的,那么它们都是。如果你想控制对单个记录的访问,可能需要像SQLServer这样的东西。保护Access数据库是一个常见的主题。 – June7

为该特定记录的所有者添加一个字段到您的基础表。 (我只是把它叫做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. 

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

+1

不错。如果您希望在不使用API​​调用的情况下获得更好的安全性,请使用'CreateObject(“WScript.Network”)。UserName'而不是'Environ(“username”)''。 – Andre

+0

thanx @xpofer,它是一个非常好的方法,我会试试这个并且回复你。你真是太棒了, –

+0

hey @xpofer我不认为我可以阻止用户编辑对方的数据,因为我的用户在表单和数据输入模式下限制了编辑,它将表单保存为提交按钮单击,然后重新查询。我没有允许用户在表单中查看数据,但是我有一个子表单数据表,用户可以通过它查看或编辑表格中的数据(因为我禁用了它们的所有acces功能) 所以问题是如何让只有拥有该特定条目的用户才能编辑或删除子表单中的条目。 –