Форум на Kuban.ru (http://forums.kuban.ru/)
-   Территория 1С (http://forums.kuban.ru/f1040/)
-   -   список товаров с остатками по 3-м складам (http://forums.kuban.ru/f1040/spisok_tovarov_s_ostatkami_po_3-m_skladam-5447787.html)

Dmitry3U 26.02.2014 19:37

список товаров с остатками по 3-м складам
 
Можно как-то сделать это более красиво чем три левых соединения в произвольном запросе списка ?

Dmitry3U 26.02.2014 20:00

в смысле нужно не один остаток по 3-м складам, а 3-и остатка по каждому из складов.

Управление торговлей 11 26.02.2014 20:10

три "ВЫБОР КОГДА..."?

lalex23 26.02.2014 20:34

вот что пришло в голову
первая временная таблица собирает остатки по всем складам
вторая временная таблица полным объединением собирает 3 подзапроса, каждый из которых фильтрует остатки по своему складу из первой таблицы
и наконец результирующая выборка группирует всю эту беду

Управление торговлей 11 26.02.2014 21:53

3-lalex23 >в запросе динамического списка временных таблиц нет

Чучундер 26.02.2014 23:00

да и не забыть чтобы правильно показывало типа
склад1 - 3шт
склад2 - 0шт
склад3 - 2шт.

Управление торговлей 11 27.02.2014 00:08

если это для выписки товара с нескольких складов, я бы попытался формализовать правила выбора склада отгрузки, а менеджеру показывал только итоговое количество. в текущем проекте у меня происходит отгрузка из 45 мест хранения одним документом. код занимает почти 2000 строк, зато результат близок к [em]Большой Кнопке "Сделать ВСЕ"[/em]

Чучундер 27.02.2014 00:21

(6) главное, чтобы самая большая кнопка "сделать все" - не заела.. иначе коллапс конторы обеспечен...

nordbox 27.02.2014 06:04

(6) ты забыл еще прикрутить к доку чесалку для пяток и отмахиватель мух...

Dmitry3U 27.02.2014 08:46

А как может помочь ВЫБОР КОГДА, если условие на склад налагается в Регистре ?
Формализовать выписку в данном случае - сложнее, чем просто прикрутить 3 склада, как будет 45 складов - наверное придется.

Dmitry3U 27.02.2014 10:31

Не прокатывают левые соединения похоже, даже в таком простом запросе (дублирование данных сделал специально - проверял)

ВЫБРАТЬ
СправочникТовары.Ссылка,
ЕСТЬNULL(ОстаткиОстатки.КоличествоОстаток, 0) КАК Остаток,
ЕСТЬNULL(ОстаткиОстатки1.КоличествоОстаток, 0) КАК Остаток1
ИЗ
Справочник.Товары КАК СправочникТовары
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Остатки.Остатки КАК ОстаткиОстатки
ПО (ОстаткиОстатки.Товар = СправочникТовары.Ссылка)
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Остатки.Остатки КАК ОстаткиОстатки1
ПО (ОстаткиОстатки.Товар = СправочникТовары.Ссылка)

список получается пустой (нет товаров) - почему, непонятно ...

roma n 27.02.2014 10:41

А нефиг при соединении между двумя таблицами в условии соединения пользовать поля третьей. Негоже это.

Управление торговлей 11 27.02.2014 10:44

ну что-то типа
выбор когда Регистр.Склад=&Склад1 тогда
Регистр.Остаток к

Управление торговлей 11 27.02.2014 10:46

12-Управление торговлей 11 >случайно ввод нажал
[em]выбор когда Регистр.Склад=&Склад1
тогда Регистр.Остаток
иначе 0
конец как Остаток1
выбор когда Регистр.Склад=&Склад2
тогда Регистр.Остаток
иначе 0
конец как Остаток2
выбор когда Регистр.Склад=&Склад3
тогда Регистр.Остаток
иначе 0
конец как Остаток3[/em]

Управление торговлей 11 27.02.2014 10:47

а на регистр условие по вхождению склада в список

Dmitry3U 27.02.2014 14:55

Итоговое решение задачи:

ВЫБРАТЬ
СправочникТовары.Ссылка,
ЕСТЬNULL(ОстаткиОстатки1.КоличествоОстаток, 0) КАК Остаток1,
ЕСТЬNULL(ОстаткиОстатки2.КоличествоОстаток, 0) КАК Остаток2
ИЗ
Справочник.Товары КАК СправочникТовары
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Остатки.Остатки КАК ОстаткиОстатки1
ПО (ОстаткиОстатки1.Товар = СправочникТовары.Ссылка И ОстаткиОстатки1.Склад = &Склад1)
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Остатки.Остатки КАК ОстаткиОстатки2
ПО (ОстаткиОстатки2.Товар = СправочникТовары.Ссылка И ОстаткиОстатки2.Склад = &Склад2)


спасибо уважаемому: roma n - за замеченную ошибку,
так же спасибо уважаемому Управление торговлей 11 за вторую идею, хотя я и посчитал в данной ситуации более оптимальной первую.

МимохожийОднако 27.02.2014 19:18

а в СКД?

Reaper 28.02.2014 00:44

15-Dmitry3U > Эй, наркоман, да за такой запрос в приличном обществе йобом токнут! Он тебе базу раком ставит, ты в курсе?

Управление торговлей 11 28.02.2014 01:54

17-Reaper >предъяви свой вариант

lalex23 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
ИЗ
Шахматка КАК Шахматка

СГРУППИРОВАТЬ ПО
Шахматка.Номенклатура

Jimbo 28.02.2014 06:31

(19) +100500

Dark_Shadow 28.02.2014 07:05

А если так

ВЫБРАТЬ
ТоварыОрганизацийОстатки.Склад,
ТоварыОрганизацийОстатки.Номенклатура,
ВЫБОР
КОГДА (ТоварыОрганизацийОстатки.Склад=&Склад1)
ТОГДА СУММА(ТоварыОрганизацийОстатки.КоличествоОстаток)
КОНЕЦ КАК Остаток1,
ВЫБОР
КОГДА (ТоварыОрганизацийОстатки.Склад=&Склад2)
ТОГДА СУММА(ТоварыОрганизацийОстатки.КоличествоОстаток)
КОНЕЦ КАК Остаток2,
ИЗ РегистрНакопления.ТоварыОрганизаций.Остатки(, Склад В (&СписокСкладов)) КАК ТоварыОрганизацийОстатки
СГРУППИРОВАТЬ ПО
ТоварыОрганизацийОстатки.Склад,
ТоварыОрганизацийОстатки.Номенклатура; ////////////////////////////////////////////////////

Dmitry3U 28.02.2014 12:26

Reaper - ваш вариант ?
lalex23 - динамический список съест такой сложный запрос ?
Dark_Shadow - если складов 20 штук, а показать надо из них 2 основных, точно ли такой запрос будет оптимальнее ?

Dmitry3U 28.02.2014 12:29

В моем дурацком запросе динамически идет расчет только для видимых позиций списка.
А в приведенных выше запросах идут второстепенные расчеты по всем позициям: в 1-ом варианте по всем номенклатурам по регистру, во 2-ом по всем складам.
Или я не прав ?

Dmitry3U 28.02.2014 12:31

Точнее, в обоих вариантах идут данные с регистра, где условие на ограничение по номенклатуре - непонятно.

Jimbo 28.02.2014 14:36

(24) так и подсунь свой фильтр по номенклатура и складам

Jimbo 28.02.2014 14:36

потестишь - результаты в студию, отпишись

lalex23 28.02.2014 18:43

[quote=Dmitry3U;34342837] В моем дурацком запросе динамически идет расчет только для видимых позиций списка. [/quote]
что мешает в моём запросе добавить фильтр по номенклатуре?
[quote=Dmitry3U;34342774] такой сложный запрос ?[/quote]
это элементарный запрос, который в разы легче для исполнения чем (15)

Управление торговлей 11 28.02.2014 23:37

27-lalex23 >[em]"это элементарный запрос, который в разы легче для исполнения"[/em]
я что-то пропустил? когда в динамическом списке появились временные таблицы?

lalex23 01.03.2014 06:52

28-Управление торговлей 11 > ладно, пропустил я динамический список, что теперь - всех собак на меня спускать?

Управление торговлей 11 01.03.2014 12:38

29-lalex23 >да вроде все спокойно себя ведут :)

Dmitry3U 01.03.2014 15:20

В запросе: Выбор ... - который работает в таком контексте тока по регистру и в который можно вставить фильтр и на товары - есть тоже свои существенные минусы:
- общий остаток по всем складам получается суммой всех складов (а их много)
- реквизиты товара вытаскиваются через "." (т.е. по сути системный подзапрос).

Мне кажется он будет оптимален, когда кол-во показываемых остатков по складам будем более значимым, чем сейчас = 2.
Не сильно понимаю, почему 2 левых соединения так ужасны ...

Dmitry3U 01.03.2014 16:32

Я кстати не совсем понимаю (или просто не знаю), каким образом можно вытащить (причем быстро) отображаемый список товаров, чтобы по нему сделать фильтр.

Dmitry3U 01.03.2014 16:38

Итоговое причесанное решение (спасибо Dark_Shadow за подсказку в плане оптимальности):

ВЫБРАТЬ
СправочникТовары.Ссылка,
ЕСТЬNULL(ОстаткиОстатки1.КоличествоОстаток, 0) КАК Остаток1,
ЕСТЬNULL(ОстаткиОстатки2.КоличествоОстаток, 0) КАК Остаток2
ИЗ
Справочник.Товары КАК СправочникТовары
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Остатки.Остатки(, Склад = &Склад1) КАК ОстаткиОстатки1
ПО (ОстаткиОстатки1.Товар = СправочникТовары.Ссылка)
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Остатки.Остатки(, Склад = &Склад2) КАК ОстаткиОстатки2
ПО (ОстаткиОстатки2.Товар = СправочникТовары.Ссылка)

Dmitry3U 03.03.2014 17:19

Собственно чуть более подробно копнул в структуру и принципы формирования динамич.списка.
Вывод такой - что запрос можно делать только по основной таблице списка, никакие запросы по регистру и "Выбор" - не прокатывают.
Поэтому собственно приведенное выше решение - самое оптимальное в данном случае при любом кол-ве складов.

Чучундер 03.03.2014 22:21

А где Остаток3..?

Dmitry3U 04.03.2014 11:36

Это укороченный вариант, суть идеи собственно.
В оригинале еще есть общий остаток, остаток 3 и куча реквизитов товаров. :)


Текущее время: 02:11. Часовой пояс GMT +3.