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