Переключение на Главную Страницу Страницы: 1 [2]  ОтправитьПечать
Горячая тема (более 10 ответов) Помогите реализовать СводныйОстаток() (число прочтений - 7247 )
Kapet
Senior Member
****
Отсутствует


Ламер - вансист

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Помогите реализовать СводныйОстаток()
Ответ #15 - 26. Января 2007 :: 11:15
Печать  
Прошу прощения, что усомнился... Действительно, всё правильно. Была ошибка в алгоритме обработки запроса
Спасибо!
  
Наверх
ICQ  
IP записан
 
Kapet
Senior Member
****
Отсутствует


Ламер - вансист

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Помогите реализовать СводныйОстаток()
Ответ #16 - 26. Января 2007 :: 15:13
Печать  
Извините, что напрягаю...

Фрагмент кода  получившегося работающего запроса:
Код
Выбрать все
|SET NOCOUNT ON
|DECLARE @Док CHAR(13)
|SET @Док = ?
|(
|SELECT
|	CASE
|		WHEN OPL.S1=0 AND OPL.S2>0 THEN 12
|		WHEN OPL.S1>0 AND OPL.S2>0 THEN 9
|		WHEN OPL.S1>0 AND OPL.S2=0 THEN 7
|	ELSE 0
|	END As ЗнакОплаты,
|	CASE
|		WHEN OPL.S1=0 AND OPL.S2>0 THEN 'Оплачен полностью'
|		WHEN OPL.S1>0 AND OPL.S2>0 THEN 'Оплачено '+ CAST(OPL.S2 AS varchar(16))
|		WHEN OPL.S1>0 AND OPL.S2=0 THEN 'Не оплачен'
|	ELSE 'Списан в доход'
|	END As СтрокаОплаты,
|	'_P1='+CAST(OPL.S1 AS varchar(16))+' _P2='+CAST(OPL.S2 AS varchar(16)),
|	CASE
|		WHEN OPL.S1=0 AND OPL.S2>0 THEN '"""+ШрифтЖирный+"""'
|		WHEN OPL.S1>0 AND OPL.S2>0 THEN '"""+ШрифтЖирный+"""'
|		WHEN OPL.S1>0 AND OPL.S2=0 THEN '"""+ШрифтЖирный+"""'
|	ELSE '"""+ШрифтОбычный+"""'
|	END As Шрифт
|FROM
|	(
|	SELECT
|		SUM($Оплаты.Сумма) as S1,
|		SUM($Оплаты.СуммаОплаты) as S2
|	FROM
|		$РегистрИтоги.Оплаты as Оплаты (nolock)
|	WHERE
|		Оплаты.period = :Период~~ AND
|		$Оплаты.КредДокумент = @Док
|	) AS OPL
|)
|UNION ALL
|( .......
 


Результат запроса обрабатывается так:

Функция Пиктограмма()
     ТД=ТекущийДокумент;
     Если ТД.Выбран()=0 Тогда
           МЧ_Оплата=0;
           МЧ_Отгрузка=0;
           МЧ_Резерв=0;
           ФонСтроки="NONE";
           СтатусОплаты="";
           СтатусОтгрузки="";
           Возврат "";
     КонецЕсли;
     _RS.УстПараметр(1,ТД);
     ТЗ=_RS.ВыполнитьИнструкцию();
     _МЧ_Оплата      =ТЗ.ПолучитьЗначение(1,1);
     _ФонСтроки      =ТЗ.ПолучитьЗначение(1,4);
     МЧ_Отгрузка      =ТЗ.ПолучитьЗначение(2,1);
     МЧ_Резерв      =ТЗ.ПолучитьЗначение(3,1);
     Если _МЧ_Оплата=0 Тогда
           Если (ТД.Проведен()=0) и (ТД.ПометкаУдаления()=0) Тогда
                 ФонСтроки=ШрифтОбычный;
                 МЧ_Оплата=_МЧ_Оплата;
                 Возврат "";
           ИначеЕсли ТД.Проведен()=1 Тогда
                 Док=СоздатьОбъект("Документ");
                 Док.ВыбратьПодчиненныеДокументы(,,ТД);
                 Пока Док.ПолучитьДокумент()=1 Цикл
                       Если (Док.Вид()="ОтменаСчета") и (Док.Проведен()=1) Тогда
                             ФонСтроки=ШрифтАннулирован;
                             МЧ_Оплата=_МЧ_Оплата;
                             Возврат "";
                       КонецЕсли;
                 КонецЦикла;
                 МЧ_Оплата=0;
                 ФонСтроки=ШрифтСписанВДоход;
                 Возврат "";
           ИначеЕсли ТД.ПометкаУдаления()=1 Тогда
                 МЧ_Оплата=0;
                 ФонСтроки=ШрифтПометкаУдаления;
                 Возврат "";
           КонецЕсли;
     КонецЕсли;
     МЧ_Оплата=_МЧ_Оплата;
     ФонСтроки=_ФонСтроки;
     Возврат "";
КонецФункции

Далее. Пытаюсь остаток алгоритма обработки запроса перепихнуть также в этот же запрос (сделать JOIN с самим документом @Док для получения его статуса "Проведен" и "Помечен На Удаление"и переложить всю работу на SQL).
Робкая неудачная попытка:
Код
Выбрать все
|SET NOCOUNT ON
|DECLARE @Док CHAR(13)
|SET @Док = ?
|(
|SELECT
|	CASE
|		WHEN OPL.S1=0 AND OPL.S2>0 THEN 12
|		WHEN OPL.S1>0 AND OPL.S2>0 THEN 9
|		WHEN OPL.S1>0 AND OPL.S2=0 THEN 7
|		WHEN (CL = 0 AND MK = 0) THEN 0 -- тут проблема
|	ELSE 0
|	END As ЗнакОплаты,
|	CASE
|		WHEN OPL.S1=0 AND OPL.S2>0 THEN 'Оплачен полностью'
|		WHEN OPL.S1>0 AND OPL.S2>0 THEN 'Оплачено '+ CAST(OPL.S2 AS varchar(16))
|		WHEN OPL.S1>0 AND OPL.S2=0 THEN 'Не оплачен'
|	ELSE 'Списан в доход'
|	END As СтрокаОплаты,
|	'_P1='+CAST(OPL.S1 AS varchar(16))+' _P2='+CAST(OPL.S2 AS varchar(16)),
|	CASE
|		WHEN OPL.S1=0 AND OPL.S2>0 THEN '"""+ШрифтЖирный+"""'
|		WHEN OPL.S1>0 AND OPL.S2>0 THEN '"""+ШрифтЖирный+"""'
|		WHEN OPL.S1>0 AND OPL.S2=0 THEN '"""+ШрифтЖирный+"""'
|	ELSE '"""+ШрифтОбычный+"""'
|	END As Шрифт
|FROM
|	(
|	SELECT
|		SUM($Оплаты.Сумма) as S1,
|		SUM($Оплаты.СуммаОплаты) as S2
|	FROM
|		$РегистрИтоги.Оплаты as Оплаты (nolock)
|	WHERE
|		Оплаты.period = :Период~~ AND
|		$Оплаты.КредДокумент = @Док
|	) AS OPL, (J.Closed & 1) AS CL, J.ISMARK AS MK -- наверное бред?
|INNER JOIN -- тут кажется тоже хрень
|	_1SJourn as J ON J.IDDoc = @Док
|)
 


и понимаю, что бык с курицей не скрещиваются. Подскажите, плз, как сделать правильно.
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 
ОтправитьПечать