创建人:用友软件股份有限公司江苏区GBU业务部 谷雨 njgy@ufida.com.cn
修改人:用友软件股份有限公司北京分公司 建筑行业业务部 朱佞 zhuning@ufida.com.cn
◆需求背景
打印模板中可以附加审批流信息,但是审批流的打印内容、格式均不可调整,打出来比较丑陋。客户要求只需要把审批流中涉及到的审批人姓名打印在单据上即可,其余信息不需要打印。
◆解决思路
审批流的信息记录在pub_workflownote表中,可以根据单据的PK找出对应的审批信息。通常一张单据的审批流会有多行记录,如果在打印模板中用getColValue函数只能取到一条记录,不符合要求,所以需要有个方法可以把多行中的人名都显示出来。
因此,通过建立一个视图,把所需的信息放入到这个视图中,再通过视图来取出对应的信息。
视图如下:(以下内容为谷雨所写,可能有问题)
DROP VIEW NCV502.ZT_VIEWS_CW_SPR;
/* Formatted on 2010/05/31 17:21 (Formatter Plus v4.8.8) */
CREATE OR REPLACE FORCE VIEW ncv502.zt_views_cw_spr (billid, billno, cw_spr)
AS
SELECT a.billid, a.billno,
cw_merge
(CAST
(MULTISET (SELECT sm_user.user_name
FROM pub_workflownote, sm_user
WHERE pub_workflownote.billid = a.billid
AND pub_workflownote.ischeck <> 'X'
AND sm_user.cuserid =
pub_workflownote.senderman
ORDER BY pub_workflownote.ts
) AS strmarge_tbl
)
) AS cw_spr
FROM (SELECT DISTINCT billid, billno
FROM pub_workflownote
WHERE pub_workflownote.approveresult <> 'null'
AND pub_workflownote.dr = 0) a;
上述视图中涉及到一个自定义的函数cw_merge,函数定义如下:
CREATE OR REPLACE function NCV502.cw_merge(str in strmarge_tbl) return varchar2 is
rlt varchar2(4000);
begin
for i in 1 .. str.count loop
if i != str.count then
rlt := rlt || str(i)||' , ';
else
rlt := rlt || str(i);
end if;
end loop;
return rlt;
end;
/
(以下为经验证无误版本)
(
CREATE TYPE strmarge_tbl AS TABLE OF varchar2(50)—-创建类型
CREATE OR REPLACE function cmec【请替换为所使用oracle用户名,下同】.cw_merge(str in strmarge_tbl) –-创建视图所用函数函数作用下有描述
return varchar2 is rlt varchar2(4000);
begin
for i in 1 .. str.count loop
if i != str.count then
rlt := rlt||str(i)||' , ';
else
rlt := rlt || str(i);
end if;
end loop;
return rlt;
end;
CREATE OR REPLACE FORCE VIEW cmec【替换成所使用oracle用户名】.zt_views_cw_spr (billid, billno, cw_spr)—-创建所需视图
AS
SELECT a.billid, a.billno,
cw_merge
(CAST
(MULTISET (SELECT sm_user.user_name
FROM pub_workflownote, sm_user
WHERE pub_workflownote.billid = a.billid
AND pub_workflownote.ischeck <> 'N'
AND sm_user.cuserid =
pub_workflownote.senderman
ORDER BY pub_workflownote.ts
) AS strmarge_tbl
)
) AS cw_spr
FROM (SELECT DISTINCT billid, billno
FROM pub_workflownote
WHERE pub_workflownote.approveresult <> 'null'
AND pub_workflownote.dr = 0) a;
)
此函数的作用是把多行记录中的某列值取出后用“,”连接在一起。
审批流中如果有流程驳回制单人重新审批的,视图会自动过滤出最终的审批通过流程,并且人名的排列顺序按审批流的先后处理顺序显示。
视图的最终效果如下:
有了此视图后,在打印模板中可以定义自定义变量。
getColValue(zt_views_cw_spr,cw_spr ,billid , h_pk_payapply),从这个视图中取出审批人姓名。
最终打印的结果如下:
(--实现效果图另一种)
◆引申应用
此方式可以解决由于getColValue函数只能取一行值而无法取多行值的局限性,对于需要取多行值的需求场景,均可以用此思路解决,且不限于打印模板,单据模板、账表模板等均可使用。下载本文