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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 10.06.2013, 12:17   #1  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Я не утверждал, что Query/QueryRun может генерить SQL-операторы update вместо select'а, однако, в Аксапте при обновлении записей в цикле (без использования update_recordset) принято в этом цикле выбирать записи на обновление (по аналогии с while select forupdate). Можно, конечно, в цикле их выбирать без указания, что они будут обновляться (по аналогии с while select), и потом либо перевыбирать на обновление, либо отрубать проверку, что запись была выбрана на обновление, но в общем случае надо понимать, зачем делать именно так, вместо того чтобы изначально просто выбирать записи на обновление и не усложнять код.А класс запускается изначально где, на сервере или на клиенте? И где он собственно использует запрос для выборки данных, на сервере или на клиенте? Если на сервере, то учитывают ли pack/unpack, что надо паковать запрос? Потому что без этого изменения, внесенные в критерии фильтрации запроса на клиенте, при возврате управления на сервер будут утеряны.
То есть, правильнее будет сделать update через query, а не обычным способом? То есть, должно быть какое-то условие обновления и если это условие выполняется - qbds.update(true) ? Никогда не применял раньше подобную констркцию и не сталкивался с динамическими фильтрами в принципе, посему и пишу здесь


В свойстве Run On стоит Called From.
В методе пакую запрос посредством
X++:
  return [#CurrentVersion,#CurrentList, queryrun.query().pack()];
и в unpack
X++:
 switch (version)
    {
        case #CurrentVersion:
            [version,#CurrentList] = packedClass;
           if (SysQuery::isPackedOk(queryCon))
                queryRun = new QueryRun(queryCon);
            else
                this.initQuery();
            break;
        default:
            return false;
    }
Старый 10.06.2013, 12:33   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,449 / 1792 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от user_ax Посмотреть сообщение
В методе пакую запрос посредством
X++:
  return [#CurrentVersion,#CurrentList, queryrun.query().pack()];
и в unpack
X++:
 switch (version)
    {
        case #CurrentVersion:
            [version,#CurrentList] = packedClass;
           if (SysQuery::isPackedOk(queryCon))
                queryRun = new QueryRun(queryCon);
            else
                this.initQuery();
            break;
        default:
            return false;
    }
я вижу что вы пакуете запрос, но не вижу где вы распаковываете его в переменную queryCon...

Код:
[version,#CurrentList, queryCon] = packedClass;
За это сообщение автора поблагодарили: gl00mie (1).
Старый 10.06.2013, 12:38   #3  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
я вижу что вы пакуете запрос, но не вижу где вы распаковываете его в переменную queryCon...

Код:
[version,#CurrentList, queryCon] = packedClass;
Видимо недоизменял...Добавил переменную, изменил значения макроса, попробовал - тот же результат.
Может быть действительно дело в том, где запускается класс?
Старый 10.06.2013, 12:38   #4  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5813 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от user_ax Посмотреть сообщение
В свойстве Run On стоит Called From.
Вопрос был не об этом, а о том, где запускается класс. Если на самом классе стоит Called from, то надо смотреть свойства пункта меню, которым он запускается. В конце концов, можно в main поставить точку останова и посмотреть в отладчике.
Цитата:
Сообщение от user_ax Посмотреть сообщение
В методе пакую запрос посредством
X++:
  return [#CurrentVersion,#CurrentList, queryrun.query().pack()];
и в unpack
X++:
 switch (version)
    {
        case #CurrentVersion:
            [version,#CurrentList] = packedClass;
           if (SysQuery::isPackedOk(queryCon))
                queryRun = new QueryRun(queryCon);
            else
                this.initQuery();
            break;
        default:
            return false;
    }
Тут непонятно, что есть queryCon и каким образом оно получается из packedClass. Кроме того, подозрение вызывает несоответствие количества пакуемых и распаковываемых элементов в pack/unpack:
X++:
[#CurrentVersion,#CurrentList, queryrun.query().pack()]
[version,#CurrentList] = packedClass;
Тут видно, что запакованный queryrun при распаковке теряется. По-хорошему распаковка при таком pack() должна выглядеть так:
X++:
[version,#CurrentList, queryCon] = packedClass;
где queryCon должна быть локальной переменной типа container (или, для наглядности, типа PackedQueryRun) в методе unpack().
Старый 10.06.2013, 12:46   #5  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Вопрос был не об этом, а о том, где запускается класс. Если на самом классе стоит Called from, то надо смотреть свойства пункта меню, которым он запускается. В конце концов, можно в main поставить точку останова и посмотреть в отладчике.Тут непонятно, что есть queryCon и каким образом оно получается из packedClass. Кроме того, подозрение вызывает несоответствие количества пакуемых и распаковываемых элементов в pack/unpack:
X++:
[#CurrentVersion,#CurrentList, queryrun.query().pack()]
[version,#CurrentList] = packedClass;
Тут видно, что запакованный queryrun при распаковке теряется. По-хорошему распаковка при таком pack() должна выглядеть так:
X++:
[version,#CurrentList, queryCon] = packedClass;
где queryCon должна быть локальной переменной типа container (или, для наглядности, типа PackedQueryRun) в методе unpack().
В пункте меню, который запускает класс, стоит запуск на Клиенте.
querycon - контейнер, в который пакуется содержимое запроса, насколько я понял...

По поводу несоответствия кол-ва переменных - поправил уже, недоглядел.
Теги
runbasereport, диалог, динамическая форма, периодическая операция, программно

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Универсальный изменятель значений полей wojzeh DAX: Программирование 17 26.09.2013 17:47
Последовательная замена множества уникальных значений на другие без возникновения дубликатов gl00mie DAX: Программирование 23 24.11.2010 15:05
Периодическая операция Приемка. Ошибка в спецификации. Объясните RSJustInTime DAX: Функционал 6 02.02.2006 14:02
Сводное планирование - изменения&изменения мин. Alexm DAX: Прочие вопросы 1 05.04.2005 10:43
Русская локализация Axapta 3 ? SlavaK DAX: Администрирование 59 01.07.2003 22:38
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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