给多个表的Dimension字段赋初值

[需求]
最近遇到这样一个需求,在实施的时候把系统现有的三个纬度前两个分别用于记录分公司和部门,在做财务凭证或者销售采购订单的时候,需要给这些表相应的Dimension字段的前两个纬度赋值,用户要求根据当前用户所属的分公司和部门直接赋值,而不想自己去选择。
[分析]
 最直观的想法就是修改各个表的InitValue()方法,给相应的表赋初值,不过这样的工作量有些大,要修改多个表,并且当需要赋初值的表增加时还需要继续修改相应的表。
AX中用Map实现表方法的共享,于是考虑用Map来实现这个功能。
只有Map还是不行的因为InitValue()这个方法还是在各个表上的,好在AX为了使用模板,所有的initValue()方法都会调用类classFactory的CreateRecord()方法,所以可以把代码添加到这里。
[解决方案]
1.创建DimensionMap
创建名为DimensionMap的Map,添加字段Dimension,设定其EDT属性为Dimension,然后把需要设定初始值的表与该Map用Dimension字段建立影射。
2.写一个工具类SysUtility,添加根据当前用户获取部门和分公司的方法

None.gif static  Container GetComanpyAndDepartmentOfCurrentUser()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    Container c;
InBlock.gif    EmplTable emplTable;
InBlock.gif    ;
InBlock.gif    select Dimension from emplTable
InBlock.gif    where emplTable.EmplId 
== curuserid();
InBlock.gif
InBlock.gif    
if(emplTable.Dimension[1]&&emplTable.Dimension[2])
InBlock.gif        
return [emplTable.Dimension[1],emplTable.Dimension[2]];
InBlock.gif    
else
InBlock.gif        
throw Error("@GCN588");
ExpandedBlockEnd.gif}
在这个工具类里再添加一个方法,用于判断表是否需要给Dimension赋初值,判断的标准是如果该表包含在DimensionMap中则需要赋初值,否则不需要
None.gif static  anytype IfNeedInitDimension(TableId tableId)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    #AOT
InBlock.gif    SysGlobalCache sysGlobalCache 
= classFactory.globalCache();
InBlock.gif    TreeNode treeNodeMap;
InBlock.gif    TreeNode treeNodeMapTable;
InBlock.gif    Name mapTableName;
InBlock.gif    str strPath;
InBlock.gif    ;
InBlock.gif
InBlock.gif    
//如果在全局缓存中没有对应的纪录,则添加之
InBlock.gif
    if(!sysGlobalCache.elements(TableStr(DimensionMap)))
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
//找到Map的Mapping路径
InBlock.gif
        strPath = strFmt(#TableMapsPath+@"\%1\Mappings",TableStr(DimensionMap));
InBlock.gif
InBlock.gif        treeNodeMap 
= TreeNode::findNode(strPath);
InBlock.gif        treeNodeMapTable 
= treeNodeMap.AOTfirstChild();
InBlock.gif
InBlock.gif        
while(treeNodeMapTable)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
//将属性添加到全局缓存
InBlock.gif
            mapTableName = treeNodeMapTable.AOTgetProperty("MappingTable");
InBlock.gif            sysGlobalCache.
set(TableStr(DimensionMap),tableName2Id(mapTableName),mapTableName);
InBlock.gif            treeNodeMapTable 
= treeNodeMapTable.AOTnextSibling();
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

InBlock.gif    
return sysGlobalCache.get(TableStr(DimensionMap),tableId,false);
InBlock.gif
ExpandedBlockEnd.gif}
3.在DimensionMap中添加方法,给表赋初值
None.gif void  InitDimension()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    str 
10 dirCompany;
InBlock.gif    str 
10 dirDepartment;
InBlock.gif    ;
InBlock.gif    [dirCompany,dirDepartment] 
= SysUtility::GetComanpyAndDepartmentOfCurrentUser();
InBlock.gif    
this.Dimension[1= dirCompany;
InBlock.gif    
this.Dimension[2= dirDepartment;
InBlock.gif
ExpandedBlockEnd.gif}
4.在classFactory的CreateRecord方法中添加代码调用DimensionMap的方法给相关表的Dimension字段赋初值
None.gif void  createRecord(Common common)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    SysRecordTemplate sysRecordTemplate;
InBlock.gif    ;
InBlock.gif    
if (! common.isTmp() && new SysDictTable(common.TableId).isRecordTemplateEnabled())
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        sysRecordTemplate 
= SysRecordTemplate::newCommon(common);
InBlock.gif        sysRecordTemplate.createRecord();
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
//赋予初始值
InBlock.gif
    if(SysUtility::IfNeedInitDimension(common.TableId))
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        common.DimensionMap::InitDimension();
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

转载于:https://www.cnblogs.com/Farseer1215/archive/2007/04/20/721585.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值