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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 26.07.2011, 17:31   #1  
axalex is offline
axalex
Участник
 
91 / 14 (1) ++
Регистрация: 14.03.2011
Cool Сложный Range в Query.
Приветствую!
Есть запрос, внутри Range. Следущего типа:
X++:
range = strfmt('(\"%1\" > %2)',
                        DateTimeUtil::addMinutes(Global_UN::serverDateTime_ASU(), str2int(fieldid2name(tableNum(DocCircTypeTable_UN), fieldNum(DocCircTypeTable_UN, TimeChange)))),
                        fieldid2name(tableNum(DocCircTable_UN), fieldNum(DocCircTable_UN, modifiedDateTime)) );
Хочется получить фильтр типо (Сегодня + минуты (поля1) > поле2).
Идея - автосогласования документов в документообороте.

Сам вопрос: на какую функцию заменить str2int(), или ещё как нибудь сделать чтобы подтянуть в рэндж запроса значение поле TimeChange. Возможно ли это? Или какие нибудь дедовские методы... (Данная конструкция работает без ошибок, но не правильно).

Понимаю что остается вариант переделать в while select..
__________________
С уважением, Алексей.
Старый 26.07.2011, 18:23   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от axalex Посмотреть сообщение
Хочется получить фильтр типо (Сегодня + минуты (поля1) > поле2).
а какого типа поле1 и поле2?
насколько я понимаю, оба DateTime?
могут ли минуты(поля1) быть больше суток?

можно ли свести условие к следующему?
Сегодня >= дата(поле2) И минуты(поля1) > минуты(поля2)

=======================
к while select'у точно сводить не надо - замучаетесь.
в крайнем случае делать условие силами самой аксапты внутри цикла.
X++:
while( qr.next() )
{
    if( ...... )
    {
        ....
    }
}
причем, учтите, что из-за всевозможных кэширований вариант с условием внутри цикла может быть быстрее сложного запроса.
__________________
полезное на axForum, github, vk, coub.
За это сообщение автора поблагодарили: axalex (1).
Старый 26.07.2011, 20:17   #3  
axalex is offline
axalex
Участник
 
91 / 14 (1) ++
Регистрация: 14.03.2011
:)
Цитата:
Сообщение от mazzy Посмотреть сообщение
а какого типа поле1 и поле2?
насколько я понимаю, оба DateTime?
могут ли минуты(поля1) быть больше суток?

можно ли свести условие к следующему?
Сегодня >= дата(поле2) И минуты(поля1) > минуты(поля2)
}[/xpp]
Тип поля один - Time
Тип поля два - DateTime
В комплексе: DateTime(Date+Time)>DateTime
Да, минуты могут быть больше суток, и не одних.

Свести к Сегодня >= дата(поле2) И минуты(поля1) > минуты(поля2) можно, но учитывая сдвиг в минутах больше суток возникают задачи другого характера.

В качестве Сегодня брал:
X++:
DateTimeUtil::newDateTime(systemdateget(),timenow());
DateTimeUtil::getUserPreferredTimeZone() решил не трогать, хотя присутствует вопрос в разности часовых поясов(решу позже).

Цитата:
Сообщение от AndyD Посмотреть сообщение
Судя по использованию DateTimeUtil и полю modifiedDateTime речь идет о DAX2009 и, соответствено, о типе UTCDateTime

А так как используется метод addMinutes(), второй параметр которого int, то и поле TimeChange имеет тип, скорее всего, int и содержит смещение в в целых минутах
Всё верно DAX2009, смещение в минутах.

Решил сделать так:
X++:
while (qR.next())
    {
        ...........

        if (DateTimeUtil::addMinutes(Global_UN::serverDateTime_V(), -typeTable.TimeChange) > docTable.modifiedDateTime
            && DateTimeUtil::addMinutes(Global_UN::serverDateTime_V() , -2880) < docTable.modifiedDateTime)
        {
        ...........
        }
    }
