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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.05.2011, 19:49   #21  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от timaluhs Посмотреть сообщение
теперь SQL вообще какой-то кривой
Что именно вам не нравится? Если вы про пару лишних внешних скобок, то это нормаьлно

Ещё. Вместо AND и OR используйте && и || соответственно.
Старый 23.05.2011, 08:46   #22  
timaluhs is offline
timaluhs
newborn in DAX
Аватар для timaluhs
 
102 / 10 (1) +
Регистрация: 16.12.2010
Адрес: Израиль
почему && и || ?это же запрос который идёт на SQL сервер. Там вроде как and и or надо.
и слэши обратные как -то не очень. SQL сервер ругается на такое
"Incorrect syntax near '\01'."
не нравится ему дата в таком виде
Старый 23.05.2011, 08:51   #23  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от timaluhs Посмотреть сообщение
это же запрос который идёт на SQL сервер
Неа. Это запрос, который ещё будет постобработан аксаптой.

Вот такой код у меня выполняется без ошибок:
X++:
static void JobTestExpressionsInQueryRanges(Args _args)
{
    InventTrans InventTrans;
    fromDate fromDate   = 03\05\2011;
    toDate  toDate      = 04\05\2011;

    Query q;
    QueryBuildDataSource qbdsInventTrans;
    QueryRun qr;
    ;
    q = new Query();
    qbdsInventTrans = q.addDataSource(tableNum(InventTrans));
    qbdsInventTrans.addRange(fieldNum(InventTrans, RecId)).value(
        strfmt("(((%1.%2 >= %4) && (%1.%2 <= %5)) || ((%1.%3 >= %4) && (%1.%3 <= %5)))" ,
            qbdsInventTrans.name(),
            fieldStr(InventTrans, DatePhysical),
            fieldStr(InventTrans, DateFinancial),
            Date2StrXpp(fromDate),
            Date2StrXpp(toDate)
        ));

    info(qbdsInventTrans.toString());

    qr = new QueryRun(q);
    while (qr.next())
    {
        InventTrans = qr.get(tableNum(InventTrans));
        info(InventTrans.ItemId);
        break;
    }

    info(".");
}
Обратите внимание на то, что имя таблицы, а точнее имя источника данных, в данном запросе (в условии участвует поля из одной и той же таблицы) можно было не указывать, но в общем случае его указывать нужно.
Впрочем этот нюанс и многие другие описаны в статье по ссылке, которую я приводил выше

Последний раз редактировалось S.Kuskov; 23.05.2011 в 09:43.
Старый 23.05.2011, 10:51   #24  
timaluhs is offline
timaluhs
newborn in DAX
Аватар для timaluhs
 
102 / 10 (1) +
Регистрация: 16.12.2010
Адрес: Израиль
исходная дата приходит из календаря на форме
обратные слэши это после date2strxpp и
после info(this.query().dataSourceTable(tableNum(mlm_TemporaryLeaveReport)).toString());и если я правильно понимаю должно быть and а не &&
т.е обратные слеши идут на SQL,а там их явно не ждали
Старый 23.05.2011, 11:26   #25  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от timaluhs Посмотреть сообщение
если я правильно понимаю должно быть and а не &&
т.е обратные слеши идут на SQL
Нет. Ещё раз повторю, на самом деле текст запроса, который вы видите после info(this.query().dataSourceTable(tableNum(mlm_TemporaryLeaveReport)).toString()) ещё НЕ является окончательным вариантом SQL запроса. Аксапта его ещё будет обрабатывать. Сама заменит && и || на AND и OR и сконвертирует формат даты.
За это сообщение автора поблагодарили: timaluhs (1).
Старый 23.05.2011, 11:52   #26  
timaluhs is offline
timaluhs
newborn in DAX
Аватар для timaluhs
 
