| 
			
			 | 
		#1 | 
| 
			
			 MCITP 
		
			
	 | 
	
	
	
		
		
			
			 
			
			Всем привет. 
		
		
		
		
		
		
			Вероятно, конечно, баян, но я не нашёл... Интуитивно так обычно не делал, но вот недавно наткнулся - решил поделиться. Если внутри цикла while select (ну и не только наверное) изменить ссылку табличной переменной используемого курсора на что-то другое, то можно "отгрести" забавные результаты. Проще продемонстрировать, чем объяснить. ![]() Пример Jobа (Номер журнала задайте сами): X++: static void ZVV_TestCursorJob(Args _args) { InventTrans inventTrans; InventJournalId _InventJournalId = "СЖ008968"; ; while select inventTrans where inventtrans.TransType == InventTransType::InventTransfer && inventTrans.TransRefId == _InventJournalId { info(strFmt("%1 %2 %3", inventTrans.InventTransId, inventTrans.ItemId, inventTrans.Qty)); } info(strrep('-',30)); while select inventTrans where inventtrans.TransType == InventTransType::InventTransfer && inventTrans.TransRefId == _InventJournalId { info(strFmt("%1 %2 %3", inventTrans.InventTransId, inventTrans.ItemId, inventTrans.Qty)); inventTrans = inventTrans::findRecId(inventTrans.RecId); } } Код: Сообщение (16:45:39) Л_11776612 25472/001 -10,00 Л_11776612 25472/001 10,00 Л_11776613 25472/001 -10,00 Л_11776613 25472/001 10,00 Л_11776614 25472/001 -20,00 Л_11776614 25472/001 20,00 ------------------------------ Л_11776612 25472/001 -10,00 Л_11776612 25472/001 -10,00 Л_11776612 25472/001 -10,00 Л_11776612 25472/001 -10,00 Л_11776612 25472/001 -10,00 Л_11776612 25472/001 -10,00 3.0 
				__________________ 
		
		
		
		
	Zhirenkov Vitaly  | 
| 
	
 | 
| 
			
			 | 
		#2 | 
| 
			
			 MCITP 
		
			
	 | 
	
	
	
		
		
			
			 
			
			Особенно актуально это, наверное, с частоиспользуемыми конструкциями InventDim::findOrCreate()...
		 
		
		
		
		
		
		
			
				__________________ 
		
		
		
		
	Zhirenkov Vitaly  | 
| 
	
 | 
| 
			
			 | 
		#3 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			ну изначально цикл содержит 7 итераций, тоесть 7 записей найдено и эти 7 записей в переменной "inventTrans", а строчка "inventTrans = inventTrans::findRecId(inventTrans.RecId);" находит одну единственную запись ... поидее цикл должен был остановиться после первой записи... но он выполняется 7 раз и пытается сдвинуть курсор, но  inventTrans после первой итерации содержит 1 запись 
		
		
		
		
		
		
		
		
			X++: select inventTrans where inventtrans.TransType == InventTransType::InventTransfer && inventTrans.TransRefId == while(inventTrans) { info(strFmt("%1 %2 %3", inventTrans.InventTransId, inventTrans.ItemId, inventTrans.Qty)); inventTrans = inventTrans::findRecId(inventTrans.RecId); next inventTrans; }  
		Последний раз редактировалось DAX; 05.12.2008 в 19:54.  | 
| 
	
 | 
| 
			
			 | 
		#4 | 
| 
			
			 MCITP 
		
			
	 | 
	
	
	
		
		
			
			 
			
			Так да, будет только одна запись выбираться. 
		
		
		
		
		
		
			Но это то и понятно... Речь не о том, как это обойти, можно вообще-то и переменную другую завести. ![]() Просто может кто не в курсе, чтоб не наступали на грабли. 
				__________________ 
		
		
		
		
	Zhirenkov Vitaly  | 
| 
	
 | 
| 
			
			 | 
		#5 | 
| 
			
			 NavAx 
		
			
	 | 
	
	
	
		
		
		
		 
			
			только мне этот "баг" кажется очевидным?  
		
		
		
		
		
		
			 
		
				__________________ 
		
		
		
		
	И все они создания природы...  | 
| 
	
 | 
| 
			
			 | 
		#6 | 
| 
			
			 Участник 
		
			
	 | 
	
	|
| 
	
 | 
| 
			
			 | 
		#7 | 
| 
			
			 Боец 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Я вообще прикола не понял... Вы меняете значение курсорв, на основе которой система строит цикл. Зачем его трогать, и зачем потом ломать голову "почему происходит так, а не по-моему"? если угодно, можно создать дополнительную табл. переменную и пользовать её...
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: Lemming (1). | |
| 
			
			 | 
		#8 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			А почему он должен выполняться один раз или зацикливаться?  Я так понимаю, WHILE SELECT работает следующим образом - сам SELECT выполняется один единственный раз , а потом  с помощью WHILE  осуществляется навигация по выбранным записям этого SELECT'a  (при этом сама выборка в цикле уже не перестраивается)
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#9 | 
| 
			
			 MCITP 
		
			
	 | 
	
	
	
		
		
			
			 
			
			Вот уж не думал, что такая дискуссия разгорится. 
		
		
		
		
		
		
			![]() На самом деле Аксапта то может и более-менее логично себя ведёт, если подумать. Я её за это и не упрекаю и багом происходящее не называл. Я хотел сказать, что если об этом не знаешь или не думаешь, то "Найти такой баг в коде наверное не всегда может быть просто и очевидно..". Имелось ввиду баг в своём коде.  
		
				__________________ 
		
		
		
		
	Zhirenkov Vitaly  | 
| 
	
 | 
| 
	
	 | 
	
		
  |