[Gelöst] XML Port Insert Trigger abschalten

20. September 2019 10:39

Hallo,

ich versuche gerade Kopf und Zeilen Daten mit einem XML Port ins NAV zu übertragen.
Beim Insert der Zeilen wird der Insert Trigger durchlaufen.
Dies verursacht ein Problem da er dabei prüft ob die Kopfdaten schon da sind.
Obwohl der Kopf natürlich vorher mit dem XML Port eingelesen worden ist, scheint er noch nicht in der DB zur Verfügung zu stehen und es kommt zu dem Fehler.

Kann ich da etwa am XML Port einstellen, das der Insert Trigger nicht mehr durchlaufen wird ?

Gruß Frank
Zuletzt geändert von FrausDo am 20. September 2019 11:46, insgesamt 1-mal geändert.

Re: XML Port Insert Trigger abschalten

20. September 2019 11:13

Entweder Commit nach dem Kopf oder Prüfen bei der Line für die Zeile in den Properties DefaultFieldsValidation auf False zu setzen.

Kein Gewähr.

Re: XML Port Insert Trigger abschalten

20. September 2019 11:20

FrausDo hat geschrieben:Obwohl der Kopf natürlich vorher mit dem XML Port eingelesen worden ist, scheint er noch nicht in der DB zur Verfügung zu stehen und es kommt zu dem Fehler.


Bist du dir damit sicher?
Wenn ich mich richtig erinnere arbeitet ein XML Port (bei XML Files) so:
Code:
<header>
   <docNo>doc1</docNo>
   <lines>
      <line>
         <no>line1</no>
      </line>
   </lines>
</header>


Code:
header.docNo := 'doc1';
repeat
   line.no = 'line1';
   line.insert(true);
until lines.next() = 0;
header.insert(true);


Ich empfehle dir temporäre Tabellen und sorge selbst dafür wann du nen Insert machst

Re: XML Port Insert Trigger abschalten

20. September 2019 11:45

Commit ist böse ! Punkt !

Nach deinem Post habe ich mir gedacht, geht ja auch anders.

Also werden erst alle Kopfdaten exportiert.
Dann alle Zeilendaten.

Und genauso eingespielt.

Das löst das akute Problem, jedoch nicht, dass es ohne Trigger läuft.

DanielF hat geschrieben:Entweder Commit nach dem Kopf oder Prüfen bei der Line für die Zeile in den Properties DefaultFieldsValidation auf False zu setzen.


Das Property umzusetzen bringt in dem Falle nichts, leider!

Gruß Frank

Re: [Gelöst] XML Port Insert Trigger abschalten

20. September 2019 13:44

Wie wäre es damit: https://docs.microsoft.com/en-us/dynami ... t-property

Re: [Gelöst] XML Port Insert Trigger abschalten

20. September 2019 17:31

FrausDo hat geschrieben:Commit ist böse ! Punkt !

Also ein commit ist nicht per se böse! Punkt !
In deinem Fall aber nicht notwendig.

In den Standard XML-Imports funktioniert es doch auch normal - also müsstest du anscheinend etwas anders gemacht haben, als der Standard.

Der Satz :
FrausDo hat geschrieben:Nach deinem Post habe ich mir gedacht, geht ja auch anders.

klingt hoffentlich schlimmer, als er gemeint war!

Re: XML Port Insert Trigger abschalten

20. September 2019 18:07

Ted hat geschrieben:Ich empfehle dir temporäre Tabellen und sorge selbst dafür wann du nen Insert machst

Ich unterstütze diese Empfehlung. Ich importiere i. d. R. nicht direkt in die NAV-Ziel-Tabelle sondern erstmal nur die Werte und mache dann alles im Code per Zuweisung usw. Dann habe ich die volle Kontrolle.

Re: [Gelöst] XML Port Insert Trigger abschalten

23. September 2019 08:52

Hallo,

die Temporären Tabellen lösen dass Problem nicht, dass der Trigger nicht durchlaufen wird.
Ich Exportiere nun erst die alle Kopfdaten, dann die dazugehörigen Zeilendaten.

Als Export wähle ich XML und nicht csv.

Dann klappt alles und auch das es nur einen Commit gibt.

Den Tipp von SilverX werde ich einmal testen.

Gruß Frank

Re: [Gelöst] XML Port Insert Trigger abschalten

23. September 2019 10:05

FrausDo hat geschrieben:die Temporären Tabellen lösen dass Problem nicht, dass der Trigger nicht durchlaufen wird.


Aber du kannst nun per Code selbst dafür sorgen das der Header-Insert vor dem ersten Zeilen-Insert gemacht wird.
Wenn du im "OnAfterInitRecord" der lines aus dem TmpHeader nen richtigen Header (darfst du natürlich nur einmal pro Header machen) machst, sollte es dich nicht mehr stören das ein "Insert(true)" auf Lineebene ausgeführt wird.

Der Code wäre dadurch in etwa folgender:
Code:
headerTmp.docNo := 'doc1';
repeat
   if erstelinevondemheader then begin
    header.copy(headerTmp);
    header.insert(true);
   end;

   line.no = 'line1';
   line.insert(true);
until lines.next() = 0;
headerTmp.insert(true);