Цитата:
Сообщение от
mazzy
НЕТ! НЕТ! НЕТ!!! И еще раз НЕТ!!!
НИКОГДА так не делайте.
Этот код работат боль-мень приемлимо только на игрушечных данных малого объема!
Стоит вам только приблизиться к нормальному рабочему объему - ваша база умрет.
Здесь написано как Аксапта получает остатки на произвольную дату
http://axapta.mazzy.ru/lib/inventsumdate/
Вообще-то, даже чисто логически, вывод будет прямо противополжным. Одна групповая команда по всякому быстрее работает чем куча одиночных команд в цикле. Но это все теория. Пару месяцев назад я делал практическую проверку
30 тысяч артикулов. Рассчитать остаток для каждого артикула на начало мая 2005 года по 2 фиксированным складам (InventLocationId). Это около 2 миллионов складских проводок
InventSumDatePhysicalDim:: onHandQty() - отработал примерно за 50 минут
Прямой запрос в Query Analyzer по схеме: InventSum - SUM(InventTrans) выполнился за 2 минуты (т.е. остаток на сегодня минус все складские проводки до интересующей даты)
Даже с учетом того, что при переносе запроса в синтаксис AXAPTA он слегка "притормозит", все равно ускорение получаю
в разы
Конечно, это несколько не то, что предложил
UNRW. Я иду не "с начала времен", а от текущей даты назад. Но, по большому счету, на вывод это не влияет.
Если речь идет о расчете остатка для нескольких артикулов, можно использовать классы семейства InventSumDate. Если же речь идет о массовом расчете остатков по большому количеству артикулов, то следует искать обходные пути. Классы для этого слишком медленные.