25.09.2006, 12:25 | #1 |
Участник
|
super() 2 раза
Добрый день.
Возникла нужда распечатать один и тот же отчет 2 раза по нажатию одной кнопки. В классе отчета (наследник RunBasereport) выставляю ranges после чего вызываю super() - отчет печатается нормально. Дальше я в том же методе run ставлю другие ranges и снова вызываю super() - отчет не печатается вовсе. Нельзя так делать, да? Можно конечно класс 2 раза вызывать по кнопке (натыкав флаги в классе), но усложнять не хочется |
|
25.09.2006, 12:48 | #2 |
Участник
|
попробуйте сделай reset запроса (queryRun)
|
|
25.09.2006, 13:09 | #3 |
Участник
|
Не сработало.
Вообще, если при первом вызове супера попадаешь в Init отчета, то при повторном вызове Init вообще не вызывается, кидает сразу в ExecuteSection основоного набора данных отчета. |
|
25.09.2006, 13:13 | #4 |
Участник
|
|
|
25.09.2006, 13:22 | #5 |
Участник
|
ок, вызову его 2 раза. спасибо
|
|
25.09.2006, 15:44 | #6 |
Участник
|
совсем упустил из виду тот момент, что при двух вызовах класса, будет 2 раза вызываться и диалог с параметрами. 2 раза он не нужен, а вот параметры, которые пользователь вбивает в диалоге, нужны в обоих случаях. В первый раз они достаются стандартным getFromDialog, а как бы их во второй раз получить, не вызывая Prompt (а, следовательно, и unpack)? параметры подойдут те, которые были сохранены в первом вызове (включая настройки принтера). Может была у кого-нибудь подобная задача, посмотреть бы на код...
|
|
25.09.2006, 15:47 | #7 |
Участник
|
Вообще-то, в приведенной мной выше ссылке действие происходит в методе run класса, который вызывает отчет - соответственно диалог уже отработал и значения вернул.
а уже внутри мы делаем цикл (в вашем случае 2 раза). То есть диалог вызывается только 1 раз (это диалог класса). почитайте тот код, что я запостил. |
|
25.09.2006, 17:28 | #8 |
Участник
|
Прочитал, попробовал у себя, результат не порадовал.
rr.run(); - в этом месте вываливается промпт отчета (как если открть отчет в репозитарии напрямую), причем в нем нет ни одного значения ранее определнных рейнджей. Может пишу что не так? Сейчас приведу фрагмент.. |
|
25.09.2006, 17:34 | #9 |
Участник
|
Код, вызывающий отчет:
Код: ReportRun rr; Args args = new Args(reportStr(DamageActEx)); ; query = queryrun.query(); qbsPDT = query.dataSourceTable(tableNum(PriceDiscTable)); args.caller(this); qbsPDT.findRange(fieldNum(PriceDiscTable, FromDate)).value(queryValue(fromDate)); qbsPDT.findRange(fieldNum(PriceDiscTable, Relation)).value(queryValue(PriceType::LineDiscSales)); qbsPDT.findRange(fieldNum(PriceDiscTable, AccountRelation)).value(queryValue(accountRelation)); qbsPDT.addRange(fieldNum(PriceDiscTable, InventLocationId)).value(InventLocationId); qbsPDT.addRange(fieldNum(PriceDiscTable, ReDisc)).value(queryValue(NoYes::Yes)); //super(); rr = new ReportRun(args); rr.printJobSettings(this.printJobSettings().packPrintJobSettings()); rr.init(); rr.run(); |
|
25.09.2006, 17:34 | #10 |
Участник
|
поставь свойство interactive на отчете и на запросе в false
Если же отчет менять нельзя, попробуй перед rr.init() вставить Код: rr.report().interactive(false); rr.report().query().interactive(false); Последний раз редактировалось kashperuk; 25.09.2006 в 18:20. |
|
26.09.2006, 10:49 | #11 |
Участник
|
Убрал интерактивность - промт отчета пропал, хорошо. А вот рейнджи почему-то не пердались, в отчет попадает все
|
|
26.09.2006, 11:10 | #12 |
Участник
|
Все верно. Ты ведь меняешь запрос который в классе.
То есть тебе нужно: 1. Или менять непосредственно запрос отчета (код ниже) 2. Или менять код класса, а потом присваивать его запросу отчета rr.report().query(queryRun.query()) 3. Я обычно просто передаю параметр в отчет, а уже в нем меняю запрос в зависимости от переданного параметра. Цитата:
Сообщение от Smith
Код, вызывающий отчет:
Код: ReportRun rr; Args args = new Args(reportStr(DamageActEx)); ; args.caller(this); rr = new ReportRun(args); rr.printJobSettings(this.printJobSettings().packPrintJobSettings()); query = rr.report().query(); qbsPDT = query.dataSourceTable(tableNum(PriceDiscTable)); qbsPDT.findRange(fieldNum(PriceDiscTable, FromDate)).value(queryValue(fromDate)); qbsPDT.findRange(fieldNum(PriceDiscTable, Relation)).value(queryValue(PriceType::LineDiscSales)); qbsPDT.findRange(fieldNum(PriceDiscTable, AccountRelation)).value(queryValue(accountRelation)); qbsPDT.addRange(fieldNum(PriceDiscTable, InventLocationId)).value(InventLocationId); qbsPDT.addRange(fieldNum(PriceDiscTable, ReDisc)).value(queryValue(NoYes::Yes)); rr.report().interactive(false); rr.report().query().interactive(false); rr.init(); rr.run(); |
|
26.09.2006, 11:48 | #13 |
Участник
|
код не передал рейнджи
Я до этого попробовал передать параметр в отчет непосредственно и уже там эти рейнджи выставлять - так работает. Но, если б код выше сработал, было бы лучше. Он более нагляден. |
|
26.09.2006, 11:52 | #14 |
Участник
|
код не передал range потому что я напутал немного в нем. )
Простите. попробуйте спустить код, который получает запрос из отчета и устанавливает фильтры после rr.init() - запрос то формируется там. |
|
26.09.2006, 12:10 | #15 |
Дмитрий Ерин
|
У Русского офиса MBS была См. отчет Кассовая книга (+ Отчет кассира) - \Classes\RCashReport_CashBook
__________________
|
|
|
За это сообщение автора поблагодарили: Smith (1). |
26.09.2006, 12:19 | #16 |
Участник
|
Вот так запускал:
Код: ReportRun rr; Args args = new Args(reportStr(DamageActEx)); ; args.caller(this); rr = new ReportRun(args); rr.printJobSettings(this.printJobSettings().packPrintJobSettings()); rr.init(); query = rr.report().query(); qbsPDT = query.dataSourceTable(tableNum(PriceDiscTable)); qbsPDT.findRange(fieldNum(PriceDiscTable, FromDate)).value(queryValue(fromDate)); //ranges rr.run(); |
|
26.09.2006, 12:27 | #17 |
Участник
|
странно. Будет время на досуге, посмотрю, вообще должны бы.
а я смотрю вы используете findRange() - у вас все эти range добавлены в отчете в АОТ на запросе? |
|
|
За это сообщение автора поблагодарили: Smith (1). |
26.09.2006, 12:48 | #18 |
Участник
|
конечно
|
|
26.09.2006, 15:22 | #19 |
Участник
|
Все, сделал
спасибо, kashperuk, что столько тут со мной провозились И спасибо Ruff'у за ссылку, именно с нее и получился рабочий вариант. Выглядит так: Код: Query query; QueryBuildDataSource qbsPDT; ; //1 отчет query = queryrun.query(); qbsPDT = query.dataSourceTable(tableNum(PriceDiscTable)); qbsPDT.findRange(fieldNum(PriceDiscTable, FromDate)).value(queryValue(FromDate)); //ranges super(); //2 отчет reportRun = null; this.makeReportRun(this.lastValueElementName()); this.makeQueryRun(); query = queryrun.query(); qbsPDT = query.dataSourceTable(tableNum(PriceDiscTable)); //Новые рейнджи qbsPDT.findRange(fieldNum(PriceDiscTable, FromDate)).value(queryValue(newFromDate)); //ranges super(); |
|
Теги |
повторный запуск отчета |
|
|