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
Dabei führt die Verwendung der Werte des Base-Enum zu folgenden Ergebnissen:
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
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
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
Dabei führt die Verwendung der Werte des Base-Enum zu folgenden Ergebnissen:
SysMergeDirection::None
SysMergeDirection::TextA
SysMergeDirection::TextB
{
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)