03 декабря 2014

Оборотно-сальдовая ведомость по складу для Axapta 2009

Разработал новую версию Оборотно-сальдовой ведомости по складу (ОСВСк) для Axapta 2009.
Это только финансовая оборотка — строится только по "Куплено" и "Продано"

Эта версия — двухпропроходная (два раза обращается к InventTrans), прошлая была пятипроходная. На прошлую версию совсем не похоже.

Полагаю, на средних по объёму базах (около 20 млн записей в InventTrans) будет работать
достаточно быстро.




Лицензионное соглашение:
Скачать и запускать можно бесплатно для некоммерческого использования

Описание

Ранее проблемы производительности ОСВСк упирались в то, что производительность проседала при правильной подвязке расчёта корректировок.
У меня эта проблема решена таким образом:
1. В InventTrans создаём поле LedgerAccount с типом LedgerAccount. В это поле будет переноситься бухсчёт из InventTransPosting
2. Ставим в планировщик выполнение оператора, который будет заполнять это поле. Это оператор

with T1 as (select * from INVENTTRANS
            where LEDGERACCOUNT = '' and (STATUSRECEIPT = 1 or STATUSISSUE = 1))
merge into T1 a
using INVENTTRANSPOSTING b
on a.DATAAREAID = b.DATAAREAID and a.INVENTTRANSID = b.INVENTTRANSID
and a.VOUCHER = b.VOUCHER and b.INVENTTRANSPOSTINGTYPE = 1
when matched then
update set a.LEDGERACCOUNT = case when b.ACCOUNT <> '' then b.ACCOUNT else 'IsEmpty' end
when not matched by source then update set a.LEDGERACCOUNT = 'NotFound';

Первый раз оператор будет выполняться медленно, потому что надо все строки обновить.
Последующие разы — должен быстро, поскольку обновление инкрементное (обновляет только добавленные строки).
Надо создать индекс по полю LEDGERACCOUNT и, если SQL его не использует — возможно добавить табличный хинт with (index (I_177INDEX1) или применить иные методы оптимизации.

Этот оператор при желании можно запускать каждый раз перед запуском отчёта (если ваши ресурсы это позволяют)

Обратите внимание — оператор может поставить в поле LEDGERACCOUNT и такие значения как 'IsEmpty' (значит запись в постинге найдена, но там счёт пустой) и 'NotFound' (значит постинг не найден). И то и другое означает ошибки в данных, но об этом отдельный разговор.

Для сторно сейчас не учитывается реверсирование — знак проводки определяется по полям STATUSISSUE или STATUSRECEIPT


Установка
1. Скачать файл
2. Установить на SSRS
3. Изменить DataSource на ваш сервер
4. Выполнить единоразово указанный выше оператор при отсутствии другой нагрузки, и сначала на тестовом, чтобы оценить производительность
5. Поставить в планировщик этот оператор