I have a requirement to generate proforma invoices for every open sales order into a single PDF file. If anyone has an easier way to accomplish this I'm happy to hear it, but I couldn't figure out how to do that with print management so I'm onto x++.
When I call srsReportRunService.preRunReport() I get an error message "A currency to convert from is required to retrieve exchange rate information." When I debug I see that it errors on a line with a _CustInvoiceTrans record that's empty/null, so no currency info, it runs earlier successfully, so it feels like this is part of the proforma logic I'm missing. The invoice temp tables are populating fine, my sales lines all have currencies set, I can't figure out how to get past this error message.
#FILE
Microsoft.Dynamics.AX.Framework.Reporting.Shared.ReportingService.ParameterValue[] parameterValueArray;
Map reportParametersMap;
SRSProxy srsProxy;
SRSReportExecutionInfo executionInfo = new SRSReportExecutionInfo();
System.Byte[] reportBytes = new System.Byte[0]();
SRSReportRunService srsReportRunService = new SrsReportRunService();
SalesFormLetter_Invoice salesFormLetter_Invoice = SalesFormLetter::construct(DocumentStatus::Invoice); // controller
SalesFormLetterInvoiceContract contract = salesFormLetter_Invoice.getInvoiceContract();
SalesInvoiceContract rdpContract = new SalesInvoiceContract();
rdpContract.parmRecordId(_salesTable.RecId);
salesFormLetter_Invoice.initParmSalesTable(_salesTable);
salesFormLetter_Invoice.update(_salesTable, systemDateGet(), SalesUpdate::All);
salesFormLetter_Invoice.defaultGiroType(NoYes::No);
SrsReportRunController srsReportRunController = new SrsReportRunController();
srsReportRunController.parmReportName(ssrsReportStr(SalesInvoiceLevel5, ProForma));
srsReportRunController.parmExecutionMode(SysOperationExecutionMode::Synchronous);
srsReportRunController.parmShowDialog(false);
srsReportRunController.parmReportContract().parmRdpContract(rdpContract);
SRSPrintDestinationSettings printerSettings = srsReportRunController.parmReportContract().parmPrintSettings();
printerSettings.printMediumType(SRSPrintMediumType::File);
printerSettings.fileFormat(SRSReportFileFormat::PDF);
printerSettings.parmFileName(_salesTable.SalesId + #pdf);
printerSettings.overwriteFile(true);
srsReportRunController.parmReportContract().parmReportServerConfig(SRSConfiguration::getDefaultServerConfiguration());
srsReportRunController.parmReportContract().parmReportExecutionInfo(executionInfo);
srsReportRunService.getReportDataContract(srsReportRunController.parmreportcontract().parmReportName());
srsReportRunService.preRunReport(srsReportRunController.parmreportcontract()); // this errors out due to currency issue
reportParametersMap = srsReportRunService.createParamMapFromContract(srsReportRunController.parmReportContract());
parameterValueArray = SrsReportRunUtil::getParameterValueArray(reportParametersMap);
srsProxy = SRSProxy::constructWithConfiguration(srsReportRunController.parmReportContract().parmReportServerConfig());
reportBytes = srsproxy.renderReportToByteArray(srsReportRunController.parmreportcontract().parmreportpath(),
parameterValueArray,
printerSettings.fileFormat(),
printerSettings.deviceinfo());
if (reportBytes)
{
System.IO.MemoryStream outputStream = new System.IO.MemoryStream(reportBytes);
reportsInStreams.Add(outputStream);
}