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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.02.2010, 11:29   #1  
nix0root is offline
nix0root
Участник
 
67 / 16 (1) ++
Регистрация: 17.03.2009
Адрес: МО
Дата и время в Axapta
Возможно кому-нибудь пригодится данная конструкция.

Стояла следующая проблема:

Т.к. Axapta не умеет хранить в одном поле дату и время (например 11.11.2009 22:02:33), принято хранить эту информацию в двух отдельных полях (типы полей Date и Int). Это затрудняет поиск данных по периоду.

Я решил данную проблему следующим образом (пример для Oracle):

TO_DATE(TO_CHAR(T.DATE + (T.TIME/86400), 'DD.MM.YYYY HH24:MI:SS'), 'DD.MM.YYYY HH24:MI:SS') BETWEEN
TO_DATE(TO_CHAR(TO_DATE('01.01.2010', 'DD.MM.YYYY') + (60692/86400), 'DD.MM.YYYY HH24:MI:SS'), 'DD.MM.YYYY HH24:MI:SS') AND
TO_DATE(TO_CHAR(TO_DATE('22.02.2010', 'DD.MM.YYYY') + (43200/86400), 'DD.MM.YYYY HH24:MI:SS'), 'DD.MM.YYYY HH24:MI:SS')
Старый 11.02.2010, 11:58   #2  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от nix0root Посмотреть сообщение
Т.к. Axapta не умеет хранить в одном поле дату и время (например 11.11.2009 22:02:33), принято хранить эту информацию в двух отдельных полях (типы полей Date и Int). Это затрудняет поиск данных по периоду.
offtop:
Это справедливо только для более старых версий АХ, до появления типа utcDateTime
Старый 11.02.2010, 12:10   #3  
nix0root is offline
nix0root
Участник
 
67 / 16 (1) ++
Регистрация: 17.03.2009
Адрес: МО
Работаю на 4-ке, данного типа данных utcDateTime у меня нет
Старый 11.02.2010, 12:17   #4  
Maximin is offline
Maximin
NavAx
NavAx Club
 
412 / 346 (12) ++++++
Регистрация: 09.10.2002
Адрес: Москва
Есть.
К примеру, таблица SysClientSessions.
Поле Login_date там именно такого типа, хотя нигде увидеть это из Аксапты невозможно - только из SQL Studio. Т.е. там не только дата входа хранится, но и время заодно, ибо SQL тип - DateTime.
Из-за этого, кстати, запросы типа select clientSessions where clientSessions.Login_date < systemdateget()) могут возвращать немного не то, что хотелось бы.
И в Global:: есть функция для работы с такими convertUTCDateToLocalDate, а вот обратной, кстати, нет, что приводит к проблемам с такими запросами.
Если интересно - можно еще посмотреть по ссылкам, где эта функция используется.
Но вот самому такое поле, думаю, заполнить не выйдет - это поле заполняется самим ядром.
__________________
Жизнь прекрасна! Если, конечно, правильно подобрать антидепрессанты...

Последний раз редактировалось Maximin; 11.02.2010 в 12:20.
Старый 11.02.2010, 12:19   #5  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от nix0root Посмотреть сообщение
Работаю на 4-ке, данного типа данных utcDateTime у меня нет
Это потому что АХ 4 - старая версия
Данный тип был добавлен в АХ 2009
Старый 11.02.2010, 12:25   #6  
nix0root is offline
nix0root
Участник
 
67 / 16 (1) ++
Регистрация: 17.03.2009
Адрес: МО
В AX 2009 как я понимаю данный тип поля уже является стандартным? Т.е. его можно применить для редактирования т.п.
http://www.axaptapedia.com/UtcDateTime
Старый 12.02.2010, 11:16   #7  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от nix0root Посмотреть сообщение
В AX 2009 как я понимаю данный тип поля уже является стандартным? Т.е. его можно применить для редактирования т.п.
http://www.axaptapedia.com/UtcDateTime
Да, тип стандартный. Более того, в большинстве таблиц, где присутствовали время и дата, была произведена замена на новый тип.
Старый 12.02.2010, 14:51   #8  
nix0root is offline
nix0root
Участник
 
