0

有沒有辦法自動填充MS Access窗體中的字段?比方說,用戶從表單上的特定組合框中進行選擇,是否有可以根據PK自動選擇表單上的其他字段的內容?自動填充MS Access窗體中的字段

我還想補充一點,字段自動填入將來自各種表..

*** ammendment

我需要一次我選擇在組合框中特定記錄返回多個值。有人可以幫忙嗎?多個值將來自返回這樣的值的查詢:

ID   Code    Count 
24   TST    4 
24   BPB    7 
24   SSS    10 

在窗體,組合框會選擇的ID號。一旦我選擇了24的ID號碼,我想返回上面來自名爲Project_Error_Final的查詢的所有3條記錄(在這個例子中有3個值要返回,但我希望查詢返回ID = 24的任何記錄)。到目前爲止,VBA代碼是:

Private Sub cboProjectID_Change() 

Dim VarComboKey As Integer 
Dim VarObjective As Variant 
Dim VarStartDate As Variant 
Dim VarEndDate As Variant 
Dim VarRiskCategory As Variant 
Dim VarTarDatSet As Variant 

Dim VarErrorCount As Variant 
Dim VarErrorCode As Variant 

VarComboKey = Me.cboProjectID.Value 

VarObjective = DLookup("[Objective]", "[Project_HDR_T]", "[Project_ID] = " & VarComboKey) 
Me.txtObjective = VarObjective 

VarStartDate = DLookup("[Start_Date]", "[Project_HDR_T]", "[Project_ID] = " & VarComboKey) 
Me.txtStartDate = VarStartDate 

VarEndDate = DLookup("[End_Date]", "[Project_HDR_T]", "[Project_ID] = " & VarComboKey) 
Me.txtEndDate = VarEndDate 

VarRiskCategory = DLookup("[Risk_Category]", "[Project_HDR_T]", "[Project_ID] = " & VarComboKey) 
Me.txtRiskCategory = VarRiskCategory 

VartxtTarDatSet = DLookup("[Targeted_Dataset]", "[Project_Targeted_Dataset]", "[Project_ID] = " & VarComboKey) 
Me.txtTarDatSet = VartxtTarDatSet 

VarErrorCount = DLookup("[Count_Error_Codes]", "[Project_Error_Final]", "[project_ID] = " & VarComboKey) 
Me.txtErrorCount = VarErrorCount 

VarErrorCode = DLookup("[ErrorCode]", "[Project_Error_Final]", "[project_ID] = " & VarComboKey) 
Me.txtErrorCode = VarErrorCode 

End Sub 

有問題的值是VarErrorCount和VarErrorCode。在上面的VBA代碼中,只返回一個值。但是,一旦選擇了ID組合框字段,我正在查找多個VarErrorCount和VarErrorCode值以在我的表單中返回。在這個特定的例子中,VarErrorCode應該返回「TST」,「BPB」和「SSS」。 VarErrorCount應返回相應的VarErrorCode值:「4」,「7」,「10」

+0

你爲什麼不使用查詢包含所有相關的表格和綁定控件的綁定表單? MS Access使生活變得非常簡單,幾乎所有事情都可以在沒有代碼的情況下完成應該不需要做任何像上面那樣複雜的事情。 – Fionnuala 2013-03-14 15:56:41

+0

這仍然不能回答如何返回特定字段的多個值的問題。我明白你的意思。即使我只是使用查詢而不是上面的代碼,但我仍然會遇到爲每個ID返回多個錯誤代碼和錯誤計數的問題。無論我需要多個查詢來引用我的表單,一個是Project_Error_Final,它彙總了上面輸出中的數字。 – JT2013 2013-03-14 16:03:20

+0

再次請用戶1195703.我很樂意看看這個。總的來說,我還建議您將來在這些情況下提出一個新問題。我擔心的是,既然你已經接受了我對你最初問題的回答,那麼你可能無法將賞金獎勵給可能會回答你修改問題的其他人。 – JAGAnalyst 2013-03-14 20:29:10

回答

1

關於您的多重退貨,您不能使用DLookup,但我會告訴您如何根據您的描述獲得您想要的結果。

在這個特殊的例子中,VarErrorCode應該返回「TST」,「BPB」和「SSS」。該VarErrorCount應該會返回相應VarErrorCode值: 「4」, 「7」, 「10」

改變你的最後4行End Sub以上爲以下:

Dim dbs as DAO.Database 
Dim rst1 as DAO.Recordset 
Dim rst2 as DAO.Recordset 

