• Dynamics AX中Table Map的点点滴滴


    在Microsoft Dynamics AX的MorphX中,AOT下有个Maps节点(注意,不是Map Class),这个节点下罗列了所有的Table Mapping。很多开发人员对于Table Mapping的概念不是很清楚,在使用过程中也会遇到一些问题。本文简单地收集并罗列一下。

    一、Table Mapping也是Table

    在AOT上,任意选择一个Table Map,单击鼠标右键选择Open,即可打开Table Browser。当然,如临时表一样,里面什么东西都没有,但我们可以看到,MorphX将Table Mapping当做Table处理了。

    不仅如此,我们还可以直接使用SysDictTable类来获得Table Mapping的一些反射属性。比如:

    static void Job28(Args _args)
    {
    SysDictTable sysDictTable
    = new SysDictTable(tableNum(AddressMap));
    ;
    print sysDictTable.isMap();
    pause;
    }

    二、Map是Table的抽象

    在谈Map与抽象之间的关系之前,先看看应该如何理解Dynamics AX中Table的概念。其实Table可以理解为业务实体类,它里面同样包含属性(Fields)和方法(Table Methods)。既然可以当成是实体类,那么就可以对其进行抽象。事实上,Dynamics AX中的Common表,就是所有数据表(或者说所有实体类)的基类,因此,在不确定传入的具体是那张表的情况下,我们往往会使用Common来定义函数的参数或者返回值。比如:

    public final void writeLog(WebRecordName _recordName,
    Common _orig,
    Common _now,
    WebExportLogType _exportLogType
    = WebExportLogType::AddOrModify,
    DivisionId _divisionId
    = SysUserInfo::find(curUserId()).DivisionId,
    boolean _force
    = false,
    WebExportRemark _remarks
    = '')
    {
    // ...
    }

    现在随便想一个应用场景:系统中有两种用户类型:Individual Person和Organization。这两种用户类型都需要向系统提供用户名和密码,以便确认身份,进而获得更多其他的服务。那么这个校验身份的函数,就需要获得请求者的用户名和密码。我们定义两个Table:Person和Organization;以及一个Map:AuthenticationMap,如下:

    于是,我们的校验方法就可以写成这个样子:

    boolean authenticate(AuthenticationMap _authMap)
    {
    return this.checkAuthentication(_authMap.UserName, _authMap.Password);
    }

    从上面的代码还可以看到,Table Map“解耦”了Table的设计,在“用户名”和“密码”两个属性上,Person和Organization甚至可以使用不同的名字,最后只要用Map链接一下就可以了。

    三、在Table上调用Map中的方法

    其实方法很简单,只需要在Table的实例上,用“.”运算符调出Map,进而使用“::”运算符调用Map中的方法即可。注意:X++ Editor的智能感知功能是无法在您输入“.”以后,将Map列出的。此时关闭智能感知,直接用键盘敲入。

    例如:我们在上面的AuthenticationMap上定义了一个isStrongPassword的instance方法:

    boolean isStrongPassword()
    {
    return strlen(this.Password) >= 8;
    }

    那么在插入Person表记录的时候,我们需要首先判断输入的密码是否为强密码,否则禁止新建记录。在Person这个Table上,重载insert方法,并在方法中调用AuthenticationMap的isStrongPassword方法即可:

    public void insert()
    {
    if (this.AuthenticationMap::isStrongPassword())
    super();
    else
    checkFailed(
    'The password is not strong enough!');
    }
  • 相关阅读:
    常见协议基础知识总结--FTP协议
    DG增量恢复
    DG备库无法接受主库归档日志之密码文件
    Oracle密码概要文件,密码过期时间180天修改为3天,相关用户密码是否过期
    ORA-15025 搭建DG环境,restore controlfile报错,提示oracle无法使用ASM存储
    Deinstall卸载RAC之Oracle软件及数据库+GI集群软件
    增加临时表空间组Oracle11g单实例
    安装12C小问题及pdb表空间配置
    判断子表外键约束参数类型
    创建small表空间size32G报错ORA-01144
  • 原文地址:https://www.cnblogs.com/daxnet/p/1696810.html
Copyright © 2020-2023  润新知