Shared Projects vergleichen

Vor kurzem stand ich wieder einmal vor der Thematik, den Inhalt zweier Projekte vergleichen zu müssen. Da ich bis dato keine Möglichkeit gefunden habe, dies mit Bordmitteln von Dynamics AX durchzuführen, habe ich mir einen Job geschrieben, der genau dies tut.

Der Job verwendet die temporäre Tabelle TmpAOTImport aus dem Standard, in die zuerst mit Hilfe der Klasse TreeNodeTraverser sämtliche AOT-Objekte der beiden Projekte in jeweils einer Tabelleninstanz geschrieben wird. Danach werden diese beiden Instanzen über einen simplen SELECT miteinander verglichen.

Über den Standard-Enum SysMergeDirection (einen besseren habe ich nicht gefunden) kann man definieren, was ausgegeben werden soll.

Beim Wert NONE werden Objekte beider Projekte ausgegeben, die im jeweils anderen nicht vorkommen.
Beim Wert TEXTA werden alle Objekte aufgelistet, die im Projekt1, nicht aber im Projekt2 vorkommen und vice versa beim Wert TEXTB.

Das Ergebnis des Jobs ist in allen Fällen ein einfaches Infolog.

Beispiel: Die folgenden beiden Projekte gilt es zu vergleichen

Projects

Dabei führt die Verwendung der Werte des Base-Enum zu folgenden Ergebnissen:

SysMergeDirection::None

SysMergeDirection::TextA

SysMergeDirection::TextB

 

static void CompareSharedProjects(Args _args)
{
    TmpAotImport TmpAotImport1;
    TmpAotImport TmpAotImport2;

    sysMergeDirection sysMergeDirection = sysMergeDirection::TextA;
    treeNodeName projectName1 = 'Project_1';
    treeNodeName projectName2 = 'Project_2';

    TmpAotImport getObjectsList(treeNodeName _nameOfProject)
    {
        TreeNode TreeNode;
        projectNode projectNode;
        projectNode ProjectNodeRunNode;
        TreeNodeIterator TreeNodeIterator;
        TreeNodeTraverser TreeNodeTraverser;
        TmpAotImport TmpAotImport;

        #AOTExport
        ;

        projectNode    = infolog.projectRootNode();
        projectNode    = projectNode.AOTfindChild(#expProjectShared);
        projectNode    = projectNode.AOTfindChild(_nameOfProject);

        ProjectNodeRunNode = projectNode.getRunNode();

        TreeNodeTraverser = new TreeNodeTraverser(ProjectNodeRunNode);

        while(TreeNodeTraverser.next())
        {
            TreeNode = TreeNodeTraverser.currentNode();

            if( TreeNode.AOTObjectNode() &&
                enum2str(TreeNode.applObjectType()) != "ViewQuery")
            {
                select firstonly TmpAotImport
                where TmpAotImport.UtilElementType == TreeNode.applObjectType()
                   && TmpAotImport.TreeNodeName == TreeNode.treeNodeName();
                if (!TmpAotImport)
                {
                    TmpAotImport.TreeNodePath = TreeNode.treeNodePath();
                    TmpAotImport.UtilElementType = TreeNode.applObjectType();
                    TmpAotImport.TreeNodeName = TreeNode.treeNodeName();
                    TmpAotImport.insert();
                }
            }
        }

        return TmpAotImport;
    }
    ;

    TmpAotImport1 = getObjectsList(projectName1);
    TmpAotImport2 = getObjectsList(projectName2);

    if( sysMergeDirection == sysMergeDirection::None ||
        sysMergeDirection == sysMergeDirection::TextA )
    {
        while select TmpAotImport1
        notexists join TmpAotImport2
        where TmpAotImport1.UtilElementType == TmpAotImport2.UtilElementType
           && TmpAotImport1.TreeNodeName == TmpAotImport2.TreeNodeName
        {
            info(strFmt("%1: %2", TmpAotImport1.UtilElementType, TmpAotImport1.TreeNodeName));
        }
    }
    if( sysMergeDirection == sysMergeDirection::None ||
        sysMergeDirection == sysMergeDirection::TextB )
    {
        while select TmpAotImport2
        notexists join TmpAotImport1
        where TmpAotImport2.UtilElementType == TmpAotImport1.UtilElementType
           && TmpAotImport2.TreeNodeName == TmpAotImport1.TreeNodeName
        {
            info(strFmt("%1: %2", TmpAotImport2.UtilElementType, TmpAotImport2.TreeNodeName));
        }
    }
}

Wer Lust hat, kann den Job ja noch um die Funktion "Liste jene Objekte, die in beiden Projekten vorkommen, auf" erweitern ;-)

Natürlich wäre es auch sinnvoll, den Job nicht einfach nur ein Infolog ausgeben zu lassen, sondern die ermittelten Objekte selbst in ein neues Projekt zu überführen. Wie man dies tun könnte, hab ich ja bereits beschrieben.

Der Job wurde in Dynamics AX 2009 entwickelt, funktioniert aber mit Anpassungen auch in älteren Versionen (in Axapta 3.0 gibt es z.B. den Base Enum SysMergeDirection nicht)

Dieser Beitrag bezieht sich auf die Version:
Dynamics AX 2009

Kommentar hinzufügen
 
 

 

 
 
 
Beiträge des aktuellen Monats
April 2024
MoDiMiDoFrSaSo
1234567
891011121314
15161718192021
22232425262728
2930 
 
© 2006-2024 Heinz Schweda | Impressum | Kontakt | English version | Mobile Version
Diese Webseite verwendet Cookies, um Benutzern einen besseren Service anzubieten. Wenn Sie weiterhin auf der Seite bleiben, stimmen Sie der Verwendung von Cookies zu.  Mehr dazu