f_warebalc_cmpl_one.srf 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459
  1. $PBExportHeader$f_warebalc_cmpl_one.srf
  2. global type f_warebalc_cmpl_one from function_object
  3. end type
  4. forward prototypes
  5. global function integer f_warebalc_cmpl_one (long arg_storageid, long arg_balcdateint, long arg_mtrlwareid, ref string arg_msg, boolean arg_ifcommit, transaction commit_transaction)
  6. end prototypes
  7. global function integer f_warebalc_cmpl_one (long arg_storageid, long arg_balcdateint, long arg_mtrlwareid, ref string arg_msg, boolean arg_ifcommit, transaction commit_transaction);
  8. Long rslt = 1
  9. Int li_storagetype
  10. Long ll_scid_storage
  11. Long ll_balcdateint_cmpl_arr[], ll_cmpl_cnt
  12. Long ll_balcdateint
  13. Long cnt
  14. Long ll_balcdateint_cmpl = 0 //要计算的月份结存日期
  15. Long ll_balcdateint_last //= ? 前一个月份的结存日期
  16. Long i
  17. Decimal ld_newcost // 最新成本价
  18. //Decimal ld_balcqty_last,ld_balcamt_last,ld_inamt,ld_inqty,ld_outamt,ld_outqty
  19. //Decimal ld_ubalcqty_last,ld_uinqty,ld_uoutqty
  20. Decimal ld_bgqty,ld_bgamt,ld_incqty,ld_incamt,ld_desqty,ld_desamt
  21. Decimal ld_ubgqty,ld_uincqty,ld_udesqty
  22. Long ll_mtrlid
  23. Int li_ifunit
  24. String ls_status,ls_pcode,ls_woodcode
  25. String ls_mtrlcode,ls_msg
  26. Decimal ld_balcqty_update,ld_balcamt_update
  27. Decimal ld_desamt_update,ld_outcost_update
  28. //Long m
  29. //Long ll_mtrlid_last,ll_scid_last
  30. //String ls_status_last,ls_woodcode_last,ls_pcode_last
  31. //String ls_plancode_last,ls_mtrlcuscode_last,ls_location_last
  32. //Int li_dxflag_last
  33. //Long ll_sptid_last
  34. //Long arg_mtrlwareid_last
  35. //Decimal ld_qty_last,ld_amt_last
  36. Decimal lde_add_desamt, lde_costamt_add, lde_addamt
  37. Long ll_scid_add, ll_outwareid_add, ll_printid_add
  38. Decimal ld_vincqty,ld_vincamt,ld_vdesqty,ld_vdesamt,ld_uvincqty,ld_uvdesqty
  39. Decimal ld_vinqty,ld_vuinqty,ld_vinamt
  40. Decimal ld_voutqty,ld_vuoutqty,ld_voutamt
  41. IF arg_storageid = -1 THEN
  42. arg_msg = '请先选择仓库'
  43. GOTO ext
  44. END IF
  45. SELECT scid,storagetype
  46. INTO :ll_scid_storage,:li_storagetype
  47. FROM u_storage
  48. Where storageid = :arg_storageid
  49. using commit_transaction;
  50. IF commit_transaction.SQLCode <> 0 THEN
  51. arg_msg = '查询仓库资料失败,操作取消'
  52. GOTO ext
  53. END IF
  54. SELECT count(*)
  55. INTO :cnt
  56. FROM u_inwaremx INNER JOIN
  57. u_inware ON u_inwaremx.scid = u_inware.scid AND
  58. u_inwaremx.inwareid = u_inware.inwareid
  59. WHERE (u_inware.flag = 1)
  60. AND u_inware.balcdateint = :ll_balcdateint_cmpl
  61. AND u_inwaremx.mtrlwareid = 0
  62. And u_inware.storageid = :arg_storageid
  63. using commit_transaction;
  64. IF commit_transaction.SQLCode <> 0 THEN
  65. arg_msg = '查询进仓明细库存ID失败,'+commit_transaction.SQLErrText
  66. rslt = 0
  67. GOTO ext
  68. END IF
  69. IF cnt > 0 THEN
  70. arg_msg = '进仓明细存在非法库存ID,请先更新进仓明细库存ID'
  71. GOTO ext
  72. END IF
  73. SELECT u_mtrldef.mtrlcode, u_warebalc.status, u_warebalc.woodcode,
  74. u_warebalc.pcode, u_mtrldef.ifunit
  75. INTO :ls_mtrlcode, :ls_status, :ls_woodcode, :ls_pcode, :li_ifunit
  76. FROM u_warebalc INNER JOIN
  77. u_mtrldef ON u_warebalc.mtrlid = u_mtrldef.mtrlid
  78. WHERE u_warebalc.storageid = :arg_storageid
  79. AND u_warebalc.balcdateint = :arg_balcdateint
  80. And u_warebalc.mtrlwareid = :arg_mtrlwareid
  81. using commit_transaction;
  82. IF commit_transaction.SQLCode <> 0 THEN
  83. rslt = 0
  84. arg_msg = '查询结存信息失败,'+commit_transaction.SQLErrText
  85. GOTO ext
  86. END IF
  87. //确定要计算的范围
  88. IF arg_balcdateint = 0 THEN
  89. ll_cmpl_cnt++
  90. ll_balcdateint_cmpl_arr[ll_cmpl_cnt] = arg_balcdateint
  91. ELSE
  92. DECLARE waredate_cur CURSOR FOR
  93. SELECT distinct u_warebalc.balcdateint
  94. FROM u_warebalc
  95. WHERE ( storageid = :arg_storageid )
  96. AND balcdateint >= :arg_balcdateint
  97. Order By balcdateint
  98. using commit_transaction;
  99. OPEN waredate_cur;
  100. FETCH waredate_cur Into :ll_balcdateint;
  101. DO WHILE commit_transaction.SQLCode = 0 //循环读取明细数据
  102. ll_cmpl_cnt++
  103. ll_balcdateint_cmpl_arr[ll_cmpl_cnt] = ll_balcdateint
  104. FETCH waredate_cur Into :ll_balcdateint;
  105. LOOP
  106. CLOSE waredate_cur;
  107. ll_cmpl_cnt++
  108. ll_balcdateint_cmpl_arr[ll_cmpl_cnt] = 0
  109. END IF
  110. ll_balcdateint_cmpl = ll_balcdateint_cmpl_arr[1] //按选择, 可以重算历史
  111. SELECT max(balcdateint) INTO :ll_balcdateint_last
  112. FROM u_warebalc
  113. WHERE storageid = :arg_storageid
  114. AND ((:ll_balcdateint_cmpl = 0 AND balcdateint > 0)
  115. Or (:ll_balcdateint_cmpl > 0 And balcdateint > 0 And balcdateint < :ll_balcdateint_cmpl))
  116. using commit_transaction;
  117. IF commit_transaction.SQLCode <> 0 THEN
  118. rslt = 0
  119. arg_msg = '查询上次结存失败,操作取消'
  120. GOTO ext
  121. END IF
  122. IF IsNull(ll_balcdateint_last) THEN ll_balcdateint_last = -1
  123. FOR i = 1 To ll_cmpl_cnt
  124. ll_balcdateint_cmpl = ll_balcdateint_cmpl_arr[i]
  125. ls_msg = '期间:'+String(ll_balcdateint_cmpl)+',库存id:'+String(arg_mtrlwareid)+',物料:'+ls_mtrlcode+','+sys_option_change_status+':'+ls_status+','+sys_option_change_woodcode+':'+ls_woodcode+','+sys_option_change_pcode+':'+ls_pcode
  126. //查期初
  127. SELECT balcqty,balcamt,ubalcqty
  128. INTO :ld_bgqty,:ld_bgamt,:ld_ubgqty
  129. FROM u_warebalc
  130. WHERE storageid = :arg_storageid
  131. AND mtrlwareid = :arg_mtrlwareid
  132. And balcdateint = :ll_balcdateint_last
  133. using commit_transaction;
  134. IF commit_transaction.SQLCode = -1 THEN
  135. rslt = 0
  136. arg_msg = '查询上月结存失败,'+ls_msg+','+commit_transaction.SQLErrText
  137. GOTO ext
  138. ELSEIF commit_transaction.SQLCode = 100 THEN
  139. ld_bgqty = 0
  140. ld_bgamt = 0
  141. ld_ubgqty = 0
  142. END IF
  143. IF IsNull(ld_bgqty) THEN ld_bgqty = 0
  144. IF IsNull(ld_bgamt) THEN ld_bgamt = 0
  145. IF IsNull(ld_ubgqty) THEN ld_ubgqty = 0
  146. //查进仓
  147. SELECT isnull(sum(u_inwaremx.qty),0),
  148. isnull(sum(u_inwaremx.uqty),0),
  149. isnull(sum(round(u_inwaremx.cost * u_inwaremx.qty,2)),0),
  150. isnull(sum(case u_inwaremx.ifvqty when 0 then 0 else u_inwaremx.qty END ),0),
  151. isnull(sum(case u_inwaremx.ifvqty when 0 then 0 else u_inwaremx.uqty END ),0),
  152. isnull(sum(round(u_inwaremx.cost * case u_inwaremx.ifvqty when 0 then 0 else u_inwaremx.qty END,2)),0)
  153. INTO :ld_incqty,
  154. :ld_uincqty,
  155. :ld_incamt,
  156. :ld_vincqty,
  157. :ld_uvincqty,
  158. :ld_vincamt
  159. FROM u_inware,u_inwaremx
  160. WHERE u_inware.scid = u_inwaremx.scid
  161. AND u_inware.inwareid = u_inwaremx.inwareid
  162. AND u_inwaremx.mtrlwareid = :arg_mtrlwareid
  163. AND u_inware.storageid = :arg_storageid
  164. AND u_inware.balcdateint = :ll_balcdateint_cmpl
  165. And u_inware.flag = 1
  166. using commit_transaction;
  167. IF commit_transaction.SQLCode <> 0 THEN
  168. rslt = 0
  169. arg_msg = '查询本月进仓失败,'+ls_msg+','+commit_transaction.SQLErrText
  170. GOTO ext
  171. END IF
  172. IF IsNull(ld_incqty) THEN ld_incqty = 0
  173. IF IsNull(ld_incamt) THEN ld_incamt = 0
  174. IF IsNull(ld_uincqty) THEN ld_uincqty = 0
  175. IF IsNull(ld_vincqty) THEN ld_vincqty = 0
  176. IF IsNull(ld_vincamt) THEN ld_vincamt = 0
  177. IF IsNull(ld_uvincqty) THEN ld_uvincqty = 0
  178. //查出仓
  179. SELECT isnull(sum(u_outwaremx.qty),0),
  180. isnull(sum(u_outwaremx.uqty),0),
  181. isnull(sum(round(u_outwaremx.costamt,2)),0),
  182. isnull(sum(case u_outwaremx.ifvqty when 0 then 0 else u_outwaremx.qty END),0),
  183. isnull(sum(case u_outwaremx.ifvqty when 0 then 0 else u_outwaremx.uqty END),0),
  184. isnull(sum(round(case u_outwaremx.ifvqty when 0 then 0 else u_outwaremx.costamt END,2)),0)
  185. INTO :ld_desqty,
  186. :ld_udesqty,
  187. :ld_desamt,
  188. :ld_vdesqty,
  189. :ld_uvdesqty,
  190. :ld_vdesamt
  191. FROM u_outware,u_outwaremx
  192. WHERE u_outware.scid = u_outwaremx.scid
  193. AND u_outware.outwareid = u_outwaremx.outwareid
  194. AND u_outwaremx.mtrlwareid = :arg_mtrlwareid
  195. AND u_outware.storageid = :arg_storageid
  196. AND u_outware.balcdateint = :ll_balcdateint_cmpl
  197. And u_outware.flag = 1
  198. using commit_transaction;
  199. IF commit_transaction.SQLCode <> 0 THEN
  200. rslt = 0
  201. arg_msg = '查询本月出仓失败,'+ls_msg+','+commit_transaction.SQLErrText
  202. GOTO ext
  203. END IF
  204. IF IsNull(ld_desqty) THEN ld_desqty = 0
  205. IF IsNull(ld_desamt) THEN ld_desamt = 0
  206. IF IsNull(ld_udesqty) THEN ld_udesqty = 0
  207. IF IsNull(ld_vdesqty) THEN ld_vdesqty = 0
  208. IF IsNull(ld_vdesamt) THEN ld_vdesamt = 0
  209. IF IsNull(ld_uvdesqty) THEN ld_uvdesqty = 0
  210. IF ld_bgqty + ld_incqty <> 0 THEN
  211. ld_outcost_update = Round((ld_bgamt + ld_incamt) / (ld_bgqty + ld_incqty),sys_option_cost_dec)
  212. ELSEIF ld_desqty <> 0 And ld_desamt <> 0 THEN //有可能是先退仓, 再出仓
  213. ld_outcost_update = Round(ld_desamt / ld_desqty,sys_option_cost_dec)
  214. ELSE
  215. ld_outcost_update = 0
  216. END IF
  217. IF ld_outcost_update < 0 THEN ld_outcost_update = 0
  218. UPDATE u_outwaremx
  219. SET u_outwaremx.cost = :ld_outcost_update,
  220. u_outwaremx.costamt = round(u_outwaremx.qty * :ld_outcost_update,2)
  221. FROM u_outwaremx INNER JOIN
  222. u_outware ON u_outwaremx.scid = u_outware.scid AND
  223. u_outwaremx.outwareid = u_outware.outwareid
  224. WHERE u_outwaremx.mtrlwareid = :arg_mtrlwareid
  225. AND u_outware.storageid = :arg_storageid
  226. AND u_outware.scid = :ll_scid_storage
  227. And u_outware.balcdateint = :ll_balcdateint_cmpl
  228. using commit_transaction;
  229. IF commit_transaction.SQLCode <> 0 THEN
  230. rslt = 0
  231. arg_msg = '更新未结存的出仓单金额失败,'+ls_msg+','+commit_transaction.SQLErrText
  232. GOTO ext
  233. END IF
  234. //再读一次数,防止小数点的误差
  235. SELECT isnull(sum(round(u_outwaremx.costamt,2)),0)
  236. INTO :ld_desamt_update
  237. FROM u_outware,u_outwaremx
  238. WHERE u_outware.scid = u_outwaremx.scid
  239. AND u_outware.outwareid = u_outwaremx.outwareid
  240. AND u_outwaremx.mtrlwareid = :arg_mtrlwareid
  241. AND u_outware.storageid = :arg_storageid
  242. AND u_outware.balcdateint = :ll_balcdateint_cmpl
  243. And u_outware.flag = 1
  244. using commit_transaction;
  245. IF commit_transaction.SQLCode <> 0 THEN
  246. rslt = 0
  247. arg_msg = '重新查询本月出仓成本金额失败,'+ls_msg+','+commit_transaction.SQLErrText
  248. GOTO ext
  249. END IF
  250. //修正结余为负数; 结余数=0,结余金额<>0;的情况
  251. If (ld_bgqty + ld_incqty - ld_desqty = 0 And ld_bgamt + ld_incamt - ld_desamt_update <> 0) Or ld_bgamt + ld_incamt - ld_desamt_update < 0 THEN
  252. lde_add_desamt = ld_bgamt + ld_incamt - ld_desamt_update
  253. DECLARE outware CURSOR FOR
  254. SELECT u_outwaremx.scid, u_outwaremx.outwareid, u_outwaremx.printid, u_outwaremx.costamt
  255. FROM u_outware,u_outwaremx
  256. WHERE u_outware.scid = u_outwaremx.scid
  257. AND u_outware.outwareid = u_outwaremx.outwareid
  258. AND u_outwaremx.mtrlwareid = :arg_mtrlwareid
  259. AND u_outware.storageid = :arg_storageid
  260. AND u_outware.balcdateint = :ll_balcdateint_cmpl
  261. And u_outware.flag = 1
  262. using commit_transaction;
  263. OPEN outware;
  264. FETCH outware Into :ll_scid_add, :ll_outwareid_add, :ll_printid_add, :lde_costamt_add;
  265. DO WHILE commit_transaction.SQLCode = 0
  266. IF lde_add_desamt > 0 THEN
  267. lde_addamt = lde_costamt_add
  268. lde_costamt_add = 0
  269. ELSE
  270. IF lde_costamt_add > Abs(lde_add_desamt) THEN
  271. lde_addamt = lde_add_desamt
  272. lde_add_desamt = 0
  273. ELSE
  274. lde_addamt = 0 - lde_costamt_add
  275. lde_add_desamt = lde_add_desamt + lde_costamt_add
  276. END IF
  277. END IF
  278. UPDATE u_outwaremx
  279. SET costamt = costamt + :lde_addamt
  280. WHERE scid = :ll_scid_add
  281. AND outwareid = :ll_outwareid_add
  282. And printid = :ll_printid_add
  283. using commit_transaction;
  284. IF commit_transaction.SQLCode <> 0 THEN
  285. rslt = 0
  286. arg_msg = "修正出仓明细金额失败,"+commit_transaction.SQLErrText
  287. GOTO ext
  288. END IF
  289. IF lde_add_desamt = 0 THEN EXIT //完成修正
  290. FETCH outware Into :ll_scid_add, :ll_outwareid_add, :ll_printid_add, :lde_costamt_add;
  291. LOOP
  292. CLOSE outware;
  293. ld_desamt_update = ld_bgamt + ld_incamt
  294. END IF
  295. //yyx2012-10-27
  296. ld_balcqty_update = ld_bgqty + ld_incqty - ld_desqty
  297. ld_balcamt_update = ld_bgamt + ld_incamt - ld_desamt_update
  298. IF ld_balcqty_update <> 0 THEN
  299. ld_newcost = Round(ld_balcamt_update/ld_balcqty_update,sys_option_cost_dec)
  300. ELSE
  301. ld_newcost = ld_outcost_update
  302. END IF
  303. //yyx2012-10-27_end
  304. IF li_ifunit = 0 THEN
  305. ld_ubgqty = 0
  306. ld_uincqty = 0
  307. ld_udesqty = 0
  308. END IF
  309. //更新期间出金额,结存金额
  310. UPDATE u_warebalc
  311. SET bgqty = :ld_bgqty,
  312. bgamt = :ld_bgamt,
  313. incqty = :ld_incqty,
  314. incamt = :ld_incamt,
  315. desqty = :ld_desqty,
  316. desamt = :ld_desamt_update,
  317. balcqty = :ld_balcqty_update,
  318. balcamt = :ld_balcamt_update,
  319. ubgqty = :ld_ubgqty,
  320. uincqty = :ld_uincqty,
  321. udesqty = :ld_udesqty,
  322. ubalcqty = :ld_ubgqty + :ld_uincqty - :ld_udesqty,
  323. vincqty = :ld_vincqty,
  324. vdesqty = :ld_vdesqty,
  325. vincamt = :ld_vincamt,
  326. vdesamt = :ld_vdesamt,
  327. uvincqty = :ld_uvincqty,
  328. uvdesqty = :ld_uvdesqty
  329. WHERE mtrlwareid = :arg_mtrlwareid
  330. AND balcdateint = :ll_balcdateint_cmpl
  331. And scid = :ll_scid_storage;
  332. IF commit_transaction.SQLCode <> 0 THEN
  333. rslt = 0
  334. arg_msg = '更新结存失败,'+ls_msg+','+commit_transaction.SQLErrText
  335. GOTO ext
  336. END IF
  337. IF ll_balcdateint_cmpl = 0 THEN
  338. UPDATE u_mtrlware
  339. SET cost = :ld_newcost,
  340. noallocqty = :ld_balcqty_update,
  341. unoallocqty = :ld_ubgqty + :ld_uincqty - :ld_udesqty,
  342. wareamt = :ld_balcamt_update
  343. WHERE mtrlwareid = :arg_mtrlwareid
  344. AND Storageid = :arg_storageid
  345. And scid = :ll_scid_storage
  346. using commit_transaction;
  347. IF commit_transaction.SQLCode <> 0 THEN
  348. rslt = 0
  349. arg_msg = '更新库存金额失败,'+ls_msg+','+commit_transaction.SQLErrText
  350. GOTO ext
  351. END IF
  352. END IF
  353. //更新分类结存
  354. DECLARE sp_warebalc_cmpl PROCEDURE FOR sp_warebalc_cmpl
  355. @scid = :ll_scid_storage,
  356. @storageid = :arg_storageid,
  357. @balcdateint = :ll_balcdateint_cmpl,
  358. @balcdateintlast = :ll_balcdateint_last,
  359. @mtrlwareid = :arg_mtrlwareid ;
  360. EXECUTE sp_warebalc_cmpl ;
  361. CLOSE sp_warebalc_cmpl;
  362. ll_balcdateint_last = ll_balcdateint_cmpl //为下个循环准备
  363. NEXT
  364. ext:
  365. IF rslt = 0 THEN
  366. ROLLBACK using commit_transaction;
  367. ELSEIF arg_ifcommit THEN
  368. COMMIT using commit_transaction;
  369. END IF
  370. RETURN rslt
  371. end function