Как правильно связать две таблицы в запросе?

1. arsen_botashev 11.04.19 09:41 Сейчас в теме
Доброго дня!
Проблема такая, делаю отчет, на скд, необходимо по бизнес процессу создать отчет. В отчете есть поле: ДатаПоступления.
Это вычисляемое поле. Вот так оно вычисляется: В БП есть поле ПлановыйСрок(тут указываются дни, 10,11 и тд) и есть дата задачи.
Эта ДатаПОступления = ДАтаЗадачи+ПлановыйСрок. Проблема в том что на определенно точке маршрута создается задача(тут и заполняется этот ПЛАНОВЫЙ СРОК). Я взял БП, Взял задачу по ней, связал их левым соединением(полным не вариант, потому что тогда выводится все задачи по БП, и получатеся тупо одна и таже строка выводится много раз), задал задаче параметр что точка маршрута = тойточкекотораямненужна. Все хорошо, все работает. Но проблема в том что отчет выводит только те процессы, в которых есть эта задача. Он не выводит те процессы в которых карта маршрута не дошла до этой точки маршрута. Всего БП 236. из них только в 88 есть задача(напомню из этой задачи мне нужна дата ее создания для того чтобы вычислить ДАТуПоступления). Сейчас у меня запрос выводит 88 записей. а надо чтобы он выводил все 236. и если где-то такоц задачи нет, то просто чтоб поле ДатаПоступления было пустым.
Прошу помощи)

Запрос.
ВЫБРАТЬ
	ЗакупкиКомпьютернойТехникиИМебелиПродукция.Ссылка.Автор,
	ЗакупкиКомпьютернойТехникиИМебелиПродукция.Ссылка.Номер,
	ЗакупкиКомпьютернойТехникиИМебелиПродукция.Ссылка.Дата,
	ЗакупкиКомпьютернойТехникиИМебелиПродукция.Номенклатура,
	ЗакупкиКомпьютернойТехникиИМебелиПродукция.Количество,
	ЗакупкиКомпьютернойТехникиИМебелиПродукция.ЦенаПредыдущейЗакупки,
	ЗакупкиКомпьютернойТехникиИМебелиПродукция.СуммаИнициатор КАК СуммаИнициатор,
	ЗакупкиКомпьютернойТехникиИМебелиПродукция.ЦенаСНДС,
	ЗакупкиКомпьютернойТехникиИМебелиПродукция.Сумма КАК Сумма,
	УниверсальнаяЗадача.Дата КАК ДатаЗадачи,
	ЗакупкиКомпьютернойТехникиИМебелиПродукция.Ссылка.ПлановаяДатаПоставки
ИЗ
	БизнесПроцесс.ЗакупкиКомпьютернойТехникиИМебели.Продукция КАК ЗакупкиКомпьютернойТехникиИМебелиПродукция
		ЛЕВОЕ СОЕДИНЕНИЕ Задача.УниверсальнаяЗадача КАК УниверсальнаяЗадача
		ПО ЗакупкиКомпьютернойТехникиИМебелиПродукция.Ссылка = УниверсальнаяЗадача.БизнесПроцесс
ГДЕ
	УниверсальнаяЗадача.ТочкаМаршрута = &ТочкаМаршрута
Показать
По теме из базы знаний
Найденные решения
4. dhurricane 11.04.19 09:55 Сейчас в теме
(3) Буквально:
...
ИЗ
    БизнесПроцесс.ЗакупкиКомпьютернойТехникиИМебели.Продукция КАК ЗакупкиКомпьютернойТехникиИМебелиПродукция
        ЛЕВОЕ СОЕДИНЕНИЕ Задача.УниверсальнаяЗадача КАК УниверсальнаяЗадача
        ПО ЗакупкиКомпьютернойТехникиИМебелиПродукция.Ссылка = УниверсальнаяЗадача.БизнесПроцесс
                И УниверсальнаяЗадача.ТочкаМаршрута = &ТочкаМаршрута
17. dhurricane 11.04.19 10:42 Сейчас в теме
(16) Еще одно соединение.

UPD. Все это конечно при условии, что на Ваши выбираемые точки БП приходится всегда по одной задаче.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. dhurricane 11.04.19 09:47 Сейчас в теме
(1) Накладывая условие на поля подчиненной таблицы Вы из ЛЕВОГО соединения делаете ВНУТРЕННЕЕ. Так работает платформа.

