Function SSRS表达式编辑器无法识别嵌入的代码函数

Function SSRS表达式编辑器无法识别嵌入的代码函数,function,reporting-services,ssrs-2008,ssrs-expression,custom-code,Function,Reporting Services,Ssrs 2008,Ssrs Expression,Custom Code,我有一份SSRS报告,其中包含有关公司开具的发票的信息,包括金额、日期、付款、到期金额等。我正在Visual Studio 2008环境中使用SSRS 2008(而不是R2)。我的问题与使用表达式编辑器格式化报表有关。当前,如果发票的到期金额(a列)超过0.01(未付发票),则发票将被格式化为银色。我们还发行信用证(负数),这些信用证几乎总是以前发票的负数 因此,具有信用证的发票仍将显示为银,因为其到期金额>0.01。但是如果这张发票上有信用证,它实际上不是未付的,应该是白色的。例如,如果发票为

我有一份SSRS报告,其中包含有关公司开具的发票的信息,包括金额、日期、付款、到期金额等。我正在Visual Studio 2008环境中使用SSRS 2008(而不是R2)。我的问题与使用表达式编辑器格式化报表有关。当前,如果发票的到期金额(a列)超过0.01(未付发票),则发票将被格式化为银色。我们还发行信用证(负数),这些信用证几乎总是以前发票的负数

因此,具有信用证的发票仍将显示为银,因为其到期金额>0.01。但是如果这张发票上有信用证,它实际上不是未付的,应该是白色的。例如,如果发票为$100.00,并且在$100.00之后有一个贷项,则原始发票的背景色应切换为白色

这里是代码解释的用武之地。我认为在报告中使用自定义VB代码可以实现这一点,但SSRS中的表达式编辑器似乎无法识别我的函数,因为它显示“无法识别的标识符”。我在谷歌上搜索了一下,我遇到的大多数话题都说它会显示这一点,但实际上无论如何都是有效的。好吧,我很确定它根本不起作用,因为我把它作为我的表达式,得到了某一列的所有白细胞:

=IIF(字段!到期金额值>0.01,
IIF(代码HasCredit(字段!到期金额)=真,“蓝色”、“银色”、“红色”)

HasCredit函数如下所示

函数HasCredit(ByVal currentmat为Double)为布尔值
作为整数的Dim i
双倍存款
Dim amts as System.Collections.ArrayList=新建System.Collections.ArrayList()
暗负片为双色
将值设置为Boolean=“False”
i=0
对于i=1,报告。参数!Test.Count()
amt=报告参数!测试值(一)
增加金额(amt)
下一个
负EAMT=当前金额*-1
如果amts.包含(negativeAmt),则
retValue=“True”
如果结束
返回值
端函数
当运行这两个部分时,我会得到该列所有单元格的白色背景。我在网上读到一些东西,说只有共享的函数才能工作,但我发现其他多个例子显示了没有共享的函数可以工作。当我将其共享时,它会告诉我:
BC30369不能从共享方法或共享成员初始值设定项中引用类的实例成员,如果没有该类的显式实例。
,这是由于Report.Parameters!Test.Count()行。我从中得到了使用Report.Parameters的想法


所以重申一下,我基本上想做的是将这列中每个单元格的值放入一个集合中,对于任何两个量,其中一个量为负当量,给它一个白色背景,而不是银。

经过进一步研究,我找到了解决方法。基本上,我必须添加一个带有=Join()函数的文本框,以便将列中的所有值都放在这个文本框中;然后在自定义代码中引用文本框,并在表达式编辑器中使用布尔值。详细说明如下

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

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(字段!Balance.Value>0.01
和Code.HasCredit(Fields!Balance.Value,ReportItems)=False,“Silver”,“White”)


我不得不从3到4页中分别提取信息,把它们放在一起,希望它们能起作用。。。大约一周后,他们做到了。。。我想这都是关于坚持。如果您需要进一步的帮助,请告诉我。

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

我在SSRS 2012中也遇到了同样的问题,我也找不到解决方案。但正如Paul所说,即使自定义代码工作正常,它仍然在表达式编辑器中标记为红色。