Set dbs = CurrentDb 
Set rst1 = dbs.OpenRecordset("SELECT [Count_Error_Codes] FROM [Project_Error_Final] WHERE [project_ID] = " & VarComboKey) 
If rst1.RecordCount > 0 Then 
    rst1.MoveFirst 
    Do Until rst1.EOF 
     VarErrorCount = VarErrorCount & rst1!Count_Error_Codes & "," 
     rst1.MoveNext 
    Loop 
    ' Remove the last comma 
    VarErrorCount = Mid(VarErrorCount, 1, Len(VarErrorCount) - 1) 
End If 

Set rst2 = dbs.OpenRecordset("SELECT [ErrorCode] FROM [Project_Error_Final] WHERE [project_ID] = " & VarComboKey) 
If rst2.RecordCount > 0 Then 
    rst2.MoveFirst 
    Do Until rst2.EOF 
     VarErrorCode = VarErrorCode & rst2!ErrorCode & "," 
     rst2.MoveNext 
    Loop 
    ' Remove the last comma 
    VarErrorCode = Mid(VarErrorCode, 1, Len(VarErrorCode) - 1) 
End If 

rst1.Close 
Set rst1 = Nothing 

rst2.Close 
Set rst2 = Nothing 

dbs.Close 
Set dbs = Nothing 

Me.txtErrorCount = VarErrorCount 
Me.txtErrorCode = VarErrorCode 
+0

當我運行上面的代碼時,出現類型不匹配錯誤。 「運行時錯誤13」。我注意到rst2循環中有一個問題。它應該讀取ErrorCode而不是Error_Code。任何線索爲什麼我得到類型不匹配?我將VarErrorCode和VarErrorCount定義爲Variant。 – JT2013 2013-03-15 15:18:56

+0

哪一行是你的類型不匹配錯誤?你可以把一個斷點,並逐步通過看?此外,錯字的好處,現在改變了。 – RichardC 2013-03-15 15:32:28

+0

它看起來像這行代碼引起的問題:'VarErrorCode = Mid(1,VarErrorCode,Len(VarErrorCode) - 1)'ErroCode值在技術上是一個字符串。由於輸出是** TST,BPB,SSS **。所以我懷疑我們可以使用該公式.... – JT2013 2013-03-15 15:34:52

1

是的!

顯然,您需要能夠將組合框選擇與您希望填充到其他字段的值關聯起來。假設您與PK具有1:1的關係(因爲您只想在表單中顯示一個值),則可以使用AfterUpdate事件和DLookup()函數使用PK檢索相關值。

作爲一個簡單的例子,我建立了一個名爲食品表如下:

FoodID,FoodName,FoodCategory

1,橙色,水果

2,雞,家禽

3,杏仁,堅果

4,生菜,蔬菜

在表單中,我有一個控件,選擇FoodID作爲名爲ComboFoods的PK綁定值,以及一個名爲TextFoodCategory的未綁定文本框控件,我們將使用Food表中的FoodCategory填充該控件。

我已經指派下面的代碼組合框的AfterUpdate事件,以便當組合框的值發生改變,文本框將被填充:

私人小組ComboFoods_AfterUpdate()

「創建一個變量來存儲組合框主密鑰選擇

昏暗VarComboKey​​作爲整數

」創建一個變量來存儲使用DLookup結果

昏暗VarFoodCat作爲變

'捕獲組合框的主鍵

VarComboKey​​ = Me.ComboFoods.Value

' 檢索相關字段值

VarFoodCat =使用DLookup( 「[FoodCategory]」,「[Foods]」,「[FoodID] =」& VarComboKey​​)

「文本框中的值設置爲可變

Me.TextFoodCategory.Value = VarFoodCat

這將返回有關PK的FoodCategory。這全部使用一個表,但可以修改DLookup語句以引用包含PK的任何查詢或表。

請注意,只有在您所引用的數據中PK是唯一的時,DLookup才能正常工作。除非您指定將結果限制爲一條記錄的其他條件,否則它不會以一對多關係運作。如果您需要返回多個記錄,還有其他方法可以在VBA中使用SQL查詢和記錄集,但是這超出了此問題的範圍。

這個工作時測試 - 最好的運氣!

+0

即時通訊不是非常精通VBA,但我不明白「ComboFoods」應該代表什麼?和「我」是什麼。和「價值」。其實是指? – JT2013 2013-03-11 19:07:44

+0

在我的示例中,ComboFoods是選擇PK的組合框控件的名稱。 Me。*是在引用控件之前引用當前數據庫和表單的簡寫形式。如果您願意,您可以完全符合此條件。總的來說,這個想法是將DLookup或查詢與AfterUpdate事件結合使用。 – JAGAnalyst 2013-03-11 19:27:04

+0

我得到了這個工作非常好。但即時通訊意識到我需要返回多個值(即1到很多)。我會推薦我的問題 – JT2013 2013-03-14 00:29:33