zoukankan      html  css  js  c++  java
  • Inside Dynamics Axapta源代码赏析(五)

    第十二章 The Database layer
    1.更改RecVersion
    AX4.0使用了乐观并发控制,RecVersion是用来标识记录版本的。
    static void RecVersionChange(Args _args)
    {
        CustTable custTableSelected;
        CustTable custTableSelectedForUpdate;
        CustTable custTableUpdated;
        ;
        ttsbegin;

        select custTableSelected
            where custTableSelected.AccountNum 
    == '4000';

        select forupdate custTableSelectedForUpdate
            where custTableSelectedForUpdate.AccountNum 
    == '4000';

        select forupdate custTableUpdated
            where custTableUpdated.AccountNum 
    == '4000';

        
    // At this point, RecVersion in all three buffers are equal.

        custTableUpdated.CreditMax 
    = custTableUpdated.CreditMax;
        custTableUpdated.update();

        print custTableUpdated.recVersion;
        print custTableSelectedForupdate.recVersion;
        print custTableSelected.recVersion;


        
    // At this point, RecVersion is changed in the custTableUpdated
        
    // and custTableSelectedForUpdate buffers. CustTableSelected still
        
    // has its original value in RecVersion.

        ttscommit;
        pause;
    }

    2.跳过ForUpdate和TTSbegin,TTSCommit的检查.
     CustTable custTable;
        ;
        ttsbegin;
        select custTable where custTable.AccountNum 
    == '4000';
        custTable.CreditMax 
    = 1000;

        custTable.skipTTSCheck(
    true);
        custTable.update();
        ttscommit;
    这样是可以跳过,但为什么要跳过那?
    3.临时表的使用.
    通过setTmp和data两个方法可以搞定.
    static void TmpCustTable(Args _args)
    {
        CustTable custTable;
        CustTable custTableTmp;
        ;
        custTableTmp.setTmp();
        ttsbegin;
        
    while select custTable
        
    {
            custTableTmp.data(custTable);
            custTableTmp.doInsert();
        }

        ttscommit;
    }

    Table有两个方法,data()和setTmpData(),其中Data()是拷贝一份数据,而setTmpData()只是对象引用的传递.
    4.临时表的清空
    把临时表赋值为null的时候,内存被清空,临时文件被删除

    static void TmpLedgerTable(Args _args)
    {
        TmpLedgerTable tmpLedgerTable;
        ;
        tmpLedgerTable.CompanyId 
    = 'dat';
        tmpledgerTable.AccountNum 
    = '1000';
        tmpLedgerTable.AccountName 
    = 'Name';
        tmpLedgerTable.insert(); 
    // Insert into first dataset.

        tmpLedgerTable 
    = null// Allocated memory is freed
                               
    // and file is deleted.
        tmpLedgerTable.CompanyId = 'dat';
        tmpledgerTable.AccountNum 
    = '1000';
        tmpLedgerTable.AccountName 
    = 'Name';
        tmpLedgerTable.insert(); 
    // Insert into new dataset.
        
        
    //Check it
        while select * from tmpLedgerTable
        
    {
            print tmpLedgerTable.AccountName;
     
        }

        pause;
    }

    5.下面的这段代码正好印证了前面的说法,setTmpData是指向同一个对象的.

    static void TmpLedgerTable(Args _args)
    {
        TmpLedgerTable tmpLedgerTable1;
        TmpLedgerTable tmpLedgerTable2;
        ;
        tmpLedgerTable2.setTmpData(tmpLedgerTable1);

        tmpLedgerTable1.CompanyId 
    = 'dat';
        tmpledgerTable1.AccountNum 
    = '1000';
        tmpLedgerTable1.AccountName 
    = 'Name';
        tmpLedgerTable1.insert(); 
    // Insert into shared dataset.

        tmpLedgerTable2.CompanyId 
    = 'dat';
        tmpledgerTable2.AccountNum 
    = '1000';
        tmpLedgerTable2.AccountName 
    = 'Name';
        tmpLedgerTable2.insert(); 
    // Insert will fail with dublicate value.
    }

    6.ttsabort用于忽略记录的更改或插入.
    剩下的代码都是一些关于事务和锁的问题,跟数据库的理论类似,这里就不摘录了.


     

  • 相关阅读:
    C++:显式和隐式初始化、显式和隐式类型转换
    [软件工程]Windows下SVN服务端的配置
    国外免费电子书下载网站辑(二)
    Ubuntu12.04下eclipse代码提示框模糊的解决办法
    [.NET] 坐标变换
    生成了libgsl.lib、libgslcblas.lib文件
    [C#]as 和 is 的区别
    xp安装.net4.0失败解决方法
    国外免费电子书下载网站辑(一)
    [转]不同网段共享打印机
  • 原文地址:https://www.cnblogs.com/Farseer1215/p/515340.html
Copyright © 2011-2022 走看看