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

RDLC Report- Error Rownumber() can't be used in filter

我有两个 Tablix(tables) 和一个数据集。 他们正在与此数据集绑定

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

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

(在"Up to Buttom"之前是"Left to Right")

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

左侧 table 是 Tablix1 和 右 table 是 Tablix2

我想为每个 tablix 使用这个 FilterExpression。

      = RowNumber(Nothing) mod 2 = 0 

对于 Tablix1(左 table)

      = RowNumber(Nothing) mod 2 = 1

对于 Tablix2(右 table)

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

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

不能在Filter中使用Rownumber。 我应该怎么办?不编辑数据集可以吗

您是否可以编辑您首先收到的数据集?您可以使用

添加一个 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 会在 table...

将 table 的行可见性设置为类似于

对于 Tablix1

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

对于 Tablix2

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

[已解决]谢谢,乔纳斯

这是我的数据表。我为商店 seq_no 创建了新列。 通过右键单击>添加列并更改名称"SEQ_NO"

下一步,我通过使用 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

再次感谢乔纳斯。