![]() |
#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. я только начинаю работать с аксаптой, так что не судите строго. заранее благодарю, с уважением Александр. |
|
![]() |
#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)); |
|
![]() |
#3 |
Участник
|
Возможно? причина в том, что Вы пытаетесь использовать this.query()
а нужно this.queryRun().query() |
|
![]() |
#4 |
Программатор
|
Что за отчёт? Самописный или как?
|
|
![]() |
#5 |
Участник
|
спасибо
![]() |
|
![]() |
#6 |
Участник
|
вы имеете виду авто или генерируемый? если так, то генерируемый
|
|
![]() |
#7 |
Программатор
|
Я имею ввиду стандартный или нет.
qbr.value(queryValue(ljt.JournalNum)); не сокращает код, а просто так нужно. |
|
![]() |
#8 |
Участник
|
отчет, создавал я.
![]() Попробовал, ругается вот на что: qbr = q.dataSourceTable(tablenum(LedgerJournalTrans)).findOrCreateRange(fieldnum(LedgerJournalTrans, JournalNum)); findOrCreateRange - не может найти. q = this.queryRun().query(); говорит что QueryRun не инициализирован.... |
|
![]() |
#9 |
MCITP
|
![]() Цитата:
PS используйте Global::findOrCreateRange_RU()
__________________
Zhirenkov Vitaly |
|
![]() |
#10 |
Участник
|
|
|
![]() |
#11 |
MCITP
|
![]()
тогда sysQuery::findOrCreateRange()
![]()
__________________
Zhirenkov Vitaly |
|
![]() |
#12 |
MCITP
|
![]()
Правда все эти бантики не решают исходную проблему...
![]() А попробуйте всё-таки сделать это на ините датасорса, ничего не поменяется? Можно кстати включить SQL-трэйс и посмотреть уходящий запрос, чтоб убедиться, что запрос действительно не изменился, а то может он просто неправильно сформирован по каким-то другим причинам?
__________________
Zhirenkov Vitaly |
|
![]() |
#13 |
Участник
|
2 ZVV
да, я уже попробовал, как увидел ваше сообщение.. та же самая история... мне кажется, что я просто изменяю лишь копию, и потом не вношу изменения в оригинал, т.е. я беру объект "q = this.query();" ограничиваю рейнджами "q", но не вношу изменений в this как видите я пробовал уже this.query(q);(если честно я не знаю можно так или нет, просто инстинктивно написал) весь форум облазил, ничего не нашел, уже третий день бьюсь над этим... |
|
![]() |
#14 |
MCTS
|
а почему ljt.JournalNum, а не ledgerJournalTrans.JournalNum ? В же курсор из аргс получаете в ledgerJournalTrans, значит и значение для фильтра надо из него брать, а то получается скорее всего туда пустой фильтр уходит...
|
|
![]() |
#15 |
Участник
|
вы имеете виду LedgerJournalTrans = element.args().record(); - обьявление,
qbr.value(queryValue(LedgerJournalTrans.JournalNum)); обращение? если так, то так и было это для краткости было написано... извините что запутал... |
|
![]() |
#16 |
MCTS
|
Ааа, понятно
![]() X++: element.send(element.args().record()); return true; PS: в качесте шаманства, можно попробовать сбросить настройки пользователя : (Сервис Параметры Использование данных). Последний раз редактировалось Eldar9x; 19.12.2008 в 11:37. |
|
|
За это сообщение автора поблагодарили: Jorj (1), laxel (1). |
![]() |
#17 |
Участник
|
Цитата:
Сообщение от laxel
![]() 2 ZVV
да, я уже попробовал, как увидел ваше сообщение.. та же самая история... мне кажется, что я просто изменяю лишь копию, и потом не вношу изменения в оригинал, т.е. я беру объект "q = this.query();" ограничиваю рейнджами "q", но не вношу изменений в this как видите я пробовал уже this.query(q);(если честно я не знаю можно так или нет, просто инстинктивно написал) весь форум облазил, ничего не нашел, уже третий день бьюсь над этим... а и еще можно попробовать стереть данные, которые привязаны к вашему юзер айди, из таблицы SysLastValue Последний раз редактировалось DAX; 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 |
MCTS
|
Сбросьте настройки пользователя.
Происходит следующее, сначала вы запускаете отчет без кода в ините. Выводятся все строки. Потом добавляете ограничение в init и снова запускаете отчет, но только запрос теперь берется из сохраненный, и поэтому никакого эффекта. |
|
![]() |
#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 попробовал, таже самая история....... |
|