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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 13.02.2019, 12:42   #1  
dark_knight is offline
dark_knight
Участник
 
20 / 10 (1) +
Регистрация: 20.01.2019
динамический X++ запрос range по нескольким полям
Добрый ден,

Столкнулся с трудностями при переписывании данного SQL запроса:

X++:
    while select BOMId from bomVersion
            group by routeOpr.IsTechnReasonable_ICL,bom.ItemId,ecoResProduct.RecId
            where bomVersion.ItemId==itemIdProduction &&
                  bomVersion.Active == NoYes::Yes &&
                  bomVersion.FromQty == #bomVersionFromQty &&
                  (
                    (bomVersion.FromDate==dateNull() && bomVersion.ToDate == dateNull())||
                    (bomVersion.FromDate<= systemDateGet() && bomVersion.ToDate >= systemDateGet())||
                    (bomVersion.FromDate<= systemDateGet() && bomVersion.ToDate == dateNull())
                  )
данную часть:

X++:
(
                    (bomVersion.FromDate==dateNull() && bomVersion.ToDate == dateNull())||
                    (bomVersion.FromDate<= systemDateGet() && bomVersion.ToDate >= systemDateGet())||
                    (bomVersion.FromDate<= systemDateGet() && bomVersion.ToDate == dateNull())
упростил до:

X++:
bomVersion.FromDate <= systemDateGet()
  && (bomVersion.ToDate == dateNull() || bomVersion.ToDate >= systemDateGet())
Сам запрос на X++:

X++:
static void Job74(Args _args)
{
    Query                   query;
    Queryrun                qr;
    QueryBuildDataSource    qbdsBomVersion;
    BOMVersion              bomVersion;


    query = new Query();
    qbdsBomVersion = query.addDataSource(tableNum(BOMVersion));
    qbdsBomVersion.addRange(fieldNum(BOMVersion,ItemId)).value(queryValue("7075"));
    qbdsBomVersion.addRange(fieldNum(BOMVersion,Active)).value(queryvalue(SysQuery::value(NoYes::Yes)));
    qbdsBomVersion.addRange(fieldNum(BOMVersion,FromQty)).value(queryValue("1"));
    qbdsBomVersion.addRange(fieldNum(BomVersion,FromDate)).value(strfmt("((%1.%2 <= %5) && ((%1.%3 == %4) || (%1.%3 >= %5)))",
                            qbdsBomVersion.name(),fieldstr(BOMVersion,FromDate),fieldStr(BOMVersion,ToDate),date2strXpp(dateNull()),systemDateGet()));

    qr = new QueryRun(query);
    info(qr.query().dataSourceNo(1).toString());
Вот эту часть:

X++:
bomVersion.FromDate <= systemDateGet()
  && (bomVersion.ToDate == dateNull() || bomVersion.ToDate >= systemDateGet())
записал как:

X++:
qbdsBomVersion.addRange(fieldNum(BomVersion,FromDate)).value(strfmt("((%1.%2 <= %5) && ((%1.%3 == %4) || (%1.%3 >= %5)))",
                            qbdsBomVersion.name(),fieldstr(BOMVersion,FromDate),fieldStr(BOMVersion,ToDate),date2strXpp(dateNull()),systemDateGet()));

Возвращаемый SQL запрос такой:

X++:
SELECT * FROM BOMVersion(BOMVersion_1) WHERE ((ItemId = N'7075')) AND ((Active = 1)) AND ((FromQty = 1.E0)) AND ((((BOMVersion_1.FromDate <= 13.02.2019) && ((BOMVersion_1.ToDate == 01\01\1900) || (BOMVersion_1.ToDate >= 13.02.2019)))))
Получаю ошибку расширенно диапозона. Ожидается правая круглая скобка рядом с 35. Подскажите пожалуйста, в чем может быть проблема? Использую подход для наложения range которы йописан здесь:

https://docs.microsoft.com/en-us/dyn...n-query-ranges

Заранее спасибо.

Последний раз редактировалось dark_knight; 13.02.2019 в 13:04.
Старый 13.02.2019, 12:58   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,427 / 1771 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Почему dateNull() завернут в date2strXpp, а systemDateGet() нет?
За это сообщение автора поблагодарили: dark_knight (1).
Старый 13.02.2019, 13:46   #3  
dark_knight is offline
dark_knight
Участник
 
20 / 10 (1) +
Регистрация: 20.01.2019
Спасибо. Работает
Старый 13.02.2019, 17:33   #4  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,158 / 1286 (47) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
А имеет ли смысл формировать расширенный фильтр?
Вроде бы все можно реализовать простыми range, воспользовавшись тем поведением, что создание двух range на одно поле сделает для них ИЛИ.
Навскидку приходит на ум форма применимости номенклатуры в спецификациях BOMPartOf.
Старый 13.02.2019, 21:54   #5  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,158 / 1286 (47) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Хотя даже и не обязательно создавать два range, вполне работает и по одному.
Вот часть установки фильтров как раз похожего случая когда нужно попадание даты в диапазон и дата окончания диапазона может быть открытой:
X++:
qbrTemp = findOrCreateRange_W(qbdsSetup, fieldNum(SysPolicySetup_OVK, FromDate));
qbrTemp.value(SysQuery::range(dateNull(), searhDate));

qbrTemp = findOrCreateRange_W(qbdsSetup, fieldNum(SysPolicySetup_OVK, ToDate));

rangeTemp   = SysQuery::range(searhDate, dateNull());
rangeTemp   += (', ' + SysQuery::valueEmptyString());
qbrTemp.value(rangeTemp);
Прекрасно транслируется в запрос:
Код:
SELECT * FROM SysPolicySetup_OVK 
WHERE 	((PolicyType = 1)) 
	AND ((PolicyStatus = 1)) 
	AND ((FromDate<={ts '2019-02-13 00:00:00.000'})) 
	AND ((ToDate>={ts '2019-02-13 00:00:00.000'} OR ToDate = {ts '1900-01-01 00:00:00.000'}))
Правда только что заметил ошибку нижнего диапазона - нужно сдвинуть на день.

Последний раз редактировалось Raven Melancholic; 13.02.2019 в 21:57.
За это сообщение автора поблагодарили: dark_knight (1).
Старый 17.02.2019, 22:31   #6  
dark_knight is offline
dark_knight
Участник
 
20 / 10 (1) +
Регистрация: 20.01.2019
спасибо)) учту
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как сделать в lookup поиск по нескольким полям Jurezzz DAX: Программирование 6 31.05.2013 10:45
Запрос по нескольким значениям поля mallard DAX: Программирование 3 26.10.2007 10:38
Динамический запрос на таблицу DataArea PavelSR DAX: Программирование 2 23.07.2007 12:31
Запрос. Отрицание значения при добавлении range'а на поле! IvanS DAX: Программирование 3 11.10.2006 09:41
Динамический запрос Anais DAX: Программирование 2 23.04.2004 10:35
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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