| 
			
			 | 
		#1 | 
| 
			
			 Moderator 
		
			
	 | 
	
	
	
		
		
			
			 
			
			День Добрый! 
		
		
		
		
		
		
		
	Вопрос такой -- можно ли из InventSum удалять записи с Closed == NoYes::Yes и ClosedQty == NoYes::Yes Выводит количество таких записей (у нас примерно 80%): PHP код: 
	
			
	 | 
| 
	
 | 
| 
			
			 | 
		#2 | 
| 
			
			 Member 
		
			
	 | 
	
	
	
		
		
		
		
		
		
		
		
		
		
			 
				__________________ 
		
		
		
		
	С уважением, glibs®  | 
| 
	
 | 
| 
			
			 | 
		#3 | 
| 
			
			 Moderator 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Вы правы! Спасибо! Не углядел  
		
		
		
		
		
		
		
	 
		 | 
| 
	
 | 
| 
			
			 | 
		#4 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
Обрати внимание, что у InventSum есть методы isAllFieldsZero isAllQtyFieldsZero isAllValueFieldsZero Надо проверить записи для которых InventSum.isAllFieldsZero() == true Такие записи могут появляться в двух случаях: 1. выполнен приход и расход. Итог обнулился, но его удалять нельзя 2. человек создал строчку в журнале/заказе/закупке с неправильной складской аналитикой. Но потом обнаружил свою ошибку и исправился до разноски. В этом случае в InventDim появится запись с комбинацией, которая нигде больше не используется. А в inventSum - запись с итогами на такой InventDim. Такие inventSum могут быть и закрытыми, и незакрытыми. Поэтому правильный алгоритм такой: 1. Найти записи в InventSum для которых InventSum.isAllFieldsZero() == true 2. Найти количество InventTrans для таких записей 3. Если количество в InventTrans == 0, то InventSum удалять можно. Дополнительное расширение алгоритма: = сначала можно проверить "забытые" inventTrans - остались ли неразнесенные InventTrans, которые относятся к несуществующим (или аннулированным) журналам/заказам/закупкам/производству = в конкретном вашем случае можно смягчить проверку и проверять InventSum.isAllQtyFieldsZero() == true (но будь предельно внимательным если у тебя появились записи в InventSum c нулевым количеством И ненулевой суммой И с отсутствующими проводками в InventTrans - это признак того, что в базу вмешивались грубой силой.)  | 
| 
	
 | 
| 
			
			 | 
		#5 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			И еще одно. 
		
		
		
		
		
		
			
		
		
		
		
	После грубых манипуляций с InventSum обязательно стоит выполнить процедуру Проверка целостности данных компании, в которой указать режим Коррекция и оставить галочку Управление Запасами, Номенклатура, В наличии. Эта процедура пересчитывает InventSum (но ничего не удаляет) См. класс InventConsistencyCheck_Onhand Обрати внимание, что: 1. на 40Гб базе эта процедура может выполняться несколько часов 2. она блокирует работу пользователей, которые работают со складом (поэтому эту процедуру лучше выполнять ночью)  | 
| 
	
 | 
| 
			
			 | 
		#6 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
Лишняя проверка.  | 
| 
	
 | 
| 
			
			 | 
		#7 | 
| 
			
			 Moderator 
		
			
	 | 
	
	
	
		
		
		
		 
			
			2 mazzy: 
		
		
		
		
		
		
		
	Большое Спасибо за подробную инструкцию, сейчас поэксперементирую - результаты скину.  | 
| 
	
 | 
| 
			
			 | 
		#8 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
Извините за пропущенное слово Полная фраза InventSum.isAllFieldsZero() == true и количество записей в inventTrans != 0 полный правильный алгоритм Поэтому правильный алгоритм такой: 1. Найти записи в InventSum для которых InventSum.isAllFieldsZero() == true 2. Найти количество записей InventTrans для каждой записи из InventSum 3. Если количество записей в InventTrans == 0, то InventSum удалять можно.  | 
| 
	
 | 
| 
			
			 | 
		#9 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Хорошо.
		 
		
		
		
		
		
		
			
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#10 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от mazzy
			 
 
			Нет, не лишняя. 
		
	Извините за пропущенное слово Полная фраза InventSum.isAllFieldsZero() == true и количество записей в inventTrans != 0 полный правильный алгоритм Поэтому правильный алгоритм такой: 1. Найти записи в InventSum для которых InventSum.isAllFieldsZero() == true 2. Найти количество записей InventTrans для каждой записи из InventSum 3. Если количество записей в InventTrans == 0, то InventSum удалять можно.  | 
