Microsoft Dynamics AX Development: Методы пропорционального/процентного распределения сумм

Category: Статьи Post Date: 01.04.2020

Рано или поздно, MS DAX разработчики сталкиваются с необходимостью работать с требованиями пропорционального распределения итоговых сумм в x++ коде по количеству, весу, процентам и/или другим критериям. В системе уже заложены различные методы для достижения этой цели, но не все они дают одинаковый результат. Каждая рассчитанная сумма должна быть округлена до двух знаков после запятой и распределение должно быть сделано с минимальным расхождением.

В следующей статье мы рассмотрим четыре наиболее часто используемых метода распределения. Эти методы не зависят от версии AX или от выбора ERP-системы, поэтому данная статья может оказаться полезной для всех ERP-разработчиков.

Простые пропорции и пропорции с сопоставлением расхождений

Пример в таблице ниже –  распределение  $100 на 7 отдельных операций, где количество = 1 в каждой транзакции.

Первый метод –  “простая пропорция”, описывается формулой:

Amount[i] = AmountTotal * Qty[i] / QtyTotal

После округления мы получим $100.03, т.е. появляется разница в $0,03 между первоначальной распределенной суммой и конечной распределенной суммой. Подобное расхождение в значениях неприемлемо в большинстве случаев.

Методы 2 и 3 основаны на этой же формуле, но общая сумма сопоставляется с одной конкретной строкой: c последней строкой в методе 2 и со строкой с наибольшей суммой в методе 3. После применения методов 2 или 3, вычисляется общая сумма. К сожалению, различие между строками с одинаковым количеством может достичь $0.03, что в 3 раза больше погрешности округления ($0.01). Эти методы работают в ряде сценариев, но в других случаях нам может потребоваться более точный алгоритм.
Примечание: метод 2 чаще используется в стандарте AX – метод  LedgerAllocationProcessRequest.createVoucherOffsets():

 

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

Метод 4 –  последний метод, подробно изложенный в таблице ниже. Это метод, который даст наиболее точный алгоритм.

Базовый принцип метода 4 содержит расчет ‘открытой’ суммы, основанный на распределении суммы и количества.

Каждый раз сумма по строке рассчитывается с вычитанием “Кол-ва для распределения” и “Суммы для распределения”. Затем используются вновь рассчитанные ‘открытые’ значения для последующих вычислений вместо использования начальных значений, как было в предыдущих методах (1-3).

Формула, описывающая метод 4:

Amount[i] = AmountRemaining * Qty[i] / QtyRemaining

Вместо:

Amount[i] = AmountTotal * Qty[i] / QtyTotal

Этот подход также часто используется в стандарте. Его можно встретить в запасах или в процессе сопоставлений в модулях Расчеты с клиентами, Расчеты с поставщиками.

Удачи с распределением!

Подписывайтесь на канал @d365neti в Telegram

Подписаться

Добавить комментарий