Zum Inhalt springen

Microsoft Dynamics 365 for Finance and Operations, Enterprise Edition – Interoperabilität von X++ und C#

Microsoft Dynamics 365 for Finance and Operations, Enterprise Edition (kurz: D365FOE) verwendet, wie alle Microsoft Applikation, das .NET Framework. Da stellt sich für EntwicklerInnen natürlich sofort die Frage, ob man in der D365FOE-Entwicklung auch vom .NET-Framework Gebrauch machen kann.

Natürlich! Aus der Programmiersprache X++ von D365FOE kann C# Code aufgerufen werden. Ich zeige euch anhand eines Beispiels, wie aus D365FOE C# verwendet werden kann. Sehr stark vereinfacht kann der Ablauf meines Beispiels wie folgt visualisiert werden:


Normalerweise wird von X++ auf die SQL-Datenbank von D365FOE zugegriffen. In meinem Beispiel wird aus X++ eine Methode der C# Library aufgerufen, welche dann ein Query der SQL Datenbank von D365FOE aufruft.

Als Business Case zum Aufzeigen der Interoperabilität zwischen X++ und C# habe ich Folgendes gewählt: Die Library in C# stellt eine statische Methode zur Verfügung, mit welcher das Kreditlimit eines Debitors abgefragt werden kann. Dazu wird in der C# Library ein Query auf die Tabelle «CustTable» erstellt. Anhand des Debitoren-Accounts wird das Kreditlimit abgefragt. Dies entspricht in D365FOE den folgenden Daten:


Wird somit für den Debitor «US-040» das Kreditlimit abgefragt, dann muss unsere C#-Methoden den Wert von 500'000.00 zurück liefern.

Im UML-Sequenz-Diagramm sieht der Ablauf wie folgt aus:

 

1 C# Library

Als erstes erstelle ich in Visual Studio eine Solution sowie ein Projekt für die C# Library:


Bei meinem neu erstellten Projekt «InteropDemoClassLibrary» muss ich noch folgende Referenzen hinzufügen, damit ich von C# auf die D365FOE-Datenbank zugreifen kann:

  • Microsoft.Dynamics.AX.Framework.Linq.Data.dll
  • Microsoft.Dynamics.AX.Framework.Linq.Data.Interface.dll
  • Microsoft.Dynamics.AX.Frameowrk.Linq.Data.Msil.dll

LINQ steht für Language Integrated Query und gehört zu .NET. LINQ macht es möglich, auf Daten aus verschiedenen Datenquellen (z.B. SQL, XML, usw.) vereinfacht zuzugreifen.

Zudem werden folgende Basis-Libraries benötigt:

  • Microsoft.Dynamics.AX.Xpp.Support.dll
  • Microsoft.Dynamics.AX.Data.Core.dll
  • Microsoft.Dynamics.AX.Xpp.AxShared.dll

Die Tabelle «CustTable» befindet sich im Model «Application Suite». Damit ich aus meiner C#-Methode auf diese Tabelle zugreifen kann, muss das Model «Application Suite» als Referenz hinzugefügt werden. Bei dieser Referenz muss da Flag «CopyLocal» auf «False» gesetzt werden:


Als Übersicht zeige ich noch einmal alle hinzugefügte Referenzen:


Nachdem nun die Referenzen konfiguriert sind, implementiere ich die Klasse mit der statischen Methode «GetCreditMax». Diese Methode macht ein Query auf die Tabelle «CustTable» und liefert Kreditlimit für den als Parameter angegeben Debitor. Die Klasse hat somit folgende Implementation:


Wie im Programmcode ersichtlich, wurde zur Einfachheit kein Fehlerhandling implementiert. Ist der Debitor in der Tabelle nicht vorhanden, dann wird 0 als Kreditlimit zurückgegeben.

2 X++ Test-Klasse

Soweit haben wir einmal die C#-Library erstellt. Nun möchte ich natürlich auch zeigen, dass diese Library auch wie beschrieben funktioniert. Dazu erstelle ich eine Test-Klasse vom Typ «Runnable Class (Job)». Somit habe ich in meiner Solution nun 2 Projekte:

 

  • C# Library Projekt «InteropDemoClassLibrary»
  • Dynamics Projekt «InteropDemoTestClass»
    • Dieses Projekt beinhaltet die Klasse «InteropDemoTestClass», welches ich als «Startup Object» konfiguriert habe

Damit mein Test-Projekt («InteropDemoTestClass») meine C# Library («InteropDemoClassLibrary») kennt, muss diese als Referenz im Projekt hinzugefügt werden:


Innerhalb der Klasse «InteropDemoTestClass» implementieren ich nun meine Tests zum Überprüfen, ob meine C# Library die richtigen Resultate liefert:


Wenn ich nun diese Klasse ausführe, dann erhalte ich folgendes Resultat:


Es ist somit ersichtlich, dass Debitoren die folgenden Werte als Kreditlimit besitzen:

  • Debitor «US-040»: 500'000.00
  • Debitor «US-019»: 250'000.00

Für den Beweis hier noch die beiden Debitoren mit den entsprechenden Werten für Kreditlimit:

 

Somit hat die C# Library korrekt funktioniert.

3 Zusammenfassung

In diesem Blog habe ich Ihnen die Möglichkeiten bzgl. Interoperabilität von C# mit X++ gezeigt. Ich persönlich finde die technischen Möglichkeiten mit D365FOE super. Dadurch ist D365FOE ein sehr flexibles und skalierbares ERP-System, welches die unterschiedlichsten Anforderungen eingesetzt sowie angepasst werden kann. Ich hoffe, sie hatten an diesem Beispiel auch so viel Spass wie ich.


Standorte
Telefon: +41 844 844 120E-Mail:
Hauptsitz Boss Info AG Tannackerstr. 3 CH-4539 Farnern
Standort Aarburg Boss Info AG Paradieslistr. 4 CH-4663 Aarburg
Standort Ehrendingen Boss Info AG Böndlern 2 CH-5420 Ehrendingen
Standort Fällanden Boss Info AG Bruggacherstrasse 26 CH-8117 Fällanden
Standort Horw Boss Info AG Altsagenstrasse 1 CH-6048 Horw
Standort Langenthal Boss Info AG Gaswerkstrasse 27 CH-4900 Langenthal
Standort Münchenbuchsee Boss Info AG Talstrasse 3 CH-3053 Münchenbuchsee
Standort Sursee Boss Info AG Bahnhofstrasse 7a CH-6210 Sursee