Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- SET QUOTED_IDENTIFIER ON
- GO
- SET ANSI_NULLS ON
- GO
- ALTER PROCEDURE fcalc_final
- -- Add the parameters for the stored procedure here
- @data int, @plan_prz bigint, @plan_hoz bigint, @plan_brak bigint, @plan_infond bigint, @plan_kom BIGINT, @kom2050 BIGINT, @pr SMALLINT, @error smallint output
- AS
- BEGIN
- SET @error = 0
- /*
- @PR - признак оперрации. не всегда нужно выполнять весь просчет калькуляции в отдельных случаях необходимо обновить часть калькуляции
- @pr = 0 для генерации всей калькуляции
- @pr = 1 для 25 счета и тянет за собой пересчет себестоимостей и затрат
- @pr = 2 для 26 счета и тянет за собой пересчет себестоимостей и затрат
- @pr = 3 для брака и тянет за собой пересчет себестоимостей и затрат
- @pr = 6 при изменении зарплаты и тянет за собой пересчет себестоимостей и затрат и 25 и 26 статью
- @pr = 7 при изменении любой ячейки калькуляции за собой пересчет себестоимостей и затрат
- */
- IF @pr = 0
- BEGIN
- IF exists(SELECT * FROM fcalc_kalk WHERE dt = @data)
- DELETE FROM fcalc_kalk WHERE dt = @data
- --курсор выбирает все шпз из таблицы информации ПЭО. по ним и идет расчет всей калькуляции
- DECLARE @f_shpz SMALLINT, @cnt SMALLINT
- SET @cnt = 1
- DECLARE shpz_cur CURSOR
- LOCAL
- FAST_FORWARD
- FOR SELECT shpz FROM fcalc_PEO WHERE dt = @data
- OPEN shpz_cur
- WHILE @cnt <= (SELECT COUNT(shpz) FROM fcalc_PEO WHERE dt = @data)
- BEGIN
- FETCH shpz_cur
- INTO @f_shpz
- EXEC fcalc_fact @f_shpz, @data, @error OUTPUT
- SET @cnt = @cnt+1
- END
- CLOSE shpz_cur
- DEALLOCATE shpz_cur
- END
- --расчет затрат по 25 и 26 статьям
- --declare @data int, @plan_prz bigint
- --set @data = 201007
- --set @plan_prz = 950000000
- --необходимо учитывать что по шифрам 2080 и 2065 нет процента (25 счет) а на их месте хранится непосредсвенное значение для фактической калькуляции. следовательное плановое число берется с вычетом этих значений.
- --производственные расходы (25 счет)
- IF (@pr = 1) OR (@pr = 0) or (@pr = 6)
- BEGIN
- -- 25 счет
- DECLARE @itog_prz bigint, @koef_prz DECIMAL(18,16)
- 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)
- 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)
- --SELECT @itog_prz, @koef_prz
- update fcalc_kalk
- 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)
- FROM fcalc_kalk
- inner join fcalc_PEO
- 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))
- --where dt = @data and(shpz<>2065 and shpz<>2080)
- update fcalc_kalk
- set fcalc_kalk.proiz_rashod = fcalc_PEO.procent_prz
- from fcalc_kalk
- inner join fcalc_PEO
- 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) )
- END
- IF (@pr = 2) OR (@pr = 0) or (@pr = 6)
- BEGIN
- --26 счет
- DECLARE @itog_hoz bigint, @koef_hoz decimal(18,8) -- тут хранится планoвый процент.
- 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)
- SET @koef_hoz = cast(@plan_hoz as DECIMAL(18,8))/cast(@itog_hoz as DECIMAL)
- update fcalc_kalk
- 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)
- FROM
- fcalc_kalk
- inner join fcalc_PEO
- on (fcalc_kalk.dt = @data and fcalc_kalk.dt = fcalc_PEO.dt and fcalc_kalk.shpz = fcalc_PEO.shpz)
- END
- IF (@pr = 3) OR (@pr = 0)
- BEGIN
- --расчет затрат на брак
- declare @proch bigint, @brak_koef DECIMAL(18,14)
- set @proch = (select sum(proch) from fcalc_kalk where dt = @data)
- set @brak_koef = round(cast(@plan_brak as decimal)/cast(@proch as decimal), 14)
- update fcalc_kalk
- set brak = round(isnull(proch, 0)*@brak_koef, 0)
- where dt = @data
- END
- IF (@pr = 5) OR (@pr = 4) OR (@pr = 0)
- declare @tov_vip BIGINT
- IF (@pr = 4) OR (@pr = 0)
- BEGIN
- DECLARE @infond_koef DECIMAL(18,14)
- --расчет затрат на инновационный фонд
- set @tov_vip = (select sum(tov_vip) from fcalc_kalk where dt = @data)
- set @infond_koef = round(cast(@plan_infond as decimal)/cast(@tov_vip as decimal), 14)
- update fcalc_kalk
- set in_fond = round(tov_vip*@infond_koef, 0)
- where dt = @data
- END
- IF (@pr = 0) or (@pr = 6) or (@pr = 7) OR (@pr = 1) OR (@pr = 2) OR (@pr = 3) OR (@pr = 4) OR (@pr = 5)
- BEGIN
- --расчет производственной себестоимости
- update fcalc_kalk
- 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
- where dt = @data
- END
- IF (@pr = 5) OR (@pr = 0) OR (@pr = 6) OR (@pr = 7) OR (@pr = 1) OR (@pr = 2) OR (@pr = 3) OR (@pr = 4)
- BEGIN
- -- расчет коммерческих расходов
- DECLARE @kom_koef DECIMAL(18,12)
- DECLARE @pr_seb BIGINT
- SET @pr_seb = (SELECT SUM(pr_seb) FROM fcalc_kalk WHERE dt = @data AND shpz <> 2050)
- SET @plan_kom = @plan_kom - @kom2050
- set @kom_koef = round(cast(@plan_kom as decimal)/cast(@pr_seb as decimal), 12)
- update fcalc_kalk
- set kom_rash = round(pr_seb*@kom_koef, 0)
- where dt = @data AND shpz <> 2050
- END
- IF (@pr = 0)
- BEGIN
- update fcalc_kalk -- отдельно вводится для ШПЗ 2050
- set kom_rash = @kom2050
- where dt = @data AND shpz = 2050
- end
- 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)
- begin
- --расчет полной себестоимости
- update fcalc_kalk
- set pol_seb = pr_seb +kom_rash
- where dt = @data
- --расчет рентабельности
- update fcalc_kalk
- set rent = cast( round(CAST((tov_vip - pol_seb) AS DECIMAL)/ CAST( pol_seb AS DECIMAL)*100,4) AS DECIMAL(12,4))
- where dt = @data
- --расчет затраты на 1 руб.
- update fcalc_kalk
- set zatrat = ROUND((CAST( pol_seb AS DECIMAL)/ tov_vip ),4)
- where dt = @data
- END
- END
- GO
- SET QUOTED_IDENTIFIER OFF
- GO
- SET ANSI_NULLS ON
- GO
Add Comment
Please, Sign In to add comment