|
Помогите с запросом! | ☑ | ||
---|---|---|---|---|
0
tciban
06.02.20
✎
08:37
|
Давненько глупостей не спрашивал, а тут придется... Маленько переписанная УПП 1.2. Сделал регистрик ПланПоНГ (план по номенклатурным группам). 4 простых измерения: МесяцНачалаДействия (дата), ТорговаяТочка(ДоговорКонтрагента),НоменклатурнаяГруппа и Номенклатура.
Сделал в регистре для отладки 2 записи. одинаковая дата(начало января), одинаковая торговая точка и разные 2 номенклатурные группы с номенклатурой из них. По одной были продажи за январь, по второй - нет. Сделал простой, примитивный запрос! ВЫБРАТЬ ПланПоНоменклатурнымГруппам.ТорговаяТочка КАК ТорговаяТочка, ПланПоНоменклатурнымГруппам.НоменклатурнаяГруппа, ПланПоНоменклатурнымГруппам.Номенклатура КАК Номенклатура, ВЫБОР КОГДА Продажи.Количество > 0 ТОГДА Продажи.Количество * Продажи.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент КОНЕЦ КАК Отгрузка, ВЫБОР КОГДА Продажи.Количество < 0 ТОГДА -Продажи.Количество * Продажи.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент КОНЕЦ КАК Возврат, ВЫБОР КОГДА Продажи.Стоимость > 0 ТОГДА Продажи.Стоимость КОНЕЦ КАК Сумма ИЗ РегистрНакопления.Продажи КАК Продажи ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПланПоНоменклатурнымГруппам КАК ПланПоНоменклатурнымГруппам ПО ПланПоНоменклатурнымГруппам.ТорговаяТочка = Продажи.ДоговорКонтрагента И ПланПоНоменклатурнымГруппам.НоменклатурнаяГруппа = Продажи.Номенклатура.НоменклатурнаяГруппа И ПланПоНоменклатурнымГруппам.Номенклатура = Продажи.Номенклатура ГДЕ ПланПоНоменклатурнымГруппам.МесяцНачалаДействия = &ДатаН И Продажи.Период МЕЖДУ &ДатаН И &ДатаК И Продажи.Контрагент.ОсновнойМенеджерПокупателя = &ТорговыйПредставитель И ПланПоНоменклатурнымГруппам.ТорговаяТочка.Владелец.ОсновнойМенеджерПокупателя = &ТорговыйПредставитель Это ЛЕВОЕ соединение! Т.е. должны быть обе записи из регистра плана! А выдает только одну, по которой были продажи! Что я делаю не так? Чет я отчаялсо, помогите! |
|||
1
strange2007
06.02.20
✎
08:40
|
Не умею читать и писать запросы, но вдруг поможет методика: Комментируешь обрезания по одному и как появится нужная картинка, так сразу анализируешь последний комментарий.
|
|||
2
craxx
06.02.20
✎
08:40
|
При левом соединении условия на правую часть не работают так как ты хочешь, не используй их. Лучше сделай временную таблицу и в ней отбор сделай, а потом с ней связывай свой регистр
|
|||
3
ДенисЧ
06.02.20
✎
08:53
|
Все условия перенеси в условия соединения, а не в группу ГДЕ.
|
|||
4
Ненавижу 1С
гуру
06.02.20
✎
08:55
|
>>Это ЛЕВОЕ соединение! Т.е. должны быть обе записи из регистра плана! А выдает только одну, по которой были продажи!
Всё правильно оно делает, прочитай еще раз про левое и правое соединение |
|||
5
tciban
06.02.20
✎
09:04
|
(4) И как надо делать?
|
|||
6
tciban
06.02.20
✎
09:05
|
(3) Попробовал - не дождался конца выполнения запроса даже...
ИЗ РегистрНакопления.Продажи КАК Продажи ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПланПоНоменклатурнымГруппам КАК ПланПоНоменклатурнымГруппам ПО (ПланПоНоменклатурнымГруппам.ТорговаяТочка = Продажи.ДоговорКонтрагента) И (ПланПоНоменклатурнымГруппам.МесяцНачалаДействия = &ДатаН) И (ПланПоНоменклатурнымГруппам.ТорговаяТочка.Владелец.ОсновнойМенеджерПокупателя = &ТорговыйПредставитель) И (Продажи.Период МЕЖДУ &ДатаН И &ДатаК) И (Продажи.Контрагент.ОсновнойМенеджерПокупателя = &ТорговыйПредставительИ) И (ПланПоНоменклатурнымГруппам.НоменклатурнаяГруппа = Продажи.Номенклатура.НоменклатурнаяГруппа ИЛИ Продажи.Номенклатура.НоменклатурнаяГруппа ЕСТЬ NULL) И (ПланПоНоменклатурнымГруппам.Номенклатура = Продажи.Номенклатура ИЛИ Продажи.Номенклатура ЕСТЬ NULL) |
|||
7
tciban
06.02.20
✎
09:10
|
(3) Малость ошибся в условиях, но да, результат прежний :(
|
|||
8
НЕА123
06.02.20
✎
09:22
|
(6)
сделать первым (ПланПоНоменклатурнымГруппам.Номенклатура = Продажи.Номенклатура ИЛИ Продажи.Номенклатура ЕСТЬ NULL) проверка на NULL нужна? |
|||
9
tciban
06.02.20
✎
09:26
|
(8) проверка на NULL это я уже извращался, не нужна по идее
|
|||
10
НЕА123
06.02.20
✎
09:28
|
(4)+1
|
|||
11
tciban
06.02.20
✎
09:31
|
(10) А как сделать то?
|
|||
12
breezee
06.02.20
✎
09:36
|
(6) Не надо такие сложные связи. Отберите в 1 временной таблице нужные данные и во второй нужные данные и соединетесь в 3 запросе. В книгах по 1с, рекомендуется не связываться вирательной таблицей с физической или варитуальной таблицей. Так и отлаживать проще
|
|||
13
Василий Алибабаевич
06.02.20
✎
09:42
|
(0) Почитай текст запроса "и здраво содрогнись".
ВЫБРАТЬ ПланПоНоменклатурнымГруппам.ТорговаяТочка КАК ТорговаяТочка, .... ИЗ РегистрНакопления.Продажи КАК Продажи //Вот это слева. ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПланПоНоменклатурнымГруппам Слева у тебя РегистрНакопления.Продажи а уже справа РегистрСведений.ПланПоНоменклатурнымГруппам |
|||
14
НЕА123
06.02.20
✎
09:43
|
(13)+1
из анекдота "не нравится красная - заебньте зеленую" |
|||
15
Said_We
06.02.20
✎
09:43
|
(0) Не путай правое с левым. Условие в Где не должно быть совсем. Оно должно быть выполнено до соединения.
ИЗ РегистрСведений.ПланПоНоменклатурнымГруппам КАК ПланПоНоменклатурнымГруппам ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи КАК Продажи ПО ПланПоНоменклатурнымГруппам.ТорговаяТочка = Продажи.ДоговорКонтрагента И ПланПоНоменклатурнымГруппам.НоменклатурнаяГруппа = Продажи.Номенклатура.НоменклатурнаяГруппа И ПланПоНоменклатурнымГруппам.Номенклатура = Продажи.Номенклатура |
|||
16
vicof
06.02.20
✎
09:44
|
Вот это (ПланПоНоменклатурнымГруппам.ТорговаяТочка.Владелец.ОсновнойМенеджерПокупателя = &ТорговыйПредставитель
и вто это ПланПоНоменклатурнымГруппам.НоменклатурнаяГруппа = Продажи.Номенклатура.НоменклатурнаяГруппа сильно...будет тормозить. |
|||
17
rphosts
06.02.20
✎
09:44
|
(12) угу + ещё можно создать индекс по полям соединения, но с индексом нужно смотреть ускорится или нет
|
|||
18
Said_We
06.02.20
✎
09:45
|
(0) к (15)
">>Это ЛЕВОЕ соединение! Т.е. должны быть обе записи из регистра плана!" - Если обе, то ПОЛНОЕ соединение и не правое и не левое. |
|||
19
Said_We
06.02.20
✎
09:51
|
(18) "Обе" - имеется ввиду все записи из обоих источников. Из написанного в (0) вообще не понятно, что в итоге необходимо и зачем это.
|
|||
20
tciban
06.02.20
✎
09:59
|
(18) (19) Мне нужны все из первого источника а не из обоих
|
|||
21
Василий Алибабаевич
06.02.20
✎
10:01
|
(20) Так и сделай первую выборку из ПланПоНоменклатурнымГруппам. У тебя почемуто из Продажи.
|
|||
22
Said_We
06.02.20
✎
10:01
|
(20) тогда как в 15, но перепиши, что бы не тормозило сильно. Условия Где после соединения не должно быть совсем в твоем случае.
|
|||
23
tciban
06.02.20
✎
10:05
|
(21) Ошибка была, но перемена мест не помогла...
|
|||
24
Said_We
06.02.20
✎
10:07
|
(23) Условия в ГДЕ закомментируй и будет тебе счастье.
|
|||
25
tciban
06.02.20
✎
10:07
|
Вот так работает, но монструазно, попробую через 2 ВТ
ВЫБРАТЬ ПланПоНоменклатурнымГруппам.ТорговаяТочка КАК ТорговаяТочка, ПланПоНоменклатурнымГруппам.НоменклатурнаяГруппа, ПланПоНоменклатурнымГруппам.Номенклатура КАК Номенклатура, 0 КАК Отгрузка, 0 КАК Возврат, 0 КАК Сумма поместить врем ИЗ РегистрСведений.ПланПоНоменклатурнымГруппам КАК ПланПоНоменклатурнымГруппам ГДЕ ПланПоНоменклатурнымГруппам.МесяцНачалаДействия = &ДатаН И ПланПоНоменклатурнымГруппам.ТорговаяТочка.Владелец.ОсновнойМенеджерПокупателя = &ТорговыйПредставитель объединить все ВЫБРАТЬ ПланПоНоменклатурнымГруппам.ТорговаяТочка КАК ТорговаяТочка, ПланПоНоменклатурнымГруппам.НоменклатурнаяГруппа, ПланПоНоменклатурнымГруппам.Номенклатура КАК Номенклатура, ВЫБОР КОГДА Продажи.Количество > 0 ТОГДА Продажи.Количество * Продажи.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент КОНЕЦ КАК Отгрузка, ВЫБОР КОГДА Продажи.Количество < 0 ТОГДА -Продажи.Количество * Продажи.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент КОНЕЦ КАК Возврат, ВЫБОР КОГДА Продажи.Стоимость > 0 ТОГДА Продажи.Стоимость КОНЕЦ КАК Сумма ИЗ РегистрНакопления.Продажи КАК Продажи левое СОЕДИНЕНИЕ РегистрСведений.ПланПоНоменклатурнымГруппам КАК ПланПоНоменклатурнымГруппам ПО ПланПоНоменклатурнымГруппам.ТорговаяТочка = Продажи.ДоговорКонтрагента И ПланПоНоменклатурнымГруппам.НоменклатурнаяГруппа = Продажи.Номенклатура.НоменклатурнаяГруппа И ПланПоНоменклатурнымГруппам.Номенклатура = Продажи.Номенклатура ГДЕ ПланПоНоменклатурнымГруппам.МесяцНачалаДействия = &ДатаН И Продажи.Период МЕЖДУ &ДатаН И &ДатаК И Продажи.Контрагент.ОсновнойМенеджерПокупателя = &ТорговыйПредставитель И ПланПоНоменклатурнымГруппам.ТорговаяТочка.Владелец.ОсновнойМенеджерПокупателя = &ТорговыйПредставитель ; ВЫБРАТЬ врем.ТорговаяТочка КАК ТорговаяТочка, врем.НоменклатурнаяГруппа, врем.Номенклатура КАК Номенклатура, Сумма(врем.Отгрузка) КАК Отгрузка, Сумма(врем.Возврат) КАК Возврат, Сумма(врем.Сумма) КАК Сумма Из врем как врем Сгруппировать по врем.ТорговаяТочка, врем.НоменклатурнаяГруппа, врем.Номенклатура |
|||
26
Said_We
06.02.20
✎
10:09
|
Порядок выполнения операторов в SQL-выражениях:
FROM – выбирает таблицу из базы данных WHERE – из таблицы выбираются записи, отвечающие условию поиска и отбрасываются все остальные CROUP BY – создаются группы записей, каждая группа соответствует какому-нибудь значению столбца группирования HAVING – обрабатывает каждую из созданных групп записей, оставляя только те из них, которые удовлетворяю условие поиска SELECT – выбирает из результатной таблицы только указанные столбцы ORDER BY – сортирует записи результатной таблицы LIMIT |
|||
27
Ненавижу 1С
гуру
06.02.20
✎
10:12
|
(26) всё пытаетесь процедурно мыслить в функциональных подходах
|
|||
28
Said_We
06.02.20
✎
10:16
|
(25) Использовать ВТ с индексами или не использовать, надо ещё смотреть. В твоем случае на 99% будет оправдано, так как вторая большая таблица с продажами берется за некий период и записей может быть совсем не много в такой таблице.
(27) Нет. Хотел скинуть другой порядок - более полный. В (0) не понимает что условие в ГДЕ, которое он рисует после соединения будет выполняться тоже уже после соединения. Мало того, что он пытался соединить не обрезанные заранее таблицы, что не оптимально, так ещё и условием в конце обрезает нужный ему результат и не видит этого. |
|||
29
catena
06.02.20
✎
10:23
|
(25)Т.е. не внял ни единому совету: ни соединение не поменял на правое, ни из ГДЕ ничего не убрал.
|
|||
30
tciban
06.02.20
✎
10:24
|
(29) Соединение менял всеми возможными способами - не помогло.
Из где условия в условия соединения переносил - не помогло |
|||
31
tciban
06.02.20
✎
10:27
|
(29) А вот применение обеих советов помогло! Работает.
ВЫБРАТЬ ПланПоНоменклатурнымГруппам.ТорговаяТочка КАК ТорговаяТочка, ПланПоНоменклатурнымГруппам.НоменклатурнаяГруппа, ПланПоНоменклатурнымГруппам.Номенклатура КАК Номенклатура, ВЫБОР КОГДА Продажи.Количество > 0 ТОГДА Продажи.Количество * Продажи.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент КОНЕЦ КАК Отгрузка, ВЫБОР КОГДА Продажи.Количество < 0 ТОГДА -Продажи.Количество * Продажи.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент КОНЕЦ КАК Возврат, ВЫБОР КОГДА Продажи.Стоимость > 0 ТОГДА Продажи.Стоимость КОНЕЦ КАК Сумма ИЗ РегистрСведений.ПланПоНоменклатурнымГруппам КАК ПланПоНоменклатурнымГруппам ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи КАК Продажи ПО (ПланПоНоменклатурнымГруппам.МесяцНачалаДействия = &ДатаН) И (ПланПоНоменклатурнымГруппам.ТорговаяТочка.Владелец.ОсновнойМенеджерПокупателя = &ТорговыйПредставитель) И (Продажи.Период МЕЖДУ &ДатаН И &ДатаК) И (Продажи.Контрагент.ОсновнойМенеджерПокупателя = &ТорговыйПредставитель) И ПланПоНоменклатурнымГруппам.ТорговаяТочка = Продажи.ДоговорКонтрагента И ПланПоНоменклатурнымГруппам.НоменклатурнаяГруппа = Продажи.Номенклатура.НоменклатурнаяГруппа И ПланПоНоменклатурнымГруппам.Номенклатура = Продажи.Номенклатура |
|||
32
Василий Алибабаевич
06.02.20
✎
10:27
|
(25) У регистра "продажи" должна же быть виртуальная таблица "Обороты"? Зачем выбирать все продажи с начала времен и фильтровать их в условии "Продажи.Период МЕЖДУ &ДатаН И &ДатаК"?
|
|||
33
tciban
06.02.20
✎
10:29
|
(32) Возможно. Надо попробовать.
Теперь надо преодолеть еще одну проблему - если в плане будет указана только номенклатурная группа без номенклатуры, т.е. надо продать хоть что нибудь из номенклатурной группы, не важно что |
|||
34
Василий Алибабаевич
06.02.20
✎
10:32
|
(33) Птля... "Возможно. Надо попробовать."
Везде где возможно нужно юзать виртуальные таблицы с параметрами вместо фильтрации в ГДЕ. "если в плане будет указана только номенклатурная группа без номенклатуры" И что? Вы в продажах не сможете отфитровать номенклатуру нужной группы? |
|||
35
tciban
06.02.20
✎
10:40
|
(34) Да смогу поди :)
|
|||
36
Василий Алибабаевич
06.02.20
✎
10:42
|
(35) Мы в тебя верим )))
|
|||
37
tciban
06.02.20
✎
10:43
|
(36) Спасибо! Век живи - век учись :)
|
|||
38
catena
06.02.20
✎
10:45
|
(31)А что, предыдущие ораторы советовали их строго по очереди? О_о
(37)Так учись, За 11 лет хоть что-то про запросы нужно обязательно прочитать. |
|||
39
ДенисЧ
06.02.20
✎
10:48
|
ТС, смени ник на "Жираффо" )))
|
|||
40
Said_We
06.02.20
✎
10:57
|
(31) Плохо....
Общий план следующий. Выбрать Т.* ПОМЕСТИТЬ ВТ_1 из <источник1> КАК Т где <Все условия, которые относятся только к таблице Источник1> ИНДЕКСИРОВАТЬ <поля связи источника 1 и источника 2 в том же порядке что и в связи>; Выбрать Т.* ПОМЕСТИТЬ ВТ_2 из <источник2> КАК Т где <Все условия, которые относятся только к таблице Источник2> ИНДЕКСИРОВАТЬ <поля связи источника 1 и источника 2 в том же порядке что и в связи>; Выбрать ВТ_1.*, ВТ_2.* ИЗ ВТ_1 как ВТ_1 Левое соединение <условия связи> ГДЕ <ТУТ только то условие, которое выполняется в условии связи, но в итоговую выборку попасть не должно> |
|||
41
tciban
06.02.20
✎
11:12
|
Всем, кто участвовал в обсуждении огромное спасибо! Продолжаю работу в заданном направлении :)
|
|||
42
hhhh
06.02.20
✎
15:34
|
(7) поменяй местами измерения, зачем ты месяц первым втулил?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |