Many times it is needed to display multiple reports on screen. In standard Dynamics AX 2012, if you try to call multiple times, a report; it will open 2nd report, after 1st instance of report viewer is closed. A user may be looking for, display of multiple instances at same time, without closing other.
Using controller class dialogShow method,
class VendInvoiceAttachmentController extends SrsReportRunController{
#define.ReportName('VendInvoiceAttachment.Report')
}
public static void main(Args _args){
VendInvoiceAttachmentController controller = new VendInvoiceAttachmentController();
controller.parmReportName(#ReportName);
controller.parmArgs(_args);
controller.parmLoadFromSysLastValue(false);
//controller.startOperation();
if (controller.prompt())
{
controller.preRunModifyContract();
}
}
protected void preRunModifyContract()
{
SRSPrintDestinationSettings settings;
Query query;
QueryRun queryRun;
VendInvoiceJour vendInvoiceJour;
SRSReportExecutionInfo executionInfo;
settings = this.parmReportContract().parmPrintSettings();
if (settings.printMediumType() != SRSPrintMediumType::Printer &&
settings.printMediumType() != SRSPrintMediumType::Screen)
{
throw error(strFmt("@$AB59", settings.printMediumType()));
}
query = this.getFirstQuery();
queryRun = new QueryRun(query);
while (queryRun.next())
{
vendInvoiceJour = queryRun.get(tableNum(VendInvoiceJour));
this.printAttachements(vendInvoiceJour.RecId);
// create a instance of ReportExecutionInfo & set it on contract. This will get used while running report.
executionInfo = new SRSReportExecutionInfo();
executionInfo.parmReportRunId(reportRunId);
reportContract.parmReportExecutionInfo(executionInfo);
//Range
SrsReportHelper::addParameterValueRangeToQuery(this.getFirstQuery(),tableNum(VendInvoiceJour),fieldNum(VendInvoiceJour, RecId),SysQuery::value(vendInvoiceJour.RecId));
if (settings.printMediumType() == SRSPrintMediumType::Screen)
{
// pre report run
this.parmReportRun().preRunReport();
this.runToScreen();
}
if (settings.printMediumType() == SRSPrintMediumType::Printer)
{
// pre report run
this.parmReportRun().preRunReport();
this.parmReportRun().runReport();
}
}
}
Run multiple reports to screen
When printing multiple reports to screen in code, the previous printed report will block the next one, untill user closes the previous one, the next one starts rendering. This is anoying if user needs to print multiple reports to screen as a batch. The solution to this is simple, we just need to create a class to extend SrsReportRunController and overwrite the methods dialogShow and dialogClose. See sample below
protected void dialogShow()
{
SysOperationDialog sysOperationDialog;
FormRun formRun;
if (useReportViewerForm)
{
dialog.run();
this.dialogPostRun();
sysOperationDialog = dialog as SysOperationDialog;
formRun = sysOperationDialog.formRun();
formRun.detach();
}
else
{
super();
}
}
{
if(!useReportViewerForm)
{
super();
}
}
References:
http://xhellot.blogspot.com/2016/08/how-to-run-ssrs-report-from-x-code-in_8.html
Dekumeaning
ReplyDeleteDekumeaning
Dekumeaning
Dekumeaning
Dekumeaning