Распределение оплаты по товарам
Учебная задача. Оплата приходит по заказу. Требуется запросом распределить её по товарам.
Практическая задача была сложнее. Упростил специально для иллюстрации.
Сначала собираем в одну таблицу заказы и товары. Затем ОБЪЕДИНТЬ ВСЕ с оплатами. Потом намазываем оплату на товар.
- Описание
- Подробнее
Описание
- по партиям при списании количества товара
- оплаты по заказам, если оплата пришла по договору вцелом
Минусом данного решения является ресурсоёмкость запроса. За основу взято классическое решение запроса с нарастающим итогом. К нему добавлен запрос, преобразующий нарастающий итог в текущее сальдо.
// Заказ собираем в одну таблицу с колонками «Заказ», «Товар», «СуммаЗаказано», «СуммаОплачено»
// колонку «СуммаОплачено» в запросе по заказам заполняем нулями
ВЫБРАТЬ
«Заказ № 1» КАК заказ,
«сапоги гусарские» КАК товар,
100 КАК суммаЗаказано,
0 КАК СуммаОплачено
ПОМЕСТИТЬ табКоличеств
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
«Заказ № 1»,
«валенки Здоровье»,
50,
0
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
«Заказ № 1»,
«туфельки Золушка»,
60,
0
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
«Заказ № 222»,
«сапоги гусарские»,
200,
0
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
«Заказ № 222»,
«туфельки Золушка»,
20,
0
ОБЪЕДИНИТЬ ВСЕ
// К запросу по заказам снизу добавляем суммы оплат. При этом колонки Товар и СуммаЗаказано заполняем пустыми значениями.
// но не просто пустыми, а такими, чтобы при сортировке становились ДО значений из таблицы заказов.
// Для колонки Товар в реальном запросе следует использовать Значение(Справочник.Номенклатура.ПустаяСсылка), для колонки Сумма следует использовать 0
ВЫБРАТЬ
«Заказ № 1»,
«»,
0,
175
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
«Заказ № 222»,
«»,
0,
210
;
////////////////////////////////////////////////////////////////////////////////
// Намазываем оплату на товары. Получаем сальдо нарастающим итогом.
ВЫБРАТЬ РАЗЛИЧНЫЕ
табКоличеств.заказ,
табКоличеств.товар,
МИНИМУМ(табКоличеств.суммаЗаказано) КАК суммаЗаказано,
СУММА(табКоличеств1.суммаЗаказано) КАК суммаЗаказаноНарастающим,
МИНИМУМ(табКоличеств.СуммаОплачено) КАК суммаОплачено,
СУММА(табКоличеств1.суммаЗаказано — табКоличеств1.СуммаОплачено) КАК СальдоОплаченоНарастающим
ПОМЕСТИТЬ СальдоНарастающим
ИЗ
табКоличеств КАК табКоличеств
ЛЕВОЕ СОЕДИНЕНИЕ табКоличеств КАК табКоличеств1
ПО табКоличеств.заказ = табКоличеств1.заказ
И табКоличеств.товар >= табКоличеств1.товар
СГРУППИРОВАТЬ ПО
табКоличеств.заказ,
табКоличеств.товар
;
////////////////////////////////////////////////////////////////////////////////
// Превращаем нарастающее сальдо в простое. При этом получем в колонке СальдоПотовару 0 — нет задолженности, число — сумма задолженности
ВЫБРАТЬ
СальдоНарастающим.заказ,
СальдоНарастающим.товар,
СальдоНарастающим.суммаЗаказано,
ВЫБОР
КОГДА СальдоНарастающим.СальдоОплаченоНарастающим > 0
ТОГДА ВЫБОР
КОГДА СальдоНарастающим.СальдоОплаченоНарастающим > СальдоНарастающим.суммаЗаказано
ТОГДА СальдоНарастающим.суммаЗаказано
ИНАЧЕ СальдоНарастающим.СальдоОплаченоНарастающим
КОНЕЦ
ИНАЧЕ 0
КОНЕЦ КАК СальдоПотовару
ИЗ
СальдоНарастающим КАК СальдоНарастающим
УПОРЯДОЧИТЬ ПО
СальдоНарастающим.заказ,
СальдоНарастающим.товар
