список товаров с остатками по 3-м складам Можно как-то сделать это более красиво чем три левых соединения в произвольном запросе списка ? |
в смысле нужно не один остаток по 3-м складам, а 3-и остатка по каждому из складов. |
три "ВЫБОР КОГДА..."? |
вот что пришло в голову первая временная таблица собирает остатки по всем складам вторая временная таблица полным объединением собирает 3 подзапроса, каждый из которых фильтрует остатки по своему складу из первой таблицы и наконец результирующая выборка группирует всю эту беду |
3-lalex23 >в запросе динамического списка временных таблиц нет |
да и не забыть чтобы правильно показывало типа склад1 - 3шт склад2 - 0шт склад3 - 2шт. |
если это для выписки товара с нескольких складов, я бы попытался формализовать правила выбора склада отгрузки, а менеджеру показывал только итоговое количество. в текущем проекте у меня происходит отгрузка из 45 мест хранения одним документом. код занимает почти 2000 строк, зато результат близок к [em]Большой Кнопке "Сделать ВСЕ"[/em] |
(6) главное, чтобы самая большая кнопка "сделать все" - не заела.. иначе коллапс конторы обеспечен... |
(6) ты забыл еще прикрутить к доку чесалку для пяток и отмахиватель мух... |
А как может помочь ВЫБОР КОГДА, если условие на склад налагается в Регистре ? Формализовать выписку в данном случае - сложнее, чем просто прикрутить 3 склада, как будет 45 складов - наверное придется. |
Не прокатывают левые соединения похоже, даже в таком простом запросе (дублирование данных сделал специально - проверял) ВЫБРАТЬ СправочникТовары.Ссылка, ЕСТЬNULL(ОстаткиОстатки.КоличествоОстаток, 0) КАК Остаток, ЕСТЬNULL(ОстаткиОстатки1.КоличествоОстаток, 0) КАК Остаток1 ИЗ Справочник.Товары КАК СправочникТовары ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Остатки.Остатки КАК ОстаткиОстатки ПО (ОстаткиОстатки.Товар = СправочникТовары.Ссылка) ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Остатки.Остатки КАК ОстаткиОстатки1 ПО (ОстаткиОстатки.Товар = СправочникТовары.Ссылка) список получается пустой (нет товаров) - почему, непонятно ... |
А нефиг при соединении между двумя таблицами в условии соединения пользовать поля третьей. Негоже это. |
ну что-то типа выбор когда Регистр.Склад=&Склад1 тогда Регистр.Остаток к |
12-Управление торговлей 11 >случайно ввод нажал [em]выбор когда Регистр.Склад=&Склад1 тогда Регистр.Остаток иначе 0 конец как Остаток1 выбор когда Регистр.Склад=&Склад2 тогда Регистр.Остаток иначе 0 конец как Остаток2 выбор когда Регистр.Склад=&Склад3 тогда Регистр.Остаток иначе 0 конец как Остаток3[/em] |
а на регистр условие по вхождению склада в список |
Итоговое решение задачи: ВЫБРАТЬ СправочникТовары.Ссылка, ЕСТЬNULL(ОстаткиОстатки1.КоличествоОстаток, 0) КАК Остаток1, ЕСТЬNULL(ОстаткиОстатки2.КоличествоОстаток, 0) КАК Остаток2 ИЗ Справочник.Товары КАК СправочникТовары ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Остатки.Остатки КАК ОстаткиОстатки1 ПО (ОстаткиОстатки1.Товар = СправочникТовары.Ссылка И ОстаткиОстатки1.Склад = &Склад1) ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Остатки.Остатки КАК ОстаткиОстатки2 ПО (ОстаткиОстатки2.Товар = СправочникТовары.Ссылка И ОстаткиОстатки2.Склад = &Склад2) спасибо уважаемому: roma n - за замеченную ошибку, так же спасибо уважаемому Управление торговлей 11 за вторую идею, хотя я и посчитал в данной ситуации более оптимальной первую. |
а в СКД? |
15-Dmitry3U > Эй, наркоман, да за такой запрос в приличном обществе йобом токнут! Он тебе базу раком ставит, ты в курсе? |
17-Reaper >предъяви свой вариант |
вот что я имел ввиду, глумитесь ВЫБРАТЬ ТоварыОрганизацийОстатки.Склад, ТоварыОрганизацийОстатки.Номенклатура, СУММА(ТоварыОрганизацийОстатки.КоличествоОстаток) КАК КоличествоОстаток ПОМЕСТИТЬ ВсеОстатки ИЗ РегистрНакопления.ТоварыОрганизаций.Остатки(, Склад В (&СписокСкладов)) КАК ТоварыОрганизацийОстатки СГРУППИРОВАТЬ ПО ТоварыОрганизацийОстатки.Склад, ТоварыОрганизацийОстатки.Номенклатура ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВсеОстатки.Номенклатура, ВсеОстатки.КоличествоОстаток КАК Остаток1, 0 КАК Остаток2, 0 КАК Остаток3 ПОМЕСТИТЬ Шахматка ИЗ ВсеОстатки КАК ВсеОстатки ГДЕ ВсеОстатки.Склад = &Склад1 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ВсеОстатки.Номенклатура, 0, ВсеОстатки.КоличествоОстаток, 0 ИЗ ВсеОстатки КАК ВсеОстатки ГДЕ ВсеОстатки.Склад = &Склад2 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ВсеОстатки.Номенклатура, 0, 0, ВсеОстатки.КоличествоОстаток ИЗ ВсеОстатки КАК ВсеОстатки ГДЕ ВсеОстатки.Склад = &Склад3 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Шахматка.Номенклатура, СУММА(ЕСТЬNULL(Шахматка.Остаток1, 0)) КАК Остаток1, СУММА(ЕСТЬNULL(Шахматка.Остаток2, 0)) КАК Остаток2, СУММА(ЕСТЬNULL(Шахматка.Остаток3, 0)) КАК Остаток3 ИЗ Шахматка КАК Шахматка СГРУППИРОВАТЬ ПО Шахматка.Номенклатура |
(19) +100500 |
А если так ВЫБРАТЬ ТоварыОрганизацийОстатки.Склад, ТоварыОрганизацийОстатки.Номенклатура, ВЫБОР КОГДА (ТоварыОрганизацийОстатки.Склад=&Склад1) ТОГДА СУММА(ТоварыОрганизацийОстатки.КоличествоОстаток) КОНЕЦ КАК Остаток1, ВЫБОР КОГДА (ТоварыОрганизацийОстатки.Склад=&Склад2) ТОГДА СУММА(ТоварыОрганизацийОстатки.КоличествоОстаток) КОНЕЦ КАК Остаток2, ИЗ РегистрНакопления.ТоварыОрганизаций.Остатки(, Склад В (&СписокСкладов)) КАК ТоварыОрганизацийОстатки СГРУППИРОВАТЬ ПО ТоварыОрганизацийОстатки.Склад, ТоварыОрганизацийОстатки.Номенклатура; //////////////////////////////////////////////////// |
Reaper - ваш вариант ? lalex23 - динамический список съест такой сложный запрос ? Dark_Shadow - если складов 20 штук, а показать надо из них 2 основных, точно ли такой запрос будет оптимальнее ? |
В моем дурацком запросе динамически идет расчет только для видимых позиций списка. А в приведенных выше запросах идут второстепенные расчеты по всем позициям: в 1-ом варианте по всем номенклатурам по регистру, во 2-ом по всем складам. Или я не прав ? |
Точнее, в обоих вариантах идут данные с регистра, где условие на ограничение по номенклатуре - непонятно. |
(24) так и подсунь свой фильтр по номенклатура и складам |
потестишь - результаты в студию, отпишись |
[quote=Dmitry3U;34342837] В моем дурацком запросе динамически идет расчет только для видимых позиций списка. [/quote] что мешает в моём запросе добавить фильтр по номенклатуре? [quote=Dmitry3U;34342774] такой сложный запрос ?[/quote] это элементарный запрос, который в разы легче для исполнения чем (15) |
27-lalex23 >[em]"это элементарный запрос, который в разы легче для исполнения"[/em] я что-то пропустил? когда в динамическом списке появились временные таблицы? |
28-Управление торговлей 11 > ладно, пропустил я динамический список, что теперь - всех собак на меня спускать? |
29-lalex23 >да вроде все спокойно себя ведут :) |
В запросе: Выбор ... - который работает в таком контексте тока по регистру и в который можно вставить фильтр и на товары - есть тоже свои существенные минусы: - общий остаток по всем складам получается суммой всех складов (а их много) - реквизиты товара вытаскиваются через "." (т.е. по сути системный подзапрос). Мне кажется он будет оптимален, когда кол-во показываемых остатков по складам будем более значимым, чем сейчас = 2. Не сильно понимаю, почему 2 левых соединения так ужасны ... |
Я кстати не совсем понимаю (или просто не знаю), каким образом можно вытащить (причем быстро) отображаемый список товаров, чтобы по нему сделать фильтр. |
Итоговое причесанное решение (спасибо Dark_Shadow за подсказку в плане оптимальности): ВЫБРАТЬ СправочникТовары.Ссылка, ЕСТЬNULL(ОстаткиОстатки1.КоличествоОстаток, 0) КАК Остаток1, ЕСТЬNULL(ОстаткиОстатки2.КоличествоОстаток, 0) КАК Остаток2 ИЗ Справочник.Товары КАК СправочникТовары ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Остатки.Остатки(, Склад = &Склад1) КАК ОстаткиОстатки1 ПО (ОстаткиОстатки1.Товар = СправочникТовары.Ссылка) ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Остатки.Остатки(, Склад = &Склад2) КАК ОстаткиОстатки2 ПО (ОстаткиОстатки2.Товар = СправочникТовары.Ссылка) |
Собственно чуть более подробно копнул в структуру и принципы формирования динамич.списка. Вывод такой - что запрос можно делать только по основной таблице списка, никакие запросы по регистру и "Выбор" - не прокатывают. Поэтому собственно приведенное выше решение - самое оптимальное в данном случае при любом кол-ве складов. |
А где Остаток3..? |
Это укороченный вариант, суть идеи собственно. В оригинале еще есть общий остаток, остаток 3 и куча реквизитов товаров. :) |
Текущее время: 02:11. Часовой пояс GMT +3. |