2

我试图将一些我在报告中经常需要的表达式封装到报告函数中,这样我就可以编写一次代码并在报告中的任何地方使用它。但我真的是一个 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.

智能感知启动,但我的功能未显示在该列表中......嗯......我错过了什么?

更新:我注意到虽然智能感知不起作用,但我仍然可以将表达式=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)

现在那部分有效

4

2 回答 2

2

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

这可能也是函数没有出现在智能感知列表中的原因。

尝试像这样定义函数:

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 来测试此代码,所以如果出现问题,请告诉我。

于 2013-02-01T08:22:37.330 回答
1

IsNothing vbscript表达式在自定义VB代码中似乎不能很好地工作。如果您将自定义代码更改为此它可能会起作用:

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

从这个相关问题中提取的解决方案。

于 2013-02-01T10:44:36.333 回答