25.11.2003, 12:02 | #1 |
Участник
|
Остатки на начало периода
Добрый день.
У меня возник вопрос по поводу формирования "Оборотной ведомости". Этот отчет формируется на основе таблицы InventTrans. Проблема заключается в определении остатков на начало периода. Со временем таблица разрастается. Соответственно отчет будет работать все дольше. Информацию по кол-ву номенклатуры на складе можно определить с помощью таблицы InventSum. (Т.е. рассчитывая остатки на начало периода, можно исходить из информации на текущий момент). Проблема в "финансах" - сумма остатков в деньгах рассчитывается на основе значений CostAmountAdjustment и CostAmountPosted таблицы InventTrans. Как можно решить подобную проблему? Спасибо. |
|
25.11.2003, 12:14 | #2 |
Участник
|
Обратите внимание на inventSum.postedValue.
При помощи перекрестных ссылок, посмотрите на те методы, которые пишут в это поле значения. |
|
25.11.2003, 13:12 | #3 |
----------------
|
Еще возможные проблемы
Действительно, InventSum.PostedValue хранит сумму всех CostAmountPosted и CostAmountAdjustment по данной номенклатуре-аналитике
НО Если в момент формирования оборотки будут активно работать пользователи, то возможны следущие проблемы: - блокировка процесса другими процессами - некорректные кол-ва и суммы |
|
25.11.2003, 17:19 | #4 |
Участник
|
Некорректных не будет, поскольку есть блокировки
блокировки будут не только на inventSum. При "активной работе пользователей" блокировки будут и на inventTrans. |
|
25.11.2003, 17:28 | #5 |
Участник
|
Спасибо за обсуждение.
Я попробую сделать с помощью поля postedValue. Один вопрос - почему "родная" оборотка сделана без использования InventSum? |
|
25.11.2003, 17:54 | #6 |
NavAx
|
Для интереса сделайте два отчета:
1) используя InventSum 2) на основе InventTrans По-идее, результаты должны совпасть. Но, с другой стороны, подобным анализом можно сильно подпортить настроение, особенно если чего пришлось править "ручками" |
|
25.11.2003, 18:08 | #7 |
----------------
|
Подробности
Цитата:
- блокировка процесса другими процессами
------------------ блокировки будут не только на inventSum. При "активной работе пользователей" блокировки будут и на inventTrans Конечно, можно сделать NOLOCK, но это увеличит вероятность ошибочных результатов. Цитата:
- некорректные кол-ва и суммы
--------------- Некорректных не будет, поскольку есть блокировки "Новая оборотка" получила данные из inventSum (PostedQty, PostedValue), потом стала отнимать исторические проводки.. в этот момент некий процесс (накладная) изменяет количество и сумму... Оборотка останавливается, дожидается окончания процесса.. накладная закрылась.. обротка "увидела новую проводку" и вычла ее из старого InventSum. (Проверено на практике) Конечно, оборотка может попытаться заблокировать, то что считывает, но тогда см.п.1 |
|
25.11.2003, 18:14 | #8 |
Участник
|
Цитата:
Изначально опубликовано Roman A.
почему "родная" оборотка сделана без использования InventSum? |
|
25.11.2003, 18:21 | #9 |
Участник
|
Цитата:
Это российский отчет
|
|
25.11.2003, 18:30 | #10 |
Участник
|
Re: Подробности
Цитата:
Изначально опубликовано Wamr
оборотка, обычно, строится по историческим данным, то вероятность попадания такой записи в выборку очень мала (при стандартном подходе). Если строить от текущего состояния inventSum, то будут выбираться наисвежайшие данные, т.е. 99% попадется заблокированая проводка или остаток (InventSum). Конечно, можно сделать NOLOCK, но это увеличит вероятность ошибочных результатов. Блокировка быстро поднимется с записей до страниц, а со страниц до всей таблицы Поэтому хоть так, хоть так... вероятность будет одинакова. Цитата:
Изначально опубликовано Wamr
Пример: "Новая оборотка" получила данные из inventSum (PostedQty, PostedValue), потом стала отнимать исторические проводки.. в этот момент некий процесс (накладная) изменяет количество и сумму... Оборотка останавливается, дожидается окончания процесса.. накладная закрылась.. обротка "увидела новую проводку" и вычла ее из старого InventSum. (Проверено на практике) При создании новой проводки, Аксапта начинает транзакцию. При записи проводки, обновляется inventSum. Если inventSum заблокирован, то запись проводки не будет выполнена из-за деадлока. Если у вас на практике такое было, значит вы прогали и использовали doInsert/doUpdate В общем, подумайте еще раз. |
|
25.11.2003, 18:32 | #11 |
Участник
|
Цитата:
Изначально опубликовано Roman A.
С этим я не спорю. Просто почему изначально не сделали с помощью InventSum? Может была какая-то сермяжная правда в этом? Хотя, вероятно, это неконструктивный вопрос. Вы же тоже не сразу начали этот механизм использовать. А там тоже люди работают... |
|
25.11.2003, 18:47 | #12 |
----------------
|
Цитата:
Блокировка быстро поднимется с записей до страниц, а со страниц до всей таблицы
Поэтому хоть так, хоть так... вероятность будет одинакова. Цитата:
При создании новой проводки, Аксапта начинает транзакцию. При записи проводки, обновляется inventSum. Если inventSum заблокирован, то запись проводки не будет выполнена из-за деадлока
Оборотка считает inventSum до начала транзакции по созданию новой проводки и посчитает новую проводку после завершения транзакции.... и получит лажу От doInsert и doUpdate на inventTrans отказались оч.давно |
|
25.11.2003, 19:22 | #13 |
Участник
|
в MS SQL есть блокировка на чтение.
Oracle тоже не допустит. Насчет deadlock'а - согласен. Погорячился. Надо подумать. |
|
26.11.2003, 09:38 | #14 |
----------------
|
Предложение
К чему пришли мы в результате опыта эксплуатации различных вариантов оборотки:
1. Раз в месяц (после закрытия периода) в специальную табличку сохраняется срез InventSum на начало месяца (периода) 2. При расчете оборотки проводки суммируются не от начало времен, а от одного из срезов (последнй, предпоследний) 3 (не сделано, но нужно) Механизм проверки и коррекции среза срез InventSum - это не копия InventSum, а расчет остатков на какую-то дату. Опять же, есть варианты с полным суммированием InventTrans, с суммированием inventTrans от предыдущего среза и с вычитание из InventSum InventTrans. |
|