• 更改维度显示


    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方法了。
  • 相关阅读:
    1055 The World's Richest (25 分)
    1048 Find Coins (25 分)散列
    经典多线程问题(三)-子线程与主线程的循环打印
    经典多线程问题(二)-生产者消费者问题
    源码分析 CurrentHashMap 1.8
    源码分析 CurrentHashMap 1.7
    源码分析 HashTable与CurrentHashMap1.7与currentHashMap1.8对比
    源码分析 HashMap 1.8
    源码分析 HashMap 1.7
    Linux复习(常用命令)
  • 原文地址:https://www.cnblogs.com/Farseer1215/p/1237691.html
Copyright © 2020-2023  润新知