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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 24.06.2010, 09:24   #1  
Димитрий is offline
Димитрий
Участник
 
27 / 12 (1) ++
Регистрация: 10.08.2009
? Расширенный запрос по дате
Пробую создать расширенный запрос по дате. Не получается.

Упростил задачу и не работает даже при таком:

Есть таблица table2 c полем date1980 - d1.

X++:
public void init()
{
    QueryBuildDataSource qbds;
    date dd1 = today()-10;
    date dd2 = today()+10;
    str rangeDate = strfmt("(d1>=%1 && d1<=%2)",dd1,dd2);
    ;

    super();

    qbds = Table2_ds.query().dataSourceNo(1);

    qbds.addRange(fieldnum(Table2,RecId)).value(rangeDate);// Не работает
    //qbds.addRange(fieldnum(Table2,d1)).value(rangeDate); // -------Не работает
    //qbds.addRange(fieldnum(Table2,d1)).value(strfmt('%1..%2',dd1,dd2));// - Работает


}
Ошибка расширенного диапазона запроса: Ожидается правая круглая скобка рядом с 13

Говорит ошибка в скобках. При просмотре qbds в отладчике работающий и неработающий вариант отличаются только тем, что в нерабочем есть дополнительная пара скобок.

Мне эти скобки нужны, т.к. вообще буду сцеплять дальше такие пары по ИЛИ. Кто-нибудь сталкивался с датами в расширенном запросе и проблемами с ними?
Старый 24.06.2010, 09:32   #2  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,490 / 1060 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
а qbds.addRange(fieldnum(Table2,DateField)).value(queryRange(dd1,dd2)) - это уже не "Джим Бим"?
Старый 24.06.2010, 09:35   #3  
Димитрий is offline
Димитрий
Участник
 
27 / 12 (1) ++
Регистрация: 10.08.2009
Делать вот такие простые - это одно. А как теперь тогда присоединить еще один туда же по ИЛИ, но по другому полю даты или по этому же, но с другим диапазоном дат?
Старый 24.06.2010, 09:42   #4  
Weez is offline
Weez
Участник
Axapta Retail User
 
250 / 84 (3) ++++
Регистрация: 18.01.2006
Адрес: Moscow city
Попробуйте str rangeDate = strfmt("((d1>=%1) && (d1<=%2))",dd1,dd2);
т.е. каждое условие заключить в отдельные скобки, должно сработать.
__________________
Существует 10 типов людей: одни понимают двоичную систему, другие - нет.
Старый 24.06.2010, 09:47   #5  
Димитрий is offline
Димитрий
Участник
 
27 / 12 (1) ++
Регистрация: 10.08.2009
Ошибка расширенного диапазона запроса: Ожидается правая круглая скобка рядом с 14
Старый 24.06.2010, 09:50   #6  
Димитрий is offline
Димитрий
Участник
 
27 / 12 (1) ++
Регистрация: 10.08.2009
Цитата:
Сообщение от Weez Посмотреть сообщение
т.е. каждое условие заключить в отдельные скобки, должно сработать.
Работает пока у меня только в одном случае, если записать вот так:

X++:
str rangeDate =  strfmt("d1>=%1 && d1<=%2",dd1,dd2);
но мне нужны скобки.
Старый 24.06.2010, 10:00   #7  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
уже обсуждалось...
вот рабочий вариант:

добавление уловия OR (ИЛИ) в QUERY, кавычки и скобки ОБЯЗАТЕЛЬНО!!!:

X++:
sQuery = strFmt('((%1 == "%3") || (%2 == "%3"))', fieldStr(Table, Field),
                                                  fieldStr(Table, Field),
                                                  queryValue());
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 24.06.2010, 10:01   #8  
Weez is offline
Weez
Участник
Axapta Retail User
 
250 / 84 (3) ++++
Регистрация: 18.01.2006
Адрес: Moscow city
Да, вместо dd1 и dd2 подставляйте date2strxpp(dd1) и date2strxpp(dd2)
__________________
Существует 10 типов людей: одни понимают двоичную систему, другие - нет.
Старый 24.06.2010, 10:03   #9  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
конкретно для вашего примера:

X++:
str rangeDate = strfmt('((d1>="%1") && (d1<="%2"))',dd1,dd2);
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 24.06.2010, 10:13   #10  
Димитрий is offline
Димитрий
Участник
 
27 / 12 (1) ++
Регистрация: 10.08.2009
Цитата:
Сообщение от Weez Посмотреть сообщение
Да, вместо dd1 и dd2 подставляйте date2strxpp(dd1) и date2strxpp(dd2)
Не работает
Старый 24.06.2010, 10:15   #11  
Димитрий is offline
Димитрий
Участник
 
27 / 12 (1) ++
Регистрация: 10.08.2009
Цитата:
Сообщение от lev Посмотреть сообщение
конкретно для вашего примера:

X++:
str rangeDate = strfmt('((d1>="%1") && (d1<="%2"))',dd1,dd2);
Не работает. Код выполняется, вот только в итоге ни одной записи из диапазона.

Axapta 3.
Старый 24.06.2010, 10:31   #12  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от Димитрий Посмотреть сообщение
Не работает. Код выполняется, вот только в итоге ни одной записи из диапазона.

Axapta 3.
Проверяйте правильность указанных параметров. У меня такой вариант работает стабильно и правильно.

Если уверены что все правильно указано и должны выводиться записи, выложите здесь конкретный пример с вашим кодом, так как он у вас написан.

