|
09.11.2014, 15:30 | #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; } } |
|
09.11.2014, 15:59 | #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 { ... } |
|
09.11.2014, 16:14 | #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; } |
|
09.11.2014, 16:33 | #4 |
Участник
|
Как предположение, this.update() внутри себя не вставляет ли новых строк в saleLineVarParam?
В качестве трассировки добавьте внутрь цикла X++: info(strfmt("%1", saleLineVarParam.RecId)); |
|
10.11.2014, 00:02 | #5 |
Участник
|
Цитата:
Автор, по условию точно 1 запись? в this есть данные? Может оно по пустоте ищет? Можете выше сделать запрос X++: select count(RecId) from saleLineVarParam where saleLineVarParam.SalesLineRef == this.RecId |
|
10.11.2014, 07:28 | #6 |
Участник
|
А я и не говорил, что цикл зависает/вылетает на том месте. Я хотел указать на следующее. Если внутри цикла по таблице в эту же самую таблицу вставлять записи, удовлетворяющие условию цикла, то вполне себе возможно получить зацикливание.
|
|
10.11.2014, 12:13 | #7 |
Участник
|
Я использовал метод doUpdate(), кажется все ок. Буду еще проверять позже.
Спасибо за помощь! |
|