Перенесите условие из секции ГДЕ в условие связи таблиц.
3. arsen_botashev 11.04.19 09:54 Сейчас в теме
(2)а как это сделать? ГДЕ поместить в ПО?
4. dhurricane 11.04.19 09:55 Сейчас в теме
(3) Буквально:
...
ИЗ
    БизнесПроцесс.ЗакупкиКомпьютернойТехникиИМебели.Продукция КАК ЗакупкиКомпьютернойТехникиИМебелиПродукция
        ЛЕВОЕ СОЕДИНЕНИЕ Задача.УниверсальнаяЗадача КАК УниверсальнаяЗадача
        ПО ЗакупкиКомпьютернойТехникиИМебелиПродукция.Ссылка = УниверсальнаяЗадача.БизнесПроцесс
                И УниверсальнаяЗадача.ТочкаМаршрута = &ТочкаМаршрута
5. arsen_botashev 11.04.19 09:58 Сейчас в теме
6. herfis 499 11.04.19 10:06 Сейчас в теме
(5) Условием соединения таблиц может быть произвольное выражение любой сложности. Главное, чтобы оно булево возвращало. Простые условия на равенство просто чаще всего используются, так как обычно отражают естественные связи таблиц и максимально производительны.
7. arsen_botashev 11.04.19 10:06 Сейчас в теме
(4)Спасибо, работает, но количество записей стало 255, должно было быть(по идее), 236. С чем это может быть связано?
10. dhurricane 11.04.19 10:10 Сейчас в теме
(7) Очевидных ошибок не вижу, к сожалению.
12. arsen_botashev 11.04.19 10:18 Сейчас в теме
(10)В любом случае спасибо!
Просто брал запросом только записи из бп, было 236, прибавил к ним задачу, стало 255))
15. dhurricane 11.04.19 10:28 Сейчас в теме
(12) Быть может Вы выбирали не продукцию, а сами БП?
20. arsen_botashev 11.04.19 10:50 Сейчас в теме
(15)Нет, самих БП вообще 189, я выбирал именно продукцию.
23. dhurricane 11.04.19 10:53 Сейчас в теме
(20) Тогда единственное мое предположение, что на некоторые бизнес-процессы таки приходится по несколько задач. Может помеченные на удаление еще есть?
26. arsen_botashev 11.04.19 11:01 Сейчас в теме
(23)ДА. Вы правы, по точке маршрута в некоторых случаях, похоже, после выполнения задачи, если кто-то там отклоняет следующую, то задача опять идет на ту точку, которую я получаю, тогда да, записи плодятся. Даже не представляю как это решить, выбрать первые 1 может? с упорядочиванием по дате убыв?
31. dhurricane 11.04.19 12:15 Сейчас в теме
(26) Быть может есть какой-то признак, по которому можно отбирать нужные задачи, например "Выполнена"? Скажем, если только одна задача для точки БП в один момент может быть выполнена, то это условие также можно добавить в условия связи:
...
ИЗ
    БизнесПроцесс.ЗакупкиКомпьютернойТехникиИМебели.Продукция КАК ЗакупкиКомпьютернойТехникиИМебелиПродукция
        ЛЕВОЕ СОЕДИНЕНИЕ Задача.УниверсальнаяЗадача КАК УниверсальнаяЗадача
        ПО ЗакупкиКомпьютернойТехникиИМебелиПродукция.Ссылка = УниверсальнаяЗадача.БизнесПроцесс
                И УниверсальнаяЗадача.ТочкаМаршрута = &ТочкаМаршрута
                И УниверсальнаяЗадача.Выполнена
32. arsen_botashev 11.04.19 12:22 Сейчас в теме
(31)Так в том то и дело что может быть две задачи и оба выполнены, и тогда будет дубль записей.
Может как-то можно с временными таблицами?
Потому что все я уже сделал, все как надо, но записи дублируются, а в отчете есть важные показатели, и они неверные.
33. dhurricane 11.04.19 12:30 Сейчас в теме
(32) А как заполняется в задачах нужная Вам дата? Если есть 2 выполненные задачи, то как выбрать дату задачи для результирующего запроса?
34. arsen_botashev 11.04.19 12:33 Сейчас в теме
(33)Дата автоматическая при создании задачи. Я решил данную проблему группировкой по максимуму, теперь выбирается максимальная дата, и она одна, соответственно записи не дублируются
UPD.
Если есть 2 выполненные задачи, то как выбрать дату задачи для результирующего запроса?
Надо было выбрать самую последнюю дату. ну в смысле если есть 01.01.0001 и 02.01.0001 то выбрать 02.01.0001))
8. YannikAlx 43 11.04.19 10:06 Сейчас в теме
Только еще нужно
указать
ЕСТЬNULL(УниверсальнаяЗадача.Дата,"-") КАК ДатаЗадачи

