使用LookupSet时表达式错误?

时间:2014-11-06 01:04:36

标签: reporting-services

我有一份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,然后连接将它们连接起来。嘘。

怎么办?

2 个答案:

答案 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中使用表达式来连接值。