$PBExportHeader$uo_buybill.sru forward global type uo_buybill from nonvisualobject end type type s_bmsttakemx from structure within uo_buybill end type end forward type s_bmsttakemx 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 end type global type uo_buybill from nonvisualobject end type global uo_buybill uo_buybill type variables PUBLIC PROTECTEDWRITE Long scid=0 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 int billtype int buildtype long moneyid=0 PRIVATE: S_BmsttakeMX 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, ref string arg_msg) public function integer save_ds (ref string arg_msg, boolean arg_ifcommt) 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); uo_mustpay uo_pay uo_pay = CREATE uo_mustpay Integer rslt = 1,cnt = 0,i DateTime server_datetime Long ls_newid Long ref_dateint String ls_sptname Decimal ls_mstpayamt Decimal ls_payamt Long ll_itemid Long ll_dateint DateTime ld_paydate 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 IsNull(moneyid) THEN moneyid = 0 IF moneyid <= 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_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,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 //生成相关号 Long ll_pay_i String ls_pay_i_billcode,ls_not_pay_i_billcode Dec ld_mstpayamt,ld_payamt FOR i = 1 TO it_mxbt IF mx[i].mainmstpayamt = 0 AND mx[i].mainpayamt <> 0 THEN ls_pay_i_billcode = mx[i].billcode ELSE ll_pay_i = i ls_not_pay_i_billcode = ls_not_pay_i_billcode + Trim(mx[i].billcode )+',' END IF NEXT ls_not_pay_i_billcode = Left(ls_not_pay_i_billcode,Len(ls_not_pay_i_billcode) - 1 ) FOR i = 1 TO it_mxbt IF i = ll_pay_i THEN mx[i].relbillcode = ls_not_pay_i_billcode ELSE mx[i].relbillcode = ls_pay_i_billcode END IF ld_mstpayamt = ld_mstpayamt - mx[i].Mstpayamt ld_payamt = ld_payamt - mx[i].payamt NEXT IF uo_pay.add_payrec(scid,sptid,paydate,inrep,Mstpayamt - payamt ,Mstpayamt,payamt,& dscrp,buybillcode,banktypeid,1,opemp,0,ls_newid,arg_msg,FALSE,paydate,accountsid,itemid,moneyid,'') = 0 THEN rslt = 0 GOTO ext END IF Long ref_payid ref_payid = uo_pay.ref_payid SELECT rapmoneyid INTO :ref_dateint FROM u_bmstpay Where payid = :ref_payid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '查询应付帐(收支帐ID)失败!' GOTO ext END IF IF uo_pay.add_payrecmx(scid,ref_payid,ls_not_pay_i_billcode, paydate, banktypeid,ld_mstpayamt,& ld_payamt, opemp, dscrp, inrep,2,ls_newid,itemid,sptid,arg_msg,FALSE,moneyid,'') = 0 THEN rslt = 0 GOTO ext END IF INSERT INTO U_buybill ( buybillid, buybillcode, paydate, Relcode, Mstpayamt, payamt, sptid, dscrp, banktypeid, inrep, opdate, opemp, rapmoneyid , accountsid, itemid, billtype, buildtype, moneyid) VALUES ( :ls_newid, :buybillcode, :paydate, :Relcode, :Mstpayamt, :payamt, :sptid, :dscrp, :banktypeid, :inrep, :opdate, :opemp, :ref_dateint , :accountsid, :itemid, :billtype, :buildtype, :moneyid) ; IF sqlca.SQLCode <> 0 THEN rslt = 0 IF Pos(Lower(sqlca.SQLErrText),'pk_u_buybill') > 0 THEN arg_msg = '插入供应商对数单操作失败,关键字单据ID重复' ELSEIF Pos(Lower(sqlca.SQLErrText),'ix_u_buybill') > 0 THEN arg_msg = '插入供应商对数单操作失败,单据编号重复' ELSE arg_msg = "插入供应商对数单操作失败"+"~n"+sqlca.SQLErrText END IF GOTO ext END IF FOR i = 1 TO it_mxbt IF mx[i].relbillcode = '' THEN mx[i].relbillcode = buybillcode IF uo_pay.add_payrecmx(mx[i].scid,mx[i].payid,mx[i].relbillcode,mx[i].paydate,mx[i].banktypeid,mx[i].Mstpayamt,& mx[i].payamt,mx[i].opemp,mx[i].dscrp,mx[i].inrep,2,ls_newid,0,sptid,arg_msg,FALSE,moneyid,'') = 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 ) 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 ); IF sqlca.SQLCode <> 0 THEN buybillid = 0 rslt = 0 IF Pos(Lower(sqlca.SQLErrText),'PK_u_buybillmx') > 0 THEN arg_msg = '插入供应商对数单明细操作失败,关键字单据ID重复' ELSE arg_msg = "插入供应商对数单明细操作失败"+"~n"+sqlca.SQLErrText END IF 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, billtype = :billtype 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 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 ) 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 ); IF sqlca.SQLCode <> 0 THEN rslt = 0 IF Pos(Lower(sqlca.SQLErrText),'PK_u_buybillmx') > 0 THEN arg_msg = '插入供应商对数单明细操作失败,关键字单据ID重复' ELSE arg_msg = "插入供应商对数单明细操作失败"+"~n"+sqlca.SQLErrText END IF 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 IF uo_pay.add_payrecmx(mx[i].scid,mx[i].payid,mx[i].billcode,mx[i].paydate,mx[i].banktypeid,mx[i].Mstpayamt,& mx[i].payamt,mx[i].opemp,mx[i].dscrp,mx[i].inrep,2,buybillid,0,sptid,arg_msg,FALSE,moneyid,'') = 0 THEN rslt = 0 GOTO ext END IF NEXT END IF it_newbegin = FALSE it_updatebegin = FALSE ext: DESTROY uo_pay 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 it_newbegin OR it_updatebegin 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, U_buybill.billtype, U_buybill.buildtype INTO :buybillcode, :paydate, :Relcode, :Mstpayamt, :payamt, :sptid, :dscrp, :banktypeid, :inrep, :opdate, :opemp, :auditdate, :auditrep, :flag, :rapmoneyid , :accountsid, :itemid, :billtype, :buildtype 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 buildtype=1 then rslt=0 ARG_MSG='单据是系统自动建立,不可以修改' 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);//c_auditing() //0 fail 1 success //仓库审核 long rslt=1,cnt=0 IF arg_buybillid=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 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 Long ll_payid Long ll_scid Long ll_sptid DateTime ld_paydate uo_mustpay uo_pay uo_pay = Create uo_mustpay 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 IF uo_pay.buybill_del_mx(arg_buybillid,arG_MSG,False) = 0 THEN rslt = 0 GOTO ext END IF SELECT payid,sptid,scid Into :ll_payid,:ll_sptid,:ll_scid From u_Bmstpay Where buybillid = :arg_buybillid; IF sqlca.SQLCode = 0 THEN IF uo_pay.del_payrec(ll_scid,1,ll_payid,ll_sptid,arG_MSG,False) = 0 THEN rslt = 0 GOTO ext END IF ELSEIF sqlca.SQLCode = -1 THEN rslt = 0 arG_MSG = '查询应付帐失败!'+"~n"+sqlca.SQLErrText 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 ext: Destroy uo_pay IF rslt = 0 THEN ROLLBACK; p_reset() ELSEIF rslt = 1 And arg_ifcommit THEN COMMIT; END IF 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, 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 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 = relcode mx[it_mxbt].inrep = inrep mx[it_mxbt].buildtype = 2 ext: IF rslt = 0 THEN p_clearmx() Return(rslt) end function public function integer save_ds (ref string arg_msg, boolean arg_ifcommt); uo_mustpay uo_pay uo_pay = Create uo_mustpay Integer rslt = 1,cnt = 0,i DateTime server_datetime Long ls_newid Long ref_dateint String ls_sptname Decimal ls_mstpayamt Decimal ls_payamt Long ll_itemid Long ll_dateint DateTime ld_paydate 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 IsNull(moneyid) THEN moneyid = 0 IF moneyid <= 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_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,false,sqlca) IF ls_newid <= 0 THEN rslt = 0 GOTO ext END IF buybillcode = getid(0,"BB",Date(server_datetime),false,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, billtype, buildtype, moneyid) VALUES ( :ls_newid, :buybillcode, :paydate, :Relcode, :Mstpayamt, :payamt, :sptid, :dscrp, :banktypeid, :inrep, :opdate, :opemp, :ref_dateint , :accountsid, :itemid, :billtype, :buildtype, :moneyid) ; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = "插入操作失败"+"~n"+sqlca.SQLErrText GOTO ext END IF FOR i = 1 To it_mxbt IF mx[i].relbillcode = '' THEN mx[i].relbillcode = buybillcode IF uo_pay.add_payrecmx(mx[i].scid,mx[i].payid,mx[i].relbillcode,datetime(string(today()) + ' ' + string(now())),mx[i].banktypeid,mx[i].Mstpayamt,& mx[i].payamt,mx[i].opemp,mx[i].dscrp,mx[i].inrep,2,ls_newid,0,sptid,arg_msg,False,moneyid,'') = 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 ) 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 ); 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, billtype = :billtype, moneyid = :moneyid 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 ) 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 ); 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 IF uo_pay.add_payrecmx(mx[i].scid,mx[i].payid,mx[i].billcode,datetime(string(today()) + ' ' + string(now())),mx[i].banktypeid,mx[i].Mstpayamt,& mx[i].payamt,mx[i].opemp,mx[i].dscrp,mx[i].inrep,2,buybillid,0,sptid,arg_msg,False,moneyid,'') = 0 THEN rslt = 0 GOTO ext END IF NEXT END IF it_newbegin = False it_updatebegin = False ext: Destroy uo_pay IF rslt = 0 THEN ROLLBACK; p_clearmx() ELSEIF rslt = 1 And arg_ifcommt THEN COMMIT; END IF 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