[AX2012]在SSRS报表中获取从Menuitem传入的记录

在较早版本的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就可以了。

 

posted @ 2013-12-04 16:47  断水流  阅读(887)  评论(0编辑  收藏  举报