Ну или
ЕСТЬNULL(УниверсальнаяЗадача.Дата,ДАТАВРЕМЯ(1,1,1,0,0,0)) КАК ДатаЗадачи
Как вам больше нравится, или как нужно
9. dhurricane 11.04.19 10:09 Сейчас в теме
(8) Не согласен, что это нужно. Видите ли, автор к дате задачи прибавляет срок. Если оставить NULL, результат сложения будет также NULL, что можно интерпретировать, как отсутствие даты поступления. Если привести установить "-" получим строку, например "-5", что вообще не похоже на дату поступления. Если зададим пустую дату, то получим дату поступления как "05.01.0001", что также некорректно.
11. YannikAlx 43 11.04.19 10:14 Сейчас в теме
(9) С NULL также будет ошибка при увеличении даты
ДАтаЗадачи+ПлановыйСрок
Необходимо добавить проверку перед сложением, что ДАтаЗадачи - это вообще дата, или лучше что дата не пустая, то есть не равна 01.01.01.
Ну или не NULL
13. arsen_botashev 11.04.19 10:21 Сейчас в теме
(11)В вычисляемом поле надо написать.
ВЫБОР КОГДА ПлановыйСрок <> 0 ТОГДА
ДатаПоступления = ДатаЗадачи + ПлановыйСрок.
По идее если плановый срок <> 0 то значит дата у задачи есть 100%.
14. dhurricane 11.04.19 10:27 Сейчас в теме
(11)
ДАтаЗадачи+ПлановыйСрок

Прошу прощения, в описании использовал некорректную операцию. Действительно, здесь требуется не сложение, а функция "ДобавитьКДате". Однако применительно к этой функции все мои рассуждения верны: ошибки не будет, результат будет равен NULL.
16. arsen_botashev 11.04.19 10:41 Сейчас в теме
(14)НУ это да, прибавить к дате(ДатаЗадач, "ДЕНЬ", ПланвоыйСрок) так я делал.
А еще вопрос, вот тут:
...
ИЗ
    БизнесПроцесс.ЗакупкиКомпьютернойТехникиИМебели.Продукция КАК ЗакупкиКомпьютернойТехникиИМебелиПродукция
        ЛЕВОЕ СОЕДИНЕНИЕ Задача.УниверсальнаяЗадача КАК УниверсальнаяЗадача
        ПО ЗакупкиКомпьютернойТехникиИМебелиПродукция.Ссылка = УниверсальнаяЗадача.БизнесПроцесс
                И УниверсальнаяЗадача.ТочкаМаршрута = &ТочкаМаршрута

Надо добавить еще одну точку, то есть если она есть, ее дата тоже нужна.
если прибавить сюда И (УниверсальнаяЗадача.ТочкаМаршрута = &ТочкаМаршрута ИЛИ УниверсальнаяЗадача.ТочкаМаршрута = &ТочкаМаршрута2)
То тогда записии плодятся. В итоге неверное вычисляются суммы. Так вот, как взять дату задачи другой точки маршрута, не плодя записи?
17. dhurricane 11.04.19 10:42 Сейчас в теме
(16) Еще одно соединение.

UPD. Все это конечно при условии, что на Ваши выбираемые точки БП приходится всегда по одной задаче.
19. arsen_botashev 11.04.19 10:50 Сейчас в теме
(17)Да, всегда одна задача.
Не получается че то у меня))
ИЗ
	БизнесПроцесс.ЗакупкиКомпьютернойТехникиИМебели.Продукция КАК ЗакупкиКомпьютернойТехникиИМебелиПродукция
		ЛЕВОЕ СОЕДИНЕНИЕ Задача.УниверсальнаяЗадача КАК УниверсальнаяЗадача
		ПО (ЗакупкиКомпьютернойТехникиИМебелиПродукция.Ссылка = УниверсальнаяЗадача.БизнесПроцесс
					И УниверсальнаяЗадача.ТочкаМаршрута = &ТочкаМаршрута),
		ЛЕВОЕ СОЕДИНЕНИЕ Задача.УниверсальнаяЗадача КАК УниверсальнаяЗадачаДАта
		ПО (ЗакупкиКомпьютернойТехникиИМебелиПродукция.Ссылка = УниверсальнаяЗадача.БизнесПроцесс
					И УниверсальнаяЗадача.ТочкаМаршрута = &ТочкаМаршрута1)	
Показать

