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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

Как это сочетается с тем, что нельзя использовать пост. обработку запроса в коде?
Запрос ну никак не выведет вам в табличную часть строку.
В чем смысл ограничения на использование только запроса?
15. ditp 91 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 91 08.12.16 17:41 Сейчас в теме
17. ildarovich 7865 08.12.16 17:42 Сейчас в теме
Думаю, помочь должна вот эта статья: http://infostart.ru/public/266377/ .

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

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

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