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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 13.10.2008, 17:08   #1  
DreamCreator is offline
DreamCreator
Moderator
Аватар для DreamCreator
Axapta Retail User
 
553 / 45 (3) +++
Регистрация: 04.11.2004
Адрес: Казань
Некоректная распаковка запроса
Добрый день!
Хотелось бы разобраться в интересной ситуации:
Я написал тестовый класс (TestPacket) для выгрузки номеклатуры, класс потомок RunBaseBatch, использует Query для динамического выбора даты модификации.

Query создан в AOT (TestQuery) и имеет метод init в котором по умолчанию всегда для inventTable.ModifiedDate проставляется фиксированный период.

Класс прекрасно работает в обычном режиме, но в пакетном дает сбой - все параметры хорошо пакуются и распаковываются, а потом непонятно где вызывается метод init TestQuery и заданный пользователем период перетирается тем который по умолчанию задан в query.

Стало интересно - в какой момент перетирается распакованный query.
Запустить и посмотреть достаточно просто, объекты автономные, главное чтобы на InventTable был включен modifiedDate.

Можно поставить точки останова в местах отмеченных "// for debagger" и смотреть значение qbds - период должнен оставаться тот который задан пользователем.

Спасибо!

Upd: Поправил класс, была описка с названием таблицы.
Вложения
Тип файла: xpo drcSet427_13102008_TestUnPackQuery (1).xpo (7.5 Кб, 404 просмотров)

Последний раз редактировалось DreamCreator; 13.10.2008 в 17:30.
Старый 13.10.2008, 18:49   #2  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
При упаковке Query сохраняется информация об объекте AOT, на основе которого он был создан.
Когда происходит вызов new QueryRun(Query), для Query вызывается метод Init(), который перетирает ранее восстановленный из контейнера range.
Варианта решения два - в Init() проверять range и инициализировать только если value() пустой.
Либо, не пересоздвать QueryRun, а заменять в нем Query
X++:
if(this.isInBatch())
    queryRun.query(unPackedQuery);
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: kashperuk (3), DreamCreator (2).
Старый 13.10.2008, 19:03   #3  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Не знаю мож не из этой оперы и не пригодиться, но навсякий случай напишу.
Как то создавал класс. На входе baseEnum. Потом диалог, потом run.
Так вот если запускаю в режиме клиента всё ок. Если в режиме server, BaseEnum в какой-то момент обнуляется.
Исправил так. Перед if(класс.promt()) вызываю класс.SaveLast().
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.
За это сообщение автора поблагодарили: DreamCreator (2).
Старый 13.10.2008, 22:08   #4  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Настройка - параметры - использование данных - сбросить - уверен - все пучком.

Было неднократно.

С Уважением,
Георгий
За это сообщение автора поблагодарили: DreamCreator (2).
Старый 14.10.2008, 09:31   #5  
DreamCreator is offline
DreamCreator
Moderator
Аватар для DreamCreator
Axapta Retail User
 
553 / 45 (3) +++
Регистрация: 04.11.2004
Адрес: Казань
Спасибо, все получилось!
Цитата:
Сообщение от AndyD Посмотреть сообщение
При упаковке Query сохраняется информация об объекте AOT, на основе которого он был создан.
Когда происходит вызов new QueryRun(Query), для Query вызывается метод Init(), который перетирает ранее восстановленный из контейнера range.
Я тоже подозревал init()

Цитата:
Сообщение от AndyD Посмотреть сообщение
Варианта решения два - в Init() проверять range и инициализировать только если value() пустой.
Не пройдет - т.к. range не пустой для ежедневной пакетной выгрузки и скорее всего пользователь,если сам запустит,
тоже не оставит его пустым, а если оставит, то специально.

Цитата:
Сообщение от AndyD Посмотреть сообщение
Либо, не пересоздвать QueryRun, а заменять в нем Query
X++:
if(this.isInBatch())
    queryRun.query(unPackedQuery);
Спасибо, сработало!! А решение было так близко!

Цитата:
Сообщение от miklenew Посмотреть сообщение
Перед if(класс.promt()) вызываю класс.SaveLast().
Спасибо! Для enun-ов буду иметь в виду!

Цитата:
Сообщение от George Nordic Посмотреть сообщение
Настройка - параметры - использование данных - сбросить - уверен - все пучком.
Я сначала тоже на кэш думал Оказывается query как объект AOT ведет себя особенно!
Старый 14.10.2008, 09:51   #6  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от DreamCreator Посмотреть сообщение
Не пройдет - т.к. range не пустой для ежедневной пакетной выгрузки и скорее всего пользователь,если сам запустит,
тоже не оставит его пустым, а если оставит, то специально.
Хм.
А если так проверять?
X++:
if(qbr && !qbr.value())
    qbr.value(SysQuery::range(systemDateGet() - 2 , systemDateGet()));
И вообще, не понятно, зачем вообще его инициализировать в Query.
В RunBase для этого есть метод InitParmDefault(), который вызывается только при отсутствии упакованных данных.
__________________
Axapta v.3.0 sp5 kr2
Старый 14.10.2008, 10:16   #7  
DreamCreator is offline
DreamCreator
Moderator
Аватар для DreamCreator
Axapta Retail User
 
553 / 45 (3) +++
Регистрация: 04.11.2004
Адрес: Казань
Цитата:
Сообщение от AndyD Посмотреть сообщение
Хм.
А если так проверять?
X++:
if(qbr && !qbr.value())
    qbr.value(SysQuery::range(systemDateGet() - 2 , systemDateGet()));
И вообще, не понятно, зачем вообще его инициализировать в Query.
В RunBase для этого есть метод InitParmDefault(), который вызывается только при отсутствии упакованных данных.
Для рабочей задачи была цель один раз запустить пакет который бы исполнялся каждый вечер и делал выборку за период
[текущая дата - 2, текущая дата] - для этого подходило решение с инициализацией параметров Query в init пока не обратили
внимание не некорректную работу в пакетном режиме при задании иных пользовательских параметров.

Понятно что можно было налету в методе run подставлять нужный период, но хотелось сделать все явно и компактно - в одном объекте query.

Сейчас думаю разбить логику пакетной обработки на ежедневную (с фиксированным периодом) и особую, при которой пользователь сам вводит нужные ему
параметры.

InitParmDefault - попробовал, буду использовать!
Теги
ax3.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Изменить план выполнения запроса Sequel DAX: Администрирование 2 29.05.2008 15:46
Быстродействие запроса Antonuch DAX: Программирование 1 25.01.2008 15:58
Оптимизация запроса oleg_e DAX: Программирование 16 11.01.2008 10:22
Теория: Создание отчета в виде Запроса Arahnid DAX: Программирование 6 14.11.2007 16:37
Ускорение выполнения запроса Oracle + MS Axapta Горбунов Дмитрий DAX: Программирование 17 15.11.2005 18:13

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

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

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