如何使访问表单自动打开用户的数据?

时间:2010-11-16 15:39:45

标签: ms-access vba access-vba

我正在尝试编写允许Access识别打开数据库的人的计算机ID,打开表单并过滤分配给用户的记录的VB代码。有谁知道如何实现这个目标?

2 个答案:

答案 0 :(得分:2)

API to get the user name可能比使用Environ更好。如果表格中提供了该名称,您可以使用DLookUp获取ID,该ID可与the Where argument of the OpenForm method of the DoCmd object一起使用以打开已过滤的列表。

答案 1 :(得分:0)

如果这是您对ComputerID的意思,您可以使用Environ $(“ComputerName”)。这是我做的快速而肮脏的方式。请注意,用户通常可以关闭表单的过滤器。 正如其他人所说,PC上的环境变量有可能被非管理员用户修改。

如果您担心用户将修改计算机的环境变量(例如,通过cmd设置SET COMPUTERNAME = MYBOSS),则可以使用Win32 API调用获取ComputerName值,如果您知道该用户是非管理员用户无法通过注册表或通过Windows修改计算机名(见下文)。

使用API​​的CAVEAT

如果用户在PC上具有管理员权限,并且他们能够编辑HKLM注册表值,那么他们可以进行以下注册表项:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName]
"ComputerName"="MyBossComputerName"

如果他们重新启动PC,Windows API调用将使用错误的名称。然后,他们可以将注册表项恢复正常并重新启动PC。

在我的场景中,我有多个用户在同一台​​PC和Access数据库的不同日子工作。他们从PC上的共享文件夹位置打开数据库。当他们单击交换机项目并打开表单时,表单的Load事件将运行。此表单绑定到一个名为USERNAME的列的表,该列只是UserName的环境变量值(例如John.Smith)。

这是我在加载事件中输入的VBA:

Private Sub Form_Load()
    Dim currUser As String
    DoCmd.Maximize
    currUser = Environ$("USERNAME")
    Me.Filter = "USERNAME = '" & currUser & "'"
    Me.FilterOn = True
End Sub

API调用解决方案

如果您更愿意进行API调用以获取ComputerName,那么您可以执行以下操作:

API调用是GetComputerName,它来自Ken Getz(VBA开发人员手册)或Dan Appleman(Visual Basic程序员指南Win32 API)的代码。 你也会在互联网上找到它。首先将一个Module添加到您的项目中重命名 API或有意义的东西。然后插入以下代码:

Private Declare Function GetComputerName Lib "kernel32" _ 
   Alias "GetComputerNameA"(ByVal strBuffer As String, lngSize As Long) As Long

Public Function ComputerNameValue() As String
   Dim strBuffer as String
   Dim retValApi as Long
   Dim bufferSize as Long

   bufferSize = 256

   strBuffer = Space(bufferSize)

   'bufferSize will be returned with ComputerName length less null character.'

   retValApi = GetComputerName(strBuffer, bufferSize) 

   If CBool(retValApi) Then
      ComputerNameValue = Left$(strBuffer, bufferSize)
   Else
     'Your Error Handler'
   End If

End Function

在表单加载事件中(修改为使用API​​包装函数而不是Envrion $):

Private Sub Form_Load()
    Dim PCName As String
    DoCmd.Maximize
    PCName = ComputerNameValue()
    Me.Filter = "COMPUTERNAME = '" & PCName & "'"
    Me.FilterOn = True
End Sub