AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 19.07.2017, 14:29   #1  
iiipoizone is offline
iiipoizone
Участник
 
43 / 11 (1) +
Регистрация: 07.09.2015
Трудности с формированием PDF в пакетном режиме
При формировании PDF файла в пакетном задании происходит остановка службы или просто прерывание выполнения.
Не в пакетном режиме все нормально формируется.


PDF формируется через штатный функционал Report:
X++:
public int print()
{
    int ret;
    this.printJobSettings().suppressScalingMessage(true);
    this.printJobSettings().clientPrintJobSettings().suppressScalingMessage(true);
    if (email)
    {
           this.printJobSettings().setTarget(PrintMedium::File);
           this.printJobSettings().format(PrintFormat::PDF);
           FileName = strfmt(@'\\AOS-01\@Shared\Exchange\TK\%1%2_%3.pdf',"СчетНаОплату",today(),salesPurchReport.getHeaderData().SalesPurchId);
           if (WinapiServer::fileExists(FileName))
           {
                WinapiServer::deleteFile(FileName);
           }
           this.printJobSettings().fileName(FileName);
    }

    info("ret = super()");

    ret = super();
    this.printPDFMail();
    return ret;
}
Текста ошибки никаких не выдается, но путем создания infolog понял по журналу выполнения пакета, что сбой заключается в классе:

SysReportRun который отнаследован от ReportRun

X++:
/* <SYS>
void run(boolean onlyReport = false)
</SYS> */
// <GEEU>
public void run(boolean onlyReport = false)
// </GEEU>
{
    // If this report is a webReport the run a webReport.
    if (webSession() && runBaseReport)
    {
        runBaseReport.runWebReport();
    }
    else
    {
        // When running the report and onlyReport = true then run the report.
        if (!onlyReport && runBaseReport)
        {
            if (runBaseReport.prompt())
            {
                runBaseReport.run();
            }
            // If the prompt returns false the do not run the report.
            // The RunBaseReport.Run method calls the ReportRun.run method with the parm onlyReport = true.
            return;
        }
    }

    this.buildPrintGrandTotal();
    this.buildPrintOnlyTotals();

    // <GEEU>
    this.updateReportDesign_W();

    // </GEEU>
    info("beforeSuper"); // инфолог виден в журнале выполнения
    super(); // Метод в ядре AX. что внутри не понятно =(
     info("AfterSuper");  // До этого инфолога выполнение не доходит
}
У кого-то получалось создавать PDF в пакете?
Старый 19.07.2017, 15:06   #2  
mdanko2000 is offline
mdanko2000
Участник
 
44 / 40 (2) +++
Регистрация: 21.04.2014
Цитата:
Сообщение от iiipoizone Посмотреть сообщение
У кого-то получалось создавать PDF в пакете?
В Ax2009 получалось и сейчас работает.
Пришлось поправить класс PDFViewer, добавляя везде
вместо
PHP код:
 bmpImage WinAPI::getTempFile(); 
