You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Access表单记录集值加载失败求助:从列表框填充子表单文本框

Access 表单赋值问题解决建议

你的核心问题是误用了DoCmd.OpenForm的Where参数——这个参数是用来筛选表单绑定数据源的记录,不是直接给文本框赋值的。如果6a_ContractQuote表单没有绑定到包含PrincNo和PrincName的数据源,这个条件完全不起作用。以下是具体修正方案:

修正步骤与代码

1. 正确的赋值逻辑

打开表单后,直接通过表单对象引用其文本框控件,把记录集里的值赋值过去。同时要注意记录集的有效性判断,避免空记录报错。

2. 修改后的完整代码

Dim Db As Database
Dim rs6 As Recordset
Dim PrincNo As String
Dim PrincName As String

Public Sub btn_LaunchContrQuote_Click()
    Set Db = CurrentDb
    ' 原SQL的GROUP BY多余,改用WHERE筛选单条记录更高效
    Set rs6 = Db.OpenRecordset("SELECT [5_SUBMISSION].[5_SubmNo], [5_SUBMISSION].[5_SubmStatus], [5_SUBMISSION].[5_DateRecd], " & _
         "[5_SUBMISSION].[3_PrincNo], [3_PRINCIPAL].[3_PrincName], [5_SUBMISSION].[2_AgcyNo], [2_AGENCY].[2_AgcyName], " & _
         "[5_SUBMISSION].[1_ProducerNo], [1_PRODUCER].[1_Last Name], [1_PRODUCER].[1_First Name], [5_SUBMISSION].[4_ObligeeNo], " & _
         "[4_OBLIGEE].[4_ObligName], [5_SUBMISSION].[5_ProjectDescription], [5_SUBMISSION].[5_ProjectCity], " & _
         "[5_SUBMISSION].[5_ProjectState], [5_SUBMISSION].[5_Underwriter], [5_SUBMISSION].[4_AddtlObligee1], " & _
         "[5_SUBMISSION].[4_AddtlObligee2], [5_SUBMISSION].[4_AddtlObligee3], [5_SUBMISSION].[4_AddtlObligee4] " & _
         "FROM (((5_SUBMISSION INNER JOIN 2_AGENCY ON [5_SUBMISSION].[2_AgcyNo] = [2_AGENCY].[2_AgcyNo]) " & _
         "INNER JOIN 3_PRINCIPAL ON [5_SUBMISSION].[3_PrincNo] = [3_PRINCIPAL].[3_PrincNo]) " & _
         "INNER JOIN 4_OBLIGEE ON [5_SUBMISSION].[4_ObligeeNo] = [4_OBLIGEE].[4_ObligeeNo]) " & _
         "INNER JOIN 1_PRODUCER ON ([5_SUBMISSION].[1_ProducerNo] = [1_PRODUCER].[1_ProducerNo]) " & _
         "AND ([2_AGENCY].[2_AgcyNo] = [1_PRODUCER].[2_AgcyNo]) " & _
         "WHERE [5_SUBMISSION].[5_SubmNo] = '" & Me.lst_SelectSubm & "';")

    ' 判断记录集是否有有效数据
    If Not (rs6.BOF And rs6.EOF) Then
        rs6.MoveFirst ' 移至记录首行(原记录集仅单条记录)
        PrincNo = rs6.Fields(3).Value
        PrincName = rs6.Fields(4).Value

        ' 打开目标表单
        DoCmd.OpenForm "6a_ContractQuote", acNormal
        ' 直接给表单文本框赋值
        Forms("6a_ContractQuote").txt_PrincNo = PrincNo
        Forms("6a_ContractQuote").txt_PrincName = PrincName
    Else
        MsgBox "未找到选中的提交记录!"
    End If

    ' 清理对象释放内存
    rs6.Close
    Set rs6 = Nothing
    Set Db = Nothing
End Sub

关键改动说明

  • 替换GROUP BY + HAVING为WHERE:仅筛选单条记录时,GROUP BY完全多余,会降低查询效率。
  • 增加记录集非空判断:避免选中无效项时触发运行时错误。
  • 移除OpenForm的Where参数:改为打开表单后直接赋值,这是给未绑定表单控件赋值的正确方式。
  • 补充对象清理代码:手动关闭记录集、释放对象,避免Access内存泄漏。

额外注意事项

  • 确认6a_ContractQuote表单的文本框名称为txt_PrincNo和txt_PrincName,名称需完全匹配(大小写不敏感)。
  • 若5_SubmNo为数字类型,需去掉SQL语句中'" & Me.lst_SelectSubm & "'的单引号,改为" & Me.lst_SelectSubm & "。

内容的提问来源于stack exchange,提问作者BrianM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 21:30:57