$PBExportHeader$uo_dismantle_install.sru forward global type uo_dismantle_install from nonvisualobject end type type s_dismantle_install from structure within uo_dismantle_install end type end forward type s_dismantle_install from structure long printid long storageid long mtrlwareid long mtrlid decimal { 10 } qty decimal { 10 } price string status string plancode string woodcode string mxdscrp string mtrlcode string pcode integer dxflag long sptid long standardqty integer ifunit decimal { 5 } rate string uunit string unit string mtrlcuscode string location end type global type uo_dismantle_install from nonvisualobject end type global uo_dismantle_install uo_dismantle_install type variables PUBLIC PROTECTEDWRITE Long billid PUBLIC PROTECTEDWRITE String billcode PUBLIC PROTECTEDWRITE DateTime opdate PUBLIC PROTECTEDWRITE String opemp PUBLIC PROTECTEDWRITE DateTime moddate PUBLIC PROTECTEDWRITE String modemp PUBLIC PROTECTEDWRITE Int flag PUBLIC PROTECTEDWRITE DateTime auditingdate PUBLIC PROTECTEDWRITE String auditingrep PUBLIC PROTECTEDWRITE Int billtype DateTime billdate Long relid String reason Long storageid Long mtrlid Long mtrlwareid String status String pcode String plancode String woodcode String dscrp Decimal qty Int buildtype String rep Decimal price String mtrlcode Int dxflag Long sptid Int ifunit String uunit,unit Decimal rate String mtrlcuscode String location int kind PRIVATE: s_dismantle_install d_i[] //明细结构数组 Long it_mxbt = 0 //明细结构数组末指针 Boolean it_newbegin = FALSE //新建标志 Boolean it_updatebegin = FALSE//修改标志 end variables forward prototypes public function integer p_clearmx () public function integer p_reset () public function integer updatebegin (long arg_billid, ref string arg_msg) public function integer save (ref string arg_msg, boolean arg_ifcommit) public function integer del (long arg_billid, ref string arg_msg) public function integer add_dscrp (long arg_billid, string arg_newdescppart, ref string arg_msg) public function integer p_getinfo (long arg_billid, ref string arg_msg) public function integer getinfo (long arg_billid, ref string arg_msg) public function integer auditing (string arg_auditingrep, boolean arg_ifcommit, ref string arg_msg) public function integer newbegin (integer arg_billtype, ref string arg_msg) public function integer c_auditing (boolean arg_ifcommit, ref string arg_msg) public function integer acceptmx (long arg_printid, long arg_storageid, long arg_mtrlwareid, long arg_mtrlid, decimal arg_qty, decimal arg_price, string arg_status, string arg_plancode, string arg_woodcode, string arg_mxdscrp, string arg_mtrlcode, string arg_pcode, integer arg_dxflag, integer arg_sptid, ref string arg_msg, decimal arg_standardqty, string arg_mtrlcuscode, string arg_location) public function integer uof_update_waredate (boolean arg_ifcommit, ref string arg_msg) end prototypes public function integer p_clearmx ();//INT p_clearmx() //清除明细 it_mxbt=0 RETURN 1 end function public function integer p_reset ();//INT p_RESET() //清除对象及其明细 billid = 0 billcode = '' opemp = '' auditingrep = '' flag = 0 relid = 0 reason = '' storageid = 0 mtrlid = 0 mtrlwareid = 0 status = '' plancode = '' woodcode = '' dscrp = '' qty = 0 mtrlcuscode ='' location = '' kind = 0 it_newbegin = FALSE it_updatebegin = FALSE //清除明细 P_CLEARMX() RETURN 1 end function public function integer updatebegin (long arg_billid, ref string arg_msg);int rslt = 1 if arg_billid <= 0 then billid = 0 goto ext end if if p_getinfo(arg_billid,arg_msg) = 0 then rslt = 0 goto ext end if if flag = 1 then rslt = 0 arg_msg = '单据已经审核,不可以修改' goto ext end if if buildtype = 1 then rslt = 0 arg_msg = '单据为自动建立单据,不可以修改' goto ext end if billid = arg_billid p_clearmx() it_newbegin = false it_updatebegin = true ext: if rslt = 0 then p_reset() return rslt end function public function integer save (ref string arg_msg, boolean arg_ifcommit);Integer rslt = 1,i,cnt = 0 DateTime server_dt Long ls_newid IF IsNull(reason) THEN reason = '' IF IsNull(dscrp) THEN dscrp = '' IF IsNull(plancode) THEN plancode = '' IF IsNull(relid) THEN relid = 0 IF IsNull(status) THEN status = '' IF IsNull(woodcode) THEN woodcode = '' IF IsNull(pcode) THEN pcode = '' IF IsNull(mtrlcuscode) THEN mtrlcuscode = '' IF IsNull(location) THEN location = '' IF IsNull(kind) THEN kind = 0 IF mtrlid = 0 THEN rslt = 0 arg_msg = '非法物料!' GOTO ext END IF IF qty = 0 THEN rslt = 0 arg_msg = '装或拆的物料数量不能为零!' GOTO ext END IF IF it_newbegin = FALSE AND it_updatebegin = FALSE THEN rslt = 0 arg_msg = "非编辑状态不可以提交" 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 IF f_check_inoutdate(storageid,billdate,TRUE,arg_msg) = 0 THEN rslt = 0 GOTO ext END IF ////////////////////////////////////////////////开始区分:新建/更新 处理 IF billid = 0 THEN //新建 ls_newid = f_sys_scidentity(0,"u_dismantle_install","billid",arg_msg,TRUE,id_sqlca) IF ls_newid <= 0 THEN rslt = 0 GOTO ext END IF billcode = getid(0,"CZ",Date(server_dt),TRUE,sqlca) //取得新单据编号 IF billcode = "err" THEN billcode = '' rslt = 0 arg_msg = "无法获取拆装单编号" GOTO ext END IF // INSERT INTO u_dismantle_install (billid, billtype, billcode, reason, billdate, relid, storageid, mtrlid, mtrlwareid, status, plancode, woodcode, qty, dscrp, buildtype, price, rep, opemp, pcode, dxflag, sptid, mtrlcuscode, location, kind) VALUES( :ls_newid, :billtype, :billcode, :reason, :billdate, :relid, :storageid, :mtrlid, :mtrlwareid, :status, :plancode, :woodcode, :qty, :dscrp, :buildtype, :price, :rep, :publ_operator, :pcode, :dxflag, :sptid, :mtrlcuscode, :location, :kind); IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = "因网络或其它原因导致插入操作失败>>"+"~n"+sqlca.SQLErrText GOTO ext END IF billid = ls_newid FOR i = 1 TO it_mxbt INSERT INTO u_dismantle_installmx ( billid , printid, storageid , mtrlwareid , mtrlid , qty , price, status , plancode, woodcode , mxdscrp, pcode, dxflag, sptid, standardqty, mtrlcuscode, location) VALUES (:ls_newid, :d_i[i].printid, :d_i[i].storageid, :d_i[i].mtrlwareid, :d_i[i].mtrlid, :d_i[i].qty, :d_i[i].price, :d_i[i].status, :d_i[i].plancode, :d_i[i].woodcode, :d_i[i].mxdscrp, :d_i[i].pcode, :d_i[i].dxflag, :d_i[i].sptid, :d_i[i].standardqty, :d_i[i].mtrlcuscode, :d_i[i].location); IF sqlca.SQLCode <> 0 THEN billid = 0 //还原billid rslt = 0 arg_msg = "因网络或其它原因导致插入明细操作失败"+"~n"+sqlca.SQLErrText ROLLBACK ; GOTO ext END IF NEXT // ELSE //////////////////////////////////////////////////更新 UPDATE u_dismantle_install SET billtype = :billtype, reason = :reason, billdate = :billdate, relid = :relid, storageid = :storageid, mtrlid = :mtrlid, mtrlwareid = :mtrlwareid, status = :status, plancode = :plancode, woodcode = :woodcode, qty = :qty, dscrp = :dscrp, buildtype = :buildtype, moddate = getdate(), modemp = :publ_operator, price = :price, rep = :rep, pcode = :pcode, dxflag = :dxflag, sptid = :sptid, mtrlcuscode = :mtrlcuscode, location = :location, kind = :kind WHERE u_dismantle_install.billid = :billid AND Auditingflag = 0; IF sqlca.SQLCode <> 0 OR sqlca.SQLNRows <= 0 THEN rslt = 0 arg_msg = "因网络或其它原因导致更新单据操作失败"+"~n"+sqlca.SQLErrText GOTO ext END IF //删除原有明细 DELETE FROM u_dismantle_installmx Where u_dismantle_installmx.billid = :billid; 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_dismantle_installmx ( billid , printid, storageid , mtrlwareid , mtrlid , qty , price, status , plancode, woodcode , mxdscrp, pcode, dxflag, sptid , standardqty, mtrlcuscode, location) VALUES (:billid, :d_i[i].printid, :d_i[i].storageid, :d_i[i].mtrlwareid, :d_i[i].mtrlid, :d_i[i].qty, :d_i[i].price, :d_i[i].status, :d_i[i].plancode, :d_i[i].woodcode, :d_i[i].mxdscrp, :d_i[i].pcode, :d_i[i].dxflag, :d_i[i].sptid, :d_i[i].standardqty, :d_i[i].mtrlcuscode, :d_i[i].location); IF sqlca.SQLCode <> 0 THEN billid = 0 //还原billid rslt = 0 arg_msg = "因网络或其它原因导致插入明细操作失败"+"~n"+sqlca.SQLErrText ROLLBACK ; GOTO ext END IF NEXT END IF it_newbegin = FALSE it_updatebegin = FALSE ext: IF rslt = 0 THEN ROLLBACK; p_clearmx() ELSEIF rslt = 1 AND arg_ifcommit THEN COMMIT; END IF Return(rslt) end function public function integer del (long arg_billid, ref string arg_msg);//==================================================================== // Function: del(arg_billid,arg_msg) //-------------------------------------------------------------------- // Description: //-------------------------------------------------------------------- // Arguments: // value long arg_billid // reference string arg_msg //-------------------------------------------------------------------- // Returns: integer //-------------------------------------------------------------------- // Author: yyx Date: 2003.11.21 //-------------------------------------------------------------------- // Modify History: // //==================================================================== int rslt = 1 if arg_billid <= 0 then rslt = 0 arg_msg = "没有删除对象,操作取消" goto ext end if if it_newbegin or it_updatebegin then rslt=0 arg_msg="编辑状态下不可以执行,操作取消" goto ext end if select u_dismantle_install.auditingflag into :flag from u_dismantle_install where u_dismantle_install.billid = :arg_billid; if sqlca.sqlcode <> 0 then rslt = 0 arg_msg = '查询拆装单操作失败' goto ext end if if flag = 1 then rslt = 0 arg_msg = "单据已经审核,不可以删除" goto ext end if delete from u_dismantle_install where u_dismantle_install.billid = :arg_billid; if sqlca.sqlcode <> 0 then rslt = 0 arg_msg = "删除拆装单操作失败"+"~n"+sqlca.sqlerrtext goto ext end if delete from u_dismantle_installmx where u_dismantle_installmx.billid = :arg_billid; if sqlca.sqlcode <> 0 then rslt = 0 arg_msg = "删除拆装单明细操作失败"+"~n"+sqlca.sqlerrtext goto ext end if commit; it_newbegin = false it_updatebegin = false if rslt = 0 then rollback; p_reset() end if ext: return (rslt) end function public function integer add_dscrp (long arg_billid, string arg_newdescppart, ref string arg_msg);//==================================================================== // Function: add_dscrp(arg_billid,arg_newdescppart,arg_msg) //-------------------------------------------------------------------- // Description: //-------------------------------------------------------------------- // Arguments: // value long arg_billid // value string arg_newdescppart // reference string arg_msg //-------------------------------------------------------------------- // Returns: integer //-------------------------------------------------------------------- // Author: yyx Date: 2003.11.21 //-------------------------------------------------------------------- // Modify History: // //==================================================================== int rslt = 1 arg_newdescppart = trim(arg_newdescppart) if arg_billid <= 0 then rslt = 0 arg_msg = "没有删除对象,操作取消" goto ext end if if it_newbegin or it_updatebegin then rslt=0 arg_msg="编辑状态下不可以执行,操作取消" goto ext end if select u_dismantle_install.auditingflag into :flag from u_dismantle_install where u_dismantle_install.billid = :arg_billid; if sqlca.sqlcode <> 0 then rslt = 0 arg_msg = '查询拆装件单操作失败' goto ext end if if flag = 0 then rslt = 0 arg_msg = "非审核状态下不可用" goto ext end if update u_dismantle_install set dscrp = dscrp+' '+:arg_newdescppart where u_dismantle_install.billid = :billid; if sqlca.sqlcode <> 0 then rollback ; rslt = 0 arg_msg = "因网络或其它原因导致添加单据备注操作失败"+"~n"+sqlca.sqlerrtext goto ext end if commit; dscrp = dscrp+' '+arg_newdescppart ext: return (rslt) end function public function integer p_getinfo (long arg_billid, ref string arg_msg);Int rslt = 1 IF arg_billid <= 0 THEN rslt = 0 arG_MSG = "非法单据唯一码" GOTO ext END IF SELECT u_dismantle_install.billtype, u_dismantle_install.Billcode, u_dismantle_install.reason, u_dismantle_install.relid, u_dismantle_install.storageid, u_dismantle_install.mtrlid, u_dismantle_install.mtrlwareid, u_dismantle_install.status, u_dismantle_install.plancode, u_dismantle_install.woodcode, u_dismantle_install.qty, u_dismantle_install.Dscrp, u_dismantle_install.Auditingflag, u_dismantle_install.buildtype, u_dismantle_install.price, u_dismantle_install.billdate, u_dismantle_install.rep, u_mtrldef.mtrlcode, u_dismantle_install.pcode, u_dismantle_install.dxflag, u_dismantle_install.sptid, u_mtrldef.ifunit, u_mtrldef.rate_buy, u_mtrldef.unit_buy, u_mtrldef.unit, u_dismantle_install.mtrlcuscode, u_dismantle_install.location, u_dismantle_install.kind INTO :billtype, :Billcode, :reason, :relid, :storageid, :mtrlid, :mtrlwareid, :status, :plancode, :woodcode, :qty, :Dscrp, :flag, :buildtype, :price, :billdate, :rep, :mtrlcode, :pcode, :dxflag, :sptid, :ifunit, :rate, :uunit, :unit, :mtrlcuscode, :location, :kind FROM u_dismantle_install,u_mtrldef Where u_mtrldef.mtrlid = u_dismantle_install.mtrlid and billid = :arg_billid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arG_MSG = "查询操作失败(错误单据唯一码)"+sqlca.SQLErrText GOTO ext END IF billid = arg_billid ext: IF rslt = 0 THEN p_reset() RETURN rslt end function public function integer getinfo (long arg_billid, ref string arg_msg);Int rslt = 1,i = 1,no_mxcheck = 0 IF arg_billid <= 0 THEN rslt = 0 arg_msg = "非法单据唯一码" GOTO ext END IF IF p_getinfo(arg_billid,arg_msg) = 0 THEN rslt = 0 GOTO ext END IF //用游标读取明细 DECLARE cur_d_i_mx CURSOR FOR SELECT u_dismantle_installmx.printid, u_dismantle_installmx.storageid, u_dismantle_installmx.mtrlwareid, u_dismantle_installmx.mtrlid, u_dismantle_installmx.qty, u_dismantle_installmx.price, u_dismantle_installmx.status, u_dismantle_installmx.plancode, u_dismantle_installmx.woodcode, u_dismantle_installmx.mxdscrp, u_mtrldef.mtrlcode, u_dismantle_installmx.pcode, u_dismantle_installmx.dxflag, u_dismantle_installmx.sptid, u_dismantle_installmx.standardqty, u_mtrldef.ifunit, u_mtrldef.rate_buy, u_mtrldef.unit_buy, u_mtrldef.unit, u_dismantle_installmx.mtrlcuscode, u_dismantle_installmx.location FROM u_dismantle_installmx,u_mtrldef WHERE u_dismantle_installmx.billid = :arg_billid AND u_dismantle_installmx.mtrlid = u_mtrldef.mtrlid; OPEN cur_d_i_mx; FETCH cur_d_i_mx INTO :d_i[i].printid,:d_i[i].storageid, :d_i[i].mtrlwareid,:d_i[i].mtrlid,:d_i[i].qty, :d_i[i].price,:d_i[i].status,:d_i[i].plancode, :d_i[i].woodcode,:d_i[i].mxdscrp,:d_i[i].mtrlcode, :d_i[i].pcode,:d_i[i].dxflag,:d_i[i].sptid, :d_i[i].standardqty,:d_i[i].ifunit,:d_i[i].rate, :d_i[i].uunit,:d_i[i].unit,:d_i[i].mtrlcuscode,:d_i[i].location; DO WHILE sqlca.SQLCode = 0 i++ FETCH cur_d_i_mx INTO :d_i[i].printid,:d_i[i].storageid, :d_i[i].mtrlwareid,:d_i[i].mtrlid,:d_i[i].qty, :d_i[i].price,:d_i[i].status,:d_i[i].plancode, :d_i[i].woodcode,:d_i[i].mxdscrp,:d_i[i].mtrlcode, :d_i[i].pcode,:d_i[i].dxflag,:d_i[i].sptid, :d_i[i].standardqty,:d_i[i].ifunit,:d_i[i].rate, :d_i[i].uunit,:d_i[i].unit,:d_i[i].mtrlcuscode,:d_i[i].location; LOOP CLOSE cur_d_i_mx; //检验明细是否读入完整 SELECT count(*) INTO :no_mxcheck FROM u_dismantle_installmx Where u_dismantle_installmx.billid = :arg_billid; 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 billid = arg_billid it_mxbt = i - 1 it_newbegin = FALSE it_updatebegin = FALSE ext: IF rslt = 0 THEN p_reset() RETURN rslt end function public function integer auditing (string arg_auditingrep, boolean arg_ifcommit, ref string arg_msg);Long cnt = 0,i Int rslt = 1 Long chc Long rst_outwareid //拆装出仓id Long rst_inwareid //拆装进仓id Long s_scid Long o_scid Long lay_storageid[],ll_storageid s_dismantle_install s_di[] uo_inware uo_in uo_outware uo_out uo_in = CREATE uo_inware uo_in.commit_transaction = sqlca uo_in.if_getid_ture = FALSE uo_out = CREATE uo_outware uo_out.commit_transaction = sqlca uo_out.if_getid_ture = FALSE IF billid = 0 THEN rslt = 0 arg_msg = "没有审核对象" GOTO ext END IF IF flag = 1 THEN rslt = 0 arg_msg = "单据已经审核" GOTO ext END IF UPDATE u_dismantle_install SET Auditingemp = :arg_auditingrep, auditingdate = getdate(), Auditingflag = 1 Where u_dismantle_install.billid = :billid AND Auditingflag = 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 Boolean lb_f = FALSE Long j,k,ch //统计仓库数量,确定进或出仓单数 FOR i = 1 TO it_mxbt FOR j = 1 TO UpperBound(lay_storageid) IF lay_storageid[j] = d_i[i].storageid THEN lb_f = TRUE NEXT IF lb_f = FALSE THEN ch++ lay_storageid[ch] = d_i[i].storageid END IF lb_f = FALSE NEXT String ls_uunit Decimal ld_rate,ld_uqty,ld_uprice IF billtype = 0 THEN //装单 //多张出仓单 //1.原事务生成出仓单 FOR k = 1 TO UpperBound(lay_storageid) ll_storageid = lay_storageid[k] SELECT scid INTO :s_scid FROM u_storage Where storageid = :ll_storageid; IF sqlca.SQLCode <> 0 THEN arg_msg = '查询调出仓库所属分部资料失败' rslt = 0 GOTO ext END IF IF uo_out.newbegin(s_scid,15,arg_msg) = 0 THEN rslt = 0 GOTO ext END IF uo_out.relid = billid uo_out.outdate = billdate uo_out.outrep = rep uo_out.part = billcode uo_out.dscrp = dscrp uo_out.cusname = '拆装出仓' uo_out.storageid = ll_storageid chc = 0 FOR i = 1 TO it_mxbt IF d_i[i].storageid <> ll_storageid THEN CONTINUE chc++ //转换 ls_uunit = '' ld_rate = 0 ld_uqty = 0 ld_uprice = 0 IF d_i[i].ifunit = 0 THEN ls_uunit = d_i[i].unit ld_rate = 1 ld_uqty = d_i[i].qty ELSE IF d_i[i].rate = 0 THEN arg_msg = '明细行:'+String(i)+',资料设为双数量核算,但没有设置默认转换率,请检查' rslt = 0 GOTO ext END IF ls_uunit = d_i[i].uunit ld_rate = d_i[i].rate ld_uqty = d_i[i].qty /d_i[i].rate END IF IF uo_out.acceptmx(d_i[i].mtrlwareid,& d_i[i].qty,d_i[i].price,1,& d_i[i].mxdscrp,chc,arg_msg,0,0,0,0,'',0,0,& ls_uunit,ld_uqty,ld_rate,'','',0,0,'',0,0,0,0,'','') = 0 THEN rslt = 0 GOTO ext END IF NEXT IF uo_out.Save(FALSE,arg_msg) = 0 THEN rslt = 0 GOTO ext END IF rst_outwareid = uo_out.outwareid //2.原事务审核出仓单 IF uo_out.getinfo(s_scid,rst_outwareid,arg_msg) = 0 THEN rslt = 0 GOTO ext END IF IF uo_out.auditing(FALSE,arg_msg) = 0 THEN rslt = 0 GOTO ext END IF NEXT //3.目标事务建立进仓单 DateTime server_datetime SELECT Top 1 getdate() INTO :server_datetime FROM u_user; //取得系统时间,借用操作员表 IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = "查询目标仓库日期失败" GOTO ext END IF SELECT scid INTO :o_scid FROM u_storage Where storageid = :storageid; IF sqlca.SQLCode <> 0 THEN arg_msg = '查询调进仓库所属分部资料失败' rslt = 0 GOTO ext END IF IF uo_in.newbegin(o_scid,15,arg_msg) = 0 THEN rslt = 0 GOTO ext END IF uo_in.relid = billid uo_in.indate = billdate uo_in.inrep = rep uo_in.part = billcode uo_in.dscrp = dscrp uo_in.storageid = storageid uo_in.sptname = '拆装进仓' //转换 ls_uunit = '' ld_rate = 0 ld_uqty = 0 ld_uprice = 0 IF ifunit = 0 THEN ls_uunit = unit ld_rate = 1 ld_uqty = qty ld_uprice = price ELSE IF rate = 0 THEN arg_msg = '组装产品资料设为双数量核算,但没有设置默认转换率,请检查' rslt = 0 GOTO ext END IF ls_uunit = uunit ld_rate = rate ld_uqty = qty /rate ld_uprice = price * rate END IF IF uo_in.acceptmx(1,& mtrlid,& mtrlcode,& plancode,& status,& ld_uqty,& ld_uprice,& 1,& dscrp,& arg_msg,& 0,0,0,woodcode,pcode,sptid,ls_uunit,ld_rate,qty,0,0,'','',0,0,& mtrlcuscode,Location,& ld_uqty,& 0) = 0 THEN rslt = 0 GOTO ext END IF IF uo_in.Save(FALSE,arg_msg) = 0 THEN rslt = 0 GOTO ext END IF rst_inwareid = uo_in.inwareid //4.原事务审核进仓单 IF uo_in.getinfo(o_scid,rst_inwareid,arg_msg) = 0 THEN rslt = 0 GOTO ext END IF IF uo_in.auditing(FALSE,arg_msg) = 0 THEN rslt = 0 GOTO ext END IF ELSEIF billtype = 1 THEN //拆单 //多张进仓单 //1.原事务生成出仓单 SELECT scid INTO :s_scid FROM u_storage Where storageid = :storageid; IF sqlca.SQLCode <> 0 THEN arg_msg = '查询调出仓库所属分部资料失败' rslt = 0 GOTO ext END IF IF uo_out.newbegin(s_scid,15,arg_msg) = 0 THEN rslt = 0 GOTO ext END IF uo_out.relid = billid uo_out.outdate = billdate uo_out.outrep = rep uo_out.part = billcode uo_out.dscrp = dscrp uo_out.cusname = '拆装出仓' uo_out.storageid = storageid //转换 ls_uunit = '' ld_rate = 0 ld_uqty = 0 IF ifunit = 0 THEN ls_uunit = unit ld_rate = 1 ld_uqty = qty ELSE IF rate = 0 THEN arg_msg = '拆装产品资料设为双数量核算,但没有设置默认转换率,请检查' rslt = 0 GOTO ext END IF ls_uunit = uunit ld_rate = rate ld_uqty = qty /rate END IF IF uo_out.acceptmx(mtrlwareid,& qty,price,1,& dscrp,1,arg_msg,0,0,0,0,'',0,0,& ls_uunit,ld_uqty,ld_rate,'','',0,0,'',0,0,0,0,'','') = 0 THEN rslt = 0 GOTO ext END IF IF uo_out.Save(FALSE,arg_msg) = 0 THEN rslt = 0 GOTO ext END IF rst_outwareid = uo_out.outwareid //2.原事务审核出仓单 IF uo_out.getinfo(s_scid,rst_outwareid,arg_msg) = 0 THEN rslt = 0 GOTO ext END IF IF uo_out.auditing(FALSE,arg_msg) = 0 THEN rslt = 0 GOTO ext END IF FOR k = 1 TO UpperBound(lay_storageid) ll_storageid = lay_storageid[k] SELECT scid INTO :o_scid FROM u_storage Where storageid = :ll_storageid; IF sqlca.SQLCode <> 0 THEN arg_msg = '查询调进仓库所属分部资料失败' rslt = 0 GOTO ext END IF IF uo_in.newbegin(o_scid,15,arg_msg) = 0 THEN rslt = 0 GOTO ext END IF uo_in.relid = billid uo_in.indate = billdate uo_in.inrep = rep uo_in.part = billcode uo_in.dscrp = dscrp uo_in.storageid = ll_storageid uo_in.sptname = '拆装进仓' chc = 0 FOR i = 1 TO it_mxbt IF d_i[i].storageid <> ll_storageid THEN CONTINUE chc++ //转换 ls_uunit = '' ld_rate = 0 ld_uqty = 0 ld_uprice = 0 IF d_i[i].ifunit = 0 THEN ls_uunit = d_i[i].unit ld_rate = 1 ld_uqty = d_i[i].qty ld_uprice = d_i[i].price ELSE IF d_i[i].rate = 0 THEN arg_msg = '明细行:'+String(i)+',资料设为双数量核算,但没有设置默认转换率,请检查' rslt = 0 GOTO ext END IF ls_uunit = d_i[i].uunit ld_rate = d_i[i].rate ld_uqty = d_i[i].qty /d_i[i].rate ld_uprice = d_i[i].price * d_i[i].rate END IF IF uo_in.acceptmx(chc,& d_i[i].mtrlid,& d_i[i].mtrlcode,& d_i[i].plancode,& d_i[i].status,& ld_uqty,& ld_uprice,& 1,& d_i[i].mxdscrp,& arg_msg,& 0,0,0,d_i[i].woodcode,d_i[i].pcode,d_i[i].sptid,ls_uunit,ld_rate,& d_i[i].qty,0,0,'','',0,0,& d_i[i].mtrlcuscode,d_i[i].Location,& ld_uqty,& 0) = 0 THEN rslt = 0 GOTO ext END IF NEXT IF uo_in.Save(FALSE,arg_msg) = 0 THEN rslt = 0 GOTO ext END IF rst_inwareid = uo_in.inwareid //4.原事务审核进仓单 IF uo_in.getinfo(o_scid,rst_inwareid,arg_msg) = 0 THEN rslt = 0 GOTO ext END IF IF uo_in.auditing(FALSE,arg_msg) = 0 THEN rslt = 0 GOTO ext END IF NEXT END IF IF uof_update_waredate(FALSE,arg_msg) = 0 THEN rslt = 0 GOTO ext END IF flag = 1 ext: IF rslt = 0 THEN ROLLBACK; ELSEIF arg_ifcommit AND rslt = 1 THEN COMMIT; END IF DESTROY uo_in DESTROY uo_out RETURN rslt end function public function integer newbegin (integer arg_billtype, ref string arg_msg);Int rslt = 1 IF Not (arg_billtype = 0 OR arg_billtype = 1) THEN rslt = 0 arg_msg = '此单据类型必须为:0-装仓,1-拆仓' GOTO ext END IF p_reset() billtype = arg_billtype it_newbegin = TRUE it_updatebegin = FALSE ext: IF rslt = 0 THEN p_reset() RETURN rslt end function public function integer c_auditing (boolean arg_ifcommit, ref string arg_msg);Long cnt = 0,i Int rslt = 1 Long chc Long in_out Long rst_outwareid[],out_i = 1 //拆装出仓id String rst_outwarecode[] Long rst_inwareid[],in_i = 1 //拆装进仓id String rst_inwarecode[] Long s_scid Long o_scid Long lay_storageid[],ll_storageid s_dismantle_install s_di[] DateTime null_dt SetNull(null_dt) uo_inware uo_in uo_outware uo_out uo_in = CREATE uo_inware uo_in.commit_transaction = sqlca uo_in.if_getid_ture = FALSE uo_out = CREATE uo_outware uo_out.commit_transaction = sqlca uo_out.if_getid_ture = FALSE IF billid = 0 THEN rslt = 0 arg_msg = "没有撤审单据" GOTO ext END IF IF flag = 0 THEN rslt = 0 arg_msg = "单据未审核" GOTO ext END IF UPDATE u_dismantle_install SET Auditingemp = '', auditingdate = :null_dt, Auditingflag = 0 Where u_dismantle_install.billid = :billid AND Auditingflag = 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 Boolean lb_f = FALSE Long j,k,ch //统计仓库数量,确定进或出仓单数 FOR i = 1 TO it_mxbt FOR j = 1 TO UpperBound(lay_storageid) IF lay_storageid[j] = d_i[i].storageid THEN lb_f = TRUE NEXT IF lb_f = FALSE THEN ch++ lay_storageid[ch] = d_i[i].storageid END IF lb_f = FALSE NEXT IF billtype = 0 THEN //装单 //多张出仓单 //1.查询拆装单相关的出仓单,撤审,删除 FOR k = 1 TO UpperBound(lay_storageid) ll_storageid = lay_storageid[k] SELECT scid INTO :s_scid FROM u_storage Where storageid = :ll_storageid; IF sqlca.SQLCode <> 0 THEN arg_msg = '查询调出仓库所属分部资料失败' rslt = 0 GOTO ext END IF DECLARE cur_out_1 CURSOR FOR SELECT outwareid,outwarecode FROM u_outware WHERE scid = :s_scid AND relid = :billid and storageid = :ll_storageid AND billtype = 15 Order By outwareid; OPEN cur_out_1; FETCH cur_out_1 INTO :rst_outwareid[out_i],:rst_outwarecode[out_i]; DO WHILE sqlca.SQLCode = 0 out_i++ FETCH cur_out_1 INTO :rst_outwareid[out_i],:rst_outwarecode[out_i]; LOOP out_i = out_i - 1 CLOSE cur_out_1; IF out_i = 0 THEN arg_msg = '查询该拆装单相关出仓单失败,'+sqlca.SQLErrText rslt = 0 GOTO ext END IF FOR in_out = 1 TO out_i //撤审出仓单,再删除 IF uo_out.getinfo(s_scid,rst_outwareid[in_out],arg_msg) = 0 THEN arg_msg = String(in_out)+',相关出仓单:'+rst_outwarecode[in_out]+','+arg_msg rslt = 0 GOTO ext END IF IF uo_out.c_auditing(FALSE,arg_msg) = 0 THEN arg_msg = String(in_out)+',相关出仓单:'+rst_outwarecode[in_out]+','+arg_msg rslt = 0 GOTO ext END IF IF uo_out.del(s_scid,rst_outwareid[in_out],0,arg_msg,FALSE) = 0 THEN arg_msg = String(in_out)+',相关出仓单:'+rst_outwarecode[in_out]+','+arg_msg rslt = 0 GOTO ext END IF NEXT NEXT //2.查询拆装单相关的入仓单,撤审,删除 SELECT scid INTO :o_scid FROM u_storage Where storageid = :storageid; IF sqlca.SQLCode <> 0 THEN arg_msg = '查询调进仓库所属分部资料失败' rslt = 0 GOTO ext END IF DECLARE cur_in_1 CURSOR FOR SELECT inwareid,inwarecode FROM u_inware WHERE scid = :o_scid AND relid = :billid and storageid = :storageid AND billtype = 15 Order By inwareid; OPEN cur_in_1; FETCH cur_in_1 INTO :rst_inwareid[in_i],:rst_inwarecode[in_i]; DO WHILE sqlca.SQLCode = 0 in_i++ FETCH cur_in_1 INTO :rst_inwareid[in_i],:rst_inwarecode[in_i]; LOOP in_i = in_i - 1 CLOSE cur_in_1; IF in_i = 0 THEN arg_msg = '查询该拆装单相关入仓单失败,'+sqlca.SQLErrText rslt = 0 GOTO ext END IF FOR in_out = 1 TO in_i //撤审出仓单,再删除 IF uo_in.getinfo(o_scid,rst_inwareid[in_out],arg_msg) = 0 THEN arg_msg = String(in_out)+',相关进仓单:'+rst_inwarecode[in_out]+','+arg_msg rslt = 0 GOTO ext END IF IF uo_in.c_auditing(FALSE,arg_msg) = 0 THEN arg_msg = String(in_out)+',相关进仓单:'+rst_inwarecode[in_out]+','+arg_msg rslt = 0 GOTO ext END IF IF uo_in.del(o_scid,rst_inwareid[in_out],arg_msg,FALSE) = 0 THEN arg_msg = String(in_out)+',相关进仓单:'+rst_inwarecode[in_out]+','+arg_msg rslt = 0 GOTO ext END IF NEXT ELSEIF billtype = 1 THEN //拆单 //多张进仓单 //1.查询拆装单相关的出仓单,撤审,删除 SELECT scid INTO :s_scid FROM u_storage Where storageid = :storageid; IF sqlca.SQLCode <> 0 THEN arg_msg = '查询调出仓库所属分部资料失败' rslt = 0 GOTO ext END IF DECLARE cur_out_2 CURSOR FOR SELECT outwareid,outwarecode FROM u_outware WHERE scid = :s_scid AND relid = :billid and storageid = :storageid AND billtype = 15 Order By outwareid; OPEN cur_out_2; FETCH cur_out_2 INTO :rst_outwareid[out_i],:rst_outwarecode[out_i]; DO WHILE sqlca.SQLCode = 0 out_i++ FETCH cur_out_2 INTO :rst_outwareid[out_i],:rst_outwarecode[out_i]; LOOP out_i = out_i - 1 CLOSE cur_out_2; IF out_i = 0 THEN arg_msg = '查询该拆装单相关出仓单失败,'+sqlca.SQLErrText rslt = 0 GOTO ext END IF FOR in_out = 1 TO out_i //撤审出仓单,再删除 IF uo_out.getinfo(s_scid,rst_outwareid[in_out],arg_msg) = 0 THEN arg_msg = String(in_out)+',相关出仓单:'+rst_outwarecode[in_out]+','+arg_msg rslt = 0 GOTO ext END IF IF uo_out.c_auditing(FALSE,arg_msg) = 0 THEN arg_msg = String(in_out)+',相关出仓单:'+rst_outwarecode[in_out]+','+arg_msg rslt = 0 GOTO ext END IF IF uo_out.del(s_scid,rst_outwareid[in_out],0,arg_msg,FALSE) = 0 THEN arg_msg = String(in_out)+',相关出仓单:'+rst_outwarecode[in_out]+','+arg_msg rslt = 0 GOTO ext END IF NEXT //2.查询拆装单相关的入仓单,撤审,删除 FOR k = 1 TO UpperBound(lay_storageid) ll_storageid = lay_storageid[k] SELECT scid INTO :o_scid FROM u_storage Where storageid = :ll_storageid; IF sqlca.SQLCode <> 0 THEN arg_msg = '查询调出仓库所属分部资料失败' rslt = 0 GOTO ext END IF DECLARE cur_in_2 CURSOR FOR SELECT inwareid,inwarecode FROM u_inware WHERE scid = :o_scid AND relid = :billid and storageid = :ll_storageid AND billtype = 15 Order By inwareid; OPEN cur_in_2; FETCH cur_in_2 INTO :rst_inwareid[in_i],:rst_inwarecode[in_i]; DO WHILE sqlca.SQLCode = 0 in_i++ FETCH cur_in_2 INTO :rst_inwareid[in_i],:rst_inwarecode[in_i]; LOOP in_i = in_i - 1 CLOSE cur_in_2; IF in_i = 0 THEN arg_msg = '查询该拆装单相关入仓单失败,'+sqlca.SQLErrText rslt = 0 GOTO ext END IF FOR in_out = 1 TO in_i //撤审入仓单,再删除 IF uo_in.getinfo(o_scid,rst_inwareid[in_out],arg_msg) = 0 THEN arg_msg = String(in_out)+',相关进仓单:'+rst_inwarecode[in_out]+','+arg_msg rslt = 0 GOTO ext END IF IF uo_in.c_auditing(FALSE,arg_msg) = 0 THEN arg_msg = String(in_out)+',相关进仓单:'+rst_inwarecode[in_out]+','+arg_msg rslt = 0 GOTO ext END IF IF uo_in.del(o_scid,rst_inwareid[in_out],arg_msg,FALSE) = 0 THEN arg_msg = String(in_out)+',相关进仓单:'+rst_inwarecode[in_out]+','+arg_msg rslt = 0 GOTO ext END IF NEXT NEXT END IF flag = 1 ext: IF rslt = 0 THEN ROLLBACK; ELSEIF arg_ifcommit AND rslt = 1 THEN COMMIT; END IF DESTROY uo_in DESTROY uo_out RETURN rslt end function public function integer acceptmx (long arg_printid, long arg_storageid, long arg_mtrlwareid, long arg_mtrlid, decimal arg_qty, decimal arg_price, string arg_status, string arg_plancode, string arg_woodcode, string arg_mxdscrp, string arg_mtrlcode, string arg_pcode, integer arg_dxflag, integer arg_sptid, ref string arg_msg, decimal arg_standardqty, string arg_mtrlcuscode, string arg_location);Int rslt = 1 Long cnt = 0,ls_i IF it_newbegin = FALSE AND it_updatebegin = FALSE THEN rslt = 0 arg_msg = "非编辑状态不可以使用,操作取消" GOTO ext END IF IF IsNull(arg_printid) THEN arg_printid = 0 IF IsNull(arg_storageid) THEN arg_storageid = 0 IF IsNull(arg_mtrlwareid) THEN arg_mtrlwareid = 0 IF IsNull(arg_mtrlid) THEN arg_mtrlid = 0 IF IsNull(arg_qty) THEN arg_qty = 0 IF IsNull(arg_standardqty) THEN arg_standardqty = 0 IF IsNull(arg_price) THEN arg_price = 0 IF IsNull(arg_status) THEN arg_status = '' IF IsNull(arg_mtrlcode) THEN arg_mtrlcode = '' IF IsNull(arg_plancode) THEN arg_plancode = '' IF IsNull(arg_woodcode) THEN arg_woodcode = '' IF IsNull(arg_mxdscrp) THEN arg_mxdscrp = '' IF IsNull(arg_mtrlcuscode) THEN arg_mtrlcuscode = '' IF IsNull(arg_location) THEN arg_location = '' IF IsNull(arg_pcode) THEN arg_pcode = '' IF IsNull(arg_dxflag) THEN arg_dxflag = 0 IF IsNull(arg_sptid) THEN arg_sptid = 0 IF arg_qty = 0 THEN rslt = 1 GOTO ext END IF IF arg_mtrlwareid > 0 AND billtype = 0 THEN SELECT plancode, woodcode, status, pcode, dxflag, sptid, cost, mtrlcuscode, location INTO :arg_plancode, :arg_woodcode, :arG_status, :arg_pcode, :arg_dxflag, :arg_sptid, :arg_price, :arg_mtrlcuscode, :arg_location FROM u_mtrlware Where u_mtrlware.mtrlwareid = :arg_mtrlwareid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '查询物料 '+arg_mtrlcode+' 库存失败!>>'+sqlca.SQLErrText GOTO ext END IF END IF //写入内容 it_mxbt++ d_i[it_mxbt].printid = arg_printid d_i[it_mxbt].storageid = arg_storageid d_i[it_mxbt].mtrlwareid = arg_mtrlwareid d_i[it_mxbt].mtrlid = arg_mtrlid d_i[it_mxbt].qty = arg_qty d_i[it_mxbt].price = arg_price d_i[it_mxbt].status = arg_status d_i[it_mxbt].plancode = arg_plancode d_i[it_mxbt].woodcode = arg_woodcode d_i[it_mxbt].mxdscrp = arg_mxdscrp d_i[it_mxbt].mtrlcode = arg_mtrlcode d_i[it_mxbt].pcode = arg_pcode d_i[it_mxbt].dxflag = arg_dxflag d_i[it_mxbt].sptid = arg_sptid d_i[it_mxbt].standardqty = arg_standardqty d_i[it_mxbt].mtrlcuscode = arg_mtrlcuscode d_i[it_mxbt].location = arg_location ext: IF rslt = 0 THEN p_clearmx() RETURN(rslt) end function public function integer uof_update_waredate (boolean arg_ifcommit, ref string arg_msg);Int rslt = 1 DateTime ld_waredate,ld_auditingdate,ld_waradate_mx String ls_auditdate,ls_waredate Long i Long ll_mtrlid,ll_sptid,ll_mtrlwareid String ls_status,ls_woodcode ,ls_pcode,ls_plancode String ls_mtrlcuscode,ls_location DateTime ld_waredate_max Long o_scid,s_scid Long ll_storageid_mx SELECT auditingdate INTO :ld_auditingdate FROM u_dismantle_install Where billid = :billid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '查询单据审核时间失败,'+sqlca.SQLErrText GOTO ext END IF ls_auditdate = String(ld_auditingdate,'yyyy-mm-dd hh:mm') SELECT scid INTO :o_scid FROM u_storage Where storageid = :storageid; IF sqlca.SQLCode <> 0 THEN arg_msg = '查询调进仓库所属分部资料失败' rslt = 0 GOTO ext END IF IF billtype = 0 THEN //装 SELECT waredate INTO :ld_waredate FROM u_mtrlware WHERE storageid = :storageid AND mtrlid = :mtrlid AND sptid = :sptid AND scid = :o_scid AND status = :status AND woodcode = :woodcode AND pcode = :pcode AND plancode = :plancode AND mtrlcuscode = :mtrlcuscode AND Location = :Location; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '查询库存最近进仓日期失败,'+sqlca.SQLErrText GOTO ext END IF ls_waredate = String(ld_waredate,'yyyy-mm-dd hh:mm') IF ls_auditdate = ls_waredate THEN FOR i = 1 TO it_mxbt ll_mtrlwareid = d_i[i].mtrlwareid ll_storageid_mx = d_i[i].storageid SELECT scid INTO :s_scid FROM u_storage Where storageid = :ll_storageid_mx; IF sqlca.SQLCode <> 0 THEN arg_msg = '查询调出仓库所属分部资料失败' rslt = 0 GOTO ext END IF SELECT waredate INTO :ld_waradate_mx FROM u_mtrlware WHERE scid = :s_scid AND mtrlwareid = :ll_mtrlwareid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '查询明细库存最近进仓日期失败,'+sqlca.SQLErrText GOTO ext END IF IF i = 1 THEN ld_waredate_max = ld_waradate_mx ELSE IF ld_waradate_mx > ld_waredate_max THEN ld_waredate_max = ld_waradate_mx END IF END IF NEXT UPDATE u_mtrlware SET waredate = :ld_waredate_max WHERE storageid = :storageid AND mtrlid = :mtrlid AND sptid = :relid AND scid = :o_scid AND status = :status AND woodcode = :woodcode AND pcode = :pcode AND plancode = :plancode AND mtrlcuscode = :mtrlcuscode AND Location = :Location; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '更新库存最近进仓日期失败,'+sqlca.SQLErrText GOTO ext END IF END IF ELSEIF billtype = 1 THEN //拆 SELECT waredate INTO :ld_waredate FROM u_mtrlware WHERE mtrlwareid = :mtrlwareid AND scid = :o_scid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '查询库存最近进仓日期失败,'+sqlca.SQLErrText GOTO ext END IF FOR i = 1 TO it_mxbt ll_mtrlid = d_i[i].mtrlid ll_sptid = d_i[i].sptid ls_status = d_i[i].status ls_woodcode = d_i[i].woodcode ls_pcode = d_i[i].pcode ls_plancode = d_i[i].plancode ls_mtrlcuscode = d_i[i].mtrlcuscode ls_location = d_i[i].Location ll_storageid_mx = d_i[i].storageid SELECT scid INTO :s_scid FROM u_storage Where storageid = :ll_storageid_mx; IF sqlca.SQLCode <> 0 THEN arg_msg = '查询调出仓库所属分部资料失败' rslt = 0 GOTO ext END IF SELECT waredate INTO :ld_waradate_mx FROM u_mtrlware WHERE scid = :s_scid AND storageid = :ll_storageid_mx AND mtrlid = :ll_mtrlid AND sptid = :ll_sptid AND status = :ls_status AND woodcode = :ls_woodcode AND pcode = :ls_pcode AND plancode = :ls_plancode AND mtrlcuscode = :ls_mtrlcuscode AND Location = :ls_location; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '查询明细库存最近进仓日期失败,'+sqlca.SQLErrText GOTO ext END IF ls_waredate = String(ld_waradate_mx,'yyyy-mm-dd hh:mm') IF ls_auditdate = ls_waredate THEN UPDATE u_mtrlware SET waredate = :ld_waredate WHERE scid = :s_scid AND storageid = :ll_storageid_mx AND mtrlid = :ll_mtrlid AND sptid = :ll_sptid AND status = :ls_status AND woodcode = :ls_woodcode AND pcode = :ls_pcode AND plancode = :ls_plancode AND mtrlcuscode = :ls_mtrlcuscode AND Location = :ls_location; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '更新明细库存最近进仓日期失败,'+sqlca.SQLErrText GOTO ext END IF END IF NEXT END IF ext: IF rslt = 0 THEN ROLLBACK; ELSEIF rslt = 1 AND arg_ifcommit THEN COMMIT; END IF RETURN rslt end function on uo_dismantle_install.create call super::create TriggerEvent( this, "constructor" ) end on on uo_dismantle_install.destroy TriggerEvent( this, "destructor" ) call super::destroy end on