Извините, что напрягаю...Фрагмент кода получившегося работающего запроса:
|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 = @Док
|)
и понимаю, что бык с курицей не скрещиваются. Подскажите, плз, как сделать правильно.