| 
			
			 | 
		#1 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
			
			
			Проблема с поиском в InventTrans после changeCompany (DAX4)
			 
			
			Так получилось, что заказ на покупку и связанный заказ на продажу, созданный функционалом InterCompany в строке имеет одинаковый InventTransId. 
		
		
		
		
		
		
		
	В результате код в методе transfer класса InterCompanyTransferInventDim находит строку InventTrans из компании, в которой вызывается разноска заказа на продажу, а не в компании, содержащей закупку. Сам код (стандартный, мое только добавление с попыткой сбросить переменную): X++: changecompany(_toDataAreaId) { setprefix(strfmt("@SYS93821",TradeInterCompany::curCompanyName())); // Попробуем сбросить переменную --> toInventTrans = null; // Попробуем сбросить переменную <-- toInventTrans = InventTrans::findTransId(_toInventTransId); toEndpoint = AifEndpoint::findInterCompany(fromValueMap.DataAreaId); if (toInventTrans.TransType == InventTransType::Sales) toValueMap = AifEndpointActionValueMap::find(toEndpoint.EndpointId, defaultSalesOrderAction); else toValueMap = AifEndpointActionValueMap::find(toEndpoint.EndpointId, defaultPurchaseRequisitionAction); toInventTrans = InventTrans::findTransId(_toInventTransId); Причем, для toValueMap находит нужную строку, хотя значение EndpointId есть и в исходной компании. Сама смена точно происходит (TradeInterCompany::curCompanyName() возвращает нужное значение). Если в 3.0 были такие проблемы при работе прогресс-бара, то в чем проблема в моем случае? Может кто решал?  | 
| 
	
 | 
| 
			
			 | 
		#2 | 
| 
			
			 Злыдни 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Попробуйте сбросить табличную переменную до смены компании - так, во всяком случае, советуют делать в design pattern
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#3 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			В данном случае не имеет значение инициализирована табличная переменная toInventTrans в какой-либо компании или нет.  
		
		
		
		
		
		
			Смотрите в какой компании находитесь внути метода findTransId() 
				__________________ 
		
		
		
		
	Axapta v.3.0 sp5 kr2  | 
| 
	
 | 
| 
			
			 | 
		#4 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
Что интересно, профайлер MS SQL показывает, что не создается новый курсор, а используется созданный на предыдущем поиске в текущей компании, а в нем компания как раз TS1. Может какие проблемы с настройками конкурентной модели? Включен режим оптимистичной конкуренции для таблиц.  | 
| 
	
 | 
| 
			
			 | 
		#5 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			И еще что характерно: проблема проявляется если _fromInventTransId и _toInventTransId имеют одинаковые значения. Если они разные, то все отрабатывает как положено (включая то, что в MS SQL создаётся отдельный курсор).
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#6 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			А у вас с кэшем на InventTrans никто не игрался? 
		
		
		
		
		
		
			Попробуйте его сбросить: toInventTrans.disableCache(true) 
				__________________ 
		
		
		
		
	Axapta v.3.0 sp5 kr2  | 
| 
	
 | 
| 
			
			 | 
		#7 | 
| 
			
			 Злыдни 
		
			
	 | 
	
	
	
		
		
		
		 
			
			А если ради эксперимента попробовать написать  
		
		
		
		
		
		
		
	X++: toInventTrans.disableCache(true); 
		 | 
| 
	
 | 
| 
			
			 | 
		#8 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Никто не успел бы поиграться. DAX4 недавно поставлена и никаких ползновений по изменению приложения пока не было. Сброс кэша не помог (попробовал и в InventTrans::findTransId и прямо в методе, заменяя findTransId на select)  
		
		
		
		
		
		
		
	![]() Хорошо, что обнаружил в процессе придумывания схемы учета при переходе к четверке. Если не решится проблема, буду знать, что настраивать номерные серии для лотов нужно будет в разных компаниях с разными префиксами.  | 
| 
	
 | 
| 
			
			 | 
		#9 | 
| 
			
			 Злыдни 
		
			
	 | 
	
	
	
		
		
		
		 
			
			А если этот кусок в джобик запихать - то что найдет?
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#10 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Фантастика! 
		
		
		
		
		
		
		
	X++: static void testChangeCompany(Args _args) { InventTrans inventTransTS1, inventTransTS2; ; changeCompany('ts1') { inventTransTS1 = InventTrans::findTransId('14265_059'); } changeCompany('ts2') { setprefix(strfmt("@SYS93821",TradeInterCompany::curCompanyName())); inventTransTS2 = InventTrans::findTransId('14265_059'); } }  
		 | 
| 
	
 | 
| 
			
			 | 
		#11 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
А что в этом случае выдает метод InventTrans.wasCached() ? Если он скажет что запись взята из кеша, то по идее вообще никакого запроса не должно уходить на SQL server.  | 
| 
	
 | 
| 
			
			 | 
		#12 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Находит то, что должен. А в коде класса InterCompanyTransferInventDim продолжает надо мной издеваться.  
 
		
	Есть подозрение что там RecordViewCache влез. В любом случае DisableCache(true); спасет смотите еще Глюки RecordViewCache  | 
| 
	
 | 
| Теги | 
| ax3.0, ax4.0, cache, кэширование | 
| 
	
	 | 
	
| Опции темы | Поиск в этой теме | 
| Опции просмотра | |
		
  |