$PBExportHeader$f_cmp_deprediate.srf $PBExportComments$计提折旧 global type f_cmp_deprediate from function_object end type forward prototypes global subroutine f_cmp_deprediate (integer arg_depr_type, long arg_yearmonth, boolean arg_ifcommit) end prototypes global subroutine f_cmp_deprediate (integer arg_depr_type, long arg_yearmonth, boolean arg_ifcommit);//f_cmp_deprediate(arg_depr_type,arg_yearmonth,arg_msg,arg_ifcommit) //arg_depr_type 0:反计提,1:计提 //计算固定资产累计折旧 //0.本月是否已计提折旧 //1.本月增加不计提折旧 //2.用平均年限法的,月折旧额为当月折旧额 //3.用工作量法的,折旧额=(总值-净残值)*当月工作量/总工作量 //4.查找对应折旧科目 //5. // // String msg,arg_msg Decimal rawvalue,remainvalue,deprediateid Decimal deprvalue,deprrate,usedvalue Decimal total_deprvalue = 0 DateTime firstdate,null_date,enddate,startdate Long i,assetid,depred_cnt = 0,new_accset_cnt = 0,cnt = 0,i_row Long workload,already_workload,usedall,ll_deptid String subid,assetcardname,ls_assettypename,subname Long ll_f,ll_f_deprsubid String ls_deprsubid_array[],ls_deprsubid String ls_deprsubname_array[],ls_deprsubname Decimal ld_derpamt_array[] Long ll_deprsubid_array,k uo_credence uo_cred uo_cred = CREATE uo_credence datastore asset_ds,credencemx_ds //0.本月是否已计提折旧 cnt = 0 SELECT count(*) INTO :cnt FROM cw_credence WHERE accsetid = :sys_accsetid AND relevantbillid = :sys_curyearmon AND Readtype = 201; IF sqlca.SQLCode = -1 THEN MessageBox(publ_operator,'固定资产计提折旧失败>>查询本月固定资产是否已计提折旧失败') RETURN END IF IF arg_depr_type = 1 THEN SetNull(null_date) IF cnt > 0 THEN MessageBox(publ_operator,'本期固定资产已经计提过折旧,不能再提折旧') RETURN END IF // msg = "在计提折旧前需对采用工作量法的固定资产输入本期相应的工作量。~n是否确认已完成工作量的输入并可以计提本月折旧?" msg = "是否确认计提本月折旧?" IF MessageBox ("IF",msg,Question!,YesNo! ) = 2 THEN RETURN firstdate = f_rst_mon_1st(1,sys_curyearmon) enddate = f_rst_mon_1st(3,sys_curyearmon) asset_ds = CREATE datastore asset_ds.DataObject = 'ds_asset_index' asset_ds.SetTransObject(sqlca) asset_ds.Retrieve(sys_accsetid,enddate) credencemx_ds = CREATE datastore credencemx_ds.DataObject = "ds_credencemx" credencemx_ds.SetTransObject(sqlca) IF asset_ds.RowCount() <= 0 THEN MessageBox(publ_operator,'没有可计提折旧的固定资产') RETURN ELSE FOR i = 1 TO asset_ds.RowCount() assetid = asset_ds.Object.assetcardid[i] deprediateid = asset_ds.Object.deprediateid[i] workload = asset_ds.Object.workload[i] usedall = asset_ds.Object.usedall[i] subid = asset_ds.Object.subid[i] subname = asset_ds.Object.subname2[i] assetcardname = asset_ds.Object.assetcardname[i] rawvalue = asset_ds.Object.rawvalue[i] startdate = asset_ds.Object.startdate[i] ll_deptid = asset_ds.Object.deptid[i] ls_assettypename = asset_ds.Object.assettypename[i] ls_deprsubid = asset_ds.Object.cw_assetcard_deprsubid[i] ls_deprsubname = asset_ds.Object.subname[i] Int li_hsdept SELECT hsdept INTO :li_hsdept FROM cw_subject WHERE accsetid = :sys_accsetid AND subid = :subid; IF sqlca.SQLCode <> 0 THEN MessageBox(publ_operator,'查询固定资产折旧科目:'+subid+'是否核算部门失败,可能科目不存在,请核对,'+sqlca.SQLErrText) RETURN END IF IF li_hsdept = 0 THEN ll_deptid = 0 //**检查是否已清理**************** Int clearflag DateTime cleardate clearflag = asset_ds.Object.clearflag[i] IF clearflag = 1 THEN SELECT max(billdate) INTO :cleardate FROM cw_astclear,cw_astclear_bill WHERE cw_astclear_bill.accsetid = :sys_accsetid AND cw_astclear.assetcardid = :assetid AND cw_astclear.accsetid = cw_astclear_bill.accsetid AND cw_astclear.astclearid = cw_astclear_bill.astclearid; IF sqlca.SQLCode <> 0 THEN MessageBox(publ_operator,'查询固定资产清理日期失败') RETURN END IF IF IsNull(cleardate) THEN cleardate = DateTime(Date('1900-1-1'),Time(0)) IF cleardate <= enddate THEN CONTINUE END IF END IF //******************************* CHOOSE CASE deprediateid CASE 0 CONTINUE CASE 1 IF startdate < firstdate THEN //本月增加不计折旧 Long al_wl SELECT totalwl INTO :al_wl FROM cw_astbalance WHERE accsetid = :sys_accsetid AND assetcardid = :assetid AND yearmon = :sys_curyearmon; IF sqlca.SQLCode = -1 THEN MessageBox(publ_operator,'固定资产计提折旧失败>>查询固定资产已计提折旧失败') RETURN END IF //totalwl:已计月份 //workload:余下使用月份 //usedall:已计月份 IF al_wl > workload + usedall THEN CONTINUE /////更新累计折旧 deprvalue = asset_ds.Object.deprvalue[i] deprrate = asset_ds.Object.deprrate[i] usedvalue = asset_ds.Object.usedvalue[i] UPDATE cw_astbalance SET deprrate = :deprrate, deprvalue = :deprvalue, currwl = 1 WHERE accsetid = :sys_accsetid AND assetcardid = :assetid AND yearmon = :sys_curyearmon; IF sqlca.SQLCode = -1 THEN ROLLBACK; MessageBox(publ_operator,'固定资产计提折旧失败>>更新固定资产累计折旧失败'+sqlca.SQLErrText) RETURN ELSE IF sqlca.SQLNRows = 0 THEN INSERT INTO cw_astbalance (accsetid, assetcardid, yearmon, totalwl, currwl, usedvalue, deprrate, deprvalue, bastdebit, yastdebit, yastcredit, astdebit, astcredit, bdprcredit, ydprdebit, ydprcredit, dprdebit, dprcredit) VALUES(:sys_accsetid, :assetid, :sys_curyearmon, :usedall + 1, 1, :usedvalue, :deprrate, :deprvalue, :rawvalue, :rawvalue, 0, 0, 0, :usedvalue, 0, :deprvalue, //改:usedvalue + :deprvalue 0, 0); IF sqlca.SQLCode <> 0 THEN MessageBox(publ_operator,'固定资产计提折旧失败>>新建固定资产累计折旧失败,'+sqlca.SQLErrText) ROLLBACK; RETURN END IF END IF END IF depred_cnt++ total_deprvalue = total_deprvalue + deprvalue //////////////////////////////////////////// ll_f_deprsubid = 0 FOR k = 1 TO ll_deprsubid_array IF ls_deprsubid_array[k] = ls_deprsubid THEN ll_f_deprsubid = k EXIT END IF NEXT IF ll_f_deprsubid = 0 THEN ll_deprsubid_array++ ls_deprsubid_array[ll_deprsubid_array] = ls_deprsubid ls_deprsubname_array[ll_deprsubid_array] = ls_deprsubname ld_derpamt_array[ll_deprsubid_array] = deprvalue ELSE ld_derpamt_array[ll_f_deprsubid] += deprvalue END IF /////////////////////////////////////////// IF sys_option_cmpldepr_use_assettype = 0 THEN i_row = credencemx_ds.InsertRow(0) credencemx_ds.Object.fuluno[i_row] = i_row credencemx_ds.Object.subid[i_row] = subid credencemx_ds.Object.brief[i_row] = '计提折旧-'+assetcardname credencemx_ds.Object.rate[i_row] = 0.00 credencemx_ds.Object.rawdebit[i_row] = 0.00 credencemx_ds.Object.rawcredit[i_row] = 0.00 credencemx_ds.Object.debit[i_row] = deprvalue credencemx_ds.Object.credit[i_row] = 0.00 credencemx_ds.Object.amount[i_row] = 0.00 credencemx_ds.Object.price[i_row] = 0.00 credencemx_ds.Object.deptid[i_row] = ll_deptid credencemx_ds.Object.itemid[i_row] = 0 credencemx_ds.Object.READONLY[i_row] = 1 credencemx_ds.Object.billdate[i_row] = null_date credencemx_ds.Object.billid[i_row] = 0 credencemx_ds.Object.billno[i_row] = '' credencemx_ds.Object.cropbillid[i_row] = 0 ELSE ll_f = 0 credencemx_ds.AcceptText() ll_f = credencemx_ds.Find("subid = '"+subid+"'",1,credencemx_ds.RowCount()) IF ll_f = 0 THEN i_row = credencemx_ds.InsertRow(0) credencemx_ds.Object.fuluno[i_row] = i_row credencemx_ds.Object.subid[i_row] = subid credencemx_ds.Object.brief[i_row] = '计提折旧-'+subname credencemx_ds.Object.rate[i_row] = 0.00 credencemx_ds.Object.rawdebit[i_row] = 0.00 credencemx_ds.Object.rawcredit[i_row] = 0.00 credencemx_ds.Object.debit[i_row] = deprvalue credencemx_ds.Object.credit[i_row] = 0.00 credencemx_ds.Object.amount[i_row] = 0.00 credencemx_ds.Object.price[i_row] = 0.00 credencemx_ds.Object.deptid[i_row] = ll_deptid credencemx_ds.Object.itemid[i_row] = 0 credencemx_ds.Object.READONLY[i_row] = 1 credencemx_ds.Object.billdate[i_row] = null_date credencemx_ds.Object.billid[i_row] = 0 credencemx_ds.Object.billno[i_row] = '' credencemx_ds.Object.cropbillid[i_row] = 0 ELSE credencemx_ds.Object.debit[ll_f] = credencemx_ds.Object.debit[ll_f] + deprvalue END IF END IF ELSE UPDATE cw_astbalance SET yastdebit = :rawvalue, astdebit = :rawvalue WHERE accsetid = :sys_accsetid AND assetcardid = :assetid AND yearmon = :sys_curyearmon; IF sqlca.SQLCode = -1 THEN ROLLBACK; MessageBox(publ_operator,'固定资产计提折旧失败>>更新本月新增固定资产失败'+sqlca.SQLErrText) RETURN ELSE IF sqlca.SQLNRows = 0 THEN INSERT INTO cw_astbalance (accsetid, assetcardid, yearmon, totalwl, currwl, usedvalue, deprrate, deprvalue, bastdebit, yastdebit, yastcredit, astdebit, astcredit, bdprcredit, ydprdebit, ydprcredit, dprdebit, dprcredit) VALUES(:sys_accsetid, :assetid, :sys_curyearmon, 0, 0, 0, 0, 0, 0, :rawvalue, 0, :rawvalue, 0, 0, 0, 0, 0, 0); IF sqlca.SQLCode <> 0 THEN MessageBox(publ_operator,'固定资产计提折旧失败>>新建固定资产累计折旧失败(当月新增固定资产),'+sqlca.SQLErrText) ROLLBACK; RETURN END IF END IF END IF new_accset_cnt++ END IF CASE 2 CASE 3 CASE 4 CASE 5 END CHOOSE NEXT END IF /////////// IF new_accset_cnt = 0 AND depred_cnt = 0 THEN MessageBox(publ_operator,'没有可计提折旧的固定资产') RETURN ELSE IF depred_cnt > 0 THEN FOR k = 1 TO ll_deprsubid_array i_row = credencemx_ds.InsertRow(0) credencemx_ds.Object.fuluno[i_row] = i_row credencemx_ds.Object.subid[i_row] = ls_deprsubid_array[k] IF ll_deprsubid_array = 1 THEN credencemx_ds.Object.brief[i_row] = '累计折旧' ELSE credencemx_ds.Object.brief[i_row] = ls_deprsubname_array[k]+' 累计折旧' END IF credencemx_ds.Object.rate[i_row] = 0.00 credencemx_ds.Object.rawdebit[i_row] = 0.00 credencemx_ds.Object.rawcredit[i_row] = 0.00 credencemx_ds.Object.debit[i_row] = 0.00 credencemx_ds.Object.credit[i_row] = ld_derpamt_array[k] //total_deprvalue credencemx_ds.Object.amount[i_row] = 0.00 credencemx_ds.Object.price[i_row] = 0.00 credencemx_ds.Object.deptid[i_row] = 0 credencemx_ds.Object.itemid[i_row] = 0 credencemx_ds.Object.READONLY[i_row] = 1 credencemx_ds.Object.billdate[i_row] = null_date credencemx_ds.Object.billid[i_row] = 0 credencemx_ds.Object.billno[i_row] = '' credencemx_ds.Object.cropbillid[i_row] = 0 NEXT //生成凭证 IF uo_cred.newbegin() = 0 THEN MessageBox('Error!',arg_msg) RETURN END IF IF String(credencemx_ds.Object.sum_debit[1],'###0.00') <> String(credencemx_ds.Object.sum_credit[1],'###0.00') THEN MessageBox(publ_operator,'借、贷方金额不等!') RETURN END IF String tmp_credtype Long ll_cnt_credtype SELECT count(*) Into :ll_cnt_credtype From cw_Credenceword Where accsetid = :sys_accsetid; IF sqlca.SQLCode <> 0 THEN MessageBox(publ_operator,'查询帐套是否使用凭证字失败,'+sqlca.SQLErrText) RETURN END IF IF ll_cnt_credtype = 0 THEN tmp_credtype = '' ELSE SELECT cw_Credenceword.Credenceword INTO :tmp_credtype FROM cw_Credenceword WHERE accsetid = :sys_accsetid And (cw_Credenceword.Credenceword = '转' Or cw_Credenceword.Credenceword = '转帐' Or cw_Credenceword.Credenceword = '转账' Or cw_Credenceword.Credenceword = '记帐' Or cw_Credenceword.Credenceword = '记'); IF sqlca.SQLCode = -1 THEN MessageBox(publ_operator,"查询帐套是否有'转、转帐、转账、记帐、记'凭证字失败,"+sqlca.SQLErrText) RETURN ELSEIF sqlca.SQLCode = 100 THEN tmp_credtype = '' END IF END IF uo_cred.subaccsetid = 0 //子帐ID uo_cred.credno = uo_cred.get_new_credno(0,tmp_credtype,sys_curyearmon,arg_msg) // 编号 uo_cred.creddate = f_rst_mon_1st(3,sys_curyearmon) // 日期 uo_cred.billnumber = 0 //附件 uo_cred.credtype = tmp_credtype //凭证字 uo_cred.Readtype = 201 uo_cred.relevantbillid = sys_curyearmon uo_cred.cmonth = sys_curyearmon credencemx_ds.AcceptText() FOR i = 1 TO credencemx_ds.RowCount() IF uo_cred.acceptmx(credencemx_ds.Object.no[i],credencemx_ds.Object.subid[i],& credencemx_ds.Object.brief[i],credencemx_ds.Object.rate[i],& credencemx_ds.Object.rawdebit[i],credencemx_ds.Object.rawcredit[i],& credencemx_ds.Object.debit[i],credencemx_ds.Object.credit[i],& credencemx_ds.Object.amount[i],credencemx_ds.Object.price[i],& credencemx_ds.Object.deptid[i],credencemx_ds.Object.itemid[i],& credencemx_ds.Object.billdate[i],credencemx_ds.Object.billid[i],& credencemx_ds.Object.billno[i],credencemx_ds.Object.cropbillid[i],& credencemx_ds.Object.READONLY[i],0,0,0,arg_msg) = 0 THEN MessageBox('Error!',arg_msg) RETURN END IF NEXT IF uo_cred.Save('机制',arg_msg,FALSE) = 0 THEN MessageBox('Error!',arg_msg) RETURN END IF END IF COMMIT; IF depred_cnt > 0 THEN MessageBox(publ_operator,'本期固定资产折旧已被成功计提,并产生一张记帐凭证。') ELSE MessageBox(publ_operator,'本期固定资产新增固定资产成功。') END IF END IF ELSE IF cnt <= 0 THEN MessageBox(publ_operator,'本期尚未进行过计提过折旧,无需反计提折旧') RETURN END IF UPDATE cw_astbalance SET deprrate = 0, deprvalue = 0, currwl = 0 WHERE accsetid = :sys_accsetid AND yearmon = :sys_curyearmon; IF sqlca.SQLCode <> 0 THEN ROLLBACK; MessageBox(publ_operator,'固定资产反计提折旧失败>>更新固定资产累计折旧失败') RETURN END IF Long ls_credid,ls_subaccsetid SELECT credid,subaccsetid INTO :ls_credid,:ls_subaccsetid FROM cw_credence WHERE cw_credence.accsetid = :sys_accsetid AND cw_credence.readtype = 201 AND cw_credence.relevantbillid = :sys_curyearmon; IF sqlca.SQLCode = -1 THEN ROLLBACK; MessageBox(publ_operator,'固定资产反计提折旧失败>>查询固定资产累计折旧对应记由凭证失败') RETURN ELSEIF sqlca.SQLCode = 100 THEN ELSE IF uo_cred.del(1,ls_subaccsetid,ls_credid,arg_msg,FALSE) = 0 THEN MessageBox(publ_operator,'固定资产反计提折旧失败>>删除固定资产累计折旧对应凭证失败') ROLLBACK; RETURN END IF END IF COMMIT; MessageBox(publ_operator,'本期计提的折旧已经被成功地反计提') END IF DESTROY uo_cred end subroutine