К списку форумов К списку тем
Регистрация    Правила    Главная форума    Поиск   
Имя: Пароль:
Рекомендовать в новости

список товаров с остатками по 3-м складам

Гость
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
Цитата:
Сообщение от Dmitry3U Посмотреть сообщение
В моем дурацком запросе динамически идет расчет только для видимых позиций списка.
что мешает в моём запросе добавить фильтр по номенклатуре?
Цитата:
Сообщение от Dmitry3U Посмотреть сообщение
такой сложный запрос ?
это элементарный запрос, который в разы легче для исполнения чем (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 и куча реквизитов товаров. :)


К списку вопросов






Copyright ©, Все права защищены