| 
	
 | 
| 
			
			 | 
		#11 | 
| 
			
			 Модератор 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
- десятого его продайте - постройте отчеты из Управление запасами / Отчеты / Статус / Физическое наличие на пятое число - убедитесь, что CLOSED==1 && CLOSEDQTY==1 - удалите INVENTSUM - снова постройте отчеты glibs писал именно об этом Цитата: 
	
		
			Какой смысл смотреть количество в инвенттрансе, если уже по этому флагу мы знаем, что такую запись из инвентсума можно удалить вместе со всеми складскими проводками
		
	 
 
		
				__________________ 
		
		
		
		
	-ТСЯ или -ТЬСЯ ?  | 
| 
	
 | 
| 
			
			 | 
		#12 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
Но кроме штатных средств есть экспорт/импорт и doInsert/doUpdate/doDelete Складские проводки (InventTrans) нельзя удалять ни в коем случае. В крайнем случае можно объединять штатной функцией Суммирование. Но не удалять! (InventTrans удалять только после того, как решение будет обдумано и взвешено 7 раз и то, только через год после принятия решения об удалении)  | 
| 
	
 | 
| 
			
			 | 
		#13 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
От этого некоторые отчеты правда перестанут работать, но другой функционал (обработка накладных и т.п.) не должен пострадать.  | 
| 
	
 | 
| 
			
			 | 
		#14 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
Если вас это не беспокоит, то и в самом деле почему бы не удалить?  | 
| 
	
 | 
| 
			
			 | 
		#15 | 
| 
			
			 Member 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от xshaman
			
			 
... 
		
	Все таки не совсем понятна необходимость проверки на кол-во заприсей в складских проводках. ... А вообще можно, конечно, просто все удалить и запустить пересчет InventSum. Но оно восстановит записи с нулевым количеством и нулевой стоимостью. 
				__________________ 
		
		
		
		
	С уважением, glibs®  | 
| 
	
 | 
| 
			
			 | 
		#16 | 
| 
			
			 AX***** 
		
			
	 | 
	
	
	
		
		
		
		 
			
			можно использовать вместо длительного  
		
		
		
		
		
		
		
	Цитата: 
	
		
			Проверка целостности данных компании
		
	 
X++: static void Job(Args _args) { InventSumReCalcItem reCalcItem; Dialog dialog = new Dialog("Коррекция остатков номенклатуры"); DialogField dialogItemId = dialog.addField(typeId(ItemId)); ItemId itemId; InventTable inventTable; ; if (dialog.run()) { itemId = dialogItemId.value(); } if (itemId) { while select inventTable where inventTable.ItemId == itemId { reCalcItem = new InventSumReCalcItem(inventTable.ItemId, true, CheckFix::Fix); reCalcItem.updateNow(); } } }  | 
| 
	
 | 
| 
			
			 | 
		#17 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			1. Спасибо. 
		
		
		
		
		
		
			
		
		
		
		
	2. Обсуждение сильно уходит в сторону от исходного вопроса. Метод reCalcItem.updateNow() не удаляет никаких записей, насколько я помню. Он только пересчитывает те записи, которые в момент пересчета затрагиваются в inventTrans.  | 
| 
	
 | 
| 
			
			 | 
		#18 | 
| 
			
			 AX***** 
		
			
	 | 
	
	
	
		
		
		
		 
			
			не согласен.. В версии 2.5 если по номенклатуре есть левые остатки ничем кроме inventsum не подкреплены -- данный код "убьет" эти остатки из таблицы inventsum.
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#19 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
Вот кусок кода из метода loadCurrentInventSum() (вызывается внутри updateNow()) X++: while select forupdate inventSum where inventSum.itemId == itemId { cacheInventSum.ins(inventSum); if (checkFix == checkFix::Fix) inventSum.delete(); } } 
				__________________ 
		
		
		
		
	Axapta v.3.0 sp5 kr2  | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: aidsua (1). | |
| 
			
			 | 
		#20 | 
| 
			
			 Участник 
		
			
	 | 
	
	|
| 
	
 | 
| Теги | 
| inventsum, производительность | 
| 
	
	 | 
	
		
  |