|  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. | 
|  |