2010-08-13 65 views
12

我已經創建了一個名爲login的登錄表單,其中用戶名被輸入到txtEmployee文本框中,並且我需要在MS Access中以另一種形式在第二頁中顯示相同的內容。在MS Access中傳遞表單之間的參數

+0

是用戶名稱與Windows登錄用戶名相同?如果是這樣,你可以從http://www.mvps.org/access/api/api0008.htm – Fionnuala 2010-08-13 08:04:48

+1

得到這個名字。另外,爲什麼你需要顯示用戶名,當然用戶知道他們是誰?如果您因其他原因需要名稱,您應該這樣說,因爲有多種方法可以傳遞信息。例如,如果名稱用於過濾記錄,則OpenForm方法的Where參數可能是最好的。 – Fionnuala 2010-08-13 08:08:41

+2

這聽起來像你已經構建了一個假安全系統。爲什麼你這樣做,而不是使用Jet ULS或Windows NTFS安全性或Active Directory? – 2010-08-14 04:00:13

回答

24

DoCmd.OpenForm允許您傳遞任意值作爲最後一個參數。這個值可以在新的形式來接入Me.OpenArgs

' Invoked by some Button on the first form ' 
Sub GoToSecondPage() 
    DoCmd.OpenForm "MySecondPage", acNormal, , , , , txtEmployee.Value 
End Sub 

' Second form ' 
Sub Form_Open(Cancel As Integer) 
    If Not IsNull(Me.OpenArgs) Then 
     lblShowEmployeeName.Value = Me.OpenArgs 
    End If 
End Sub 

(代碼示例未經)

4

個人而言,我會打開表單時,通過他們通過開放的論據。例如從形式的你會寫

DoCmd.OpenForm "frmB", , , , , acDialog,」Badger」 

然後在B型的OnOpen事件,你可以捕捉你喜歡這個

Me.txtSomething=Me.OpenArgs 

發送的內容只能通過一件事我做的不過是什麼很多是在打開的參數中傳遞管道分隔的字符串,然後將其分開。

+0

你爲什麼用acDialog打開? – Fionnuala 2010-08-13 08:05:50

+0

那麼這個例子就像是一個彈出式窗體,所以我希望它是模態的,這當然可以刪除,如果OP只是想要一個正常的形式 – 2010-08-13 08:35:38

0

一對夫婦的想法...

使用的登錄用戶名外地AfterUpdate事件的名稱寫一個全局變量,然後填充在onload事件的第二頁上的場。

或者,如果你打算留在日誌中的形式開放在任何時候,你可以在字段的默認值設置直接= [窗體]![登錄表單]![用戶名]

0

爲什麼不創建一個公用函數,它存儲& /或檢索在執行第一個表單後存儲的全局變量?這將允許您不僅在一個或多個表單上使用它,而且還將其用作查詢中的條件(例如,返回與您存儲的用戶名匹配的記錄)。

我同意這是「假」安全,但也有時候它足夠滿足您的需求。我之前已經實現了這一點,我將環境字符串用戶名與用戶表中的條目匹配。

順便說一句,我把這個功能稱爲個性化,而不是安全性。

只是一個想法。

+1

我永遠不會使用全局這一點。相反,我會在返回值的函數中使用STATIC變量,如果未設置,它將打開表單來收集信息。這意味着它既能自我修復,又能安全地在代碼中的其他地方進行修改。 – 2010-08-16 19:58:47

5

可以傳遞一個分隔的字符串作爲OpenArgs參數:

DoCmd.OpenForm FormName:="miscForm", OpenArgs:=paramstring 

下面是處理作爲參數傳遞給DoCmd.OpenForm管道分隔字符串例行:

Dim Pstring As Variant 

If Len(Me.OpenArgs) > 0 Then 
    Pstring = Split(Me.OpenArgs, "|") 
    var1 = Pstring(0) 
    <etc..> 
End If 
+1

我通常認爲需要這樣做來表明設計問題。也就是說,如果你不得不將這麼多的信息傳遞給表單,那麼你基本上應該採用某種結構化的方式。 – 2011-06-26 23:20:22

+0

@David,你是指'struct'類型變量?我只在當前的Access應用程序中使用這種形式,因此在提出表單之前,我不必在數據庫中放入東西,然後在表單中再次放入東西。我打開一個更好的主意,我不是訪問表單專家。 – 2011-06-27 14:20:36

+0

有很多方法可以完成這個。一種是簡單地將數據從調用上下文中戳入被調用的表單。這可以通過使用acHidden和acDialog打開表單來完成,並且當您完成將數據獲取到被調用表單中時,可以使其顯示,這使得模式和代碼在調用上下文中停止執行。我通常不這樣做。我更傾向於使用類模塊,但只有當您需要傳遞多個屬性時纔會有利可圖,例如在根據多個條件進行篩選時。 – 2011-06-28 21:22:55