试图让Reporting Services了解我的代码

时间:2013-02-01 08:11:59

标签: sql-server-2005 reporting-services

我正在尝试将我在报告中经常需要的一些表达式封装到报告函数中,这样我就可以编写一次代码并在报告中的任何地方使用它。 但我真的是一名Pascal / C#程序员并且在使用VB(A)语法时很费劲......

但即便是这个微小的日期格式化功能也不起作用......

Public Function DateFmt (ByVal dt As DateTime) As String
    Return IIF(IsNothing(dt), "", FormatDateTime(dt, 2))
End Function

基本上,如果数据库中DateTime字段为NULL,我想显示一个空字符串(空单元格),否则使用“短日期”格式化选项。

在一个单元格上,我试图将其添加为单元格表达式,但是当我开始输入这样的表达式时:

=Code.
intellisense开始了,但是我的功能没有显示在那个列表中.....嗯....我错过了什么?

  

更新:我注意到虽然intellisense不起作用,我仍然可以将表达式=Code.DateFmt(.....)放入单元格中 - 但是唉,它不起作用。

     

虽然直接添加表达式可以很好地抑制显示中的NULL个日期,但使用此共享函数会导致NULL个日期在我的报告中再次显示为01.01.0001。的 为什么?

另外:我需要有一个函数,它根据选择列表返回一个值 - 基本上是一个SWITCH语句。这段代码在这里是否正确?

Public Function GetGrp(ByVal grp As String)
    Select Case grp
      Case "Region"
          Return fields!RegionId.Value
      Case "Somedate"
          Return YEAR(Fields!Somedate.Value)
    End Select
End Function

此函数实际上导致编译失败,并显示以下错误消息:

  

用户定义代码的第7行出错:[BC30469]对非公共成员的引用需要对象实例

<击>?!?!?!?!? SSRS究竟试图告诉我什么?

更新#2:
好了,想出了这个 - Fields集合在自定义代码中不可用(不清楚为什么不 - 无论如何......)。

所以我需要将此功能更改为:

Public Function GetGrp(ByVal grp As String, ByVal fields As Fields)

现在该部分正常工作

2 个答案:

答案 0 :(得分:2)

从函数返回值的VBA方法是将值赋给该函数名;我认为没有return关键字。

这也可能是这些功能不会出现在intellisense列表中的原因。

尝试定义这样的函数:

Public Function DateFmt (ByVal dt As DateTime) As String
    DateFmt = IIF(IsNothing(dt), "", FormatDateTime(dt, 2))
End Function

Public Function GetGrp(ByVal grp As String)
    Select Case grp
      Case "Region"
          GetGrp = fields!RegionId.Value
      Case "Somedate"
          GetGrp = YEAR(Fields!Somedate.Value)
    End Select
End Function

更新

此外,SSRS中的VBA代码更像是静态函数的集合,这意味着它们无法访问报表状态(例如参数/字段)。

我会尝试将两个fields!*值作为byval参数传递给GetGrp函数。


注意:我没有SSRS或Office来测试此代码,所以如果出现问题,请告诉我。

答案 1 :(得分:1)

IsNothing vbscript 表达式似乎在自定义 VB 代码中效果不佳。如果您将自定义代码更改为此可能有效:

Public Function DateFmt (ByVal dt As DateTime) As String
    Return IIF(dt = Nothing, "", FormatDateTime(dt, 2))
End Function

this related question中提取的解决方案。

相关问题