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.