提问人:Julio Nobre 提问时间:5/30/2023 最后编辑:Julio Nobre 更新时间:6/9/2023 访问量:140
在 Telerik Reporting (Desktop) 中,如何将 json 子节点注入到子报表字符串参数中
In Telerik Reporting (Desktop), how to inject a json sub-node into sub-report string parameter
问:
介绍
根据下面的 json 示例,我正在尝试使用主报告和子报告来定义 Telerik 报告,其中 se second 提供主报告 json 数据的子集。
基本上,数据流模仿如下内容:
- 应用程序将基本 json 数据注入主报表的 jsonData(string) 参数;
- jsonData 绑定为报表数据源;
- 应用 Json 数据选择器;
- 将 Json selected data Employes 节点注入到子报表中,该子报表也会将其用作 json 数据源。
在第 4 步出现问题,在呈现主报表时,我收到 [报表参数'jsonData' 的无效值] 错误。
Telerik Report似乎无法将选定的json节点字段数据转换为正确的字符串。
完整背景
有关完整上下文:
在这两份报告中:
有一个字符串数据类型的jsonData报表参数;
定义了一个 JsonDataSource;
字符串 jsonData 参数和主 JsonDataSource 之间的绑定基于:
- 属性路径:Datasource.Source
- 表达式:= Parameters.jsonData.Value
关于主要报告:
- JsonDatasource $.正在使用公司数据选择器,从而生成一个列表,表示包含 de 公司列表,每个实例具有:
Name,表示公司名称的字符串;
Employes,包含公司雇员列表的对象。
- 完整的示例 json 数据通过 jsonData 参数作为字符串注入;
在子报表上:
- 还有一个字符串数据类型的 jsonData 报表参数;
- 正在使用 JsonDataSource $ 数据选择器,这应该会导致:
- 以下字段的列表:
- Name,表示受雇者姓名的字符串;
- Wage,表示雇员工资的数值。
- 以下字段的列表:
同样在主报表上,我使用以下子报表参数映射:
- 参数名称:jsonData
- 参数值:Fields.Employes
我正在使用 Telerik Report Designer v15.1.21.716(桌面版)
似乎数据选择器将 json Employes 节点日期转换为 System.Object[],这让我很难弄清楚如何将其转换回 json 字符串。
我已经在文档、网络、ChatGPT 等网站上进行了广泛的搜索,以寻找有效的解决方案。到目前为止,没有运气。
在你帮助我之前
虽然我最感激任何人试图帮助我的努力:
- 我正在寻求一个仅json数据源解决方案。我的意思是,我对任何其他替代支持的 Telerik Reporting 数据源不感兴趣;
- 解决方案必须在设计时和运行时都有效。
{
"Companies": [
{
"Name": "Company1",
"Employes": [
{
"Name": "Joe",
"Wage": 1000
},
{
"Name": "Jack",
"Wage": 2000
}
]
},
{
"Name": "Company2",
"Employes": [
{
"Name": "Mary",
"Wage": 3000
},
{
"Name": "Mike",
"Wage": 4000
}
]
}
]
}
答:
实际上,将“Employes”对象传递给子报表的“jsonData”参数应该不起作用,因为该对象无法直接转换为 JSON 字符串。您必须通过 CStr() 函数转换它。
但是,可以使用如何表示分层嵌套数据知识库文章中介绍的绑定,而不是使用参数来设置子报表的数据源。
我还想提一下,在 R3 2022 SP1 版本中,DataSource 属性也被添加到了 SubReport 项中。这使得我上面建议的方法已经过时,因为它允许您直接在主报表中绑定子报表的数据源。 例如:
解决方案 1
基于 DataSource 属性的 SubReport 项绑定:
Property path: DataSource
Expression: = Fields.Employes
解决方案 2
在 @Julio 提供的示例中,该示例允许将 json 节点作为子报表参数注入,而不是直接数据源,您应该使用以下方法。
通过子报表参数绑定子报表项:
Property path: jsonData
Expression: = CStr(Fields.Employes)
请记住...
解决方案 1,不需要显式内部子报表绑定到数据源;
解决方案 2,需要在子报表之间进行额外的绑定 参数及其数据源,如原始帖子所述。
有关此主题的更多详细信息,请查看 Telerik 的原始帖子
评论