Vba 将每组的第一个元素与RunningValue相加
我有一份关于SSR的报告,其中的数据集包含以下3个字段:Vba 将每组的第一个元素与RunningValue相加,vba,reporting-services,ssrs-2008,Vba,Reporting Services,Ssrs 2008,我有一份关于SSR的报告,其中的数据集包含以下3个字段: Fields!MyFirstField.Value Fields!MySecondField.Value Fields!MyThirdField.Value 报告分为一组: 在我的行文件中,我有 MyPrimaryGroup MySeconday Group 我有一个组成每个小组的领域: Fields!Group.Value 其思想是积累每个字段的每个组的第一个元素 我所做的是: Dim Acum as Double Dim A
Fields!MyFirstField.Value
Fields!MySecondField.Value
Fields!MyThirdField.Value
报告分为一组:
在我的行文件中,我有
MyPrimaryGroup
MySeconday Group
我有一个组成每个小组的领域:
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
把它放在我的主要组中的一行,问题是,它只积累了前两个,例如:
FormatNumber(RunningValue(Fields!MySecondField.Value, Sum,"MyDataset"), 2)
在这幅图中,我们有一个图形示例,代码所做的是保存每组的第一个元素,因此在这种情况下,累积值应该是10+11+12=33
,但代码给我的是21
,而不是继续保存第三个值]
这是问题的一部分,另一个问题是我无法使此累加器与具有运行值表达式的字段一起工作,例如:
FormatNumber(RunningValue(Fields!MySecondField.Value, Sum,"MyDataset"), 2)
是否有任何方法可以对每个组的第一个元素求和并累加其值,与实际上是运行值的字段相同
为了向您提供更多关于我要实现的目标的信息,我截图了表格:
蓝色圆圈出现在我的组中,我想把代码放在这些字段中,MyField3是运行值,这些是组:
这或多或少是我拥有的关于我的团队前两个元素的信息:
因此,守则应:
If MERCH308 <> "" then
0 = 0 + 6,80
"" = MERCH308
End If
但我不能申请:
Code.Accumulator(Fields!MyGroup.Value,RunningValue(Fields!MyFields3.Value,Sum,"Mydataset")
正如上面所说,“函数RunningValue的参数有一个不正确的数字”
我们的想法是将累加器每组的第一个元素累加起来,因为“RunningValue”实际上是累加器,所以我们的想法是将6,80+29,08相加。但是请记住,29,08是运行值的结果。我可以帮助您解决问题的第一部分,因此我的答案是部分原因,因为我不理解您对运行值字段的问题,所以我尝试猜测您需要什么 您必须转到
报告/报告属性/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
=Code.AddTotal(Fields!Group.Value,Fields!Value.Value,
lookup(Fields!row_num.Value + 1,Fields!row_num.Value,Fields!Group.Value,"DataSet5")
)
=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)
使用此选项可获取运行值:
=FormatNumber(RunningValue(Fields!MyFields3.Value, Sum,"MyDataset",2)
=Code.AddTotal(Fields!Group.Value,Fields!Value.Value)
它将预览:
红色矩形代表我的数据集,其他数据由表达式添加
更新:根据用户规范运行第一个值的值 让我知道这是否有用 您可以通过向数据集查询中添加行号来实现这一点
select
ROW_NUMBER() OVER (Order by (select 1)) as row_num,
*
from CTE
注意,我只是添加行号并从CTE中选择所有字段。
这是我的数据集:
修改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
选择表达式行并使用以下代码设置行可见性
设置:
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
=Code.AddTotal(Fields!Group.Value,Fields!Value.Value,
lookup(Fields!row_num.Value + 1,Fields!row_num.Value,Fields!Group.Value,"DataSet5")
)
=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)
这将预览以下表格:
嘿,Alejandro,我用大量的信息更新了我的初始线程。这是一个好主意,有没有办法对RowNumber进行同样的操作而不是更改查询?@Nickso:没有,我的方法是使用
查找
来获取下一行组值Lookup
在数据集中查找一行(RowNumber不能用作Lookup函数的参数或参数表达式),并返回该行中用户指定的其他列值。我认为这是了解数据集未来行的唯一方法。分享您的SQL查询以帮助您添加行号,虽然很简单,但这是一个巨大的查询,因为它是一个动态查询。我解决了分页符的问题。如果有人有同样的问题,您必须将变量声明为Public Shared,因为每个分页符都是一个新实例,如果是Public Shared,您的值将保持不变。现在谈谈runningvalue的问题