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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 05.12.2008, 17:48   #1  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
-> Изменение "курсора" в цикле
Всем привет.

Вероятно, конечно, баян, но я не нашёл...
Интуитивно так обычно не делал, но вот недавно наткнулся - решил поделиться.

Если внутри цикла 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
Старый 05.12.2008, 17:58   #2  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Особенно актуально это, наверное, с частоиспользуемыми конструкциями InventDim::findOrCreate()...
__________________
Zhirenkov Vitaly
Старый 05.12.2008, 19:52   #3  
DAX is offline
DAX
Участник
 
28 / 18 (1) ++
Регистрация: 03.12.2008
ну изначально цикл содержит 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;   
}
этот код должен(не проверял) вернуть более ожидаемый вариант - 1 запись

Последний раз редактировалось DAX; 05.12.2008 в 19:54.
Старый 05.12.2008, 20:53   #4  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Так да, будет только одна запись выбираться.
Но это то и понятно...

Речь не о том, как это обойти, можно вообще-то и переменную другую завести.
Просто может кто не в курсе, чтоб не наступали на грабли.
__________________
Zhirenkov Vitaly
Старый 08.12.2008, 10:31   #5  
Lazy_Tiger is offline
Lazy_Tiger
NavAx
Axapta Retail User
1C
NavAx Club
 
610 / 31 (3) +++
Регистрация: 17.12.2001
Адрес: Красноярск
только мне этот "баг" кажется очевидным?
__________________
И все они создания природы...
Старый 09.12.2008, 04:52   #6  
Perc is offline
Perc
Участник
 
193 / 47 (2) +++
Регистрация: 05.03.2005
Цитата:
Сообщение от Lazy_Tiger Посмотреть сообщение
только мне этот "баг" кажется очевидным?
Если бы второй цикл прошел 1 раз или зациклился я бы подумал, что это очевидно. А так...
Если возможно, растолкуйте особенности реализации while select в аксе?
Старый 09.12.2008, 11:04   #7  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1235 (44) ++++++++
Регистрация: 11.04.2008
Я вообще прикола не понял... Вы меняете значение курсорв, на основе которой система строит цикл. Зачем его трогать, и зачем потом ломать голову "почему происходит так, а не по-моему"? если угодно, можно создать дополнительную табл. переменную и пользовать её...
За это сообщение автора поблагодарили: Lemming (1).
Старый 09.12.2008, 11:07   #8  
Corsar is offline
Corsar
Участник
 
15 / 12 (1) ++
Регистрация: 23.10.2008
Цитата:
Сообщение от Perc Посмотреть сообщение
Если бы второй цикл прошел 1 раз или зациклился я бы подумал, что это очевидно. А так...
Если возможно, растолкуйте особенности реализации while select в аксе?
А почему он должен выполняться один раз или зацикливаться? Я так понимаю, WHILE SELECT работает следующим образом - сам SELECT выполняется один единственный раз , а потом с помощью WHILE осуществляется навигация по выбранным записям этого SELECT'a (при этом сама выборка в цикле уже не перестраивается)
Старый 09.12.2008, 15:11   #9  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от Lazy_Tiger Посмотреть сообщение
только мне этот "баг" кажется очевидным?
Вот уж не думал, что такая дискуссия разгорится.
На самом деле Аксапта то может и более-менее логично себя ведёт, если подумать. Я её за это и не упрекаю и багом происходящее не называл.

Я хотел сказать, что если об этом не знаешь или не думаешь, то "Найти такой баг в коде наверное не всегда может быть просто и очевидно..". Имелось ввиду баг в своём коде.
__________________
Zhirenkov Vitaly
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Программное изменение "Счет на" в заказе Antant DAX: Программирование 12 02.02.2009 10:49
ALEG: Можно ли из "клиентского" решения сделать "тиражное" Blog bot DAX Blogs 0 16.11.2006 23:40
"Сопоставление фактур с оплатами" и "Сопоставление открытых проводок" chel DAX: Функционал 2 16.09.2004 12:03
Журнал переноса->Строки->Поле "Количество" . Нужен "0" по умолчанию вместо ATimTim DAX: Функционал 5 26.06.2004 12:17
"LIKE" и "OR" в "qbds" @x DAX: Программирование 14 20.01.2004 13:20

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

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

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