$PBExportHeader$uo_invoice.sru forward global type uo_invoice from nonvisualobject end type end forward global type uo_invoice from nonvisualobject end type global uo_invoice uo_invoice type variables PUBLIC PROTECTEDWRITE Long scid = 0 //分部id PUBLIC PROTECTEDWRITE Long invoiceid //进仓单表自动增量id PUBLIC PROTECTEDWRITE String invoicecode //单据的唯一编号 PUBLIC PROTECTEDWRITE DateTime opdate //建立时间,自动 PUBLIC PROTECTEDWRITE String opemp //建立操作员 PUBLIC PROTECTEDWRITE DateTime moddate //修改时间,自动 PUBLIC PROTECTEDWRITE String modemp //修改操作员 PUBLIC PROTECTEDWRITE Int flag = 0 //仓库审核标志 PUBLIC PROTECTEDWRITE DateTime auditingdate //审核时间 PUBLIC PROTECTEDWRITE String auditingrep //审核操作员 Long relid = 0 //关联相关销售单id string relcode='' //关联相关销售单code Long storageid = 0 //进仓仓库 DateTime invoicedate //进仓发生时间 String dscrp = '' //备注 Long cusid = 0 //客户id string cuscode='' string cusname='' string currencyname='' string bankname='' Transaction commit_transaction //数据commit事务 Boolean if_getid_ture = TRUE s_invoicemx invoicemx[] //明细结构数组 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 p_getinfo (long arg_scid, long arg_invoiceid, ref string arg_msg) public function integer getinfo (long arg_scid, long arg_invoiceid, ref string arg_msg) public function integer newbegin (long arg_scid, ref string arg_msg) public function integer updatebegin (long arg_scid, long arg_invoiceid, ref string arg_msg) public function integer add_dscrp (long arg_scid, long arg_invoiceid, string arg_newdescppart, ref string arg_msg) public function integer save (boolean arg_ifcommit, ref string arg_msg) public function integer del (long arg_scid, long arg_invoiceid, ref string arg_msg, boolean arg_ifcommit) public function integer auditing (boolean arg_ifcommit, ref string arg_msg) public function integer c_auditing (boolean arg_ifcommit, ref string arg_msg) public function integer acceptmx (decimal arg_qty, double arg_price, decimal arg_amt, string arg_mxdscrp, long arg_printid, ref string arg_msg, long arg_mtrlid, string arg_mtrlcode, string arg_mtrlname, string arg_mtrlmode) 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() //清除对象及其明细 scid=0 invoiceid=0 invoicecode='' opemp='' modemp='' auditingrep='' flag=0 relid=0 relcode='' dscrp='' cusid=0 cuscode='' cusname='' currencyname='' bankname='' it_newbegin=false it_updatebegin=false //清除明细 p_clearmx() return 1 end function public function integer p_getinfo (long arg_scid, long arg_invoiceid, ref string arg_msg);//p_getinfo(arg_scid,arg_outwareid,arg_msg) //0 失败 1成功 INT rslt=1 IF arg_invoiceid<=0 THEN rslt=0 arG_MSG="非法发票单唯一码" goto ext end if SELECT u_invoice.invoicecode, u_invoice.cusid, u_invoice.cuscode, u_invoice.cusname, u_invoice.currencyname, u_invoice.bankname, u_invoice.invoicedate, u_invoice.relid, u_invoice.relcode, u_invoice.dscrp, u_invoice.flag INTO :invoicecode, :cusid, :cuscode, :cusname, :currencyname, :bankname, :invoicedate, :relid, :relcode, :dscrp, :flag FROM u_invoice WHERE u_invoice.invoiceid = :arg_invoiceid and scid=:arg_scid using commit_transaction; if commit_transaction.sqlcode<>0 then rslt=0 arG_MSG="查询操作失败(错误发票单唯一码),发票单"+commit_transaction.sqlerrtext goto ext end if invoiceid = arg_invoiceid scid = arg_scid ext: IF rslt=0 THEN p_reset() return rslt end function public function integer getinfo (long arg_scid, long arg_invoiceid, ref string arg_msg);//getinfo(arg_scid,arg_invoiceid,arg_msg) //0 失败 1成功 int rslt = 1,i = 1,no_mxcheck = 0 if arg_invoiceid <= 0 then rslt = 0 arg_msg = "非法发票单唯一码" goto ext end if rslt = p_getinfo(arg_scid,arg_invoiceid,arg_msg) if rslt = 0 then goto ext //用游标读取明细 declare cur_inwaermx cursor for select u_invoicemx.printid, u_invoicemx.mtrlid, u_invoicemx.mtrlcode, u_invoicemx.mtrlname, u_invoicemx.qty, u_invoicemx.price, u_invoicemx.dscrp, u_invoicemx.amt, u_invoicemx.mtrlmode from u_invoicemx where u_invoicemx.invoiceid = :arg_invoiceid and u_invoicemx.scid = :arg_scid using commit_transaction; open cur_inwaermx; fetch cur_inwaermx into :invoicemx[i].printid, :invoicemx[i].mtrlid,:invoicemx[i].mtrlcode, :invoicemx[i].mtrlname,:invoicemx[i].qty, :invoicemx[i].price, :invoicemx[i].mxdscrp, :invoicemx[i].amt, :invoicemx[i].mtrlmode; do while commit_transaction.sqlcode = 0 i++ fetch cur_inwaermx into :invoicemx[i].printid, :invoicemx[i].mtrlid,:invoicemx[i].mtrlcode, :invoicemx[i].mtrlname,:invoicemx[i].qty, :invoicemx[i].price, :invoicemx[i].mxdscrp, :invoicemx[i].amt, :invoicemx[i].mtrlmode; loop close cur_inwaermx; //检验明细是否读入完整 select count(*) into :no_mxcheck from u_invoicemx where u_invoicemx.invoiceid = :arg_invoiceid and scid = :arg_scid using commit_transaction; if commit_transaction.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 invoiceid = arg_invoiceid scid = arg_scid it_mxbt = i - 1 it_newbegin = false it_updatebegin = false ext: if rslt = 0 then p_reset() return rslt end function public function integer newbegin (long arg_scid, ref string arg_msg);//==================================================================== // Function: newbegin(long arg_scid,int arg_billtype,ref string arg_msg) //-------------------------------------------------------------------- // Description: 从置对象,设定业务类型,准备建立新进仓单 //-------------------------------------------------------------------- // Arguments: // value long arg_scid // value integer arg_billtype // reference string arg_msg //-------------------------------------------------------------------- // Returns: integer //-------------------------------------------------------------------- // Author: yyx Date: 2003.11.12 //-------------------------------------------------------------------- // Modify History: // //==================================================================== int rslt=1 if arg_scid < 0 then arg_msg = '请选择分部' rslt = 0 goto ext end if p_reset() scid=arg_scid it_newbegin=true it_updatebegin=false ext: if rslt=0 then p_reset() return rslt end function public function integer updatebegin (long arg_scid, long arg_invoiceid, ref string arg_msg);//==================================================================== // Function: updatebegin(arg_scid,arg_inwareid,arg_billtype,arg_msg) //-------------------------------------------------------------------- // Description: 从置对象,设定业务类型与关联ID,准备更新进仓单 //-------------------------------------------------------------------- // Arguments: // value long arg_scid // value long arg_inwareid // value integer arg_billtype // reference string arg_msg //-------------------------------------------------------------------- // Returns: integer //-------------------------------------------------------------------- // Author: yyx Date: 2003.11.12 //-------------------------------------------------------------------- // Modify History: // //==================================================================== long rslt=1 if arg_scid < 0 then arg_msg = '请选择分部' rslt = 0 goto ext end if if arg_invoiceid<=0 then rslt=0 goto ext end if rslt=p_getinfo(arg_scid,arg_invoiceid,arg_msg) if rslt=0 then goto ext if flag=1 then rslt=0 arg_msg='单据已经审核,不可以修改' goto ext end if invoiceid=arg_invoiceid scid=arg_scid it_newbegin=false it_updatebegin=true p_clearmx() //清除明细 ext: if rslt=0 then p_reset() return rslt end function public function integer add_dscrp (long arg_scid, long arg_invoiceid, string arg_newdescppart, ref string arg_msg);//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 arg_newdescppart='' then rslt=0 arg_msg="要添加内容为空,操作取消" goto ext end if rslt=p_getinfo(arg_scid,arg_invoiceid,arg_msg) if rslt=0 then goto ext if flag=0 then rslt=0 arg_msg="非审核状态下不可用" goto ext end if update u_invoice set dscrp = dscrp+' '+:arg_newdescppart where u_invoice.invoiceid = :invoiceid and scid=:scid using commit_transaction; if commit_transaction.sqlcode<>0 then rollback ; rslt=0 arg_msg="因网络或其它原因导致添加单据备注操作失败"+"~n"+commit_transaction.sqlerrtext goto ext end if commit using commit_transaction; dscrp = dscrp+' '+arg_newdescppart ext: return (rslt) end function public function integer save (boolean arg_ifcommit, ref string arg_msg);Integer rslt = 1,cnt = 0,i DateTime server_dt Long ls_newid String ls_sccode IF IsNull(relid) THEN relid = 0 IF IsNull(cusid) THEN cusid = 0 IF IsNull(cuscode) THEN cuscode = '' if isnull(cusname) then cusname='' if isnull(currencyname) then currencyname='' if isnull(bankname) then bankname='' if isnull(relcode) then relcode='' IF IsNull(dscrp) THEN dscrp = '' 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 USING commit_transaction ; //取得系统时间,借用操作员表 IF commit_transaction.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 f_check_inoutdate(0,invoicedate,FALSE,arG_MSG) = 0 THEN rslt = 0 GOTO ext END IF ////////////////////////////////////////////////开始区分:新建/更新 处理 IF invoiceid = 0 THEN //新建 ls_newid = f_sys_scidentity(scid,"u_invoice","invoiceid",arg_msg,TRUE,id_sqlca) IF ls_newid <= 0 THEN rslt = 0 GOTO ext END IF //取分部代号 IF f_get_sccode(scid,commit_transaction,ls_sccode,arg_msg) = 0 THEN rslt = 0 GOTO ext END IF //取得新单据编号 invoicecode = getid(scid,ls_sccode + 'FP',Date(server_dt),if_getid_ture,commit_transaction) IF invoicecode = "err" THEN invoicecode = '' rslt = 0 arg_msg = "无法获取发票单编号"+"~n"+commit_transaction.SQLErrText GOTO ext END IF INSERT INTO u_invoice ( scid, invoiceid, invoicecode, cusid, cuscode, cusname, currencyname, bankname, invoicedate, relid, relcode, dscrp, opdate, opemp, flag) VALUES ( :scid, :ls_newid, :invoicecode, :cusid, :cuscode, :cusname, :currencyname, :bankname, :invoicedate, :relid, :relcode, :dscrp, :server_dt, :publ_operator, :flag) USING commit_transaction ; IF commit_transaction.SQLCode <> 0 THEN rslt = 0 arg_msg = "因网络或其它原因导致插入操作失败"+"~n"+commit_transaction.SQLErrText GOTO ext END IF //读取新invoiceid invoiceid = ls_newid FOR i = 1 TO it_mxbt INSERT INTO u_invoicemx (scid, invoiceid, mtrlid, mtrlcode, mtrlname, printid, qty, price, amt, dscrp, mtrlmode) VALUES ( :scid, :ls_newid, :invoicemx[i].mtrlid, :invoicemx[i].mtrlcode, :invoicemx[i].mtrlname, :invoicemx[i].printid, :invoicemx[i].qty, :invoicemx[i].price, :invoicemx[i].amt, :invoicemx[i].mxdscrp, :invoicemx[i].mtrlmode) USING commit_transaction; IF commit_transaction.SQLCode <> 0 THEN invoiceid = 0 //还原invoiceid rslt = 0 arg_msg = "因网络或其它原因导致插入明细操作失败"+"~n"+commit_transaction.SQLErrText GOTO ext END IF NEXT ELSE //////////////////////////////////////////////////更新 UPDATE u_invoice SET cusid=:cusid, cuscode=:cuscode, cusname=:cusname, currencyname=:currencyname, bankname=:bankname, invoicedate=:invoicedate, relid=:relid, relcode=:relcode, dscrp=:dscrp, moddate=: server_dt, modemp=:publ_operator WHERE u_invoice.invoiceid = :invoiceid AND u_invoice.scid = :scid AND flag = 0 USING commit_transaction; IF commit_transaction.SQLCode <> 0 OR commit_transaction.SQLNRows <= 0 THEN rslt = 0 arg_msg = "因网络或其它原因导致更新单据操作失败"+"~n"+commit_transaction.SQLErrText GOTO ext END IF //删除原有明细 DELETE FROM u_invoicemx WHERE u_invoicemx.invoiceid = :invoiceid AND u_invoicemx.scid = :scid USING commit_transaction; IF commit_transaction.SQLCode <> 0 THEN rslt = 0 arg_msg = "删除旧有明细操作失败"+"~n"+commit_transaction.SQLErrText GOTO ext END IF FOR i = 1 TO it_mxbt INSERT INTO u_invoicemx (scid, invoiceid, mtrlid, mtrlcode, mtrlname, printid, qty, price, amt, dscrp, mtrlmode) VALUES ( :scid, :invoiceid, :invoicemx[i].mtrlid, :invoicemx[i].mtrlcode, :invoicemx[i].mtrlname, :invoicemx[i].printid, :invoicemx[i].qty, :invoicemx[i].price, :invoicemx[i].amt, :invoicemx[i].mxdscrp, :invoicemx[i].mtrlmode) USING commit_transaction; IF commit_transaction.SQLCode <> 0 THEN rslt = 0 arg_msg = "因网络或其它原因导致插入明细操作失败"+"~n"+commit_transaction.SQLErrText GOTO ext END IF NEXT end if it_newbegin = FALSE it_updatebegin = FALSE ext: IF rslt = 0 THEN ROLLBACK USING commit_transaction; p_clearmx() ELSEIF rslt = 1 AND arg_ifcommit THEN COMMIT USING commit_transaction; END IF RETURN rslt end function public function integer del (long arg_scid, long arg_invoiceid, ref string arg_msg, boolean arg_ifcommit);//如果单据还没有审核删除单据极其明细 //0 FAIL, 1 SUCCESS Int rslt = 1 IF arg_invoiceid <= 0 THEN rslt = 0 arG_MSG = "没有删除对象,操作取消" GOTO ext END IF IF p_getinfo(arg_scid,arg_invoiceid,arG_MSG) = 0 THEN rslt = 0 GOTO ext END IF IF flag = 1 THEN rslt = 0 arG_MSG = "单据已经审核,不可以删除" GOTO ext END IF DELETE FROM u_invoice WHERE u_invoice.invoiceid = :arg_invoiceid AND u_invoice.scid = :arg_scid USING commit_transaction; IF commit_transaction.SQLCode <> 0 THEN rslt = 0 arG_MSG = "删除发票单操作失败"+"~n"+commit_transaction.SQLErrText GOTO ext END IF DELETE FROM u_invoicemx WHERE u_invoicemx.invoiceid = :arg_invoiceid AND u_invoicemx.scid = :arg_scid USING commit_transaction; IF commit_transaction.SQLCode <> 0 THEN rslt = 0 arG_MSG = "删除发票单明细操作失败"+"~n"+commit_transaction.SQLErrText GOTO ext END IF it_newbegin = FALSE it_updatebegin = FALSE ext: IF rslt = 0 THEN ROLLBACK USING commit_transaction; p_reset() ELSEIF rslt = 1 AND arg_ifcommit THEN COMMIT USING commit_transaction; END IF RETURN (rslt) end function public function integer auditing (boolean arg_ifcommit, ref string arg_msg);Long rslt = 1 IF invoiceid = 0 THEN rslt = 0 arg_msg = "没有审核对象" GOTO ext END IF IF flag = 1 THEN rslt = 0 arg_msg = "单据已经审核" GOTO ext END IF UPDATE u_invoice SET auditingrep = :publ_operator, auditingdate = getdate(), flag = 1 WHERE u_invoice.invoiceid = :invoiceid AND flag = 0 AND scid = :scid USING commit_transaction; IF commit_transaction.SQLCode <> 0 THEN rslt = 0 arg_msg = "因网络或其它原因导致审核单据操作失败"+"~n"+commit_transaction.SQLErrText GOTO ext ELSEIF commit_transaction.SQLNRows = 0 THEN rslt = 0 arg_msg = "单据正在审核,请稍后查询。"+"~n"+commit_transaction.SQLErrText GOTO ext END IF flag = 1 ext: IF rslt = 0 THEN ROLLBACK USING commit_transaction; ELSEIF rslt = 1 AND arg_ifcommit THEN COMMIT USING commit_transaction; END IF RETURN rslt end function public function integer c_auditing (boolean arg_ifcommit, ref string arg_msg);Long rslt = 1 DateTime null_dt SetNull(null_dt) IF invoiceid = 0 THEN rslt = 0 arg_msg = "没有审核对象" GOTO ext END IF IF flag = 0 THEN rslt = 0 arg_msg = "单据还未审核" GOTO ext END IF UPDATE u_invoice SET Auditingrep = '', Auditingdate = :null_dt, flag = 0 WHERE u_invoice.invoiceid = :invoiceid AND flag = 1 AND scid = :scid USING commit_transaction; IF commit_transaction.SQLCode <> 0 THEN rslt = 0 arg_msg = "因网络或其它原因导致审核单据操作失败"+"~n"+commit_transaction.SQLErrText GOTO ext ELSEIF commit_transaction.SQLNRows = 0 THEN rslt = 0 arg_msg = "单据正在审核,请稍后查询。"+"~n"+commit_transaction.SQLErrText GOTO ext END IF flag = 0 ext: IF rslt = 0 THEN ROLLBACK USING commit_transaction; ELSEIF rslt = 1 AND arg_ifcommit THEN COMMIT USING commit_transaction; END IF RETURN rslt end function public function integer acceptmx (decimal arg_qty, double arg_price, decimal arg_amt, string arg_mxdscrp, long arg_printid, ref string arg_msg, long arg_mtrlid, string arg_mtrlcode, string arg_mtrlname, string arg_mtrlmode);Long rslt = 1,cnt = 0 IF it_newbegin = FALSE AND it_updatebegin = FALSE THEN rslt = 0 arg_msg = "非编辑状态不可以使用,操作取消" GOTO ext END IF //清除空值 IF IsNull(arg_qty) THEN arg_qty = 0 IF IsNull(arg_price) THEN arg_price = 0 IF IsNull(arg_printid) THEN arg_printid = 0 IF IsNull(arg_amt) THEN arg_amt = 0 IF IsNull(arg_mxdscrp) THEN arg_mxdscrp = '' IF IsNull(arg_mtrlid) THEN arg_mtrlid = 0 IF IsNull(arg_mtrlcode) THEN arg_mtrlcode = '' IF IsNull(arg_mtrlname) THEN arg_mtrlname = '' IF IsNull(arg_mtrlmode) THEN arg_mtrlmode = '' IF arg_qty = 0 THEN rslt = 1 GOTO ext END IF arg_price = Round(arg_amt/arg_qty,8) IF arg_price < 0 THEN rslt = 0 arg_msg = "错误金额或数量,数量与金额的正负方向必须相同,操作取消" GOTO ext END IF //写入内容 it_mxbt++ invoicemx[it_mxbt].mtrlid = arg_mtrlid invoicemx[it_mxbt].mtrlname = arg_mtrlname invoicemx[it_mxbt].qty = arg_qty invoicemx[it_mxbt].amt = Round(arg_amt,2) invoicemx[it_mxbt].price = arg_price invoicemx[it_mxbt].mtrlcode = arg_mtrlcode invoicemx[it_mxbt].mtrlmode = arg_mtrlmode invoicemx[it_mxbt].mxdscrp = arg_mxdscrp invoicemx[it_mxbt].printid = arg_printid ext: IF rslt = 0 THEN p_clearmx() RETURN rslt end function on uo_invoice.create call super::create TriggerEvent( this, "constructor" ) end on on uo_invoice.destroy TriggerEvent( this, "destructor" ) call super::destroy end on