Skip to content
 

XML-Datei aus Navision erstellen

In meinem letzten Beitrag über XML-Ports in Navision habe ein sehr simples Grundmodell skizziert, wie man in Dynamics NAV 5.0 SP1 XML-Ports ansprechen kann.

Heute möchte ich das Beispiel ein wenig ausbauen und vor allem auf die Gestaltung des XMLPorts mit einer variablen Anzahl von Unterknoten eingehen.

 

XML-Datei

Zum besseren Verständnis schauen wir uns am Beginn gleich einmal das gewünschte Ergebnis an:

XML-Ergebnis-Datei

Zu einem Mitarbeiter soll neben den allgemeinen Daten (Name, Geburtsdatum, Gehalt) auch die variable Anzahl der Kinder mit Namen und Alter abgespeichert werden.

 

XMLPort

Struktur

Den entsprechenden XMLPort habe ich folgendermaßen aufgebaut:

XMLPort - Struktur

XMLPort – Struktur

Zu beachten ist der SourceType Table beim dynamischen Unterknoten „Kind“. Die DataSource wurde dabei auf Integer festgelegt (und der Name statt <Integer>(Integer) auf Kind(Integer) abgeändert).

Ich habe auch dieses Beispiel wieder bewußt sehr einfach gehalten. So würde man z.B. in Navision mangels dynamischer Arrays wohl eher auf eine temporäre Tabelle zum Zwischenspeichern der Kinderdaten zurückgreifen.

Der Einfachheit halber setze ich aber voraus, dass es keine Mitarbeiter mit mehr als 10 Kindern geben wird, um dennoch auf ein Array (eben mit fixer Dimensionsanzahl) zurückgreifen zu können.

Das Feld „KinderAnzahl“ soll nicht mit einem Fixwert beschickt sondern dynamisch aus der Anzahl der übergebenen Kinder-Daten errechnet werden.

Globale Variablen

Globale Variablen für den dynamischen Unterknoten

Globale Variablen für den dynamischen Unterknoten

 

In g_intKinderZaehler wird automatisch die Anzahl der übergebenen Kinder hochgezählt.

Die Daten pro Kind (im Beispiel: Name und Alter) stehen im Array g_strKind. Die Länge dieser Variablen (im Beispiel: 20) muss der Länge des längsten „Unterfeldes“ (z.B. KindName) entsprechen, ansonst kann ein Laufzeitfehler auftreten – Siehe auch Routine AddKind.

Die Array-Dimensionen habe ich folgendermaßen festgelegt (wie gesagt: dynamsiche Arrays kennt NAV 5.0 SP1 nicht):

Festlegen der Array-Dimensionen für den Unterknoten

Festlegen der Array-Dimensionen für den Unterknoten

 

  • Die 1. Dimension bezieht sich auf die maximale Anzahl der Kinder: 10
  • Die 2. Dimension muss der Anzahl der Unterknoten-Elemente entsprechen (pro Kind: Name und Alter)

 

Programmierung

Wie wird nun die variable Anzahl an Kindern befüllt?

Ermittlung der Anzahl der Kinder

Ermittlung der Anzahl der Kinder

 

Im Trigger OnInitXMLPort() wird der „Kinder-Zähler“ auf 0 gesetzt.

Bei der Ausgabe der Daten wird diese Zähler-Variable im Trigger OnPreXMLPort() dem Element „KinderAnzahl“ zugewiesen.

Wie werden nun die Kind-Daten an den XML-Port übergeben?

Zuweisung der Kinder und Erhöhung des Zählers

Ich habe dazu eine Routine „AddKind“ entwickelt, welche meine Array-Variable entsprechend befüllt und dabei auch den Kinder-Zähler hochzählt.

Wie erfolgt nun die Ausgabe dieser Kinddaten?

Ausgabe der dynamischen Kinder-Daten

Ausgabe der dynamischen Kinder-Daten

 

Im Trigger „Kind – Export::OnPreXMLItem()“ wird festgelegt, wieviele Unter-Elemente auszugeben sind. Im Trigger „Kind – Export::OnAfterGetRecord()“ erfolgt schließelich die Zuweisung der Array-Variablen an die XML-Unterknotenelemente.

 

Nur der Vollständigkeit halber möchte ich auch noch den Programmcode zur Befüllung der Mitarbeiterdaten anführen, welche ich mittels meiner Routine „SetMitarbeiter“ vornehme:

Befüllung der Mitarbeiterdaten

Befüllung der Mitarbeiterdaten

 

XMLPort-Aufruf

Zu guter Letzt fehlt uns jetzt nur noch der Aufruf unseres XMLPorts.

Die grundsätzliche Vorgangsweise habe ich ja bereits in einem früheren Artikel beschrieben. Heute wollen wir aber auch noch die neuen Erweiterungen berücksichtigen und in unserer Aufruf-CodeUnit einbauen:

Aufruf des XML-Ports

Aufruf des XML-Ports

 

Schöne Grüße – Christian

Antworten

*

Kommentare werden moderiert. Es kann etwas dauern, bis dein Kommentar angezeigt wird.