Reihenfolge der Trigger beim Import per XmlPort

20. Juli 2017 15:00

Hallo zusamen,

ich bin ein ziemlicher NAV-Neuling und stehe gerade vor der Aufgabe Daten in Nav2016 per XmlPort zu importieren.
Hintergrund: Wir führen gerade Nav2016 + Branchenlösung ein und kommen dabei von einer stark erweiterten Nav3 / Nav2009-Installation
Daher haben wir uns entschlossen, gerade die großen Datenmengen per XmlPort zu importieren.

Um mal vom ewigen Bücher-lesen weg zu kommen und eigene Erfahrungen zu sammeln, habe ich mir aktuell die Aufgabe gestellt unsere Debitoren nach Nav2016 zu importieren.

Die besondere Herausforderung dabei ist, dass in den Daten Fehler enthalten sein können, die das importieren verhindern. So haben wir z.B. in GlobalDimension1Code den Wert GmbH stehen, der aber noch nicht in der Tabelle DimensionCode enthalten ist.

Meine Idee ist nun, alle solche Fehler vor dem tatsächlichen importieren in die Zieltabelle zu erkennen, in einer eigenen ImportFehler-Tabelle zu vermerken und dann den aktuellen Datensatz zu überspringen. Dann kann ich später die Fehler geballt bereinigen (wahlweise per Code oder durch Einträge in den entsprechenden Tabellen). In einem zweiten Anlauf müsste mein Xml dann vollständig importiert werden.

Um das zu erreichen habe ich mir im XmlPort ein lokales Boolean angelegt, in dem ich mir speichere, ob der aktuelle Datensatz übersprungen werden soll oder nicht.
Code:
OnInitXMLport()
skipCurrRecord := FALSE;


Im OnAfterAssignField-Trigger will ich dann jeweils den Inhalt überprüfen und mit ggf. in meinem Boolean festhalten, ob der komplette Datensatz zu überspringen wäre.

Code:
GlobalDimension1Code - Import::OnAfterAssignField()
IF NOT existDimensioncode("<Customer>"."Global Dimension 1 Code") THEN BEGIN
  reportImportError(
      "<Customer>"."No.",
      'Global Dimenstion 1 Code',
      "<Customer>"."Global Dimension 1 Code",
      'Dimensionscode in Tabelle Dimension (349) nicht vorhanden');
 skipCurrRecord := TRUE;
END


Jetzt fehlt mir aber der Trigger, an welchem ich mein Boolean abfragen könnte, um dann ggf. meinen Skip auszuführen.
Ich hatte eigentlich erwartet, dass nach dem Zuweisen der Felder der Trigger <Customer> - Import::OnBeforeModifyRecord() oder vielleicht auch <Customer> - Import::OnBeforeInsertRecord() gefeuert wird, aber tatsächlich laufe ich dann durch die OnValidate-Trigger der einzelnen Tabellen-Felder.

Hat mir vielleicht jemand einen Tipp, welcher Trigger hier am besten zu verwenden wäre?

Re: Reihenfolge der Trigger beim Import per XmlPort

20. Juli 2017 16:20

mmmh, ich würde nach dem Schreiben in deine Error Tabelle ein CurrXMLPort.skip platzieren damit der diesen Datensatz überspringt.

dann sollt er auch die Trigger nicht anrühren...

Re: Reihenfolge der Trigger beim Import per XmlPort

24. Juli 2017 09:07

Ja, im Moment habe ich das so umgesetzt. Leider bekomme ich so aber die möglichen Probleme mit den verbleibenden Feldern in diesem Datensatz mit.

Ich habe übrigens noch eine kuriose Entdeckung gemacht:
Ich rufe den Import des XmlPorts aus einer eigenen CodeUnit auf. Dadurch springt mir der CurrXmlPort.Skip (im Debugger) jedes mal aus dem Code des XmlPorts in den Code der CodeUnit. Er scheint da also nur den aktuellen Trigger zu skippen, denn er arbeitet danach ungerührt den nächsten anstehenden Trigger im XmlPort ab ohne den Datensatz zu wechseln. Erst ein CurrXmlPort.break löst das gewünschte Verhalten aus.