Запрос: распределение остатков (интересная задача)

1. McCoy77 6 08.12.16 13:38 Сейчас в теме
Добрый день!

Имеем
Таблица «Номенклатура»:

Номенклатура | Количество
Гайка | 4
Гайка | 6

Таблица "Остатки"

Номенклатура | Остаток
Гайка | 8

Надо запросом получить таблицу Результат, распределить остатки следующим образом:

№ | Номенклатура | Количество
1 | Гайка | 4
2 | Гайка | 4 (8-4)
3 | Гайка | 2 (10-4-4)

То есть, мы распределяем остатки по строкам таблицы Номенклатура, а то, чего нам не хватает - вывести в новую строку (№3). Так мы узнаем, сколько нам еще надо товара "заказать".
Важное условие: сворачивать первую таблицу "Номенклатура" нельзя!

Поломал мозг... Жду ваших конструктивных предложений!
По теме из базы знаний
Найденные решения
14. Sashares 33 08.12.16 17:36 Сейчас в теме
(1) Во вложении пример только запросом.
ТекстЗапроса

Прикрепленные файлы:
whilefor; McCoy77; +2 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. корум 288 08.12.16 13:59 Сейчас в теме
(1)
Важное условие: сворачивать первую таблицу нельзя!

... но можно сделать копию ТЗ и свернуть её...
3. McCoy77 6 08.12.16 14:01 Сейчас в теме
(2) можно. Но задачу нужно решить именно запросом... В запросе можно использовать временные таблицы, сворачивать их и прочая. Но не выходя за рамки запроса, то есть выгрузить результат запроса в ТЗ и обработать нельзя
5. корум 288 08.12.16 14:11 Сейчас в теме
(3) Это лабораторная по информатике?
6. McCoy77 6 08.12.16 14:16 Сейчас в теме
(5) нет, это нужно мне для решения конкретной задачи. Суть: заказать товар, которого не хватает на складе. Всё работает до тех пор, пока не встречаются случаи, когда товар в табличной части документа встречается больше одного раза. Ломать громоздкий механизм, в котором накручено очень много всего, нет ни желания, ни времени. Нужно переписать запрос так, чтобы работал...
7. корум 288 08.12.16 14:30 Сейчас в теме
(6)
- запретить дубли номенклатуры в ТЧ документа
- подсунуть в запрос ТЗ вместо ТЧ
- (совсем изврат) сделать дополнительную ТЧ в документе, где хранить свернутую ТЧ1

совсем не предлагать?


Ну, тогда придётся крепко подумать...
8. McCoy77 6 08.12.16 14:34 Сейчас в теме
(7) да, не предлагать. Если бы можно было - давно бы сделал. Вот "башька ломаю"...
корум; +1 Ответить
9. alex-l19041 8 08.12.16 16:07 Сейчас в теме
(7)
запретить дубли номенклатуры в ТЧ документа
- поддерживаю
10. корум 288 08.12.16 16:42 Сейчас в теме
(9) лучше все-таки вариант с ТЗ вместо ТЧ, но автор вопроса не хочет переделывать текст запроса.

Изменений-то немного:
*ввести в запрос ТЗ как ВТ
*заменить обращение ТабЧасть. на ВТ. в тексте запроса...
14. Sashares 33 08.12.16 17:36 Сейчас в теме
(1) Во вложении пример только запросом.
ТекстЗапроса

Прикрепленные файлы:
whilefor; McCoy77; +2 Ответить 1
18. McCoy77 6 09.12.16 11:38 Сейчас в теме
(14) (15) спасибо огроменное! Это то, что нужно.
Остался один момент... Ну теперь сам допилю.
4. ditp 94 08.12.16 14:08 Сейчас в теме
Гуглим "нарастающий итог в запросе".

11. McCoy77 6 08.12.16 16:54 Сейчас в теме
Дело в том, что при свертке ТЧ мы теряем коды строк. А терять их нельзя, так как в таком случае в дальнейшем теряется привязка к этим строкам.
Так мы должны знать, сколько товара по данной строке есть в наличии на складе, а сколько мы заказали на соседнем складе (Заказ на перемещение) или у поставщика (Заказ поставщику).
А строки разбиваются в связи со спецификой Заказов клиентов, загружаемых с сайта...
12. корум 288 08.12.16 17:14 Сейчас в теме
(11)
мы должны знать, сколько товара по данной строке есть в наличии на складе, а сколько мы заказали на соседнем складе (Заказ на перемещение) или у поставщика (Заказ поставщику)

