一般我们可以使用公式来实现一些特殊的功能,但是对于一些需要重复处理的情况
可以使用自定义函数来实现
进入公式编辑界面 ,可以看到在左上角有两个项目:
报表自定义函数和储备库自定义函数
报表自定义函数只存在于单一报表模板内,不同模板间不可以共用。
储备库自定义函数对于单独的水晶报表和.Net自带的版本是不可用的,这是水晶报表服务器版本或BOE的一个功能
将函数转换为储备库自定义函数后,该函数将存储到系统数据库,从而不同报表可以进行函数共用。
不过对于单一函数功能来说并没有什么影响。
现在我结合一个实例,说一下自定义函数的使用。
有一个命题是这样的,将一个日期型的字段【2008-10-28】,显示为【二零零八年十月二十八日】
使用自定义日期格式是达不到这种效果的,虽然我们可以通过公式来实现,但是对于多个这种的字段,每次都写公式还是很麻烦的。
所以这里选择用自定义函数实现。
切换到公式编辑器界面,在【报表自定义函数】上点右键,新建一个函数,名称为mydate。
将语法切换为Basic(当然你也可以用Crystal语法),然后编写函数体
具体的函数内容我就不做说明了,这里我用了两个函数来是实现此功能。
另一个函数是ChNumber,用来处理mydate中的复用。
函数体如下
'
进行日期转换
Function myDate (date1 as date )
Dim sY as string
dim sM as string
Dim sD as string
' 分别取出年月日
sY = totext( year (date1), 0 )
sM = totext( month (date1), 0 )
sD = totext( day (date1), 0 )
myDate = chNumber(sY, " 0 " ) & " 年 " & chNumber(sM, " 1 " ) & " 月 " & chNumber(sD, " 1 " ) & " 日 "
End Function
Function myDate (date1 as date )
Dim sY as string
dim sM as string
Dim sD as string
' 分别取出年月日
sY = totext( year (date1), 0 )
sM = totext( month (date1), 0 )
sD = totext( day (date1), 0 )
myDate = chNumber(sY, " 0 " ) & " 年 " & chNumber(sM, " 1 " ) & " 月 " & chNumber(sD, " 1 " ) & " 日 "
End Function
'
s待处理的参数,t参数类型。0为年份,逐个字符替换,1为月份和日期,10进位
Function ChNumber ( s as string , t as string )
Dim s0 as string
' 先全部替换
s0 = Replace (s, " , " , "" )
s0 = Replace (s0, " 0 " , " 零 " )
s0 = Replace (s0, " 1 " , " 一 " )
s0 = Replace (s0, " 2 " , " 二 " )
s0 = Replace (s0, " 3 " , " 三 " )
s0 = Replace (s0, " 4 " , " 四 " )
s0 = Replace (s0, " 5 " , " 五 " )
s0 = Replace (s0, " 6 " , " 六 " )
s0 = Replace (s0, " 7 " , " 七 " )
s0 = Replace (s0, " 8 " , " 八 " )
s0 = Replace (s0, " 9 " , " 九 " )
' 进行月日的十进位处理
If t = " 1 " then
' 十进位处理,在两个数字中间加入一个“十”字
If Len (s0) = 2 Then
s0 = left (s0, 1 ) & " 十 " & right (s0, 1 )
' 处理刚好为10、20、30的情况
if left (s0, 1 ) = " 一 " then s0 = replace (s0, " 一十 " , " 十 " )
if right (s0, 1 ) = " 零 " then s0 = replace (s0, " 零 " , "" )
end if
end if
ChNumber = s0
End Function
Function ChNumber ( s as string , t as string )
Dim s0 as string
' 先全部替换
s0 = Replace (s, " , " , "" )
s0 = Replace (s0, " 0 " , " 零 " )
s0 = Replace (s0, " 1 " , " 一 " )
s0 = Replace (s0, " 2 " , " 二 " )
s0 = Replace (s0, " 3 " , " 三 " )
s0 = Replace (s0, " 4 " , " 四 " )
s0 = Replace (s0, " 5 " , " 五 " )
s0 = Replace (s0, " 6 " , " 六 " )
s0 = Replace (s0, " 7 " , " 七 " )
s0 = Replace (s0, " 8 " , " 八 " )
s0 = Replace (s0, " 9 " , " 九 " )
' 进行月日的十进位处理
If t = " 1 " then
' 十进位处理,在两个数字中间加入一个“十”字
If Len (s0) = 2 Then
s0 = left (s0, 1 ) & " 十 " & right (s0, 1 )
' 处理刚好为10、20、30的情况
if left (s0, 1 ) = " 一 " then s0 = replace (s0, " 一十 " , " 十 " )
if right (s0, 1 ) = " 零 " then s0 = replace (s0, " 零 " , "" )
end if
end if
ChNumber = s0
End Function
然后我们来做个简单的测试:
新建立一个日期型的参数xx,
然后做一个公式yy,公式内容为:mydate({?xx})
显示为:二零零八年十月二十八日