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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 08.07.2011, 15:55   #1  
SHiSHok is offline
SHiSHok
Участник
Аватар для SHiSHok
Дети Юза
 
219 / 103 (4) +++++
Регистрация: 28.07.2005
Адрес: Донецк
queryRun метод get
DAX3 KR3: Обнаружил интересную особенность работы queryRun.

В документации,в примерах и в коде применяется следующая схема работы с QueryRun:

X++:
// инициализация QueryRun
while (queryRun.next())
{
    <. > = queryRun.get(...);
    // обработка значений <таб. переменной>
}
Но обнаружил, что табличной переменной достаточно присвоить значение (ссылку на запись) ОДИН раз (например после первого queryRun.next() ) и далее она будет ссылаться на актуальное значение запроса. Т.е. после очередного queryRun.next() табличная переменная содержит очередное значение выборки и queryRun.get выполнять не требуется.

в джобике продемонстрирован пример работы:
X++:
static void Job_QRGet_test(Args _args)
{

    query                   q;
    queryRun                qr;
    queryBuildDataSource    qbds;
    inventTable             it;
    inventTable             it1;
;

    q = new query();
    qbds = q.addDataSource(TableNum(inventTable));
    qbds.addSelectionField(fieldNum(inventTable,itemName));
    qbds.addRange(fieldNum(inventTable,itemId)).value("*");

    qr = new queryRun(q);

    if (qr.next())
    {
        it = qr.get(tableNum(inventTable));
        it1 = qr.get(tableNum(inventTable));

        do {
            info(it.itemName);
        } while (qr.next());
    }
}
Ваши замечания, дополнения...
__________________
--- SHiSHok
За это сообщение автора поблагодарили: Oz (1), Logger (3), gl00mie (2), S.Kuskov (3).
Старый 08.07.2011, 16:00   #2  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,732 / 406 (17) +++++++
Регистрация: 23.03.2006
так и есть, в 2009 тоже самое
Старый 08.07.2011, 16:00   #3  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Наверное должно работать даже если присвоение сделать до цикла. Нужно попробовать.

В принципе всё логично Common - это же класс, а значит в переменных этого типа хранятся не сами экземпляры, а ссылки.

X++:
InventTable InventTable1;
InventTable InventTable2;

InventTable2 = InventTable1;
InventTable1.ItemId = "!";
info(InventTable2.ItemId);

P.S.: В случае временных таблиц именно из-за этого и появился метод setTmpDate

Последний раз редактировалось S.Kuskov; 08.07.2011 в 16:04.
Старый 08.07.2011, 16:17   #4  
SHiSHok is offline
SHiSHok
Участник
Аватар для SHiSHok
Дети Юза
 
219 / 103 (4) +++++
Регистрация: 28.07.2005
Адрес: Донецк
Цитата:
Сообщение от ice Посмотреть сообщение
так и есть, в 2009 тоже самое
искал в доках - внятного описания так и не нашел

Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Наверное должно работать даже если присвоение сделать до цикла. Нужно попробовать.
пробовал - не получается. видимо первый next() выделяет память и определяет место хранения записи.
__________________
--- SHiSHok
Старый 08.07.2011, 16:20   #5  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от SHiSHok Посмотреть сообщение
пробовал - не получается. видимо первый next() выделяет память и определяет место хранения записи.
Видимо так, хотя что мешало сделать это заранее?
Старый 08.07.2011, 16:34   #6  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
А если до вызова next() вызвать что то типа
qr.setRecord(it)
или
qr.setCurrent(it)

( не помню уже какой из них есть у QueryRun-а )
За это сообщение автора поблагодарили: Oz (1), S.Kuskov (2).
Старый 08.07.2011, 16:46   #7  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Logger Посмотреть сообщение
А если до вызова next() вызвать что то типа
qr.setRecord(it)
или
qr.setCurrent(it)

( не помню уже какой из них есть у QueryRun-а )
Так оба и есть setCursor() vs setRecord()

Работает
X++:
    qr = new queryRun(q);
    qr.setRecord(it);
    if (qr.next())
    {
        info(it.itemName);
    }
Теги
get, query, queryrun

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Непонятное подвисание queryRun.next() GBH DAX: Программирование 7 15.11.2010 11:16
emeadaxsupport: How can the Web Proxies get extended programmatically? Blog bot DAX Blogs 0 16.12.2009 18:05
Простой QueryRun не работает miklenew DAX: Программирование 13 20.01.2009 14:17
OZKA's DAX Journal: Join между временной и постоянной таблицей через QueryRun. Blog bot DAX Blogs 12 14.01.2009 17:34
QueryRun обьекты ... Rimantas DAX: Программирование 5 04.01.2008 17:07

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 14:43.