[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更为简单。

原文地址:https://www.cnblogs.com/duanshuiliu/p/3245585.html