1

我有一个SSRS报告,其中包含有关我公司发布的发票的信息,例如金额,日期,付款金额等。我在SSRS 2008(不是R2)中使用Visual Studio 2008环境。我的问题与使用表达式编辑器格式化报告有关。目前,如果发票的金额到期(列)超过0.01(未清发票),则发票将被格式化为银质。我们还会发放贷项(负数),这些数额几乎总是以前发票的负数。SSRS表达式编辑器无法识别嵌入代码功能

因此,具有发放信用的发票仍然会显示为白银,因为它的金额应该> 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

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

+0

我有与SSRS 2012相同的问题,我也找不到修复程序。但是,正如保罗所说,即使自定义代码工作正常,它仍然在表达式编辑器中标记为红色。 – Alicia 2017-09-22 08:44:12

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页的信息,把它们放在一起,并希望他们工作......大约一个星期后他们做了......我想这都是关于持久性。如果您需要任何进一步的帮助,请让我知道。