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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 17.10.2010, 21:31   #1  
vitaly85 is offline
vitaly85
Участник
 
34 / 10 (1) +
Регистрация: 05.07.2007
'Not between' используя Query клас
Есть альтернатива для 'Not between' в Dynamics AX используя Query клас?

На пример, в SQL eтo тaк:
X++:
select AccountNum
from CustTable
where AccountNum NOT BETWEEN '1000' and '2000';

В Dynamics AX, используя where ето будет так
X++:
CustTable custTable;
;

while select custTable
where ! (custTable.AccountNum >= "1000" &&
         custTable.AccountNum <= "2000")
{
.....  
}

Ho, eсли использовать Query клас:
X++:
Query 	             query = new Query();
QueryBuildDataSource qbds;
QueryBuildRange      qbrAccountNum;
QueryRun	     queryRun;
;

qbds = query.addDataSource(tablenum(CustTable));
qbrAccountNum = qbds.addRange(fieldNum(CustTable, AccountNum));

// примерно SysQuery::valueNot() метод
qbr.value(SysQuery::valueNot(SysQuery::range("1000", "2000")));

queryRun = new QueryRun(query);

while(queryRun.next())
{
.... HE 
}
Старый 17.10.2010, 22:41   #2  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Сделайте так
X++:
qbr.value(strfmt("!%1", SysQuery::range("1000", "2000")));
valueNot() вызывает внутри SysQuery::Value(), который эскейпит точки, в результате будут искаться строки, не равные "1000..2000", а не накладываться условие по диапазону значений
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: vitaly85 (1).
Старый 17.10.2010, 22:44   #3  
BOAL is offline
BOAL
Участник
Аватар для BOAL
MCBMSS
Злыдни
1C
Лучший по профессии 2015
 
621 / 453 (17) +++++++
Регистрация: 28.04.2003
Адрес: Москва
Тестить такое можно и простым запросом в фильтре на форме, то есть код или запрос работают одинаково.
Поддерживает ли язык запросов Не с диапазоном? !"1000..2000" Не факт. А вот !1000..2000 может.
Но вот конкретно этот пример сводится к ИЛИ: ..1000,2000..
Или с <> пробовать
То есть можно.

На крайняк, в квери есть недокументированая фича писать вообще кусок селекта с && и || со скобками, так что все можно, и даже более сложные вещи.
Я тут намедни как раз джойнил проводки в корреспонденции сами на себя по != все отработало.
За это сообщение автора поблагодарили: mazzy (2).
Старый 17.10.2010, 23:47   #4  
vitaly85 is offline
vitaly85
Участник
 
34 / 10 (1) +
Регистрация: 05.07.2007
Cпасибо за быстрый ответ!
Старый 18.10.2010, 08:10   #5  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от BOAL Посмотреть сообщение
Но вот конкретно этот пример сводится к ИЛИ: ..1000,2000..
Не, неправильно.
Здесь границы (значения 1000 и 2000) включены в выборку, а по условию задачи они должны быть исключены
__________________
Axapta v.3.0 sp5 kr2
Старый 18.10.2010, 08:40   #6  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от vitaly85 Посмотреть сообщение
Есть альтернатива для 'Not between' в Dynamics AX используя Query клас?
В стандарте нет. Но в чём прелесть аксапты? Вам никто не мешает самостоятельно доработать этот стандарт. Если у вас часто возникают задачи, требующие использование синтаксиса 'Not between', тогда расширте функцианальность класса SysQuery. Например, добавив в него следующий метод:
X++:
public static str NotBetween(anytype _from, anytype _to)
{
    str     range;

    boolean hasFrom = _from || (typeof(_from) != Types::String && typeof(_from) != Types::Date);
    boolean hasTo   = _to || (typeof(_to) != Types::String && typeof(_to) != Types::Date);

    if (hasFrom || hasTo)
    {
        if (hasFrom)
        {
            range = strfmt('<%1', queryValue(_from));
        }

        if (hasFrom && hasTo)
        {
            range += ',';
        }

        if (hasTo)
        {
            range += strfmt('>%1', queryValue(_to));
        }
    }
    else
    {
        range = SysQuery::valueNot(SysQuery::valueUnlimited());
    }

    return range;
}
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
jinx: Dynamics AX &ndash; Query-Ranges und Filtereinstellungen des Benutzers Blog bot DAX auf Deutsch 0 04.02.2010 00:05
emeadaxsupport: AxUpdatePortal.exe does not update Enterprise Portal when not running from an elevated command prompt Blog bot DAX Blogs 0 26.07.2009 15:07
Dynamics AX Geek: Using query() Blog bot DAX Blogs 0 04.05.2009 14:05
palleagermark: Sample union query from AX 2009 Blog bot DAX Blogs 0 11.07.2008 20:05
Dynamics AX Geek: Using query() Blog bot DAX Blogs 0 28.10.2006 16:40
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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