102 / 10 (1) +
Регистрация: 16.12.2010
Адрес: Израиль
Спасибо за помощь. Заработало.
Я можно ещё вопросик? А как посчитать HeadCounter (сколько строк высветилось после запроса)?
Старый 23.05.2011, 11:59   #27  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от timaluhs Посмотреть сообщение
Спасибо за помощь. Заработало.
Я можно ещё вопросик? А как посчитать HeadCounter (сколько строк высветилось после запроса)?
Вам это нужно знать уже после того как запрос выполниться или до этого? Если после, то не вижу ничего проще чем завести переменную-счётчик и наращивать его значение по мере их вывода. Если же информация о количестве строк вам нужно до основного запроса, то тогда придётся предварительно выполнить вспомогательный запрос. Поможет вам в этом метод SysQuery::countTotal
Вот тут почитайте Количество строк в Query
Старый 23.05.2011, 12:16   #28  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Вам это нужно знать уже после того как запрос выполниться или до этого? Если после, то не вижу ничего проще чем завести переменную-счётчик и наращивать его значение по мере их вывода. Если же информация о количестве строк вам нужно до основного запроса, то тогда придётся предварительно выполнить вспомогательный запрос. Поможет вам в этом метод SysQuery::countTotal
Вот тут почитайте Количество строк в Query
если я правильно помню, то метод countTotal не очень корректно возвращает число строк если в запросе больше одного датасорса.
Я обычно пользуюсь методом SysQuery::countLoop();
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 23.05.2011, 12:23   #29  
nix0root is offline
nix0root
Участник
 
67 / 16 (1) ++
Регистрация: 17.03.2009
Адрес: МО
К примеру.

X++:
            qbrEmployDate.value(   '(EmplTable.PayEmploymentDate_RU != '+date2StrXpp(datenull())+')'
                                  +'&&'
                                  +'(EmplTable.PayEmploymentDate_RU <= '+date2StrXpp(systemdateget())+')'
                               );
            qbrResignDate.value(   '(EmplTable.PayResignedDate_RU !='+date2StrXpp(datenull())+')'
                                  +'&&'
                                  +'(EmplTable.PayResignedDate_RU < '+date2StrXpp(systemdateget())+')');
__________________
В подводной охоте главное вдох ...
Старый 23.05.2011, 12:51   #30  
timaluhs is offline
timaluhs
newborn in DAX
Аватар для timaluhs
 
102 / 10 (1) +
Регистрация: 16.12.2010
Адрес: Израиль
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Если после, то не вижу ничего проще чем завести переменную-счётчик и наращивать его значение по мере их вывода.
меня к сожалению кинули в axapta без всякого предварительного ознакомления, так потихонечку на ощупь с помощью форума и продвигаюсь.
пока не очень понятно какое query будет в SysQuery::countTotal(query )
DataSource один, куча фильтров. Почитать надо после того как показан результат. Т.е. в надо дописать в executeQuery
попробую разобраться с сылкой. Спасибо
Старый 23.05.2011, 13:06   #31  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от lev Посмотреть сообщение
Я обычно пользуюсь методом SysQuery::countLoop();
Метод SysQuery::countLoops() в отличии от SysQuery::countTotal действительно возвращает именно количество итераций, а не количество строк. Но какой ценой достигается такой результат. Для подсчёта числа шагов выполняется лишний прогон цикла. Просто помните об этом.
Как правило countLoops используют для того чтобы узнать количество групп в запросе с группировкой. Обычно эта информация нужна для визуализации прогрессбара. Я в таких случаях пренебрегаю плавностью движения заветной полоски. В качестве "длины" прогрессбара использую countTotal и соответственно инкремент делаю на величину count(RecId) по группе.
Старый 23.05.2011, 13:12   #32  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от timaluhs Посмотреть сообщение
Т.е. в надо дописать в executeQuery
Так. Стоп. Я почему-то на автомате подумал что запрос вы делаете для вывода отчёта. Но теперь понимаю, что это запрос для отображения его на форме. Тогда конечно с переменной-счётчиком я погорячился
Старый 23.05.2011, 13:20   #33  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Метод SysQuery::countLoops() в отличии от SysQuery::countTotal действительно возвращает именно количество итераций, а не количество строк. Но какой ценой достигается такой результат. Для подсчёта числа шагов выполняется лишний прогон цикла. Просто помните об этом.
Как правило countLoops используют для того чтобы узнать количество групп в запросе с группировкой. Обычно эта информация нужна для визуализации прогрессбара. Я в таких случаях пренебрегаю плавностью движения заветной полоски. В качестве "длины" прогрессбара использую countTotal и соответственно инкремент делаю на величину count(RecId) по группе.
когда я знаю что запрос "тяжелый" и что лишние тело движения увеличат время работы операции, я вообще пренебрегаю красотой прогресс бара, и просто вывожу туда что типа:"Выполняется операция. Обработано %1 строк".
Т.е. общее кол-во строк (итераций) не показываю

