AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 09.11.2014, 15:30   #1  
MaxHammer is offline
MaxHammer
Участник
 
60 / 11 (1) +
Регистрация: 03.10.2012
Не выходит из цикла 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;
    }

}
Не могу выйти из цикла while select salesLineVarParam. В таблице SalesLineVariableParms проверял есть только одна запись удовлетврояющая моему условию. В чем конкретно ошибка? Заранее спасибо за ответ.
Старый 09.11.2014, 15:59   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от MaxHammer Посмотреть сообщение
В таблице SalesLineVariableParms проверял есть только одна запись удовлетврояющая моему условию.
Какому условию? Этому?
X++:
saleLineVarParam.SalesLineRef == this.RecId

У вас смешалось два подхода.
Конструкция while select никак не использует предыдущую выборку курсора. Всегда формируется новая выборка. Поэтому вам нужно использовать
либо while без select . При этом передвигать курсор при помощи инструкции next:
X++:
select * from saleLineVarParam
where saleLineVarParam.SalesLineRef == this.RecId;

while (saleLineVarParam)
{
    ...
    next saleLineVarParam;
}
либо while select в комбинации c where без предварительного select:
X++:
while select saleLineVarParam
where saleLineVarParam.SalesLineRef == this.RecId
{
    ...
}
Второй вариант более предпочтителен.
Старый 09.11.2014, 16:14   #3  
MaxHammer is offline
MaxHammer
Участник
 
60 / 11 (1) +
Регистрация: 03.10.2012
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;
    }
доходит до конца цикла и снова возвращается в начало while.
Старый 09.11.2014, 16:33   #4  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Как предположение, this.update() внутри себя не вставляет ли новых строк в saleLineVarParam?

В качестве трассировки добавьте внутрь цикла
X++:
info(strfmt("%1", saleLineVarParam.RecId));
Старый 10.11.2014, 00:02   #5  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Как предположение, this.update() внутри себя не вставляет ли новых строк в saleLineVarParam?
Так ведь ttsbegin\ttscommit внутри цикла, значит транзакция совершается успешно.

Автор, по условию точно 1 запись? в this есть данные? Может оно по пустоте ищет?
Можете выше сделать запрос

X++:
select count(RecId) from saleLineVarParam
        where saleLineVarParam.SalesLineRef == this.RecId
чтобы посмотреть, сколько действительно есть записей по данному фильтру.
Старый 10.11.2014, 07:28   #6  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от user_ax Посмотреть сообщение
Так ведь ttsbegin\ttscommit внутри цикла, значит транзакция совершается успешно.
А я и не говорил, что цикл зависает/вылетает на том месте. Я хотел указать на следующее. Если внутри цикла по таблице в эту же самую таблицу вставлять записи, удовлетворяющие условию цикла, то вполне себе возможно получить зацикливание.
Старый 10.11.2014, 12:13   #7  
MaxHammer is offline
MaxHammer
Участник
 
60 / 11 (1) +
Регистрация: 03.10.2012
Я использовал метод doUpdate(), кажется все ок. Буду еще проверять позже.

Спасибо за помощь!
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
emeadaxsupport: AX Content: Select invoices to pay Blog bot DAX Blogs 0 23.10.2013 02:11
atinkerersnotebook: Using Service Management to Track Service Orders Blog bot DAX Blogs 1 25.08.2013 19:16
dynamicsaxtraining: Select statement patterns Blog bot DAX Blogs 10 20.08.2010 14:01
Разница NotInTTS и Found Logger DAX: База знаний и проекты 6 18.09.2008 12:35
Вопрос про Demand Planner slava09 DAX: Функционал 4 25.09.2006 11:43
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 00:11.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.