zoukankan      html  css  js  c++  java
  • [AX]AX2012开发新特性Valid time state table

    AX2012的表属性中可以设置ValidTimeStateFieldType来创建一个具有有效期状态的表,系统自动给表添加ValidFrom和ValidTo两个字段。这个属性及字段有什么用呢?假如有一笔贷款第一年的利率是5%,第二年变成了6%,在第二年我们仍想知道它在第一年的利率,当然可以使用其他的逻辑和表来保存过去时间段有效的数据,使用ValidTimeStateFieldType可以简化这样的问题。

    表的ValidTimeStateFieldType属性有三个选项,NONE、Date和UtcDateTime三个选项,选择后面两个的任意一个系统会自动为表添加ValidFrom和ValidTo两个字段,系统会自动保证这些日期段不会重复。还需要做的动作是设置包含时间的Index,比如我们的表有一个字段ID为唯一的主key,还需要创建一个至少包含ValidFrom的替代Index:

    一旦设置索引的ValidtimestateKey为yes,索引里的ValidFrom就不能再被删除。标记为ValidTimeStateFieldType 属性的表是不能够多纪录SQL批量操作的,即使X++中使用了多纪录操作,内部也是转化成单条纪录操作的。

    在SELECT中可以使用validTimeState关键字来过滤时间段:

    SELECT validTimeState(dateFrom, dateTo)  count(RecID) from Table1;

     validTimeState还可以只带一个参数,返回的纪录是那些日期范围内包含这个日期的纪录:

     While SELECT
            validTimeState(dateTarget)
            * from Table1
        {
         ....
        }

    需要注意的是如果SELECT中不包含validTimeState是等同于validTimeState(Today())的。

    使用update_recordset更新纪录时,会受到表变量ValidTimeStateUpdateMode方法的影响,这是一个enum的类型ValidTimeStateUpdate,有Correction、CreateNewTimePeriod和EffectiveBased三个选项,前两选项分别表示自动更新重叠日期纪录、创建新纪录,EffectiveBased首先强制使用CreateNewTimePeriod来扩展当前日期,否则使用Correction方法。

    dateFrom = 01\01\1900;
    dateTo   = 31\12\2154;
        table1.ValidTimeStateUpdateMode(ValidTimeStateUpdate::Correction);
    
        SELECT
            forUpdate
            validTimeState(dateFrom, dateTo)
            * from table1
            where table1.ID == "ID1";
    
        UPDATE_RECORDSET table1
            setting ValidTo = 2\2\2004
            where table1.ID == "ID1";

    这里我们更新ID为ID1纪录的截止日期,如果调整后有条纪录和这个新的截止日期有冲突,AX会自动调整那条纪录的起始日期。

    Query类有几个方法来处理有效期状态:validTimeStateAsOfDate、validTimeStateAsOfDateTime、validTimeStateDateRange、validTimeStateDateTimeRange。

        Table1 table1;
        Query qry;
        QueryRun qRun;
        QueryBuildDataSource qBDSource;
        date dateMinimum = 1\1\1900,
            dateMaximum = 31\12\2154;
        
        qry = new Query();
        qry.validTimeStateDateRange(dateMinimum, dateMaximum);
        qBDSource = qry.addDataSource(tablenum(Table1));
        qBDSource.addOrderByField(fieldNum(Table1,ID));
        qRun = new QueryRun(qry);
    
        while (qRun.next())
        {
            table1 = qRun.get(Table1);
        ...
        }

    更多有关有效时间状态表的信息可以在MSDN上找到:http://msdn.microsoft.com/en-us/library/gg861781.aspx

     

  • 相关阅读:
    subprocess 子进程模块
    3.5 魔法方法
    ThinkPHP中,display和assign用法详解
    linux常用指令
    退出当前Mysql使用的db_name 的方式
    PHP中GD库是做什么用的? PHP GD库介绍11111111
    include跟include_once 以及跟require的区别
    全局变量跟局部变量
    关于define
    创建、删除索引---高级部分
  • 原文地址:https://www.cnblogs.com/duanshuiliu/p/2630529.html
Copyright © 2011-2022 走看看