SSRS表达式编辑器无法识别嵌入式代码功能

时间:2012-08-07 14:17:34

标签: function reporting-services ssrs-2008 ssrs-expression custom-code

我有一份SSRS报告,其中包含我公司发出的有关金额,日期,付款,到期金额等发票的信息。我在Visual Studio 2008环境中使用SSRS 2008(而不是R2)。我的问题与使用表达式编辑器格式化报表有关。目前,如果发票的金额超过0.01(未付发票),发票将被格式化为白银。我们还发放信用(负数),这几乎总是先前发票的负数。

因此,发给它的信用证的发票仍会显示为白银,因为它的到期金额> 0.01。但是,如果此发票上有信用证,那么它实际上并不突出,应该是白色的。例如,如果发票为100.00美元,并且在($ 100.00)之后有信用证,则原始发票的背景颜色应切换为白色。

以下是代码说明的来源。我认为报告中的自定义VB代码可以实现这一点,但似乎SSRS中的表达式编辑器无法识别我的功能,因为它显示“无法识别的标识符”。我用谷歌搜索了一下,我遇到的大多数话题都表明它会表明但实际上还是有效的。嗯,我很确定它根本不起作用,因为我把它放在我的表达中并获得某个列的所有白色单元格:

=IIF(Fields!Amount_Due.Value > 0.01, IIF(Code.HasCredit(Fields!Amount_Due.Value) = True, "Blue", "Silver"), "Red")

HasCredit功能如下。

Function HasCredit(ByVal currentAmt as Double) As Boolean

Dim i as Integer
Dim amt as Double
Dim amts as System.Collections.ArrayList = New System.Collections.ArrayList()
Dim negativeAmt as Double
Dim retValue as Boolean = "False"

i = 0

For i = 1 to Report.Parameters!Test.Count()
    amt = Report.Parameters!Test.Value(i)
    amts.Add(amt)
Next

negativeAmt = currentAmt * -1

If amts.Contains(negativeAmt) Then
    retValue = "True"
End If

Return retValue
End Function

当这两个部分运行时,我获得该列所有单元格的白色背景。我在网上看到一些东西说只有共享功能可以工作,但我发现其他多个例子显示了没有共享的功能。当我分享它时,由于Report.Parameters!Test.Count()行,它给了我BC30369 Cannot refer to an instance member of a class from within a shared method or shared member initializer without an explicit instance of the class.。我想到了使用来自http://social.msdn.microsoft.com/Forums/en-US/sqlreportingservices/thread/a7d59224-0ee5-491e-883b-2e5fcb3edeab的Report.Parameters。

重申一下,我基本上要做的是将此列中每个单元格的值放入一个集合中,对于任意两个量,其中一个量具有负等效值,给它一个白色背景而不是银色

2 个答案:

答案 0 :(得分:3)

在SSRS 2008 R2中,即使您引用了有效的自定义代码方法,表达式编辑器仍可能会警告标识符无效。这并不总是意味着它无效。即使发出警告,我的功能仍然有效。

答案 1 :(得分:0)

经过一番研究后,我想出了如何解决这个问题。我基本上不得不添加一个带有= Join()函数的文本框,以便列中的所有值都放在这个文本框中;然后在自定义代码中引用文本框,并在表达式编辑器中使用布尔值。详细说明如下。

1)在报告中添加多值参数(右键单击参数,添加参数)。将其命名为,选择允许多个值,选择隐藏参数可见性。对于“可用值”选项卡,选择“从查询中获取值”。指向数据集,并将“值”字段设置为要参数检查的列。对我而言,这是我的Amount Due专栏。标签字段无关紧要,可以留空。在“默认值”选项卡中,执行相同操作,确保将值字段设置为与以前相同的列。在“高级”下,选择“从不刷新”。

2)在报告上创建新文本框。可能想要命名,ex txtColumnValues。编辑表达式并将其放入:=Join(Parameters!YourParameter.Value, ",")这将获取您在参数中指定的列中的所有字段值,每个值都用逗号分隔。

3)编辑报告的自定义代码并制作VB函数(如布尔值)以检查文本框。例如,这是我的代码。

Public Function HasCredit(Amt as Double, ri as ReportItems) as Boolean

Dim retValue as Boolean = False

If Amt > 0.00 AndAlso ri!txtAmounts.Value.Contains(Amt*-1) Then
   retValue = True
End If

Return retValue
End Function

4)最后转到表达式编辑器,查找要更改的字段。在我的例子中,我想改变背景颜色,如果当前字段在其他字段(我的文本框)中具有负等效,那么我的代码看起来像这样:

=IIF(Fields!Balance.Value > 0.01 AND Code.HasCredit(Fields!Balance.Value, ReportItems) = False, "Silver", "White")

我不得不从3页或4页中分别收集信息,将它们组合在一起,并希望它们有效...大约一周之后它们就完成了......我想这就是持久性。如果您需要任何进一步的帮助,请告诉我。