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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.02.2010, 12:25   #1  
nix0root is offline
nix0root
Участник
 
67 / 16 (1) ++
Регистрация: 17.03.2009
Адрес: МО
В AX 2009 как я понимаю данный тип поля уже является стандартным? Т.е. его можно применить для редактирования т.п.
http://www.axaptapedia.com/UtcDateTime
Старый 12.02.2010, 11:16   #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 Посмотреть сообщение
В AX 2009 как я понимаю данный тип поля уже является стандартным? Т.е. его можно применить для редактирования т.п.
http://www.axaptapedia.com/UtcDateTime
Да, тип стандартный. Более того, в большинстве таблиц, где присутствовали время и дата, была произведена замена на новый тип.
Старый 12.02.2010, 14:51   #3  
nix0root is offline
nix0root
Участник
 
67 / 16 (1) ++
Регистрация: 17.03.2009
Адрес: МО
Жаль что этот тип не откроют в полный доступ в 4-ке, на 2009 мы врятли будем переходить. Поэтому буду юзать прямые запросы к бд с TO_CHAR и TO_DATE
Старый 12.02.2010, 15:15   #4  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2161 (81) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Цитата:
Сообщение от nix0root Посмотреть сообщение
Жаль что этот тип не откроют в полный доступ в 4-ке, на 2009 мы врятли будем переходить. Поэтому буду юзать прямые запросы к бд с TO_CHAR и TO_DATE
Если не секрет, почему врядли переходить будете?
__________________
Ivanhoe as is..
Старый 12.02.2010, 15:23   #5  
nix0root is offline
nix0root
Участник
 
67 / 16 (1) ++
Регистрация: 17.03.2009
Адрес: МО
Во первых это дорого нам встанет.
Во вторых долго.
В третьих ловить ошибки потом в теч длительного времени , тк у нас много своих наработок.
Ну и самое главное у нас ORACLE )))) а на сколько я знаю 2009 уже никак не поддерживает ORA.

Собственно вот почему мы не будем переходить на 2009
Старый 12.02.2010, 15:28   #6  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,448 / 1789 (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   #7  
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   #8  
nix0root is offline
nix0root
Участник
 
67 / 16 (1) ++
Регистрация: 17.03.2009
Адрес: МО
Ну даже с учетом поддержки 2009-й OR-ы, стоимость и время все равно остаются критичными
Старый 12.02.2010, 17:01   #9  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,448 / 1789 (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   #10  
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)
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 30.09.2010, 14:08   #11  
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)))
Итак, сегодня в очередной раз напоролся на сравнение периода не только с датами, но и с временем. Код приведенный выше определяет вхождение конкретной даты с конкретным временем в период (например 01.10.2010 10 : 00 входит в период с 01.10.2010 09 : 00 по 01.10.2010 18 : 00).

Мне же нужно определять вхождение периода1 в период2.
Вот конкретный пример:
Период1 = с 01.10.2010 00 : 00 по 01.10.2010 00 : 00 (понятно, что имеются ввиду одни сутки. Конечно можно сказать, что пользователь должен конечное время в периоде1 указать как 23 : 59, но пользователей много, за каждым не уследишь. Да и интуитивно, как мне кажется, человек считает сутками с 00 : 00 до 00 : 00, поэтому скорее всего рано или поздно так и поставит.)

Период2 = с 01.10.2010 09 : 00 по 01.10.2010 18 : 00

Нужно определить входит ли период2 в период1 (визуально понятно, что входит )

После раздумий получился следующий код:
X++:
select 2
            where((2.FromDate   <  1.ToDate    ||
                      (2.FromDate   == 1.ToDate    &&
                      (2.FromTime   <= 1.ToTime    ||
                       1.ToTime        == 0)))                     ||
                       1.ToDate        == dateNull())              &&
                    ((2.ToDate     >  1.FromDate  ||
                     (2.ToDate     == 1.FromDate  &&
                     (2.ToTime     >= 1.FromTime  ||
                      2.ToTime     == 0)))                     ||
                      2.ToDate     == dateNull())
