Guest User

Untitled

a guest
Jan 12th, 2018
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 7.24 KB | None | 0 0
  1. SET QUOTED_IDENTIFIER ON
  2. GO
  3. SET ANSI_NULLS ON
  4. GO
  5.  
  6.  
  7.  
  8.  
  9.  
  10. ALTER      PROCEDURE fcalc_final
  11.     -- Add the parameters for the stored procedure here
  12. @data int, @plan_prz bigint, @plan_hoz bigint, @plan_brak bigint, @plan_infond bigint, @plan_kom BIGINT, @kom2050 BIGINT, @pr SMALLINT, @error smallint output
  13. AS
  14. BEGIN
  15. SET @error = 0
  16. /*
  17. @PR - признак оперрации. не всегда нужно выполнять весь просчет калькуляции в отдельных случаях необходимо обновить часть калькуляции
  18. @pr = 0 для генерации всей калькуляции
  19. @pr = 1 для 25 счета и тянет за собой пересчет себестоимостей и затрат
  20. @pr = 2 для 26 счета и тянет за собой пересчет себестоимостей и затрат
  21. @pr = 3 для брака и тянет за собой пересчет себестоимостей и затрат
  22. @pr = 6 при изменении зарплаты и тянет за собой пересчет себестоимостей и затрат и 25 и 26 статью
  23. @pr = 7 при изменении любой ячейки калькуляции за собой пересчет себестоимостей и затрат
  24.  */
  25.  
  26. IF @pr = 0
  27. BEGIN
  28.    
  29. IF exists(SELECT * FROM fcalc_kalk WHERE dt = @data)
  30. DELETE FROM fcalc_kalk WHERE dt = @data
  31. --курсор выбирает все шпз из таблицы информации ПЭО. по ним и идет расчет всей калькуляции
  32.  DECLARE @f_shpz SMALLINT, @cnt SMALLINT
  33.  SET @cnt = 1
  34.  DECLARE shpz_cur CURSOR
  35.     LOCAL
  36.     FAST_FORWARD
  37.     FOR SELECT shpz FROM fcalc_PEO WHERE dt = @data
  38. OPEN shpz_cur
  39.  
  40. WHILE @cnt <= (SELECT COUNT(shpz) FROM fcalc_PEO WHERE dt = @data)
  41. BEGIN
  42.     FETCH shpz_cur
  43.         INTO @f_shpz
  44.     EXEC fcalc_fact @f_shpz, @data, @error OUTPUT
  45.     SET @cnt = @cnt+1      
  46. END
  47.  
  48. CLOSE shpz_cur
  49. DEALLOCATE shpz_cur
  50.  
  51. END
  52. --расчет затрат по 25 и  26 статьям
  53. --declare @data int, @plan_prz bigint
  54. --set @data = 201007
  55. --set @plan_prz = 950000000
  56.  
  57.  
  58.  
  59. --необходимо учитывать что по шифрам 2080 и 2065 нет процента (25 счет) а на их месте хранится непосредсвенное значение для фактической калькуляции. следовательное плановое число берется с вычетом этих значений.
  60. --производственные расходы (25 счет)
  61.  
  62. IF (@pr = 1) OR (@pr = 0) or (@pr = 6)
  63. BEGIN
  64. -- 25 счет
  65. DECLARE @itog_prz bigint, @koef_prz DECIMAL(18,16)
  66. set @itog_prz = ROUND((SELECT SUM(CAST((a.zp + a.otkl_zp) AS DECIMAL)* ROUND(isnull(b.procent_prz, 0), 1) /100)FROM fcalc_kalk a, fcalc_PEO b  wheRE a.dt = @data AND a.shpz = b.shpz and a.dt = b.dt and (b.shpz <> 2065 and b.shpz <> 2080 and b.shpz <> 2050)),0)
  67. SET @koef_prz = cast((@plan_prz - (select sum(procent_prz) from fcalc_PEO where (shpz = 2065 or shpz = 2080 or shpz = 2050) and dt = @data)) as decimal)/cast(@itog_prz as DECIMAL)
  68.     --SELECT @itog_prz, @koef_prz
  69.     update fcalc_kalk  
  70.     set fcalc_kalk.proiz_rashod =  ROUND(CAST((fcalc_kalk.zp + fcalc_kalk.otkl_zp) AS DECIMAL(18,8))* ROUND(fcalc_PEO.procent_prz, 1)/100 * @koef_prz  ,0)
  71.     FROM fcalc_kalk
  72.     inner join fcalc_PEO
  73.     on (fcalc_kalk.dt = @data AND fcalc_kalk.shpz = fcalc_PEO.shpz and fcalc_kalk.dt = fcalc_PEO.dt and (fcalc_PEO.shpz <> 2065 and fcalc_PEO.shpz <> 2080 and fcalc_PEO.shpz <> 2050))
  74.     --where dt = @data and(shpz<>2065 and shpz<>2080)
  75.     update fcalc_kalk
  76.     set fcalc_kalk.proiz_rashod = fcalc_PEO.procent_prz
  77.     from fcalc_kalk
  78.     inner join fcalc_PEO
  79.     on (fcalc_kalk.dt = @data and fcalc_kalk.dt = fcalc_PEO.dt and fcalc_kalk.shpz = fcalc_PEO.shpz and(fcalc_PEO.shpz = 2080 or fcalc_PEO.shpz = 2065 or fcalc_PEO.shpz = 2050) )
  80.  
  81. END
  82. IF (@pr = 2) OR (@pr = 0) or (@pr = 6)
  83. BEGIN
  84. --26 счет
  85.  
  86. DECLARE @itog_hoz bigint,  @koef_hoz decimal(18,8) -- тут хранится планoвый процент.
  87. set @itog_hoz = ROUND((SELECT SUM(CAST((a.zp + a.otkl_zp) AS DECIMAL)* ROUND(b.procent_hoz, 1) /100)FROM fcalc_kalk a, fcalc_PEO b  wheRE a.dt = @data AND a.shpz = b.shpz and a.dt = b.dt),0)
  88. SET @koef_hoz = cast(@plan_hoz  as DECIMAL(18,8))/cast(@itog_hoz as DECIMAL)
  89.  
  90.     update fcalc_kalk
  91.     set fcalc_kalk.hoz_rashod = ROUND(CAST((fcalc_kalk.zp + fcalc_kalk.otkl_zp) AS DECIMAL(18,8))* ROUND(fcalc_PEO.procent_hoz, 1)/100 * @koef_hoz  ,0)
  92.     FROM
  93.     fcalc_kalk
  94.     inner join fcalc_PEO
  95.     on (fcalc_kalk.dt = @data and fcalc_kalk.dt = fcalc_PEO.dt and fcalc_kalk.shpz = fcalc_PEO.shpz)
  96. END
  97.  
  98. IF (@pr = 3) OR (@pr = 0)
  99. BEGIN
  100. --расчет затрат на брак
  101.  
  102. declare @proch bigint, @brak_koef DECIMAL(18,14)
  103. set @proch = (select sum(proch) from fcalc_kalk where dt = @data)
  104. set @brak_koef  = round(cast(@plan_brak as decimal)/cast(@proch as decimal), 14)
  105.     update fcalc_kalk
  106.     set brak = round(isnull(proch, 0)*@brak_koef, 0)
  107.     where dt = @data
  108. END
  109. IF (@pr = 5) OR (@pr = 4) OR (@pr = 0)
  110.     declare  @tov_vip BIGINT
  111.    
  112. IF (@pr = 4) OR (@pr = 0)
  113. BEGIN
  114. DECLARE @infond_koef DECIMAL(18,14)
  115.  
  116. --расчет затрат на инновационный фонд
  117.  
  118. set @tov_vip = (select sum(tov_vip) from fcalc_kalk where dt = @data)
  119. set @infond_koef  = round(cast(@plan_infond as decimal)/cast(@tov_vip as decimal), 14)
  120.     update fcalc_kalk
  121.     set in_fond = round(tov_vip*@infond_koef, 0)
  122.     where dt = @data
  123. END
  124. IF (@pr = 0) or (@pr = 6) or (@pr = 7) OR (@pr = 1) OR (@pr = 2)  OR (@pr = 3) OR (@pr = 4) OR (@pr = 5)
  125. BEGIN
  126. --расчет производственной себестоимости
  127.        
  128.     update fcalc_kalk
  129.     set pr_seb = cast(mat AS BIGINT) + otkl_mat + tzr_mat+ pki+ tzr_pki + otkl_pki + zp + otkl_zp + dop_zp + otchisl + proiz_rashod + hoz_rashod + brak+ in_fond + proch
  130.     where dt = @data
  131.  
  132. END
  133. IF (@pr = 5) OR (@pr = 0) OR (@pr = 6) OR (@pr = 7) OR (@pr = 1) OR (@pr = 2) OR (@pr = 3) OR (@pr = 4)
  134. BEGIN  
  135. -- расчет коммерческих расходов
  136. DECLARE @kom_koef DECIMAL(18,12)
  137. DECLARE @pr_seb BIGINT
  138. SET @pr_seb = (SELECT SUM(pr_seb) FROM fcalc_kalk WHERE dt = @data AND shpz <> 2050)
  139. SET @plan_kom = @plan_kom - @kom2050
  140. set @kom_koef  = round(cast(@plan_kom as decimal)/cast(@pr_seb as decimal), 12)
  141.     update fcalc_kalk
  142.     set kom_rash = round(pr_seb*@kom_koef, 0)
  143.     where dt = @data AND shpz <> 2050
  144. END
  145. IF (@pr = 0)
  146. BEGIN
  147. update fcalc_kalk -- отдельно вводится для ШПЗ 2050
  148.     set kom_rash = @kom2050
  149.     where dt = @data AND shpz = 2050
  150. end
  151. if (@pr = 0) or (@pr = 6) or (@pr = 7) OR (@pr = 1) OR (@pr = 2) OR (@pr = 3) OR (@pr = 4) OR (@pr = 5) OR (@pr = 8)
  152. begin
  153. --расчет полной себестоимости
  154.     update fcalc_kalk
  155.     set pol_seb = pr_seb +kom_rash
  156.     where dt = @data
  157. --расчет рентабельности
  158.    
  159.     update fcalc_kalk
  160.     set rent = cast( round(CAST((tov_vip - pol_seb) AS DECIMAL)/ CAST( pol_seb AS DECIMAL)*100,4) AS DECIMAL(12,4))
  161.     where dt = @data   
  162. --расчет затраты на 1 руб.
  163.     update fcalc_kalk
  164.     set zatrat = ROUND((CAST( pol_seb AS DECIMAL)/ tov_vip ),4)
  165.     where dt = @data
  166.    
  167. END
  168.  
  169. END
  170.  
  171.  
  172.  
  173.  
  174. GO
  175. SET QUOTED_IDENTIFIER OFF
  176. GO
  177. SET ANSI_NULLS ON
  178. GO
Add Comment
Please, Sign In to add comment