Логика СКД при применении полного соединения #658266


#0 by Crush
Не могу сообразить. Есть два набора данных. Соединяю их. В результате получается полное соединение. А нужно левое. Наборы данных достаточно сложные, что бы методом тыка искать причину. В инете нарыл, что скд делает полное соединение, когда в правой таблице есть условие на НЕ НУЛЛ. Взял два простых набора и ни как не получается заставить скд делать полное соединение. Цель темы: понять из-за чего возникает полное соединение и добиться на простом примере. Набор данных 1 ВЫБРАТЬ Набор данных 2    "Кухня",    4 ; ВЫБРАТЬ ГДЕ    (НЕ вт.Товар ЕСТЬ NULL ) Вывод: Таблица {Строки=Товар; Колонки = Склад; Ресурсы = Количество} Срабатывает левое соединение. Как заставить СКД делать полное?
#1 by fisher
"Как заставить СКД делать полное?" Спроси это у того мудреца, который про него заикнулся.
#2 by el-gamberro
Идешь в библиотеку. Берешь любую книгу по теории реляц. баз данных. Долго куришь. Потом долго смеешься на там какую ерунду ты написал в етой теме. По сути убери условие ГДЕ    (НЕ вт.Товар ЕСТЬ NULL )
#3 by el-gamberro
Кстати говоря в в запросе нет НИ ОДНОГО соединения, и етот человек спршивает как получить ПОЛНОЕ вместо ЛЕВОГО
#4 by fisher
Писатель? Речь о наборах данных СКД.
#5 by Crush
Без этого условия срабатывает левое соединение. И с ним тоже. Соединение наборов данных по полю Товар (думал, что это и так понятно)
#6 by Crush
Ссори! Речь не о полном, а о ВНУТРЕННЕМ соединении. 2 часа сна сказываются. Простите. Вместо левого у меня получается внутреннее. Помогите разобраться от чего это зависит
#7 by fisher
От кривых рук. Наборы данных всегда левым соединяются. Или докажи обратное на простом примере.
#8 by Crush
Да вот за простым примером и обратился сюда. Если никто не сталкивался, то придется тогда упрощать свои наборы данных. Обязательно выложу.
#9 by fisher
Проверь отборы СКД. Может, у тебя хитрый отбор накладывается на результат соединения, а тебе кажется что внутреннее отрабатывает.
#10 by Crush
Отбор ставится только на правый набор. Псевдоним поля отбора не совпадает с полями левого набора. Если задать отбор приводящий к пустой правой таблице, то весь отчет получается пустой.. Эм... попробую ка я дать разные имена полям по которым соединяю..
#11 by fisher
Это ТЫ ВООБРАЖАЕШЬ, что отбор ставится только на правый набор. Чтобы это стало реальностью, нужна магия фигурных скобок. А сейчас у тебя отбор применяется к РЕЗУЛЬТАТУ соединения наборов.
#12 by Classic
Отбор в СКД ставится уже на результирующую таблицу. Если у тебя левое соединение, а отбор вешается на элементы из правой таблицы, то фактические нулы правой таблицы не попадают в вывод. А значит получаешь внутреннее соединение. Что не понятно?
#13 by fisher
Не внутреннее соединение, а результат аналогичный внутреннему соединению.
#14 by Classic
Пофиг :)
#15 by fisher
Не пофиг. Вот благодаря такой формулировке, в мозгу ТС и поселилась ересь, что СКД умеет соединять наборы не только левым соединением.
#16 by Crush
Лёд тронулся. Перенес отбор в параметы В правой таблице было условие {ГДЕ Теперь левая таблица полностью выводится. (Осталось вспомнить на кой я вчера это кривое условие добавил.)
#17 by Crush
Да, точно! Такая штука и в обычных запросах есть когда Выбрать что то Из вт1 Левое соединение вт2 Где вт2.Поле1 = "бла бла" Вроде условие ставишь на правую таблицу, а ограничивается весь результат Спасибо за помощь!
#18 by fisher
Хм... Если это условие было только в правом наборе и автозаполнение настроек было отключено - тогда должно было правильно отработать. Может, галка автозаполнения настроек стоит?
#19 by Crush
Автозаполнение отключено на обоих наборах. И это условие тоже было ни причем. Второй набор данных выбирается из виртуальной таблицы оборотов регистра накопления. Если в параметрах таблицы написать .Обороты(, , , Измерение1=&ЗначениеИзмерения), то результат не ограничивается, а если .Обороты(, , , {(Измерение1)}) или .Обороты(, , , {(Измерение1).*}), то весь результат ограничивается данными правой таблицы. С параметром всё работает, но хочется пользоваться отбором скд. А сливать запросы обоих наборов - это уж очень тяжелая табличка получится. Хотя... Кто знает эту шибкоумную скд. Попробую.
#20 by Classic
С колокольни твоей логики ограничение на Измерение1 - это не отбор. Это фактически условие соединения.
#21 by fisher
Хм... Очень странно. А попробуй Обороты(, , , {(Измерение1).* КАК ХитроеИмечко})
#22 by fisher
+ Подозреваю, что дефолтное имя отбора правой таблицы совпало с каким-то из левой.
#23 by Crush
Отдельные имена уже давал. Всё равно строки с правыми нулами отбрасывает. Чесал левой рукой правое ухо: 1) Ставил отбор не в параметры виртуальной таблицы а в секцию ГДЕ. Результат: Формируется долго и всё равно не выводит пустые значения. 2) Объединил наборы данных в один. Результат: Формируется долго. В группировку колонок попадает группировка по Null. т.е. лишняя пустая колонка выводится. Интуиция мне подсказывает, что должно быть решение, работающее как с параметрами.
#24 by fisher
Фигню подтверждаю. Смоделировал бяку на простом примере. Чешу репу...
#25 by Crush
Нашел у себя типовую демку бухгалтерии 2.0. Там простой пример сделал. Левый набор: ВЫБРАТЬ Ссылка из ПланСчетов.Хозрасчетный Правый набор: ВЫБРАТЬ СчетРасходов, Организация, СуммаОборот ИЗ    РегистрНакопления.РеализацияУслуг.Обороты(, , , {(Организация)}) Соединение по Счет=СчетРасходов Вывод Таблица: Строки: Счета Если не задавать отбор по организации, то будет весь план счетов и суммы по всем организациям. Если задать отбор, то счета будут не все.
#26 by Crush
Мне к зубному. Может кто догадается как решить задачу с использованием скд отбора без потери левого соединения. Результат должен быть такой же как если вместо СКД отбора задать параметр. Платформы от 8.1.12.101 до 8.2.17.153
#27 by fisher
Ыыыыы! Связь наборов компоновки данных таки может быть внутренней! В конструкторе СКД этого нет, но у объекта "СвязьНаборовДанныхМакетаКомпоновкиДанных" есть свойство "ТипСвязи" типа "ТипСвязиНаборовДанныхКомпоновкиДанных" принимающее значения "Внешняя" и "Внутренняя". Изначально она внешняя. Но как только в СКД устанавливается отбор в правом наборе, она какого-то муя автоматом меняется на внутреннюю!
#28 by Crush
Попробовал сначала временную таблицу получить, а потом её вставил в условие таблицы оборотов. Воз и ныне там. ... РегистрНакопления.РеализацияУслуг.Обороты(,,,Организация В (ВЫБРАТЬ вт.Ссылка ИЗ втОрганизации КАК вт)) ... Копаю в сторону изменения типа связи налету или может найдется способ ограничить интеллектуальные способности скд.
#29 by Crush
УРА!!!!!ПОБЕДА!!! Ларчик просто открывался!:))) Нужно в настройках ставить отбор не на весь отчет (глобальный отбор), а только на интересующую группировку. Тогда сохраняется левое соединение. Рабочий пример для БП20 тут Помогла тема
#30 by fisher
Рад, что проблемка решилась, но глобально - всё равно неведомая фигня :(
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С