1

我有一份 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.由于 Report.Parameters!Test.Count() 行。我从http://social.msdn.microsoft.com/Forums/en-US/sqlreportingservices/thread/a7d59224-0ee5-491e-883b-2e5fcb3edeab得到了使用 Report.Parameters 的想法。

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

4

2 回答 2

3

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

于 2014-07-29T18:52:25.713 回答
0

经过一番研究,我想出了如何解决这个问题。我基本上必须使用 =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 页中提取单独的信息,将它们放在一起,并希望它们能起作用……大约一周后,它们起作用了……我想这都是关于坚持的。如果您需要任何进一步的帮助,请告诉我。

于 2012-08-10T20:15:51.283 回答