zoukankan      html  css  js  c++  java
  • Dynamics AX 2012 R2 客制化RDP报表参数对话框

        当我们在使用RDP报表时,AX会根据Data Contract,自动生成报表参数对话框上的字段控件。一般情况下,该对话框能够满足我们的需求,但是如果有较为复杂或特殊的需求,就要我们对该对话框进行客制化。

        Reinhard这里就有一张报表,需要使用员工编号作为参数。但是AX系统中默认的员工编号EDT,没有提供lookup方法Reinhard将该员工编号EDT放在报表参数窗体上后,只能手工录入员工编号,不能通过下拉框进行选择。

        默认效果是这样:

    Screenshot20150127160448

        但是 Reinhard想要的效果是这样:

    Screenshot20150127160544

    Reinhard经过不断地研究,发现AX提供了一种可以客制化报表参数对话框字段控件的技术——SysOperation Framework。如果你也和 Reinhard一样,想要改变自动生成的对话框上的字段,就可以使用该框架。

        SysOperation Framework提供了一个SysOperationAutomaticUIBuilder类,通过继承该类,可以在系统基于我们服务操作数据契约来生成对话框的过程中,添加自己的逻辑。一般包括以下业务逻辑:

    • 设置字段控件的属性,如强制启用
    • 覆盖字段控件的方法,如lookup()modifiedField()
    • 覆盖addDialogField()方法,阻止控件被添加

        如果你有大量的控件要使用UI Builder添加到对话框中,取而代之,可以考虑在控制器中使用模板窗体

        如果你在UI Builder中有大量的验证代码,取而代之,可以考虑在数据契约中实现验证。这样做,是为了遵循MVC哲学。

        先来看看ReinhardDataContract

    [DataContractAttribute]
    public class Reinhard@MSDynAX.net_DataContract
    {
        HcmPersonnelNumberId hcmPersonnelNumberId;
    }
    
    [DataMemberAttribute('HcmPersonnelNumberId')]
    public HcmPersonnelNumberId parmHcmPersonnelNumberId(HcmPersonnelNumberId _hcmPersonnelNumberId=hcmPersonnelNumberId)
    {
        hcmPersonnelNumberId=_hcmPersonnelNumberId;
        return HcmPersonnelNumberId;
    }

        ReinhardDataContract中,只有一个属性——员工编号。想在报表参数对话框中,为该字段控件添加lookup方法。下面创建UI Builder类:

    class Reinhard@MSDynAX.net_UIBuilder extends SysOperationAutomaticUIBuilder
    {
        DialogField hcmPersonnelNumberIdField;
    }
    
    public void hcmPersonnelNumberIdLookUp(FormStringControl _control)
    {
        HcmWorkerLookup lookup=HcmWorkerLookup::newWorkersInCurrentCompany();
        lookup.lookupWorker(_control);
    }
    
    public void build()
    {
        super();
        hcmPersonnelNumberIdField=this.bindInfo().getDialogField(
        this.dataContractObject(),
        methodStr(HPRN_1416_DC,parmHcmPersonnelNumberId)
        );
    }
    
    public void postRun()
    {
        super();
        hcmPersonnelNumberIdField.registerOverrideMethod(
        methodStr(FormStringControl,lookup),
        methodStr(HPRN_1416_UIBuilder,hcmPersonnelNumberIdLookUp),
        this);
    }

        可以看到,ReinhardUI Builder中的第一个方法,是用于覆盖员工编号字段控件lookup()方法

        第二个方法,获取到员工编号字段控件

        第三个方法,将我们的第一个方法,注册到字段控件的lookup()方法上。

        最后,Reinhard修改Data Contract的声明:

    [DataContractAttribute,
    SysOperationContractProcessingAttribute(
    classStr(Reinhard@MSDynAX.net_UIBuilder))]
    public class Reinhard@MSDynAX.net_DataContract
    {
        HcmPersonnelNumberId hcmPersonnelNumberId;
    }
    
    

        其他部分依然遵循RDP报表的开发方式,不变。至此,打开报表参数对话框上的员工编号字段控件,已经有了下拉效果。

  • 相关阅读:
    HDU 1501 Zipper(DFS)
    HDU 2181 哈密顿绕行世界问题(DFS)
    HDU 1254 推箱子(BFS)
    HDU 1045 Fire Net (DFS)
    HDU 2212 DFS
    HDU 1241Oil Deposits (DFS)
    HDU 1312 Red and Black (DFS)
    HDU 1010 Tempter of the Bone(DFS+奇偶剪枝)
    HDU 1022 Train Problem I(栈)
    HDU 1008 u Calculate e
  • 原文地址:https://www.cnblogs.com/msdynax/p/custom-rdp-report-parm-dialog.html
Copyright © 2011-2022 走看看