123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522 |
- $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
|