AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 25.11.2003, 12:02   #1  
Roman A. is offline
Roman A.
Участник
 
9 / 10 (1) +
Регистрация: 25.11.2003
? Остатки на начало периода
Добрый день.

У меня возник вопрос по поводу формирования "Оборотной ведомости". Этот отчет формируется на основе таблицы InventTrans. Проблема заключается в определении остатков на начало периода. Со временем таблица разрастается. Соответственно отчет будет работать все дольше.

Информацию по кол-ву номенклатуры на складе можно определить с помощью таблицы InventSum. (Т.е. рассчитывая остатки на начало периода, можно исходить из информации на текущий момент). Проблема в "финансах" - сумма остатков в деньгах рассчитывается на основе значений CostAmountAdjustment и CostAmountPosted таблицы InventTrans.

Как можно решить подобную проблему?
Спасибо.
Старый 25.11.2003, 12:14   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Обратите внимание на inventSum.postedValue.
При помощи перекрестных ссылок, посмотрите на те методы, которые пишут в это поле значения.
Старый 25.11.2003, 13:12   #3  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Еще возможные проблемы
Действительно, InventSum.PostedValue хранит сумму всех CostAmountPosted и CostAmountAdjustment по данной номенклатуре-аналитике

НО

Если в момент формирования оборотки будут активно работать пользователи, то возможны следущие проблемы:
- блокировка процесса другими процессами
- некорректные кол-ва и суммы
Старый 25.11.2003, 17:19   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Некорректных не будет, поскольку есть блокировки

блокировки будут не только на inventSum. При "активной работе пользователей" блокировки будут и на inventTrans.
Старый 25.11.2003, 17:28   #5  
Roman A. is offline
Roman A.
Участник
 
9 / 10 (1) +
Регистрация: 25.11.2003
Спасибо за обсуждение.

Я попробую сделать с помощью поля postedValue. Один вопрос - почему "родная" оборотка сделана без использования InventSum?
Старый 25.11.2003, 17:54   #6  
Ser is offline
Ser
NavAx
 
99 / 14 (1) ++
Регистрация: 04.03.2002
Адрес: Москва
Для интереса сделайте два отчета:
1) используя InventSum
2) на основе InventTrans

По-идее, результаты должны совпасть.
Но, с другой стороны, подобным анализом можно сильно подпортить настроение, особенно если чего пришлось править "ручками"
Старый 25.11.2003, 18:08   #7  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Подробности
Цитата:
- блокировка процесса другими процессами
------------------
блокировки будут не только на inventSum. При "активной работе пользователей" блокировки будут и на inventTrans
Действительно, при "активной работе пользователей" будут изменяться и добавляться провдки (InventTrans). Но так как оборотка, обычно, строится по историческим данным, то вероятность попадания такой записи в выборку очень мала (при стандартном подходе). Если строить от текущего состояния inventSum, то будут выбираться наисвежайшие данные, т.е. 99% попадется заблокированая проводка или остаток (InventSum).
Конечно, можно сделать NOLOCK, но это увеличит вероятность ошибочных результатов.

Цитата:
- некорректные кол-ва и суммы
---------------
Некорректных не будет, поскольку есть блокировки
Пример:
"Новая оборотка" получила данные из inventSum (PostedQty, PostedValue), потом стала отнимать исторические проводки.. в этот момент некий процесс (накладная) изменяет количество и сумму... Оборотка останавливается, дожидается окончания процесса.. накладная закрылась.. обротка "увидела новую проводку" и вычла ее из старого InventSum. (Проверено на практике)
Конечно, оборотка может попытаться заблокировать, то что считывает, но тогда см.п.1
Старый 25.11.2003, 18:14   #8  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Изначально опубликовано Roman A.
почему "родная" оборотка сделана без использования InventSum?
Это российский отчет
Старый 25.11.2003, 18:21   #9  
Roman A. is offline
Roman A.
Участник
 
