Anfängerfrage: XML Port soll Tabelle Updaten, nicht einfügen

15. August 2007 16:33

Hallo alle zusammen,

als absoluter Anfänger in Sachen Navision stehe ich vor einem Problem:
Ich habe einen XMLPort geschrieben, den ich aus einer CodeUnit aufrufe, um damit Daten in einer Tabelle zu updaten. Leider wird anstelle eines Updates aber immer ein Insert ausgeführt, was logischer weise zu einer Schlüsselverletzung führt.

Kann mir da jemand einen Tip geben, wie man sowas lösen könnte? Was ich bisher an Dokumentation gefunden habe, bezieht sich offenbar nur auf das komplette Einfügen einer Tabelle über den XMLPort.

Danke und mit Gruß

Christian

15. August 2007 17:08

2 Möglichkeiten,
1. den Import in temporäre Tabellen und von dort aus mit TRANSFERFIELDS die Datensätze updaten
2. Die Tags nicht in Tabellenfelder sondern in Textvariablen einlesen und dann mit Programmcode in die Zieltabelle schreiben.

Ich bevorzuge in der Regel eine Kombination aus beiden Varianten, je nach dem, ob vorher noch bestimmte Bedingungen, wie z.B. das vorhandensein bestimmter Codes in Lookup-Feldern oder ein Umwandeln der Daten nötig ist.

15. August 2007 21:07

Danke schön, das war genau das, was ich brauchte.
Werde den 1. Ansatz weiter verfolgen, da er mir einfacher scheint :-)
Ich hab im XMLPort die Tabelle als Temporär gekennzeichnet.
Nach dem Einlesen werte ich die Tabelle im OnPostXMLport() Trigger aus.
Momentan ist noch komisch, dass er die Daten nicht in die eigentliche Tabelle mit TRANSFERFIELDS übernimmt, aber das kann ja nur eine Kleinigkeit sein.

Gruß Chris

16. August 2007 10:05

Schau mal auf http://www.navision24.de/befehle/transferfields.html -> hier ist der Befehl Transferfields sehr ausführlich beschrieben. Eventuell stimmen die Feldnummer nicht überein.

16. August 2007 10:44

Danke für die Hilfe.
Hab das Problem heute morgen gelöst:
1. Man sollte den richtigen Schlüssel benutzen
2. Hab aus versehen das MODIFY auskommentiert (Irgendwie fehlt mir das Syntax Highlighting :-) )

TRANSFERFIELDS scheint für mein Problem nicht geeignet zu sein. In der XML Datei werden nur die PKs und drei weitere Felder mitgeliefert. D.h. nach dem Import in die temporäre Tabelle sind die anderen Felder, die nicht übermittelt wurden, leer und beim Kopieren werden in der eigentlichen Tabelle diese Felder gelöscht. Ich habe mich deshalb für WITH <TabellenObjekt> DO entschieden.

Danke nochmal,
Gruß Chris

16. August 2007 10:52

Das wäre dann eigentlich der klassische Fall für das Importieren in Variablen gewesen
und dann im obersten Tag für jeden Datensatz im OnAfterAssignVariable-Trigger den Datensatz suchen,
wenn in die Variablen was eingelesen wurde, dieses in die Felder schreiben,
Modify machen und
dann (ganz wichtig) die Textvariablen wieder auf '' setzen, sonst bleibt der Wert womöglich erhalten,
wenn Tags im XML-Skript nur dann auftauchen, wenn sie auch einen Wert haben (minoccurs=zero).

20. August 2007 10:23

Hallo,

ich bin auch grade am experimentieren mit den XML-Ports.

Wenn ich das so lese, empfiehlt es sich offensichtlich nicht , bzw. es ist nicht möglich, für Export und Import von Daten nur einen XML-Port zu verwenden.

Ich habe mir einen ganz einfachen XML-Port erstellt, der aus der Artikeltabelle die Artikelnr. und die Beschreibung exportiert.

Beim Import habe ich folgendes Code in den XML-Port eingefügt:
Code:
Item - Import::OnBeforeInsertRecord()
IF Item2.GET(ItemNo) THEN BEGIN
  Item2.Description := Desc;
  Item2."Description 2" := Desc2;
  Item2.MODIFY;
  currXMLport.SKIP;
END;


Der SKIP hat aber keine Wirkung. Der XML-Port will den Datensatz trotzdem einfügen.

20. August 2007 10:49

SKIP wirkt auch nur auf den Export, wenn ich das richtig verstanden habe.
Ich hab's nicht probiert, aber vielleicht hilft dir BREAK weiter.

sonst bleibt dir nichts anderes übrig, als eigene XMLPorts für Im- und Export anzulegen.

20. August 2007 11:25

BREAK hilft leider auch nicht. Der XML-Port will trotzdem seinen Insert machen.

Dann bleibt wohl wirklich nur eigene Ports oder alles über Variablen abzubilden und die Zuweisungen in die Tabelle aus zu programmieren (schreibt man das so?, sch... Rechschreibreform)

By the way: hab ich zwar an anderer Stelle schon mal gefragt, aber trotzdem, kennt jemand ne gute Doku oder hat jemand vernünftige Schulungsunterlagen zu XML-Ports? Der ADG taugt dafür nicht wirklich.

21. August 2007 19:26

SKIP, BREAK und QUIT beziehen sich nur auf den aktuellen Tag (leider, totale Fehlkonstruktion wenn ihr mich fragt). Wenn also eine Exception auftaucht, die einen Abbruch verursachen soll, muss man eine globale Bool-Variable setzen und in jedem weiteren Tag abfragen (Nach dem Motto IF Abbruch THEN CurrXMLPort.BREAK).

Gruß
Dirk