|
如何自定义函数及引用自定义函数?
这在ADP中属于比较难的问题了,很多朋友无从下手,我们通过一个实例来简单说明。
1、假设在一个销售系统中,我们希望产生一个报表来查阅公司业务员某个月的销售任务完成情况
2、实现这个功能理论上很简单,需要两个数据:(1)业务员某个月的销售业绩(2)业务员某个月的任务,这两个数据对比就得出了完成率。
3、所以我们要写两个函数
1)求业务员某个月销售业绩的函数
2)求业务员某个月任务的函数
4、业务员的销售业绩和4个表有关系:订单,订单明细,客户,员工表(订单中有“客户”字段与客户表关联,客户表中有“负责业务”字段与员工表关联)
5、业务员的任务与3个表有关系:业务员销售计划,业务员销售计划明细,员工表(业务员销售计划表中有“业务员”字段与员工表关联)
6、在“查询”中新建一个求业务员某个月销售业绩的函数,语句如下:
===================================================================================
ALTER function dbo.fun业务销售
(@开始日期 as datetime,@结束日期 as datetime,@员工编号 as int)returns float
begin
declare @Total float
SELECT @Total=isnull(SUM((dbo.订单明细.数量 * dbo.订单明细.单价),0)
FROM dbo.订单 INNER JOIN dbo.订单明细 ON dbo.订单.订单ID = dbo.订单明细.订单ID INNER JOIN
dbo.客户 ON dbo.订单.客户名称 = dbo.客户.客户编号 INNER JOIN
dbo.员工表 ON dbo.客户.负责业务 = dbo.员工表.员工编号
WHERE (dbo.订单.订购日期 > @开始日期 AND dbo.订单.订购日期 < @结束日期) and (dbo.客户.负责业务 =@员工编号)
return @Total
End
=====================================================================
7、在“查询”中新建一个求业务员某个月任务的函数,语句如下:
=====================================================================
ALTER function dbo.fun业务员计划汇总
(@开始日期 as datetime,@结束日期 as datetime,@员工编号 as int)returns float
begin
declare @Total float
SELECT @Total=isnull(SUM(dbo.业务员销售计划明细.销售计划金额) ,0)
FROM dbo.业务员销售计划 INNER JOIN dbo.业务员销售计划明细 ON dbo.业务员销售计划.业务员计划编号 = dbo.业务员销售计划明细.计划编号
WHERE (dbo.业务员销售计划.计划月份 > @开始日期 AND dbo.业务员销售计划.计划月份 < @结束日期) AND (dbo.业务员销售计划.业务员 = @员工编号)
return @Total
End
=========================================================================
8、在“查询”中新建一个嵌入函数“完成率”以引用我们在6,7步骤中创建的自定义函数,格式如下:
===========================================================================
列 别名 表
员工编号 员工表
姓名 员工表
dbo.fun业务销售(@开始日期, @结束日期, 员工编号) 业务销售
dbo.fun业务员计划汇总(@开始日期, @结束日期, 员工编号) 业务计划
=============================================================================
9、新建一个报表,将数据源设为“完成率”,引用嵌入函数中的字段,再新建一个字段“完成比例”,数据=业务销售/业务计划就可以了
当然,如果业务计划为零的话,就会出现除零错误,所以你还要另外处理一下,这个就简单了,我说了,ADP在报表中也是可以用IIF的。 |
|