Имя: Пароль:
1C
1С v8
СКД. Изменение вида соединения в зависимости от парметров
0 pessok
 
28.10.11
16:34
Доброго времени суток. Очередной затык с СКД случился...
Надо в зависимости от заполненности параметров виртуальной таблицы изменять тип соединения таблиц следующим образом:
Если параметры не заполнены - левое соединение, если заполнены - полное.
Делается это для получения множества значений из двух выборок.

ВЫБРАТЬ
   ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка,
   ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка.ЦФО,
   ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка.СтатьяОборотов,
   ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка.Ответственный,
   ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка.ФизЛицо,
   ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.СуммаПлатежа,
   ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.ДоговорКонтрагента,
   ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.ДоговорКонтрагента.Владелец,
   СостоянияСогласованияЗаявокСрезПоследних.Состояние,
   СостоянияСогласованияЗаявокСрезПоследних.Этап,
   СостоянияСогласованияЗаявокСрезПоследних.Комментарий,
   СостоянияСогласованияЗаявокСрезПоследних.Пользователь,
   ЕСТЬNULL(ДвиженияДенежныхСредствОбороты.СуммаОборот, 0) КАК Сумма,
   ВЫБОР
       КОГДА ЗаявкаНаРасходованиеСредствДатыРасхода.Дата = &СегодняшняяДата
           ТОГДА ЗаявкаНаРасходованиеСредствДатыРасхода.СуммаРасхода
       ИНАЧЕ 0
   КОНЕЦ КАК СуммаОплатыНаСегодня,
   ВЫБОР
       КОГДА (НЕ ДвиженияДенежныхСредствОбороты.Регистратор ЕСТЬ NULL )
           ТОГДА ДвиженияДенежныхСредствОбороты.Регистратор
       ИНАЧЕ NULL
   КОНЕЦ КАК ПлатежныйДокумент
ИЗ
   Документ.ЗаявкаНаРасходованиеСредств.РасшифровкаПлатежа КАК ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа
       ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ДвиженияДенежныхСредств.Обороты({&ПериодОплатыНачало}, {&ПериодОплатыКонец}, Регистратор, ) КАК ДвиженияДенежныхСредствОбороты
       ПО ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка = ДвиженияДенежныхСредствОбороты.ДокументПланированияПлатежа
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СостоянияСогласованияЗаявок.СрезПоследних КАК СостоянияСогласованияЗаявокСрезПоследних
       ПО ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка = СостоянияСогласованияЗаявокСрезПоследних.Заявка
       ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаявкаНаРасходованиеСредств.ДатыРасхода КАК ЗаявкаНаРасходованиеСредствДатыРасхода
       ПО ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка = ЗаявкаНаРасходованиеСредствДатыРасхода.Ссылка
       
ГДЕ
   ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода
           И СостоянияСогласованияЗаявокСрезПоследних.Заявка.Проведен = &Проведен

УПОРЯДОЧИТЬ ПО
   ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка.Дата

Т.е. если ПериодОплатыНачало и ПериодОплатыКонец заполнены - то полное соединение, если не заполнены, то левое.
Скорее всего я делаю что-то не так, и все решается другим методом, если так - то ткните носом, пожалуйста. (только сильно не бейте) :) Идея простая:
Если не выбран период оплат по регистратору, то выводим все заявки, если выбран, то только те заявки, которые были оплачены за этот период и входят в период создания заявок. Мудреное описание получилось, но, надеюсь, понятное...
1 pessok
 
28.10.11
16:35
Ах да, УПП.
2 Axel2009
 
28.10.11
16:48
ГДЕ НЕ ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка ЕСТЬ NULL
3 pessok
 
28.10.11
17:04
(2) ничего не изменилось, после того как это условие добавил. да и к чему это?
объясню как происходит на данный момент.
Подмножество заявок отбирается, а вот подмножество оплат к нему не цепляется. Т.е. не получается общего подмножества. Если делать левое соединение - лезут все заявки, если делать полное, то даже без указанных параметров ПериодОплатыНачало и ПериодОплатыКонец отбираются только оплаченные заявки.
4 Axel2009
 
28.10.11
17:06
потому что из ГДЕ нужно переносить в соединение ПО
5 pessok
 
28.10.11
17:13
(4) эммм. не понял, что-то я туплю уже к вечеру... ладно, разберусь, идея ясна, спасибо
6 Axel2009
 
