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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.05.2018, 16:22   #1  
БАХ43 is offline
БАХ43
Участник
 
92 / 54 (2) ++++
Регистрация: 15.02.2013
Адрес: г.Москва, г. Зеленоград
UTCDateTime в query range value
DAX2009
Есть диалоговое окно с парой значений TransDateTime плюс сохраняемый query по некоторым полям таблички RFIDTrans. После нажатия ОК, вызывается метод updateQuery, который добавляет ранг по дате-времени. Все отрабатывает нормально. НО если перед ОК хоть раз нажать кнопку "Выбрать", для смены значений фильтров, то выборка по времени идет на 3 часа раньше (Московская временная зона).
X++:
protected void updateQuery()
{
    QueryBuildDataSource    qbdsRFID;
    QueryBuildRange         rangeTransDateTime;
    str                     dateTimeRange;
    ;
    qbdsRFID     = queryRun.query().dataSourceTable(tablenum(RFIDTrans));
    fromDateTime = DateTimeUtil::removeTimeZoneOffset(fromDateTime, tz);
    toDateTime   = DateTimeUtil::removeTimeZoneOffset(toDateTime, tz);
    
    rangeTransDateTime  = qbdsRFID.addRange(fieldnum(RFIDTrans, TransDateTime));
    dateTimeRange = SysQuery::range(fromDateTime, toDateTime);
    rangeTransDateTime.value(dateTimeRange);
при этом переменная dateTimeRange идентична в обоих случаях. Такое ощущение, rangeTransDateTime.value в разных случаях отрабатывает по разному.
Кто-нибудь сталкивался с подобным?
ЗЫ: Поковырялся в свойствах типа данных TransDateTime, нашел свойство TimezonePreference. Если его выставить в No Conversion, тогда запрос формируется корректно и после нажимания кнопки "Выбрать", но при этом в форме RFIDTrans время начинает отображаться по Гринвичу, что в общем-то правильно, но неудобно.
__________________
Я прибыл к вам из Кантемировской дивизии. А там, как известно, дураков не держат!
Старый 22.05.2018, 18:04   #2  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
1) точно ли нужен removetimezine offset
2) если сдампить queryRun.query.xml() до и после нажатия на кнопку - есть ли разница?
За это сообщение автора поблагодарили: Logger (1).
Старый 22.05.2018, 23:02   #3  
БАХ43 is offline
БАХ43
Участник
 
92 / 54 (2) ++++
Регистрация: 15.02.2013
Адрес: г.Москва, г. Зеленоград
xml отличается только версией. Version="24" или Version="23", вдругой раз получилась пара 25-26.
Все остальное идентично, в том числе и тэг <range Name="TransDateTime" Table="RFIDTrans" Field="TransDateTime" Value=""10.05.2018 18:00:00".."11.05.2018 06:00:00"" Label="" Status="Open" Enabled="Yes" />
Причем диапазон в обоих случаях правильный, по гринвичу с 18:00 до 6:00. В вот сам qbdsRFID в дебагере имеет диапазон (после нажатия "Выбрать") с 15:00 до 3:00:
NAME:
qbdsRFID
VALUE:
SELECT FIRSTFAST * FROM RFIDTrans WHERE ((TransState = 4 OR TransState = 2)) AND ((TagType = 19)) AND ((EpcObjectType = 30 OR EpcObjectType = 4)) AND ((RLProcessStage = 2 OR RLProcessStage = 0)) AND ((TransDateTime>='2018-05-10T15:00:00' AND TransDateTime<='2018-05-11T03:00:00')) JOIN FIRSTFAST * FROM InventDim WHERE RFIDTrans.InventDimId = InventDim.inventDimId AND ((InventLocationId = N'БСОХ'))
TYPE:
QueryBuildDataSource
__________________
Я прибыл к вам из Кантемировской дивизии. А там, как известно, дураков не держат!
Старый 22.05.2018, 23:09   #4  
БАХ43 is offline
БАХ43
Участник
 
92 / 54 (2) ++++
Регистрация: 15.02.2013
Адрес: г.Москва, г. Зеленоград
Цитата:
1) точно ли нужен removetimezine offset
Судя по логике как раз отрабатывает правильно после нажатия "Выбрать". Тогда removetimezine offset действительно не нужен. Такое ощущение, что ставили эту заплатку, на случай когда "Выбрать" не нажимается (это 90% случаев).
Отчет писал не я, досталось по наследству.
__________________
Я прибыл к вам из Кантемировской дивизии. А там, как известно, дураков не держат!
Старый 23.05.2018, 09:35   #5  
БАХ43 is offline
БАХ43
Участник
 
92 / 54 (2) ++++
Регистрация: 15.02.2013
Адрес: г.Москва, г. Зеленоград
Который раз убеждаюсь, что с проблемой надо переспать. Вчера полдня голову ломал, сегодня за 2 минуты разобрался. Этот код в обоих случаях работает одинаково:
X++:
    queryRun.query().removeTimeZoneOffset(true);
    qbdsRFID     = queryRun.query().dataSourceTable(tablenum(RFIDTrans));
    qbdsRFID.addRange(fieldnum(RFIDTrans, TransDateTime)).value(SysQuery::range(fromDateTime, toDateTime));
Или так, если кому-то нравится:
X++:
    queryRun.query().removeTimeZoneOffset(false);
    qbdsRFID     = queryRun.query().dataSourceTable(tablenum(RFIDTrans));
    fromDateTime = DateTimeUtil::removeTimeZoneOffset(fromDateTime, tz);
    toDateTime   = DateTimeUtil::removeTimeZoneOffset(toDateTime, tz);
    qbdsRFID.addRange(fieldnum(RFIDTrans, TransDateTime)).value(SysQuery::range(fromDateTime, toDateTime));
__________________
Я прибыл к вам из Кантемировской дивизии. А там, как известно, дураков не держат!
За это сообщение автора поблагодарили: belugin (15), Logger (5).
Теги
query, removetimezoneoffset, utcdatetime

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Ax 2012. Копирование Range из Query Sada DAX: Программирование 2 22.08.2013 10:10
ax-erp: How to Set the Query Range on a SSRS Report Blog bot DAX Blogs 0 18.10.2012 19:11
sumitax: AX Queries – Passing query range as parameter Blog bot DAX Blogs 0 29.06.2011 13:11
emeadaxsupport: Passing UtcDateTime values in extended query syntax Blog bot DAX Blogs 0 10.05.2010 21:05

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

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

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