То есть, мы распределяем остатки по строкам таблицы Номенклатура, а то, чего нам не хватает - вывести в новую строку (№3). Так мы узнаем, сколько нам еще надо товара "заказать".
Важное условие: сворачивать первую таблицу "Номенклатура" нельзя!
ВЫБРАТЬ
1 КАК НомерСтроки,
"Гайка" КАК Деталь,
4 КАК Требуется
ПОМЕСТИТЬ ДанныеДок
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
2,
"Гайка",
6
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
"Гайка" КАК Деталь,
8 КАК Остаток
ПОМЕСТИТЬ ОстаткиДеталей
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ДанныеДок.НомерСтроки,
ДанныеДок.Деталь,
ДанныеДок.Требуется,
СУММА(ЕСТЬNULL(ДанныеДок1.Требуется, 0)) КАК ПрошлыйРезерв
ПОМЕСТИТЬ ДанныеСРезервом
ИЗ
ДанныеДок КАК ДанныеДок
ЛЕВОЕ СОЕДИНЕНИЕ ДанныеДок КАК ДанныеДок1
ПО ДанныеДок.НомерСтроки > ДанныеДок1.НомерСтроки
И ДанныеДок.Деталь = ДанныеДок1.Деталь
СГРУППИРОВАТЬ ПО
ДанныеДок.НомерСтроки,
ДанныеДок.Деталь,
ДанныеДок.Требуется
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ДанныеСРезервом.НомерСтроки,
ДанныеСРезервом.Деталь,
ДанныеСРезервом.Требуется,
ВЫБОР
КОГДА ОстаткиДеталей.Остаток - ДанныеСРезервом.ПрошлыйРезерв >= 0
И ДанныеСРезервом.Требуется <= ОстаткиДеталей.Остаток - ДанныеСРезервом.ПрошлыйРезерв
ТОГДА ДанныеСРезервом.Требуется
КОГДА ОстаткиДеталей.Остаток - ДанныеСРезервом.ПрошлыйРезерв >= 0
И ДанныеСРезервом.Требуется > ОстаткиДеталей.Остаток - ДанныеСРезервом.ПрошлыйРезерв
ТОГДА ОстаткиДеталей.Остаток - ДанныеСРезервом.ПрошлыйРезерв
ИНАЧЕ 0
КОНЕЦ КАК Наличие
ИЗ
ДанныеСРезервом КАК ДанныеСРезервом
ЛЕВОЕ СОЕДИНЕНИЕ ОстаткиДеталей КАК ОстаткиДеталей
ПО ДанныеСРезервом.Деталь = ОстаткиДеталей.Деталь
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
NULL,
ОстаткиДеталей.Деталь,
0,
ВЫБОР
КОГДА ОстаткиДеталей.Остаток - ДанныеСРезервом.ПрошлыйРезерв - ДанныеСРезервом.Требуется < 0
ТОГДА -(ОстаткиДеталей.Остаток - ДанныеСРезервом.ПрошлыйРезерв - ДанныеСРезервом.Требуется)
ИНАЧЕ 0
КОНЕЦ
ИЗ
ДанныеСРезервом КАК ДанныеСРезервом
ЛЕВОЕ СОЕДИНЕНИЕ ОстаткиДеталей КАК ОстаткиДеталей
ПО ДанныеСРезервом.Деталь = ОстаткиДеталей.Деталь
ГДЕ
ВЫБОР
КОГДА ОстаткиДеталей.Остаток - ДанныеСРезервом.ПрошлыйРезерв - ДанныеСРезервом.Требуется < 0
ТОГДА -(ОстаткиДеталей.Остаток - ДанныеСРезервом.ПрошлыйРезерв - ДанныеСРезервом.Требуется)
ИНАЧЕ 0
КОНЕЦ > 0
(2) можно. Но задачу нужно решить именно запросом... В запросе можно использовать временные таблицы, сворачивать их и прочая. Но не выходя за рамки запроса, то есть выгрузить результат запроса в ТЗ и обработать нельзя
(5) нет, это нужно мне для решения конкретной задачи. Суть: заказать товар, которого не хватает на складе. Всё работает до тех пор, пока не встречаются случаи, когда товар в табличной части документа встречается больше одного раза. Ломать громоздкий механизм, в котором накручено очень много всего, нет ни желания, ни времени. Нужно переписать запрос так, чтобы работал...
(6)
- запретить дубли номенклатуры в ТЧ документа
- подсунуть в запрос ТЗ вместо ТЧ
- (совсем изврат) сделать дополнительную ТЧ в документе, где хранить свернутую ТЧ1
ВЫБРАТЬ
1 КАК НомерСтроки,
"Гайка" КАК Деталь,
4 КАК Требуется
ПОМЕСТИТЬ ДанныеДок
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
2,
"Гайка",
6
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
"Гайка" КАК Деталь,
8 КАК Остаток
ПОМЕСТИТЬ ОстаткиДеталей
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ДанныеДок.НомерСтроки,
ДанныеДок.Деталь,
ДанныеДок.Требуется,
СУММА(ЕСТЬNULL(ДанныеДок1.Требуется, 0)) КАК ПрошлыйРезерв
ПОМЕСТИТЬ ДанныеСРезервом
ИЗ
ДанныеДок КАК ДанныеДок
ЛЕВОЕ СОЕДИНЕНИЕ ДанныеДок КАК ДанныеДок1
ПО ДанныеДок.НомерСтроки > ДанныеДок1.НомерСтроки
И ДанныеДок.Деталь = ДанныеДок1.Деталь
СГРУППИРОВАТЬ ПО
ДанныеДок.НомерСтроки,
ДанныеДок.Деталь,
ДанныеДок.Требуется
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ДанныеСРезервом.НомерСтроки,
ДанныеСРезервом.Деталь,
ДанныеСРезервом.Требуется,
ВЫБОР
КОГДА ОстаткиДеталей.Остаток - ДанныеСРезервом.ПрошлыйРезерв >= 0
И ДанныеСРезервом.Требуется <= ОстаткиДеталей.Остаток - ДанныеСРезервом.ПрошлыйРезерв
ТОГДА ДанныеСРезервом.Требуется
КОГДА ОстаткиДеталей.Остаток - ДанныеСРезервом.ПрошлыйРезерв >= 0
И ДанныеСРезервом.Требуется > ОстаткиДеталей.Остаток - ДанныеСРезервом.ПрошлыйРезерв
ТОГДА ОстаткиДеталей.Остаток - ДанныеСРезервом.ПрошлыйРезерв
ИНАЧЕ 0
КОНЕЦ КАК Наличие
ИЗ
ДанныеСРезервом КАК ДанныеСРезервом
ЛЕВОЕ СОЕДИНЕНИЕ ОстаткиДеталей КАК ОстаткиДеталей
ПО ДанныеСРезервом.Деталь = ОстаткиДеталей.Деталь
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
NULL,
ОстаткиДеталей.Деталь,
0,
ВЫБОР
КОГДА ОстаткиДеталей.Остаток - ДанныеСРезервом.ПрошлыйРезерв - ДанныеСРезервом.Требуется < 0
ТОГДА -(ОстаткиДеталей.Остаток - ДанныеСРезервом.ПрошлыйРезерв - ДанныеСРезервом.Требуется)
ИНАЧЕ 0
КОНЕЦ
ИЗ
ДанныеСРезервом КАК ДанныеСРезервом
ЛЕВОЕ СОЕДИНЕНИЕ ОстаткиДеталей КАК ОстаткиДеталей
ПО ДанныеСРезервом.Деталь = ОстаткиДеталей.Деталь
ГДЕ
ВЫБОР
КОГДА ОстаткиДеталей.Остаток - ДанныеСРезервом.ПрошлыйРезерв - ДанныеСРезервом.Требуется < 0
ТОГДА -(ОстаткиДеталей.Остаток - ДанныеСРезервом.ПрошлыйРезерв - ДанныеСРезервом.Требуется)
ИНАЧЕ 0
КОНЕЦ > 0
Дело в том, что при свертке ТЧ мы теряем коды строк. А терять их нельзя, так как в таком случае в дальнейшем теряется привязка к этим строкам.
Так мы должны знать, сколько товара по данной строке есть в наличии на складе, а сколько мы заказали на соседнем складе (Заказ на перемещение) или у поставщика (Заказ поставщику).
А строки разбиваются в связи со спецификой Заказов клиентов, загружаемых с сайта...
мы должны знать, сколько товара по данной строке есть в наличии на складе, а сколько мы заказали на соседнем складе (Заказ на перемещение) или у поставщика (Заказ поставщику)
чем гайка, которая "есть в наличии на складе" для первой строки заказа, отличается от гайки, которая тоже на складе, но "для другой строки заказа"?
По идее, ничем.
Основное - обеспечение потребности производства, а не учет, из какого источника покрывается потребность данного конкретного заказа.
Задача преобразуется к реализации удобочитаемого вывода из таблиц:
Потребность (заказ; деталь; количество)
ОстатокЦеха(деталь; количество)
ОстатокСкладов(деталь; количество)
ЗаказатьУпоставщика(деталь; количество)
То есть, мы распределяем остатки по строкам таблицы Номенклатура, а то, чего нам не хватает - вывести в новую строку (№3). Так мы узнаем, сколько нам еще надо товара "заказать".
Как это сочетается с тем, что нельзя использовать пост. обработку запроса в коде?
Запрос ну никак не выведет вам в табличную часть строку.
В чем смысл ограничения на использование только запроса?
ВЫБРАТЬ
1 КАК Ном,
"гайка" КАК товар,
4 КАК Колво
ПОМЕСТИТЬ тТаб
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
2,
"гайка",
6
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
3,
"шайба",
7
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
4,
"шайба",
5
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
"гайка" КАК товар,
8 КАК Остаток
ПОМЕСТИТЬ тОст
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"шайба",
20
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
тТаб.Ном,
тТаб.товар,
тТаб.Колво,
СУММА(тТаб1.Колво) КАК КолвоОбщ
ПОМЕСТИТЬ тТабНараст
ИЗ
тТаб КАК тТаб
ВНУТРЕННЕЕ СОЕДИНЕНИЕ тТаб КАК тТаб1
ПО тТаб.товар = тТаб1.товар
И тТаб.Ном >= тТаб1.Ном
СГРУППИРОВАТЬ ПО
тТаб.Ном,
тТаб.товар,
тТаб.Колво
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
тТабНараст.Ном,
тТабНараст.товар,
тТабНараст.Колво,
тТабНараст.КолвоОбщ,
ВЫБОР
КОГДА тОст.Остаток >= тТабНараст.КолвоОбщ
ТОГДА тТабНараст.Колво
ИНАЧЕ ВЫБОР
КОГДА тОст.Остаток - тТабНараст.КолвоОбщ + тТабНараст.Колво > 0
ТОГДА тОст.Остаток - тТабНараст.КолвоОбщ + тТабНараст.Колво
ИНАЧЕ 0
КОНЕЦ
КОНЕЦ КАК Взять
ИЗ
тТабНараст КАК тТабНараст
ВНУТРЕННЕЕ СОЕДИНЕНИЕ тОст КАК тОст
ПО тТабНараст.товар = тОст.товар
объединить все
ВЫБРАТЬ
"+",
общ.товар, 0, 0,
общ.Колво - тОст.Остаток КАК Поле1
ИЗ
(ВЫБРАТЬ
тТаб.товар КАК товар,
СУММА(тТаб.Колво) КАК Колво
ИЗ
тТаб КАК тТаб
СГРУППИРОВАТЬ ПО
тТаб.товар) КАК общ
ВНУТРЕННЕЕ СОЕДИНЕНИЕ тОст КАК тОст
ПО общ.товар = тОст.товар
И общ.Колво > тОст.Остаток