在较早版本的AX中我们运行一个报表时会用到类RunBaseReport,从它扩展一个子类,再由它运行报表,一个典型的Axapta3中的例子:
class ReportProdInfo extends RunBaseReport { ProdId _prodid; } static void main(Args args) { ReportProdInfo _prodInfo; ProdTable pdt; ; if(args.dataset()!=tablenum(ProdTable)||(!args.record())) { throw error("@SYS22539"); } pdt=args.record(); _prodInfo = new ReportProdInfo(pdt.ProdId); if (_prodInfo.prompt()) _prodInfo.run(); } identifiername lastValueElementName() { return reportStr(ReportProdInfo);//指定Mophx报表的名称 }
我们可以根据Main方法的传入参数args的方法dataset/record来获取从一个MenuItem运行该类时传入的Datasource记录,进而根据它对要展示的数据进行过滤。
在AX2012中Runbase框架已经被SysOperation框架替代,RunbaseReport类的替代就是SrsReportRunController(从SysOperationController扩展而来),下面来看看如何使用这个新的控制类来传递记录参数到SSRS报表。
如果SSRS报表使用的是RDP class作为数据源,那你已经有了DataContract类,我们可以直接传入参数到DataContract类:
class SrsRdpSampleReportController extends SrsReportRunController { } public static void main(Args _args) { SrsRdpSampleReportController controller = new SrsRdpSampleReportController(); controller.parmReportName('RdpSampleReport.AutoDesign1'); controller.parmArgs(_args); controller.startOperation(); } protected void preRunModifyContract() { SrsRDPContractSample rdpContract=this.parmReportContract().parmRdpContract(); ; if(args && args.record()) rdpContract.parmRecord(args.record()); }
这里通过rdpContract.parmRecord(args.record())将从Menuitem args参数得到的记录传入data contract类,后续在data provider class中根据data contract的parmRecord()得到的记录处理数据就可以了。
如果SSRS报表使用Query作为数据源,同样我们在preRunModifyContract方法中获取报表的Query对象做处理就可以了,得到Query对象可以使用
Query query=this.getFirstQuery();
或者
Query query=this.parmReportContract().parmQueryContracts().lookup(this.getFirstQueryContractKey());
最后我们只要创建一个Menu Item来运行SrsRdpSampleReportController就可以了。