28.10.11
17:14
(5) в ГДЕ фильтр накладывается на результирующую таблицу. при полном соединении если нет данныех в левой таблице и есть в правой, то
ГДЕ
   ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода
отфильтрует эти записи, и в результат они не попадут.
7 pessok
 
31.10.11
09:17
блин. так я и не понял, куда надо приткнуть

ГДЕ НЕ ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка ЕСТЬ NULL

в соединение ставлю - синтаксическая ошибка, к левой таблице - "Ожидается имя таблицы". Где вообще можно почитать про условия в самих соединениях?
8 pessok
 
31.10.11
09:52
ап, чтоли...
9 pessok
 
31.10.11
10:46
еще ап.сейчас запрос имеет вид

ВЫБРАТЬ
   ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка,
   ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка.ЦФО,
   ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка.СтатьяОборотов,
   ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка.Ответственный,
   ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка.ФизЛицо,
   ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.СуммаПлатежа,
   ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.ДоговорКонтрагента,
   ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.ДоговорКонтрагента.Владелец,
   СостоянияСогласованияЗаявокСрезПоследних.Состояние,
   СостоянияСогласованияЗаявокСрезПоследних.Этап,
   СостоянияСогласованияЗаявокСрезПоследних.Комментарий,
   СостоянияСогласованияЗаявокСрезПоследних.Пользователь,
   ЕСТЬNULL(ДвиженияДенежныхСредствОбороты.СуммаОборот, 0) КАК Сумма,
   ВЫБОР
       КОГДА ЗаявкаНаРасходованиеСредствДатыРасхода.Дата = &СегодняшняяДата
           ТОГДА ЗаявкаНаРасходованиеСредствДатыРасхода.СуммаРасхода
       ИНАЧЕ 0
   КОНЕЦ КАК СуммаОплатыНаСегодня,
   ВЫБОР
       КОГДА (НЕ ДвиженияДенежныхСредствОбороты.Регистратор ЕСТЬ NULL )
           ТОГДА ДвиженияДенежныхСредствОбороты.Регистратор
       ИНАЧЕ NULL
   КОНЕЦ КАК ПлатежныйДокумент
ИЗ
   РегистрНакопления.ДвиженияДенежныхСредств.Обороты(&ПериодОплатыНачало, &ПериодОплатыКонец, Регистратор, ) КАК ДвиженияДенежныхСредствОбороты
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЗаявкаНаРасходованиеСредств.РасшифровкаПлатежа КАК ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа
           ПОЛНОЕ СОЕДИНЕНИЕ РегистрСведений.СостоянияСогласованияЗаявок.СрезПоследних КАК СостоянияСогласованияЗаявокСрезПоследних
           ПО ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка = СостоянияСогласованияЗаявокСрезПоследних.Заявка
           ПОЛНОЕ СОЕДИНЕНИЕ Документ.ЗаявкаНаРасходованиеСредств.ДатыРасхода КАК ЗаявкаНаРасходованиеСредствДатыРасхода
           ПО ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка = ЗаявкаНаРасходованиеСредствДатыРасхода.Ссылка
       ПО ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка = ДвиженияДенежныхСредствОбороты.ДокументПланированияПлатежа
{ГДЕ
   ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода
   И СостоянияСогласованияЗаявокСрезПоследних.Заявка.Проведен = &Проведен}

УПОРЯДОЧИТЬ ПО
   ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка.Дата

соответственно соединение идет только внутреннее. как же нужно установить условия, чтобы при незаполненных параметрах виртуальной таблицы соединение становилось полным(в данном случае)
10 pessok
 
31.10.11
13:26
ап... блин, неужели никто не может/не хочет объяснить/дать линк? %)
11 pessok
 
31.10.11
15:24
ап
12 Робинзон Крузо
 
31.10.11
15:31
Сделай два варианта отчета. Не трать полдня там, где можно сделать за 5 минут.
13 pessok
 
31.10.11
15:38
(12) топорно это. а вот как не топорно сделать - свой мозг не может дать решения. хотелось бы красиво сделать таки. А так - придется от заполненности параметров менять набор данных...
14 Axel2009
 
31.10.11
17:24
(13) т.е. просто выставив фигурные скобки, все автоматом становится полным соединением??
чтобы сделать полное соединение, нужно писать ПОЛНОЕ СОЕДИНЕНИЕ, но никак не внутреннее.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан