2010-11-16 24 views
0

我正在嘗試編寫VB代碼,允許Access識別打開數據庫的人的計算機ID,打開窗體並篩選分配給用戶的記錄。有誰知道如何做到這一點?如何使Access窗體自動打開用戶數據?

+3

什麼你問當然是可能的,但你可能在巨大的問題上不會得到完整的答案。你爲什麼不嘗試把你的項目分成更小的問題?例如,您的第一個問題可能是:「如何在Access中編寫VBA代碼來識別在打開數據庫時正在使用的計算機?「將你的問題分解成更小的塊可以幫助你更好地回答你的問題 – 2010-11-16 15:47:58

回答

0

如果您的計算機ID是您的意思,您可以使用Environ $(「ComputerName」)。這是我做到的一種快速和骯髒的方式。請注意,用戶通常可以關閉表單的過濾器。 正如其他人所說,PC上的環境變量有可能被非管理員用戶修改。

如果您擔心用戶將修改計算機的環境變量(例如,通過cmd設置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調用來獲取計算機名稱,而不是那麼你可以做的如下:

API調用GetComputerName是由Ken Getz(VBA Developer's Handbook)或Dan Appleman(Visual Basic程序員指南的Win32 API)的代碼派生而來的。 你也可以在互聯網上找到它。首先將模塊添加到您的項目中,將其重命名爲 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 
+1

'Environ $(」ComputerName「)'真的不是一個好主意,我可以通過打開命令提示符輕易地假裝使用老闆的電腦,鍵入'SET ComputerName = MyBossComputer',然後從同一個命令提示符運行Access。獲取計算機名稱的唯一可靠方法是通過@Remou的答案中引用的Windows API。 – 2010-11-21 21:39:46

+0

我同意部分聲明,我將修改代碼snippet。如果工作場所沒有鎖定個人電腦和/或用戶具有修改HKLM配置單元的權限,那麼他們可以很容易地創建一個註冊表項:[HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ ComputerName \ ComputerName ]「ComputerName」=「MyBossComputer」重新啓動操作系統打開Access窗體當代碼將API Call調用到Kernel32 :: GetComputerNameA時它將在啓動時讀取這個註冊表項所以API是reli只要用戶不能修改PC上的HKLM配置單元即可。 – 2010-11-29 20:38:23

+0

編輯會更改本地計算機的名稱,如果它與同名計算機位於同一LAN上,則會導致某些名稱空間衝突(這取決於如何完成名稱解析 - 在管理員可能的情況下對用戶的許可,這將是對等的,在這種情況下,NETBios廣播可能會解決這個問題,這會導致錯誤)。但是,點了。 – 2010-11-30 00:45:03

相關問題