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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 30.09.2010, 14:08   #1  
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   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,449 / 1792 (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   #3  
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   #4  
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, время: 09:45.