67 / 16 (1) ++
Регистрация: 17.03.2009
Адрес: МО
Жаль что этот тип не откроют в полный доступ в 4-ке, на 2009 мы врятли будем переходить. Поэтому буду юзать прямые запросы к бд с TO_CHAR и TO_DATE
Старый 12.02.2010, 15:15   #9  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Цитата:
Сообщение от nix0root Посмотреть сообщение
Жаль что этот тип не откроют в полный доступ в 4-ке, на 2009 мы врятли будем переходить. Поэтому буду юзать прямые запросы к бд с TO_CHAR и TO_DATE
Если не секрет, почему врядли переходить будете?
__________________
Ivanhoe as is..
Старый 12.02.2010, 15:23   #10  
nix0root is offline
nix0root
Участник
 
67 / 16 (1) ++
Регистрация: 17.03.2009
Адрес: МО
Во первых это дорого нам встанет.
Во вторых долго.
В третьих ловить ошибки потом в теч длительного времени , тк у нас много своих наработок.
Ну и самое главное у нас ORACLE )))) а на сколько я знаю 2009 уже никак не поддерживает ORA.

Собственно вот почему мы не будем переходить на 2009
Старый 12.02.2010, 15:27   #11  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
2009 поддерживает ORACLE http://www.microsoft.com/dynamics/en...ents-2009.aspx
За это сообщение автора поблагодарили: nix0root (1).
Старый 12.02.2010, 15:28   #12  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,437 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от nix0root Посмотреть сообщение
буду юзать прямые запросы к бд
Извините конечно, но я так и непонял, что такого делает этот прямой запрос, что нельзя сделать средствами аксапты?
Вы же вот это хотели получить? Или я что-то не понимаю?
Код:
((T.Date > fromDate) || ((T.Date == fromDate) && (T.Time >= fromTime))) &&
((T.Date < toDate) || ((T.Date == toDate) && (T.Time <= toTime)))

У меня, напротив, встречный вопрос. Учитывая, что
Цитата:
Сообщение от kashperuk Посмотреть сообщение
в большинстве таблиц, где присутствовали время и дата, была произведена замена на новый тип.
Как теперь будут выглядеть запросы, в котроых ограничено должно быть только время, но не число?
За это сообщение автора поблагодарили: belugin (1), Gustav (2).
Старый 12.02.2010, 15:36   #13  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Извините конечно, но я так и непонял, что такого делает этот прямой запрос, что нельзя сделать средствами аксапты?
Вы же вот это хотели получить? Или я что-то не понимаю?
Код:
((T.Date > fromDate) || ((T.Date == fromDate) && (T.Time >= fromTime))) &&
((T.Date < toDate) || ((T.Date == toDate) && (T.Time <= toTime)))
Аксаптовскими средствами можно решить все, просто с большими трудозатратами
Например, есть таблицы:
Table1 с полями: FromDate, FromTime, ToDate, ToTime
Table2 с полями: FromDate, FromTime, ToDate, ToTime
известно значение Table2, нужно проверить есть ли пересекающиеся во времени строчки в Table1...

вот такой случай решается в аксапте геморойно
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
За это сообщение автора поблагодарили: nix0root (1).
Старый 12.02.2010, 15:47   #14  
nix0root is offline
nix0root
Участник
 
67 / 16 (1) ++
Регистрация: 17.03.2009
Адрес: МО
Ну даже с учетом поддержки 2009-й OR-ы, стоимость и время все равно остаются критичными
Старый 12.02.2010, 15:52   #15  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Про переход и затраты понятно, но вот про возможности.. Пока из своего опыта 2009 намного стабильнее, полноценные 64 бита и т.п., в части функциональности много нового и интересного, в т.ч. локализаторы стараются.

В т.ч. дата и время не просто новый тип, он активно участвует в расчетах сроков поставки и проч., есть настройки часовых поясов пользователя.
__________________
Ivanhoe as is..
Старый 12.02.2010, 15:57   #16  
nix0root is offline
nix0root
Участник
 
67 / 16 (1) ++
Регистрация: 17.03.2009
Адрес: МО
А с какой базой вы работаете если не секрет, и чем пользуетесь для отчетов?
Старый 12.02.2010, 17:01   #17  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,437 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от lev Посмотреть сообщение
Аксаптовскими средствами можно решить все, просто с бОльшими трудозатратами
А неужели преоброзование типов работает быстрее пары лишних сравнений?

