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

如何在Access VBA中将子窗体所有行数据纳入JSON字符串

解决子窗体仅提取第一行数据的VBA代码修改方案

你的问题核心在于没有在Recordset循环内动态创建新的字典来存储每一行子窗体数据,而是直接引用子窗体控件(默认只取当前行),并且只添加了一次数据到集合里。下面是修改后的完整代码,以及关键改动说明:

修改后的完整代码

Private Sub CmdSales_Click()
    Dim rs As Recordset
    Dim foo As New Dictionary
    Dim Noor As Dictionary
    Dim hoo As Collection
    Dim Koo As New Collection ' 存储所有子窗体行数据的集合
    
    ' 初始化主数据字典
    With foo
        .Add "PosSerialNumber", Me.INV
        .Add "IssueTime", Me.InvoiceDate
        .Add "Customer", Me.Customer.Column(1)
        .Add "TransactionTyp", 0
        .Add "PaymentMode", 0
        .Add "SaleType", 0
        .Add "Items", Koo ' 将空集合先关联到主字典
    End With
    
    ' 遍历子窗体的所有行数据
    Set rs = Me.[sfrmInvoicedetails Subform].Form.RecordsetClone
    With rs
        Do While Not .EOF
            ' 每次循环新建一个字典存储当前行的子窗体数据
            Set Noor = New Dictionary
            Set hoo = New Collection ' 每个行的Taxable集合单独创建
            
            ' 从Recordset中获取当前行的字段值(替换成你实际的字段名)
            Noor.Add "ItemID", 1 ' 如果ItemID是子窗体字段,改成rs.Fields("ItemID").Value
            Noor.Add "Description", rs.Fields("Description").Value
            Noor.Add "BarCode", "4589630036" ' 如果BarCode是字段,改成rs.Fields("BarCode").Value
            Noor.Add "Quantity", rs.Fields("Qty").Value
            Noor.Add "UnitPrice", rs.Fields("UnitPrice").Value
            Noor.Add "Discount", rs.Fields("Discount").Value
            hoo.Add rs.Fields("Taxables").Value
            Noor.Add "Taxable", hoo
            Noor.Add "Total", 120 ' 如果Total是计算值,可根据Qty和UnitPrice计算
            Noor.Add "IsTaxInclusive", rs.Fields("Inclusive").Value
            Noor.Add "RRP", rs.Fields("RRP").Value
            
            ' 将当前行的字典添加到Items集合
            Koo.Add Noor
            
            .MoveNext ' 移动到下一行
        Loop
    End With
    Set rs = Nothing
    
    ' 生成并显示JSON
    MsgBox JsonConverter.ConvertToJson(foo, Whitespace:=3), vbOKOnly, "Audited by Chris H"
End Sub

关键改动说明

  • 循环内动态创建字典:每次循环都新建Noor字典和hoo集合,避免所有行数据覆盖到同一个对象里。
  • 使用Recordset字段取值:通过rs.Fields("字段名").Value获取当前行的实际数据,而不是直接引用子窗体控件(控件仅显示当前选中行的数据)。
  • 调整集合关联顺序:先把空的Koo集合关联到主字典foo的Items键,再在循环中往Koo里添加每一行的数据,确保所有子行都能被纳入JSON。
  • 清理冗余对象初始化:去掉了重复的Set foo = New Dictionary这类重复初始化代码,保持代码简洁。

注意:请将代码中的字段名(比如Description、Qty)替换成你子窗体数据源中实际的字段名称,如果ItemID、BarCode也是子窗体的字段,记得改成从rs.Fields取值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:09:31