22.05.2018, 16:22 | #1 |
Участник
|
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); Кто-нибудь сталкивался с подобным? ЗЫ: Поковырялся в свойствах типа данных TransDateTime, нашел свойство TimezonePreference. Если его выставить в No Conversion, тогда запрос формируется корректно и после нажимания кнопки "Выбрать", но при этом в форме RFIDTrans время начинает отображаться по Гринвичу, что в общем-то правильно, но неудобно.
__________________
Я прибыл к вам из Кантемировской дивизии. А там, как известно, дураков не держат! |
|
22.05.2018, 18:04 | #2 |
Участник
|
1) точно ли нужен removetimezine offset
2) если сдампить queryRun.query.xml() до и после нажатия на кнопку - есть ли разница? |
|
|
За это сообщение автора поблагодарили: Logger (1). |
22.05.2018, 23:02 | #3 |
Участник
|
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 |
Участник
|
Цитата:
1) точно ли нужен removetimezine offset
Отчет писал не я, досталось по наследству.
__________________
Я прибыл к вам из Кантемировской дивизии. А там, как известно, дураков не держат! |
|
23.05.2018, 09:35 | #5 |
Участник
|
Который раз убеждаюсь, что с проблемой надо переспать. Вчера полдня голову ломал, сегодня за 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). |