我正在尝试将我在报告中经常需要的一些表达式封装到报告函数中,这样我就可以编写一次代码并在报告中的任何地方使用它。 但我真的是一名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)
现在该部分正常工作
答案 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中提取的解决方案。