我有一个 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
当这两部分运行时,我得到此列所有单元格的白色背景。我在网上读到一些东西,说只有共享函数才能工作,但我发现了多个其他示例,显示了未共享的功能。当我共享它时,它给了我: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.
由于报告参数!Test.Count() 行。我从 http://social.msdn.microsoft.com/Forums/en-US/sqlreportingservices/thread/a7d59224-0ee5-491e-883b-2e5fcb3edeab 那里得到了使用Report.Parameters的想法。
因此,重申一下,我基本上要做的是将本列中每个单元格的值放入集合中,并且对于一个金额具有负等价物的任何两个金额,请为其提供白色背景而不是银色。
在 SSRS 2008 R2 中,即使引用有效的自定义代码方法,表达式编辑器仍可能警告标识符无效。这并不总是意味着它是无效的。即使抛出该警告,我的函数也能正常工作。
经过更多的研究,我想出了解决这个问题的方法。我基本上必须添加一个带有 =Join() 函数的文本框,以便将列中的所有值都放入此文本框中;然后在自定义代码中引用文本框,并在表达式编辑器中使用布尔值。详细说明如下。
1)向报表添加多值参数(右键单击参数,添加参数)。为其命名,选择"允许多个值",选择"隐藏"以获得参数可见性。对于"可用值"选项卡,选择"从查询中获取值"。指向数据集,然后将值字段设置为希望参数检查的列。对我来说,这是我的应付金额列。标签字段不相关,可以留空。在"默认值"选项卡中,执行相同的操作,确保值字段设置为与之前相同的列。在"高级"下,选择"从不刷新"。
2) 在报表上创建一个新文本框。可能想要命名它,例如 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 页中取出单独的信息,将它们放在一起,并希望它们有效......大约一周后,他们做到了...我想这都是关于坚持的。如果您需要任何进一步的帮助,请告诉我。