【问题标题】:Auto Populate fields in MS Access FormMS Access 表单中的自动填充字段
【发布时间】:2013-03-11 15:15:34
【问题描述】:

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

【问题讨论】:

  • 为什么不使用包含所有相关表的查询和带有绑定控件的绑定表单? MS Access 让生活变得非常轻松,几乎所有事情都可以在没有代码的情况下完成。应该没有必要做上面这么复杂的事情。
  • 这仍然没有回答如何为特定字段返回多个值的问题。我明白你的意思。即使我只是使用查询而不是上面的代码,我仍然会遇到为每个 ID 返回多个错误代码和错误计数的问题。无论如何,我需要多个查询来引用我的表格;一个是 Project_Error_Final,它汇总了上面输出中的数字。
  • 您好,用户 1195703。我很乐意看看这个。一般来说,我还建议您将来在这些情况下提出一个新问题。我担心的是,由于您已经接受了我对您最初问题的回答,您可能无法将赏金奖励给任何可能回答您修改后的问题的人。
  • 您能否确认您是否预计会出现除“TST”、“BPB”和“SSS”之外的 [Code] 值吗?最简化的答案取决于您是始终只希望这三个代码的计数,还是希望所有可能代码的计数(您的表单上可能有三个以上的字段,或者始终只显示前 3 个)
  • 您能否提供更多关于您如何使用此表单的信息?这是用作报告吗?

标签: forms ms-access return-value multiple-instances auto-populate


【解决方案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

【讨论】:

  • 运行上述代码时出现类型不匹配错误。 “运行时错误 13。”我注意到 rst2 循环中的一个问题。它应该读取 ErrorCode 而不是 Error_Code。任何线索为什么我得到类型不匹配?我将 VarErrorCode 和 VarErrorCount 定义为 Variant。
  • 您在哪一行得到类型不匹配错误?能不能打个断点进去看看?另外,错字的好地方,现在改了。
  • 这行代码似乎导致了问题:VarErrorCode = Mid(1, VarErrorCode, Len(VarErrorCode) - 1) ErroCode 值在技术上是一个字符串。因为输出是TST、BPB、SSS。所以我怀疑我们可以使用那个公式....
  • 如果在 rst2 中找到至少一条记录,这应该可以工作,因为它将使用字符串进行初始化,因此 Mid 函数应该可以工作。您总是可以将变量重新定义为字符串,也可以将它们初始化为"",尽管后面的部分可能不需要。
  • 我刚刚重新定义了VarErrorCode as String。仍然得到相同的错误...键入 MisMatch。而不是用逗号分隔每条记录,有没有一种方法可以简单地将每条记录显示在另一个下方......即。表格格式?
【解决方案2】:

是的!

显然,您需要能够将组合框选择与您希望填充到其他字段中的值相关联。假设您与 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结果

将 VarFoodCat 调暗为变体

'捕获组合框的主键

VarComboKey​​ = Me.ComboFoods.Value

'检索相关字段值

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

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

Me.TextFoodCategory.Value = VarFoodCat

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

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

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

【讨论】:

  • 我不是很精通 VBA,但我不明白“ComboFoods”应该代表什么? “我”是什么意思?和“价值”。究竟是什么意思?
  • 在我的示例中,ComboFoods 是选择 PK 的 Combo Box 控件的名称。 Me.* 是在引用控件之前引用当前数据库和表单的简写。如果您愿意,您可以完全符合此条件。总的来说,这个想法是将 DLookup 或查询与 AfterUpdate 事件结合使用。
  • 我让它工作得很好。但是我意识到我需要返回多个值(即 1 到多个)。我会修改我的问题
  • 我会试试的。现在您需要多条记录,根据您想要完成的具体内容,还有更多考虑因素。我将针对您的主要问题发布额外的 cmets,而不是针对我最初的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
相关资源
最近更新 更多