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