X++ Chain of Commands in Dynamics 365 for Finance and Operations

Für die Entwicklung von Anpassungen mit Hilfe von X++ in Dynamics 365 for Finance and Operations wurden von Microsoft mit dem neuen Release des ERP-Produktes neue Best Practice Vorgaben veröffentlicht. Grundsätzlich verfolgt Microsoft die Strategie, dass eigene Anwendungsanpassungen einfacher in Upgradeszenarien in der ERP-Software einbezogen werden können. Bisher musste bei der Installation von Upgrades in der Anwendung, bspw. Cumulative Updates, ein manueller Merge zwischen Anpassungen und Erweiterungen von Microsoft vorgenommen werden.

Technisch wird mit Microsoft Dynamics 365 for Finance and Operations (früher Microsoft Dynamics AX) die Möglichkeit der Anpassung des Over-Layering aus den vorangegangenen Versionen des Produktes durch Extensions sukzessive abgelöst.

Das Announcement für die Versiegelung von bestimmten Anwendungsbereichen wurde Anfang dieses Kalenderjahres mit der folgenden Planung konkretisiert.

Damit sind Anpassungen per Over-Layering in den Models für App Platform, App Foundation und AppSuite nicht mehr Best Practice konform und werden von 2017 an nur noch 3 Jahre lang unterstützt. Anpassungen per Extensions sind damit als Best Practice bei Anpassungen in der ERP-Anwendung Dynamics 365 for Finance and Operations vorgegeben. In den letzte Platform Updates wurden immer mehr Anpassungsmöglichkeiten der Extensions unterstützt, wie z.B. das Ändern eines Extended Data Types auf einem Tabellenfeld. Die vollumfängliche Flexibilität für Programmänderungen aus dem Over-Layering wird jedoch aktuell mit Extensions (noch) nicht unterstützt.

Um diesen Umstand gerecht zu werden, wird Microsoft mit dem Feature Chain of Commands (CoC) eine flexiblere Möglichkeit für Anpassungen mit Extensions angekündigt. Chain of Commands bringt mehr Möglichkeiten in der Anpassung von Quellcode, weit über Events hinaus. Durch den Befehl next können Methoden flexibler angepasst werden. Das folgende Beispiel zeigt die Anwendung von Chain of Command in der Klasse InventPosting:

class InventPosting
{

InventTable inventTable

public void new (inventTable _inventTable)
{
inventTable = _inventTable;
}

protected getStandardVolume(inventTableType _inventTableType)
{
return _inventTableType.Heigt * _inventTableType.Width * _inventTableType.Width;
}
public void postLoadVolume(TMSLoad _tmsLoad)
{
ttsbegin;
_tmsLoad.Volume = this.getStandardVolume(inventTable.type());
_tmsLoad.Post();
ttscommit;
}
}

Die bisherigen Ansätze für Anpassung der einzelnen Methoden wie bspw. post sind einzelne Events wie posting oder posted gewesen.

Mit Hilfe von Chain of Commands können nun durch einen Wrapper um die Standardfunktionen herum weitere Logiken unter Benutzung von äußeren Variablen, Transaktionen etc. bereitgestellt werden.

Im Folgenden Beispiel wird die Standard-Volumenberechnung eines Artikels durch Chain of Commands und die Nutzung des next-Befehls eine Berechnung erweitert, ohne die Standard-Objekte anzupassen. Zudem wird um die postLoadVolume-Funktionalität eine Transaktion für das Berechnen von Zuschlägen genutzt.

[ExtensionIf(ClassStr(InventPosting))]
class InventPosting_Extension
{
InventTable inventTable

protected getStandardVolume(inventTableType _inventTableType)
{
Volume volume = next getStandardVolume(_inventTableType);
return volume * inventTable.PackageFactor;
}
public void postLoadVolume(TMSLoad _tmsLoad)
{
ttsbegin;
next postLoadVolume(_tmsLoad);
_tmsLoad.CalcCharges();
ttscommit;
}
}

Durch diese angekündigte Funktion können Extension-Anpassungen flexibler in Kundenprojekten abgebildet und nach Best Practice Vorgaben umgesetzt werden.

Auf der Seite für die Roadmap von Dynamics 365 wird dieses Neuerung unter dem Eintrag „Development and customization – Method wrapping and chain of command“ offiziell beschrieben.