RDLC报告 - 错误Rownumber()不能用于过滤器

时间:2015-09-03 07:44:47

标签: reporting-services rdlc rdl dynamic-rdlc-generation

我有两个Tablix(表格)和一个数据集。 它们与此数据集绑定

   Serial No.  |      Name    
 ______________|________________
    SN0003     |      Beckham
    SN0005     |      Henry
    SN0012     |      Rooney
    SN0119     |      Ji Sung
    SN0200     |      Gerrard

在我的报告中,我需要拆分两个Tablix 它将显示如下......

(在“Up to Buttom”之前是“从左到右”)

   Serial No.  |      Name        ||    Serial No.  |    Name
 ______________|________________  || _______________|______________
    SN0003     |      Beckham     ||     SN0005     |    Henry        
    SN0012     |      Rooney      ||     SN0119     |    Ji Sung
    SN0200     |      Gerrard     ||                |

左表是Tablix1和 右表是Tablix2

我认为对每个Tablix使用此FilterExpression。

      = RowNumber(Nothing) mod 2 = 0 
Tablix1的

(左表)

      = RowNumber(Nothing) mod 2 = 1

for Tablix2(右表)

但是这条消息错误......

     "A FilterExpression for tablix ‘Tablix1’ uses the RowNumber function.
      RowNumber cannot be used in filters."

它不能在Filter中使用Rownumber。 我该怎么办?如果我不编辑数据集,是否可能。

2 个答案:

答案 0 :(得分:6)

您是否可以首先编辑您正在恢复的数据集?您可以使用

为此添加ROW_NUMBER字段
SELECT
  ...,
  ROW_NUMBER() OVER(ORDER BY SerialNo ASC) AS RowNum,
  ...

然后您返回的数据集看起来像

   Serial No.  |      Name      |  RowNum
 ______________|________________|__________
    SN0003     |      Beckham   |   1
    SN0005     |      Henry     |   2
    SN0012     |      Rooney    |   3
    SN0119     |      Ji Sung   |   4
    SN0200     |      Gerrard   |   5

然后您可以在RowNum mod 2 = 0

上进行过滤

修改

或者,如果您无法更改基础数据集,则可以使用RunningValue和CountDistinct来聪明。

CountDistinct将为每行提供数据集中匹配的行数(因此,假设序列号是唯一的,通常为1)

RunningValue会在表格中的每一行中为您提供越来越多的值...并且可以将所有这些值相加,即`CountDistincts'。

将表的行可见性设置为

对于Tablix1

=(RunningValue(CountDistinct(Fields!SerialNo.Value), Sum, "DataSetName") mod 2) = 0

对于Tablix2

=(RunningValue(CountDistinct(Fields!SerialNo.Value), Sum, "DataSetName") mod 2) = 1

答案 1 :(得分:0)

[解决]谢谢,Jonas

这是我的数据表。我为store seq_no创建了新列。 通过右键单击>添加列并更改名称“SEQ_NO” enter image description here

下一步,我通过使用vb

编码将值设置为SEQ_NO列
                Dim dt As dsProductionControl.TL_PRODUCTION_SCHEDULE_DETAILSDataTable = DsProductionControl.TL_PRODUCTION_SCHEDULE_DETAILS

                For i As Integer = 1 To dt.Rows.Count
                    dt.Rows(i).Item("SEQ_NO") = i
                Next i

并在SEQ_NO

的报告的Tablix中设置过滤器
        =Fields!SEQ_NO.Value Mod 2 = 0

再次感谢Jonas。