先进先出220513.txt 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  1. ALTER PROCEDURE [dbo].[p_outware_cost_fifo_procedure](
  2. @arg_scid int,
  3. @arg_mtrlwareid int,
  4. @arg_date datetime,
  5. @arg_mod int,
  6. @arg_outwareid int,
  7. @arg_mtrlwaremxid int,
  8. @arg_rslt int out,
  9. @arg_msg varchar(255) out)
  10. AS
  11. BEGIN
  12. SET @arg_rslt = 0
  13. SET @arg_msg = ''
  14. DECLARE @error int
  15. DECLARE @rowcount int
  16. SET @error = null
  17. SET @rowcount = null
  18. DECLARE @cur1_outwareid int
  19. DECLARE @cur1_printid int
  20. DECLARE @cur1_qty decimal(23,10)
  21. DECLARE @cur1_curqty decimal(23,10)
  22. DECLARE @cur1_if_inware int
  23. DECLARE @cur_new_mtrlwaremxid int
  24. DECLARE @cur_new_usable_qty decimal(23,10)
  25. DECLARE @cur_new_inprice decimal(23,10)
  26. DECLARE @cur_new_inprice_notax decimal(23,10)
  27. DECLARE @cur_new_outqty decimal(23,10)
  28. IF @arg_mod=1 --正数进仓单 或 负数出仓单 仓审 恢复入库批出仓数量
  29. BEGIN
  30. --先判断一下是否要继续执行存储过程 优化速度yyuu
  31. DECLARE @rowcount_inmx int
  32. select @rowcount_inmx=COUNT(*) from u_mtrlware_inmx
  33. Where inwaredate >=@arg_date and outqty>0 and scid =@arg_scid and mtrlwareid=@arg_mtrlwareid
  34. -- IF @rowcount_inmx = 0
  35. -- BEGIN
  36. -- return 1
  37. -- END
  38. update u_mtrlware_inmx set u_mtrlware_inmx.outqty = case when u_mtrlware_inmx.outqty - isnull(u_temp.sumqty,0) <0 then 0 else u_mtrlware_inmx.outqty - ISNULL(u_temp.sumqty,0) end
  39. from u_mtrlware_inmx inner join
  40. (
  41. Select mtrlwaremxid ,SUM(qty) as sumqty from u_outwaremx_mtrlwaremx
  42. where Mtrlwaremxid in
  43. (select Mtrlwaremxid from u_mtrlware_inmx
  44. Where inwaredate >=@arg_date and outqty>0 and scid =@arg_scid and mtrlwareid=@arg_mtrlwareid )
  45. group by mtrlwaremxid
  46. ) u_temp on u_temp.mtrlwaremxid=u_mtrlware_inmx.mtrlwaremxid
  47. SELECT @error = @@ERROR, @rowcount = @@ROWCOUNT;
  48. IF @error <> 0
  49. BEGIN
  50. SET @arg_msg = '未知原因,更新库存入仓批已出仓数失败1'
  51. RAISERROR(@arg_msg, 18, 1)
  52. END
  53. --删除 u_outwaremx_mtrlwaremx
  54. delete u_outwaremx_mtrlwaremx from u_outwaremx_mtrlwaremx
  55. where Mtrlwaremxid in
  56. (select Mtrlwaremxid from u_mtrlware_inmx
  57. Where inwaredate >=@arg_date and scid =@arg_scid and mtrlwareid=@arg_mtrlwareid )
  58. SELECT @error = @@ERROR, @rowcount = @@ROWCOUNT;
  59. IF @error <> 0
  60. BEGIN
  61. SET @arg_msg = '未知原因,删除成本组成明细1'
  62. RAISERROR(@arg_msg, 18, 1)
  63. END
  64. delete u_outwaremx_mtrlwaremx where mtrlwaremxid=@arg_mtrlwaremxid
  65. SELECT @error = @@ERROR, @rowcount = @@ROWCOUNT;
  66. IF @error <> 0
  67. BEGIN
  68. SET @arg_msg = '未知原因,删除成本组成明细mtrlwaremxid'
  69. RAISERROR(@arg_msg, 18, 1)
  70. END
  71. END
  72. IF @arg_mod=2 --正数出仓单 或 负数进仓单 仓审 恢复入库批出仓数量
  73. BEGIN
  74. update u_mtrlware_inmx set u_mtrlware_inmx.outqty =case when u_mtrlware_inmx.outqty - isnull(u_temp.sumqty,0) <0 then 0 else u_mtrlware_inmx.outqty - ISNULL(u_temp.sumqty,0) end
  75. from u_mtrlware_inmx inner join
  76. (
  77. Select mtrlwaremxid ,isnull(SUM(qty),0) as sumqty from
  78. (
  79. select u_outwaremx_mtrlwaremx.mtrlwaremxid as mtrlwaremxid,
  80. isnull(SUM(u_outwaremx_mtrlwaremx.qty ),0) as qty
  81. from u_outwaremx inner Join u_outware on u_outware.scid =u_outwaremx.scid and u_outware.outwareid =u_outwaremx.outwareid
  82. inner join u_outwaremx_mtrlwaremx on u_outwaremx_mtrlwaremx.scid =u_outwaremx.scid and u_outwaremx_mtrlwaremx.outwareid =u_outwaremx.outwareid and u_outwaremx_mtrlwaremx.printid =u_outwaremx.printid
  83. where u_outwaremx_mtrlwaremx.if_inware=0 and u_outwaremx.qty >0 and u_outwaremx.scid =@arg_scid and mtrlwareid =@arg_mtrlwareid and u_outware.outdate >=@arg_date and (flag=1 or u_outware.outwareid=@arg_outwareid)
  84. group by mtrlwaremxid
  85. union all
  86. select u_outwaremx_mtrlwaremx.mtrlwaremxid as mtrlwaremxid,
  87. isnull(SUM(u_outwaremx_mtrlwaremx.qty ),0) as qty
  88. from u_inwaremx inner Join u_inware on u_inware.scid =u_inwaremx.scid and u_inware.inwareid =u_inwaremx.inwareid
  89. inner join u_outwaremx_mtrlwaremx on u_outwaremx_mtrlwaremx.scid =u_inwaremx.scid and u_outwaremx_mtrlwaremx.outwareid =u_inwaremx.inwareid and u_outwaremx_mtrlwaremx.printid =u_inwaremx.printid
  90. where u_outwaremx_mtrlwaremx.if_inware=1 and u_inwaremx.qty <0 and u_inwaremx.scid =@arg_scid and mtrlwareid =@arg_mtrlwareid and u_inware.indate >=@arg_date and (flag=1 or u_inware.inwareid=@arg_outwareid)
  91. group by mtrlwaremxid
  92. ) as v_zuhe_outwaremx group by mtrlwaremxid
  93. ) u_temp on u_temp.mtrlwaremxid=u_mtrlware_inmx.mtrlwaremxid
  94. SELECT @error = @@ERROR, @rowcount = @@ROWCOUNT;
  95. IF @error <> 0
  96. BEGIN
  97. SET @arg_msg = '未知原因,更新库存入仓批已出仓数失败2'
  98. RAISERROR(@arg_msg, 18, 1)
  99. END
  100. --删除 u_outwaremx_mtrlwaremx
  101. delete u_outwaremx_mtrlwaremx
  102. from u_outwaremx inner Join u_outware on u_outware.scid =u_outwaremx.scid and u_outware.outwareid =u_outwaremx.outwareid
  103. inner join u_outwaremx_mtrlwaremx on u_outwaremx_mtrlwaremx.scid =u_outwaremx.scid and u_outwaremx_mtrlwaremx.outwareid =u_outwaremx.outwareid and u_outwaremx_mtrlwaremx.printid =u_outwaremx.printid
  104. where u_outwaremx_mtrlwaremx.if_inware=0 and u_outwaremx.qty >0 and u_outwaremx.scid=@arg_scid and mtrlwareid =@arg_mtrlwareid and u_outware.outdate >=@arg_date and (flag=1 or u_outware.outwareid=@arg_outwareid)
  105. SELECT @error = @@ERROR, @rowcount = @@ROWCOUNT;
  106. IF @error <> 0
  107. BEGIN
  108. SET @arg_msg = '未知原因,删除成本组成明细3'
  109. RAISERROR(@arg_msg, 18, 1)
  110. END
  111. delete u_outwaremx_mtrlwaremx
  112. from u_inwaremx inner Join u_inware on u_inware.scid =u_inwaremx.scid and u_inware.inwareid =u_inwaremx.inwareid
  113. inner join u_outwaremx_mtrlwaremx on u_outwaremx_mtrlwaremx.scid =u_inwaremx.scid and u_outwaremx_mtrlwaremx.outwareid =u_inwaremx.inwareid and u_outwaremx_mtrlwaremx.printid =u_inwaremx.printid
  114. where u_outwaremx_mtrlwaremx.if_inware=1 and u_inwaremx.qty <0 and u_inwaremx.scid =@arg_scid and mtrlwareid =@arg_mtrlwareid and u_inware.indate >=@arg_date and (flag=1 or u_inware.inwareid=@arg_outwareid)
  115. SELECT @error = @@ERROR, @rowcount = @@ROWCOUNT;
  116. IF @error <> 0
  117. BEGIN
  118. SET @arg_msg = '未知原因,删除成本组成明细4'
  119. RAISERROR(@arg_msg, 18, 1)
  120. END
  121. END
  122. --双重游标算出仓成本
  123. DECLARE cur1 CURSOR LOCAL FOR
  124. select
  125. u_temp1.outwareid as outwareid,
  126. u_temp1.printid as printid,
  127. u_temp1.qty as qty,
  128. u_temp1.curqty as curqty,
  129. u_temp1.if_inware as if_inware
  130. from
  131. (
  132. select u_outwaremx.outwareid as outwareid,
  133. u_outwaremx.printid as printid,
  134. u_outwaremx.qty as qty,
  135. isnull(u_temp.curqty,0) as curqty,
  136. u_outware.outdate as chdate,
  137. 0 as If_inware
  138. from u_outwaremx inner join u_outware on u_outware.scid= u_outwaremx.scid and u_outware.outwareid = u_outwaremx.outwareid
  139. left join
  140. (
  141. select scid,outwareid,printid ,isnull(SUM(qty),0) as curqty from u_outwaremx_mtrlwaremx
  142. where u_outwaremx_mtrlwaremx.if_inware=0 group by scid,outwareid ,printid
  143. ) u_temp on u_outwaremx.scid =u_temp.scid and u_outwaremx.outwareid =u_temp.outwareid and u_outwaremx.printid =u_temp.printid
  144. where u_outwaremx.scid =@arg_scid and u_outwaremx.mtrlwareid =@arg_mtrlwareid and
  145. u_outwaremx.qty - isnull(u_temp.curqty,0) >0 and u_outwaremx.qty>0 and u_outware.flag =1
  146. union all
  147. select u_inwaremx.inwareid as outwareid,
  148. u_inwaremx.printid as printid,
  149. abs(u_inwaremx.qty) as qty,
  150. isnull(u_temp.curqty,0) as curqty,
  151. u_inware.indate as chdate,
  152. 1 as If_inware
  153. from u_inwaremx inner join u_inware on u_inware.scid= u_inwaremx.scid and u_inware.inwareid = u_inwaremx.inwareid
  154. left join
  155. (
  156. select scid,outwareid,printid ,isnull(SUM(qty),0) as curqty from u_outwaremx_mtrlwaremx
  157. where u_outwaremx_mtrlwaremx.if_inware=1 group by scid,outwareid ,printid
  158. ) u_temp on u_inwaremx.scid =u_temp.scid and u_inwaremx.inwareid =u_temp.outwareid and u_inwaremx.printid =u_temp.printid
  159. where u_inwaremx.scid =@arg_scid and u_inwaremx.mtrlwareid =@arg_mtrlwareid and
  160. abs( u_inwaremx.qty) - isnull(u_temp.curqty,0) >0 and u_inwaremx.qty<0 and u_inware.flag =1
  161. ) as u_temp1 order by u_temp1.chdate;
  162. OPEN cur1;
  163. set @cur1_outwareid =0
  164. set @cur1_printid =0
  165. set @cur1_qty =0
  166. set @cur1_curqty =0
  167. set @cur1_if_inware =0
  168. FETCH cur1 INTO @cur1_outwareid,@cur1_printid,@cur1_qty,@cur1_curqty,@cur1_if_inware;
  169. WHILE @@FETCH_STATUS = 0 AND @cur1_qty <> 0
  170. BEGIN
  171. DECLARE @remain_cur1_qty decimal(23,10)
  172. set @remain_cur1_qty= @cur1_qty - @cur1_curqty --计算还差多少数量未分配
  173. DECLARE cur_new CURSOR LOCAL FOR
  174. select mtrlwaremxid,inqty - outqty as usable_qty ,inprice,inprice_notax ,outqty
  175. from u_mtrlware_inmx
  176. where inqty - outqty >0 and scid=@arg_scid and mtrlwareid=@arg_mtrlwareid
  177. order by inwaredate , Mtrlwaremxid ;
  178. OPEN cur_new;
  179. set @cur_new_mtrlwaremxid=0
  180. set @cur_new_usable_qty =0
  181. set @cur_new_inprice =0
  182. set @cur_new_inprice_notax = 0
  183. set @cur_new_outqty =0
  184. FETCH cur_new INTO @cur_new_mtrlwaremxid,@cur_new_usable_qty,@cur_new_inprice,@cur_new_inprice_notax,@cur_new_outqty;
  185. WHILE @@FETCH_STATUS = 0 AND @remain_cur1_qty > 0
  186. BEGIN
  187. DECLARE @NOW_QTY decimal(23,10)
  188. IF @remain_cur1_qty<=@cur_new_usable_qty
  189. BEGIN
  190. set @NOW_QTY=@remain_cur1_qty
  191. set @remain_cur1_qty=0
  192. END
  193. ELSE
  194. BEGIN
  195. set @NOW_QTY=@cur_new_usable_qty
  196. set @remain_cur1_qty=@remain_cur1_qty - @cur_new_usable_qty
  197. END
  198. --更新库存入仓明细已占用数
  199. update u_mtrlware_inmx set outqty=outqty + isnull(@NOW_QTY,0) where mtrlwaremxid=@cur_new_mtrlwaremxid
  200. SELECT @error = @@ERROR, @rowcount = @@ROWCOUNT;
  201. IF @error <> 0
  202. BEGIN
  203. SET @arg_msg = '未知原因,更新库存入仓明细已占用数失败'
  204. RAISERROR(@arg_msg, 18, 1)
  205. END
  206. --插入成本组成表明细
  207. INSERT INTO u_outwaremx_mtrlwaremx
  208. (scid,
  209. outwareid,
  210. printid,
  211. mtrlwaremxid,
  212. qty,
  213. price,
  214. price_notax,
  215. If_inware)
  216. VALUES
  217. (
  218. @arg_scid,
  219. @cur1_outwareid,
  220. @cur1_printid,
  221. @cur_new_mtrlwaremxid,
  222. @NOW_QTY,
  223. @cur_new_inprice,
  224. @cur_new_inprice_notax,
  225. @cur1_if_inware
  226. )
  227. SELECT @error = @@ERROR, @rowcount = @@ROWCOUNT;
  228. IF @error <> 0
  229. BEGIN
  230. SET @arg_msg = '未知原因,插入成本组成表明细失败'
  231. RAISERROR(@arg_msg, 18, 1)
  232. END
  233. set @cur_new_mtrlwaremxid=0
  234. set @cur_new_usable_qty =0
  235. set @cur_new_inprice =0
  236. set @cur_new_inprice_notax = 0
  237. set @cur_new_outqty =0
  238. FETCH cur_new INTO @cur_new_mtrlwaremxid,@cur_new_usable_qty,@cur_new_inprice,@cur_new_inprice_notax,@cur_new_outqty;
  239. END
  240. CLOSE cur_new;
  241. DEALLOCATE cur_new;
  242. --通过成本组成表明细 计算 u_outwaremx 或 u_inwaremx 的 cost
  243. IF @cur1_if_inware = 0
  244. BEGIN
  245. update u_outwaremx set u_outwaremx.cost=u_temp.amt / u_temp.qty
  246. ,u_outwaremx.costamt = u_temp.amt
  247. ,u_outwaremx.cost_notax= u_temp.amt_notax / u_temp.qty
  248. ,u_outwaremx.costamt_notax = u_temp.amt_notax
  249. from u_outwaremx inner join
  250. (
  251. select scid,outwareid,printid,
  252. isnull(SUM(qty),0) as qty,
  253. isnull(SUM(qty * price),0) as amt,
  254. isnull(SUM(qty * price_notax),0) as amt_notax
  255. from u_outwaremx_mtrlwaremx
  256. where if_inware=0 and scid=@arg_scid and outwareid =@cur1_outwareid and printid=@cur1_printid
  257. group by scid,outwareid,printid
  258. ) u_temp on u_temp.scid=u_outwaremx.scid and u_temp.outwareid =u_outwaremx.outwareid and u_temp.printid =u_outwaremx.printid
  259. where u_temp.qty <>0 and u_outwaremx.scid=@arg_scid and u_outwaremx.outwareid =@cur1_outwareid and u_outwaremx.printid =@cur1_printid
  260. SELECT @error = @@ERROR, @rowcount = @@ROWCOUNT;
  261. IF @error <> 0
  262. BEGIN
  263. SET @arg_msg = '未知原因,计算出仓明细成本失败1'
  264. RAISERROR(@arg_msg, 18, 1)
  265. END
  266. END
  267. ELSE -- @cur1_if_inware = 1
  268. BEGIN
  269. update u_inwaremx set u_inwaremx.cost=u_temp.amt / u_temp.qty ,u_inwaremx.costamt =u_temp.amt * (-1)
  270. from u_inwaremx inner join
  271. (
  272. select scid,outwareid,printid,isnull(SUM(qty),0) as qty,isnull(SUM(qty * price),0) as amt from u_outwaremx_mtrlwaremx
  273. where if_inware=1 and scid=@arg_scid and outwareid =@cur1_outwareid and printid=@cur1_printid
  274. group by scid,outwareid,printid
  275. ) u_temp on u_temp.scid=u_inwaremx.scid and u_temp.outwareid =u_inwaremx.inwareid and u_temp.printid =u_inwaremx.printid
  276. where u_temp.qty <>0 and u_inwaremx.scid=@arg_scid and u_inwaremx.inwareid =@cur1_outwareid and u_inwaremx.printid =@cur1_printid
  277. SELECT @error = @@ERROR, @rowcount = @@ROWCOUNT;
  278. IF @error <> 0
  279. BEGIN
  280. SET @arg_msg = '未知原因,计算出仓明细成本失败2'
  281. RAISERROR(@arg_msg, 18, 1)
  282. END
  283. END
  284. set @cur1_outwareid =0
  285. set @cur1_printid =0
  286. set @cur1_qty =0
  287. set @cur1_curqty =0
  288. set @cur1_if_inware =0
  289. FETCH cur1 INTO @cur1_outwareid,@cur1_printid,@cur1_qty,@cur1_curqty,@cur1_if_inware;
  290. END
  291. CLOSE cur1;
  292. DEALLOCATE cur1;
  293. --更新库存表 成本 成本金额q
  294. update u_mtrlware set u_mtrlware.cost=case when u_temp.qty=0 then u_mtrlware.cost else u_temp.amt / u_temp.qty end
  295. ,u_mtrlware.wareamt =u_temp.amt
  296. ,u_mtrlware.cost_notax =case when u_temp.qty=0 then u_mtrlware.cost_notax else u_temp.amt_notax / u_temp.qty end
  297. ,u_mtrlware.wareamt_notax = u_temp.amt_notax
  298. from u_mtrlware left join
  299. (
  300. select scid,mtrlwareid ,isnull(sum(inqty - outqty),0) as qty ,isnull(sum((inqty - outqty) * inprice),0) as amt, isnull(sum((inqty - outqty) * inprice_notax),0) as amt_notax
  301. from u_mtrlware_inmx
  302. where inqty - outqty >=0 and scid=@arg_scid and mtrlwareid=@arg_mtrlwareid
  303. group by scid,mtrlwareid
  304. ) u_temp on u_temp.scid =u_mtrlware.scid and u_temp.mtrlwareid =u_mtrlware.mtrlwareid
  305. where u_temp.qty >=0 and u_mtrlware.scid=@arg_scid and u_mtrlware.mtrlwareid=@arg_mtrlwareid
  306. SELECT @error = @@ERROR, @rowcount = @@ROWCOUNT;
  307. IF @error <> 0
  308. BEGIN
  309. SET @arg_msg = '未知原因,更新库存表成本失败'
  310. RAISERROR(@arg_msg, 18, 1)
  311. END
  312. END
  313. GO