Если кто заметит логическую ошибку, если не трудно напишите
ну а если все ок, то и хорошо, может кому пригодиться, и не придется тратить лишний час на проверку правильности логики запроса
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 30.09.2010, 15:23   #12  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,448 / 1789 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от lev Посмотреть сообщение
Вот конкретный пример:
Период1 = с 01.10.2010 00 : 00 по 01.10.2010 00 : 00 (понятно, что имеются ввиду одни сутки. Конечно можно сказать, что пользователь должен конечное время в периоде1 указать как 23 : 59, но пользователей много, за каждым не уследишь. Да и интуитивно, как мне кажется, человек считает сутками с 00 : 00 до 00 : 00, поэтому скорее всего рано или поздно так и поставит.)
Если я правильно вас понял то для правой границы периода необходимо сделать следуюшее допущение:
если время нулевое 00:00, то считаем время равным 59:59.
Так? Уточняющий вопрос. Такое допущение должно быть справедливо всегда или только если дата оконьчания совпадает с датой начала периода?
т.е. как рассматривать период [01.10.2010 00:00 - 02.10.2010 00:00]
как [01.10.2010 00:00 - 02.10.2010 00:01) или
как [01.10.2010 00:00 - 02.10.2010 59:59] или
как [01.10.2010 00:00 - 01.10.2010 59:59] ?

При такой формулировке задачи, в любом случае, я бы не стал сохранять и использовать в условии те даты, которые ввёл пользователь. Что вам мешает перед обработкой/сохранением данных скорректировать их в правильный формат?

Последний раз редактировалось S.Kuskov; 30.09.2010 в 15:26.
Старый 30.09.2010, 15:34   #13  
Atar is offline
Atar
Консультант
 
287 / 101 (4) +++++
Регистрация: 10.03.2006
Адрес: Москва
Цитата:
Сообщение от lev Посмотреть сообщение
Период1 = с 01.10.2010 00 : 00 по 01.10.2010 00 : 00 (понятно, что имеются ввиду одни сутки.
Далеко не всем это понятно, по крайней мере без контекста . Да и ваши пользователи вряд ли имеют проблемы при вводе границ диапазонов "с 1 января года1 по 31 декабря года1", а не "с 1 января года1 до 1 января года2"...
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Если я правильно вас понял то для правой границы периода необходимо сделать следуюшее допущение: если время нулевое 00:00, то считаем время равным 59:59.
Так? Уточняющий вопрос. Такое допущение должно быть справедливо всегда ...?
Подозреваю что да. Это чтобы сохранить преемственность с порядком назначения диапазонов исключительно датами (с 01.10.2010 по 01.10.2010). Но это приведет к неадекватному для "нормальных" пользователей поведению системы, когда диапазон
с 01.10.2010 10:00 по 02.10.2010 00:00
достаточно неожиданно оказывается больше, чем
с 01.10.2010 10:00 по 02.10.2010 11:11
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
При такой формулировке задачи, в любом случае, я бы не стал сохранять и использовать в условии те даты, которые ввёл пользователь. Что вам мешает перед обработкой/сохранением данных скорректировать их в правильный формат?
Действительно, если нерадивый пользователь введет "нулевой" диапазон, то ему сразу можно показать, что система этот диапазон воспринимает по-своему.

Более того, можно, конечно пытаться ещё и интервалы с 10:00 до 10:00 (рабочая суточная смена) пытаться автоматически воспринимать как с 10:00 по 09:59. Тоже на мой взгляд, неправильно зашивать это в глубине системы.

Ведь в случае таких вмешательств может получиться, что один отчет/запрос будет работать по явно введёному пользователем диапазону, а другой - по хитро обработанному. Не есть гуд.
Извините за флуд, не удержался.

Последний раз редактировалось Atar; 30.09.2010 в 15:46. Причина: Извините за флуд, не удержался.
Старый 30.09.2010, 15:51   #14  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Такое допущение должно быть справедливо всегда или только если дата оконьчания совпадает с датой начала периода?
всегда

Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
т.е. как рассматривать период [01.10.2010 00:00 - 02.10.2010 00:00]
в этом случае отработает условие:
X++:
2.FromDate   <  1.ToDate
и дальше по или не пойдет, т.е. такой случай тоже отработает корректно.
02.10.2010 00:00 - это 02.10.2010 00:00
когда пользователь устанавливает конечную дату больше чем начальную, то с указанием времени у него проблем не возникает (не спрашивайте почему, сам не знаю, но практика показывает что так оно и есть)
а вот в случае периода в рамках одних суток, случается ситуация которую описал я выше.

Про авто подстановку правильного формата тоже думал, но тогда встает вопрос, а если пользователю действительно надо будет указать "00 : 00", тогда что?
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Теги
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, время: 00:03.