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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 24.06.2010, 10:51   #21  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
Для проверки расширенных диапазонов не надо писать джобов.
Достаточно открыть любую форму с датами и в запросе прописать нужное условие.

К примеру, у меня прекрасно фильтруется по такому запросу в складских журналах по полю "Идентификатор записи"
X++:
((transdate >= 01\01\2010) && (transdate <=01\01\2010)) || ((createddate >= 01\01\2010) && (createddate <=01\01\2010))
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: mazzy (2).
Старый 24.06.2010, 11:31   #22  
Weez is offline
Weez
Участник
Axapta Retail User
 
250 / 84 (3) ++++
Регистрация: 18.01.2006
Адрес: Moscow city
Иихо, в джобе запрос выглядет наглядней, чисто с точки зрения удобства написания и отображения. Понятное дело, что работать будет и в расширенном фильтре.
__________________
Существует 10 типов людей: одни понимают двоичную систему, другие - нет.
Старый 18.08.2014, 13:21   #23  
smailik is offline
smailik
Участник
Аватар для smailik
 
250 / 70 (3) ++++
Регистрация: 10.04.2012
Адрес: Москва
Всем доброго дня.
У меня подобная проблема.
Есть справочник учета холодильников, в нем указывается "дата установки" и "дата выбытия". Если холодильник еще не выбил, то "дата выбытия" пуская, т.е dateNull(). Пытаюсь в query наложить условие периода дат но безрезультатно.
X++:
    queryLocal   =   new Query();
    qbds1    =   queryLocal.addDataSource(tableNum(SalesTable));
    qbds1.addGroupByField(fieldNum(SalesTable, ShipmentPointCode));

    qbds2   =   qbds1.addDataSource(tableNum(RegistrationRefrigerationTable));
    qbds2.joinMode(JoinMode::InnerJoin);
    qbds2.fetchMode(QueryFetchMode::One2One);
    qbds2.relations(false);
    qbds2.addLink(fieldNum(SalesTable, ShipmentPointCode), fieldNum(RegistrationRefrigerationTable, ShipmentPointCode));
    queryRunLocal    =   new QueryRun(queryLocal);

    ....

    queryLocal = queryRunLocal.query();
    qbds1 = queryLocal.dataSourceTable(tableNum(SalesTable));
    qbds1.clearRange(fieldNum(SalesTable, ShippingDateRequested));
    qbds1.addRange(fieldNum(SalesTable, ShippingDateRequested)).value(strfmt("%1 .. %2", startDate, endDate));
    qbds2 = queryLocal.dataSourceTable(tableNum(RegistrationRefrigerationTable));
    qbds2.clearRanges();
    qbds2.addRange(fieldNum(RegistrationRefrigerationTable, DateInsert)).value(strfmt("..%1", endDate));    /* работает, выводит 2 строки*/
    /*добавляю фильтр по дате выбытия, ожидаю в выводе 1 строку, а получаю много много*/
    rangeDate = strfmt('((DateRemove>="%1") OR (DateRemove=="%2"))', startDate, dateNull()); // с этими строками
    qbds2.addRange(fieldNum(RegistrationRefrigerationTable, DateRemove)).value(rangeDate);     // выводит чушь
    queryRunLocal    =   new QueryRun(queryLocal);
в инфологе вот такая вот ошибка "Ошибка расширенного диапазона запроса: Ожидается правая круглая скобка рядом с 32."
Дайте совет как правильно прописать условие.
Старый 18.08.2014, 13:32   #24  
pedrozzz is offline
pedrozzz
Молодой, подающий надежды
Аватар для pedrozzz
MCBMSS
Лучший по профессии 2015
 
164 / 218 (8) ++++++
Регистрация: 18.02.2010
Адрес: Краснодар
Expressions in query ranges
Даты должны быть отформатированы с помощью Date2StrXpp()
X++:
rangeDate = strfmt('((DateRemove >= %1) || (DateRemove == %2))', date2StrXpp(startDate), date2StrXpp(dateNull()))
__________________
Кононов Пётр

Последний раз редактировалось pedrozzz; 18.08.2014 в 13:35.
Старый 18.08.2014, 13:49   #25  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
642 / 347 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Замените OR на ||
__________________
// no comments
Старый 18.08.2014, 13:52   #26  
smailik is offline
smailik
Участник
Аватар для smailik
 
