30.12.2010, 15:17 | #1 |
Участник
|
В Стандартной АХ2009 не работает кнопка <Параметры> на диалоге класса унаследованного от RunBaseReport
Создаете класс от RunBaseReport. Временную таблицу. Создайте простенький отчет на базе этой временной таблицы. В методе Run класса заполните эту таблицу. И передайте отчету через queryRun.setRecord(tmpTable); reportRun.queryRun(queryRun);
Запустите класс. В появившемся диалоге есть кнопка <Параметры>. Нажмите ее и в открывшейся форме выберете какие-нибудь все возможные параметры на ней: "Канал вывода", Ориентация и т.д.(запомните их в уме). Нажмите ОК. Посмотрите сработали ли ваши параметры. И Запустите класс снова. Снова зайдите в кнопку <Параметры>. По идее все параметры должны сохраниться. Да, в форме они все те, какие вы установили в первый раз. Теперь поменяйте их на другие и запустите отчет. Отчет выйдет с первоначальными параметрами. И теперь сколько бы вы раз не запускали этот отчет, какие бы вы параметры не выбирали по кнопке <Параметры> у вас навсегда останутся первоначальные. Кому лень создавать прикрепляю проект. Можете убедиться. В классе RunBaseReport в методе Unpack() везде после X++: if (isSwappedFromServer) { printJobSettings = SysPrintOptions::newPrintJobSettingsOnServer(packedPrintJobSettings); } else { printJobSettings = new PrintJobSettings(packedPrintJobSettings); } и в методе Pack() перед if (xGlobal::hasClient()) надо поставить this.makePrintJobSettings(); заработает корректно. AX2009 Roll 6. Желаю всем удачи в такой Красивой, Удобной, Защищенной, Скоростной системе. И всех с Новым Годом. |
|
30.12.2010, 15:45 | #2 |
Administrator
|
ОФФ:
Не... надо так: АХ 2009 - это Красивая Автоматизированная Защищенная Удобная Скоростная система На правах предновогодней шутки С Новым годом!
__________________
Возможно сделать все. Вопрос времени |
|
31.03.2011, 19:43 | #3 |
Участник
|
Приведенное решение - это борьба со следствием, а не с причиной. Тем более, что выбор цели не отображается в диалоговой форме RunBaseReport и пользователь вынужден нажимать Ok, в надежде, что выбор где-то там сохранился.
Причина проблемы кроется в методе \Classes\RunBaseReportDialog\main Там предварительно сделан вызов reportRun.prompt(). Таким образом, последующие настройки printJobSettings будут сделаны в кеше reportRun (отчета), а не в кеше RunBaseReport (класса). Собственно, "лечение" заключается в том, чтобы просто передать настройки сделанные для ReportRun в настройки для RunBaseReport. Т.е. необходимо изменить код метода \Classes\RunBaseReportDialog\main следующим образом X++: static void main(Args args) { RunBaseReportDialog reportDialog = new RunBaseReportDialog(args.caller()); RunBaseReport runBaseReport = args.caller().runbase(); ReportRun reportRun = runBaseReport.reportRun(); Report report = reportRun.report(); boolean oldInteractive; boolean res; Dialog dialog; // 31.03.2011, Maksi --> PrintJobSettings printJobSettingsRunBase; PrintJobSettings printJobSettingsReportRun; // 31.03.2011, Maksi <-- ; // We must invoke the SysPrintForm via the report object so that we honor an prompt overrides. oldInteractive = report.interactive(); report.interactive(true); res = reportRun.prompt(); report.interactive(oldInteractive); if (!res) return; // 31.03.2011, Maksi --> // Перенос сделанного выбора из ReportRun в RunBaseReport printJobSettingsReportRun = reportRun.printJobSettings(); printJobSettingsRunBase = runBaseReport.printJobSettings(); printJobSettingsRunBase.unpackPrintJobSettings(printJobSettingsReportRun.packPrintJobSettings()); // 31.03.2011, Maksi <-- dialog = Dialog::getDialogFromCaller(args.caller()); if (dialog) { dialog.updateServer(); } runBaseReport.dialogUpdatePrinterSettings(dialog); reportDialog.run(); } PS: Модификации методов pack/unpack в классе RunBaseReport для решения данной проблемы - не нужна |
|
|
За это сообщение автора поблагодарили: mazzy (2), Pustik (2). |
11.05.2011, 19:47 | #4 |
Участник
|
Как оказалось, в целом, идея решения правильная, но есть небольшая неточность. В системе Axapta отчет может быть запущен через пункт меню двумя способами:
Для решения проблемы необходимо, если отчет вызывается по первому варианту выполнить указанные действия, а если отчет вызывается по второму варианту, то ничего не делать. Оставить стандартный код. Поскольку, если отчет напрямую указывается в пункте меню, то он автоматически "оборачивается" в класс-наследник от RunBaseReportStd, то код модифицируется следующим образом X++: static void main(Args args) { RunBaseReportDialog reportDialog = new RunBaseReportDialog(args.caller()); RunBaseReport runBaseReport = args.caller().runbase(); ReportRun reportRun = runBaseReport.reportRun(); Report report = reportRun.report(); boolean oldInteractive; boolean res; Dialog dialog; // 31.03.2011, Maksi --> PrintJobSettings printJobSettingsRunBase; PrintJobSettings printJobSettingsReportRun; // 31.03.2011, Maksi <-- ; // We must invoke the SysPrintForm via the report object so that we honor an prompt overrides. oldInteractive = report.interactive(); report.interactive(true); res = reportRun.prompt(); report.interactive(oldInteractive); if (!res) return; // 31.03.2011, Maksi --> // Если вызов произошел из класса или наследника RunbaseReportStd, то это означает прямой вызов отчета // без "обертки" в виде RunBaseReport // В этом случае ничего менять в коде не надо ! // В противном случае необходимо передать сделанный выбор из ReportRun в RunBaseReport if (! SysDictClass::isEqualOrSuperclass(classIdGet(runBaseReport),classnum(RunBaseReportStd))) { printJobSettingsReportRun = reportRun.printJobSettings(); printJobSettingsRunBase = runBaseReport.printJobSettings(); printJobSettingsRunBase.unpackPrintJobSettings(printJobSettingsReportRun.packPrintJobSettings()); } // 31.03.2011, Maksi <-- dialog = Dialog::getDialogFromCaller(args.caller()); if (dialog) { dialog.updateServer(); } runBaseReport.dialogUpdatePrinterSettings(dialog); reportDialog.run(); } Правда, следует заметить, что в связи с такой "двухпалубной" системой настроек, исходная неопределенность сохраняется. Т.е. по прежнему возможна рассинхронизация настроек для отчета и для класса RunBaseReport. Но уже не в такой критической форме Если выполнить следующие действия
Собственно, так и должно быть. Ведь кеш отчета был сохранен сразу же по закрытии формы "Параметры" еще до того, как было принято решение не печатать отчет. В принципе, ничего страшного, ведь при печати будут использованы настройки RunBaseReport, а не самого отчета. Проблемы могут быть только если один и тот же отчет может печататься разными способами. Как напрямую, так и через "обертку" RunBaseReport. Но в данном случае - это не настолько критично, поскольку настройки кеша самого отчета в данной связке выступают в подчиненной роли. |
|
|
За это сообщение автора поблагодарили: evv (1), Logger (5), gl00mie (5). |
Теги |
ax2009, bug, bug report, ошибка, report |
|
|