11.10.2008, 10:51 | #1 |
HAI; CAN HAS STDIO?
|
печать на AOS
а вот такая штука. есть класс, который всегда запускается на сервере. класс занимается тем, что печатает на принтер некоторые отчеты.
пока класс запускался с клиента, все печаталось. как только класс определили в batch job, стали печататься пустые страницы вместо отчетов. почему такое может происходить? печатает же SalesFormLetter_Invoice, если поставить его в пакетную обработку. может, кто-то сталкивался, помогите советом. DAX 2009 RTM. еще один нюанс: если делать тот же трюк с печатью в PDF, то тот же результат. запускаем с клиента - получаем замечательный PDF, ставим в пакетную обработку - PDF создаются, но пустые. куда и как печатать - управляю через PrintJobSettings. ежели на принтер, то так: X++: pjs.setTarget(PrintMedium::Printer);
pjs.deviceName(printerName, ClassRunMode::Server); X++: pjs.format(PrintFormat::PDF);
pjs.setTarget(PrintMedium::File);
pjs.fileName(folderPath + _sales + ".pdf"); в чем же разница, через клиент я его запускаю, или в пакетную обработку ставлю - в обоих случаях класс на сервере отрабатывает.. в DAX 2009 сделали так, что пакетная обработка на сервере работает, если runsImpersonated = true, пытаюсь пользоваться.. что, придется таки по-старинке, batch server поднимать? не хотелось бы сдаваться, SalesFormLetter-то печатает из пакетной обработки.. помогите, господа, советом, где с бубном надо танцевать. спасибо.
__________________
our sharp bitter vitriol is not that of the vulgar. |
|
11.10.2008, 11:25 | #2 |
HAI; CAN HAS STDIO?
|
хм, немного усложнилось )
класс делает следующее: - запускает для определенных заказов SalesFormLetter_Invoice.update(), с печатью отчета из этого класса. то есть в него передается этот printJobSettings и говорится PrintFormLetter = true. - печатает еще два итоговых отчета. печатает в таком стиле: new ReportRun() -> передаем ему запись -> передаем ему PrintJobSettings -> reportRun.run() теперь следим за движениями рук. я перезапускаю AOS, чищу usage data, комментирую печать итоговых отчетов. инвойсы печатаются на ура! смотрим дальше: убираю комментарии, мол, давайте теперь то же самое, но с итоговыми отчетами - и снова печатаются пустые страницы, причем все пустые, и инвойсы тоже. комментирую обратно свои итоговые отчеты - теперь печатаются только инвойсы, но все равно все страницы пустые. перезапускаю AOS, чищу usage data - инвойсы печатаются, как родные. наверное, это и есть решение, usage data чистить перед печатью - вот только неясно, какие именно. крыша едет с этими приколами. может, более здравые мысли имеются, господа? спасибо за внимание.
__________________
our sharp bitter vitriol is not that of the vulgar. |
|
14.10.2008, 00:29 | #3 |
HAI; CAN HAS STDIO?
|
эх, что, ни у кого нет мыслей на этот счет? все отчеты я заставил печататься, а вот SalesInvoice так и не хочет из пакетной обработки.
пишу в майкрософт сегодня.
__________________
our sharp bitter vitriol is not that of the vulgar. |
|
17.11.2008, 03:16 | #4 |
HAI; CAN HAS STDIO?
|
все, разобрались с майкрософтом на пару )
в общем, в новой чудесной чисто серверной пакетной обработке, новинке версии 2009, не все так гладко, как хотелось бы. если не вдаваться в детали, то если создавать экземпляр класса прямо внутри цикла перебора записей SalesTable, и после каждой итерации присваивать указателю null, то все работает. а если вынести invoice update в отдельную функцию и создавать объекты там, то напечатан будет только первый инвойс, все последующие пойдут на печать пустыми страницами. а иногда и первый не пойдет. ладно, сделал, работает, закрыли. спасибо
__________________
our sharp bitter vitriol is not that of the vulgar. |
|
|
За это сообщение автора поблагодарили: Poleax (1). |
04.01.2011, 13:07 | #5 |
Участник
|
Добрый день, Offenmeier и уважаемые участники AXForum!
Мы столкнулись с 2-мя проблемами. При печати отчётов в PDF - файл в батче периодически генерируются пустые файлы (при печати с клиента все хорошо): 1. В цикле по CustTrans для каждой транзакции ищется CustInvoiceJour и для него запускается печать отчёта SalesInvoice в PDF, точно так же как в методе CustInvoiceJour.printJournal(). В результате генерируется много PDF- файлов, причём часть из этих файлов повреждённые (не открываются). Что вы могли бы посоветовать для решения этой проблемы, мне кажется, что наша проблема похожа на описанную вами. Не совсем понятно, что вы имели в виду, когда писали: "после каждой итерации присваивать указателю null", какой конкретно указатель имеется в виду? Не могли бы вы написать, что ответил вам Майкрософт по этому поводу? 2. Вторая проблема касается печати собственных отчётов в файл в батче. Мы написали RunBaseBatch класс и отчёт. Внутри в классе вызывается печать отчёта, это происходит, как в методе CustInvoiceJour.printJournal(). За один запуск печатается от 1 до 4 отчётов, при этом случайным образом некоторые из них печатаются повреждёнными (не открываются). Во время тестов мы обнаружили, что проблема касается не только печати в PDF, но и вообще печати в файл (тестировали и для ASCII-файлов). В последнем случае генерируются пустые txt - файлы. Что вы бы могли посоветовать для решения этой проблемы? |
|
02.02.2011, 06:00 | #6 |
HAI; CAN HAS STDIO?
|
зашёл сюда совершенно случайно! странно, что не получил на электронную почту уведомление о сообщении.
1. проблема возникла потом снова, и мне пришлось снова говорить с Майкрософтом. оказывается, на сервере из-за особенностей распределения памяти в переменные иногда пишется мусор. поэтому когда я создавал отчёт на сервере, одно из свойств его PrintJobSettings оказывалось равным нулю вместо единицы (свойство AllPages). report.printJobSettings().allPages(true); после добавления этого кода всё заработало. 2. ещё был такой баг: если в PDF была картинка (логотип к примеру), то из серверной пакетной обработки сохранить PDF невозможно, там какая-то проблема с изображениями и их выводом на сервере в PDF. я делал логотип invisible если отчёт выполняется на сервере и экспортируется в PDF, но может исправили с тех пор.
__________________
our sharp bitter vitriol is not that of the vulgar. |
|
|
За это сообщение автора поблагодарили: Logger (3), player (1). |
02.02.2011, 10:57 | #7 |
Участник
|
Цитата:
Сообщение от offenmeier
...оказывается, на сервере из-за особенностей распределения памяти в переменные иногда пишется мусор. поэтому когда я создавал отчёт на сервере, одно из свойств его PrintJobSettings оказывалось равным нулю вместо единицы (свойство AllPages).
report.printJobSettings().allPages(true); после добавления этого кода всё заработало. ... А это признано багой ? Или считать как данность и исправлено не будет ? Что же теперь получается - нельзя полагаться на дефолтные значения переменных ? |
|
03.02.2011, 02:19 | #8 |
HAI; CAN HAS STDIO?
|
PrintJobSettings это как бы и не обычная переменная, это какая-то структура описанная в .NET коде ядра. попробуй в дебаггере посмотреть, что у неё внутри: лично мне так и не удалось внутрь заглянуть.
ни до этого, ни после, я не встречался с подобными проблемами, я думаю, что скорее всего этот баг (а я думаю, что это баг) относится только к PrintJobSettings и только к этому его свойству AllPages, наверное пропустили его в .NET коде инициализации, и туда попадает мусор.
__________________
our sharp bitter vitriol is not that of the vulgar. |
|
23.02.2011, 15:46 | #9 |
Участник
|
Здравствуйте, Offenmeier.
Большое спасибо за ответ (по поводу печати в PDF из серверного батча)! Он нам очень помог! |
|
05.03.2013, 10:14 | #10 |
Участник
|
Аксапта 2009.
Есть следующий код: X++: public void run() { SalesReport_Invoice4Paym_RU launcher; PrintJobSettings printJobSettings; FileName fileName; ; super(); invoice4PaymJour = CustInvoice4PaymJour_RU::find('0100000'); fileName = strfmt("%1%2.pdf", 'C:\\temp\\', invoice4PaymJour.Invoice4PaymId); printJobSettings = new PrintJobSettings(); printJobSettings.format(PrintFormat::PDF); printJobSettings.setTarget(PrintMedium::File); printJobSettings.allPages(true); printJobSettings.fileName(fileName); launcher = new SalesReport_Invoice4Paym_RU(); launcher.setParameters(PrintCopyOriginal::OriginalPrint, invoice4PaymJour); launcher.prompt(); launcher.setPrintJobSettings(printJobSettings.packPrintJobSettings()); launcher.run(); } Но PDF файл создается на локальной машине. Если запускать в пакетной обработке - падает сервер. Картинка в отчете есть, но я ее скрываю. Помогите, кто сталкивался. ------------------------------- Зашел с другой стороны: Сделал тупой отчет с одной строчкой, класс наследник RunBaseReport (серверный) переопределил функцию: X++: void makePrintJobSettings() { FileName fileName; ; super(); fileName = 'C:\\temp\\test123.pdf'; printJobSettings = new PrintJobSettings(); printJobSettings.format(PrintFormat::PDF); printJobSettings.setTarget(PrintMedium::File); printJobSettings.allPages(true); printJobSettings.fileName(fileName); } При запуске в батче выдает ошибку: Ошибка времени выполнения: PrintJobSettings Объект не инициализирован. (S)\Classes\PrintJobSettings\packPrintJobSettings (S)\Classes\RunBaseReport\run - line 16 (S)\Classes\BatchRun\runJobStatic - line 63 По всему выходит что PrintJobSettings - чисто клиентский объект. Как его сделать серверным? В этой ветке у всех получилось. Что я делаю не так? |
|
05.03.2013, 16:55 | #11 |
Участник
|
Победил.
Во втором примере в Run() добавил this.initParmDefault(); Заработало. Точнее стал говорить внятные ошибки. Причины в массе клиентских вызовов в разных местах. Когда все поубирал - заработало. В том числе и первый пример. Отлаживал на сервере по методе: Отладка на сервере По поводу изображений - да, не работает с изображениями. Класс Image - клиентский. В хелпе такое висит: Note In Microsoft Dynamics AX, the Image class is bound to the client. The class can no longer be run from the server because of the security risks that are associated with file handling. А в классе PDFViewer в методе writeBitmap на 49 строчке используется: img = new Image(c); |
|