| 
			
			 | 
		#1 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
			
			
			Не выходит из цикла while select {...}
			 
			
			Приветствую. Есть следующий код. 
		
		
		
		
		
		
		
	X++: public void UpdateVariableParms() { real saleLineAmount; real priceUnit; real qty; SalesLineVariableParms saleLineVarParam; PriceVariableParms::construct().run(this); saleLineAmount = this.LineAmount; select * from saleLineVarParam where saleLineVarParam.SalesLineRef == this.RecId; while select saleLineVarParam { if(saleLineVarParam.MinCharge == true) { saleLineAmount += saleLineVarParam.Charge; } else if(saleLineVarParam.PriceAs == PriceAs::Surcharge) { saleLineAmount += saleLineVarParam.Price; } else if(saleLineVarParam.PriceAs == PriceAs::ByItem) { priceUnit += saleLineVarParam.Price; } ttsBegin; this.LineAmount = saleLineAmount; this.PriceUnit = priceUnit; this.update(); ttsCommit; } }  | 
| 
	
 | 
| 
			
			 | 
		#2 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
X++: saleLineVarParam.SalesLineRef == this.RecId У вас смешалось два подхода. Конструкция while select никак не использует предыдущую выборку курсора. Всегда формируется новая выборка. Поэтому вам нужно использовать либо while без select . При этом передвигать курсор при помощи инструкции next: X++: select * from saleLineVarParam where saleLineVarParam.SalesLineRef == this.RecId; while (saleLineVarParam) { ... next saleLineVarParam; } X++: while select saleLineVarParam where saleLineVarParam.SalesLineRef == this.RecId { ... }  | 
| 
	
 | 
| 
			
			 | 
		#3 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 X++: while select saleLineVarParam where saleLineVarParam.SalesLineRef == this.RecId { if(saleLineVarParam.MinCharge == true) { saleLineAmount += saleLineVarParam.Charge; } else if(saleLineVarParam.PriceAs == PriceAs::Surcharge) { saleLineAmount += saleLineVarParam.Price; } else if(saleLineVarParam.PriceAs == PriceAs::ByItem) { priceUnit += saleLineVarParam.Price; } ttsBegin; this.LineAmount = saleLineAmount; this.PriceUnit = priceUnit; this.update(); ttsCommit; }  | 
| 
	
 | 
| 
			
			 | 
		#4 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Как предположение, this.update() внутри себя не вставляет ли новых строк в saleLineVarParam? 
		
		
		
		
		
		
		
	В качестве трассировки добавьте внутрь цикла X++: info(strfmt("%1", saleLineVarParam.RecId)); | 
| 
	
 | 
| 
			
			 | 
		#5 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
Автор, по условию точно 1 запись? в this есть данные? Может оно по пустоте ищет? Можете выше сделать запрос X++: select count(RecId) from saleLineVarParam where saleLineVarParam.SalesLineRef == this.RecId  | 
| 
	
 | 
| 
			
			 | 
		#6 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			А я и не говорил, что цикл зависает/вылетает на том месте. Я хотел указать на следующее. Если внутри цикла по таблице в эту же самую таблицу вставлять записи, удовлетворяющие условию цикла, то вполне себе возможно получить зацикливание.
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#7 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Я использовал метод doUpdate(), кажется все ок. Буду еще проверять позже.   
		
		
		
		
		
		
		
	Спасибо за помощь!  | 
| 
	
 |