250 / 70 (3) ++++
Регистрация: 10.04.2012
Адрес: Москва
X++:
    rangeDate = strfmt('((DateRemove >= %1) || (DateRemove == %2))', date2StrXpp(startDate), date2StrXpp(dateNull()));
    qbds2.addRange(fieldNum(RegistrationRefrigerationTable, DateRemove)).value(rangeDate);    
    queryRunLocal    =   new QueryRun(queryLocal);
    while (queryRunLocal.next())
    {
        salesTable = queryrunLocal.get(tableNum(SalesTable));
        registrationRefrigerationTable = queryRunLocal.get(tableNum(RegistrationRefrigerationTable));
        info (strfmt("%1 %2",
                    salesTable.ShipmentPointCode,
                    registrationRefrigerationTable.DateInsert));
    }
выводит запись только из salesTable, а из registrationRefrigerationTable нет записей.
в registrationRefrigerationTable две записи с 01.08.2014 по 05.08.2014 и с 01.08.2014 по <пусто>. создан специально тестовый заказ от 04.08.2014.
В отладчике запрос выглядит так :
SELECT FIRSTFAST * FROM RegistrationRefrigerationTable WHERE SalesTable.ShipmentPointCode = RegistrationRefrigerationTable.ShipmentPointCode AND ((DateInsert<={ts '2014-08-06 00:00:00.000'})) AND ((((DateRemove >= 04\08\2014) || (DateRemove == 01\01\1900))))
Может правую часть привести к такому же виду что и левую?
Старый 18.08.2014, 13:59   #27  
smailik is offline
smailik
Участник
Аватар для smailik
 
250 / 70 (3) ++++
Регистрация: 10.04.2012
Адрес: Москва
написал
X++:
queryLocal   =   new Query();
    qbds1 = queryLocal.addDataSource(tableNum(RegistrationRefrigerationTable));
    qbds1.addRange(fieldNum(RegistrationRefrigerationTable, DateInsert)).value(strfmt("..%1", endDate));    
    rangeDate = strfmt('((DateRemove >= %1) || (DateRemove == %2))', date2StrXpp(startDate), date2StrXpp(dateNull()));
    qbds1.addRange(fieldNum(RegistrationRefrigerationTable, DateRemove)).value(rangeDate);
    queryRunLocal    =   new QueryRun(queryLocal);

    while (queryRunLocal.next())
    {
        ....
    }
работает, выводит как раз две записи. стоит заджойнить к salesTable пусто
Старый 18.08.2014, 14:00   #28  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
642 / 347 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
У вас же группировка по ShipmentPointCode. Поэтому во второй таблице пусто. Используйте статистические функции.
__________________
// no comments
Старый 18.08.2014, 14:20   #29  
smailik is offline
smailik
Участник
Аватар для smailik
 
250 / 70 (3) ++++
Регистрация: 10.04.2012
Адрес: Москва
Немного Вас не понял. В заказах на продажу ShipmentPointCode и в учете холодильников ShipmentPointCode (т.е то где стоит холодильник). В заказах на продажу за определенный период может быть несколько заказов с одной и той же ShipmentPointCode, поэтому я их группирую. Если в указанном диапазоне в ShipmentPointCode не было холодильника, мне запись из salesTable не нужна. К этому всему безобразию хочу прикрутить холодильник. Расскажите по подробнее о каких статических функциях Вы говорите?
Старый 18.08.2014, 16:38   #30  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
642 / 347 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Во-первых, не статические функции, а статистические, по-другому агрегатные (MIN, MAX, SUM, COUNT, AVG). Тут уж они не нужны, простите, не знал чего вы хотели добиться.
Во-вторых, вы хотите выбирать записи из SalesTable, а потом накладываете группировку по ShipmentPointCode. Это неправильно. У вас теряются все значения, а остается лишь поле, по которому идет группировка.
Третий пункт вытекает из второго:
Цитата:
Сообщение от smailik Посмотреть сообщение
Если в указанном диапазоне в ShipmentPointCode не было холодильника, мне запись из salesTable не нужна.
А если в ShipmentPointCode был холодильник? Что вы получите ну хотя бы в поле SalesId?

Мой совет: уберите группировку, сделайте соединение OUTER JOIN и будет вам счастье.
__________________
// no comments
Старый 18.08.2014, 16:54   #31  
smailik is offline
smailik
Участник
Аватар для smailik
 