P.S. извиняюсь за офтопик, это уже к теме не относится :-[
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем

Последний раз редактировалось lev; 23.05.2011 в 13:21. Причина: добавил P.S.
Старый 23.05.2011, 13:41   #34  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от timaluhs Посмотреть сообщение
пока не очень понятно какое query будет в SysQuery::countTotal(query )
DataSource один, куча фильтров.
В countTotal нужно передавать не Query, а QueryRun.

К текущему QueryRun источника данных можно обратиться через переменную с имененм <MyDataSource>_qr, где <MyDataSource> - это имя вашего источника данных, а _qr - это суфикс, приписав который вы получите имя переменной указывающей на соответствующий QueryRun (такие имена переменных стандартно присутствуют на всех формах). Либо просто <MyDataSource>.QueryRun()

Рассчитать количество действительно можно в методе executeQuery.

Результат можно отобразить на форме при помощи unbound control. Чтобы получить из кода доступ к свойствам элемента управления, у этого элемента управления нужно включить свойство AutoDeclaration. Тогда он будет доступен в коде по своему имени.
Старый 23.05.2011, 16:22   #35  
timaluhs is offline
timaluhs
newborn in DAX
Аватар для timaluhs
 
102 / 10 (1) +
Регистрация: 16.12.2010
Адрес: Израиль
вот наткнулась
работает

Кол-во выделенных строк в Grid
Старый 23.05.2011, 16:28   #36  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Ага. Можно и через display-метод. Только сдаётся мне, что display-метод может вызываться чаще чем ExecuteQuery.
Старый 24.05.2011, 09:08   #37  
timaluhs is offline
timaluhs
newborn in DAX
Аватар для timaluhs
 
102 / 10 (1) +
Регистрация: 16.12.2010
Адрес: Израиль
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Ага. Можно и через display-метод. Только сдаётся мне, что display-метод может вызываться чаще чем ExecuteQuery.
А почему чаще? и чем это может быть плохо или хорошо? где подводные камни расставлены?
Старый 24.05.2011, 09:17   #38  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от timaluhs Посмотреть сообщение
А почему чаще?
Потому что executeQuery вызывается только в случае изменения параметров запроса. Именно в этот момент число выбранных записей может измениться. Например когда вы накладываете новый фильтр или убираете старый.
display-метод вызывается всякий раз, когда есть необходимость перерисовки содержимого окна. Например вы свернули и развернули окно.
Цитата:
Сообщение от timaluhs Посмотреть сообщение
и чем это может быть плохо или хорошо?
Это просто буде чуть больше нагружать систему. Т.е. это уже вопрос оптимизации.
Старый 24.05.2011, 10:45   #39  
timaluhs is offline
timaluhs
newborn in DAX
Аватар для timaluhs
 
102 / 10 (1) +
Регистрация: 16.12.2010
Адрес: Израиль
Что Вы подразумеваете под unbound control?
На форме определила IntEdit control. Autodecalration Yes , name RowCount1 . Eщё что-то?
В executeQuery
RowCount1 = SysQuery::countTotal( mlm_TemporaryLeaveReport_qr);
ругается :"Operand types are not compatible with the operator."

а если
RowCount1 = SysQuery::countTotal( mlm_TemporaryLeaveReport. QueryRun());
ругается :"The table mlm_TemporaryLeaveReport does not contain this function."
Старый 24.05.2011, 10:59   #40  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от timaluhs Посмотреть сообщение
Что Вы подразумеваете под unbound control?
На форме определила IntEdit control. Autodecalration Yes , name RowCount1 . Eщё что-то?
В executeQuery
RowCount1 = SysQuery::countTotal( mlm_TemporaryLeaveReport_qr);
ругается :"Operand types are not compatible with the operator."

а если
RowCount1 = SysQuery::countTotal( mlm_TemporaryLeaveReport. QueryRun());
ругается :"The table mlm_TemporaryLeaveReport does not contain this function."
в методе ExecuteQuery после super() напишите:
X++:
RowCount1 = SysQuery::countTotal(this.queryRun());
у меня работает
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Теги
query, querybuildrange, range, фильтр

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как правильно хранить статичный набор начальных данных в классах? mazzy DAX: Программирование 58 14.04.2011 12:10
Статистика по каждому коду номенклатуры. Как правильно построить Query? dynamax DAX: Программирование 17 14.10.2009 11:27
ERP-BLOG: Axapta, фильтр по сетке Blog bot DAX Blogs 26 05.02.2009 15:56
Исполнить сформированный фильтр radya DAX: Программирование 14 26.07.2007 20:47
Как правильно построить Query Bukovka DAX: Программирование 0 25.03.2004 11:55
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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