使用VBA-JSON解析Salesforce报表JSON时Rows.Count始终为0求助
解决VBA-JSON解析Salesforce报表JSON时Rows.Count返回0的问题
核心问题定位
你的代码直接通过Report("factMap")("T!T")("rows")获取行数据,但问题大概率出在**T!T这个键与当前报表的factMap实际结构不匹配**,或者行数据的存储位置并非rows节点。
具体排查与解决步骤
- 遍历
factMap所有键,确认有效键名
Salesforce的factMap键格式会随报表的分组/汇总类型变化:
- 无分组明细报表:键通常为
T!T - 一级分组报表:键可能是
0!T(行分组)或T!0(列分组) - 矩阵报表:键格式为
行分组索引!列分组索引(如0!0)
添加以下代码查看所有factMap键及对应数据情况:
Set Report = JsonConverter.ParseJson(GetReport(ReportId, SessionId, ReportMetadataJson)) Dim factMapKey As Variant For Each factMapKey In Report("factMap").Keys Debug.Print "FactMap键名: " & factMapKey If Report("factMap")(factMapKey).Exists("rows") Then Debug.Print factMapKey & "下的行数: " & Report("factMap")(factMapKey)("rows").Count Else Debug.Print factMapKey & "无rows节点,检查aggregates节点" If Report("factMap")(factMapKey).Exists("aggregates") Then Debug.Print factMapKey & "下的汇总数据数: " & Report("factMap")(factMapKey)("aggregates").Count End If End If Next
运行后查看立即窗口,找到包含有效数据的键名,替换代码中的T!T即可。
- 导出原始JSON,直观确认数据位置
将GetReport返回的原始JSON写入本地文件,用JSON格式化工具打开,直接定位行数据所在节点:
Dim rawJson As String rawJson = GetReport(ReportId, SessionId, ReportMetadataJson) ' 路径可自行调整 Open "D:\salesforce_report_raw.json" For Output As #1 Print #1, rawJson Close #1
重点检查factMap节点,确认数据是存储在rows(明细数据)还是aggregates(汇总数据)中。
- 验证解析对象的类型
VBA-JSON会将JSON数组解析为Collection,JSON对象解析为Dictionary。如果rows是Dictionary类型,Count为0说明该节点无有效子元素;如果是Collection类型,Count为0才是真的无数据。用以下代码判断类型:
Set Rows = Report("factMap")("T!T")("rows") Debug.Print "Rows的类型: " & TypeName(Rows)
若为Dictionary,说明你访问的节点错误,需重新定位数据位置。
常见场景修正示例
如果报表是一级分组结构,排查后发现有效键为0!T,则修改代码:
Set Rows = Report("factMap")("0!T")("rows") Dim Total_Rows As Long: Total_Rows = Rows.Count
内容的提问来源于stack exchange,提问作者Andrzej Szado
相关产品推荐
相关产品推荐