9 / 10 (1) +
Регистрация: 25.11.2003
Цитата:
Это российский отчет
С этим я не спорю. Просто почему изначально не сделали с помощью InventSum? Может была какая-то сермяжная правда в этом? Хотя, вероятно, это неконструктивный вопрос.
Старый 25.11.2003, 18:30   #10  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Re: Подробности
Цитата:
Изначально опубликовано Wamr
оборотка, обычно, строится по историческим данным, то вероятность попадания такой записи в выборку очень мала (при стандартном подходе). Если строить от текущего состояния inventSum, то будут выбираться наисвежайшие данные, т.е. 99% попадется заблокированая проводка или остаток (InventSum).
Конечно, можно сделать NOLOCK, но это увеличит вероятность ошибочных результатов.
Немного не так.
Блокировка быстро поднимется с записей до страниц, а со страниц до всей таблицы
Поэтому хоть так, хоть так... вероятность будет одинакова.

Цитата:
Изначально опубликовано Wamr
Пример:
"Новая оборотка" получила данные из inventSum (PostedQty, PostedValue), потом стала отнимать исторические проводки.. в этот момент некий процесс (накладная) изменяет количество и сумму... Оборотка останавливается, дожидается окончания процесса.. накладная закрылась.. обротка "увидела новую проводку" и вычла ее из старого InventSum. (Проверено на практике)
Не так.
При создании новой проводки, Аксапта начинает транзакцию. При записи проводки, обновляется inventSum. Если inventSum заблокирован, то запись проводки не будет выполнена из-за деадлока.

Если у вас на практике такое было, значит вы прогали и использовали doInsert/doUpdate

В общем, подумайте еще раз.
Старый 25.11.2003, 18:32   #11  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Изначально опубликовано Roman A.
С этим я не спорю. Просто почему изначально не сделали с помощью InventSum? Может была какая-то сермяжная правда в этом? Хотя, вероятно, это неконструктивный вопрос.
В общем то да.
Вы же тоже не сразу начали этот механизм использовать.

А там тоже люди работают...
Старый 25.11.2003, 18:47   #12  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Цитата:
Блокировка быстро поднимется с записей до страниц, а со страниц до всей таблицы
Поэтому хоть так, хоть так... вероятность будет одинакова.
Для того чтобы заблокировать оборотку (которая сама ничего не блокирует) при работе по InventSum достаточно 1 новой (измененной) проводки (не таблицы и не страницы), а для остановки расчета по историческим данным нужно блокировать весь InventTrans, что само по себе есть ЧП.

Цитата:
При создании новой проводки, Аксапта начинает транзакцию. При записи проводки, обновляется inventSum. Если inventSum заблокирован, то запись проводки не будет выполнена из-за деадлока
Ага, только вот оборотка ничего не пишет в inventSum и InventTrans, а значит и не блокирует, а значит и не может быть речи о deadlock-е.
Оборотка считает inventSum до начала транзакции по созданию новой проводки и посчитает новую проводку после завершения транзакции.... и получит лажу

От doInsert и doUpdate на inventTrans отказались оч.давно
Старый 25.11.2003, 19:22   #13  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
в MS SQL есть блокировка на чтение.
Oracle тоже не допустит.

Насчет deadlock'а - согласен. Погорячился. Надо подумать.
Старый 26.11.2003, 09:38   #14  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Предложение
К чему пришли мы в результате опыта эксплуатации различных вариантов оборотки:
1. Раз в месяц (после закрытия периода) в специальную табличку сохраняется срез InventSum на начало месяца (периода)
2. При расчете оборотки проводки суммируются не от начало времен, а от одного из срезов (последнй, предпоследний)
3 (не сделано, но нужно) Механизм проверки и коррекции среза

срез InventSum - это не копия InventSum, а расчет остатков на какую-то дату. Опять же, есть варианты с полным суммированием InventTrans, с суммированием inventTrans от предыдущего среза и с вычитание из InventSum InventTrans.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Остатки товара на определенную дату Lucky13 DAX: Программирование 7 27.03.2007 14:27
Скачут остатки Def DAX: Программирование 3 03.05.2006 14:27
ПН долг на начало периода Berty Wooster DAX: Функционал 4 01.02.2006 18:23
Сверка остатков по счетам учета материалов и складские остатки tolstjak DAX: Функционал 5 05.04.2005 13:51
Закрытие склада (периода) - ФИФО - копейки в закрытом периоде Wamr DAX: Функционал 1 28.11.2003 17:41
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 07:37.