X++:
static server UtcDateTime serverDateTime_V()
{
    return DateTimeUtil::newDateTime(systemdateget(),timenow());//DateTimeUtil::getUserPreferredTimeZone());
}
Работает быстро.. Спасибо.
__________________
С уважением, Алексей.

Последний раз редактировалось axalex; 26.07.2011 в 20:20.
Старый 26.07.2011, 20:50   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от axalex Посмотреть сообщение
Свести к Сегодня >= дата(поле2) И минуты(поля1) > минуты(поля2) можно, но учитывая сдвиг в минутах больше суток возникают задачи другого характера.

...
Работает быстро..
Чтобы было не так страшно и чтобы сделать быстрее, уменьшив выборку
В запрос можно ввести условие Сегодня >= дата(поле2)

range = SysQuery::range(systemdateget(),"");

а более точное условие проверить внутри цикла.
__________________
полезное на axForum, github, vk, coub.
Старый 28.07.2011, 13:29   #5  
axalex is offline
axalex
Участник
 
91 / 14 (1) ++
Регистрация: 14.03.2011
Цитата:
Сообщение от mazzy Посмотреть сообщение
Чтобы было не так страшно и чтобы сделать быстрее, уменьшив выборку
В запрос можно ввести условие Сегодня >= дата(поле2)

X++:
range = SysQuery::range(systemdateget(),"");
а более точное условие проверить внутри цикла.
Так и сделал. Получилось довольно комфортно.
+ переделал внутренности чутка, для правильности работы.
X++:
  if (DateTimeUtil::addMinutes(Global_UN::serverDateTime(), -typeTable.TimeChange) > docTable.modifiedDateTime
            && DateTimeUtil::addMinutes(Global_UN::serverDateTime() , -2880) < docTable.modifiedDateTime)
AndyD - интересно, попробую.
Всем спасибо.
__________________
С уважением, Алексей.
Старый 26.07.2011, 18:28   #6  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от axalex Посмотреть сообщение
...Сегодня...
Да, и еще одно.

"Сегодня" в аксапте бывает двух видов:
1. рабочая дата - редактируется в меню сервис, получить можно функцией systemdateget()
2. системная дата - в аксапте не редактируется. отредактировать можно только в самом компьютере. получить можно функцией today()
__________________
полезное на axForum, github, vk, coub.
Старый 26.07.2011, 19:10   #7  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Судя по использованию DateTimeUtil и полю modifiedDateTime речь идет о DAX2009 и, соответствено, о типе UTCDateTime

А так как используется метод addMinutes(), второй параметр которого int, то и поле TimeChange имеет тип, скорее всего, int и содержит смещение в в целых минутах


Если бы это поле так же имело тип UTCDateTime, то можно было бы попробовать такое условие
X++:
(modifiedDateTime-TimeChange < 2011-07-26T19:06:00)
но, к сожалению, при наличии арифметических операций с полями, Аксапта преобразует подствляемую дату/время в какое-то непотребство (целочисленное значение).
Так у меня на RU7, по крайней мере
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: mazzy (2), axalex (1).
Старый 26.07.2011, 22:38   #8  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Если таблица большая и эта операция выполняется часто, то я бы сделал еще одно поле типа UTCDateTime, в которое записывал при добавлении и обновлении modifiedDateTime + TimeChange. И сделал индекс по полю

Выборка будет простым сравнением на больше-меньше
__________________
Axapta v.3.0 sp5 kr2
Теги
query, range

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
sumitax: AX Queries – Passing query range as parameter Blog bot DAX Blogs 0 29.06.2011 13:11
sumitsaxfactor: Using Methods Inside Query Range Blog bot DAX Blogs 0 05.05.2011 20:12
msdax: How to Specify Range Values on a Query in a AX SSRS Report - AX Support - Site Home - MSDN Blogs Blog bot DAX Blogs 0 31.03.2011 11:11
axaptafreak: Label for Query Range cannot be modified (still) Blog bot DAX Blogs 2 25.07.2007 10:09
Как вытащить информацию о Range из Query raz DAX: База знаний и проекты 1 26.03.2004 11:10
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 17:05.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.