Farseer

导航

更改维度显示

AX有个很不错的功能,可以隐藏或者显示某个维度,比如仓库,库位,批处理号等,这样的操作几乎在涉及业务的各个窗体都有,比如销售,采购订单行,库存日志,物料现有量,等等窗体,都可以库存->维度显示 按钮进行相关维度的设置。这个功能在大多数情况下没什么问题,只是有些时候用户想每次进入的时候都显示特定的维度,这个时候就有些困惑,当然我们可以要求用户去选择 维度显示窗体里的 保存设置,但是由于AX的这个功能是依托于SysPackable接口的,它的实现机制跟RunBase的保存用户的选择完全一样,所以这样所有的用户都要在每个窗体上操作一遍类似的动作。其实有些公司的物料的维度设定是差不多的,比如其实都只有仓库维度,去要求每个用户都每个窗体都做一遍这动作确实有些残忍,有几个同行跟我讨论过这个问题,在这里记录一下。

我们知道在RunBase框架下,如果SysLastValue表里没有保存用户的选择记录,也就是如果用户是第一次操作某个窗体或者报表,AX用initParmDefault去初始化一些值。AX中控制维度显示与否是通过InventDimCtrl及其一系列的子类实现的,其中其直接子类InventDimCtrl_Frm实现了SysPackable接口,可以保存用户输入。与RunBase框架下的保存用户输入一样,InventDimCtrl_Frm也预留了initParmDefault这个方法,由于Sys层的实现者并不知道具体使用AX的公司需要显示哪些维度,所以他也不好在这个方法里写代码,于是这个方法并没有实现。
void initParmDefault()
{

}

如果我们在实施的时候具体知道需要显示哪些维度,就可以在这里写代码了,比如如下代码:
void initParmDefault()
{
    ;
    
//Add the InventDim to display
    dimParmVisibleGrid.InventColorIdFlag    = NoYes::Yes;
    dimParmVisibleGrid.InventLocationIdFlag 
= NoYes::Yes;
    dimParmVisibleGrid.InventBatchIdFlag    
= NoYes::Yes;
    dimparmVisibleGrid.WMSLocationIdFlag    
= NoYes::Yes;
}


注意这里有一点与RunBase的不同之处,RunBase里只有在用户没有操作过该窗体时才会调用initParmDefault方法,一旦操作过了,就会在SysLastValue里有了记录,也就不会调用initParmDefalut方法了,这是因为一般情况下如果SysLastValue表里有了相应的值,通过unPack方法恢复的时候,unPack方法都会返回true,而在类xSysLastValue的get方法里会根据unPack方法的返回值决定是否调用initParmDefault方法,一般情况下只有在SysLastValue表里没找到对应的记录的时候才会返回false,于是会调用initParmDefault,但是类InventDimCtrl_Frm的unPack方法

public boolean unpack(container packedClass)
{
    
int         version;
    container   c;

    
if (overRideUserSetup)
        
return false;

    
if (! packedClass)
        
return false;

    
// Is 5 for version 2.5 and earlier
    if (conlen(packedClass) == 5)
    
{
        
if (InventDimFixedClass::inventDimParm2InventDimFixed(dimParmVisibleGrid) == conpeek(packedClass,1))
            
return false;

        InventDimFixedClass::inventDimFixed2InventDimParm(conpeek(packedClass,
1),dimParmVisibleGrid);
        dimParmVisibleGrid.ConfigIdFlag     
= conpeek(packedClass,2);
        dimParmVisibleGrid.ItemIdFlag       
= conpeek(packedClass,#ItemIdFlag);
        dimParmVisibleGrid.ClosedFlag       
= conpeek(packedClass,#ClosedFlag);
        dimParmVisibleGrid.ClosedQtyFlag    
= conpeek(packedClass,#ClosedQtyFlag);
        
return true;
    }


    version 
= RunBase::getVersion(packedClass);

    
switch (version)
    
{
        
case #CurrentVersion:
            [version,c] 
= packedClass;
            
if (! c)
                
return false;

            InventDimCtrl_Frm::unpackDimParm(dimParmVisibleGrid,c);
            
break;

        
default:
            
return false;
    }


    
return false;
}

我们可以看到,该方法的最后返回的false,这样它始终会调用initParmDefault,于是如果你在initParmDefalut方法里加了要显示某个维度的话,它就按照在InitParmDefault中指定的维度与用户上次保存的维度取并集来显示了,我不是很清楚是写Sys层代码的哥们故意为之还是手误,无所谓了,如果觉得奇怪,让unPack返回ture好了,这样一旦用户操作过该窗体并选择了保存设置就不会调用InitParmDefault方法了。

posted on 2008-07-07 18:45  佛西亚  阅读(1364)  评论(1编辑  收藏  举报