2014-04-01 51 views
1

我有至極我使用全局變量在所有的形式展現在記錄哪些用戶訪問項目使用全局變量。在SQL查詢

Public activeUser As String 

在的一種形式我想秀數據取決於誰登錄。表單中有幾個字段,所以我想在整個表單中使用查詢作爲數據源。

現在,這裏是我的問題:

我試圖讓在activeUser使用值的查詢來查找該活動的用戶應該能夠看到所有的值:

SELECT WBS_Id, 
     Verantw, 
     Commentaar 
    FROM tbl_New_WPE_User 
WHERE UserName LIKE activeUser 

爲什麼這不行嗎?我怎樣才能使它工作?

+1

您可能需要檢查以下鏈接:[SQL語句中的全局變量](http://stackoverflow.com/questions/22563844/global-variables-in-sql-statement/22563897#22563897) –

+0

我強烈建議儘可能避免全局變量。他們被清除任何未處理的錯誤。爲什麼不把用戶存儲在本地表中? – Fionnuala

+0

@Remou使用表格這樣的東西不是不好的做法嗎? – Gutanoth

回答

3

一種選擇是創建一個VBA函數來返回全局變量的值。例如

Public Function GetActiveUser() As String 
    GetActiveUser = activeUser 
End Function 

然後,你可以使用該功能在保存的查詢像

SELECT WBS_Id, 
     Verantw, 
     Commentaar 
FROM tbl_New_WPE_User 
WHERE UserName LIKE GetActiveUser() 

然而,在這種特定的情況下,我會傾向於擺脫全局變量並調用函數獲取當前用戶(即,您用來填充全局變量的代碼)。我懷疑每次檢索值的額外開銷(例如,通過從WScript.Network對象中獲取.Username屬性)會相當多,如果它確實成爲問題,那麼您始終可以考慮使用Static變量在你的函數內緩存值。

+1

看起來不錯,但是爲什麼喜歡?難道這不是不安全?Gord,GordT等? – Fionnuala

+1

@Remou好問題。我真的沒有太在意SQL代碼本身,我着重於用函數替換全局變量。但是,沒有通配符的LIKE與'='的行爲相同,所以我認爲它只會返回完全匹配。 –

+0

修辭問題:)我仍然認爲像是混亂。 – Fionnuala

0

我猜SQL是用VBA代碼串的形式:

Public activeUser As String 
dim tmpSql As String 

tmpSql = "SELECT WBS_Id, Verantw, Commentaar FROM tbl_New_WPE_User WHERE UserName LIKE activeUser" 

如果是這樣,那麼你應該做到以下幾點:

tmpSql = "SELECT WBS_Id, Verantw, Commentaar FROM tbl_New_WPE_User WHERE UserName LIKE " & activeUser & "*" 

其中*的訪問是%相當於在SQL Server中

現在,如果SQL語句是用Access查詢寫的,那麼就不可能使用VBA變量activeUser