22.05.2011, 19:49 | #21 |
Участник
|
|
|
23.05.2011, 08:46 | #22 |
newborn in DAX
|
почему && и || ?это же запрос который идёт на SQL сервер. Там вроде как and и or надо.
и слэши обратные как -то не очень. SQL сервер ругается на такое "Incorrect syntax near '\01'." не нравится ему дата в таком виде |
|
23.05.2011, 08:51 | #23 |
Участник
|
Неа. Это запрос, который ещё будет постобработан аксаптой.
Вот такой код у меня выполняется без ошибок: 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 |
newborn in DAX
|
исходная дата приходит из календаря на форме
обратные слэши это после date2strxpp и после info(this.query().dataSourceTable(tableNum(mlm_TemporaryLeaveReport)).toString());и если я правильно понимаю должно быть and а не && т.е обратные слеши идут на SQL,а там их явно не ждали |
|
23.05.2011, 11:26 | #25 |
Участник
|
Нет. Ещё раз повторю, на самом деле текст запроса, который вы видите после info(this.query().dataSourceTable(tableNum(mlm_TemporaryLeaveReport)).toString()) ещё НЕ является окончательным вариантом SQL запроса. Аксапта его ещё будет обрабатывать. Сама заменит && и || на AND и OR и сконвертирует формат даты.
|
|
|
За это сообщение автора поблагодарили: timaluhs (1). |
23.05.2011, 11:52 | #26 |
newborn in DAX
|
Спасибо за помощь. Заработало.
Я можно ещё вопросик? А как посчитать HeadCounter (сколько строк высветилось после запроса)? |
|
23.05.2011, 11:59 | #27 |
Участник
|
Цитата:
Вот тут почитайте Количество строк в Query |
|
23.05.2011, 12:16 | #28 |
Ищущий знания...
|
Цитата:
Сообщение от S.Kuskov
Вам это нужно знать уже после того как запрос выполниться или до этого? Если после, то не вижу ничего проще чем завести переменную-счётчик и наращивать его значение по мере их вывода. Если же информация о количестве строк вам нужно до основного запроса, то тогда придётся предварительно выполнить вспомогательный запрос. Поможет вам в этом метод SysQuery::countTotal
Вот тут почитайте Количество строк в Query Я обычно пользуюсь методом SysQuery::countLoop();
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
23.05.2011, 12:23 | #29 |
Участник
|
К примеру.
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 |
newborn in DAX
|
Цитата:
пока не очень понятно какое query будет в SysQuery::countTotal(query ) DataSource один, куча фильтров. Почитать надо после того как показан результат. Т.е. в надо дописать в executeQuery попробую разобраться с сылкой. Спасибо |
|
23.05.2011, 13:06 | #31 |
Участник
|
Метод SysQuery::countLoops() в отличии от SysQuery::countTotal действительно возвращает именно количество итераций, а не количество строк. Но какой ценой достигается такой результат. Для подсчёта числа шагов выполняется лишний прогон цикла. Просто помните об этом.
Как правило countLoops используют для того чтобы узнать количество групп в запросе с группировкой. Обычно эта информация нужна для визуализации прогрессбара. Я в таких случаях пренебрегаю плавностью движения заветной полоски. В качестве "длины" прогрессбара использую countTotal и соответственно инкремент делаю на величину count(RecId) по группе. |
|
23.05.2011, 13:12 | #32 |
Участник
|
|
|
23.05.2011, 13:20 | #33 |
Ищущий знания...
|
Цитата:
Сообщение от S.Kuskov
Метод SysQuery::countLoops() в отличии от SysQuery::countTotal действительно возвращает именно количество итераций, а не количество строк. Но какой ценой достигается такой результат. Для подсчёта числа шагов выполняется лишний прогон цикла. Просто помните об этом.
Как правило countLoops используют для того чтобы узнать количество групп в запросе с группировкой. Обычно эта информация нужна для визуализации прогрессбара. Я в таких случаях пренебрегаю плавностью движения заветной полоски. В качестве "длины" прогрессбара использую countTotal и соответственно инкремент делаю на величину count(RecId) по группе. Т.е. общее кол-во строк (итераций) не показываю P.S. извиняюсь за офтопик, это уже к теме не относится :-[
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем Последний раз редактировалось lev; 23.05.2011 в 13:21. Причина: добавил P.S. |
|
23.05.2011, 13:41 | #34 |
Участник
|
Цитата:
К текущему QueryRun источника данных можно обратиться через переменную с имененм <MyDataSource>_qr, где <MyDataSource> - это имя вашего источника данных, а _qr - это суфикс, приписав который вы получите имя переменной указывающей на соответствующий QueryRun (такие имена переменных стандартно присутствуют на всех формах). Либо просто <MyDataSource>.QueryRun() Рассчитать количество действительно можно в методе executeQuery. Результат можно отобразить на форме при помощи unbound control. Чтобы получить из кода доступ к свойствам элемента управления, у этого элемента управления нужно включить свойство AutoDeclaration. Тогда он будет доступен в коде по своему имени. |
|
23.05.2011, 16:22 | #35 |
newborn in DAX
|
|
|
23.05.2011, 16:28 | #36 |
Участник
|
Ага. Можно и через display-метод. Только сдаётся мне, что display-метод может вызываться чаще чем ExecuteQuery.
|
|
24.05.2011, 09:08 | #37 |
newborn in DAX
|
|
|
24.05.2011, 09:17 | #38 |
Участник
|
Потому что executeQuery вызывается только в случае изменения параметров запроса. Именно в этот момент число выбранных записей может измениться. Например когда вы накладываете новый фильтр или убираете старый.
display-метод вызывается всякий раз, когда есть необходимость перерисовки содержимого окна. Например вы свернули и развернули окно. Это просто буде чуть больше нагружать систему. Т.е. это уже вопрос оптимизации. |
|
24.05.2011, 10:45 | #39 |
newborn in DAX
|
Что Вы подразумеваете под 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 |
Ищущий знания...
|
Цитата:
Сообщение от 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." X++: RowCount1 = SysQuery::countTotal(this.queryRun());
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
Теги |
query, querybuildrange, range, фильтр |
|
|