26.07.2011, 17:31 | #1 |
Участник
|
Сложный 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)) ); Идея - автосогласования документов в документообороте. Сам вопрос: на какую функцию заменить str2int(), или ещё как нибудь сделать чтобы подтянуть в рэндж запроса значение поле TimeChange. Возможно ли это? Или какие нибудь дедовские методы... (Данная конструкция работает без ошибок, но не правильно). Понимаю что остается вариант переделать в while select..
__________________
С уважением, Алексей. |
|
26.07.2011, 18:23 | #2 |
Участник
|
а какого типа поле1 и поле2?
насколько я понимаю, оба DateTime? могут ли минуты(поля1) быть больше суток? можно ли свести условие к следующему? Сегодня >= дата(поле2) И минуты(поля1) > минуты(поля2) ======================= к while select'у точно сводить не надо - замучаетесь. в крайнем случае делать условие силами самой аксапты внутри цикла. X++: while( qr.next() ) { if( ...... ) { .... } } |
|
|
За это сообщение автора поблагодарили: axalex (1). |
26.07.2011, 18:28 | #3 |
Участник
|
Да, и еще одно.
"Сегодня" в аксапте бывает двух видов: 1. рабочая дата - редактируется в меню сервис, получить можно функцией systemdateget() 2. системная дата - в аксапте не редактируется. отредактировать можно только в самом компьютере. получить можно функцией today() |
|
26.07.2011, 19:10 | #4 |
Участник
|
Судя по использованию 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, 20:17 | #5 |
Участник
|
Цитата:
Тип поля два - DateTime В комплексе: DateTime(Date+Time)>DateTime Да, минуты могут быть больше суток, и не одних. Свести к Сегодня >= дата(поле2) И минуты(поля1) > минуты(поля2) можно, но учитывая сдвиг в минутах больше суток возникают задачи другого характера. В качестве Сегодня брал: X++: DateTimeUtil::newDateTime(systemdateget(),timenow()); Цитата:
Решил сделать так: 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 | #6 |
Участник
|
Цитата:
В запрос можно ввести условие Сегодня >= дата(поле2) range = SysQuery::range(systemdateget(),""); а более точное условие проверить внутри цикла. |
|
26.07.2011, 22:38 | #7 |
Участник
|
Если таблица большая и эта операция выполняется часто, то я бы сделал еще одно поле типа UTCDateTime, в которое записывал при добавлении и обновлении modifiedDateTime + TimeChange. И сделал индекс по полю
Выборка будет простым сравнением на больше-меньше
__________________
Axapta v.3.0 sp5 kr2 |
|
28.07.2011, 13:29 | #8 |
Участник
|
Цитата:
+ переделал внутренности чутка, для правильности работы. X++: if (DateTimeUtil::addMinutes(Global_UN::serverDateTime(), -typeTable.TimeChange) > docTable.modifiedDateTime
&& DateTimeUtil::addMinutes(Global_UN::serverDateTime() , -2880) < docTable.modifiedDateTime) Всем спасибо.
__________________
С уважением, Алексей. |
|
Теги |
query, range |
|
|