我们知道在RunBase框架下,如果SysLastValue表里没有保存用户的选择记录,也就是如果用户是第一次操作某个窗体或者报表,AX用initParmDefault去初始化一些值。AX中控制维度显示与否是通过InventDimCtrl及其一系列的子类实现的,其中其直接子类InventDimCtrl_Frm实现了SysPackable接口,可以保存用户输入。与RunBase框架下的保存用户输入一样,InventDimCtrl_Frm也预留了initParmDefault这个方法,由于Sys层的实现者并不知道具体使用AX的公司需要显示哪些维度,所以他也不好在这个方法里写代码,于是这个方法并没有实现。
如果我们在实施的时候具体知道需要显示哪些维度,就可以在这里写代码了,比如如下代码:
注意这里有一点与RunBase的不同之处,RunBase里只有在用户没有操作过该窗体时才会调用initParmDefault方法,一旦操作过了,就会在SysLastValue里有了记录,也就不会调用initParmDefalut方法了,这是因为一般情况下如果SysLastValue表里有了相应的值,通过unPack方法恢复的时候,unPack方法都会返回true,而在类xSysLastValue的get方法里会根据unPack方法的返回值决定是否调用initParmDefault方法,一般情况下只有在SysLastValue表里没找到对应的记录的时候才会返回false,于是会调用initParmDefault,但是类InventDimCtrl_Frm的unPack方法
我们可以看到,该方法的最后返回的false,这样它始终会调用initParmDefault,于是如果你在initParmDefalut方法里加了要显示某个维度的话,它就按照在InitParmDefault中指定的维度与用户上次保存的维度取并集来显示了,我不是很清楚是写Sys层代码的哥们故意为之还是手误,无所谓了,如果觉得奇怪,让unPack返回ture好了,这样一旦用户操作过该窗体并选择了保存设置就不会调用InitParmDefault方法了。