250 / 70 (3) ++++
Регистрация: 10.04.2012
Адрес: Москва
Цитата:
Сообщение от dech Посмотреть сообщение
Во-вторых, вы хотите выбирать записи из SalesTable, а потом накладываете группировку по ShipmentPointCode. Это неправильно. У вас теряются все значения, а остается лишь поле, по которому идет группировка.
это мне и надо. этим самым я узнаю какие заказы с ShipmentPointCode и с холодильниками были в нужный мне период и потом буду бежать по заказам только на эти ShipmentPointCode.
В случае с OUTER JOIN, я получу конкретные заказы (100, 200, 300 штук). Потом конечно можно бегать по ним, предварительно их отсортировав, но еще надо будет сделать механизм группировки данных. В идеале я делаю отчет по продажам номенклатуры в ShipmentPointCode в которой стоят холодильники.

Последний раз редактировалось smailik; 18.08.2014 в 16:58.
Старый 18.08.2014, 17:40   #32  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
642 / 347 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Тогда у меня к вам такие вопросы:
1. Нужно ли выбирать из SalesTable другие поля, помимо ShipmentPointCode?
2. Имеются ли записи в SalesTable с незаполненным ShipmentPointCode? Что вы собираетесь делать с набором записей, сгруппированных по пустому полю?
3. Я не совсем понимаю, что хранится в таблице RegistrationRefrigerationTable и как вы определяете, что нужный товар - это холодильники, а не утюги или стиральные машины. Если вам нужны холодильники и именно код холодильника указан в ShipmentPointCode, то почему бы не забить это в Range?
__________________
// no comments
Старый 20.08.2014, 00:20   #33  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Цитата:
Сообщение от smailik Посмотреть сообщение
буду бежать по заказам только на эти ShipmentPointCode.
.

А как Вы будете бежать по заказам, если ничего кроме одного поля Вы не выбираете ??
Собственно, это dech уже выше указал Вам.
Старый 20.08.2014, 18:45   #34  
smailik is offline
smailik
Участник
Аватар для smailik
 
250 / 70 (3) ++++
Регистрация: 10.04.2012
Адрес: Москва
Цитата:
Сообщение от dech Посмотреть сообщение
Тогда у меня к вам такие вопросы:
1. Нужно ли выбирать из SalesTable другие поля, помимо ShipmentPointCode?
2. Имеются ли записи в SalesTable с незаполненным ShipmentPointCode? Что вы собираетесь делать с набором записей, сгруппированных по пустому полю?
3. Я не совсем понимаю, что хранится в таблице RegistrationRefrigerationTable и как вы определяете, что нужный товар - это холодильники, а не утюги или стиральные машины. Если вам нужны холодильники и именно код холодильника указан в ShipmentPointCode, то почему бы не забить это в Range?
1. Нет других полей не надо выбирать.
2. В идеале с незаполненным ShipmentPointCode записей быть не должно, но могут и быть.
3. В таблице RegistrationRefrigerationTable указан марка модель, тип, инвентарный номер, ShipmentPointCode (точка доставки), дата установки, дата выбытия. Записи с незаполненным ShipmentPointCode исключены. При соединении SalesTable и RegistrationRefrigerationTable, записи из SalesTable с пустым ShipmentPointCode выбраться не должны.
Цитата:
Сообщение от user_ax Посмотреть сообщение
А как Вы будете бежать по заказам, если ничего кроме одного поля Вы не выбираете ??
Бегать собираюсь вот так
X++:
            // до этого момента query которая выдаст только ShipmentPointCode
            queryLocal = queryRun.query();

            qbds1 = queryLocal.dataSourceTable(tableNum(SalesTable));            
            qbds1.clearRange(fieldNum(SalesTable, ShippingDateRequested));
            qbds1.clearRange(fieldNum(SalesTable, ShipmentPointCode));
            qbds1.addRange(fieldNum(SalesTable, ShippingDateRequested)).value(strfmt("%1 .. %2", startDateLocal, endDateLocal));
            qbds1.addRange(fieldNum(SalesTable, ShipmentPointCode)).value(salesTable.ShipmentPointCode);

            queryRun = new QueryRun(queryLocal);
            while (queryRun.next())
            {
                // тыгыдым тыгыдым
            }
Теги
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, время: 23:02.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.