что-то вроде
PHP код:
 _perm = new FileIOPermission('''RW');
            
_perm.assert();
            
bmpImage isRunningOnServer() ? WinAPIServer::getTempFileName(): WinAPI::getTempFile();
            
CodeAccessPermission::revertAssert(); 
За это сообщение автора поблагодарили: iiipoizone (1).
Старый 19.07.2017, 15:57   #3  
iiipoizone is offline
iiipoizone
Участник
 
43 / 11 (1) +
Регистрация: 07.09.2015
В этом классе все уже прописано, но вот так:

X++:
            if(isRunningOnServer())
            {
                bmpImage = WinAPIServer::getTempFileName();
            }
            else
            {
                bmpImage = WinAPI::getTempFile();
            }
А Permission есть в самом методе WinAPIServer::getTempFileName();
Старый 20.07.2017, 11:26   #4  
Товарищ ♂uatr is offline
Товарищ ♂uatr
Участник
Аватар для Товарищ ♂uatr
MCBMSS
 
299 / 866 (29) +++++++
Регистрация: 23.10.2012
Вот это очень смущает:
X++:
this.printJobSettings().suppressScalingMessage(true);
this.printJobSettings().clientPrintJobSettings().suppressScalingMessage(true);
Здесь 2 варианта или он вернёт экземпляр класса созданного на клиенте (https://msdn.microsoft.com/en-us/lib...bsettings.aspx) или null.
В обоих случаях должна быть ошибка.
В первом т.к. идёт выполнения кода на сервере, во втором, т.к. идёт вызов suppressScalingMessage для неинициализированного объекта.

PS Что если просто отладить пакетное задание, вместо выставления инфологов?

Последний раз редактировалось Товарищ ♂uatr; 20.07.2017 в 11:30.
За это сообщение автора поблагодарили: iiipoizone (1).
Старый 21.07.2017, 07:05   #5  
iiipoizone is offline
iiipoizone
Участник
 
43 / 11 (1) +
Регистрация: 07.09.2015
Цитата:
Здесь 2 варианта или он вернёт экземпляр класса созданного на клиенте (https://msdn.microsoft.com/en-us/lib...bsettings.aspx) или null.
Благодарю, но не помогло. Выполнение этих строк даже не происходит. AX останавливает выполнение раньше.
Старый 21.07.2017, 10:41   #6  
Morpheus is offline
Morpheus
Участник
Аватар для Morpheus
Соотечественники
 
602 / 167 (7) ++++++
Регистрация: 30.03.2005
Адрес: Київ-København-Düsseldorf
Посмотрите, как реализован экспорт SRS отчетов в классе SRSReportServerWarmup.

X++:
public void runSampleRdpReportWithParameters()
{
    str reportFilePath;

    SrsReportDataContract contract;
    SalesInvoiceContract rdpContractClass;
    LogisticsAddressCountryRegionISOCode code = 'US';

    // Create a controller to run the report.
    SrsReportRunController controller = new SrsReportRunController();

    // set the report name and design to be run
    controller.parmReportName(ssrsReportStr(SalesInvoice, Report));

    // suppress the parameter dialog as this is to be run by the batch service
    controller.parmShowDialog(false);

    // choose to save the executed report as a pdf file
    reportFilePath = System.IO.Path::Combine(this.getTempPath(), ssrsReportStr(SalesInvoice, Report) + #FileExtensionPDF);
    this.setReportRunControllerPrintToFile(controller, reportFilePath);

    // Set any required parameter values here by first getting the report contract.
    contract = controller.parmReportContract();

    // And then fill in that contract based on the contract type (Rdl or Rdp)

    // Example of using an Rdp class specific data contract
    rdpContractClass = contract.parmRdpContract() as SalesInvoiceContract;

    // Set the required parameter
    rdpContractClass.parmCountryRegionISOCode(code);

    // run the report
    controller.runReport();
}
За это сообщение автора поблагодарили: iiipoizone (1).
Старый 24.07.2017, 07:50   #7  
iiipoizone is offline
iiipoizone
Участник
 
43 / 11 (1) +
Регистрация: 07.09.2015
Что то нет такого)

Попробую сделать отправку в пакете Word или Excel. Надо же как-то сделать на AX 2009

Последний раз редактировалось iiipoizone; 24.07.2017 в 07:53.
Старый 24.07.2017, 09:14   #8  
mdanko2000 is offline
mdanko2000
Участник
 
44 / 40 (2) +++
Регистрация: 21.04.2014
Забыл спросить сразу.
В конфигурационной утилите АОСа установлена галочка "Разрешить клиентам подключаться к принтерам на этом сервере". ?
На том АОСе где пакеты обрабатываются.
За это сообщение автора поблагодарили: iiipoizone (1).
Старый 24.07.2017, 10:52   #9  
iiipoizone is offline
iiipoizone
Участник
 
43 / 11 (1) +
Регистрация: 07.09.2015
Разрешил. Службу перезапустил. Но не помогло. Переделаю в Word
Всем спасибо)
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
InteropPermission в пакетном режиме jonny DAX: Программирование 7 03.09.2020 09:49
модификация taxTrans_RU в пакетном режиме в классе GoodsInRouteUpdate_RU Владимир Максимов DAX: Программирование 0 13.08.2015 18:13
DAX 2009 - Трассировка долгих SQL-запросов в пакетном режиме N.D.P. DAX: Администрирование 4 18.03.2015 09:13
Вывод отчета в файл в пакетном режиме Egor_bl DAX: Программирование 3 09.11.2006 09:36
Вывод отчета в файл в пакетном режиме Egor_bl DAX: Программирование 16 09.10.2006 19:10

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 02:05.