0
- 26.02.2014 - 19:37
|
Можно как-то сделать это более красиво чем три левых соединения в произвольном запросе списка ?
| | |
1
- 26.02.2014 - 20:00
| в смысле нужно не один остаток по 3-м складам, а 3-и остатка по каждому из складов. | | |
2
- 26.02.2014 - 20:10
| три "ВЫБОР КОГДА..."? | | |
3
- 26.02.2014 - 20:34
|
вот что пришло в голову первая временная таблица собирает остатки по всем складам вторая временная таблица полным объединением собирает 3 подзапроса, каждый из которых фильтрует остатки по своему складу из первой таблицы и наконец результирующая выборка группирует всю эту беду | | |
4
- 26.02.2014 - 21:53
| 3-lalex23 >в запросе динамического списка временных таблиц нет | | |
5
- 26.02.2014 - 23:00
|
да и не забыть чтобы правильно показывало типа склад1 - 3шт склад2 - 0шт склад3 - 2шт. | | |
6
- 27.02.2014 - 00:08
| если это для выписки товара с нескольких складов, я бы попытался формализовать правила выбора склада отгрузки, а менеджеру показывал только итоговое количество. в текущем проекте у меня происходит отгрузка из 45 мест хранения одним документом. код занимает почти 2000 строк, зато результат близок к Большой Кнопке "Сделать ВСЕ" | | |
7
- 27.02.2014 - 00:21
| (6) главное, чтобы самая большая кнопка "сделать все" - не заела.. иначе коллапс конторы обеспечен... | | |
8
- 27.02.2014 - 06:04
| (6) ты забыл еще прикрутить к доку чесалку для пяток и отмахиватель мух... | | |
9
- 27.02.2014 - 08:46
|
А как может помочь ВЫБОР КОГДА, если условие на склад налагается в Регистре ? Формализовать выписку в данном случае - сложнее, чем просто прикрутить 3 склада, как будет 45 складов - наверное придется. | | |
10
- 27.02.2014 - 10:31
|
Не прокатывают левые соединения похоже, даже в таком простом запросе (дублирование данных сделал специально - проверял) ВЫБРАТЬ СправочникТовары.Ссылка, ЕСТЬNULL(ОстаткиОстатки.КоличествоОстаток, 0) КАК Остаток, ЕСТЬNULL(ОстаткиОстатки1.КоличествоОстаток, 0) КАК Остаток1 ИЗ Справочник.Товары КАК СправочникТовары ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Остатки.Остатки КАК ОстаткиОстатки ПО (ОстаткиОстатки.Товар = СправочникТовары.Ссылка) ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Остатки.Остатки КАК ОстаткиОстатки1 ПО (ОстаткиОстатки.Товар = СправочникТовары.Ссылка) список получается пустой (нет товаров) - почему, непонятно ... | | |
11
- 27.02.2014 - 10:41
| А нефиг при соединении между двумя таблицами в условии соединения пользовать поля третьей. Негоже это. | | |
12
- 27.02.2014 - 10:44
|
ну что-то типа выбор когда Регистр.Склад=&Склад1 тогда Регистр.Остаток к | | |
13
- 27.02.2014 - 10:46
|
12-Управление торговлей 11 >случайно ввод нажал выбор когда Регистр.Склад=&Склад1 тогда Регистр.Остаток иначе 0 конец как Остаток1 выбор когда Регистр.Склад=&Склад2 тогда Регистр.Остаток иначе 0 конец как Остаток2 выбор когда Регистр.Склад=&Склад3 тогда Регистр.Остаток иначе 0 конец как Остаток3 | | |
14
- 27.02.2014 - 10:47
| а на регистр условие по вхождению склада в список | | |
15
- 27.02.2014 - 14:55
|
Итоговое решение задачи: ВЫБРАТЬ СправочникТовары.Ссылка, ЕСТЬNULL(ОстаткиОстатки1.КоличествоОстаток, 0) КАК Остаток1, ЕСТЬNULL(ОстаткиОстатки2.КоличествоОстаток, 0) КАК Остаток2 ИЗ Справочник.Товары КАК СправочникТовары ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Остатки.Остатки КАК ОстаткиОстатки1 ПО (ОстаткиОстатки1.Товар = СправочникТовары.Ссылка И ОстаткиОстатки1.Склад = &Склад1) ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Остатки.Остатки КАК ОстаткиОстатки2 ПО (ОстаткиОстатки2.Товар = СправочникТовары.Ссылка И ОстаткиОстатки2.Склад = &Склад2) спасибо уважаемому: roma n - за замеченную ошибку, так же спасибо уважаемому Управление торговлей 11 за вторую идею, хотя я и посчитал в данной ситуации более оптимальной первую. | | |
16
- 27.02.2014 - 19:18
| а в СКД? | | |
17
- 28.02.2014 - 00:44
| 15-Dmitry3U > Эй, наркоман, да за такой запрос в приличном обществе йобом токнут! Он тебе базу раком ставит, ты в курсе? | | |
18
- 28.02.2014 - 01:54
| 17-Reaper >предъяви свой вариант | | |
19
- 28.02.2014 - 05:57
|
вот что я имел ввиду, глумитесь ВЫБРАТЬ ТоварыОрганизацийОстатки.Склад, ТоварыОрганизацийОстатки.Номенклатура, СУММА(ТоварыОрганизацийОстатки.КоличествоОстаток) КАК КоличествоОстаток ПОМЕСТИТЬ ВсеОстатки ИЗ РегистрНакопления.ТоварыОрганизаций.Остатки(, Склад В (&СписокСкладов)) КАК ТоварыОрганизацийОстатки СГРУППИРОВАТЬ ПО ТоварыОрганизацийОстатки.Склад, ТоварыОрганизацийОстатки.Номенклатура ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВсеОстатки.Номенклатура, ВсеОстатки.КоличествоОстаток КАК Остаток1, 0 КАК Остаток2, 0 КАК Остаток3 ПОМЕСТИТЬ Шахматка ИЗ ВсеОстатки КАК ВсеОстатки ГДЕ ВсеОстатки.Склад = &Склад1 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ВсеОстатки.Номенклатура, 0, ВсеОстатки.КоличествоОстаток, 0 ИЗ ВсеОстатки КАК ВсеОстатки ГДЕ ВсеОстатки.Склад = &Склад2 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ВсеОстатки.Номенклатура, 0, 0, ВсеОстатки.КоличествоОстаток ИЗ ВсеОстатки КАК ВсеОстатки ГДЕ ВсеОстатки.Склад = &Склад3 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Шахматка.Номенклатура, СУММА(ЕСТЬNULL(Шахматка.Остаток1, 0)) КАК Остаток1, СУММА(ЕСТЬNULL(Шахматка.Остаток2, 0)) КАК Остаток2, СУММА(ЕСТЬNULL(Шахматка.Остаток3, 0)) КАК Остаток3 ИЗ Шахматка КАК Шахматка СГРУППИРОВАТЬ ПО Шахматка.Номенклатура | | |
20
- 28.02.2014 - 06:31
| (19) +100500 | | |
21
- 28.02.2014 - 07:05
|
А если так ВЫБРАТЬ ТоварыОрганизацийОстатки.Склад, ТоварыОрганизацийОстатки.Номенклатура, ВЫБОР КОГДА (ТоварыОрганизацийОстатки.Склад=&Склад1) ТОГДА СУММА(ТоварыОрганизацийОстатки.КоличествоОстаток) КОНЕЦ КАК Остаток1, ВЫБОР КОГДА (ТоварыОрганизацийОстатки.Склад=&Склад2) ТОГДА СУММА(ТоварыОрганизацийОстатки.КоличествоОстаток) КОНЕЦ КАК Остаток2, ИЗ РегистрНакопления.ТоварыОрганизаций.Остатки(, Склад В (&СписокСкладов)) КАК ТоварыОрганизацийОстатки СГРУППИРОВАТЬ ПО ТоварыОрганизацийОстатки.Склад, ТоварыОрганизацийОстатки.Номенклатура; //////////////////////////////////////////////////// | | |
22
- 28.02.2014 - 12:26
|
Reaper - ваш вариант ? lalex23 - динамический список съест такой сложный запрос ? Dark_Shadow - если складов 20 штук, а показать надо из них 2 основных, точно ли такой запрос будет оптимальнее ? | | |
23
- 28.02.2014 - 12:29
|
В моем дурацком запросе динамически идет расчет только для видимых позиций списка. А в приведенных выше запросах идут второстепенные расчеты по всем позициям: в 1-ом варианте по всем номенклатурам по регистру, во 2-ом по всем складам. Или я не прав ? | | |
24
- 28.02.2014 - 12:31
| Точнее, в обоих вариантах идут данные с регистра, где условие на ограничение по номенклатуре - непонятно. | | |
25
- 28.02.2014 - 14:36
| (24) так и подсунь свой фильтр по номенклатура и складам | | |
26
- 28.02.2014 - 14:36
| потестишь - результаты в студию, отпишись | | |
27
- 28.02.2014 - 18:43
| Цитата:
это элементарный запрос, который в разы легче для исполнения чем (15) | | |
28
- 28.02.2014 - 23:37
|
27-lalex23 >"это элементарный запрос, который в разы легче для исполнения" я что-то пропустил? когда в динамическом списке появились временные таблицы? | | |
29
- 01.03.2014 - 06:52
| 28-Управление торговлей 11 > ладно, пропустил я динамический список, что теперь - всех собак на меня спускать? | | |
30
- 01.03.2014 - 12:38
| 29-lalex23 >да вроде все спокойно себя ведут :) | | |
31
- 01.03.2014 - 15:20
|
В запросе: Выбор ... - который работает в таком контексте тока по регистру и в который можно вставить фильтр и на товары - есть тоже свои существенные минусы: - общий остаток по всем складам получается суммой всех складов (а их много) - реквизиты товара вытаскиваются через "." (т.е. по сути системный подзапрос). Мне кажется он будет оптимален, когда кол-во показываемых остатков по складам будем более значимым, чем сейчас = 2. Не сильно понимаю, почему 2 левых соединения так ужасны ... | | |
32
- 01.03.2014 - 16:32
| Я кстати не совсем понимаю (или просто не знаю), каким образом можно вытащить (причем быстро) отображаемый список товаров, чтобы по нему сделать фильтр. | | |
33
- 01.03.2014 - 16:38
|
Итоговое причесанное решение (спасибо Dark_Shadow за подсказку в плане оптимальности): ВЫБРАТЬ СправочникТовары.Ссылка, ЕСТЬNULL(ОстаткиОстатки1.КоличествоОстаток, 0) КАК Остаток1, ЕСТЬNULL(ОстаткиОстатки2.КоличествоОстаток, 0) КАК Остаток2 ИЗ Справочник.Товары КАК СправочникТовары ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Остатки.Остатки(, Склад = &Склад1) КАК ОстаткиОстатки1 ПО (ОстаткиОстатки1.Товар = СправочникТовары.Ссылка) ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Остатки.Остатки(, Склад = &Склад2) КАК ОстаткиОстатки2 ПО (ОстаткиОстатки2.Товар = СправочникТовары.Ссылка) | | |
34
- 03.03.2014 - 17:19
|
Собственно чуть более подробно копнул в структуру и принципы формирования динамич.списка. Вывод такой - что запрос можно делать только по основной таблице списка, никакие запросы по регистру и "Выбор" - не прокатывают. Поэтому собственно приведенное выше решение - самое оптимальное в данном случае при любом кол-ве складов. | | |
35
- 03.03.2014 - 22:21
| А где Остаток3..? | | |
36
- 04.03.2014 - 11:36
|
Это укороченный вариант, суть идеи собственно. В оригинале еще есть общий остаток, остаток 3 и куча реквизитов товаров. :) | |
| Интернет-форум Краснодарского края и Краснодара |