|
![]() |
#1 |
Участник
|
Цитата:
Сообщение от mazzy
НЕТ! НЕТ! НЕТ!!! И еще раз НЕТ!!!
НИКОГДА так не делайте. Этот код работат боль-мень приемлимо только на игрушечных данных малого объема! Стоит вам только приблизиться к нормальному рабочему объему - ваша база умрет. Здесь написано как Аксапта получает остатки на произвольную дату http://axapta.mazzy.ru/lib/inventsumdate/ 30 тысяч артикулов. Рассчитать остаток для каждого артикула на начало мая 2005 года по 2 фиксированным складам (InventLocationId). Это около 2 миллионов складских проводок InventSumDatePhysicalDim:: onHandQty() - отработал примерно за 50 минут Прямой запрос в Query Analyzer по схеме: InventSum - SUM(InventTrans) выполнился за 2 минуты (т.е. остаток на сегодня минус все складские проводки до интересующей даты) Даже с учетом того, что при переносе запроса в синтаксис AXAPTA он слегка "притормозит", все равно ускорение получаю в разы Конечно, это несколько не то, что предложил UNRW. Я иду не "с начала времен", а от текущей даты назад. Но, по большому счету, на вывод это не влияет. Если речь идет о расчете остатка для нескольких артикулов, можно использовать классы семейства InventSumDate. Если же речь идет о массовом расчете остатков по большому количеству артикулов, то следует искать обходные пути. Классы для этого слишком медленные. |
|
![]() |
#2 |
Участник
|
Цитата:
Сообщение от Владимир Максимов
Вообще-то, даже чисто логически, вывод будет прямо противополжным. Одна групповая команда по всякому быстрее работает чем куча одиночных команд в цикле.
2. Вы забываете об аналитике. Аналитика у каждой номенклатуры - разная. Вообще говоря, мало кто хочет получить остатки на произвольную дату. Запрос UNRW является неправильным, поскольку не учитывает параметры в группе аналитики. Но я это дело пропустил, поскольку посчитал неважным. ОДНАКО: если вы говорите о групповой обработке, то расскажите как вы обработаете аналитике корректно в групповой обработке? Еще раз: уважаемые, подумайте. |
|
![]() |
#3 |
Участник
|
Цитата:
Сообщение от mazzy
1. Вы почему то обсуждаете конкретную реализацию, а не принцип. Принцип - считаем проводки от конца, а не от начала времен.
Если структура базы корректна, то, должно быть все-равно идем с начала в конец или с конца в начало. Результат должен быть одинаковый. По крайней мере в штуках. Если же рассматривается вопрос, что "с начала времен" просто физически больше записей и, как следствие, уйдет больше времени на их обработку, то опять все зависит от конкретных условий. В общем случае, от текущей даты будет быстрее. А в конкретном, надо смотреть на месте. Цитата:
Сообщение от mazzy
2. Вы забываете об аналитике. Аналитика у каждой номенклатуры - разная. Вообще говоря, мало кто хочет получить остатки на произвольную дату.
... ОДНАКО: если вы говорите о групповой обработке, то расскажите как вы обработаете аналитике корректно в групповой обработке? Или что Вы понимаете под термином "аналитика номенклатуры" применительно к расчету остатков? |
|
![]() |
#4 |
Участник
|
Цитата:
Сообщение от Владимир Максимов
Т.е. "вообще все остатки вот по этому складу". Просто соответствующий фильтр на InventDim.
Или что Вы понимаете под термином "аналитика номенклатуры" применительно к расчету остатков? Конурация, Цвет, Размер, Склад, Ячейка, Партия, ... ГТД(!) Я не верю, что для всех аналитик пользователи будут хотеть "получить остатки не в разрезе складской аналитики, а по конкретному реквизиту аналитики" ![]() Конечно, если у вас используется ТОЛЬКО склад... Причем НЕ БЫВАЕТ аналитики с выключенным складом (обычно это услуги)... Если ваши пользователи НЕ ХОТЯТ видеть отчет в разрезе всех (или нескольких выбранны) аналитик... ![]() |
|
![]() |
#5 |
Участник
|
Цитата:
Сообщение от mazzy
Я не верю, что для всех аналитик пользователи будут хотеть "получить остатки не в разрезе складской аналитики, а по конкретному реквизиту аналитики"
![]() ... Если ваши пользователи НЕ ХОТЯТ видеть отчет в разрезе всех (или нескольких выбранны) аналитик... ![]() Хорошо. Если говорить "в общем случае". Почему при расчете остатка на дату от текущей даты назад в разрезе складских аналитик недостаточно будет добавить группировку по соответствующим полям InventDim? Т.е. логика та же, что и в классе: берем текущий остаток по InventSum, из него вычитаем сумму InventTrans до нужной даты. Это 2 последовательных запроса. Каждый запрос имеет группировку по нужным полям InventDim. Какие здесь проблемы? Чем это принципиально отличается от работы классов InventSumDate? |
|
![]() |
#6 |
Участник
|
Цитата:
Сообщение от Владимир Максимов
Т.е. логика та же, что и в классе: берем текущий остаток по InventSum, из него вычитаем сумму InventTrans до нужной даты. Это 2 последовательных запроса.
Каждый запрос имеет группировку по нужным полям InventDim. Какие здесь проблемы? Чем это принципиально отличается от работы классов InventSumDate? Пример из жизни: 1. Исходные данные Есть одна проводка по номенклатуре 01.01.06 +10 шт Остаток = 10 шт Сегодня 31.01.06 2. Начинаем формировать отчет на 15.01.06. Делаем запрос к Sum, получаем 10 шт 3. Кто-то в это время формирует проводку +15 шт 4. Делаем запрос к InventTrans, получаем 15 шт 5. Рассчитываем остатки на 15.01.06: 10шт-15шт = -5 шт Так что при активной работе с базой этот подход не работает. А одним запросом при развесистой аналитике - сделать не получится. |
|
![]() |
#7 |
Участник
|
Цитата:
Сообщение от chel
При этом подходе основной проблемой будет то, что между запросом к InventSum и запросом к InventTrans (если они будут делаться не по одной номенклатуре, то они будут не очень быстрые), кто-то успеет наделать складских проводок.
Там по одному артикулу выполняется несколько последовательных запросов. Все с участием InventTrans. Т.е. Ваше возражение в той же степени применимо и к стандартному классу. Хотя, конечно, вероятность ниже. Цитата:
Сообщение от chel
Так что при активной работе с базой этот подход не работает.
Кроме того, поскольку речь идет о статистических отчетах, то даже если точность в пределах 5%, то считаем, что расчет выполнен точно. Цитата:
Сообщение от chel
А одним запросом при развесистой аналитике - сделать не получится.
То же самое делает и стандарный класс InventSumDate. Но по каждому артикулу в отдельности. |
|
![]() |
#8 |
Участник
|
Цитата:
Сообщение от chel
2. Начинаем формировать отчет на 15.01.06. Делаем запрос к Sum, получаем 10 шт
3. Кто-то в это время формирует проводку +15 шт 4. Делаем запрос к InventTrans, получаем 15 шт ![]() |
|
Теги |
остатки, ax3.0 |
|
![]() |
||||
Тема | Ответов | |||
Остатки на дату InventSumDatePhysical | 6 | |||
Остатки товара на определенную дату | 7 | |||
Скачут остатки | 3 | |||
Цена на дату создания заказа/закупки | 2 | |||
Остатки | 6 |
|