$PBExportHeader$uo_buybill.sru forward global type uo_buybill from nonvisualobject end type type s_bmstpaymx_bill from structure within uo_buybill end type end forward type s_bmstpaymx_bill from structure long payid string billcode datetime paydate long banktypeid decimal { 2 } mstpayamt decimal { 2 } payamt decimal { 2 } oriamt decimal { 2 } mainmstpayamt decimal { 2 } mainpayamt string opemp string dscrp string inrep integer buildtype long long long scid string relbillcode long moneyid end type global type uo_buybill from nonvisualobject end type global uo_buybill uo_buybill type variables PUBLIC PROTECTEDWRITE Long buybillid PUBLIC PROTECTEDWRITE String buybillcode PUBLIC PROTECTEDWRITE DateTime opdate PUBLIC PROTECTEDWRITE Int flag = 0 PUBLIC PROTECTEDWRITE DateTime auditdate PUBLIC PROTECTEDWRITE String auditrep String relcode = '' String opemp DateTime paydate Long banktypeid String dscrp = '' Long sptid = 0 Decimal mstpayamt Decimal payamt String inrep Long rapmoneyid Long accountsid Long itemid PRIVATE: s_bmstpaymx_bill mx[] 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 newbegin () public function integer save (ref string arg_msg, boolean arg_ifcommt) public function integer auditing (long arg_salebillid, string arg_auditrep, ref string arg_msg, boolean arg_ifcommit) public function integer getinfo (long arg_buybillid, ref string arg_msg) public function integer updatebegin (long arg_buybillid, ref string arg_msg) public function integer add_dscrp (long arg_buybillid, string arg_newdescppart, ref string arg_msg, boolean arg_ifcommit) public function integer c_auditing (long arg_buybillid, string arg_auditrep, ref string arg_msg, boolean arg_ifcommit) public function integer del (long arg_buybillid, ref string arg_msg, boolean arg_ifcommit) public function integer acceptmx (long arg_payid, string arg_billcode, decimal arg_mstpayamt, decimal arg_payamt, decimal arg_oriamt, decimal arg_mainmstpayamt, decimal arg_mainpayamt, string arg_relbillcode, string arg_mxdscrp, long arg_moneyid, 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() //清除对象及其明细 buybillid=0 buybillcode='' opemp='' flag=0 it_newbegin=FALSE it_updatebegin=FALSE //清除明细 P_CLEARMX() RETURN 1 end function public function integer newbegin ();//newbegin() //从置对象,设定业务类型,准备建立新单 //0 fail 1 success LONG RSLT=1 p_reset() it_newbegin=TRUE it_updatebegin=FALSE return RSLT end function public function integer save (ref string arg_msg, boolean arg_ifcommt);Integer rslt = 1,cnt = 0,i DateTime server_datetime Long ls_newid uo_mustpay uo_pay uo_pay = CREATE uo_mustpay Long ref_dateint String ls_sptname Decimal ls_mstpayamt Decimal ls_payamt Long ll_itemid Long ll_dateint DateTime ld_paydate s_bmstpaymx s_paymx uo_iteminput uo_item uo_item = CREATE uo_iteminput IF IsNull(dscrp) THEN dscrp = '' IF IsNull(relcode) THEN relcode = '' IF IsNull(inrep) THEN inrep = '' IF IsNull(banktypeid) THEN banktypeid = 0 IF IsNull(accountsid) THEN accountsid = 0 IF IsNull(itemid) THEN itemid = 0 IF it_newbegin = FALSE AND it_updatebegin = FALSE THEN rslt = 0 arG_MSG = "非编辑状态不可以提交" GOTO ext END IF SELECT Top 1 getdate() INTO :server_datetime FROM u_user ; //取得系统时间,借用操作员表 IF sqlca.SQLCode <> 0 THEN rslt = 0 arG_MSG = "查询操作失败,日期 " GOTO ext END IF IF it_mxbt = 0 THEN //如果输入库存物料资料错则已经清空 rslt = 0 arG_MSG = "没有正确单据内容" GOTO ext END IF IF Year(Date(paydate)) < 2000 OR IsNull(paydate) THEN rslt = 0 arG_MSG = "缺少出仓发生时间或不合理" GOTO ext END IF cnt = 0 SELECT count(*) INTO :cnt FROM cw_banktype Where banktypeid = :banktypeid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arG_MSG = "查询操作失败,结算方式!" GOTO ext END IF IF cnt = 0 THEN rslt = 0 arG_MSG = "结算方式未登记或已取消!" GOTO ext END IF cnt = 0 SELECT count(*) INTO :cnt FROM u_spt Where sptid = :sptid ; IF sqlca.SQLCode <> 0 THEN rslt = 0 arG_MSG = "查询操作失败,供应商资料" GOTO ext END IF IF cnt = 0 THEN rslt = 0 arG_MSG = "供应商未定义或错误" GOTO ext END IF SELECT name INTO :ls_sptname FROM u_spt Where u_spt.sptid = :sptid ; IF sqlca.SQLCode <> 0 THEN arG_MSG = '查询操作失败,供应商唯一码' rslt = 0 GOTO ext END IF cnt = 0 SELECT count(*) INTO :cnt FROM u_user Where username = :opemp ; IF sqlca.SQLCode <> 0 THEN rslt = 0 arG_MSG = "查询操作失败,操作员" GOTO ext END IF IF cnt = 0 THEN rslt = 0 arG_MSG = "操作员姓名未登记或已取消" GOTO ext END IF opdate = server_datetime IF buybillid = 0 THEN //新建 ls_newid = f_sys_scidentity(0,"U_buybill","buybillid",arG_MSG,TRUE,id_sqlca) IF ls_newid <= 0 THEN rslt = 0 GOTO ext END IF buybillcode = getid(0,"BB",Date(server_datetime),TRUE,sqlca) //取得新单据编号 IF buybillcode = "err" THEN buybillcode = '' rslt = 0 arG_MSG = "无法获取收入单编号" GOTO ext END IF INSERT INTO U_buybill ( buybillid, buybillcode, paydate, Relcode, Mstpayamt, payamt, sptid, dscrp, banktypeid, inrep, opdate, opemp, rapmoneyid , accountsid, itemid) VALUES ( :ls_newid, :buybillcode, :paydate, :Relcode, :Mstpayamt, :payamt, :sptid, :dscrp, :banktypeid, :inrep, :opdate, :opemp, :ref_dateint , :accountsid, :itemid) ; IF sqlca.SQLCode <> 0 THEN rslt = 0 arG_MSG = "因网络或其它原因导致插入操作失败"+"~n"+sqlca.SQLErrText GOTO ext END IF FOR i = 1 TO it_mxbt s_paymx.scid = mx[i].scid s_paymx.payid = mx[i].payid s_paymx.billcode = mx[i].relbillcode s_paymx.paydate = mx[i].paydate s_paymx.banktypeid = mx[i].banktypeid s_paymx.Mstpayamt = mx[i].Mstpayamt s_paymx.payamt = mx[i].payamt s_paymx.opemp = mx[i].opemp s_paymx.dscrp = mx[i].dscrp s_paymx.inrep = mx[i].inrep s_paymx.buildtype = 2 s_paymx.buybillid = ls_newid s_paymx.itemid = 0 s_paymx.sptid = sptid s_paymx.moneyid = mx[i].moneyid IF uo_pay.add_payrecmx(s_paymx,arG_MSG,FALSE) = 0 THEN rslt = 0 GOTO ext END IF NEXT buybillid = ls_newid FOR i = 1 TO it_mxbt INSERT INTO u_buybillmx (scid, buybillid, payid, paydate, mstpayamt, payamt, billcode, relbillcode, oriamt, mainmstpayamt, mainpayamt, moneyid ) VALUES (:mx[i].scid, :ls_newid, :mx[i].payid, :mx[i].paydate, :mx[i].mstpayamt, :mx[i].payamt, :mx[i].billcode, :mx[i].relbillcode, :mx[i].oriamt, :mx[i].mainmstpayamt, :mx[i].mainpayamt, :mx[i].moneyid ); IF sqlca.SQLCode <> 0 THEN buybillid = 0 rslt = 0 arG_MSG = "因网络或其它原因导致插入明细操作失败"+"~n"+sqlca.SQLErrText ROLLBACK USING sqlca; GOTO ext END IF NEXT ELSE //////////////////////////////////////////////////更新 SELECT mstpayamt, payamt, itemid, rapmoneyid, paydate INTO :ls_mstpayamt, :ls_payamt, :ll_itemid, :ll_dateint, :ld_paydate FROM u_buybill Where U_buybill.buybillid = :buybillid; IF sqlca.SQLCode <> 0 THEN arG_MSG = "查询应付帐建立类型失败,请重试!"+'~n'+sqlca.SQLErrText rslt = 0 GOTO ext END IF UPDATE U_buybill SET paydate = :paydate, Relcode = :Relcode, Mstpayamt = :Mstpayamt, payamt = :payamt, sptid = :sptid, dscrp = :dscrp, banktypeid = :banktypeid, inrep = :inrep, opdate = :opdate, opemp = :opemp, rapmoneyid = :ref_dateint, accountsid = :accountsid, itemid = :itemid Where U_buybill.buybillid = :buybillid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arG_MSG = "因网络或其它原因导致更新单据操作失败"+"~n"+sqlca.SQLErrText GOTO ext END IF //删除原有明细 DELETE FROM U_buybillmx Where u_buybillmx.buybillid = :buybillid USING sqlca; IF sqlca.SQLCode <> 0 THEN rslt = 0 arG_MSG = "删除旧有明细操作失败"+"~n"+sqlca.SQLErrText ROLLBACK USING sqlca; GOTO ext END IF FOR i = 1 TO it_mxbt INSERT INTO u_buybillmx (scid, buybillid, payid, paydate, mstpayamt, payamt, billcode, relbillcode, oriamt, mainmstpayamt, mainpayamt, moneyid ) VALUES (:mx[i].scid, :ls_newid, :mx[i].payid, :mx[i].paydate, :mx[i].mstpayamt, :mx[i].payamt, :mx[i].billcode, :mx[i].relbillcode, :mx[i].oriamt, :mx[i].mainmstpayamt, :mx[i].mainpayamt, :mx[i].moneyid ); IF sqlca.SQLCode <> 0 THEN rslt = 0 arG_MSG = "因网络或其它原因导致插入明细操作失败"+"~n"+sqlca.SQLErrText ROLLBACK USING sqlca; GOTO ext END IF NEXT IF uo_pay.buybill_del_mx(buybillid,arG_MSG,FALSE) = 0 THEN rslt = 0 GOTO ext END IF FOR i = 1 TO it_mxbt s_paymx.scid = mx[i].scid s_paymx.payid = mx[i].payid s_paymx.billcode = mx[i].relbillcode s_paymx.paydate = mx[i].paydate s_paymx.banktypeid = mx[i].banktypeid s_paymx.Mstpayamt = mx[i].Mstpayamt s_paymx.payamt = mx[i].payamt s_paymx.opemp = mx[i].opemp s_paymx.dscrp = mx[i].dscrp s_paymx.inrep = mx[i].inrep s_paymx.buildtype = 2 s_paymx.buybillid = buybillid s_paymx.itemid = 0 s_paymx.sptid = sptid s_paymx.moneyid = mx[i].moneyid IF uo_pay.add_payrecmx(s_paymx,arG_MSG,FALSE) = 0 THEN rslt = 0 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_ifcommt THEN COMMIT; END IF RETURN rslt end function public function integer auditing (long arg_salebillid, string arg_auditrep, ref string arg_msg, boolean arg_ifcommit);//auditing() //0 fail 1 success //仓库审核 long rslt=1,cnt=0 IF arg_salebillid=0 THEN rslt=0 arG_MSG="没有审核对象" goto ext END IF if getinfo(arg_salebillid,arg_msg)=0 then rslt=0 goto ext end if IF flag=1 THEN rslt=0 arG_MSG="单据已经过审核" goto ext END IF SELECT count(*) INTO :cnt FROM u_user WHERE username=:arg_auditrep; if sqlca.sqlcode<>0 then rslt=0 arG_MSG="查询操作失败,操作员" goto ext end if if cnt=0 then rslt=0 arG_MSG="操作员姓名未登记或已取消" goto ext end if UPDATE u_buybill SET Auditrep = :arg_auditrep, Auditdate = getdate(), flag = 1 WHERE u_buybill.buybillid = :arg_salebillid 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 flag=1 ext: if rslt=0 then ROLLBACK ; elseif rslt=1 and arg_ifcommit then commit; end if return rslt end function public function integer getinfo (long arg_buybillid, ref string arg_msg);int rslt=1 SELECT U_buybill.buybillcode, U_buybill.paydate, U_buybill.Relcode, U_buybill.Mstpayamt, U_buybill.payamt, U_buybill.sptid, U_buybill.dscrp, U_buybill.banktypeid, U_buybill.inrep, U_buybill.opdate, U_buybill.opemp, U_buybill.auditdate, U_buybill.auditrep, U_buybill.flag, U_buybill.rapmoneyid, U_buybill.accountsid, U_buybill.itemid INTO :buybillcode, :paydate, :Relcode, :Mstpayamt, :payamt, :sptid, :dscrp, :banktypeid, :inrep, :opdate, :opemp, :auditdate, :auditrep, :flag, :rapmoneyid , : accountsid, : itemid FROM U_buybill WHERE U_buybill.buybillid = :arg_buybillid ; if sqlca.sqlcode<>0 then rslt=0 ARG_MSG='查询数据操作失败,收入单' goto ext end if ext: return rslt end function public function integer updatebegin (long arg_buybillid, ref string arg_msg);//UPDATEbegin(arg_buybillid,arg_msg) //从置对象,设定业务类型,准备更新单 //0 fail 1 success int rslt=1,CNT=0 IF arg_buybillid<=0 THEN rslt=0 buybillid=0 goto ext end if if getinfo(arg_buybillid,arg_msg)=0 then rslt=0 goto ext end if if flag=1 then rslt=0 ARG_MSG='单据已经审核,不可以修改' goto ext end if buybillid=arg_buybillid if flag=0 then p_CLEARMX() it_newbegin=FALSE it_updatebegin=TRUE ext: IF rslt=0 THEN p_RESET() return rslt end function public function integer add_dscrp (long arg_buybillid, string arg_newdescppart, ref string arg_msg, boolean arg_ifcommit);//add_dscrp(string arg_newdescppart) //0 fail 1 SUCCESS INT rslt=1 arg_newdescppart=TRIM(arg_newdescppart) IF it_updatebegin OR it_newbegin THEN rslt=0 arG_MSG="编辑状态下不可用" goto ext END IF if getinfo(arg_buybillid,arg_msg)=0 then rslt=0 goto ext end if IF flag=0 THEN rslt=0 arG_MSG="非审核状态下不可用" goto ext END IF UPDATE u_buybill SET DSCRP = DSCRP+' '+:arg_newdescppart WHERE u_buybill.buybillid = :arg_buybillid; if SQLCA.SQLCode<>0 then rslt=0 arG_MSG="因网络或其它原因导致添加单据备注操作失败"+"~n"+SQLCA.SQLErrText goto ext end if DSCRP = DSCRP+' '+arg_newdescppart ext: if rslt=0 then rollback; elseif rslt=1 and arg_ifcommit then commit; end if return (rslt) end function public function integer c_auditing (long arg_buybillid, string arg_auditrep, ref string arg_msg, boolean arg_ifcommit);long rslt=1,cnt=0 IF arg_buybillid=0 THEN rslt=0 arG_MSG="没有撤审对象" goto ext END IF if getinfo(arg_buybillid,arg_msg)=0 then rslt=0 goto ext end if IF flag=0 THEN rslt=0 arG_MSG="单据未被审核,不能撤审" goto ext END IF SELECT count(*) INTO :cnt FROM u_user WHERE username=:arg_auditrep; if sqlca.sqlcode<>0 then rslt=0 arG_MSG="查询操作失败,操作员" goto ext end if if cnt=0 then rslt=0 arG_MSG="操作员姓名未登记或已取消" goto ext end if datetime null_datetime setnull(null_datetime) UPDATE u_buybill SET Auditrep = '', Auditdate = :null_datetime, flag = 0 WHERE u_buybill.buybillid = :arg_buybillid 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 flag=0 ext: if rslt=0 then ROLLBACK ; elseif rslt=1 and arg_ifcommit then commit; end if return rslt end function public function integer del (long arg_buybillid, ref string arg_msg, boolean arg_ifcommit);//cancel() //如果单据还没有审核删除单据极其明细 //0 FAIL, 1 SUCCESS Int rslt = 1 Decimal ls_mstpayamt Decimal ls_payamt Long ll_itemid Long ll_dateint DateTime ld_paydate uo_mustpay uo_pay uo_pay = CREATE uo_mustpay uo_iteminput uo_item uo_item = CREATE uo_iteminput IF arg_buybillid <= 0 THEN rslt = 0 arG_MSG = "没有删除对象,操作取消" GOTO ext END IF IF getinfo(arg_buybillid,arG_MSG) = 0 THEN rslt = 0 GOTO ext END IF IF flag = 1 THEN rslt = 0 arG_MSG = "单据已经审核,不可以删除" GOTO ext END IF //********删除出纳帐 SELECT mstpayamt, payamt, itemid, rapmoneyid, paydate INTO :ls_mstpayamt, :ls_payamt, :ll_itemid, :ll_dateint, :ld_paydate FROM u_buybill Where u_buybill.buybillid = :arg_buybillid; IF sqlca.SQLCode <> 0 THEN arG_MSG = "查询应付帐建立类型失败,请重试!"+'~n'+sqlca.SQLErrText rslt = 0 GOTO ext END IF IF ls_payamt <> 0 THEN IF uo_item.del_iteminput(ll_itemid,ll_dateint,1,arG_MSG,FALSE) = 0 THEN arG_MSG = '删除出纳明细帐失败!~n' + arG_MSG rslt = 0 GOTO ext END IF END IF IF uo_pay.buybill_del_mx(arg_buybillid,arG_MSG,FALSE) = 0 THEN rslt = 0 GOTO ext END IF DELETE FROM u_buybill Where u_buybill.buybillid = :arg_buybillid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arG_MSG = "删除采购支出单操作失败"+"~n"+sqlca.SQLErrText GOTO ext END IF DELETE FROM u_buybillmx Where u_buybillmx.buybillid = :arg_buybillid USING sqlca; IF sqlca.SQLCode <> 0 THEN rslt = 0 arG_MSG = "删除采购支出单明细操作失败"+"~n"+sqlca.SQLErrText ROLLBACK USING sqlca; GOTO ext END IF it_newbegin = FALSE it_updatebegin = FALSE IF rslt = 0 THEN ROLLBACK; p_reset() ELSEIF rslt = 1 AND arg_ifcommit THEN COMMIT; END IF ext: Return (rslt) end function public function integer acceptmx (long arg_payid, string arg_billcode, decimal arg_mstpayamt, decimal arg_payamt, decimal arg_oriamt, decimal arg_mainmstpayamt, decimal arg_mainpayamt, string arg_relbillcode, string arg_mxdscrp, long arg_moneyid, ref string arg_msg);Long rslt = 1 long ll_scid IF it_newbegin = FALSE AND it_updatebegin = FALSE THEN rslt = 0 arG_MSG = "非编辑状态不可以使用,操作取消" GOTO ext END IF //清除空值 IF IsNull(arg_payid) THEN arg_payid = 0 IF IsNull(arg_billcode) THEN arg_billcode = '' IF IsNull(arg_relbillcode) THEN arg_relbillcode = '' IF IsNull(arg_mstpayamt) THEN arg_mstpayamt = 0 IF IsNull(arg_payamt) THEN arg_payamt = 0 IF IsNull(arg_mainmstpayamt) THEN arg_mainmstpayamt = 0 IF IsNull(arg_mainpayamt) THEN arg_mainpayamt = 0 IF IsNull(arg_oriamt) THEN arg_oriamt = 0 IF IsNull(arg_mxdscrp) THEN arg_mxdscrp = '' IF IsNull(arg_moneyid) THEN arg_moneyid = 0 select scid into :ll_scid from u_bmstpay where payid = :arg_payid; if sqlca.sqlcode <> 0 then arg_msg = '查询单据所属分部失败:'+arg_billcode+' '+sqlca.sqlerrtext rslt = 0 goto ext end if //写入内容 it_mxbt++ mx[it_mxbt].scid = ll_scid mx[it_mxbt].payid = arg_payid mx[it_mxbt].billcode = arg_billcode mx[it_mxbt].relbillcode = arg_relbillcode mx[it_mxbt].paydate = paydate mx[it_mxbt].banktypeid = banktypeid mx[it_mxbt].mstpayamt = arg_mstpayamt mx[it_mxbt].payamt = arg_payamt mx[it_mxbt].mainmstpayamt = arg_mainmstpayamt mx[it_mxbt].mainpayamt = arg_mainpayamt mx[it_mxbt].oriamt = arg_oriamt mx[it_mxbt].opemp = publ_operator mx[it_mxbt].dscrp = arg_mxdscrp mx[it_mxbt].inrep = inrep mx[it_mxbt].buildtype = 2 mx[it_mxbt].moneyid = arg_moneyid ext: IF rslt = 0 THEN p_clearmx() Return(rslt) end function on uo_buybill.create call super::create TriggerEvent( this, "constructor" ) end on on uo_buybill.destroy TriggerEvent( this, "destructor" ) call super::destroy end on