[Gelöst]Komplexer DATAPORT

6. Februar 2006 19:05

Hallo,
in Dataports habe ich bisher nur ein DataItem benutzt und habe daher folgende Frage:

Ich möchte eine eine Textdatei einlesen, dabei soll ein Teil den Verkaufskopf füllen und der Rest die Verkaufszeilen.

Ist das Möglich, und wenn ja, wie muss ich vorgehen?
Gruß Mikka
Zuletzt geändert von mikka am 21. Juni 2006 20:56, insgesamt 1-mal geändert.

6. Februar 2006 20:36

Prinzipiell ist das möglich, allerdings müssen in der Textdatei zuerst alle Verkaufsköpfe und anschließend die dazugehörigen Verkaufszeilen gespeichert sein.
Die elegantere Methode, die Daten zusammenhängend (Kopf, Zeile, Zeile, ... ; Kopf, Zeile, Zeile, ... ; ...) in die Datei zu exportieren bzw. aus ihr zu importieren ist mit Dataports nicht möglich.

6. Februar 2006 22:34

hmm,
das klingt nicht gut. :cry:
Ich werde vermutlich die Daten in folgender Form bekommen:
Kopf1;Zeile1;
Kopf1;Zeile2;
Kopf2;Zeile1;
Kopf2;Zeile2; ... usw.

Habt Ihr gute Ideen, wie soetwas "sauber" zulösen ist?
Gruß Mikka

6. Februar 2006 23:27

Hi Mikka,

hmm...ich würd mal probieren, evtl. AutoSave/Update/Insert auf No zu setzen und die Datensätze per Hand einzusetzen, oder in Temporäre Tabellen zu speichern und später "richtig" einzusetzen.
Oder halt ansonsten fällt mir da nur der Umweg über ExcelPuffer oder das Parsen "per Hand" ein...

Gruss, Otschko

7. Februar 2006 00:48

Wenn immer Kopf und Zeile in einem Datensatz zusammen in der Textdatei aufgeführt sind, können die Daten auch per Dataport eingelesen werden.
Werden die Kopf- und Zeilen-Daten in getrennten Zeilen zur Verfügung gestellt, dann sehe ich mit einem Dataport keine Chance.

7. Februar 2006 10:43

Du kannst mehrere Dataitems verwenden, die nicht eingerückt sind.
Dann mußt Du die Datei zweimal durchlaufen und ausfiltern, ob du einen Kopf oder eine Zeile vor dir hast. Dann mit Currdataport.Skip die "falschen" Zeilen auslassen.
Ich hab auf die Methode aus einer Datei sowohl Anlagen, als auch die Anlagen AfA-Buch Zeilen importiert.
Wenn VkKopf und VkZeile in einer Zeile sind, die nicht gebrauchten Einträge in einer Dummy-Variablen speichern und diese bei der Verarbeitung ignorieren.

7. Februar 2006 11:01

Das ist ein gute und Simple Idee.
Das die DataItems nicht eingerückt (engl.: indented) werden können wusste ich.
Nur wie die Verarbeitung von zwei DataItems Funktioniert war mir nicht klar.

Ich habe in meiner bisherigen Lösung, da ich keinen anderen Weg gefunden habe einfach ein DataItem genommen und alle Werte die nicht in das DataItem gehören als Variable der zweiten Tabelle zugewiesen.

Ich vermute, dass die Verarbeitung von zwei DataItems schneller ist, als wenn ich wie zuvor beschrieben nur ein DataItem nutze und die restlichen Daten via Variable einen anderen Record zuweise, den ich jedesmal Filtern muss? (Ich möchte die Aspekte der Performance nicht aus den Augen Verlieren!)


Danke für den Tipp.
Gruß Mikka

7. Februar 2006 11:07

Ach ja, vergiss nicht zu Beginn des zweiten Dataitems den Befehl
File.seek(0).
Ist mir passiert :oops: und ich hab mich gewundert, wo die Daten hin sind...

7. Februar 2006 12:03

Wenn in der Importdatei eventuell Debitoren und Artikel vorhanden sind, die Navision nicht kennt, brechen solche Verarbeitungen immer wieder mit Fehlermeldungen ab. Wenn dies im Betrieb stört und die chronologische Abarbeitung nicht unbedingt notwendig ist, sollte eine Zwischentabelle eingeschaltet werden, in die die Belege erst mal eingelesen werden und nach Verarbeitung gelöscht werden. Wenn dann die Erstellung von VK-Kopf oder Zeile nicht möglich ist, diesen Beleg als "nicht verarbeitet" kennzeichnen und mit dem nächsten weitermachen. Diese Zwischentabelle muss dann natürlich regelmäßig kontrolliert werden, die fehlenden Stammdaten nachgetragen und die VK-Belege nacherstellt werden.

7. Februar 2006 13:43

@ KOWA:
Danke für den Einwurf, ich werde es berücksichtigen


Frage / Feststellung zu: File.seek(0).
Die C/SIDE Referrence schreibt:
Use this function to set a file pointer to a new position in an ASCII or binary file.

Wenn ich das richtig Verstehe, dann setzt der Befehl den Pointer wieder auf den ersten Datensatz, so das der DataPort die Datei nochmal einliest.
Ist das Korrekt?

Ich habe tatsächlich das Problem gehabt, das die Daten nicht in die VK-Zeilen eingelesen wurden :roll:
Deshalb hatte ich die Variante mit nur einem DataItem ausprobiert!
Gruß Mikka

7. Februar 2006 13:51

genau so ist es, damit kannst du z.B. auch eine Zeile mit den Feldtiteln überspringen, wenn sowas in der Textdatei ist, indem du einfach die Zeichen in der Titelzeile zählst und dann seek(anzahl+1) setzt.

7. Februar 2006 14:53

Feine Sache, das werde ich mir merken.
Ich habe bisher immer nach Stichworten in der ersten Zeile gesucht,
aber wehe die erste Zeile ändert sich!

Danke.
Gruß Mikka

7. Februar 2006 15:23

@TIMO
TIMO Lässler hat geschrieben:Wenn immer Kopf und Zeile in einem Datensatz zusammen in der Textdatei aufgeführt sind, können die Daten auch per Dataport eingelesen werden.
Werden die Kopf- und Zeilen-Daten in getrennten Zeilen zur Verfügung gestellt, dann sehe ich mit einem Dataport keine Chance.


Mit dem File.seek(0) bzw. seek(anzahl+1) müsste auch das Funktionieren. Jedoch muss die Datei immer gleich aufgebaut sein mit festen Zeichenkettenlängen. Da die abstände immer gleich sind, kann der pointer mit seek(position) immer genau gesetzt werden!

Aber ich glaube keiner möchte soeinen DataPort wirklich erstellen :lol:
Gruß Mikka

7. Februar 2006 23:17

Ich favorisiere bei solchen Aufgabenstellungen immer die Ein-/Auslesung "zu Fuß" per Report und FILE-Variable, da weiß ich wenigstens, was da genau in der Datei abläuft.
Wenn es keine Benutzer-Interaktion benötigt (zum Filter setzen o. ä.), dann nehme ich auch gleich eine Codeunit und programmiere das ganze im OnRun()-Trigger.