英文:
In Telerik Reporting (Desktop), how to inject a json sub-node into sub-report string parameter
问题
根据以下 JSON 示例,我正在尝试定义一个 Telerik 报表,其中包括主报表和子报表,其中第二个子报表使用主报表 JSON 数据的子集。
基本上,数据流程如下:
- 应用程序将基本 JSON 数据注入主报表的 jsonData(字符串)参数中。
- jsonData 被绑定为报表数据源。
- 应用 JSON 数据选择器。
- 选择的 JSON 数据中的 Employes 节点被注入到子报表中,子报表也将其用作 JSON 数据源。
问题出现在第 4 步,在渲染主报表时,我收到了 [报表参数 'jsonData' 的无效值] 错误。
似乎 Telerik 报表无法将选定的 JSON 节点字段数据转换为正确的字符串。
完整上下文如下:
-
在两个报表上:
- 有一个 jsonData 报表参数,数据类型为 string。
- 有一个定义的 JsonDataSource。
- 字符串 jsonData 参数与主 JsonDataSource 之间的绑定基于:
- 属性路径:Datasource.Source
- 表达式:= Parameters.jsonData.Value
-
在主报表上:
- 使用 JsonDatasource $.Companies 数据选择器,结果是一个包含公司列表的列表,每个实例都有:
- Name,表示公司名称的字符串。
- Employes,包含公司员工列表的对象。
- 完整的示例 JSON 数据通过 jsonData 参数注入为字符串。
- 使用 JsonDatasource $.Companies 数据选择器,结果是一个包含公司列表的列表,每个实例都有:
-
在子报表上:
- 也有一个 jsonData 报表参数,数据类型为 string。
- 使用 JsonDataSource $ 数据选择器,应该得到:
- 包含以下字段的列表:
- Name,表示员工姓名的字符串。
- Wage,表示员工工资的数值。
- 包含以下字段的列表:
-
再次在主报告上,我正在使用以下子报告参数映射:
- 参数名称:jsonData
- 参数值:Fields.Employes
-
我正在使用 Telerik Report Designer v15.1.21.716 (桌面版)。
看起来数据选择器将 JSON Employes 节点数据转换为 System.Object[],这让我很难弄清楚如何将其转换回 JSON 字符串。
在帮助我之前,请注意:
- 尽管我非常感激任何人尝试帮助我的努力:
- 我正在追求仅使用 JSON 数据源的解决方案。我的意思是,我对 Telerik Reporting 支持的任何其他替代数据源不感兴趣。
- 解决方案必须在设计时和运行时都可用。
英文:
Introduction
Based on the below json sample, I am trying to define a Telerik report using both a main report and a sub-report, where se second is fed with a subset of the main report json data.
Basically, data flow mimics something like:
- Application injects base json data into main report's
jsonData(string) parameter; - jsonData is binded as report datasource;
- Json data selector is applied;
- Json selected data Employes node is injected into a sub-report, which will also use it as a json data source.
Troubles arose on step 4, where I am getting an [Invalid value of report parameter 'jsonData'] error when main report is rendered.
It seems Telerik Report is unable to convert a selected json node field data into a proper string.
Full context
For full context:
-
On both reports:
-
There is a jsonData report parameter of string datatype;
-
There is a JsonDataSource defined;
-
Binding between the string jsonData parameter and main JsonDataSource is based upon:
- Property path: Datasource.Source
- Expression: = Parameters.jsonData.Value
-
-
On main report:
- JsonDatasource $.Companies data selector is being used, resulting in a list representing containing de the companies list, each instance having:
-
Name, a string representing the company name;
-
Employes, an object containing the company employes list.
- Full sample json data is injected thru jsonData parameter as a string;
-
On sub-report:
- There is also a jsonData report parameter of string datatype;
- JsonDataSource $ data selector is being used, which should result in:
- A list of the following fields:
- Name, a string representing the name of the employe;
- Wage, a numeric value representing employe's wage.
- A list of the following fields:
-
Again on main-report, I am using the following sub-report parameters mapping:
- Parameter Name: jsonData
- Parameter Value: Fields.Employes
-
I am using Telerik Report Designer v15.1.21.716 (Desktop)
It seems that data selector converts json Employes node date into a System.Object[], which is giving me a nice hard time figuring out how to convert it back to a json string.
I have alread extensively searched on documentation, web, ChatGPT and alikes for a valid solution. So far, no luck.
Before you help me
Although I have the most appreciation for anyones effort trying to helping me:
- I am pursuing a json only data source solution. I mean, I am not interested on any other alternative suported Telerik Reporting datasources;
- Solution must work in both design-time and runtime.
{
"Companies": [
{
"Name": "Company1",
"Employes": [
{
"Name": "Joe",
"Wage": 1000
},
{
"Name": "Jack",
"Wage": 2000
}
]
},
{
"Name": "Company2",
"Employes": [
{
"Name": "Mary",
"Wage": 3000
},
{
"Name": "Mike",
"Wage": 4000
}
]
}
]
}
答案1
得分: 1
的确,将"Employes"对象传递给子报表的"jsonData"参数不会起作用,因为该对象不能直接转换为JSON字符串。您必须通过**CStr()**函数进行转换。
然而,您可以使用如何表示分层嵌套数据知识库文章中描述的绑定,而不是使用参数来设置子报表的数据源。
我还要提到,在R3 2022 SP1版本中,SubReport项中添加了DataSource属性。这使得我上面提到的方法已经过时,因为它允许您直接在主报表中绑定子报表的数据源。
例如:
解决方案 1
基于DataSource属性的SubReport项绑定:
属性路径:DataSource
表达式:= Fields.Employes
解决方案 2
在@Julio提供的示例中,允许将JSON节点注入为子报表参数,而不是直接数据源,您应该使用以下方法。
通过子报表参数进行SubReport项绑定:
属性路径:jsonData
表达式:= CStr(Fields.Employes)
请注意...
-
解决方案 1,不需要显式的内部子报表绑定到数据源;
-
解决方案 2,需要在子报表和其数据源之间进行额外的绑定,如原始帖子中所述。
有关此主题的更多详细信息,请查看原始的Telerik原始帖子。
英文:
Indeed, passing the "Employes" object to the "jsonData" parameter of the subreport should not work because the object cannot be converted to a JSON string directly. You have to convert it thru CStr() function.
However, instead of using a parameter to set the data source of the subreport, you can use the binding described in the How to Represent Hierarchical Nested Data KB article.
I also want to mention that in the R3 2022 SP1 release, the DataSource property was added to the SubReport item as well. This makes the approach I suggested above obsolete because it allows you to bind the data source of the subreport directly in the main report.
For example:
Solution 1
SubReport item binding based on DataSource property:
Property path: DataSource
Expression: = Fields.Employes
Solution 2
In @Julio's provided sample, which allows to inject json node as a sub-report parameter, instead of a direct datasource, you should use following approach.
SubReport item binding thru sub-report parameter:
Property path: jsonData
Expression: = CStr(Fields.Employes)
Bear in mind that...
-
Solution 1, does not require explicit inner sub-report binding to datasource;
-
Solution 2, requires additional binding between the sub-report
parameter and its datasource, as stated on the original post.
For further details on this subject, check original Telerik's original post
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论