Тоже Axapta 3.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 24.06.2010, 10:37   #13  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от Димитрий Посмотреть сообщение
Делать вот такие простые - это одно. А как теперь тогда присоединить еще один туда же по ИЛИ, но по другому полю даты или по этому же, но с другим диапазоном дат?
Если по тому же полю, то можно добавлять нужные диапазоны через запятую
__________________
Axapta v.3.0 sp5 kr2
Старый 24.06.2010, 10:38   #14  
Димитрий is offline
Димитрий
Участник
 
27 / 12 (1) ++
Регистрация: 10.08.2009
Цитата:
Сообщение от lev Посмотреть сообщение
Проверяйте правильность указанных параметров. У меня такой вариант работает стабильно и правильно.

Если уверены что все правильно указано и должны выводиться записи, выложите здесь конкретный пример с вашим кодом, так как он у вас написан.

Тоже Axapta 3.
Как вы и писали, конкретно для моего случая, код вот такой вот, на Init формы:

X++:
public void init()
{
    QueryBuildDataSource qbds;
    date dd1 = today()-10;
    date dd2 = today()+10;
    str rangeDate = strfmt('((d1>="%1") && (d1<="%2"))',dd1,dd2);
     ;

    super();
    qbds = Table2_ds.query().dataSourceNo(1);

    qbds.addRange(fieldnum(Table2,d1)).value(rangeDate);

}
Данные, есть, при обычном запросе они выдаются. При предложенно мже возвращается пустой набор. У вас точно выдаются данные, или вы так думаете, что они должны выдаваться?
Старый 24.06.2010, 10:40   #15  
Димитрий is offline
Димитрий
Участник
 
27 / 12 (1) ++
Регистрация: 10.08.2009
Цитата:
Сообщение от AndyD Посмотреть сообщение
Если по тому же полю, то можно добавлять нужные диапазоны через запятую
Мне надо по другому.

То есть если там еще d2 дата, то вот такое вот примерно надо:

X++:
str rangeDate = strfmt("(((d1>=%1) && (d1<=%2)) || ((d2>=%1) && (d2<=%2)))",queryValue(dd1),queryValue(dd2));
Старый 24.06.2010, 10:40   #16  
Weez is offline
Weez
Участник
Axapta Retail User
 
250 / 84 (3) ++++
Регистрация: 18.01.2006
Адрес: Moscow city
Не поленился, написал джоб для проверки работоспособности - все работает, данные попадают
X++:
static void testQuery(Args _args)
{
    Query                   query;
    QueryRun                queryRun;
    QueryBuildDataSource    qbds;
    QueryBuildRange         qbr;
    EmplTable               emplTable;
    ;
    query = new Query();
    qbds = query.addDataSource(TableNum(EmplTable));
    qbr = qbds.addRange(fieldNum(EmplTable, EmplId));
    qbr.value(strfmt("((CreatedDate >= %1) && (CreatedDate <= %2))", date2strxpp(31\12\2009), date2strxpp(31\01\2010)));
    queryRun = new QueryRun(query);
    while(queryRun.next())
    {
        emplTable = queryRun.get(TableNum(EmplTable));
        info(emplTable.EmplId);
    }
}
__________________
Существует 10 типов людей: одни понимают двоичную систему, другие - нет.
За это сообщение автора поблагодарили: Димитрий (1).
Старый 24.06.2010, 10:45   #17  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от Димитрий Посмотреть сообщение
При предложенно мже возвращается пустой набор. У вас точно выдаются данные, или вы так думаете, что они должны выдаваться?
Я же написал, что все работает стабильно! Все нормально выводится! Сейчас тоже у себя попробую написать джоб для примера.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 24.06.2010, 10:47   #18  
Димитрий is offline
Димитрий
Участник
 
27 / 12 (1) ++
Регистрация: 10.08.2009
Цитата:
Сообщение от Weez Посмотреть сообщение
Не поленился, написал джоб для проверки работоспособности - все работает, данные попадают
Ага. Вот так заработало

X++:
str rangeDate = strfmt('((d1>=%1) && (d1<=%2))',date2strxpp(dd1),date2strxpp(dd2));
А так глючило:

X++:
str rangeDate = strfmt('(d1>=%1 && d1<=%2)',date2strxpp(dd1),date2strxpp(dd2));
Сейчас попробую связку по ИЛИ.
Старый 24.06.2010, 10:49   #19  
Димитрий is offline
Димитрий
Участник
 
27 / 12 (1) ++
Регистрация: 10.08.2009
Сработало и по ИЛИ. Спасибо.
Старый 24.06.2010, 10:51   #20  
Димитрий is offline
Димитрий
Участник
 
27 / 12 (1) ++
Регистрация: 10.08.2009
Цитата:
Сообщение от lev Посмотреть сообщение
Я же написал, что все работает стабильно! Все нормально выводится!
Значит у нас все сильно разное.
Теги
query, range

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Если в запросе у первой таблицы CacheLookup = None, то запрос идет без NOLOCK raz DAX: Программирование 1 04.02.2010 16:12
Расширенный фильтр в запрос или как то так Sada DAX: Программирование 7 15.01.2009 16:09
RLS&Расширенный запрос donMigel DAX: Функционал 14 18.01.2008 13:32
Почему join запрос разбивается на подзапросы!? 3oppo DAX: Программирование 59 28.06.2007 11:52
Запрос по дате Aslan DAX: Программирование 14 25.11.2005 16:27

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

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

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