我们知道在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;
}
{
;
//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;
}
{
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方法了。