01.11.2012, 14:44 | #1 |
Участник
|
печать отчета из кода
Здравствуйте.
Код не работает для отчетов запускаемых из класса RunBaseReport ,но работает для обычных отчетов.(т.е у тех MenuItem отчета где ObjectType=Report а не Class) Пишет что SysReportRun Объект не инициализирован. Подскажите пжл что нужно сделать чтобы заработало. Спасибо. PHP код:
|
|
01.11.2012, 17:25 | #2 |
Участник
|
Сделать менюайтем непосредственно на Report.
Я так понимаю вы из кода хотите отчёт сразу послать на принтер без отображения пользователю диалога? Зачем же вам тогда вызывать класс RunBaseReport, который отвечает за диалог? Вызывайте сразу Report, только в args.caller() не забудьте положить проинициализированный нужными вам параметрами RunBaseReport. |
|
02.11.2012, 08:49 | #3 |
Участник
|
если не затруднит можно простой пример пжл.смущает то что мне нужно передавать таблицу в качестве параметра а не класс.
|
|
02.11.2012, 09:29 | #4 |
Участник
|
|
|
02.11.2012, 09:48 | #5 |
Участник
|
через временную таблицу
|
|
02.11.2012, 10:18 | #7 |
Участник
|
|
|
02.11.2012, 10:47 | #8 |
Участник
|
X++: public void init() { //InventPrintLabel2 InventPrintLabel2; ; super(); InventPrintLabel2 = element.args().caller(); if (!InventPrintLabel2) throw error(Error::missingRecord(funcName())); //if (element.args().parmEnum() == ReportDesigns::form1) if (InventPrintLabel2.parmReportDesignsId() == ReportDesigns::form1) this.design('ReportDesign1'); if (InventPrintLabel2.parmReportDesignsId() == ReportDesigns::form2) this.design('ReportDesign2'); InventPrintLabel2.queryRun().setRecord(InventPrintLabel2.initTmpInventPrintLabel()); } |
|
02.11.2012, 11:10 | #9 |
Участник
|
Супер. На сколько я понимаю InventPrintLabel2 - это как раз тот самый RunBaseReport, на который смотрит MenuItem. Так?
Метод initTmpInventPrintLabel() не просто возвращает временную таблицу, он её сам и формирует. Да? Вы же хотите подсунуть отчёту уже сформированную временную таблицу. Всё правильно? |
|
02.11.2012, 11:35 | #10 |
Участник
|
стандарт.да.
да. да. зы.нексколько отклонилисть от моего 1 поста. все-таки почему так работает (для отчета с RunBaseReport) X++: new menuFunction('InventPrintLabel',MenuItemType::Output).run(args);//--работает X++: reportRun = new menuFunction('InventPrintLabel',MenuItemType::Output).create(args);//--error reportRun.run(); для отчетов вызванных напрямую,т.е без RunBaseReport работают прекрасно оба способа. |
|
02.11.2012, 12:31 | #11 |
Участник
|
Если коротко, то из-за того что RunBase не является наследником ObjectRun.
MenuFunction.create() может создавать объекты только этой иерархии. Например FormRun или ReportRun. |
|
02.11.2012, 14:12 | #12 |
Участник
|
понятно.
видимо придется переписывать отчеты уже без RunBaseReport для получения посылке на печать сразу без диалогов. к сожалению. спасибо |
|
02.11.2012, 14:14 | #13 |
Участник
|
|
|
02.11.2012, 14:21 | #14 |
Участник
|
нет уже не принципиально сейчас.принципиально получить возможность посылки на печать отчета без диалогов и предварительного просмотра по галочке Интерактивно
|
|
02.11.2012, 14:51 | #15 |
Участник
|
В вашей ситуации я вижу следующий порядок действий:
1) Сделать наследник класса InventPrintLabel2, который вместо того чтобы самостоятельно заполнять данными временную таблицу, будет содержать метод для передачи ему уже готовой таблицы. Метод initTmpInventPrintLabel() наследника должен просто возвращать уже готовую таблицу. 2) Запускать отчёт напрямую без класса, а класс передавать в качестве параметра args.caller(). X++: Args args; SysReportRun reportRun; InventPrintLabel2_Child InventPrintLabel2; ; InventPrintLabel2 = new InventPrintLabel2_Child(); InventPrintLabel2.parmTable(InventPrintLabel); args.name(reportstr(MyReport)); args.caller(InventPrintLabel2) reportRun = ClassFactory.ReportRunClass(args); reportRun.query().interactive(false); reportRun.report().interactive(false); reportRun.setTarget(PrintMedium::Printer); reportRun.run(); |
|
02.11.2012, 15:35 | #16 |
Участник
|
этот код я уже это пробовал сразу после вашего 1 ответа -возвращает ту же ошибку о пустом репортрун.
наследовать класс смысла нет ,т.к метод initTmpInventPrintLabel уже возращает таблицу просто вызываш и все InventPrintLabel2.initTmpInventPrintLabel() вместо parmTable |
|
02.11.2012, 15:38 | #17 |
Участник
|
|
|
02.11.2012, 15:50 | #18 |
Участник
|
да
|
|
02.11.2012, 16:30 | #19 |
Участник
|
Странно всё это. А на какой строчке кода вываливается ошибка?
Вот этот джоб у вас cработает? X++: static void JobTestReportRunClass(Args _args) { Args args; SysReportRun reportRun; ; args = new args(); args.name(reportstr(MyReport)); reportRun = ClassFactory.ReportRunClass(args); info(reportRun.name()); } |
|
02.11.2012, 16:47 | #20 |
Участник
|
Цитата:
Стандартный вызов класса, связанного с пунктом меню, идет через статический метод main(). Но никто не мешает сделать, скажем, статический метод print() и вызывать именно его. Без "обертки" в виде пункта меню. X++: // Вызов args.record(InventPrintLabel); InventPrintLabel2_Child::print(args); // Примерное содержимое метода InventPrintLabel2_Child::print(args); static void print(Args _args) { printJobSettings printJobSettingsLocal; InventPrintLabel2_Child inventPrintLabel2_Child = new InventPrintLabel2_Child(); ; inventPrintLabel2_Child.makeReportRun(); printJobSettingsLocal = inventPrintLabel2_Child.reportRun().printJobSettings(); printJobSettingsLocal.setTarget(PrintMedium::Printer); inventPrintLabel2_Child.run(); } Ну, и 4 вариант - это передавать через args() признак того, что класс надо запускать без диалога. Т.е. метод main будет включать в себя то, что написано для print().
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|