Wednesday, 11 August 2010

Printing existing sales invoice into a file

Recently i had a problem with Dynamics AX 2009 printing already existing sales invoice into a file. Normally i would use code like this:


SalesFormLetter salesFormLetter;

CustInvoiceJour custInvoiceJour;
PrintJobSettings printJobSettings;
;
select firstonly custInvoiceJour; // This is for testing purposes only
salesFormLetter = SalesFormLetter::construct(DocumentStatus::Invoice, false);
printJobSettings = new printJobSettings();
printJobSettings.setTarget(PrintMedium::File);
printJobSettings.format(PrintFormat::PDF);
printJobSettings.fileName('C:\\Temp\\Test.pdf');
salesFormletter.updatePrinterSettingsFormLetter(printJobSettings.packPrintJobSettings());
custInvoiceJour.printJournal(SalesFormletter);

However this is not working due to FormLetterReport.loadPrintSettings method, which is overwriting Target parameter.

To solve this issue elegantly, and keep standard behaviour, there are several actions required:
1. Add boolean variable „skipPrintTargetOverwrite“, in SalesFormLetter class declaration.
2. Add method „skipPrintTargetOverwrite“ in SalesFormLetter class:

Boolean skipPrintTargetOverwrite(boolean _skip = skipPrintTargetOverwrite)
{
    skipPrintTargetOverwrite = _skip;
    return skipPrintTargetOverwrite;
}

3. Add one optional parameter in FormLetterReport.loadPrintSettings method:

public void loadPrintSettings(Common _jourTable, Common _transTable, str _languageId, boolean skipTargetOverwrite = false)

Also change lines where setTarget(PrintMedium::Screen) is set:
Old version:

printSettingDetail.parmPrintJobSettings().setTarget(PrintMedium::Screen);

New version:

if (!skipTargetOverwrite) printSettingDetail.parmPrintJobSettings().setTarget(PrintMedium::Screen);

4. On SalesInvoice report fetch method find code salesFormLetterReport.loadPrintSettings and replace like following:


Old version:

salesFormLetterReport.loadPrintSettings(
       custInvoiceJour,
       custInvoiceJour.salesTable(),
       custInvoiceJour.LanguageId);

New version:

salesFormLetterReport.loadPrintSettings(
        custInvoiceJour,
        custInvoiceJour.salesTable(),
        custInvoiceJour.LanguageId,
        salesFormLetter?salesFormLetter.skipPrintTargetOverwrite():false);

Once all that is done, there is only one line required in my code generating file:

SalesFormLetter salesFormLetter;

CustInvoiceJour custInvoiceJour;
PrintJobSettings printJobSettings;
;
select firstonly custInvoiceJour; // This is for testing purposes only
salesFormLetter = SalesFormLetter::construct(DocumentStatus::Invoice, false);
printJobSettings = new printJobSettings();
printJobSettings.setTarget(PrintMedium::File);
printJobSettings.format(PrintFormat::PDF);
printJobSettings.fileName('C:\\Temp\\Test.pdf');
salesFormletter.updatePrinterSettingsFormLetter(printJobSettings.packPrintJobSettings());
salesFormLetter.skipPrinttargetOverwrite(true);
custInvoiceJour.printJournal(SalesFormletter);

I hope that helps if someone having a troubles.

3 comments:

  1. Hi there,

    I'm a total n00b to AX..
    How can I print each invoice to a different file?
    Let's say \\someunc\direcory\accountid-invoiceid-invoicedate.pdf?
    Thanks,
    Dan

    ReplyDelete
  2. This is very helpfull
    It's work perfectly.
    Thanks a lot Marius
    Olivier

    ReplyDelete