有没有办法自动填充MS Access表单中的字段?假设用户从表单上的特定组合框中进行选择,是否可以根据PK自动选择表单上的其他字段?
我想添加自动填充的字段来自各种表格。
***修正案
一旦我在组合框中选择了特定记录,我需要返回多个值。有人可以帮忙吗?多个值将来自返回如下值的查询:
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 :(得分:1)
是的!
显然,您需要能够将组合框选择与您希望填充到其他字段的值相关联。假设您与PK具有1:1的关系(因为您只想在表单中显示一个值),您可以使用AfterUpdate事件加上DLookup()函数来使用PK检索相关值。
作为一个简单的例子,我按如下方式设置了一个名为Foods的表:
FoodID,FoodName,FoodCategory
1,橙子,水果
2,鸡肉,家禽
3,杏仁,坚果
4,生菜,蔬菜
在表单中,我有一个控件,它选择FoodID作为名为ComboFoods的PK绑定值,以及一个名为TextFoodCategory的未绑定文本框控件,我们将使用Foods表中的FoodCategory填充它。
我已将以下代码分配给组合框的AfterUpdate事件,以便当组合框的值更改时,将填充文本框:
Private Sub ComboFoods_AfterUpdate()
'创建一个变量来存储组合框主键选择
Dim VarComboKey As Integer
'创建一个变量来存储DLookup结果
Dim VarFoodCat As Variant
'捕获组合框的主键
VarComboKey = Me.ComboFoods.Value
'检索相关字段值
VarFoodCat = DLookup(“[FoodCategory]”,“[Foods]”,“[FoodID] =”& VarComboKey)
'将文本框的值设置为变量
Me.TextFoodCategory.Value = VarFoodCat
这将返回与PK相关的FoodCategory。这都是使用一个表,但可以修改DLookup语句以引用包含PK的任何查询或表。
请注意,只有PK在您引用的数据中是唯一的时,DLookup才能正常工作。除非您指定将结果限制为一条记录的其他条件,否则它不会在一对多关系中起作用。如果需要返回多个记录,还有其他方法可以在VBA中使用SQL查询和记录集,但这超出了这个问题的范围。
这在测试时起作用 - 祝您好运!
答案 1 :(得分:1)
关于您的多次退货,您不能使用DLookup
,但我会告诉您如何根据您的描述获得所需的结果。
在此特定示例中,VarErrorCode应返回“TST”,“BPB”和“SSS”。 VarErrorCount应该返回相应的VarErrorCode值:“4”,“7”,“10”
将End Sub
以上的最后4行更改为以下内容:
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