19.12.2008, 09:54 | #1 |
Участник
|
Фильтрация отчета.
Доброго времени суток, уважаемые программисты.
Сразу к делу ). задача состоит в том чтоб отфильтровать отчет, у которого в боди находится только одна строчка (активная на гриде) и фильтруется она по номеру журнала и строке. Я пытался сделать так: public void init() { Query q; QueryRun qr; QueryBuildDatasource qbds; QueryBuildRange qbr,qbr1; ; super(); q = this.query(); ledgerJournalTrans = element.args().record(); qbr = q.dataSourceTable(tablenum(LedgerJournalTrans)).findRange(fieldnum(LedgerJournalTrans, JournalNum)); if(!qbr)qbr = q.dataSourceTable(tablenum(LedgerJournalTrans)).addRange(fieldnum(LedgerJournalTrans, JournalNum)); qbr.value(ljt.JournalNum); qbr1 = q.dataSourceTable(tablenum(LedgerJournalTrans)).findRange(fieldnum(LedgerJournalTrans, AccountNum)); if(!qbr1)qbr1 = q.dataSourceTable(tablenum(LedgerJournalTrans)).addRange(fieldnum(LedgerJournalTrans, AccountNum)); qbr1.value(ljt.AccountNum); //this.query(q); //element.query(q); } отчет ни как не реагирует, выводит все подряд. может я не там вобще делаю (init самого отчета). направте на путь истиный ) p.s. я только начинаю работать с аксаптой, так что не судите строго. заранее благодарю, с уважением Александр. |
|
19.12.2008, 09:59 | #2 |
Программатор
|
Судить будем
вместо qbr = q.dataSourceTable(tablenum(LedgerJournalTrans)).findRange(fieldnum(LedgerJournalTrans, JournalNum)); if(!qbr)qbr = q.dataSourceTable(tablenum(LedgerJournalTrans)).addRange(fieldnum(LedgerJournalTrans, JournalNum)); юзайте qbr = q.dataSourceTable(tablenum(LedgerJournalTrans)).findOrCreateRange(fieldnum(LedgerJournalTrans, JournalNum)); qbr.value(ljt.JournalNum); заменить на qbr.value(queryValue(ljt.JournalNum)); |
|
19.12.2008, 10:06 | #3 |
Участник
|
Возможно? причина в том, что Вы пытаетесь использовать this.query()
а нужно this.queryRun().query() |
|
19.12.2008, 10:14 | #4 |
Программатор
|
Что за отчёт? Самописный или как?
|
|
19.12.2008, 10:23 | #5 |
Участник
|
спасибо на сколько я понимаю, это просто сокращает код..
|
|
19.12.2008, 10:25 | #6 |
Участник
|
вы имеете виду авто или генерируемый? если так, то генерируемый
|
|
19.12.2008, 10:26 | #7 |
Программатор
|
Я имею ввиду стандартный или нет.
qbr.value(queryValue(ljt.JournalNum)); не сокращает код, а просто так нужно. |
|
19.12.2008, 10:39 | #8 |
Участник
|
отчет, создавал я.
Попробовал, ругается вот на что: qbr = q.dataSourceTable(tablenum(LedgerJournalTrans)).findOrCreateRange(fieldnum(LedgerJournalTrans, JournalNum)); findOrCreateRange - не может найти. q = this.queryRun().query(); говорит что QueryRun не инициализирован.... |
|
19.12.2008, 10:44 | #9 |
MCITP
|
Цитата:
PS используйте Global::findOrCreateRange_RU()
__________________
Zhirenkov Vitaly |
|
19.12.2008, 10:53 | #10 |
Участник
|
|
|
19.12.2008, 10:53 | #11 |
MCITP
|
тогда sysQuery::findOrCreateRange()
__________________
Zhirenkov Vitaly |
|
19.12.2008, 11:01 | #12 |
MCITP
|
Правда все эти бантики не решают исходную проблему...
А попробуйте всё-таки сделать это на ините датасорса, ничего не поменяется? Можно кстати включить SQL-трэйс и посмотреть уходящий запрос, чтоб убедиться, что запрос действительно не изменился, а то может он просто неправильно сформирован по каким-то другим причинам?
__________________
Zhirenkov Vitaly |
|
19.12.2008, 11:14 | #13 |
Участник
|
2 ZVV
да, я уже попробовал, как увидел ваше сообщение.. та же самая история... мне кажется, что я просто изменяю лишь копию, и потом не вношу изменения в оригинал, т.е. я беру объект "q = this.query();" ограничиваю рейнджами "q", но не вношу изменений в this как видите я пробовал уже this.query(q);(если честно я не знаю можно так или нет, просто инстинктивно написал) весь форум облазил, ничего не нашел, уже третий день бьюсь над этим... |
|
19.12.2008, 11:18 | #14 |
MCTS
|
а почему ljt.JournalNum, а не ledgerJournalTrans.JournalNum ? В же курсор из аргс получаете в ledgerJournalTrans, значит и значение для фильтра надо из него брать, а то получается скорее всего туда пустой фильтр уходит...
|
|
19.12.2008, 11:25 | #15 |
Участник
|
вы имеете виду LedgerJournalTrans = element.args().record(); - обьявление,
qbr.value(queryValue(LedgerJournalTrans.JournalNum)); обращение? если так, то так и было это для краткости было написано... извините что запутал... |
|
19.12.2008, 11:30 | #16 |
MCTS
|
Ааа, понятно . Попробуйте, перекрыть fetch:
X++: element.send(element.args().record()); return true; PS: в качесте шаманства, можно попробовать сбросить настройки пользователя : (Сервис Параметры Использование данных). Последний раз редактировалось Eldar9x; 19.12.2008 в 11:37. |
|
|
За это сообщение автора поблагодарили: Jorj (1), laxel (1). |
19.12.2008, 11:37 | #17 |
Участник
|
Цитата:
Сообщение от laxel
2 ZVV
да, я уже попробовал, как увидел ваше сообщение.. та же самая история... мне кажется, что я просто изменяю лишь копию, и потом не вношу изменения в оригинал, т.е. я беру объект "q = this.query();" ограничиваю рейнджами "q", но не вношу изменений в this как видите я пробовал уже this.query(q);(если честно я не знаю можно так или нет, просто инстинктивно написал) весь форум облазил, ничего не нашел, уже третий день бьюсь над этим... а и еще можно попробовать стереть данные, которые привязаны к вашему юзер айди, из таблицы SysLastValue Последний раз редактировалось DAX; 19.12.2008 в 11:40. |
|
19.12.2008, 11:40 | #18 |
MCITP
|
не знаю, не знаю...
у меня всё работает, сделал просто пример: отчёт, один датасорс LedgerTable инит отчёта: X++: public void init() { Query q; QueryBuildDatasource qbds; QueryBuildRange qbr; ; super(); q = this.query(); qbds = q.dataSourceTable(tablenum(LedgerTable)); qbr = sysQuery::findOrCreateRange(qbds,fieldnum(LedgerTable, AccountNum)); qbr.value(QueryValue('01.00.0.0')); } (3.0.сп3 кр3) Вывод - вы наверное чего-то не договариваете, что-то у вас в отчёте ещё есть, влияющее на данное поведение. Можете вложить в сообщение экспортный файл своего отчёта - можно будет глянуть..
__________________
Zhirenkov Vitaly |
|
19.12.2008, 11:48 | #19 |
MCTS
|
Сбросьте настройки пользователя.
Происходит следующее, сначала вы запускаете отчет без кода в ините. Выводятся все строки. Потом добавляете ограничение в init и снова запускаете отчет, но только запрос теперь берется из сохраненный, и поэтому никакого эффекта. |
|
19.12.2008, 11:52 | #20 |
Участник
|
попробовал...
public boolean fetch() { element.send(element.args().record()); return true; } вот так //------------------------------------ public boolean fetch() { boolean ret; ret = super(); element.send(element.args().record()); ret = true; return ret; } и вот так... //----------------------------------------- public boolean fetch() { boolean ret; element.send(element.args().record()); ret = super(); ret = true; return ret; } и вот так... не получается... вставил info(info (strfmt('%1 %2', LedgerJournalTrans.JournalNum, LedgerJournalTrans.Voucher)); выводит те самые данные по которым должен быть фильтр.... 2 DAX попробовал, таже самая история....... |
|