一般我们可以使用公式来实现一些特殊的功能,但是对于一些需要重复处理的情况
可以使用自定义函数来实现
进入公式编辑界面 ,可以看到在左上角有两个项目:
报表自定义函数和储备库自定义函数
报表自定义函数只存在于单一报表模板内,不同模板间不可以共用。
储备库自定义函数对于单独的水晶报表和.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
'
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
然后我们来做个简单的测试:
新建立一个日期型的参数xx,
然后做一个公式yy,公式内容为:mydate({?xx})
显示为:二零零八年十月二十八日