08.02.2007, 11:07 | #1 |
Участник
|
Отчет с программной установкой Range в диалоге
Задача: открыть отчет, причем чтобы в диалоге стояли значения выборки полученные программно (Филиал). причем надо чтобы пользователь мог добавить новые условия.
Делаю так: в методах отчета создал Init() X++: QueryBuildRange qbr; super(); qbr = this.query().datasourceNo(1).addRange(FieldId2Ext(fieldNum(ProjProposalJour, Dimension),1)); qbr.value('Ак-ф'); |
|
08.02.2007, 11:20 | #2 |
Moderator
|
У QueryBuildDataSource есть метод clearRanges(), не поможет?
|
|
08.02.2007, 12:31 | #3 |
Участник
|
пробовал, но не получается
X++: public void init() { Query q; QueryBuildDataSource qbds; QueryBuildRange qbr; super(); q = this.Query(); qbds = q.dataSourceTable(tablenum(ProjProposalJour)); qbds.clearRanges(); qbr = this.query().datasourceNo(1).addRange(FieldId2Ext(fieldNum(ProjProposalJour, Dimension),1)); qbr.value('Ат-ф'); |
|
08.02.2007, 13:15 | #4 |
Участник
|
Возможно в отчёте восстанавливаются значения из QueryRun.
Попробуйте q = this.QueryRun().Query(); if (! q) q = this.Query(); Только тогда возможно не в методе init() нужно устанавливать фильтр. |
|
08.02.2007, 13:27 | #5 |
Участник
|
Если имеется ввиду значения в стандартной форме запроса (SysQueryForm), то она вызывается после init отчета (не совсем так, но для вашего вопроса в первом приближении подойдет). При её открытии считываются сохраненные настройки (которые переписывают то, что вы сделали в init).
Если вам не нужны эти настройки, то попробуете перекрыть на Query отчета метод SaveUserSetup, вернув в нем false, в этом случае сохраненные считываться не будут |
|
08.02.2007, 13:28 | #6 |
Banned
|
Скорее всего, у вас не вовремя вызывается .getLast(). Вызовите runBaseReport.getLast() принудительно до .prompt() и потом сразу измените query.
|
|
08.02.2007, 14:37 | #7 |
Участник
|
Вариант Kolja мне не подходит, Raven Melancholic тоже не катит я поставил точку останова в методе saveUserSetup так она вообще не срабатывает. Вариант EVGL я честно говоря не понял (опыта маловато).
Проблема еще в том что если запускать отчет через MenuItem то в диалоге стоят значения прошлого запроса, независимо от того что у меня в Init и что возвращает saveUserSetup, а если открывать отчет без MenuItem то Range в Init работает. |
|
08.02.2007, 15:25 | #8 |
Участник
|
а MenuItem случайно не класс вызывает?
Если класс, то вы не там правите. Диалог отображается в методе prompt() - класса или отчета. (смотря что вызывается). При этом считываются настройки пользователя для этого отчета. Поэтому во втором случае все срабатывает - а в первом (если таки через класс) - нет. Меняйте запрос в классе. |
|
08.02.2007, 15:51 | #9 |
Участник
|
Если я правильно понял вопрос - вам надо перекрыть метод unpack() в классе (если это еще не сделано) и сделать что-то типа этого
X++: public boolean unpack(container packedClass) { container _base; boolean _ret; Integer _version = runbase::getVersion(packedClass); Query query; switch (_version) { case #CurrentVersion: // если надо для вашего диалога --> [_version, #CurrentList, _base] = packedClass; // <-- _ret = super(_base); // Измение условий для запроса --> if (this.queryRun() && this.queryRun().query()) { query = this.queryRun().query(); query.dataSourceNo(1).clearRanges(); // добавление нужных рейнжей и условий } // <-- break; default: _ret = false; } return _ret; }
__________________
Axapta v.3.0 sp5 kr2 |
|
09.02.2007, 08:01 | #10 |
Участник
|
MenuItem вызывает сразу отчет, попробую вызывать класс и применить данные советы. Большое всем спасибо
|
|