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:
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:
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
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):
- 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?
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?
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?
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:
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:
Schöne Grüße – Christian