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报表的开发方式,不变。至此,打开报表参数对话框上的员工编号字段控件,已经有了下拉效果。

  • 相关阅读:
    编写第一个Flutter App(翻译)
    在Android上编写模块化项目(翻译)
    Android端生成META-INF信息文件的Gradle插件 RapidMetaInfPlugin
    Sharepoint学习笔记—习题系列--70-576习题解析 --索引目录
    Sharepoint学习笔记—习题系列--70-576习题解析 -(Q147-Q151)
    Sharepoint学习笔记—习题系列--70-576习题解析 -(Q144-Q146)
    Sharepoint学习笔记—习题系列--70-576习题解析 -(Q141-Q143)
    Sharepoint学习笔记—ECM系列—文档列表的Metedata Navigation与Key Filter功能的实现
    Sharepoint学习笔记—ECM系列--文档集(Document Set)的实现
    Sharepoint学习笔记—其它—如何知道某个Sharepoint环境的安装类型
  • 原文地址:https://www.cnblogs.com/msdynax/p/custom-rdp-report-parm-dialog.html
Copyright © 2011-2022 走看看