есть в запросе строчка: УниверсальнаяЗадача.Дата КАК ДатаЗадачи(тут дата задачи &точкимаршрута)
А мне надо отдельной колнкой дату где УниверсальнаяЗадача.Дата КАК ДатаЗадачи1(тут дата задачи &точкимаршрута1)
а он мне сует все в одну дату, из за чего плодятся записи.
21. dhurricane 11.04.19 10:51 Сейчас в теме
(19) Вы запутались в псевдонимах присоединяемых таблиц.
22. arsen_botashev 11.04.19 10:53 Сейчас в теме
(21)Я так написал потому что он ругается на то что одинаковый псевдоним
25. dhurricane 11.04.19 10:54 Сейчас в теме
(22) Тут все верно. А вот в условиях связи со второй таблицей задач используется псевдоним первой.
28. arsen_botashev 11.04.19 11:15 Сейчас в теме
(25)(27)Получилось вот так: и еще надо было задачу брать второй раз, а я брал один раз.
ВЫБРАТЬ
	ЗакупкиКомпьютернойТехникиИМебелиПродукция.Ссылка.Автор КАК Автор,
	ЗакупкиКомпьютернойТехникиИМебелиПродукция.Ссылка.Номер КАК Номер,
	ЗакупкиКомпьютернойТехникиИМебелиПродукция.Ссылка.Дата КАК Дата,
	ЗакупкиКомпьютернойТехникиИМебелиПродукция.Номенклатура КАК Номенклатура,
	ЗакупкиКомпьютернойТехникиИМебелиПродукция.Количество КАК Количество,
	ЗакупкиКомпьютернойТехникиИМебелиПродукция.ЦенаПредыдущейЗакупки КАК ЦенаПредыдущейЗакупки,
	ЗакупкиКомпьютернойТехникиИМебелиПродукция.СуммаИнициатор КАК СуммаИнициатор,
	ЗакупкиКомпьютернойТехникиИМебелиПродукция.ЦенаСНДС КАК ЦенаСНДС,
	ЗакупкиКомпьютернойТехникиИМебелиПродукция.Сумма КАК Сумма,
	УниверсальнаяЗадача.Дата КАК ДатаЗадачи,
	ЗакупкиКомпьютернойТехникиИМебелиПродукция.Ссылка.ПлановаяДатаПоставки КАК ПлановаяДатаПоставки,
	УниверсальнаяЗадача1.Дата КАК ДатаБУХ
ИЗ
	БизнесПроцесс.ЗакупкиКомпьютернойТехникиИМебели.Продукция КАК ЗакупкиКомпьютернойТехникиИМебелиПродукция
		ЛЕВОЕ СОЕДИНЕНИЕ Задача.УниверсальнаяЗадача КАК УниверсальнаяЗадача
		ПО (ЗакупкиКомпьютернойТехникиИМебелиПродукция.Ссылка = УниверсальнаяЗадача.БизнесПроцесс)
			И (УниверсальнаяЗадача.ТочкаМаршрута = &ТочкаМаршрута)
		ЛЕВОЕ СОЕДИНЕНИЕ Задача.УниверсальнаяЗадача КАК УниверсальнаяЗадача1
		ПО (ЗакупкиКомпьютернойТехникиИМебелиПродукция.Ссылка = УниверсальнаяЗадача1.БизнесПроцесс)
			И (УниверсальнаяЗадача1.ТочкаМаршрута = &ТочкаМаршрута1)
ГДЕ
	ЗакупкиКомпьютернойТехникиИМебелиПродукция.Ссылка.Автор = &Автор
Показать
29. YannikAlx 43 11.04.19 11:25 Сейчас в теме
(28) Вы получите 2 даты вместо одной! И к какой потом прибавлять?
При ОБЪЕДИНЕНИИ у вас бы все было более корректно.
Там будет точно одна дата, и не будет проблемы с выбором к чему прибавлять
30. arsen_botashev 11.04.19 11:28 Сейчас в теме
(29)так мне надо две даты двух разных точек маршрута. Это как плановая дата и факктическая дата.
18. YannikAlx 43 11.04.19 10:47 Сейчас в теме
(16) Примените лучше в запросе обединение 2 частей с разными точками..
ОБЪЕДИНИТЬ
24. arsen_botashev 11.04.19 10:54 Сейчас в теме
(18)
ТАк?
ВЫБРАТЬ
	ЗакупкиКомпьютернойТехникиИМебелиПродукция.Ссылка.Автор КАК Автор,
	ЗакупкиКомпьютернойТехникиИМебелиПродукция.Ссылка.Номер КАК Номер,
	ЗакупкиКомпьютернойТехникиИМебелиПродукция.Ссылка.Дата КАК Дата,
	ЗакупкиКомпьютернойТехникиИМебелиПродукция.Номенклатура КАК Номенклатура,
	ЗакупкиКомпьютернойТехникиИМебелиПродукция.Количество КАК Количество,
	ЗакупкиКомпьютернойТехникиИМебелиПродукция.ЦенаПредыдущейЗакупки КАК ЦенаПредыдущейЗакупки,
	ЗакупкиКомпьютернойТехникиИМебелиПродукция.СуммаИнициатор КАК СуммаИнициатор,
	ЗакупкиКомпьютернойТехникиИМебелиПродукция.ЦенаСНДС КАК ЦенаСНДС,
	ЗакупкиКомпьютернойТехникиИМебелиПродукция.Сумма КАК Сумма,
	УниверсальнаяЗадача.Дата КАК ДатаЗадачи,
	ЗакупкиКомпьютернойТехникиИМебелиПродукция.Ссылка.ПлановаяДатаПоставки КАК ПлановаяДатаПоставки,
	УниверсальнаяЗадача.Наименование КАК Наименование
