Каталог решений - Распределение оплаты по товарам

Распределение оплаты по товарам

Распределение оплаты по товарам

В наличии

Учебная задача. Оплата приходит по заказу. Требуется запросом распределить её по товарам.
Практическая задача была сложнее. Упростил специально для иллюстрации.

Сначала собираем в одну таблицу заказы и товары. Затем ОБЪЕДИНТЬ ВСЕ с оплатами. Потом намазываем оплату на товар.

Категория:

Описание

Подобный подход можно использовать для распределения, например,

  • по партиям при списании количества товара
  • оплаты по заказам, если оплата пришла по договору вцелом

Минусом данного решения является ресурсоёмкость запроса. За основу взято классическое решение запроса с нарастающим итогом. К нему добавлен запрос, преобразующий нарастающий итог в текущее сальдо.

// Заказ собираем в одну таблицу с колонками «Заказ», «Товар», «СуммаЗаказано», «СуммаОплачено»
// колонку «СуммаОплачено» в запросе по заказам заполняем нулями
ВЫБРАТЬ
    «Заказ № 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
    КОНЕЦ КАК СальдоПотовару
ИЗ
    СальдоНарастающим КАК СальдоНарастающим

УПОРЯДОЧИТЬ ПО
    СальдоНарастающим.заказ,
    СальдоНарастающим.товар

О сути времени

has been added to your cart:
Оформление заказа