AXForum  
Go Back   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Forgotten Your Password?
Register Forum Rules FAQ Members List Today's Posts Search

 
 
Thread Tools Search this Thread Display Modes
Old 25.11.2003, 12:02   #1  
Roman A. is offline
Roman A.
Участник
 
9 / 10 (1) +
Join Date: 25.11.2003
? Остатки на начало периода
Добрый день.

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

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

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

НО

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

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

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

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

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

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

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

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

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

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

От doInsert и doUpdate на inventTrans отказались оч.давно
Old 25.11.2003, 19:22   #13  
mazzy is offline
mazzy
Участник
mazzy's Avatar
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Join Date: 29.11.2001
Location: Москва
Blog Entries: 10
в MS SQL есть блокировка на чтение.
Oracle тоже не допустит.

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

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

Similar Threads
Thread Thread Starter Forum Replies Last Post
Остатки товара на определенную дату 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

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Рейтинг@Mail.ru
All times are GMT +3. The time now is 11:25.
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Contacts E-mail, Advertising.