Цитата:
Сообщение от lev Посмотреть сообщение
Например, есть таблицы:
Table1 с полями: FromDate, FromTime, ToDate, ToTime
Table2 с полями: FromDate, FromTime, ToDate, ToTime
известно значение Table2, нужно проверить есть ли пересекающиеся во времени строчки в Table1...
вот такой случай решается в аксапте геморойно
Вообще эта задача ничуть не сложнее предыдущей. В том смысле, что для её решения нужно то же число сравнений.
X++:
((T1.fromDate < T2.toDate) || ((T1.fromDate == T2.toDate) && (T1.fromTime <= T2.toTime))) &&
((T1.toDate > T2.fromDate) || ((T1.toDate == T2.fromDate) && (T1.toTime >= T2.fromTime)))

P.S.: Накатал тут на коленке пару макросов для работы с датами и временем. Может кому пригодится.
X++:
#localmacro.lessOrEq
    /* (%1) - Date_1 */
    /* (%2) - Time_1 */
    /* (%3) - Date_2 */
    /* (%4) - Time_2 */
    ( ((%1) < (%3)) || ( ((%1) == (%3)) && ((%2) < (%4)) ) )
#endmacro

#localmacro.greatOrEq
    /*(%1) - Date_1 */
    /*(%2) - Time_1 */
    /*(%3) - Date_2 */
    /*(%4) - Time_2 */
    ( ((%1) > (%3)) || ( ((%1) == (%3)) && ((%2) > (%4)) ) )
#endmacro

#localmacro.dt
    /* (%1) - Date */
    /* (%2) - Time */
    %1, %2
#endmacro

#localmacro.between
    /* (%1) - DateFrom */
    /* (%2) - TimeFrom */
    /* (%3) - DateTo   */
    /* (%4) - TimeTo   */
    /* (%5) - Date     */
    /* (%6) - Time     */
    (#greatOrEq(#dt(%5, %6), #dt(%1, %2)) && #lessOrEq(#dt(%5, %6), #dt(%3, %4)))
#endmacro

#localmacro.cross
    /* (%1) - DateFrom_1 */
    /* (%2) - TimeFrom_1 */
    /* (%3) - DateTo_1   */
    /* (%4) - TimeTo_1   */
    /* (%5) - DateFrom_2 */
    /* (%6) - TimeFrom_2 */
    /* (%7) - DateTo_2   */
    /* (%8) - TimeTo_2   */
    (#lessOrEq(#dt(%1, %2), #dt(%7, %8)) && #greatOrEq(#dt(%3, %4), #dt(%5, %6)))
#endmacro
За это сообщение автора поблагодарили: nix0root (1).
Старый 12.02.2010, 18:19   #18  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
А неужели преоброзование типов работает быстрее пары лишних сравнений?



Вообще эта задача ничуть не сложнее предыдущей. В том смысле, что для её решения нужно то же число сравнений.
X++:
((T1.fromDate < T2.toDate) || ((T1.fromDate == T2.toDate) && (T1.fromTime <= T2.toTime))) &&
((T1.toDate > T2.fromDate) || ((T1.toDate == T2.fromDate) && (T1.toTime >= T2.fromTime)))
Я не говорил что это не возможно, я сказал что это гемор
согласитесть, что вот так, было бы более прозрачно и понятно:
X++:
if (T1.FromDateTime <= T2.ToDateTime && T1.ToDateTime >= T2.FromDateTime)
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 12.02.2010, 18:30   #19  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,437 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от lev Посмотреть сообщение
согласитесть, что вот так, было бы более прозрачно и понятно:
X++:
if (T1.FromDateTime <= T2.ToDateTime && T1.ToDateTime >= T2.FromDateTime)
Согласен. Про это нет и речи. Я, всего лишь, против прямого SQL там, где это не нужно

P.S.: А на мой вопрос (Дата и время в Axapta) есть у кого-нибудь ответ?
Старый 13.02.2010, 02:42   #20  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Согласен. Про это нет и речи. Я, всего лишь, против прямого SQL там, где это не нужно

P.S.: А на мой вопрос (Дата и время в Axapta) есть у кого-нибудь ответ?
Короткий ответ: Там, помнится, были какие-то ньюансы (читай - проблемы).
Более развернутый ответ: Не помню, надо искать пример и разбираться. Может как-то на досуге...
Теги
ax2009, ax4.0, utcdatetime, время, дата

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
axaptabuilder: How to build Axapta application from XPO files stored in Visual Source Safe. Blog bot DAX Blogs 0 22.11.2006 15:20
Говорят вышел SP2 для Axapta 3. Кто нибуть что знает на эту тему? soin DAX: Прочие вопросы 10 13.10.2003 10:43
Введение в Аксапту Роман Кошелев DAX: Прочие вопросы 0 18.12.2001 14:00

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

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

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