Рано или поздно, 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
Этот подход также часто используется в стандарте. Его можно встретить в запасах или в процессе сопоставлений в модулях Расчеты с клиентами, Расчеты с поставщиками.
Удачи с распределением!
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.