ИЗ
	БизнесПроцесс.ЗакупкиКомпьютернойТехникиИМебели.Продукция КАК ЗакупкиКомпьютернойТехникиИМебелиПродукция
		ЛЕВОЕ СОЕДИНЕНИЕ Задача.УниверсальнаяЗадача КАК УниверсальнаяЗадача
		ПО (ЗакупкиКомпьютернойТехникиИМебелиПродукция.Ссылка = УниверсальнаяЗадача.БизнесПроцесс
					И УниверсальнаяЗадача.ТочкаМаршрута = &ТочкаМаршрута)
		ГДЕ
	ЗакупкиКомпьютернойТехникиИМебелиПродукция.Ссылка.ПометкаУдаления = ЛОЖЬ
	И ЗакупкиКомпьютернойТехникиИМебелиПродукция.Ссылка.Автор = &Автор 
ОБЪЕДИНИТЬ 	
	ВЫБРАТЬ
	ЗакупкиКомпьютернойТехникиИМебелиПродукция.Ссылка.Автор КАК Автор,
	ЗакупкиКомпьютернойТехникиИМебелиПродукция.Ссылка.Номер КАК Номер,
	ЗакупкиКомпьютернойТехникиИМебелиПродукция.Ссылка.Дата КАК Дата,
	ЗакупкиКомпьютернойТехникиИМебелиПродукция.Номенклатура КАК Номенклатура,
	ЗакупкиКомпьютернойТехникиИМебелиПродукция.Количество КАК Количество,
	ЗакупкиКомпьютернойТехникиИМебелиПродукция.ЦенаПредыдущейЗакупки КАК ЦенаПредыдущейЗакупки,
	ЗакупкиКомпьютернойТехникиИМебелиПродукция.СуммаИнициатор КАК СуммаИнициатор,
	ЗакупкиКомпьютернойТехникиИМебелиПродукция.ЦенаСНДС КАК ЦенаСНДС,
	ЗакупкиКомпьютернойТехникиИМебелиПродукция.Сумма КАК Сумма,
	УниверсальнаяЗадача.Дата КАК ДатаЗадачиБУХ,
	ЗакупкиКомпьютернойТехникиИМебелиПродукция.Ссылка.ПлановаяДатаПоставки КАК ПлановаяДатаПоставки,
	УниверсальнаяЗадача.Наименование КАК Наименование
ИЗ
	БизнесПроцесс.ЗакупкиКомпьютернойТехникиИМебели.Продукция КАК ЗакупкиКомпьютернойТехникиИМебелиПродукция
		ЛЕВОЕ СОЕДИНЕНИЕ Задача.УниверсальнаяЗадача КАК УниверсальнаяЗадача
		ПО (ЗакупкиКомпьютернойТехникиИМебелиПродукция.Ссылка = УниверсальнаяЗадача.БизнесПроцесс
					И УниверсальнаяЗадача.ТочкаМаршрута = &ТочкаМаршрута1)
		ГДЕ
	ЗакупкиКомпьютернойТехникиИМебелиПродукция.Ссылка.ПометкаУдаления = ЛОЖЬ
	И ЗакупкиКомпьютернойТехникиИМебелиПродукция.Ссылка.Автор = &Автор
Показать
27. YannikAlx 43 11.04.19 11:08 Сейчас в теме
(24) Ну примерно так.
Единственно изучите разницу между
ОБЪЕДИНИТЬ и
ОБЪЕДИНИТЬ ВСЕ.

Возможно вам понадобится....
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот