f_cmp_deprediate.srf 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522
  1. $PBExportHeader$f_cmp_deprediate.srf
  2. $PBExportComments$计提折旧
  3. global type f_cmp_deprediate from function_object
  4. end type
  5. forward prototypes
  6. global subroutine f_cmp_deprediate (integer arg_depr_type, long arg_yearmonth, boolean arg_ifcommit)
  7. end prototypes
  8. 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)
  9. //arg_depr_type 0:反计提,1:计提
  10. //计算固定资产累计折旧
  11. //0.本月是否已计提折旧
  12. //1.本月增加不计提折旧
  13. //2.用平均年限法的,月折旧额为当月折旧额
  14. //3.用工作量法的,折旧额=(总值-净残值)*当月工作量/总工作量
  15. //4.查找对应折旧科目
  16. //5.
  17. //
  18. //
  19. String msg,arg_msg
  20. Decimal rawvalue,remainvalue,deprediateid
  21. Decimal deprvalue,deprrate,usedvalue
  22. Decimal total_deprvalue = 0
  23. DateTime firstdate,null_date,enddate,startdate
  24. Long i,assetid,depred_cnt = 0,new_accset_cnt = 0,cnt = 0,i_row
  25. Long workload,already_workload,usedall,ll_deptid
  26. String subid,assetcardname,ls_assettypename,subname
  27. Long ll_f,ll_f_deprsubid
  28. String ls_deprsubid_array[],ls_deprsubid
  29. String ls_deprsubname_array[],ls_deprsubname
  30. Decimal ld_derpamt_array[]
  31. Long ll_deprsubid_array,k
  32. uo_credence uo_cred
  33. uo_cred = CREATE uo_credence
  34. datastore asset_ds,credencemx_ds
  35. //0.本月是否已计提折旧
  36. cnt = 0
  37. SELECT count(*) INTO :cnt FROM cw_credence
  38. WHERE accsetid = :sys_accsetid
  39. AND relevantbillid = :sys_curyearmon
  40. AND Readtype = 201;
  41. IF sqlca.SQLCode = -1 THEN
  42. MessageBox(publ_operator,'固定资产计提折旧失败>>查询本月固定资产是否已计提折旧失败')
  43. RETURN
  44. END IF
  45. IF arg_depr_type = 1 THEN
  46. SetNull(null_date)
  47. IF cnt > 0 THEN
  48. MessageBox(publ_operator,'本期固定资产已经计提过折旧,不能再提折旧')
  49. RETURN
  50. END IF
  51. // msg = "在计提折旧前需对采用工作量法的固定资产输入本期相应的工作量。~n是否确认已完成工作量的输入并可以计提本月折旧?"
  52. msg = "是否确认计提本月折旧?"
  53. IF MessageBox ("IF",msg,Question!,YesNo! ) = 2 THEN RETURN
  54. firstdate = f_rst_mon_1st(1,sys_curyearmon)
  55. enddate = f_rst_mon_1st(3,sys_curyearmon)
  56. asset_ds = CREATE datastore
  57. asset_ds.DataObject = 'ds_asset_index'
  58. asset_ds.SetTransObject(sqlca)
  59. asset_ds.Retrieve(sys_accsetid,enddate)
  60. credencemx_ds = CREATE datastore
  61. credencemx_ds.DataObject = "ds_credencemx"
  62. credencemx_ds.SetTransObject(sqlca)
  63. IF asset_ds.RowCount() <= 0 THEN
  64. MessageBox(publ_operator,'没有可计提折旧的固定资产')
  65. RETURN
  66. ELSE
  67. FOR i = 1 TO asset_ds.RowCount()
  68. assetid = asset_ds.Object.assetcardid[i]
  69. deprediateid = asset_ds.Object.deprediateid[i]
  70. workload = asset_ds.Object.workload[i]
  71. usedall = asset_ds.Object.usedall[i]
  72. subid = asset_ds.Object.subid[i]
  73. subname = asset_ds.Object.subname2[i]
  74. assetcardname = asset_ds.Object.assetcardname[i]
  75. rawvalue = asset_ds.Object.rawvalue[i]
  76. startdate = asset_ds.Object.startdate[i]
  77. ll_deptid = asset_ds.Object.deptid[i]
  78. ls_assettypename = asset_ds.Object.assettypename[i]
  79. ls_deprsubid = asset_ds.Object.cw_assetcard_deprsubid[i]
  80. ls_deprsubname = asset_ds.Object.subname[i]
  81. Int li_hsdept
  82. SELECT hsdept INTO :li_hsdept
  83. FROM cw_subject
  84. WHERE accsetid = :sys_accsetid
  85. AND subid = :subid;
  86. IF sqlca.SQLCode <> 0 THEN
  87. MessageBox(publ_operator,'查询固定资产折旧科目:'+subid+'是否核算部门失败,可能科目不存在,请核对,'+sqlca.SQLErrText)
  88. RETURN
  89. END IF
  90. IF li_hsdept = 0 THEN ll_deptid = 0
  91. //**检查是否已清理****************
  92. Int clearflag
  93. DateTime cleardate
  94. clearflag = asset_ds.Object.clearflag[i]
  95. IF clearflag = 1 THEN
  96. SELECT max(billdate) INTO :cleardate
  97. FROM cw_astclear,cw_astclear_bill
  98. WHERE cw_astclear_bill.accsetid = :sys_accsetid
  99. AND cw_astclear.assetcardid = :assetid
  100. AND cw_astclear.accsetid = cw_astclear_bill.accsetid
  101. AND cw_astclear.astclearid = cw_astclear_bill.astclearid;
  102. IF sqlca.SQLCode <> 0 THEN
  103. MessageBox(publ_operator,'查询固定资产清理日期失败')
  104. RETURN
  105. END IF
  106. IF IsNull(cleardate) THEN cleardate = DateTime(Date('1900-1-1'),Time(0))
  107. IF cleardate <= enddate THEN
  108. CONTINUE
  109. END IF
  110. END IF
  111. //*******************************
  112. CHOOSE CASE deprediateid
  113. CASE 0
  114. CONTINUE
  115. CASE 1
  116. IF startdate < firstdate THEN //本月增加不计折旧
  117. Long al_wl
  118. SELECT totalwl INTO :al_wl FROM cw_astbalance
  119. WHERE accsetid = :sys_accsetid
  120. AND assetcardid = :assetid
  121. AND yearmon = :sys_curyearmon;
  122. IF sqlca.SQLCode = -1 THEN
  123. MessageBox(publ_operator,'固定资产计提折旧失败>>查询固定资产已计提折旧失败')
  124. RETURN
  125. END IF
  126. //totalwl:已计月份
  127. //workload:余下使用月份
  128. //usedall:已计月份
  129. IF al_wl > workload + usedall THEN CONTINUE
  130. /////更新累计折旧
  131. deprvalue = asset_ds.Object.deprvalue[i]
  132. deprrate = asset_ds.Object.deprrate[i]
  133. usedvalue = asset_ds.Object.usedvalue[i]
  134. UPDATE cw_astbalance
  135. SET deprrate = :deprrate,
  136. deprvalue = :deprvalue,
  137. currwl = 1
  138. WHERE accsetid = :sys_accsetid
  139. AND assetcardid = :assetid
  140. AND yearmon = :sys_curyearmon;
  141. IF sqlca.SQLCode = -1 THEN
  142. ROLLBACK;
  143. MessageBox(publ_operator,'固定资产计提折旧失败>>更新固定资产累计折旧失败'+sqlca.SQLErrText)
  144. RETURN
  145. ELSE
  146. IF sqlca.SQLNRows = 0 THEN
  147. INSERT INTO cw_astbalance
  148. (accsetid,
  149. assetcardid,
  150. yearmon,
  151. totalwl,
  152. currwl,
  153. usedvalue,
  154. deprrate,
  155. deprvalue,
  156. bastdebit,
  157. yastdebit,
  158. yastcredit,
  159. astdebit,
  160. astcredit,
  161. bdprcredit,
  162. ydprdebit,
  163. ydprcredit,
  164. dprdebit,
  165. dprcredit)
  166. VALUES(:sys_accsetid,
  167. :assetid,
  168. :sys_curyearmon,
  169. :usedall + 1,
  170. 1,
  171. :usedvalue,
  172. :deprrate,
  173. :deprvalue,
  174. :rawvalue,
  175. :rawvalue,
  176. 0,
  177. 0,
  178. 0,
  179. :usedvalue,
  180. 0,
  181. :deprvalue, //改:usedvalue + :deprvalue
  182. 0,
  183. 0);
  184. IF sqlca.SQLCode <> 0 THEN
  185. MessageBox(publ_operator,'固定资产计提折旧失败>>新建固定资产累计折旧失败,'+sqlca.SQLErrText)
  186. ROLLBACK;
  187. RETURN
  188. END IF
  189. END IF
  190. END IF
  191. depred_cnt++
  192. total_deprvalue = total_deprvalue + deprvalue
  193. ////////////////////////////////////////////
  194. ll_f_deprsubid = 0
  195. FOR k = 1 TO ll_deprsubid_array
  196. IF ls_deprsubid_array[k] = ls_deprsubid THEN
  197. ll_f_deprsubid = k
  198. EXIT
  199. END IF
  200. NEXT
  201. IF ll_f_deprsubid = 0 THEN
  202. ll_deprsubid_array++
  203. ls_deprsubid_array[ll_deprsubid_array] = ls_deprsubid
  204. ls_deprsubname_array[ll_deprsubid_array] = ls_deprsubname
  205. ld_derpamt_array[ll_deprsubid_array] = deprvalue
  206. ELSE
  207. ld_derpamt_array[ll_f_deprsubid] += deprvalue
  208. END IF
  209. ///////////////////////////////////////////
  210. IF sys_option_cmpldepr_use_assettype = 0 THEN
  211. i_row = credencemx_ds.InsertRow(0)
  212. credencemx_ds.Object.fuluno[i_row] = i_row
  213. credencemx_ds.Object.subid[i_row] = subid
  214. credencemx_ds.Object.brief[i_row] = '计提折旧-'+assetcardname
  215. credencemx_ds.Object.rate[i_row] = 0.00
  216. credencemx_ds.Object.rawdebit[i_row] = 0.00
  217. credencemx_ds.Object.rawcredit[i_row] = 0.00
  218. credencemx_ds.Object.debit[i_row] = deprvalue
  219. credencemx_ds.Object.credit[i_row] = 0.00
  220. credencemx_ds.Object.amount[i_row] = 0.00
  221. credencemx_ds.Object.price[i_row] = 0.00
  222. credencemx_ds.Object.deptid[i_row] = ll_deptid
  223. credencemx_ds.Object.itemid[i_row] = 0
  224. credencemx_ds.Object.READONLY[i_row] = 1
  225. credencemx_ds.Object.billdate[i_row] = null_date
  226. credencemx_ds.Object.billid[i_row] = 0
  227. credencemx_ds.Object.billno[i_row] = ''
  228. credencemx_ds.Object.cropbillid[i_row] = 0
  229. ELSE
  230. ll_f = 0
  231. credencemx_ds.AcceptText()
  232. ll_f = credencemx_ds.Find("subid = '"+subid+"'",1,credencemx_ds.RowCount())
  233. IF ll_f = 0 THEN
  234. i_row = credencemx_ds.InsertRow(0)
  235. credencemx_ds.Object.fuluno[i_row] = i_row
  236. credencemx_ds.Object.subid[i_row] = subid
  237. credencemx_ds.Object.brief[i_row] = '计提折旧-'+subname
  238. credencemx_ds.Object.rate[i_row] = 0.00
  239. credencemx_ds.Object.rawdebit[i_row] = 0.00
  240. credencemx_ds.Object.rawcredit[i_row] = 0.00
  241. credencemx_ds.Object.debit[i_row] = deprvalue
  242. credencemx_ds.Object.credit[i_row] = 0.00
  243. credencemx_ds.Object.amount[i_row] = 0.00
  244. credencemx_ds.Object.price[i_row] = 0.00
  245. credencemx_ds.Object.deptid[i_row] = ll_deptid
  246. credencemx_ds.Object.itemid[i_row] = 0
  247. credencemx_ds.Object.READONLY[i_row] = 1
  248. credencemx_ds.Object.billdate[i_row] = null_date
  249. credencemx_ds.Object.billid[i_row] = 0
  250. credencemx_ds.Object.billno[i_row] = ''
  251. credencemx_ds.Object.cropbillid[i_row] = 0
  252. ELSE
  253. credencemx_ds.Object.debit[ll_f] = credencemx_ds.Object.debit[ll_f] + deprvalue
  254. END IF
  255. END IF
  256. ELSE
  257. UPDATE cw_astbalance
  258. SET yastdebit = :rawvalue,
  259. astdebit = :rawvalue
  260. WHERE accsetid = :sys_accsetid
  261. AND assetcardid = :assetid
  262. AND yearmon = :sys_curyearmon;
  263. IF sqlca.SQLCode = -1 THEN
  264. ROLLBACK;
  265. MessageBox(publ_operator,'固定资产计提折旧失败>>更新本月新增固定资产失败'+sqlca.SQLErrText)
  266. RETURN
  267. ELSE
  268. IF sqlca.SQLNRows = 0 THEN
  269. INSERT INTO cw_astbalance
  270. (accsetid,
  271. assetcardid,
  272. yearmon,
  273. totalwl,
  274. currwl,
  275. usedvalue,
  276. deprrate,
  277. deprvalue,
  278. bastdebit,
  279. yastdebit,
  280. yastcredit,
  281. astdebit,
  282. astcredit,
  283. bdprcredit,
  284. ydprdebit,
  285. ydprcredit,
  286. dprdebit,
  287. dprcredit)
  288. VALUES(:sys_accsetid,
  289. :assetid,
  290. :sys_curyearmon,
  291. 0,
  292. 0,
  293. 0,
  294. 0,
  295. 0,
  296. 0,
  297. :rawvalue,
  298. 0,
  299. :rawvalue,
  300. 0,
  301. 0,
  302. 0,
  303. 0,
  304. 0,
  305. 0);
  306. IF sqlca.SQLCode <> 0 THEN
  307. MessageBox(publ_operator,'固定资产计提折旧失败>>新建固定资产累计折旧失败(当月新增固定资产),'+sqlca.SQLErrText)
  308. ROLLBACK;
  309. RETURN
  310. END IF
  311. END IF
  312. END IF
  313. new_accset_cnt++
  314. END IF
  315. CASE 2
  316. CASE 3
  317. CASE 4
  318. CASE 5
  319. END CHOOSE
  320. NEXT
  321. END IF
  322. ///////////
  323. IF new_accset_cnt = 0 AND depred_cnt = 0 THEN
  324. MessageBox(publ_operator,'没有可计提折旧的固定资产')
  325. RETURN
  326. ELSE
  327. IF depred_cnt > 0 THEN
  328. FOR k = 1 TO ll_deprsubid_array
  329. i_row = credencemx_ds.InsertRow(0)
  330. credencemx_ds.Object.fuluno[i_row] = i_row
  331. credencemx_ds.Object.subid[i_row] = ls_deprsubid_array[k]
  332. IF ll_deprsubid_array = 1 THEN
  333. credencemx_ds.Object.brief[i_row] = '累计折旧'
  334. ELSE
  335. credencemx_ds.Object.brief[i_row] = ls_deprsubname_array[k]+' 累计折旧'
  336. END IF
  337. credencemx_ds.Object.rate[i_row] = 0.00
  338. credencemx_ds.Object.rawdebit[i_row] = 0.00
  339. credencemx_ds.Object.rawcredit[i_row] = 0.00
  340. credencemx_ds.Object.debit[i_row] = 0.00
  341. credencemx_ds.Object.credit[i_row] = ld_derpamt_array[k] //total_deprvalue
  342. credencemx_ds.Object.amount[i_row] = 0.00
  343. credencemx_ds.Object.price[i_row] = 0.00
  344. credencemx_ds.Object.deptid[i_row] = 0
  345. credencemx_ds.Object.itemid[i_row] = 0
  346. credencemx_ds.Object.READONLY[i_row] = 1
  347. credencemx_ds.Object.billdate[i_row] = null_date
  348. credencemx_ds.Object.billid[i_row] = 0
  349. credencemx_ds.Object.billno[i_row] = ''
  350. credencemx_ds.Object.cropbillid[i_row] = 0
  351. NEXT
  352. //生成凭证
  353. IF uo_cred.newbegin() = 0 THEN
  354. MessageBox('Error!',arg_msg)
  355. RETURN
  356. END IF
  357. IF String(credencemx_ds.Object.sum_debit[1],'###0.00') <> String(credencemx_ds.Object.sum_credit[1],'###0.00') THEN
  358. MessageBox(publ_operator,'借、贷方金额不等!')
  359. RETURN
  360. END IF
  361. String tmp_credtype
  362. Long ll_cnt_credtype
  363. SELECT count(*) Into :ll_cnt_credtype From cw_Credenceword Where accsetid = :sys_accsetid;
  364. IF sqlca.SQLCode <> 0 THEN
  365. MessageBox(publ_operator,'查询帐套是否使用凭证字失败,'+sqlca.SQLErrText)
  366. RETURN
  367. END IF
  368. IF ll_cnt_credtype = 0 THEN
  369. tmp_credtype = ''
  370. ELSE
  371. SELECT cw_Credenceword.Credenceword INTO :tmp_credtype FROM cw_Credenceword WHERE accsetid = :sys_accsetid
  372. And (cw_Credenceword.Credenceword = '转' Or cw_Credenceword.Credenceword = '转帐' Or cw_Credenceword.Credenceword = '转账' Or cw_Credenceword.Credenceword = '记帐' Or cw_Credenceword.Credenceword = '记');
  373. IF sqlca.SQLCode = -1 THEN
  374. MessageBox(publ_operator,"查询帐套是否有'转、转帐、转账、记帐、记'凭证字失败,"+sqlca.SQLErrText)
  375. RETURN
  376. ELSEIF sqlca.SQLCode = 100 THEN
  377. tmp_credtype = ''
  378. END IF
  379. END IF
  380. uo_cred.subaccsetid = 0 //子帐ID
  381. uo_cred.credno = uo_cred.get_new_credno(0,tmp_credtype,sys_curyearmon,arg_msg) // 编号
  382. uo_cred.creddate = f_rst_mon_1st(3,sys_curyearmon) // 日期
  383. uo_cred.billnumber = 0 //附件
  384. uo_cred.credtype = tmp_credtype //凭证字
  385. uo_cred.Readtype = 201
  386. uo_cred.relevantbillid = sys_curyearmon
  387. uo_cred.cmonth = sys_curyearmon
  388. credencemx_ds.AcceptText()
  389. FOR i = 1 TO credencemx_ds.RowCount()
  390. IF uo_cred.acceptmx(credencemx_ds.Object.no[i],credencemx_ds.Object.subid[i],&
  391. credencemx_ds.Object.brief[i],credencemx_ds.Object.rate[i],&
  392. credencemx_ds.Object.rawdebit[i],credencemx_ds.Object.rawcredit[i],&
  393. credencemx_ds.Object.debit[i],credencemx_ds.Object.credit[i],&
  394. credencemx_ds.Object.amount[i],credencemx_ds.Object.price[i],&
  395. credencemx_ds.Object.deptid[i],credencemx_ds.Object.itemid[i],&
  396. credencemx_ds.Object.billdate[i],credencemx_ds.Object.billid[i],&
  397. credencemx_ds.Object.billno[i],credencemx_ds.Object.cropbillid[i],&
  398. credencemx_ds.Object.READONLY[i],0,0,0,arg_msg) = 0 THEN
  399. MessageBox('Error!',arg_msg)
  400. RETURN
  401. END IF
  402. NEXT
  403. IF uo_cred.Save('机制',arg_msg,FALSE) = 0 THEN
  404. MessageBox('Error!',arg_msg)
  405. RETURN
  406. END IF
  407. END IF
  408. COMMIT;
  409. IF depred_cnt > 0 THEN
  410. MessageBox(publ_operator,'本期固定资产折旧已被成功计提,并产生一张记帐凭证。')
  411. ELSE
  412. MessageBox(publ_operator,'本期固定资产新增固定资产成功。')
  413. END IF
  414. END IF
  415. ELSE
  416. IF cnt <= 0 THEN
  417. MessageBox(publ_operator,'本期尚未进行过计提过折旧,无需反计提折旧')
  418. RETURN
  419. END IF
  420. UPDATE cw_astbalance
  421. SET deprrate = 0,
  422. deprvalue = 0,
  423. currwl = 0
  424. WHERE accsetid = :sys_accsetid
  425. AND yearmon = :sys_curyearmon;
  426. IF sqlca.SQLCode <> 0 THEN
  427. ROLLBACK;
  428. MessageBox(publ_operator,'固定资产反计提折旧失败>>更新固定资产累计折旧失败')
  429. RETURN
  430. END IF
  431. Long ls_credid,ls_subaccsetid
  432. SELECT credid,subaccsetid INTO :ls_credid,:ls_subaccsetid
  433. FROM cw_credence
  434. WHERE cw_credence.accsetid = :sys_accsetid
  435. AND cw_credence.readtype = 201
  436. AND cw_credence.relevantbillid = :sys_curyearmon;
  437. IF sqlca.SQLCode = -1 THEN
  438. ROLLBACK;
  439. MessageBox(publ_operator,'固定资产反计提折旧失败>>查询固定资产累计折旧对应记由凭证失败')
  440. RETURN
  441. ELSEIF sqlca.SQLCode = 100 THEN
  442. ELSE
  443. IF uo_cred.del(1,ls_subaccsetid,ls_credid,arg_msg,FALSE) = 0 THEN
  444. MessageBox(publ_operator,'固定资产反计提折旧失败>>删除固定资产累计折旧对应凭证失败')
  445. ROLLBACK;
  446. RETURN
  447. END IF
  448. END IF
  449. COMMIT;
  450. MessageBox(publ_operator,'本期计提的折旧已经被成功地反计提')
  451. END IF
  452. DESTROY uo_cred
  453. end subroutine