чем гайка, которая "есть в наличии на складе" для первой строки заказа, отличается от гайки, которая тоже на складе, но "для другой строки заказа"?
По идее, ничем.
Основное - обеспечение потребности производства, а не учет, из какого источника покрывается потребность данного конкретного заказа.

Задача преобразуется к реализации удобочитаемого вывода из таблиц:
Потребность (заказ; деталь; количество)
ОстатокЦеха(деталь; количество)
ОстатокСкладов(деталь; количество)
ЗаказатьУпоставщика(деталь; количество)
13. Sashares 33 08.12.16 17:18 Сейчас в теме
(11)Как то я не понимаю ваших извращений.
То есть, мы распределяем остатки по строкам таблицы Номенклатура, а то, чего нам не хватает - вывести в новую строку (№3). Так мы узнаем, сколько нам еще надо товара "заказать".

Как это сочетается с тем, что нельзя использовать пост. обработку запроса в коде?
Запрос ну никак не выведет вам в табличную часть строку.
В чем смысл ограничения на использование только запроса?
15. ditp 94 08.12.16 17:40 Сейчас в теме
ВЫБРАТЬ
    1 КАК Ном,
    "гайка" КАК товар,
    4 КАК Колво
ПОМЕСТИТЬ тТаб

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    2,
    "гайка",
    6

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    3,
    "шайба",
    7

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    4,
    "шайба",
    5
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
    "гайка" КАК товар,
    8 КАК Остаток
ПОМЕСТИТЬ тОст

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "шайба",
    20
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
    тТаб.Ном,
    тТаб.товар,
    тТаб.Колво,
    СУММА(тТаб1.Колво) КАК КолвоОбщ
ПОМЕСТИТЬ тТабНараст
ИЗ
    тТаб КАК тТаб
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ тТаб КАК тТаб1
        ПО тТаб.товар = тТаб1.товар
            И тТаб.Ном >= тТаб1.Ном

СГРУППИРОВАТЬ ПО
    тТаб.Ном,
    тТаб.товар,
    тТаб.Колво
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
    тТабНараст.Ном,
    тТабНараст.товар,
    тТабНараст.Колво,
    тТабНараст.КолвоОбщ,
    ВЫБОР
        КОГДА тОст.Остаток >= тТабНараст.КолвоОбщ
            ТОГДА тТабНараст.Колво
        ИНАЧЕ ВЫБОР
                КОГДА тОст.Остаток - тТабНараст.КолвоОбщ + тТабНараст.Колво > 0
                    ТОГДА тОст.Остаток - тТабНараст.КолвоОбщ + тТабНараст.Колво
                ИНАЧЕ 0
            КОНЕЦ
    КОНЕЦ КАК Взять
ИЗ
    тТабНараст КАК тТабНараст
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ тОст КАК тОст
        ПО тТабНараст.товар = тОст.товар

объединить все

ВЫБРАТЬ
    "+",
    общ.товар, 0, 0,
    общ.Колво - тОст.Остаток КАК Поле1
ИЗ
    (ВЫБРАТЬ
        тТаб.товар КАК товар,
        СУММА(тТаб.Колво) КАК Колво
    ИЗ
        тТаб КАК тТаб
    
    СГРУППИРОВАТЬ ПО
        тТаб.товар) КАК общ
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ тОст КАК тОст
        ПО общ.товар = тОст.товар
            И общ.Колво > тОст.Остаток
Показать


16. ditp 94 08.12.16 17:41 Сейчас в теме
17. ildarovich 7943 08.12.16 17:42 Сейчас в теме
Думаю, помочь должна вот эта статья: http://infostart.ru/public/266377/ .

Хотя там задача более стандартная: требуемое скалярное количество расписывается по остаткам партий.

А у вас исходные данные формируются наоборот: имеющийся скалярный остаток расписывается по требуемым "партиям строк заказа".
19. McCoy77 6 09.12.16 11:39 Сейчас в теме
(17) Спасибо! Полезная статья, вникну
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот