$PBExportHeader$uo_order_plan.sru forward global type uo_order_plan from nonvisualobject end type end forward global type uo_order_plan from nonvisualobject end type global uo_order_plan uo_order_plan type variables Long uo_oplanid String uo_oplancode Int uo_option_order_plan_scll end variables forward prototypes public function integer p_getflag (long arg_scid, long arg_oplanid, ref integer arg_flag, ref integer arg_secflag, ref string arg_msg) public function integer audit (long arg_scid, long arg_oplanid, string arg_opemp, ref string arg_msg, boolean arg_ifcommit) public function integer add_dscrp (long arg_scid, long arg_oplanid, string arg_newdescppart, ref string arg_msg, boolean arg_ifcommit) public function integer updatebegin (long arg_scid, long arg_oplanid, ref string arg_msg) public function integer del (long arg_scid, long arg_oplanid, ref string arg_msg, boolean arg_ifcommit) public function integer audit_2 (long arg_scid, long arg_oplanid, string arg_opemp, ref string arg_msg, boolean arg_ifcommit) public function integer caudit (long arg_scid, long arg_oplanid, ref string arg_msg, boolean arg_ifcommit) public function integer caudit_2 (long arg_scid, long arg_oplanid, ref string arg_msg, boolean arg_ifcommit) public function integer getinfo (long arg_scid, long arg_oplanid, ref s_order_planmx arg_ref_planmx[], ref long arg_arr_cnt, ref string arg_msg) public function integer save (s_order_plan arg_oplan, string arg_opemp, ref string arg_msg, boolean arg_ifcommit) public function integer uof_add_scllmx (long arg_scid, long arg_oplanid, ref string arg_msg, boolean arg_ifcommit) public function integer getinfo_scll (long arg_scid, long arg_oplanid, ref s_order_planmx_scll arg_ref_planmx_scll[], ref long arg_arr_cnt, ref string arg_msg) public function integer addmxcmpl (long arg_scid, long arg_planid, long arg_printid, decimal arg_addqty, ref string arg_msg, boolean arg_ifcommit) public function integer tryfinish (long arg_scid, long arg_planid, ref string arg_msg, boolean arg_ifcommit) end prototypes public function integer p_getflag (long arg_scid, long arg_oplanid, ref integer arg_flag, ref integer arg_secflag, ref string arg_msg);Int rslt = 1 SELECT flag,secflag INTO :arg_flag,:arg_secflag FROM u_order_plan WHERE oplanid = :arg_oplanid AND scid = :arg_scid; IF sqlca.SQLCode <> 0 THEN ARG_MSG = '查询单据审核标记失败,'+sqlca.SQLErrText rslt = 0 GOTO ext END IF ext: RETURN rslt end function public function integer audit (long arg_scid, long arg_oplanid, string arg_opemp, ref string arg_msg, boolean arg_ifcommit);Int rslt = 1 Int li_flag,li_secflag DateTime ldt_oplandate IF uo_option_order_plan_scll = -1000 THEN arg_msg = '选项:[211]工组派工单使用自动领料功能,读取初始默认值失败,操作取消!' rslt = 0 GOTO ext END IF uo_order_ml uo_order uo_order = CREATE uo_order_ml IF arg_oplanid <= 0 THEN rslt = 0 ARG_MSG = '错误单据唯一码' GOTO ext END IF IF p_getflag(arg_scid,arg_oplanid,li_flag,li_secflag,ARG_MSG) = 0 THEN rslt = 0 GOTO ext END IF IF li_flag <> 0 THEN rslt = 0 ARG_MSG = '单据不是在待初审状态,不可以再审' GOTO ext END IF SELECT oplandate INTO :ldt_oplandate FROM u_order_plan WHERE oplanid = :arg_oplanid AND scid = :arg_scid; IF sqlca.SQLCode <> 0 THEN ARG_MSG = '查询是派工日期失败,'+sqlca.SQLErrText rslt = 0 GOTO ext END IF //更新审核标记 UPDATE u_order_plan SET auditingrep = :arg_opemp, auditingdate = getdate(), flag = 1 WHERE oplanid = :arg_oplanid AND scid = :arg_scid AND flag = 0; IF sqlca.SQLCode <> 0 THEN rslt = 0 ARG_MSG = "因网络或其它原因导致单据审核操作失败"+"~n"+sqlca.SQLErrText GOTO ext ELSEIF sqlca.SQLNRows = 0 THEN rslt = 0 ARG_MSG = "单据正在审核,请稍后查询。"+"~n"+sqlca.SQLErrText GOTO ext END IF s_order_planmx s_plan_mx[] Long ll_arr_cnt,ll_i IF getinfo(arg_scid,arg_oplanid,s_plan_mx,ll_arr_cnt,ARG_MSG) = 0 THEN rslt = 0 GOTO ext END IF FOR ll_i = 1 TO ll_arr_cnt IF s_plan_mx[ll_i].orderid > 0 THEN IF uo_order.addmxcmpl_planqty_wkp(arg_scid,& s_plan_mx[ll_i].orderid,& s_plan_mx[ll_i].wkpname,& s_plan_mx[ll_i].wrkgrpid,& s_plan_mx[ll_i].owrkgrpid,& s_plan_mx[ll_i].qty,& ldt_oplandate,& s_plan_mx[ll_i].requiredate,& ARG_MSG,FALSE) = 0 THEN rslt = 0 GOTO ext END IF END IF NEXT IF uo_option_order_plan_scll = 1 THEN IF uof_add_scllmx(arg_scid,arg_oplanid,ARG_MSG,FALSE) = 0 THEN rslt = 0 GOTO ext END IF END IF ext: IF rslt = 0 THEN ROLLBACK; ELSEIF rslt = 1 AND arg_ifcommit THEN COMMIT; END IF DESTROY uo_order RETURN rslt end function public function integer add_dscrp (long arg_scid, long arg_oplanid, string arg_newdescppart, ref string arg_msg, boolean arg_ifcommit);Int rslt = 1 Int li_flag,li_secflag IF arg_newdescppart = '' THEN rslt = 0 arG_MSG = "要添加内容为空,操作取消" GOTO ext END IF IF p_getflag(arg_scid,arg_oplanid,li_flag,li_secflag,arG_MSG) = 0 THEN rslt = 0 GOTO ext END IF IF li_flag = 0 THEN rslt = 0 arG_MSG = "待审核状态下不可用" GOTO ext END IF UPDATE u_order_plan SET DSCRP = DSCRP+' '+:arg_newdescppart WHERE u_order_plan.oplanid = :arg_oplanid AND u_order_plan.scid = :arg_scid; IF SQLCA.SQLCode <> 0 THEN rslt = 0 arG_MSG = "因网络或其它原因导致添加备注操作失败"+"~n"+SQLCA.SQLErrText GOTO ext END IF ext: IF rslt = 0 THEN ROLLBACK; ELSEIF rslt = 1 AND arg_ifcommit THEN COMMIT; END IF Return (rslt) end function public function integer updatebegin (long arg_scid, long arg_oplanid, ref string arg_msg);Int rslt = 1 Int li_flag,li_secflag Long cnt IF arg_oplanid <= 0 THEN rslt = 0 arg_msg = '错误单据唯一码' GOTO ext END IF IF p_getflag(arg_scid,arg_oplanid,li_flag,li_secflag,arg_msg) = 0 THEN rslt = 0 GOTO ext END IF IF li_flag = 1 THEN rslt = 0 arg_msg = '单据已经审核,不可以修改,要修改请先撤销审核' GOTO ext END IF ext: RETURN rslt end function public function integer del (long arg_scid, long arg_oplanid, ref string arg_msg, boolean arg_ifcommit);Int rslt = 1 Int li_flag,li_secflag IF arg_oplanid <= 0 THEN rslt = 0 arg_msg = '错误单据唯一码' GOTO ext END IF IF p_getflag(arg_scid,arg_oplanid,li_flag,li_secflag,arg_msg) = 0 THEN rslt = 0 GOTO ext END IF IF li_flag <> 0 THEN rslt = 0 arg_msg = '单据不是在待审状态,不可以删除' GOTO ext END IF DELETE FROM u_order_planmx WHERE oplanid = :arg_oplanid AND scid = :arg_scid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = "删除单据明细操作失败"+"~n"+sqlca.SQLErrText GOTO ext END IF DELETE FROM u_order_planmx_scll WHERE oplanid = :arg_oplanid AND scid = :arg_scid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = "删除单据领料明细操作失败"+"~n"+sqlca.SQLErrText GOTO ext END IF DELETE FROM u_order_plan WHERE oplanid = :arg_oplanid AND scid = :arg_scid AND flag = 0; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = "删除单据操作失败"+"~n"+sqlca.SQLErrText GOTO ext END IF ext: IF rslt = 0 THEN ROLLBACK; ELSEIF rslt = 1 AND arg_ifcommit THEN COMMIT; END IF RETURN rslt end function public function integer audit_2 (long arg_scid, long arg_oplanid, string arg_opemp, ref string arg_msg, boolean arg_ifcommit);Int rslt = 1 Int li_flag,li_secflag String ls_oplancode,ls_assign_emp DateTime ldt_oplandate Long ll_workgroupid IF uo_option_order_plan_scll = -1000 THEN arg_msg = '选项:[211]工组派工单使用自动领料功能,读取初始默认值失败,操作取消!' rslt = 0 GOTO ext END IF IF arg_oplanid <= 0 THEN rslt = 0 arg_msg = '错误单据唯一码' GOTO ext END IF IF p_getflag(arg_scid,arg_oplanid,li_flag,li_secflag,arg_msg) = 0 THEN rslt = 0 GOTO ext END IF IF li_flag = 0 THEN rslt = 0 arg_msg = '单据不是在初审状态,不可以再终审' GOTO ext END IF IF li_secflag = 1 THEN rslt = 0 arg_msg = '单据已终审,不可以再终审' GOTO ext END IF SELECT oplancode, assign_emp, oplandate, workgroupid INTO :ls_oplancode, :ls_assign_emp, :ldt_oplandate, :ll_workgroupid FROM u_order_plan WHERE scid = :arg_scid AND oplanid = :arg_oplanid; IF sqlca.SQLCode <> 0 THEN arg_msg = '查询单据资料失败,'+sqlca.SQLErrText rslt = 0 GOTO ext END IF //更新审核标记 UPDATE u_order_plan SET secauditingrep = :arg_opemp, secauditingdate = getdate(), secflag = 1 WHERE oplanid = :arg_oplanid AND scid = :arg_scid AND flag = 1 AND secflag = 0; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = "因网络或其它原因导致单据终审操作失败"+"~n"+sqlca.SQLErrText GOTO ext ELSEIF sqlca.SQLNRows = 0 THEN rslt = 0 arg_msg = "单据正在审核,请稍后查询。"+"~n"+sqlca.SQLErrText GOTO ext END IF s_order_planmx_scll s_plan_mx_scll[] Long ll_arr_cnt,k,j,ch,ll_i Long ll_storageid_arr[] Boolean lb_f = FALSE IF uo_option_order_plan_scll = 1 THEN IF getinfo_scll(arg_scid,arg_oplanid,s_plan_mx_scll,ll_arr_cnt,arg_msg) = 0 THEN rslt = 0 GOTO ext END IF IF ll_arr_cnt > 0 THEN FOR k = 1 TO ll_arr_cnt FOR j = 1 TO UpperBound(ll_storageid_arr) IF ll_storageid_arr[j] = s_plan_mx_scll[k].storageid THEN lb_f = TRUE NEXT IF lb_f = FALSE THEN ch++ ll_storageid_arr[ch] = s_plan_mx_scll[k].storageid END IF lb_f = FALSE NEXT FOR ll_i = 1 TO UpperBound(ll_storageid_arr) uo_outware_scll uo_scll uo_scll = CREATE uo_outware_scll uo_scll.commit_transaction = sqlca uo_scll.if_getid_ture = FALSE IF uo_scll.newbegin(arg_scid,3,arg_msg) = 0 THEN arg_msg = '开始建立领料单失败,'+arg_msg rslt = 0 END IF uo_scll.outdate = ldt_oplandate uo_scll.outrep = ls_assign_emp uo_scll.part = ls_oplancode uo_scll.dscrp = '' uo_scll.cusname = '' uo_scll.storageid = ll_storageid_arr[ll_i] uo_scll.relid = ll_workgroupid uo_scll.relint_1 = 0 uo_scll.ifauto = 1 Long chc FOR j = 1 TO ll_arr_cnt IF ll_storageid_arr[ll_i] = s_plan_mx_scll[j].storageid THEN Long ll_mtrlwareid Decimal ld_cost Long ll_mtrlid SELECT top 1 mtrlwareid, cost INTO :ll_mtrlwareid, :ld_cost FROM u_mtrlware WHERE storageid = :s_plan_mx_scll[j].storageid AND mtrlid = :s_plan_mx_scll[j].mtrlid AND status = :s_plan_mx_scll[j].status AND woodcode = :s_plan_mx_scll[j].woodcode AND pcode = :s_plan_mx_scll[j].pcode Order By noallocqty Desc; IF sqlca.SQLCode <> 0 THEN arg_msg = '查询物料:'+s_plan_mx_scll[j].mtrlcode+',库存资料失败,'+sqlca.SQLErrText rslt = 0 GOTO ext END IF SELECT mtrlid INTO :ll_mtrlid FROM u_order_ml WHERE scid = :arg_scid AND orderid = :s_plan_mx_scll[j].orderid; IF sqlca.SQLCode <> 0 THEN arg_msg = '查询生产计划物料资料失败,'+sqlca.SQLErrText rslt = 0 GOTO ext END IF chc++ IF uo_scll.acceptmx(ll_mtrlwareid,s_plan_mx_scll[j].qty,& ld_cost,1,'',chc,arg_msg,& 1,s_plan_mx_scll[j].orderid,& ll_mtrlid,0,'',& s_plan_mx_scll[j].qty,0,'',0,0,'','',0,0,'',0,0,0,0,'','') = 0 THEN rslt = 0 GOTO ext END IF END IF NEXT IF uo_scll.Save(FALSE,arg_msg) = 0 THEN rslt = 0 GOTO ext END IF IF uo_scll.getinfo(arg_scid,uo_scll.outwareid,arg_msg) = 0 THEN rslt = 0 GOTO ext END IF IF uo_scll.priceaudit(FALSE,arg_msg) = 0 THEN rslt = 0 GOTO ext END IF UPDATE u_order_planmx_scll SET outwareid = :uo_scll.outwareid, outwarecode = :uo_scll.outwarecode WHERE scid = :arg_scid AND oplanid = :arg_oplanid AND storageid = :ll_storageid_arr[ll_i]; IF sqlca.SQLCode <> 0 THEN arg_msg = '更新领料明细领料单号失败,'+sqlca.SQLErrText rslt = 0 GOTO ext END IF DESTROY uo_scll NEXT END IF END IF ext: IF rslt = 0 THEN ROLLBACK; ELSEIF rslt = 1 AND arg_ifcommit THEN COMMIT; END IF RETURN rslt end function public function integer caudit (long arg_scid, long arg_oplanid, ref string arg_msg, boolean arg_ifcommit);Int rslt = 1 Int li_flag,li_secflag Long cnt DateTime null_dt SetNull(null_dt) uo_order_ml uo_order uo_order = Create uo_order_ml IF arg_oplanid <= 0 THEN rslt = 0 ARG_MSG = '错误单据唯一码' GOTO ext END IF IF p_getflag(arg_scid,arg_oplanid,li_flag,li_secflag,ARG_MSG) = 0 THEN rslt = 0 GOTO ext END IF IF li_secflag = 1 THEN rslt = 0 ARG_MSG = '单据不是在待终审状态,不可以撤审' GOTO ext END IF IF li_flag = 0 THEN rslt = 0 ARG_MSG = '单据未初审,不可以撤审' GOTO ext END IF cnt = 0 SELECT count(*) INTO :cnt FROM u_orderworkgroup_nummx WHERE planscid = :arg_scid And planid = :arg_oplanid; IF sqlca.SQLCode <> 0 THEN rslt = 0 ARG_MSG = '查询工组派工单是否有相关工组完工单/工组交接单失败,'+sqlca.SQLErrText GOTO ext END IF IF cnt > 0 THEN rslt = 0 ARG_MSG = '工组派工单已有相关工组完工单/工组交接单,不能撤审' GOTO ext END IF //更新审核标记 UPDATE u_order_plan SET auditingrep = '', auditingdate = :null_dt, flag = 0 WHERE oplanid = :arg_oplanid AND scid = :arg_scid And flag = 1; IF sqlca.SQLCode <> 0 THEN rslt = 0 ARG_MSG = "因网络或其它原因导致单据撤审操作失败"+"~n"+sqlca.SQLErrText GOTO ext ELSEIF sqlca.SQLNRows = 0 THEN rslt = 0 ARG_MSG = "单据正在审核,请稍后查询。"+"~n"+sqlca.SQLErrText GOTO ext END IF s_order_planmx s_plan_mx[] Long ll_arr_cnt,ll_i IF getinfo(arg_scid,arg_oplanid,s_plan_mx,ll_arr_cnt,ARG_MSG) = 0 THEN rslt = 0 GOTO ext END IF FOR ll_i = 1 To ll_arr_cnt IF s_plan_mx[ll_i].orderid > 0 THEN IF uo_order.addmxcmpl_planqty_wkp(arg_scid,& s_plan_mx[ll_i].orderid,& s_plan_mx[ll_i].wkpname,& s_plan_mx[ll_i].wrkgrpid,& s_plan_mx[ll_i].owrkgrpid,& 0 - s_plan_mx[ll_i].qty,null_dt,null_dt,& ARG_MSG,False) = 0 THEN rslt = 0 GOTO ext END IF END IF NEXT ext: IF rslt = 0 THEN ROLLBACK; ELSEIF rslt = 1 And arg_ifcommit THEN COMMIT; END IF RETURN rslt end function public function integer caudit_2 (long arg_scid, long arg_oplanid, ref string arg_msg, boolean arg_ifcommit);Int rslt = 1 Int li_flag,li_secflag DateTime null_dt SetNull(null_dt) IF uo_option_order_plan_scll = -1000 THEN arg_msg = '选项:[211]工组派工单使用自动领料功能,读取初始默认值失败,操作取消!' rslt = 0 GOTO ext END IF IF arg_oplanid <= 0 THEN rslt = 0 arg_msg = '错误单据唯一码' GOTO ext END IF IF p_getflag(arg_scid,arg_oplanid,li_flag,li_secflag,arg_msg) = 0 THEN rslt = 0 GOTO ext END IF IF li_secflag = 0 THEN rslt = 0 arg_msg = '单据不是在已终审状态,不可以撤审' GOTO ext END IF IF li_flag = 0 THEN rslt = 0 arg_msg = '单据不是在已终审状态,不可以撤审' GOTO ext END IF //更新审核标记 UPDATE u_order_plan SET secauditingrep = '', secauditingdate = :null_dt, secflag = 0 WHERE oplanid = :arg_oplanid AND scid = :arg_scid AND secflag = 1; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = "因网络或其它原因导致单据终审撤审操作失败"+"~n"+sqlca.SQLErrText GOTO ext ELSEIF sqlca.SQLNRows = 0 THEN rslt = 0 arg_msg = "单据正在审核,请稍后查询。"+"~n"+sqlca.SQLErrText GOTO ext END IF Long ll_outwareid_arr[] String ls_outwarecode_arr[] Long ll_arr_cnt = 1,ll_i IF uo_option_order_plan_scll = 1 THEN DECLARE cur_outwareid CURSOR FOR SELECT distinct u_order_planmx_scll.outwareid, u_order_planmx_scll.outwarecode FROM u_order_planmx_scll WHERE u_order_planmx_scll.scid = :arg_scid AND u_order_planmx_scll.oplanid = :arg_oplanid; OPEN cur_outwareid; FETCH cur_outwareid INTO :ll_outwareid_arr[ll_arr_cnt],:ls_outwarecode_arr[ll_arr_cnt]; DO WHILE sqlca.SQLCode = 0 ll_arr_cnt++ FETCH cur_outwareid INTO :ll_outwareid_arr[ll_arr_cnt],:ls_outwarecode_arr[ll_arr_cnt]; LOOP CLOSE cur_outwareid; ll_arr_cnt = ll_arr_cnt - 1 IF ll_arr_cnt > 0 THEN uo_outware_scll uo_scll uo_scll = CREATE uo_outware_scll uo_scll.commit_transaction = sqlca FOR ll_i = 1 TO ll_arr_cnt IF uo_scll.getinfo(arg_scid,ll_outwareid_arr[ll_i],arg_msg) = 0 THEN rslt = 0 GOTO ext END IF IF uo_scll.c_priceaudit(FALSE,arg_msg) = 0 THEN rslt = 0 GOTO ext END IF IF uo_scll.del(arg_scid,ll_outwareid_arr[ll_i],0,arg_msg,FALSE) = 0 THEN arg_msg = '领料单:'+ls_outwarecode_arr[ll_i]+',删除失败,'+arg_msg rslt = 0 GOTO ext END IF NEXT UPDATE u_order_planmx_scll SET outwareid = 0, outwarecode = '' WHERE scid = :arg_scid AND oplanid = :arg_oplanid; IF sqlca.SQLCode <> 0 THEN arg_msg = '清除领料明细领料单号失败,'+sqlca.SQLErrText rslt = 0 GOTO ext END IF END IF END IF ext: IF rslt = 0 THEN ROLLBACK; ELSEIF rslt = 1 AND arg_ifcommit THEN COMMIT; END IF DESTROY uo_scll RETURN rslt end function public function integer getinfo (long arg_scid, long arg_oplanid, ref s_order_planmx arg_ref_planmx[], ref long arg_arr_cnt, ref string arg_msg);Int rslt = 1 Long i = 1,no_mxcheck = 0 IF arg_oplanid <= 0 THEN rslt = 0 arg_msg = '错误单据唯一码' GOTO ext END IF //用游标读取明细 DECLARE cur_planmx CURSOR FOR SELECT u_order_planmx.orderid, u_order_planmx.ordercode, u_order_planmx.mtrlid, u_order_planmx.status, u_order_planmx.woodcode, u_order_planmx.pcode, u_order_planmx.Qty, u_order_planmx.requiredate, u_mtrldef.mtrlcode, u_order_planmx.wrkGrpid, u_order_planmx.owrkGrpid, u_order_planmx.wkpname FROM u_order_planmx,u_mtrldef WHERE u_order_planmx.oplanid = :arg_oplanid AND u_order_planmx.scid = :arg_scid AND u_order_planmx.mtrlid = u_mtrldef.mtrlid Order By u_order_planmx.printid; OPEN cur_planmx; FETCH cur_planmx INTO :arg_ref_planmx[i].orderid, :arg_ref_planmx[i].ordercode,:arg_ref_planmx[i].mtrlid, :arg_ref_planmx[i].status,:arg_ref_planmx[i].woodcode, :arg_ref_planmx[i].pcode,:arg_ref_planmx[i].Qty, :arg_ref_planmx[i].requiredate,:arg_ref_planmx[i].mtrlcode, :arg_ref_planmx[i].wrkGrpid,:arg_ref_planmx[i].owrkGrpid, :arg_ref_planmx[i].wkpname; DO WHILE sqlca.SQLCode = 0 i++ FETCH cur_planmx INTO :arg_ref_planmx[i].orderid,:arg_ref_planmx[i].ordercode, :arg_ref_planmx[i].mtrlid, :arg_ref_planmx[i].status,:arg_ref_planmx[i].woodcode, :arg_ref_planmx[i].pcode,:arg_ref_planmx[i].Qty, :arg_ref_planmx[i].requiredate,:arg_ref_planmx[i].mtrlcode, :arg_ref_planmx[i].wrkGrpid,:arg_ref_planmx[i].owrkGrpid, :arg_ref_planmx[i].wkpname; LOOP CLOSE cur_planmx; //检验明细是否读入完整 SELECT count(*) INTO :no_mxcheck FROM u_order_planmx WHERE scid = :arg_scid AND oplanid = :arg_oplanid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = "查询操作失败,单据明细数量" GOTO ext END IF IF i <> (no_mxcheck + 1) THEN rslt = 0 arg_msg = "查询操作失败,单据明细" GOTO ext END IF arg_arr_cnt = i - 1 ext: RETURN rslt end function public function integer save (s_order_plan arg_oplan, string arg_opemp, ref string arg_msg, boolean arg_ifcommit);Integer rslt = 1 Long cnt = 0 DateTime server_dt Long ll_oplanid,it_mxbt,i String ls_sccode,ls_oplancode Long ll_wrkGrpid,ll_wrkGrpid_order IF IsNull(arg_oplan.scid) THEN arg_oplan.scid = 0 IF IsNull(arg_oplan.oplanid) THEN arg_oplan.oplanid = 0 IF IsNull(arg_oplan.assign_emp) THEN arg_oplan.assign_emp = '' IF IsNull(arg_oplan.relcode) THEN arg_oplan.relcode = '' IF IsNull(arg_oplan.dscrp) THEN arg_oplan.dscrp = '' IF IsNull(arg_oplan.workgroupid) THEN arg_oplan.workgroupid = 0 IF IsNull(arg_oplan.wrkgrpid) THEN arg_oplan.wrkgrpid = 0 IF arg_oplan.wrkgrpid = 0 THEN arg_msg = '请选择工组' rslt = 0 GOTO ext END IF cnt = 0 SELECT count(*) INTO :cnt FROM u_sc_workgroup Where wrkgrpid = :arg_oplan.wrkgrpid; IF sqlca.SQLCode <> 0 THEN arg_msg = '查询工组资料失败,'+sqlca.SQLErrText rslt = 0 GOTO ext END IF IF cnt <> 1 THEN arg_msg = '工组资料不存在或重复,请检查' rslt = 0 GOTO ext END IF IF arg_oplan.workgroupid > 0 THEN SELECT u_workgroup.wrkGrpid INTO :ll_wrkGrpid FROM u_workgroup Where u_workgroup.workgroupid = :arg_oplan.workgroupid; IF sqlca.SQLCode <> 0 THEN arg_msg = '查询单据工作中心所属工组资料失败,'+sqlca.SQLErrText rslt = 0 GOTO ext END IF IF ll_wrkGrpid <> arg_oplan.wrkgrpid THEN arg_msg = '工作中心所属工组资料与单据工组资料不相符,请检查' rslt = 0 GOTO ext END IF END IF IF arg_oplan.assign_emp = '' THEN arg_msg = '请输入经手人' rslt = 0 GOTO ext END IF SELECT Top 1 getdate() INTO :server_dt FROM u_user; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = "查询操作失败,日期 " GOTO ext END IF it_mxbt = UpperBound(arg_oplan.arg_s_planmx) IF it_mxbt <= 0 THEN rslt = 0 arg_msg = "没有正确明细内容" GOTO ext END IF FOR i = 1 TO it_mxbt arg_oplan.arg_s_planmx[i].wrkGrpid = arg_oplan.wrkgrpid String ls_ordercode String ls_status,ls_woodcode,ls_pcode Long ll_mtrlid SELECT ordercode,status_mode,woodcode,pcode,mtrlid INTO :ls_ordercode,:ls_status,:ls_woodcode,:ls_pcode,:ll_mtrlid FROM u_order_ml WHERE orderid = :arg_oplan.arg_s_planmx[i].orderid AND scid = :arg_oplan.scid; IF sqlca.SQLCode <> 0 THEN arg_msg = '行:'+String(arg_oplan.arg_s_planmx[i].printid)+',物料:'+arg_oplan.arg_s_planmx[i].mtrlcode+',查询计划编号失败' rslt = 0 GOTO ext END IF arg_oplan.arg_s_planmx[i].ordercode = ls_ordercode arg_oplan.arg_s_planmx[i].status = ls_status arg_oplan.arg_s_planmx[i].woodcode = ls_woodcode arg_oplan.arg_s_planmx[i].pcode = ls_pcode arg_oplan.arg_s_planmx[i].mtrlid = ll_mtrlid NEXT IF arg_oplan.oplanid = 0 THEN ll_oplanid = f_sys_scidentity(0,"u_order_plan","oplanid",arg_msg,TRUE,id_sqlca) IF ll_oplanid <= 0 THEN rslt = 0 GOTO ext END IF IF f_get_sccode(arg_oplan.scid,sqlca,ls_sccode,arg_msg) = 0 THEN rslt = 0 GOTO ext END IF ls_oplancode = getid(arg_oplan.scid,ls_sccode + 'OP',Date(server_dt),FALSE,sqlca) IF ls_oplancode = "err" THEN rslt = 0 arg_msg = "无法获取单据编号"+"~n"+sqlca.SQLErrText GOTO ext END IF INSERT INTO u_order_plan (scid, oplanid, oplancode, oplandate, assign_emp, opdate, opemp, flag, relcode, dscrp, workgroupid, wrkgrpid) VALUES ( :arg_oplan.scid, :ll_oplanid, :ls_oplancode, :arg_oplan.oplandate, :arg_oplan.assign_emp, getdate(), :arg_opemp, 0, :arg_oplan.relcode, :arg_oplan.dscrp, :arg_oplan.workgroupid, :arg_oplan.wrkgrpid) ; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = "因网络或其它原因导致建立单据操作失败"+"~n"+sqlca.SQLErrText GOTO ext END IF FOR i = 1 TO it_mxbt INSERT INTO u_order_planmx (scid, oplanid, printid, orderid, mtrlid, status, woodcode, pcode, Qty, mxdscrp, ordercode, requiredate, wrkGrpid, owrkGrpid, wkpname, uprate, fzqty, fzrate) VALUES ( :arg_oplan.scid, :ll_oplanid, :arg_oplan.arg_s_planmx[i].printid, :arg_oplan.arg_s_planmx[i].orderid, :arg_oplan.arg_s_planmx[i].mtrlid, :arg_oplan.arg_s_planmx[i].status, :arg_oplan.arg_s_planmx[i].woodcode, :arg_oplan.arg_s_planmx[i].pcode, :arg_oplan.arg_s_planmx[i].qty, :arg_oplan.arg_s_planmx[i].mxdscrp, :arg_oplan.arg_s_planmx[i].ordercode, :arg_oplan.arg_s_planmx[i].requiredate, :arg_oplan.arg_s_planmx[i].wrkGrpid, :arg_oplan.arg_s_planmx[i].owrkGrpid, :arg_oplan.arg_s_planmx[i].wkpname, :arg_oplan.arg_s_planmx[i].uprate, :arg_oplan.arg_s_planmx[i].fzqty, :arg_oplan.arg_s_planmx[i].fzrate); IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = "因网络或其它原因导致插入明细操作失败"+"~n"+sqlca.SQLErrText GOTO ext END IF NEXT uo_oplanid = ll_oplanid uo_oplancode = ls_oplancode ELSE UPDATE u_order_plan SET oplandate = :arg_oplan.oplandate, assign_emp = :arg_oplan.assign_emp, moddate = getdate(), modemp = :arg_opemp, relcode = :arg_oplan.relcode, dscrp = :arg_oplan.dscrp, workgroupid = :arg_oplan.workgroupid, wrkgrpid = :arg_oplan.wrkgrpid WHERE oplanid = :arg_oplan.oplanid AND scid = :arg_oplan.scid AND flag = 0; IF sqlca.SQLCode <> 0 OR sqlca.SQLNRows <= 0 THEN rslt = 0 arg_msg = "因网络或其它原因导致更新单据操作失败"+"~n"+sqlca.SQLErrText GOTO ext END IF DELETE FROM u_order_planmx WHERE oplanid = :arg_oplan.oplanid AND scid = :arg_oplan.scid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = "删除旧有明细操作失败"+"~n"+sqlca.SQLErrText GOTO ext END IF FOR i = 1 TO it_mxbt INSERT INTO u_order_planmx (scid, oplanid, printid, orderid, mtrlid, status, woodcode, pcode, Qty, mxdscrp, ordercode, requiredate, wrkGrpid, owrkGrpid, wkpname, uprate, fzqty, fzrate) VALUES ( :arg_oplan.scid, :arg_oplan.oplanid, :arg_oplan.arg_s_planmx[i].printid, :arg_oplan.arg_s_planmx[i].orderid, :arg_oplan.arg_s_planmx[i].mtrlid, :arg_oplan.arg_s_planmx[i].status, :arg_oplan.arg_s_planmx[i].woodcode, :arg_oplan.arg_s_planmx[i].pcode, :arg_oplan.arg_s_planmx[i].qty, :arg_oplan.arg_s_planmx[i].mxdscrp, :arg_oplan.arg_s_planmx[i].ordercode, :arg_oplan.arg_s_planmx[i].requiredate, :arg_oplan.arg_s_planmx[i].wrkGrpid, :arg_oplan.arg_s_planmx[i].owrkGrpid, :arg_oplan.arg_s_planmx[i].wkpname, :arg_oplan.arg_s_planmx[i].uprate, :arg_oplan.arg_s_planmx[i].fzqty, :arg_oplan.arg_s_planmx[i].fzrate); IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = "因网络或其它原因导致插入明细操作失败"+"~n"+sqlca.SQLErrText GOTO ext END IF NEXT uo_oplanid = arg_oplan.oplanid END IF ext: IF rslt = 0 THEN ROLLBACK; ELSEIF arg_ifcommit AND rslt = 1 THEN COMMIT; END IF RETURN rslt end function public function integer uof_add_scllmx (long arg_scid, long arg_oplanid, ref string arg_msg, boolean arg_ifcommit);Int rslt = 1 Int li_flag,li_secflag Long ll_wrkGrpid uo_cp_auto_scll uo_mrp_scll uo_mrp_scll = CREATE uo_cp_auto_scll IF arg_oplanid <= 0 THEN rslt = 0 ARG_MSG = '错误单据唯一码' GOTO ext END IF IF p_getflag(arg_scid,arg_oplanid,li_flag,li_secflag,ARG_MSG) = 0 THEN rslt = 0 GOTO ext END IF IF li_flag <> 1 THEN rslt = 0 ARG_MSG = '单据不是在初审状态,不可以计算领料明细' GOTO ext END IF IF li_secflag = 1 THEN rslt = 0 ARG_MSG = '单据已终审状态,不可以计算领料明细' GOTO ext END IF SELECT u_order_plan.wrkGrpid INTO :ll_wrkGrpid FROM u_order_plan WHERE u_order_plan.scid = :arg_scid AND u_order_plan.oplanid = :arg_oplanid; IF sqlca.SQLCode <> 0 THEN ARG_MSG = '查询单据工组资料失败,'+sqlca.SQLErrText rslt = 0 GOTO ext END IF IF ll_wrkGrpid = 0 THEN ARG_MSG = '工组资料错误' rslt = 0 GOTO ext END IF //MRP运算 s_order_planmx s_plan_mx[] s_cp_scll s_cs[],arg_s_cs[],tmp_s_cs[] Long ll_arr_cnt,i IF getinfo(arg_scid,arg_oplanid,s_plan_mx,ll_arr_cnt,ARG_MSG) = 0 THEN rslt = 0 GOTO ext END IF //取应车间库存物料 Long j,k,li_itmxt Int li_mtrlkind Boolean if_f Long arg_itmxt FOR i = 1 TO ll_arr_cnt IF s_plan_mx[i].orderid = 0 THEN CONTINUE arg_s_cs = tmp_s_cs arg_itmxt = 0 IF uo_mrp_scll.uof_cp_scll(arg_scid,s_plan_mx[i].orderid,0,& s_plan_mx[i].qty,& arg_s_cs,arg_itmxt,ARG_MSG) = 0 THEN rslt = 0 GOTO ext END IF FOR k = 1 TO UpperBound(arg_s_cs) SELECT mtrlkind INTO :li_mtrlkind FROM u_mtrldef Where mtrlid = :arg_s_cs[k].mtrlid; IF sqlca.SQLCode <> 0 THEN ARG_MSG = '查询物料领料属性失败,'+sqlca.SQLErrText rslt = 0 GOTO ext END IF IF li_mtrlkind = 1 THEN CONTINUE if_f = FALSE FOR j = 1 TO UpperBound(s_cs) IF s_cs[j].mtrlid = arg_s_cs[k].mtrlid & AND s_cs[j].wrkGrpid = arg_s_cs[k].wrkGrpid & AND s_cs[j].scid = arg_s_cs[k].scid & AND s_cs[j].orderid = arg_s_cs[k].orderid & AND s_cs[j].status = arg_s_cs[k].status & AND s_cs[j].woodcode = arg_s_cs[k].woodcode & AND s_cs[j].pcode = arg_s_cs[k].pcode THEN s_cs[j].qty = s_cs[j].qty + arg_s_cs[k].qty if_f = TRUE EXIT END IF NEXT IF NOT if_f THEN li_itmxt++ s_cs[li_itmxt].scid = arg_s_cs[k].scid s_cs[li_itmxt].orderid = arg_s_cs[k].orderid s_cs[li_itmxt].mtrlid = arg_s_cs[k].mtrlid s_cs[li_itmxt].wrkGrpid = arg_s_cs[k].wrkGrpid s_cs[li_itmxt].qty = arg_s_cs[k].qty s_cs[li_itmxt].status = arg_s_cs[k].status s_cs[li_itmxt].woodcode = arg_s_cs[k].woodcode s_cs[li_itmxt].pcode = arg_s_cs[k].pcode END IF NEXT NEXT IF UpperBound(s_cs) = 0 THEN ARG_MSG = '排程单对应的生产计划没有对应的车间用料' rslt = 0 GOTO ext END IF DELETE FROM u_order_planmx_scll WHERE oplanid = :arg_oplanid AND scid = :arg_scid; IF sqlca.SQLCode <> 0 THEN rslt = 0 ARG_MSG = "删除单据领料明细操作失败"+"~n"+sqlca.SQLErrText GOTO ext END IF Long m FOR m = 1 TO li_itmxt Long ll_storageid String ls_ordercode IF s_cs[m].wrkGrpid <> ll_wrkGrpid THEN CONTINUE SELECT top 1 u_outware.storageid INTO :ll_storageid FROM u_outware,u_outwaremx WHERE u_outware.scid = u_outwaremx.scid AND u_outware.outwareid = u_outwaremx.outwareid AND u_outware.billtype = 3 AND u_outware.flag = 1 AND u_outwaremx.scid = :arg_scid AND u_outwaremx.mtrlid = :s_cs[m].mtrlid AND u_outwaremx.status = :s_cs[m].status AND u_outwaremx.woodcode = :s_cs[m].woodcode AND u_outwaremx.pcode = :s_cs[m].pcode Order By u_outware.outdate Desc; IF sqlca.SQLCode <> 0 THEN SELECT top 1 u_mtrlware.storageid INTO :ll_storageid FROM u_mtrlware WHERE u_mtrlware.scid = :arg_scid AND u_mtrlware.mtrlid = :s_cs[m].mtrlid AND u_mtrlware.status = :s_cs[m].status AND u_mtrlware.woodcode = :s_cs[m].woodcode AND u_mtrlware.pcode = :s_cs[m].pcode Order By u_mtrlware.noallocqty Desc; IF sqlca.SQLCode <> 0 THEN SELECT top 1 u_mtrl_storage.storageid INTO :ll_storageid FROM u_mtrl_storage Where u_mtrl_storage.mtrlid = :s_cs[m].mtrlid; IF sqlca.SQLCode <> 0 THEN ll_storageid = 0 END IF END IF IF ll_storageid = 0 THEN ARG_MSG = '查询物料自动出仓仓库失败,'+sqlca.SQLErrText rslt = 0 GOTO ext END IF SELECT ordercode INTO :ls_ordercode FROM u_order_ml WHERE orderid = :s_cs[m].orderid AND scid = :arg_scid; IF sqlca.SQLCode <> 0 THEN ARG_MSG = '查询生产计划号失败,'+sqlca.SQLErrText rslt = 0 GOTO ext END IF INSERT INTO u_order_planmx_scll (scid, oplanid, orderid, ordercode, mtrlid, status, woodcode, pcode, qty, storageid) VALUES (:arg_scid, :arg_oplanid, :s_cs[m].orderid, :ls_ordercode, :s_cs[m].mtrlid, :s_cs[m].status, :s_cs[m].woodcode, :s_cs[m].pcode, :s_cs[m].qty, :ll_storageid); IF sqlca.SQLCode <> 0 THEN ARG_MSG = '建立领料明细失败,'+sqlca.SQLErrText rslt = 0 GOTO ext END IF NEXT ext: IF rslt = 0 THEN ROLLBACK; ELSEIF rslt = 1 AND arg_ifcommit THEN COMMIT; END IF DESTROY uo_mrp_scll RETURN rslt end function public function integer getinfo_scll (long arg_scid, long arg_oplanid, ref s_order_planmx_scll arg_ref_planmx_scll[], ref long arg_arr_cnt, ref string arg_msg);Int rslt = 1 Long i = 1,no_mxcheck = 0 IF arg_oplanid <= 0 THEN rslt = 0 arg_msg = '错误单据唯一码' GOTO ext END IF //用游标读取明细 DECLARE cur_planmx_scll CURSOR FOR SELECT u_order_planmx_scll.orderid, u_order_planmx_scll.ordercode, u_order_planmx_scll.mtrlid, u_order_planmx_scll.status, u_order_planmx_scll.woodcode, u_order_planmx_scll.pcode, u_order_planmx_scll.Qty, u_order_planmx_scll.storageid, u_mtrldef.mtrlcode FROM u_order_planmx_scll, u_mtrldef WHERE u_order_planmx_scll.oplanid = :arg_oplanid AND u_order_planmx_scll.scid = :arg_scid AND u_order_planmx_scll.mtrlid = u_mtrldef.mtrlid Order By u_order_planmx_scll.orderid, u_mtrldef.mtrlcode; OPEN cur_planmx_scll; FETCH cur_planmx_scll INTO :arg_ref_planmx_scll[i].orderid, :arg_ref_planmx_scll[i].ordercode,:arg_ref_planmx_scll[i].mtrlid, :arg_ref_planmx_scll[i].status,:arg_ref_planmx_scll[i].woodcode, :arg_ref_planmx_scll[i].pcode,:arg_ref_planmx_scll[i].Qty, :arg_ref_planmx_scll[i].storageid,:arg_ref_planmx_scll[i].mtrlcode; DO WHILE sqlca.SQLCode = 0 i++ FETCH cur_planmx_scll INTO :arg_ref_planmx_scll[i].orderid,:arg_ref_planmx_scll[i].ordercode, :arg_ref_planmx_scll[i].mtrlid, :arg_ref_planmx_scll[i].status,:arg_ref_planmx_scll[i].woodcode, :arg_ref_planmx_scll[i].pcode,:arg_ref_planmx_scll[i].Qty, :arg_ref_planmx_scll[i].storageid,:arg_ref_planmx_scll[i].mtrlcode; LOOP CLOSE cur_planmx_scll; //检验明细是否读入完整 SELECT count(*) INTO :no_mxcheck FROM u_order_planmx_scll WHERE scid = :arg_scid AND oplanid = :arg_oplanid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = "查询操作失败,单据明细数量" GOTO ext END IF IF i <> (no_mxcheck + 1) THEN rslt = 0 arg_msg = "查询操作失败,单据明细" GOTO ext END IF arg_arr_cnt = i - 1 ext: RETURN rslt end function public function integer addmxcmpl (long arg_scid, long arg_planid, long arg_printid, decimal arg_addqty, ref string arg_msg, boolean arg_ifcommit);Int rslt = 1 Int li_flag,li_secflag,li_fflag Long cnt = 0 IF arg_planid <= 0 THEN rslt = 0 arg_msg = '错误派工单唯一码' GOTO ext END IF IF arg_addqty = 0 THEN rslt = 1 GOTO ext END IF IF p_getflag(arg_scid,arg_planid,li_flag,li_secflag,arg_msg) = 0 THEN rslt = 0 GOTO ext END IF IF li_flag = 0 THEN rslt = 0 arg_msg = "派工单位未审核,不能操作" GOTO ext END IF SELECT fflag INTO :li_fflag FROM u_order_plan WHERE scid = :arg_scid AND oplanid = :arg_planid; IF sqlca.SQLCode <> 0 THEN arg_msg = '查询派工单完成标记失败,'+sqlca.SQLErrText rslt = 0 GOTO ext END IF Decimal ls_qty,ls_fqty,ld_uprate SELECT u_order_planmx.qty, u_order_planmx.fqty, u_order_planmx.uprate INTO :ls_qty, :ls_fqty, :ld_uprate FROM u_order_planmx WHERE u_order_planmx.scid = :arg_scid AND u_order_planmx.oplanid = :arg_planid AND u_order_planmx.printid = :arg_printid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '查询派工单明细物料已完成数失败,'+sqlca.SQLErrText GOTO ext END IF IF (ls_qty - ls_fqty) * (1 + ld_uprate) < arg_addqty THEN rslt = 0 arg_msg = "派工单明细未完成数量只有"+String(ls_qty - ls_fqty,'#,##0.0###')+",不能再完成"+String(arg_addqty,'#,##0.0#')+",允许超比例:"+String(ld_uprate,'#,##0.0#') GOTO ext END IF UPDATE u_order_planmx SET fqty = fqty + :arg_addqty WHERE u_order_planmx.scid = :arg_scid AND u_order_planmx.oplanid = :arg_planid AND u_order_planmx.printid = :arg_printid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = "因网络或错误产品唯一码导致更新派工单完成数量操作失败"+"~n"+sqlca.SQLErrText GOTO ext END IF ext: IF rslt = 0 THEN ROLLBACK; ELSEIF arg_ifcommit THEN COMMIT; END IF RETURN rslt end function public function integer tryfinish (long arg_scid, long arg_planid, ref string arg_msg, boolean arg_ifcommit); Int rslt = 1 DateTime null_dt SetNull(null_dt) IF arg_planid <= 0 THEN rslt = 0 arg_msg = '错误派工单唯一码' GOTO ext END IF Decimal ls_zerook Boolean if_finish if_finish = TRUE DECLARE zero_cur CURSOR FOR SELECT u_order_planmx.qty - u_order_planmx.fqty FROM u_order_planmx WHERE ( u_order_planmx.oplanid = :arg_planid ) AND ( u_order_planmx.scid = :arg_scid ); OPEN zero_cur; FETCH zero_cur INTO :ls_zerook; DO WHILE sqlca.SQLCode = 0 IF if_finish THEN IF ls_zerook > 0 THEN if_finish = FALSE END IF FETCH zero_cur INTO :ls_zerook; LOOP CLOSE zero_cur; IF if_finish THEN UPDATE u_order_plan SET fflag = 1, fdate = getdate(), femp = :publ_operator WHERE ( u_order_plan.oplanid = :arg_planid ) AND u_order_plan.scid = :arg_scid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = "因网络或其他原因导致更新派工单完成状态操作失败"+"~n"+sqlca.SQLErrText GOTO ext END IF END IF IF NOT if_finish THEN UPDATE u_order_plan SET fflag = 0, fdate = :null_dt, femp = '' WHERE ( u_order_plan.oplanid = :arg_planid ) AND u_order_plan.scid = :arg_scid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = "因网络或其他原因导致更新派工单完成状态操作失败"+"~n"+sqlca.SQLErrText GOTO ext END IF END IF ext: IF rslt = 0 THEN ROLLBACK; ELSEIF rslt = 1 AND arg_ifcommit THEN COMMIT; END IF RETURN rslt end function on uo_order_plan.create call super::create TriggerEvent( this, "constructor" ) end on on uo_order_plan.destroy TriggerEvent( this, "destructor" ) call super::destroy end on event constructor;String arg_msg String str_optionvalue str_optionvalue = '' f_get_sys_option_value('211',str_optionvalue,arg_msg) uo_option_order_plan_scll = Long(str_optionvalue) end event