IF EXISTS (SELECT name FROM sysobjects WHERE name = N'AXI_KPI_CashFlow' AND type = 'FN') DROP FUNCTION dbo.AXI_KPI_CashFlow GO -- Имя функции должно быть указано в карточка показателя именно в формате [dbo].[ИМЯ_ФУНКЦИИ] CREATE FUNCTION [dbo].[AXI_KPI_CashFlow] -- Фиксированный набор параметров, которые ВСЕГДА передаются в функцию из вызывающей процедуры: ( @_per int, -- перспектива расчета. Варианты значения: -- 0 - рассчитать общее значение по всей системе -- 402 - считать по предприятию в котором работает сотрудник, -- 403 - считать по указанному подразделению, -- 404 - считать индивидуальный результат, @_otd int, -- идентификатор подразделения @_mes int, -- идентификатор месяца из справочников @_god int, -- идентификатор года из справочников @_sotr int -- идентификатор сотрудника ) RETURNS float -- функция может возвращать значения только типа FLOAT AS BEGIN DECLARE @_res float, -- результат, в который пойдет в значение функции @_dat1 datetime, -- дата начала периода @_dat2 datetime, -- дата окончания периода @_predpr int -- предприятие, в котором работает сотрудник -- Стандартные вычисления - их не менять! -- Определение ИДЕНТИФИКАТОРА ПРЕДПРИЯТИЯ, в котором работает сотрудник set @_predpr = (select p357 from attr6 a6 where a6.ObjectID = @_sotr) -- Определение ПЕРВОГО ЧИСЛА МЕСЯЦА в формате DATETIME, который был указана в качестве периода set @_dat1 = (SELECT [dbo].[AXI_MonthYearToFirstDate] ((select left(p361,2) from attr82 a82 where a82.ObjectID = @_mes), (select left(p361,4) from attr82 a82 where a82.ObjectID = @_god))) -- Определение ПОСЛЕДНЕГО ЧИСЛА МЕСЯЦА в формате DATETIME, который был указана в качестве периода set @_dat2 = (SELECT [dbo].[AXI_MonthYearToLastDate] ((select left(p361,2) from attr82 a82 where a82.ObjectID = @_mes), (select left(p361,4) from attr82 a82 where a82.ObjectID = @_god))) -- Расчет значения показателя если передана перспектива "индивидуальный результат" -- Сама логика расчета уже зависит от показателя. Ниже расчет для показателя "Выручки" if (@_per = 404) begin set @_res = isnull((select sum(isnull(p2760,0)) from attr254 a254 join attr119 a119 on a119.ObjectID = a254.p2758 where a254.p3475 = @_sotr --сотрудник, идентификатор на которого поступил в функцию как параметр and a119.p605 >= @_dat1 -- использование границы периода: первый день месяца and a119.p605 <= @_dat2 -- использование границы периода: последний день месяца ),0) end -- Расчет значения показателя если передана перспектива "подразделение" if (@_per = 403) begin set @_res = isnull((select sum(isnull(p2760,0)) from attr254 a254 join attr119 a119 on a119.ObjectID = a254.p2758 where a254.p4192 = @_otd --подразделение, идентификатор на которое поступил в функцию как параметр and a119.p605 >= @_dat1 -- использование границы периода: первый день месяца and a119.p605 <= @_dat2 -- использование границы периода: последний день месяца ),0) end -- Расчет значения показателя если передана перспектива "предприятие" if (@_per = 402) begin set @_res = isnull((select sum(isnull(p603,0)) from attr119 a119 join attr6 a6 on a6.ObjectID = a119.p2624 where a6.p357 = @_predpr -- предприятие, идентификатор которого определили выше and a119.p605 >= @_dat1 -- использование границы периода: первый день месяца and a119.p605 <= @_dat2 -- использование границы периода: последний день месяца ),0) end -- Расчет значения показателя если передана перспектива "по данным всей системы" if (@_per = 0) begin set @_res = isnull((select sum(isnull(p603,0)) from attr119 a119 where a119.p605 >= @_dat1 -- использование границы периода: первый день месяца and a119.p605 <= @_dat2 -- использование границы периода: последний день месяца ),0) end RETURN (@_res) END GO GRANT EXECUTE ON dbo.AXI_KPI_CashFlow TO public