将每个组的第一个元素与RunningValue

时间:2015-10-14 19:27:33

标签: vba reporting-services ssrs-2008

我有一份关于SSRS的报告,其数据集包含以下3个字段:

Fields!MyFirstField.Value
Fields!MySecondField.Value
Fields!MyThirdField.Value

该报告分为一组: 在我的Row文件中我有

MyPrimaryGroup
  MySeconday Group

我拥有制作每个小组的Field:

Fields!Group.Value

这个想法是积累每个领域的每个组的第一个元素。

我做的是以下内容:

Dim Acum as Double
Dim ActualGroup = ""
Function Accumulator(ByVal MyGroup as String, ByVal value as Double) As Double


If ActualGroup <> MyGroup
    Acum= Acum + value
    ActualGroup = MyGroup 
    Return Acum
    value=0
End If


End Function

在此之后我做了一个像这样的计算字段:

=Code.Accumulator(Fields!Group.Value,Fields!MyFirstField.Value)

并将它放在我的主要组中的一排,事实是,它只是累积前两个,例如:

在此图中我们有一个图形示例,代码正在执行的是保存每个组的第一个元素,因此在这种情况下,累计值应为10+11+12=33,但代码正在给我21 ,不保存第三个值]

enter image description here

这是问题的一部分,另一个问题是我不能使这个累加器使用具有运行值表达式的字段,例如:

FormatNumber(RunningValue(Fields!MySecondField.Value, Sum,"MyDataset"), 2)

有没有办法对每个组的第一个元素求和并积累其值,与实际上是一个运行值的字段相同?

为了向您提供有关我要实现的目标的更多信息,我将表格截屏: enter image description here

在你看到蓝色圆圈的地方,在我想要放置代码的组中的那些字段中,MyField3是运行值,这些是组: enter image description here

这或多或少是我对组中前两个元素的信息: enter image description here

所以代码应该:

If MERCH308 <> "" then
0 = 0 + 6,80
"" = MERCH308
End If

在下一组中应该这样做:

If MERCH314 <> MERCH308
6,80 = 6,80 + 22,28
MERCH308 = MERCH314
End If

到下一个:

If MERCH314 <> MERCH314
//It does not enter the if

直到它看到一个与MERCH314不同的新组,问题是,代码正常运行的唯一方法(我进一步调查)是在tablix中取消标记分页并标记&#34;维护如果可能的话,在一页中的所有内容&#34;。

我试图用runningvalue问题说的是:

MyFields3是一个运行值:

=FormatNumber(RunningValue(Fields!MyFields3.Value, Sum,"MyDataset",2)

但我无法申请:

Code.Accumulator(Fields!MyGroup.Value,RunningValue(Fields!MyFields3.Value,Sum,"Mydataset")

正如它所说&#34;有一个错误的数字作为函数RunningValue的参数&#34;

因此,我们的想法是将每个累加器组的第一个元素累积为&#34; RunningValue&#34;事实上,这是一个累加器,所以我的想法是总结(对于我的第三列)6,80 + 29,08。但请记住,29,08是运行值的结果。

1 个答案:

答案 0 :(得分:0)

我可以帮助您解决问题的第一部分,所以我的回答是部分原因我不会因为运行价值字段而遇到问题,所以我想猜测你需要什么。

您必须转到report / report properties / code标签并添加以下代码:

Dim public total as Integer 
Dim public prevgroup as String = ""

Public Function AddTotal(ByVal group as String,ByVal value AS Integer ) AS Integer 
    If (group <> prevgroup) Then
        total = total + value
        prevgroup = group
        return total
    End If
    return 0                
End Function 

Public Function GetTotal() 
    return total
End Function 

这是对您的数据安排的猜测。

enter image description here

使用此表达式获取每个不同组的第一个值的总和:

=Code.GetTotal()

使用此项获取运行值:

=Code.AddTotal(Fields!Group.Value,Fields!Value.Value)

它将预览:

enter image description here

红色矩形表示我的数据集,其他数据由表达式添加。

更新:根据用户规范运行第一个值。

如果这有用,请告诉我。

您可以通过向数据集查询添加行号来实现此目的。

select
    ROW_NUMBER() OVER (Order by (select 1)) as row_num,
    *
from CTE

注意我只是添加行号并从CTE中选择所有字段。 这是我的数据集:

enter image description here

修改AddTotal功能,如下所示

Dim public total as Integer 
Dim public prevgroup as String = ""

Public Function AddTotal(ByVal group as String,ByVal value AS Integer, ByVal nextGroup As String ) AS Integer 
    If (group <> prevgroup) Then
        total = total + value
        prevgroup = group
    End If

    If (group <> nextGroup) Then
        return total
    End If
    return 0         
End Function 

配置您的Tablix如下:

enter image description here

在表达式中设置以下代码:

=Code.AddTotal(Fields!Group.Value,Fields!Value.Value,
lookup(Fields!row_num.Value + 1,Fields!row_num.Value,Fields!Group.Value,"DataSet5")
)

选择表达式行并使用以下代码设置Row visibility设置:

=Iif(Code.AddTotal(Fields!Group.Value,Fields!Value.Value,
lookup(Fields!row_num.Value + 1,Fields!row_num.Value,Fields!Group.Value,"DataSet5")
)=0,True,False)

这将预览以下Tablix:

enter image description here