如何在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
相关产品推荐
相关产品推荐

