我有一份SSRS 2012报告,其中包含我正在努力解决的问题。
我的报告由存储过程运行。存储过程中的每一行都返回一个Funding记录。每个资助记录都附加到任务记录。每个任务都可以有一个或多个资金记录。每个资金记录可能有也可能没有与之相关的资金公司。 这意味着我的数据看起来像这样。
TaskID | FundingID | RCPFundingCompany
100 1000 Intel
100 1001 IBM
100 1002 TI
101 1003 Intel
101 1004 <null>
101 1005 <null>
102 1006 <null>
RDL显示按TaskID分组的详细行,每个TaskID有效显示一行。所有这一切都很好。我想要完成的是让FundingCompany在报告的一个单元格中显示为以逗号分隔的列表,如下所示:
Task ID RCPFundingCompany
Row1 Task 100 Intel, IBM, TI
Row2 Task 101 Intel
Row3 Task 102
我的第一个想法是使用LookupSet函数将这些值连接到每行一个单元格。 所以,我使用这个表达式:
=LookupSet(Fields!TaskID.Value, Fields!TaskID.Value, Fields!RCPCompanies.Value, "TaskReviewSummary")
当我预览报告时,出现此错误:
Warning 1 [rsInvalidExpressionDataType] The Value expression used in textrun ‘Textbox10.Paragraphs[0].TextRuns[0]’ returned a data type that is not valid.
我做错了什么? 啊哈,我忘了加入!
=(Join(LookupSet(Fields!TaskID.Value, Fields!TaskID.Value, Fields!RCPCompanies.Value, "TaskReviewSummary"), ", "))
不幸的是,这导致以下结果:
Task ID RCPFundingCompany
Row1 Task 100 Intel, IBM, TI
Row2 Task 101 Intel,
Row3 Task 102 , , ,
因为LookupSet正在创建一个数组(如果我理解正确的话),它会收集NULL,然后连接将它们连接起来。嘘。
怎么办?
答案 0 :(得分:0)
由于Join导致LookupSet中的NULL出现问题,我决定通过将逗号放入存储过程来消除Join。
所以我的数据现在看起来像这样:
TaskID | FundingID | RCPFundingCompany
100 1000 Intel,
100 1001 IBM,
100 1002 TI,
101 1003 Intel,
101 1004 <null>
101 1005 <null>
102 1006 <null>
然后我重新写了这样的表达式:
=IIF(Len(Join(LookupSet(Fields!TaskID.Value, Fields!TaskID.Value,
Fields!RCPCompanies.Value, "TaskReviewSummary"), ""))= 0,
"",
Left((Join(LookupSet(Fields!TaskID.Value, Fields!TaskID.Value,
Fields!RCPCompanies.Value, "TaskReviewSummary"), "")),
abs(Len(Join(LookupSet(Fields!TaskID.Value, Fields!TaskID.Value,
Fields!RCPCompanies.Value, "TaskReviewSummary"), ""))-2)))
此表达式首先测试连接数据集是否大于0.如果不是,则不打印任何内容。如果是这样,它将字符串连接在一起,并删除最后一个逗号。我的数据现在看起来很完美
那么,我做错了吗?是否有更好,更明显,更简单的解决方案?
答案 1 :(得分:0)
嗯,不幸的是,我最初提交的答案不起作用,因为它不能消除重复。所以我的一些行看起来像这样: IBM,IBM,TI,TI,Intel
此时最快的解决方案是使用存储过程中的For XML Path功能来连接值,并消除在SSRS中使用表达式来连接值。