CREATE PROCEDURE RestByDocs @Клиент char(9), @ТА char(8) ='0' --если передаётся - учитываем гарантии и просрочку AS SET NOCOUNT ON CREATE TABLE #ПриходыРасходы ( [DATE_TIME_IDDOC] [char] (23) NOT NULL, [IDDOCDEF] [int] NOT NULL, [DEBKRED] [bit] NOT NULL , [SUMM] [numeric](14, 5) NOT NULL ) CREATE TABLE #Расходы ( [DATE_TIME_IDDOC] [char] (23) NOT NULL, [IDDOCDEF] [int] NOT NULL, [REST] [numeric](14, 5) NOT NULL DEFAULT 0 CONSTRAINT [PK_Расходы] PRIMARY KEY CLUSTERED ( [DATE_TIME_IDDOC] ) ) INSERT INTO #ПриходыРасходы (DATE_TIME_IDDOC, IDDOCDEF, DEBKRED, SUMM) SELECT ЗаВычетомВозвратов.DATE_TIME_IDDOC, ЗаВычетомВозвратов.IDDOCDEF, ЗаВычетомВозвратов.Приход, SUM(ЗаВычетомВозвратов.Сумма) FROM ( SELECT _1S_L_ОбщийЖурнал.DATE_TIME_IDDOC, _1S_L_ОбщийЖурнал.IDDOCDEF, _1S_L_РегВзаиморасчетыПокупателей_Дв.DEBKRED AS Приход, SUM(_1S_L_РегВзаиморасчетыПокупателей_Дв.Долг) AS Сумма FROM _1S_L_ОбщийЖурнал INNER JOIN _1S_L_РегВзаиморасчетыПокупателей_Дв ON _1S_L_ОбщийЖурнал.IDDOC = _1S_L_РегВзаиморасчетыПокупателей_Дв.IDDOC WHERE (_1S_L_РегВзаиморасчетыПокупателей_Дв.Клиент = ' 1A' + @Клиент) AND (NOT (_1S_L_РегВзаиморасчетыПокупателей_Дв.IDDOC IN (SELECT _1S_L_ДокПриходнаяНакладная.IDDOC FROM _1S_L_РегВзаиморасчетыПокупателей_Дв INNER JOIN _1S_L_ДокПриходнаяНакладная ON _1S_L_РегВзаиморасчетыПокупателей_Дв.IDDOC = _1S_L_ДокПриходнаяНакладная.IDDOC WHERE (_1S_L_ДокПриходнаяНакладная.ДокументОснование <> ' 0 0 ') AND (_1S_L_РегВзаиморасчетыПокупателей_Дв.Клиент = ' 1A' + @Клиент) GROUP BY _1S_L_ДокПриходнаяНакладная.IDDOC, _1S_L_ДокПриходнаяНакладная.ДокументОснование))) GROUP BY _1S_L_ОбщийЖурнал.DATE_TIME_IDDOC, _1S_L_ОбщийЖурнал.IDDOCDEF, _1S_L_РегВзаиморасчетыПокупателей_Дв.DEBKRED UNION ALL SELECT _1S_L_ОбщийЖурнал.DATE_TIME_IDDOC, _1S_L_ОбщийЖурнал.IDDOCDEF, 1- _1S_L_РегВзаиморасчетыПокупателей_Дв.DEBKRED AS Приход, - SUM(_1S_L_РегВзаиморасчетыПокупателей_Дв.Долг) AS Сумма FROM _1S_L_РегВзаиморасчетыПокупателей_Дв INNER JOIN _1S_L_ДокПриходнаяНакладная ON _1S_L_РегВзаиморасчетыПокупателей_Дв.IDDOC = _1S_L_ДокПриходнаяНакладная.IDDOC INNER JOIN _1S_L_ОбщийЖурнал ON _1S_L_ДокПриходнаяНакладная.ДокументОснование = ' BE' + _1S_L_ОбщийЖурнал.IDDOC WHERE (_1S_L_РегВзаиморасчетыПокупателей_Дв.Клиент = ' 1A' + @Клиент) GROUP BY _1S_L_ОбщийЖурнал.DATE_TIME_IDDOC, _1S_L_ОбщийЖурнал.IDDOCDEF, _1S_L_РегВзаиморасчетыПокупателей_Дв.DEBKRED, _1S_L_ДокПриходнаяНакладная.ДокументОснование ) AS ЗаВычетомВозвратов GROUP BY ЗаВычетомВозвратов.DATE_TIME_IDDOC, ЗаВычетомВозвратов.IDDOCDEF, ЗаВычетомВозвратов.Приход UNION ALL SELECT _1S_L_ОбщийЖурнал.DATE_TIME_IDDOC, _1S_L_ОбщийЖурнал.IDDOCDEF, _1S_L_РегВзаиморасчетыПоставщиков_Дв.DEBKRED AS Приход, SUM(_1S_L_РегВзаиморасчетыПоставщиков_Дв.Долг) AS Сумма FROM _1S_L_РегВзаиморасчетыПоставщиков_Дв INNER JOIN _1S_L_ОбщийЖурнал ON _1S_L_РегВзаиморасчетыПоставщиков_Дв.IDDOC = _1S_L_ОбщийЖурнал.IDDOC WHERE (_1S_L_РегВзаиморасчетыПоставщиков_Дв.Клиент = @Клиент) GROUP BY _1S_L_ОбщийЖурнал.DATE_TIME_IDDOC, _1S_L_ОбщийЖурнал.IDDOCDEF, _1S_L_РегВзаиморасчетыПоставщиков_Дв.DEBKRED if @ТА<>'0' INSERT INTO #ПриходыРасходы (DATE_TIME_IDDOC, IDDOCDEF, DEBKRED, SUMM) SELECT _1S_L_ОбщийЖурнал.DATE_TIME_IDDOC,_1S_L_ОбщийЖурнал.IDDOCDEF, 1 AS Приход, SUM((1 - _1S_L_РегГарантииОплат_Дв.DEBKRED * 2) * _1S_L_РегГарантииОплат_Дв.Наличность) AS Сумма FROM _1S_L_ОбщийЖурнал INNER JOIN _1S_L_РегГарантииОплат_Дв ON _1S_L_ОбщийЖурнал.IDDOC = _1S_L_РегГарантииОплат_Дв.IDDOC WHERE (_1S_L_РегГарантииОплат_Дв.Клиент = @Клиент) GROUP BY _1S_L_ОбщийЖурнал.DATE_TIME_IDDOC, _1S_L_ОбщийЖурнал.IDDOCDEF, _1S_L_РегГарантииОплат_Дв.DEBKRED DECLARE @d_k bit, @s numeric(14, 5), @rst numeric(14, 5) INSERT INTO #Расходы (DATE_TIME_IDDOC, IDDOCDEF, REST) SELECT DATE_TIME_IDDOC, IDDOCDEF, SUMM FROM #ПриходыРасходы WHERE DEBKRED = 0 DECLARE ПоРасходам CURSOR FOR SELECT REST FROM #Расходы WHERE REST <> 0 order by DATE_TIME_IDDOC FOR UPDATE OF REST DECLARE @sp numeric(14, 5) SELECT @sp=sum(SUMM) FROM #ПриходыРасходы WHERE DEBKRED = 1 set @sp=isnull(@sp,0) OPEN ПоРасходам FETCH NEXT FROM ПоРасходам INTO @rst WHILE @@FETCH_STATUS = 0 BEGIN IF @sp >= @rst BEGIN SET @sp = @sp - @rst UPDATE #Расходы SET REST = 0 WHERE CURRENT OF ПоРасходам END ELSE BEGIN UPDATE #Расходы SET REST = REST - @sp WHERE CURRENT OF ПоРасходам SET @sp = 0 END IF @sp = 0 BREAK FETCH NEXT FROM ПоРасходам INTO @rst END CLOSE ПоРасходам DEALLOCATE ПоРасходам SET NOCOUNT OFF if @ТА<>'0' SELECT (CASE WHEN (CONVERT(datetime, @ТА, 112) > _1S_L_ДокРасходнаяНакладная.ДатаОплаты) THEN 1 ELSE 0 END) AS Просрочено, CAST( SUM(#Расходы.REST) As Varchar(20) ) AS Сумма, CAST( COUNT(#Расходы.REST) As Varchar(20) ) AS Количество FROM #Расходы LEFT JOIN _1S_L_ДокРасходнаяНакладная ON SUBSTRING(#Расходы.DATE_TIME_IDDOC, 15, 9) = _1S_L_ДокРасходнаяНакладная.IDDOC WHERE #Расходы.REST > 0 GROUP BY (CASE WHEN (CONVERT(datetime, @ТА, 112) > _1S_L_ДокРасходнаяНакладная.ДатаОплаты) THEN 1 ELSE 0 END) else -- этот запрос используется в "Отчет по задолженностям" SELECT DATE_TIME_IDDOC, IDDOCDEF, CAST(REST As char(20)) AS REST FROM #Расходы WHERE REST > 0 drop table #ПриходыРасходы drop table #Расходы GO