In Telerik Reporting (Desktop), how to inject a json sub-node into sub-report string parameter

huangapple go评论54阅读模式
英文:

In Telerik Reporting (Desktop), how to inject a json sub-node into sub-report string parameter

问题

根据以下 JSON 示例,我正在尝试定义一个 Telerik 报表,其中包括主报表和子报表,其中第二个子报表使用主报表 JSON 数据的子集。

基本上,数据流程如下:

  1. 应用程序将基本 JSON 数据注入主报表的 jsonData(字符串)参数中。
  2. jsonData 被绑定为报表数据源。
  3. 应用 JSON 数据选择器。
  4. 选择的 JSON 数据中的 Employes 节点被注入到子报表中,子报表也将其用作 JSON 数据源。

问题出现在第 4 步,在渲染主报表时,我收到了 [报表参数 'jsonData' 的无效值] 错误。

似乎 Telerik 报表无法将选定的 JSON 节点字段数据转换为正确的字符串。

完整上下文如下:

  • 在两个报表上

    • 有一个 jsonData 报表参数,数据类型为 string
    • 有一个定义的 JsonDataSource
    • 字符串 jsonData 参数与主 JsonDataSource 之间的绑定基于:
      • 属性路径:Datasource.Source
      • 表达式:= Parameters.jsonData.Value
  • 在主报表上

    • 使用 JsonDatasource $.Companies 数据选择器,结果是一个包含公司列表的列表,每个实例都有:
      • Name,表示公司名称的字符串。
      • Employes,包含公司员工列表的对象。
    • 完整的示例 JSON 数据通过 jsonData 参数注入为字符串。
  • 在子报表上

    • 也有一个 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:

  1. Application injects base json data into main report's
    jsonData(string) parameter;
  2. jsonData is binded as report datasource;
  3. Json data selector is applied;
  4. 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.
  • 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

huangapple
  • 本文由 发表于 2023年5月30日 01:50:32
  • 转载请务必保留本文链接:https://go.coder-hub.com/76359399.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定