前言:
大家好,我是TT-风。
最近在研究java前端的东西,然后呢繁琐的事情太多,咳咳,进度可观的微弱....,最近突发奇想想把手头的一些比较重要的数据更新流程化,且将逻辑写在OA回传上边,因为之前没有做过类似的东西,开始也是一头雾水的那种。然后就各种百度资料,效果寥寥无几。网上的一些资料要么就是不全面。要么就是各种版本不符。因此也激起了我的欲望,迫使我搞定它,干就完了。
经过一个礼拜的奋战,终于是搞定了这个东西,想着目前网络上也没有很明确的资料就自己写一个吧,把自己的经验和汗水留下来。让后续也有同样需求的人少走一点弯路。接下来进入正轨***
#########################我是分隔符############################
一、首先进入例常的建表环节:
tc_xmi_file—这是单头表
/*
================================================================================
檔案代號:tc_xmi_file
檔案名稱:暂估单价更新维护作业单头
檔案目的:暂估单价更新作业单头资料
上游檔案:
下游檔案:
檔案類型:B
多語系檔案:N
============.========================.==========================================
*/
create table tc_xmi_file
(
tc_xmi01 varchar2(20), /*暂估更新单号 */
tc_xmimksg varchar2(1), /*签核否 */
tc_xmi02 date, /*申请日期 */
tc_xmi03 varchar2(10), /*申请人员 */
tc_xmi04 varchar2(10), /*部门编号 */
tc_xmi05 varchar2(1), /*状态码 */
/*0: 开立 */
/*1: 已核准 */
/*9: 作废 */
/*S: 送签中 */
/*R: 送签退回 */
/*W: 抽单 */
tc_xmi06 varchar2(10), /*审核人员 */
tc_xmi07 date, /*审核日期 */
tc_xmi08 varchar2(255), /*备注 */
tc_xmiplant varchar2(10), /*营运中心 */
tc_xmiconf varchar2(1), /*审核否 */
tc_xmiuser varchar2(10), /*资料所有者 */
tc_xmigrup varchar2(10), /*资料所有者部门 */
tc_xmioriu varchar2(10), /*资料建立者 */
tc_xmiorig varchar2(10), /*资料建立者部门 */
tc_xmimodu varchar2(10), /*资料更改者 */
tc_xmidate date /*最近修改日 */
);
alter table tc_xmi_file add constraint tpc_xmi_pk primary key (tc_xmi01) disable novalidate;
grant select on tc_xmi_file to tiptopgp;
grant update on tc_xmi_file to tiptopgp;
grant delete on tc_xmi_file to tiptopgp;
grant insert on tc_xmi_file to tiptopgp;
grant index on tc_xmi_file to public;
grant select on tc_xmi_file to ods;
tc_xmj_file—这是单身表
跟单头表类似的创建方法
(注:各公司情况不一,表格自己创建,就是一般的单头表和单身表。表格字段仅提供参考!!)
运行p_zta程序建立单头单身表,或复制黏贴内容在plsql中建立表格
二、写4gl程序:
核心代码:
_menu()中加:
WHEN "easyflow_approval" #送签流程
IF cl_chk_act_auth() THEN
CALL cpmt500_ef()
END IF
送签函数:
#送签
FUNCTION cpmt500_ef()
DEFINE l_i LIKE type_file.num5
LET g_success = 'Y'
IF s_shut(0) THEN
LET g_success = 'N'
RETURN
END IF
IF g_tc_xmi.tc_xmiconf MATCHES '[Y]' THEN
CALL cl_err('','9023',0)
LET g_success = 'N'
RETURN
END IF
IF g_tc_xmi.tc_xmi05 MATCHES '[1S]' THEN
CALL cl_err('','mfg3557',0)
LET g_success = 'N'
RETURN
END IF
LET g_tc_xmi_t.* = g_tc_xmi.*
CALL aws_condition() #判断送签资料
IF g_success = 'N' THEN
RETURN
END IF
IF aws_efcli2(base.TypeInfo.create(g_tc_xmi),'','','','','')
THEN
LET g_success='Y'
LET g_tc_xmi.tc_xmi05='S'
DISPLAY BY NAME g_tc_xmi.tc_xmi05
ELSE
LET g_success='N'
END IF
END FUNCTION
代码都是固定的写法,参考标准程序即可。我这边只传了单头资料,原因呢后续我会讲到,咱们继续...
三、写组XML的代码:
DATABASE ds
GLOBALS "../4gl/awsef.4gl"
GLOBALS "../../config/top.global"
FUNCTION aws_efcli2_cf()
DEFINE sr RECORD
tc_xmi01 LIKE tc_xmi_file.tc_xmi01,
tc_xmi02 LIKE tc_xmi_file.tc_xmi02,
tc_xmi03 LIKE tc_xmi_file.tc_xmi03,
gen02 LIKE gen_file.gen02,
tc_xmi04 LIKE tc_xmi_file.tc_xmi04,
gem02 LIKE gem_file.gem02,
tc_xmiplant LIKE tc_xmi_file.tc_xmiplant,
tc_xmi08 LIKE tc_xmi_file.tc_xmi08
END RECORD,
l_i LIKE type_file.num5,
l_sql LIKE type_file.chr1000
WHENEVER ERROR CALL cl_err_msg_log
CALL aws_efcli2_XMLHeader()
LET l_sql=" SELECT tc_xmi01,tc_xmi02,tc_xmi03,gen02, “,
“ tc_xmi04,gem02,tc_xmiplant,tc_xmi08 ",
" FROM tc_xmi_file ",
" LEFT JOIN gen_file ON tc_xmi03 = gen01 ",
" LEFT JOIN gem_file ON tc_xmi04 = gem01 ",
" WHERE tc_xmi01 = '", g_formNum CLIPPED, "'"
PREPARE ef_pre FROM l_sql
IF STATUS THEN
CALL cl_err('prepare: ', STATUS, 0)
LET g_strXMLInput = ''
RETURN
END IF
DECLARE ef_cur CURSOR FOR ef_pre
LET l_i = 1
FOREACH ef_cur INTO sr.*
LET g_strXMLInput = g_strXMLInput CLIPPED,
" <tc_xmi01 type=\"0\">",sr.tc_xmi01 CLIPPED ,"</tc_xmi01>", ASCII 10,
" <tc_xmi02 type=\"0\">",sr.tc_xmi02 CLIPPED ,"</tc_xmi02>", ASCII 10,
" <tc_xmi03 type=\"0\">",sr.tc_xmi03 CLIPPED ,"</tc_xmi03>", ASCII 10,
" <gen02 type=\"0\">",sr.gen02 CLIPPED ,"</gen02>", ASCII 10,
" <tc_xmi04 type=\"0\">",sr.tc_xmi04 CLIPPED ,"</tc_xmi04>", ASCII 10,
" <gem02 type=\"0\">",sr.gem02 CLIPPED ,"</gem02>", ASCII 10,
" <tc_xmiplant type=\"0\">",sr.tc_xmiplant CLIPPED ,"</tc_xmiplant>", ASCII 10,
" <tc_xmi08 type=\"0\">",sr.tc_xmi08 CLIPPED ,"</tc_xmi08>", ASCII 10,
" </head>", ASCII 10,
" <body>", ASCII 10,
" <record>", ASCII 10,
" </record>", ASCII 10
LET l_i = l_i + 1
END FOREACH
LET g_strXMLInput = g_strXMLInput CLIPPED,
" </body>", ASCII 10
CALL aws_efcli2_XMLTrailer()
END FUNCTION
我自己取名:aws2_cpmt500放在/u1/topprod/tiptop/aws/4gl下
四、连接程序:
打开p_zz,点击链接程序:
链接完成以后打开程序aws_efcfg2做集成设置:
1.打开程序
2.点击录入
输入我们的程序,这边我就不一一演示了。直接上我已经做好的图片,你们跟着我做的那些照搬就行
这两个我没填,是空着的 所以就没上图,如果有需求就正常填
点击 维护一下需要传入表单的字段
最后点击。到这一步基本上ERP这边就已经完成了。
接下来是easyflow:
- 用管理员账号登录OA系统、选择系统设计工具,先做表单
点击表单设计师:
新建一张空白表单
输入表单代号,我这边是取的跟ERP程序一样的名字cpmt500你们自定。。
建完表单是这样子的。接下来就给大家讲解一下表单各个栏位是什么意思:
首先这个是关联数据库
这个对应传进来的tc_xmi02字段
这个对应传进来的tc_xmi01字段
1对应传进来的tc_xmiplant字段,2和3为记录的审核人员工号及名字。在JavaScript中实现。
对应 tc_xmi03和gen02字段
对应 tc_xmi04和gem02字段
对应 tc_xmi08字段
这个是一个查询的按钮,点击完以后会跳出ERP系统的资料。(JavaScript代码实现),讲到这里我就要解释一下为什么只传单头的资料了。因为我个人觉得如果单身数据太多了,在这边显示会很麻烦,打开表单也会很卡(获取资料嘛),我这边只传个单头资料进来,肯定是只有一笔的,所以很快,然后如果需要看单身资料的话就点击按钮就会跳出单身资料来了。
好了,到目前为止咱们的表单已经是解决了。现在我们来实现表单上的功能。我这边就直接上js代码了,代码简陋还请不要在意那些细节
/*
*暂估单价更新
*Add By HYP 200831
*
*/
document.write('<script type="text/javascript" src="../../CustomJsLib/EFGPShareMethod.js"></script>');//for 开窗
var tDataSource_ERP = "nd";
//var tDataSource_ERP = new DataSource("tc_xmj_file","SQLERP");
//var tDataSource_EFGP = new DataSource("cpmt500","SQLEFGP");
function formCreate(){
return true;
}
function formOpen(){
return true;
}
function formSave(){
if(activityId=="ACT3"){
document.getElementById("HtxtId").value = userId;
document.getElementById("HtxtDat").value=sytemDateTime.substring(2,10);
}
return true;
}
function formClose(){
return true;
}
function btncsjg_onclick(){
var Plant = document.getElementById("tc_xmiplant").value;
var Arg1 = document.getElementById("tc_xmi01").value;
var FileName = "SingleOpenWin";
var sql = "SELECT tc_xmj01,tc_xmj02,tc_xmj03,tc_xmj04, “ +
“rvv31,ima02,ima021, tc_xmj05,tc_xmj06,tc_xmj07,tc_xmj08 "+
" FROM " + Plant +".tc_xmj_file" +
" LEFT JOIN " + Plant + ".rvv_file ON rvv01 = tc_xmj03 AND rvv02 = tc_xmj04 " +
" LEFT JOIN " + Plant + ".ima_file ON ima01 = rvv31 " +
" WHERE tc_xmj01 = '" + Arg1 + "'";
var SQLClaused = new Array(sql);
var SQLLabel = new Array("暂估更新单号","项次","入库/退货单号","入库/退货项次","料件编号","品名","规格","未税单价","含税单价","税种","税率");//开窗后清单列表
var QBEField = new Array("tc_xmj03","tc_xmj04","rvv31","ima02","ima021");//模糊查询的字段条件
var QBELabel = new Array("入库/退货单号","入库/退货项次","料件编号","品名","规格");//查询条件对应的label
// var ReturnId = new Array("tc_xmj01","tc_xmi01");//返回信息 参数1:'SQL字段' 参数2:'画面栏位'
singleOpenWin(FileName, tDataSource_ERP, SQLClaused, SQLLabel, QBEField, QBELabel,720, 430);
}
- 打开流程设计师:
点击新增流程模型,
放到哪里
这个是我的流程图,大家自定参考咯。
然后就写完回传的session bean就OK了。
- 更新关联(必须要操作,不然ERP响应不到OA流程了。)
1.
2.
3.
4.
5.
6.点击
7.
好了,到这里整个过程就完成了。有问题联系我,我是TT-风......
感谢阅读- . -