在前文(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更为简单。