0

有没有办法自动填充 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”

4

2 回答 2

1

就在这里!

显然,您需要能够将组合框选择与您希望填充到其他字段中的值相关联。假设您与 PK 具有 1:1 的关系(因为您只想在表单中显示一个值),您可以使用 AfterUpdate 事件加上 DLookup() 函数来使用 PK 检索相关值。

作为一个简单的示例,我设置了一个名为 Foods 的表,如下所示:

FoodID、FoodName、FoodCategory

1、橙子、水果

2、鸡肉、家禽

3、杏仁、坚果

4、生菜、蔬菜

在表单中,我有一个选择 FoodID 作为名为 ComboFoods 的 PK 绑定值的控件,以及一个名为 TextFoodCategory 的未绑定文本框控件,我们将使用 Foods 表中的 FoodCategory 填充该控件。

我已将以下代码分配给组合框的 AfterUpdate 事件,以便当组合框的值更改时,将填充文本框:

私有子 ComboFoods_AfterUpdate()

'创建一个变量来存储组合框主键选择

将 VarComboKey​​ 调暗为整数

'创建一个变量来存储 DLookup 结果

Dim VarFoodCat 作为变体

'获取组合框的主键

VarComboKey​​ = Me.ComboFoods.Value

'获取相关字段值

VarFoodCat = DLookup("[FoodCategory]", "[Foods]", "[FoodID] = " & VarComboKey​​)

'将文本框的值设置为变量

Me.TextFoodCategory.Value = VarFoodCat

这将返回与 PK 相关的 FoodCategory。这都是使用一个表,但是可以修改 DLookup 语句以引用任何包含 PK 的查询或表。

请注意,只有当您引用的数据中的 PK 是唯一的时,DLookup 才能正常工作。除非您指定将结果限制为一条记录的其他条件,否则它不会在一对多关系中工作。如果您需要返回多条记录,还有其他方法可以在 VBA 中使用 SQL 查询和记录集,但这超出了此问题的范围。

这在测试时有效 - 祝你好运!

于 2013-03-11T16:59:30.110 回答
1

关于您的多次退货,您不能使用 a 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
于 2013-03-15T15:01:56.527 回答