zoukankan      html  css  js  c++  java
  • [AX2012]代码更改默认财务维度

    在前文(http://www.cnblogs.com/duanshuiliu/p/3243048.html)最后演示了如何使用代码更改默认财务维度,那段代码模拟了创建各数据表记录的过程,实际上AX提供了一些类及方法来简化,下面给出更多如何通过代码更改财务维度的例子:

    方法一:使用DimensionAttributeValueSetStorage类

    static void ChangeCustFinancialDimension(Args _args) 
    { 
        CustTable                           custTable; 
        DimensionAttributeValueSetStorage   dimensionStorage; 
        DimensionAttribute                  customerDimensionAttribute; 
        DimensionAttributeValue             newDimensionValue; 
      
        ; 
        ttsBegin; 
        custTable =  CustTable::find('1101',true);
      
        //查找Customer财务维度主记录
        customerDimensionAttribute = DimensionAttribute::findByName("Customer"); 
        //查找值为“1102”的Customer维度的维度值记录,最后一个参数true表示如果没有找到记录就新建
        newDimensionValue = DimensionAttributeValue::findByDimensionAttributeAndValue(customerDimensionAttribute, "1102",false, true); 
      
        //根据客户记录表的默认维度查找DimensionAttributeValueSetStorage
        dimensionStorage = DimensionAttributeValueSetStorage::find(CustTable.DefaultDimension); 
        //直接添加维度值记录到DimensionAttributeValueSetStorage
        dimensionStorage.addItem(newDimensionValue); 
      
        //save()返回的就是新的DimensionAttributeValueSet记录的recId
        CustTable.DefaultDimension = dimensionStorage.save(); 
      
        CustTable.update(); 
        ttscommit; 
    } 

    上面的例子中将客户代码为1101的客户默认维度中的“Customer”维度值更改为“1102”。

    方法二:使用类AxdDimensionUtil、DimensionDefaultingService

    static void replaceDefaultDimensions2(Args _args)
    
    {
    
        CustTable                       custTable = CustTable::find('1101'); 
        container                       defDimensionCon; 
        DimensionDefault                dimensionDefault;
    
        ; 
        defDimensionCon += 3; //两个维度
        defDimensionCon += 'Department';//先维度名称
        defDimensionCon += 'OU_4608';//后维度值,依次存放在container中
        defDimensionCon += 'CostCenter';
        defDimensionCon += 'OU_4615';
        defDimensionCon += 'Customer';
        defDimensionCon += '1101';
        //使用上面的维度值得到一个新的默认维度记录RecId
        dimensionDefault = AxdDimensionUtil::getDimensionAttributeValueSetId(defDimensionCon);
        
        //更新到CustTable
        ttsBegin;
        custTable.selectForUpdate(true);
        if (custTable.DefaultDimension)
            //合并新的维度值到现有维度
            custTable.DefaultDimension = DimensionDefaultingService::serviceMergeDefaultDimensions(dimensionDefault, custTable.DefaultDimension);
        else
            custTable.DefaultDimension = dimensionDefault;
        custTable.doUpdate();
    
        ttsCommit;
    
    }
    
     

    上面两个例子演示如何添加维度值到默认维度,如果是要删除默认维度中的某个维度值又该怎么办呢?参照上面的两个方法,也有两种删除维度的办法:

    方法一

    static void DeleteDimensionValue1(Args _args)
    {
        CustTable                           custTable = CustTable::find('1101');
        DimensionAttributeValueSetStorage   dimStorage;  
        ;
        ttsBegin;
        custTable.selectForUpdate(true);
        dimStorage = DimensionAttributeValueSetStorage::find(custTable.DefaultDimension);  
        dimStorage.removeDimensionAttribute(DimensionAttribute::findByName('CostCenter').RecId);  
        custTable.DefaultDimension = dimStorage.save();  
        custTable.update();
        ttsCommit;
    }

    方法二

    static void DeleteDimensionValue2(Args _args)
    {
        CustTable   custTable = CustTable::find('1101');
        container   c;  
        int         i;
        ;
        
        c = AxdDimensionUtil::getDimensionAttributeValueSetValue(custTable.DefaultDimension);  
        i = conFind(c, 'CostCenter');      
        if(i)  
        {      
            c = conDel(c, i+1, 1);   
            c = conDel(c, i, 1);    
        }  
        c = conDel(c, 1, 1);  
        c = conIns(c, 1, conLen(c) / 2);  
       
        ttsBegin;
        custTable.selectForUpdate(true);
        custTable.DefaultDimension  = AxdDimensionUtil::getDimensionAttributeValueSetId(c);
        custTable.update();
        ttsCommit;
    }

    两种方法都不是很复杂,实际上AxdDimensionUtil内部用的也有用DimensionAttributeValueSetStorage,所以还是直接使用DimensionAttributeValueSetStorage更为简单。

  • 相关阅读:
    适配器
    装饰器
    getOwnPropertyDescriptor
    发布订阅
    策略模式
    window.requestAnimationFrame() 和 window.cancelAnimationFrame()
    L1-056 猜数字
    L1-055 谁是赢家
    L1-054 福到了
    L1-053 电子汪
  • 原文地址:https://www.cnblogs.com/duanshuiliu/p/3245585.html
Copyright © 2011-2022 走看看