$PBExportHeader$uo_credence.sru $PBExportComments$凭证 forward global type uo_credence from nonvisualobject end type end forward global type uo_credence from nonvisualobject end type global uo_credence uo_credence type variables public protectedwrite LONG credid //凭证自动增量ID public protectedwrite DATETIME billmakerdate //制单时间 public protectedwrite string billmaker //制单 public protectedwrite string billmakerid //制单ID public protectedwrite datetime billcheckdate //审核时间 public protectedwrite string billcheck //审核 public protectedwrite string billcheckid //审核ID public protectedwrite datetime billpostdate //登帐时间 public protectedwrite string billpost //登帐 public protectedwrite int checkflag=0 //审核标记 public protectedwrite int postflag =0 //登帐标记 LONG subaccsetid=0 //子帐ID LONG credno //编号 DATETIME creddate //日期 INT billnumber //附件 STRING credtype //凭证字 long readtype=0 //凭证读类型 long relevantbillid //相关ID[固定资产] LONG cmonth //期间 datetime reldate string reldcode int ifauto private: S_credencemx credencemx[] //明细结构数组 long it_MXBT=0 //明细结构数组末指针 BOOLEAN IT_NEWBEGIN=FALSE //新建标志 BOOLEAN IT_UPDATEBEGIN=FALSE//修改标志 end variables forward prototypes public function integer newbegin () public function integer p_reset () public function integer p_clearmx () public function integer updatebegin (long arg_subaccsetid, long arg_credid, ref string arg_msg) public function integer check (long arg_subaccsetid, long arg_credid, ref string arg_msg, boolean arg_ifcommit) public function integer getinfo (long arg_subaccsetid, long arg_credid, ref string arg_msg) public function integer post_begin (integer arg_posttype, long arg_subaccsetid, ref string arg_msg) public function integer post (long arg_subaccsetid, ref string arg_msg, boolean arg_ifcommit) public function integer balance (boolean if_begin_accset, ref string arg_msg, boolean arg_ifcommit) public function integer cancel_post (long arg_subaccsetid, ref string arg_msg, boolean arg_ifcommit) public function integer cancel_balance (boolean if_del_porfit_loss, ref string arg_msg, boolean arg_ifcommit) public function integer cancel_check (long arg_subaccsetid, long arg_cmonth, long arg_firstcredno, long arg_endcredno, ref string arg_msg, boolean arg_ifcommit) public function integer save (string arg_opemp, ref string arg_msg, boolean arg_ifcommit) public function long get_new_credno (long arg_subaccsetid, string arg_credtype, long arg_cmonth, ref string arg_msg) public function integer p_check_cmonth (long arg_accsetid, long arg_cmonth, ref string arg_msg) public function integer p_check_month_date (long arg_accsetid, long arg_cmonth, datetime arg_creddate, ref string arg_msg) public function integer get_asset_credinfo (long arg_findtype, long arg_relid, long arg_credid, ref long arg_ref_credid, ref integer arg_ref_postflag, ref string arg_msg) public function integer uof_mod_mxdscrp (long arg_accsetid, long arg_credid, long arg_fuluno, string arg_mxdscrp, ref string arg_msg) public function integer cancel_check_1 (long arg_subaccsetid, long arg_credid, integer arg_ifauto_check, ref string arg_msg, boolean arg_ifcommit) public function integer del (integer arg_delmode, long arg_subaccsetid, long arg_credid, ref string arg_msg, boolean arg_ifcommit) public function integer acceptmx (long arg_fuluno, string arg_subid, string arg_brief, double arg_rate, decimal arg_rawdebit, decimal arg_rawcredit, decimal arg_debit, decimal arg_credit, decimal arg_amount, decimal arg_price, long arg_deptid, long arg_itemid, datetime arg_billdate, long arg_billid, string arg_billno, long arg_cropbillid, integer arg_readonly, long arg_cusid, long arg_sptid, long arg_empid, ref string arg_msg) end prototypes public function integer newbegin ();//newbegin() //从置对象,准备建立新凭证 //0 fail 1 success LONG RSLT=1,CNT=0 p_reset() it_newbegin=TRUE it_updatebegin=FALSE IF RSLT=0 THEN p_reset() return RSLT end function public function integer p_reset ();//INT p_RESET() //清除对象及其明细 datetime null_dt setnull(null_dt) credid=0 billmakerdate=null_dt billmaker='' billcheckdate=null_dt billcheck ='' billpostdate=null_dt billpost='' checkflag=0 postflag =0 readtype =0 it_newbegin=FALSE it_updatebegin=FALSE //清除明细 P_CLEARMX() RETURN 1 end function public function integer p_clearmx ();//INT p_clearmx() //清除明细 it_mxbt=0 RETURN 1 end function public function integer updatebegin (long arg_subaccsetid, long arg_credid, ref string arg_msg);//UPDATEbegin(long arg_subaccsetid,long arg_credid,ref string arg_msg) //从置对象,准备更新凭证 //0 fail 1 success Int rslt = 1 IF getinfo(arg_subaccsetid,arg_credid,arg_msg) = 0 THEN rslt = 0 GOTO ext END IF IF checkflag = 1 THEN rslt = 0 arg_msg = '凭证已经过审核,不可以修改' GOTO ext END IF IF readtype = 888 THEN arg_msg = '出纳审核生成的单据,不能修改' rslt = 0 GOTO ext END IF credid = arg_credid subaccsetid = arg_subaccsetid IF checkflag = 0 THEN p_CLEARMX() it_newbegin = FALSE it_updatebegin = TRUE ext: IF rslt = 0 THEN p_RESET() RETURN rslt end function public function integer check (long arg_subaccsetid, long arg_credid, ref string arg_msg, boolean arg_ifcommit);//check(arg_subaccsetid,arg_credid,ref arg_msg,arg_ifcommit) //0 fail 1 success //凭证审核 Long rslt = 1,cnt = 0 IF s_sys_accset.sameuser = 0 THEN IF publ_userid = billmakerid THEN arg_msg = '制单和审核不可以是同一个人' rslt = 0 GOTO ext END IF END IF IF getinfo(arg_subaccsetid,arg_credid,arg_msg) = 0 THEN rslt = 0 GOTO ext END IF IF it_newbegin OR it_updatebegin THEN rslt = 0 arg_msg = "编辑状态下不可以执行审核" GOTO ext END IF IF checkflag = 1 THEN rslt = 0 arg_msg = "凭证已经过审核" GOTO ext END IF SELECT count(*) INTO :cnt FROM u_user Where u_user.username = : publ_operator; 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 cw_credence SET billcheckid = :publ_userid, billcheck = :publ_operator, billcheckdate = getdate(), checkflag = 1 WHERE cw_credence.credid = :arg_credid AND cw_credence.checkflag = 0 AND cw_credence.accsetid = :sys_accsetid AND cw_credence.subaccsetid = :arg_subaccsetid; 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 checkflag = 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_subaccsetid, long arg_credid, ref string arg_msg);//取凭证信息 Int rslt = 1 IF arg_credid <= 0 THEN rslt = 0 credid = 0 arg_msg = '凭证ID错误' GOTO ext END IF IF arg_subaccsetid <> 0 THEN rslt = 0 subaccsetid = 0 arg_msg = '子帐ID错误' GOTO ext END IF SELECT cw_credence.credno, cw_credence.cmonth, cw_credence.creddate, cw_credence.billnumber, cw_credence.billmaker, cw_credence.billmakerdate, cw_credence.billcheck, cw_credence.billcheckdate, cw_credence.billpost, cw_credence.billpostdate, cw_credence.checkflag, cw_credence.postflag, cw_credence.credtype, cw_credence.readtype, cw_credence.relevantbillid, cw_credence.reldcode, cw_credence.reldate, cw_credence.ifauto INTO :credno, :cmonth, :creddate, :billnumber, :billmaker, :billmakerdate, :billcheck, :billcheckdate, :billpost, :billpostdate, :checkflag, :postflag, :credtype, :readtype, :relevantbillid, :reldcode, :reldate, :ifauto FROM cw_credence WHERE cw_credence.credid = :arg_credid AND cw_credence.accsetid = :sys_accsetid AND cw_credence.subaccsetid = :arg_subaccsetid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '查询数据操作失败,凭证' GOTO ext END IF it_newbegin = FALSE it_updatebegin = FALSE ext: RETURN rslt end function public function integer post_begin (integer arg_posttype, long arg_subaccsetid, ref string arg_msg);//检查凭证号是否连续 //p_post_begin(arg_posttype,arg_subaccsetid,ref arg_msg) //arg_posttype //查凭证字 //1:不连续时终止登帐 2:不连续时可以登帐 //1:yes 0:no int rslt = 1 long cnt,i long piror_credno,next_credno string arr_credtype[],ls_credtype int cnt_credtype if arg_subaccsetid <> 0 then arg_msg = '非法帐套,不能登帐' rslt = 0 goto ext end if select count(credid) into :cnt from cw_credence where cw_credence.postflag = 0 and cw_credence.checkflag = 1 and cw_credence.accsetid = :sys_accsetid and (cw_credence.subaccsetid = :arg_subaccsetid) and cw_credence.cmonth = :sys_curyearmon; if sqlca.sqlcode <> 0 then arg_msg = '查询凭证数失败' rslt = 0 goto ext end if if cnt = 0 then rslt = 1 goto ext end if if arg_posttype = 2 then rslt = 1 goto ext end if //*******************查凭证字 DECLARE cur_credtype CURSOR FOR SELECT cw_Credenceword.Credenceword FROM cw_Credenceword where cw_Credenceword.accsetid = :sys_accsetid; open cur_credtype; fetch cur_credtype into :ls_credtype; do while sqlca.sqlcode = 0 cnt_credtype++ arr_credtype[cnt_credtype] = trim(ls_credtype) fetch cur_credtype into :ls_credtype; loop close cur_credtype; if cnt_credtype = 0 then cnt_credtype++ arr_credtype[cnt_credtype]='' end if //******************** for i = 1 to cnt_credtype declare credno_cur cursor for select cw_credence.credno from cw_credence where cw_credence.accsetid = :sys_accsetid and cw_credence.subaccsetid = :arg_subaccsetid and cw_credence.cmonth = :sys_curyearmon and cw_credence.credtype = :arr_credtype[i] order by cw_credence.credno; open credno_cur; fetch credno_cur into :next_credno; piror_credno = next_credno - 1 do while sqlca.sqlcode = 0 if piror_credno + 1 <> next_credno then arg_msg = '帐套凭证号不连续,不能登帐.凭证字:'+arr_credtype[i]+'凭证号:'+string(piror_credno)+'→'+string(next_credno) rslt = 0 goto ext end if piror_credno = next_credno fetch credno_cur into :next_credno; loop close credno_cur; next ext: return rslt end function public function integer post (long arg_subaccsetid, ref string arg_msg, boolean arg_ifcommit);//post(arg_subaccsetid,ref arg_msg,arg_ifcommit) //0 fail 1 success //登帐 //1.更新登帐标记 //2.写入balance表[先更新,再插入] //2.2 更新父科目 //2.3 更新0子帐 //暂不处理 //2.4 更新父科目 //暂不处理 Long rslt = 1,cnt = 0,ds_cnt,i,credence_cnt = 0 datastore ds_update_balance Decimal ls_rawdebit,ls_rawcredit,ls_debit,ls_credit,ls_damount,ls_camount Decimal ls_erawdebit,ls_erawcredit,ls_edebit,ls_ecredit String ls_subid uo_subject uo_sub String p_subid Int ls_dcflag,li_hswb IF arg_subaccsetid <> 0 THEN arg_msg = '非法帐套,不能登帐' rslt = 0 GOTO ext END IF SELECT count(*) INTO :cnt FROM u_user WHERE u_user.username = :publ_operator; 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 credence_cnt = 0 SELECT count(credid) INTO :credence_cnt FROM cw_credence WHERE cw_credence.postflag = 0 AND cw_credence.checkflag = 1 AND cw_credence.accsetid = :sys_accsetid AND ( cw_credence.subaccsetid = :arg_subaccsetid) AND ( cw_credence.cmonth = :sys_curyearmon ); IF sqlca.SQLCode <> 0 THEN arg_msg = '查询期间要登帐凭证数失败' rslt = 0 GOTO ext END IF IF credence_cnt = 0 THEN rslt = 1 GOTO zero END IF ds_update_balance = CREATE datastore ds_update_balance.DataObject = "ds_update_balance" ds_update_balance.SetTransObject(sqlca) uo_sub = CREATE uo_subject ds_cnt = 0 ds_update_balance.Retrieve(sys_accsetid,0,sys_curyearmon) ds_cnt = ds_update_balance.RowCount() IF ds_cnt = 0 THEN rslt = 1 GOTO update_credence END IF FOR i = 1 TO ds_cnt ls_subid = ds_update_balance.Object.subid[i] //***查询余额方向 ls_dcflag = f_get_dcflag(ls_subid,arg_msg) IF ls_dcflag = -1 THEN rslt = 0 GOTO ext END IF ls_rawdebit = ds_update_balance.Object.rawdebit[i] ls_rawcredit = ds_update_balance.Object.rawcredit[i] ls_debit = ds_update_balance.Object.debit[i] ls_credit = ds_update_balance.Object.credit[i] ls_damount = ds_update_balance.Object.damount[i] ls_camount = ds_update_balance.Object.camount[i] li_hswb = ds_update_balance.Object.cw_subject_hswb[i] IF ls_dcflag = 1 THEN IF li_hswb = 1 THEN ls_erawdebit = ls_rawdebit - ls_rawcredit ls_erawcredit = 0 ELSE ls_erawdebit = 0 ls_erawcredit = 0 END IF ls_edebit = ls_debit - ls_credit ls_ecredit = 0 ELSE IF li_hswb = 1 THEN ls_erawdebit = 0 ls_erawcredit = ls_rawcredit - ls_rawdebit ELSE ls_erawdebit = 0 ls_erawcredit = 0 END IF ls_edebit = 0 ls_ecredit = ls_credit - ls_debit END IF UPDATE cw_balance SET rawdebit = rawdebit + :ls_rawdebit, rawcredit = rawcredit + :ls_rawcredit, yrawdebit = yrawdebit + :ls_rawdebit, yrawcredit = yrawcredit + :ls_rawcredit, erawdebit = erawdebit + :ls_erawdebit, erawcredit = erawcredit + :ls_erawcredit, debit = debit + :ls_debit, credit = credit + :ls_credit, edebit = edebit + :ls_edebit, ecredit = ecredit + :ls_ecredit, ydebit = ydebit + :ls_debit, ycredit = ycredit + :ls_credit, damt = damt + :ls_damount, camt = camt + :ls_camount, ydamt = ydamt + :ls_damount, ycamt = ycamt + :ls_camount WHERE accsetid = :sys_accsetid AND subaccsetid = 0 AND subid = :ls_subid AND yearmon = :sys_curyearmon; IF sqlca.SQLCode = 0 THEN IF sqlca.SQLNRows = 0 THEN INSERT cw_balance(accsetid,subaccsetid,subid,yearmon,rawdebit,rawcredit, erawdebit,erawcredit,yrawdebit,yrawcredit,debit,credit, edebit,ecredit,ydebit,ycredit, damt,camt,ydamt,ycamt) VALUES(:sys_accsetid, 0,:ls_subid,:sys_curyearmon,:ls_rawdebit,:ls_rawcredit, :ls_erawdebit,:ls_erawcredit,:ls_rawdebit,:ls_rawcredit,:ls_debit,:ls_credit, :ls_edebit,:ls_ecredit,:ls_debit,:ls_credit, :ls_damount,:ls_camount,:ls_damount,:ls_camount); IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '0子帐登帐失败,'+sqlca.SQLErrText GOTO ext END IF END IF ELSE rslt = 0 arg_msg = '0子帐登帐失败,'+sqlca.SQLErrText GOTO ext END IF //更新父科目 p_subid = '' zero_update_p: p_subid = uo_sub.p_parent_subid(ls_subid) IF p_subid = '' THEN ELSE UPDATE cw_balance SET rawdebit = rawdebit + :ls_rawdebit, rawcredit = rawcredit + :ls_rawcredit, yrawdebit = yrawdebit + :ls_rawdebit, yrawcredit = yrawcredit + :ls_rawcredit, erawdebit = erawdebit + :ls_erawdebit , erawcredit = erawcredit + :ls_erawcredit, debit = debit + :ls_debit, credit = credit + :ls_credit, edebit = edebit + :ls_edebit, ecredit = ecredit + :ls_ecredit, ydebit = ydebit + :ls_debit, ycredit = ycredit + :ls_credit, damt = damt + :ls_damount, camt = camt + :ls_camount, ydamt = ydamt + :ls_damount, ycamt = ycamt + :ls_camount WHERE accsetid = :sys_accsetid AND subaccsetid = 0 AND subid = :p_subid AND yearmon = :sys_curyearmon; IF sqlca.SQLCode = 0 THEN IF sqlca.SQLNRows = 0 THEN INSERT cw_balance(accsetid,subaccsetid,subid,yearmon,rawdebit,rawcredit, erawdebit,erawcredit,yrawdebit,yrawcredit,debit,credit, edebit,ecredit,ydebit,ycredit, damt,camt,ydamt,ycamt) VALUES(:sys_accsetid, 0,:p_subid,:sys_curyearmon,:ls_rawdebit,:ls_rawcredit, :ls_erawdebit,:ls_erawcredit,:ls_rawdebit,:ls_rawcredit,:ls_debit,:ls_credit, :ls_edebit,:ls_ecredit,:ls_debit,:ls_credit, :ls_damount,:ls_camount,:ls_damount,:ls_camount); IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '0子帐登帐失败[更新父科目金额],'+sqlca.SQLErrText GOTO ext END IF END IF ELSE rslt = 0 arg_msg = '0子帐登帐失败,'+sqlca.SQLErrText GOTO ext END IF ls_subid = p_subid GOTO zero_update_p END IF NEXT update_credence: UPDATE cw_credence SET billpost = :publ_operator, billpostdate = getdate(), postflag = 1 WHERE cw_credence.postflag = 0 AND cw_credence.checkflag = 1 AND cw_credence.accsetid = :sys_accsetid AND ( cw_credence.subaccsetid = :arg_subaccsetid) AND ( cw_credence.cmonth = :sys_curyearmon ); 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 //更新累计折旧 IF f_balc_astbalance(1,sys_curyearmon,arg_msg,FALSE) = 0 THEN rslt = 0 GOTO ext END IF zero: arg_msg = '共有 '+String(credence_cnt) +' 张登帐' ext: IF rslt = 0 THEN ROLLBACK ; ELSEIF rslt = 1 AND arg_ifcommit THEN COMMIT; END IF RETURN rslt end function public function integer balance (boolean if_begin_accset, ref string arg_msg, boolean arg_ifcommit);//期末结帐 //balance(if_begin_accset,ref arg_msg,arg_ifcommit) //if_begin_accset: //true:启动帐套 false:一般结帐 //1:success 0:fail //1.查询当前期间有无凭证未过帐[未审核] //2.将每个科目 年初/期初/本年累计/期末数 复制一份到下一期间 //2.1固定资产自动加入下月 //3.更新帐套当前期间 Int rslt = 1 Long cred_nocheck_cnt,cred_nopost_cnt,cnt Long next_yearmon IF if_begin_accset THEN //启动帐套 //////加入0子帐 INSERT cw_balance(accsetid,subaccsetid,SubID,YearMon,YBRawDebit,YBRawCredit, BrawDebit,BrawCredit,ErawDebit,ErawCredit,YrawDebit,YrawCredit, YBDebit,YBCredit,Bdebit,Bcredit,Edebit,Ecredit,Ydebit,Ycredit, ybamt,ydamt,ycamt,bamt) SELECT :sys_accsetid,0,SubID,:sys_curyearmon,YBRawDebit,YBRawCredit, BrawDebit,BrawCredit,ErawDebit,ErawCredit,YrawDebit,YrawCredit, YBDebit,YBCredit,Bdebit,Bcredit,Edebit,Ecredit,Ydebit,Ycredit, bamount + camount - damount,damount,camount,bamount FROM uv_yminitbala Where accsetid = :sys_accsetid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '0子帐结帐失败,'+sqlca.SQLErrText GOTO ext END IF //初始化固定资产累计折旧表 IF f_init_astbalance(1,sys_startyearmon,sys_startyearmon,arg_msg,False) = 0 THEN rslt = 0 GOTO ext END IF ELSE // //一般结帐 SELECT sum(num1+num2) INTO :cnt FROM uv_cwauditingflag_num Where cmonth = :sys_curyearmon; IF sqlca.SQLCode <> 0 THEN arg_msg = '查询本期是否有未会计审核的业务单据失败,'+sqlca.SQLErrText rslt = 0 GOTO ext END IF IF cnt > 0 THEN arg_msg = '本期尚有'+String(cnt)+'张业务单据未会计审核,请先将这些单据会计审核或调整日期' rslt = 0 GOTO ext END IF SELECT count(credid) INTO :cred_nopost_cnt FROM cw_credence WHERE cw_credence.postflag = 0 AND cw_credence.accsetid = :sys_accsetid And cw_credence.cmonth = :sys_curyearmon; IF sqlca.SQLCode <> 0 THEN arg_msg = '查询未登帐凭证数失败' rslt = 0 GOTO ext END IF SELECT count(credid) INTO :cred_nocheck_cnt FROM cw_credence WHERE cw_credence.checkflag = 0 AND cw_credence.accsetid = :sys_accsetid And cw_credence.cmonth = :sys_curyearmon; IF sqlca.SQLCode <> 0 THEN arg_msg = '查询未审核凭证数失败' rslt = 0 GOTO ext END IF IF IsNull(cred_nopost_cnt) THEN cred_nopost_cnt = 0 IF IsNull(cred_nocheck_cnt) THEN cred_nocheck_cnt = 0 IF cred_nopost_cnt <> 0 And cred_nocheck_cnt = 0 THEN arg_msg = '本期尚有'+String(cred_nopost_cnt)+'张凭证未登帐,不能进行结帐' rslt = 0 GOTO ext ELSEIF cred_nocheck_cnt <> 0 And cred_nocheck_cnt <> 0 THEN arg_msg = '本期尚有'+String(cred_nopost_cnt)+'张凭证未登帐,其中'+String(cred_nocheck_cnt)+'张是未审核过的,不能进行结帐' rslt = 0 GOTO ext END IF //2.将每个科目 年初/期初/本年累计/期末数 复制一份到下一期间 IF Right(String(sys_curyearmon),2) = '12' THEN next_yearmon = Long(String(Long(Left(String(sys_curyearmon),4)) + 1) + '01') DELETE FROM cw_balance WHERE accsetid = :sys_accsetid And YearMon = :next_yearmon; IF sqlca.SQLCode <> 0 THEN arg_msg = '删除帐套月份:'+String(next_yearmon)+',结帐数据失败,'+sqlca.SQLErrText rslt = 0 GOTO ext END IF INSERT cw_balance(accsetid,subaccsetid,SubID,YearMon, YBRawDebit,YBRawCredit,BrawDebit,BrawCredit, ErawDebit,ErawCredit,YrawDebit,YrawCredit, YBDebit,YBCredit,Bdebit,Bcredit, Edebit,Ecredit,Ydebit,Ycredit, ybamt,ydamt,ycamt,bamt) SELECT :sys_accsetid,subaccsetid,SubID,:next_yearmon, eRawDebit,eRawCredit,BrawDebit,BrawCredit, ErawDebit,ErawCredit,0,0, Edebit,Ecredit,Bdebit,Bcredit, Edebit,Ecredit,0,0, bamt,0,0,bamt FROM uv_ymbala Where accsetid = :sys_accsetid; ELSE next_yearmon = sys_curyearmon + 1 DELETE FROM cw_balance WHERE accsetid = :sys_accsetid And YearMon = :next_yearmon; IF sqlca.SQLCode <> 0 THEN arg_msg = '删除帐套月份:'+String(next_yearmon)+',结帐数据失败,'+sqlca.SQLErrText rslt = 0 GOTO ext END IF INSERT cw_balance(accsetid,subaccsetid,SubID,YearMon,YBRawDebit,YBRawCredit, BrawDebit,BrawCredit,ErawDebit,ErawCredit,YrawDebit,YrawCredit, YBDebit,YBCredit,Bdebit,Bcredit,Edebit,Ecredit,Ydebit,Ycredit, ybamt,ydamt,ycamt,bamt) SELECT :sys_accsetid,subaccsetid,SubID,:next_yearmon,YBRawDebit,YBRawCredit, BrawDebit,BrawCredit,ErawDebit,ErawCredit,YrawDebit,YrawCredit, YBDebit,YBCredit,Bdebit,Bcredit,Edebit,Ecredit,Ydebit,Ycredit, ybamt,ydamt,ycamt,bamt FROM uv_ymbala Where accsetid = :sys_accsetid; END IF IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '结帐失败,'+sqlca.SQLErrText GOTO ext END IF //初始化下月固定资产累计折旧表 IF f_init_astbalance(1,sys_curyearmon,next_yearmon,arg_msg,False) = 0 THEN rslt = 0 GOTO ext END IF //3.更新当前会计期间 IF Right(String(sys_curyearmon),2) = '12' THEN UPDATE cw_accset SET curryear = :s_sys_accset.curryear + 1, currmon = 1, curyearmon = (:s_sys_accset.curryear + 1) * 100 + 1 Where accsetid = :sys_accsetid; ELSE UPDATE cw_accset SET currmon = currmon + 1 ,curyearmon = curyearmon + 1 Where accsetid = :sys_accsetid; END IF IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '更新当前帐套的当前期间失败' GOTO ext END IF //4.更新月历 IF Right(String(sys_curyearmon),2) = '12' THEN Long next_y,ll_cnt_next_y s_calendar s_calendar_array[] next_y = Long(Left(String(sys_curyearmon),4)) + 1 SELECT count(*) INTO :ll_cnt_next_y FROM cw_calendar WHERE Year(sdate) = :next_y And accsetid = :sys_accsetid; IF sqlca.SQLCode <> 0 THEN ll_cnt_next_y = 0 IF ll_cnt_next_y = 0 THEN f_init_calendar_array(next_y,s_calendar_array[]) Long k FOR k = 1 To UpperBound(s_calendar_array) INSERT INTO cw_calendar(accsetid,cmonth,sdate,edate) Values(:sys_accsetid,:s_calendar_array[k].cmonth,:s_calendar_array[k].sdate,:s_calendar_array[k].edate); IF sqlca.SQLCode <> 0 THEN arg_msg = '加入新月历失败' rslt = 0 GOTO ext END IF NEXT END IF 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 cancel_post (long arg_subaccsetid, ref string arg_msg, boolean arg_ifcommit);//反登帐 //cancel_post(arg_subaccsetid,ref arg_msg,arg_ifcommit) //0 fail 1 success //1.更新凭证登帐标记 //2.写入balance表[先更新,再插入] //2.1 更新0子帐 //2.2 更新总帐 Long rslt = 1,cnt = 0,ds_cnt,i datastore ds_update_balance Dec ls_rawdebit,ls_rawcredit,ls_debit,ls_credit,ls_amount String ls_subid DateTime null_date IF arg_subaccsetid <> 0 THEN arg_msg = '非法帐套,不能反登帐' rslt = 0 GOTO ext END IF SELECT count(*) INTO :cnt FROM u_user Where u_user.username = :publ_operator; 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(credid) INTO :cnt FROM cw_credence WHERE cw_credence.postflag = 1 AND cw_credence.checkflag = 1 AND cw_credence.accsetid = :sys_accsetid AND ( cw_credence.subaccsetid = :arg_subaccsetid) AND ( cw_credence.cmonth = :sys_curyearmon ); IF sqlca.SQLCode <> 0 THEN arg_msg = '查询期间要反登帐凭证数失败' rslt = 0 GOTO ext END IF IF cnt = 0 THEN rslt = 1 GOTO ext END IF //1.更新凭证登帐标记 SetNull(null_date) UPDATE cw_credence SET billpost = '', billpostdate = :null_date, postflag = 0 WHERE cw_credence.postflag = 1 AND cw_credence.checkflag = 1 AND cw_credence.accsetid = :sys_accsetid AND ( cw_credence.subaccsetid = :arg_subaccsetid) AND ( cw_credence.cmonth = :sys_curyearmon ); 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 UPDATE cw_balance SET yrawdebit = yrawdebit - rawdebit, yrawcredit = yrawcredit - rawcredit, erawdebit = brawdebit , erawcredit = brawcredit, rawdebit = 0, rawcredit = 0, ydebit = ydebit - debit, ycredit = ycredit - credit, edebit = bdebit, ecredit = bcredit, debit = 0, credit = 0, damt = 0, camt = 0, ydamt = ydamt - damt, ycamt = ycamt - camt WHERE accsetid = :sys_accsetid AND subaccsetid = :arg_subaccsetid AND yearmon = :sys_curyearmon; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '0子帐反登帐失败,'+sqlca.SQLErrText GOTO ext END IF //更新累计折旧 IF f_balc_astbalance(0,sys_curyearmon,arg_msg,FALSE) = 0 THEN rslt = 0 GOTO ext END IF arg_msg = '共有 '+String(cnt) +' 张反登帐' ext: IF rslt = 0 THEN ROLLBACK ; ELSEIF rslt = 1 AND arg_ifcommit THEN COMMIT; END IF RETURN rslt end function public function integer cancel_balance (boolean if_del_porfit_loss, ref string arg_msg, boolean arg_ifcommit);//反期末结帐 //cancel_balance(if_begin_accset,ref arg_msg,arg_ifcommit) //1:success 0:fail //1.删除当前期间balance //2.更新当前期间凭证的登帐标记 //3.是否将结转本期损益产生的记帐凭证删除 //4.更新帐套当前期间 int rslt = 1 datetime null_datetime setnull(null_datetime) if s_sys_accset.startyear = s_sys_accset.curryear and s_sys_accset.startyearmon = s_sys_accset.currmon then rslt = 0 arg_msg = '反结帐失败,不能反结帐到启用会计期间之前' goto ext end if //删除累计折旧 if f_init_astbalance(0,sys_curyearmon,sys_curyearmon,arg_msg,false) = 0 then rslt = 0 goto ext end if //1.删除结帐[0子帐和总帐] delete from cw_balance where accsetid = :sys_accsetid and yearmon = :sys_curyearmon; if sqlca.sqlcode <> 0 then rslt = 0 arg_msg = '反结帐失败,'+sqlca.sqlerrtext goto ext end if //2.更新当前期间凭证的登帐标记 update cw_credence set postflag = 0, billpost = '', billpostdate = :null_datetime where cw_credence.accsetid = :sys_accsetid and cw_credence.cmonth = :sys_curyearmon; if sqlca.sqlcode <> 0 then arg_msg = '反结帐失败,更新当前期间凭证登帐标记失败' rslt = 0 goto ext end if //3.是否将结转本期损益产生的记帐凭证删除 if if_del_porfit_loss then delete from cw_credence where cw_credence.accsetid = :sys_accsetid and cw_credence.cmonth = :sys_curyearmon and cw_credence.readtype = 100; if sqlca.sqlcode <> 0 then arg_msg = '反结帐失败>>将结转本期损益产生的记帐凭证删除失败' rslt = 0 goto ext end if end if //4.更新帐套当前期间 if right(string(sys_curyearmon),2) = '01' then update cw_accset set curryear = :s_sys_accset.curryear - 1, currmon = 12, curyearmon = (:s_sys_accset.curryear - 1) * 100 + 12 where accsetid = :sys_accsetid; else update cw_accset set currmon = currmon - 1 ,curyearmon = curyearmon - 1 where accsetid = :sys_accsetid; end if if sqlca.sqlcode <> 0 then rslt = 0 arg_msg = '更新当前帐套的当前期间失败' goto ext end if //5.删除月历 if right(string(sys_curyearmon),2) = '01' then long cur_year cur_year = s_sys_accset.curryear delete from cw_calendar where accsetid = :sys_accsetid and cmonth > :cur_year * 100 and cmonth < :cur_year * 100 + 13 ; if sqlca.sqlcode <> 0 then rslt = 0 arg_msg = '删除月历失败' 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 public function integer cancel_check (long arg_subaccsetid, long arg_cmonth, long arg_firstcredno, long arg_endcredno, ref string arg_msg, boolean arg_ifcommit);//反审核 //cancel_check(arg_subaccsetid,arg_credid,ref arg_msg,arg_ifcommit) //0 fail 1 success Long rslt = 1,cnt = 0,cred_cnt = 0 DateTime null_date SetNull(null_date) SELECT count(credid) INTO :cred_cnt FROM cw_credence WHERE cw_credence.checkflag = 1 AND cw_credence.postflag = 0 AND cw_credence.cmonth = :arg_cmonth AND cw_credence.credno >= :arg_firstcredno AND cw_credence.credno <= :arg_endcredno AND cw_credence.accsetid = :sys_accsetid AND cw_credence.ifauto = 0 AND ( cw_credence.subaccsetid = :arg_subaccsetid OR :arg_subaccsetid = -1 ) ; IF sqlca.SQLCode <> 0 THEN rslt = 0 arG_MSG = "查询已审核未登帐凭证数失败" GOTO ext END IF IF IsNull(cred_cnt) THEN cred_cnt = 0 END IF IF cred_cnt = 0 THEN rslt = 1 GOTO ext END IF cnt = 0 SELECT count(*) INTO :cnt FROM u_user Where u_user.username = :publ_operator; 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 cw_credence SET billcheckid = '', billcheck = '', billcheckdate = :null_date, checkflag = 0 WHERE cw_credence.checkflag = 1 AND cw_credence.postflag = 0 AND cw_credence.cmonth = :arg_cmonth AND cw_credence.credno >= :arg_firstcredno AND cw_credence.credno <= :arg_endcredno AND cw_credence.accsetid = :sys_accsetid AND ( cw_credence.subaccsetid = :arg_subaccsetid OR :arg_subaccsetid = -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 ext: IF rslt = 1 THEN arG_MSG = "反审核凭证成功,共反审"+String(cred_cnt)+"张凭证" END IF IF rslt = 0 THEN ROLLBACK ; ELSEIF rslt = 1 AND arg_ifcommit THEN COMMIT; END IF RETURN rslt end function public function integer save (string arg_opemp, ref string arg_msg, boolean arg_ifcommit);//save(ref string arg_msg,boolean arg_ifcommit) // 新建(credid=0)\更新(credid>0) //0 fail 1 success // // 函数执行凭证操作 // 函数在表 cw_credence、cw_credencemx 记帐 // 1 检查单据信息合法性 // 2 新建-取得单据编号\新建凭证\读取凭证唯一码\插入明细 // 2 修改-更新凭证\删除旧明细\插入明细 // 3 提交,修改状态标志 Integer rslt = 1,cnt = 0,i DateTime server_datetime Long ls_newid String errmsg = '' uo_rapmoney uo_corpbill uo_corpbill = Create uo_rapmoney IF IsNull(subaccsetid) THEN subaccsetid = 0 IF IsNull(credno) THEN credno = 0 IF IsNull(billnumber) THEN billnumber = 0 IF IsNull(credtype) THEN credtype = '' IF IsNull(reldcode) THEN reldcode = '' IF IsNull(cmonth) THEN cmonth = 0 IF IsNull(ifauto) THEN ifauto = 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 subaccsetid <> 0 THEN rslt = 0 arG_MSG = '子帐ID错误,请检查' GOTO ext END IF IF p_check_cmonth(sys_accsetid,cmonth,arG_MSG) = 0 THEN rslt = 0 GOTO ext END IF IF p_check_month_date(sys_accsetid,cmonth,creddate,arG_MSG) = 0 THEN rslt = 0 GOTO ext END IF If (sys_option_credno_save = 1 ) And it_newbegin THEN credno = get_new_credno(0,credtype,cmonth,arG_MSG) IF Trim(arG_MSG) <> '' THEN rslt = 0 GOTO ext END IF ELSE IF credno = 0 THEN rslt = 0 arG_MSG = '凭证编号错误,请检查' GOTO ext END IF END IF IF it_newbegin THEN cnt = 0 SELECT count(credno) INTO :cnt FROM cw_credence WHERE cw_credence.accsetid = :sys_accsetid AND cw_credence.cmonth = :cmonth AND cw_credence.subaccsetid = :subaccsetid AND cw_credence.credno = :credno And cw_credence.credtype = :credtype; IF sqlca.SQLCode = -1 THEN rslt = 0 arG_MSG = '查询凭证编号失败' GOTO ext END IF IF cnt > 0 THEN rslt = 0 arG_MSG = '该帐套已经存在该凭证编号:'+credtype+string(credno)+',请检查' GOTO ext END IF END IF IF it_mxbt = 0 THEN rslt = 0 arG_MSG = "没有正确凭证明细内容" GOTO ext END IF IF Year(Date(creddate)) < 1900 Or IsNull(creddate) THEN rslt = 0 arG_MSG = "缺少日期或日期不合理" GOTO ext END IF IF arg_opemp <> '机制' THEN cnt = 0 SELECT count(*) INTO :cnt FROM u_user Where username = :arg_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 END IF ////////////////////////////////////////////// //开始区分:新建/更新 处理 IF credid = 0 THEN //新建 billmaker = arg_opemp billmakerdate = server_datetime //填写凭证建立时间(最近修改时间) ls_newid = f_sys_scidentity(sys_accsetid,"cw_credence","credid",errmsg,True,id_sqlca) IF ls_newid <= 0 THEN arG_MSG = errmsg rslt = 0 GOTO ext END IF INSERT INTO cw_credence ( accsetid, subaccsetid, credid, credno, cmonth, creddate, billnumber, billmaker, billmakerid, billmakerdate, checkflag, postflag, credtype, Readtype, relevantbillid, reldcode, reldate, ifauto) VALUES ( :sys_accsetid, :subaccsetid, :ls_newid, :credno, :cmonth, :creddate, :billnumber, :billmaker, :billmakerid, :billmakerdate, :checkflag, :postflag, :credtype, :Readtype, :relevantbillid, :reldcode, :reldate, :ifauto) ; IF sqlca.SQLCode <> 0 THEN rslt = 0 arG_MSG = "因网络或其它原因导致新建凭证操作失败"+"~n"+sqlca.SQLErrText GOTO ext END IF FOR i = 1 To it_mxbt INSERT INTO cw_credencemx ( accsetid, subaccsetid, credid, fuluno, subid, brief, rate, rawdebit, rawcredit, debit, credit, amount, price, deptid, itemid, billdate, billid, billno, cropbillid, cusid, sptid, empid) VALUES (:sys_accsetid, :subaccsetid, :ls_newid, :credencemx[i].fuluno, :credencemx[i].subid, :credencemx[i].brief, :credencemx[i].rate, :credencemx[i].rawdebit, :credencemx[i].rawcredit, :credencemx[i].debit, :credencemx[I].credit, :credencemx[I].amount, :credencemx[I].price, :credencemx[i].deptid, :credencemx[i].itemid, :credencemx[i].billdate, :credencemx[i].billid, :credencemx[i].billno, :credencemx[i].cropbillid, :credencemx[i].cusid, :credencemx[i].sptid, :credencemx[i].empid); IF sqlca.SQLCode <> 0 THEN credid = 0 //还原outWAREID rslt = 0 arG_MSG = "因网络或其它原因导致新建凭证明细操作失败"+"~n"+sqlca.SQLErrText GOTO ext END IF NEXT credid = ls_newid ELSE //////////////////////////////////////////////// //更新 UPDATE cw_credence SET credno = :credno, creddate = :creddate, billnumber = :billnumber, modemp = :arg_opemp, moddate = getdate(), checkflag = :checkflag, postflag = :postflag, credtype = :credtype, readtype = :readtype, reldcode = :reldcode, reldate = :reldate, ifauto = :ifauto WHERE cw_credence.accsetid = :sys_accsetid AND cw_credence.credid = :credid And cw_credence.subaccsetid = :subaccsetid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arG_MSG = "因网络或其它原因导致更新凭证操作失败"+"~n"+sqlca.SQLErrText GOTO ext END IF //删除原有明细 DELETE FROM cw_credencemx Where cw_credencemx.accsetid = :sys_accsetid And credid = :credid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arG_MSG = "删除旧有凭证明细操作失败"+"~n"+sqlca.SQLErrText GOTO ext END IF FOR i = 1 To it_mxbt INSERT INTO cw_credencemx ( accsetid, subaccsetid, credid, fuluno, subid, brief, rate, rawdebit, rawcredit, debit, credit, amount, price, deptid, itemid, billdate, billid, billno, cropbillid, cusid, sptid, empid) VALUES (:sys_accsetid, :subaccsetid, :credid, :credencemx[i].fuluno, :credencemx[i].subid, :credencemx[i].brief, :credencemx[i].rate, :credencemx[i].rawdebit, :credencemx[i].rawcredit, :credencemx[i].debit, :credencemx[I].credit, :credencemx[I].amount, :credencemx[I].price, :credencemx[i].deptid, :credencemx[i].itemid, :credencemx[i].billdate, :credencemx[i].billid, :credencemx[I].billno, :credencemx[i].cropbillid, :credencemx[i].cusid, :credencemx[i].sptid, :credencemx[i].empid); IF sqlca.SQLCode <> 0 THEN rslt = 0 arG_MSG = "因网络或其它原因新建凭证明细操作失败"+"~n"+sqlca.SQLErrText GOTO ext END IF NEXT END IF it_newbegin = False it_updatebegin = False ext: IF rslt = 0 THEN ROLLBACK; credid = 0 p_clearmx() ELSEIF rslt = 1 And arg_ifcommit THEN COMMIT; END IF Destroy uo_corpbill Return(rslt) end function public function long get_new_credno (long arg_subaccsetid, string arg_credtype, long arg_cmonth, ref string arg_msg);//取凭证编号 Long max_credno,rslt_credno,cnt_credno Long piror_credno,next_credno datastore ds_credno ds_credno = Create datastore ds_credno.DataObject = 'ds_credno' ds_credno.SetTransObject(sqlca) Long i p_check_cmonth(sys_accsetid,arg_cmonth,arg_msg) SELECT max(credno) INTO :max_credno FROM cw_credence with (nolock) WHERE accsetid = :sys_accsetid AND subaccsetid = :arg_subaccsetid AND cmonth = :arg_cmonth And credtype = :arg_credtype; IF sqlca.SQLCode <> 0 THEN rslt_credno = 1 GOTO ext END IF IF IsNull(max_credno) THEN max_credno = 0 SELECT count(*) INTO :cnt_credno FROM cw_credence with (nolock) WHERE accsetid = :sys_accsetid AND subaccsetid = :arg_subaccsetid AND cmonth = :arg_cmonth And credtype = :arg_credtype; IF sqlca.SQLCode <> 0 THEN rslt_credno = 1 GOTO ext END IF IF IsNull(cnt_credno) THEN cnt_credno = 0 IF max_credno = cnt_credno THEN rslt_credno = max_credno + 1 ELSE ds_credno.Retrieve(sys_accsetid,arg_subaccsetid,arg_cmonth,arg_credtype) FOR i = 1 To ds_credno.RowCount() next_credno = ds_credno.Object.credno[i] IF i = 1 THEN IF next_credno <> 1 THEN rslt_credno = 1 GOTO ext END IF ELSE IF piror_credno + 1 <> next_credno THEN rslt_credno = piror_credno + 1 GOTO ext END IF END IF piror_credno = next_credno NEXT END IF ext: Destroy ds_credno RETURN rslt_credno end function public function integer p_check_cmonth (long arg_accsetid, long arg_cmonth, ref string arg_msg);//检查月份有效性 Int rslt = 1 Long cnt,ls_year ls_year = Long(Left(String(arg_cmonth),4)) IF s_sys_accset.curryear <> ls_year THEN arg_msg = '凭证年份:'+String(ls_year)+'不是当前年份:'+String(s_sys_accset.curryear) rslt = 0 GOTO ext END IF IF arg_cmonth < sys_curyearmon THEN arg_msg = '凭证会计期间'+String(arg_cmonth)+'小于当前会计期间'+String(sys_curyearmon) rslt = 0 GOTO ext END IF SELECT count(*) INTO :cnt FROM cw_credence WHERE accsetid = :arg_accsetid AND cmonth > :arg_cmonth AND postflag = 1; IF sqlca.SQLCode <> 0 THEN arg_msg = '查询大于月份:'+String(arg_cmonth)+'的月份是否已有凭证登帐失败,不能再录入' rslt = 0 GOTO ext END IF IF cnt > 0 THEN arg_msg = '大于月份:'+String(arg_cmonth)+'的月份已有凭证登帐,不能再录入' rslt = 0 GOTO ext END IF ext: RETURN rslt end function public function integer p_check_month_date (long arg_accsetid, long arg_cmonth, datetime arg_creddate, ref string arg_msg);//检查凭证日期是否在相应的会计期间 int rslt = 1 long ls_year datetime b_date,e_date ls_year = long(left(string(arg_cmonth),4)) if s_sys_accset.curryear <> ls_year then arg_msg = '凭证年份:'+string(ls_year)+'不是当前年份:'+string(s_sys_accset.curryear) rslt = 0 goto ext end if select sdate,edate into :b_date,:e_date from cw_calendar where accsetid = :arg_accsetid and cmonth = :arg_cmonth; if sqlca.sqlcode <> 0 then arg_msg = '查询会计期间:'+string(arg_cmonth)+'会计月历失败' rslt = 0 goto ext end if e_date = datetime(RelativeDate(date(string(e_date,'yyyy-mm-dd')),1),time(0)) if arg_creddate < b_date or arg_creddate >= e_date then arg_msg = '日期:'+string(arg_creddate,'yyyy-mm-dd')+'不在会计期间内:'+string(arg_cmonth) rslt = 0 goto ext end if ext: return rslt end function public function integer get_asset_credinfo (long arg_findtype, long arg_relid, long arg_credid, ref long arg_ref_credid, ref integer arg_ref_postflag, ref string arg_msg);Int rslt = 1 IF arg_credid = 0 THEN SELECT postflag,credid INTO :arg_ref_postflag,:arg_ref_credid FROM cw_credence WHERE relevantbillid = :arg_relid AND readtype = :arg_findtype AND accsetid = :sys_accsetid; ELSE SELECT postflag,credid INTO :arg_ref_postflag,:arg_ref_credid FROM cw_credence WHERE relevantbillid = :arg_relid AND credid <> :arg_credid AND readtype = :arg_findtype AND accsetid = :sys_accsetid; END IF IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '查询相关凭证失败>>'+sqlca.SQLErrText GOTO ext END IF IF IsNull(arg_ref_postflag) THEN arg_ref_postflag = 0 IF IsNull(arg_ref_credid) THEN arg_ref_credid = 0 ext: RETURN rslt end function public function integer uof_mod_mxdscrp (long arg_accsetid, long arg_credid, long arg_fuluno, string arg_mxdscrp, ref string arg_msg);Int rslt = 1 UPDATE cw_credencemx SET mxdscrp = :arg_mxdscrp WHERE accsetid = :arg_accsetid AND credid = :arg_credid AND fuluno = :arg_fuluno; IF sqlca.SQLCode <> 0 THEN arg_msg = '更新分录补充备注失败,'+sqlca.SQLErrText rslt = 0 GOTO ext END IF ext: IF rslt = 0 THEN ROLLBACK; ELSE COMMIT; END IF RETURN rslt end function public function integer cancel_check_1 (long arg_subaccsetid, long arg_credid, integer arg_ifauto_check, ref string arg_msg, boolean arg_ifcommit);//check(arg_subaccsetid,arg_credid,ref arg_msg,arg_ifcommit) //0 fail 1 success //凭证审核 Long rslt = 1,cnt = 0 DateTime null_dt SetNull(null_dt) IF s_sys_accset.sameuser = 0 THEN IF publ_userid = billmakerid THEN arg_msg = '制单和审核不可以是同一个人' rslt = 0 GOTO ext END IF END IF IF getinfo(arg_subaccsetid,arg_credid,arg_msg) = 0 THEN rslt = 0 GOTO ext END IF IF it_newbegin OR it_updatebegin THEN rslt = 0 arg_msg = "编辑状态下不可以执行审核" GOTO ext END IF IF checkflag = 0 THEN rslt = 0 arg_msg = "凭证还未审核" GOTO ext END IF IF postflag = 1 THEN rslt = 0 arg_msg = '凭证已经登帐' GOTO ext END IF IF arg_ifauto_check = 1 AND ifauto = 1 THEN rslt = 0 arg_msg = '自动凭证不能撤审' rslt = 0 GOTO ext END IF UPDATE cw_credence SET billcheckid = '', billcheck = '', billcheckdate = :null_dt, checkflag = 0 WHERE cw_credence.credid = :arg_credid AND cw_credence.checkflag = 1 AND cw_credence.accsetid = :sys_accsetid AND cw_credence.subaccsetid = :arg_subaccsetid; 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 checkflag = 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 (integer arg_delmode, long arg_subaccsetid, long arg_credid, ref string arg_msg, boolean arg_ifcommit);//del(arg_subaccsetid,arg_credid,ref arg_msg,arg_ifcommit) //如果单据还没有审核删除凭证极其明细 //0 FAIL, 1 SUCCESS //arg_delmode 0:手动1:自动 Int rslt = 1 Boolean if_del = FALSE IF getinfo(arg_subaccsetid,arg_credid,arg_msg) = 0 THEN rslt = 0 GOTO ext END IF IF checkflag = 1 THEN arg_msg = '凭证已经审核,不可以删除' if_del = TRUE END IF IF arg_delmode = 0 THEN CHOOSE CASE readtype CASE 200 arg_msg = '该张凭证为固定资产业务对应的凭证,不可以删除' if_del = TRUE CASE 201 arg_msg = '该张凭证为固定资产业务折旧对应的凭证,不可以删除' if_del = TRUE CASE 202 arg_msg = '该张凭证为固定资产清理业务对应的凭证,不可以删除' if_del = TRUE CASE 888 arg_msg = '该张凭证为出纳业务对应的凭证,不可以删除' if_del = TRUE END CHOOSE IF ifauto = 1 THEN arg_msg = '业务单据自动建立的凭证,不能删除' rslt = 0 GOTO ext END IF IF checkflag = 0 AND sys_power_issuper AND sys_option_super_del_assetcred = 1 THEN if_del = FALSE END IF END IF IF if_del THEN rslt = 0 GOTO ext END IF DELETE FROM cw_CashItem WHERE cw_CashItem.credid = :arg_credid AND cw_CashItem.accsetid = :sys_accsetid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = "删除凭证现金流量操作失败"+"~n"+sqlca.SQLErrText GOTO ext END IF DELETE FROM cw_credence WHERE cw_credence.credid = :arg_credid AND cw_credence.accsetid = :sys_accsetid AND cw_credence.subaccsetid = :arg_subaccsetid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = "删除凭证操作失败"+"~n"+sqlca.SQLErrText GOTO ext END IF DELETE FROM cw_credencemx WHERE cw_credencemx.credid = :arg_credid AND cw_credencemx.accsetid = :sys_accsetid AND cw_credencemx.subaccsetid = :arg_subaccsetid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = "删除凭证明细操作失败"+"~n"+sqlca.SQLErrText 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_fuluno, string arg_subid, string arg_brief, double arg_rate, decimal arg_rawdebit, decimal arg_rawcredit, decimal arg_debit, decimal arg_credit, decimal arg_amount, decimal arg_price, long arg_deptid, long arg_itemid, datetime arg_billdate, long arg_billid, string arg_billno, long arg_cropbillid, integer arg_readonly, long arg_cusid, long arg_sptid, long arg_empid, ref string arg_msg);//acceptmx(arg_fuluno,arg_subid,arg_brief,arg_rate,arg_rawdebit,arg_rawcredit,arg_debit, // arg_credit,arg_amount,arg_price,arg_deptid,arg_itemid,arg_billdate,arg_billid, // arg_billno,arg_cropbillid,arg_msg) // //RETURN 0 fail 1 success // 函数增加凭证明细项 Long rslt = 1,cnt = 0,LS_i Int li_hswb,li_detailflag IF it_newbegin = FALSE AND it_updatebegin = FALSE THEN rslt = 0 arG_MSG = "非编辑状态不可以使用,操作取消" GOTO ext END IF //清除空值 IF IsNull(arg_fuluno) THEN arg_fuluno = 0 IF IsNull(arg_subid) THEN arg_subid = '' IF IsNull(arg_brief) THEN arg_brief = '' IF IsNull(arg_rate) THEN arg_rate = 0 IF IsNull(arg_rawdebit)THEN arg_rawdebit = 0 IF IsNull(arg_rawcredit)THEN arg_rawcredit = 0 IF IsNull(arg_debit)THEN arg_debit = 0 IF IsNull(arg_credit)THEN arg_credit = 0 IF IsNull(arg_amount)THEN arg_amount = 0 IF IsNull(arg_price)THEN arg_price = 0 IF IsNull(arg_deptid) THEN arg_deptid = 0 IF IsNull(arg_itemid) THEN arg_itemid = 0 IF IsNull(arg_billid) THEN arg_billid = 0 IF IsNull(arg_billno) THEN arg_billno = '' IF IsNull(arg_cusid) THEN arg_cusid = 0 IF IsNull(arg_sptid) THEN arg_sptid = 0 IF IsNull(arg_empid) THEN arg_empid = 0 IF arg_subid = '' AND arg_debit = 0 AND arg_credit = 0 THEN // 如果借贷金额为 0 且摘要和科目为空,则不作任何处理 rslt = 1 GOTO ext END IF //IF Len(Trim(arg_brief)) > 20 AND Left(arg_brief,1) <> ' ' THEN // arg_brief = ' ' +arg_brief //END IF IF arg_subid = '' AND (arg_debit <> 0 OR arg_credit <> 0) THEN rslt = 0 arG_MSG = '分录:'+String(arg_fuluno)+',请选择会计科目' GOTO ext END IF SELECT count(*) INTO :cnt FROM cw_subject WHERE accsetid = :sys_accsetid AND subid = :arg_subid AND detailflag = 1; IF sqlca.SQLCode <> 0 THEN arG_MSG = '分录:'+String(arg_fuluno)+',查询科目代码失败' rslt = 0 GOTO ext END IF IF cnt = 0 THEN arG_MSG = '分录:'+String(arg_fuluno)+',此帐套中不存在明细科目{'+arg_subid+'},请检查输入是否正确' rslt = 0 GOTO ext END IF IF cnt > 1 THEN arG_MSG = '分录:'+String(arg_fuluno)+',此帐套中存在两个相同科目{'+arg_subid+'}' rslt = 0 GOTO ext END IF SELECT hswb,detailflag INTO :li_hswb,:li_detailflag FROM cw_subject WHERE accsetid = :sys_accsetid AND subid = :arg_subid AND detailflag = 1; IF sqlca.SQLCode <> 0 THEN arG_MSG = '分录:'+String(arg_fuluno)+',查询科目代码失败' rslt = 0 GOTO ext END IF IF li_detailflag = 0 THEN arG_MSG = '分录:'+String(arg_fuluno)+','+arg_subid + '不是明细科目,不能做会计分录' rslt = 0 GOTO ext END IF IF li_hswb = 1 AND arg_rate = 0 THEN arG_MSG = '分录:'+String(arg_fuluno)+',科目:'+arg_subid+'核算外币,会计分录没有输入汇率' rslt = 0 GOTO ext END IF IF Left(arg_subid,3) <> '102' AND ( arg_billid > 0 OR arg_billno <> '' ) THEN arG_MSG = '分录:'+String(arg_fuluno)+',不是不银行存款科目不能输入结算方式' rslt = 0 GOTO ext END IF IF arg_debit = 0 AND arg_credit = 0 THEN rslt = 1 GOTO ext END IF IF arg_debit <> 0 AND arg_credit <> 0 THEN rslt = 0 arG_MSG = '分录:'+String(arg_fuluno)+',借方金额和贷方金额不能同时输入金额' GOTO ext END IF //写入内容 it_mxbt++ credencemx[it_mxbt].fuluno = it_mxbt //arg_fuluno credencemx[it_mxbt].subid = arg_subid credencemx[it_mxbt].brief = arg_brief credencemx[it_mxbt].rate = arg_rate credencemx[it_mxbt].rawdebit = arg_rawdebit credencemx[it_mxbt].rawcredit = arg_rawcredit credencemx[it_mxbt].debit = arg_debit credencemx[it_mxbt].credit = arg_credit credencemx[it_mxbt].amount = arg_amount credencemx[it_mxbt].price = arg_price credencemx[it_mxbt].deptid = arg_deptid credencemx[it_mxbt].itemid = arg_itemid credencemx[it_mxbt].billdate = arg_billdate credencemx[it_mxbt].billid = arg_billid credencemx[it_mxbt].billno = arg_billno credencemx[it_mxbt].ifreadonly = arg_readonly credencemx[it_mxbt].cusid = arg_cusid credencemx[it_mxbt].sptid = arg_sptid credencemx[it_mxbt].empid = arg_empid ext: IF rslt = 0 THEN p_clearmx() RETURN(rslt) end function on uo_credence.create call super::create TriggerEvent( this, "constructor" ) end on on uo_credence.destroy TriggerEvent( this, "destructor" ) call super::destroy end on