2012年5月5日星期六

How to delete Identical Objects

static void THK_FindAndDeleteIdenticalObjects(Args _args)
{
/*
Delete Identical Objects
Job to remove the identical copy from VAR layer.   
For some unknown reason, some AOT objects are touched in VAR layer but actually are identical copy.
When the developer compared the VAR layer object with the one in lower layer (BUS, SYS etc.),
AX showed it was an identical copy.Here is the example on how you can remove the identical copy in X++ code:
*/
    SysTreeNode     comparable1, comparable2;
    TreeNode        curLevelTreeNode, upperLevelTreeNode;
    UtilIdElements  utilElements, joinUtilElements;
;
    if(!box::yesNo("Are you sure delete Identical Objects",dialogbutton::No,"delete Identical Objects"))
        return;
       
    while select UtilElements
        where   UtilElements.utilLevel        == UtilEntryLevel::var &&
                (
                UtilElements.recordType     == UtilElementType::Form            ||
                Utilelements.recordType     == UtilElementType::Report          ||
                Utilelements.recordType     == UtilElementType::Table           ||
                Utilelements.recordType     == UtilElementType::Class           ||
                Utilelements.recordType     == UtilElementType::Enum            ||
                Utilelements.recordType     == UtilElementType::ExtendedType
                )
    {  
        //Should use join if for a normal table, but not applicable for UtilElements
        //Performance hit if use exists join           
        select firstonly recid from joinUtilElements               
            where   joinUtilElements.utilLevel          != UtilElements.utilLevel       &&
                    joinUtilElements.name               == UtilElements.name            &&
                    joinUtilElements.recordType         == UtilElements.recordType;
        if (joinUtilElements.RecId)
        {
            curLevelTreeNode    = SysTreeNode::findNodeInLayer( UtilElements.recordType,
                                                                UtilElements.name,
                                                                UtilElements.parentId,
                                                                UtilElements.utilLevel);                   
            upperLevelTreeNode  = SysTreeNode::getLayeredNode(curLevelTreenode, 1);
            comparable1         = SysTreeNode::newTreeNode(curLevelTreeNode);
            comparable2         = SysTreeNode::newTreeNode(upperLevelTreeNode);
            if(SysCompare::silentCompare(comparable1, comparable2))
            {
                info(strFmt("Element name: %1, Element type: %2",
                        UtilElements.name,
                        enum2str(UtilElements.recordType)));                   
                //Remove the node
              
                //curLevelTreeNode.AOTdelete();
            }
        }
    }
}

没有评论:

发表评论