[gelöst] Textdateiauslesung mit festen Feldstellen

27. Oktober 2012 12:09

Hallo community,

ich komme hier nicht weiter - wir benötigen für die weiterleitung an einen externen dienstleister die auslesung von daten aus gebuchten vk-rechnungen.
hier hängen noch hinter jeder rg-zeile x-beliebige datensätze mit ergänzenden artikelinfos dahinter.

die auslesung soll in einer vordefinierten form des externen dienstleisters passieren, die in etwa so aussieht:

#rechnungsinfo## 00000000name 0000000000adresse 0000PLZ 0000000000ort
#zahlungsinfo ## 00000000fälligkeit
#zeile000001## 0000000nr ##########variante ##########menge ##########preis ###############währung
#zeilenzusatz00001_1## ##########beschreibung ###########dringlichkeit
#zeilenzusatz00001_2## ##########beschreibung ###########dringlichkeit
#zeilenzusatz00001_3## ##########beschreibung ###########dringlichkeit
#zeile000002## 0000000nr ##########variante ##########menge ##########preis ###############währung
#zeilenzusatz00002_1## ##########beschreibung ###########dringlichkeit
#zeilenzusatz00002_2## ##########beschreibung ###########dringlichkeit
etc. etc.

es ist also immer fest definiert, an welcher stelle der jeweiligen zeile die daten stehen und es gibt auch immer eine fixe länge für diese daten, die dann je nach übergebenem feldinhalt aus nav noch mit #-zeichen aufgefüllt werden müssen.

das bekomme ich aber nicht mit dem dataport hin und den xmlport kann ich auch nicht nutzen - wie kann denn so etwas (verständlich für nerds :wink: ) ausgelesen werden???

vielen dank für eure hilfe,
heidi[*]
Zuletzt geändert von HeiBai am 31. Oktober 2012 11:16, insgesamt 1-mal geändert.

Re: Textdateiauslesung mit festen Feldstellen

27. Oktober 2012 22:33

Wie man Zeichen in einem Feld vorne und ggf. hinten (PADSTR) auffüllen kann, siehe hier.
Dataports sind eigentlich nicht für Kopf-Zeilen-Strukturen gedacht, in Grenzen kann man das überlisten, siehe hier.

In deinem Fall würde ich einen ProcessingOnly-Report erstellen, über eingerückte Dataitems unterhalb der Rechnungskopf/-zeilen-Struktur alle relevanten Informationen in den verknüpften Tabellen zusammensuchen und alles notwendige jeweils direkt in eine Textdatei schreiben. Wie man das prinzipell macht, steht hier (CREATE) und hier (WRITE). Falls statt ASCII ein ANSI-Zeichensatz erforderlich ist, dabei die Texte durch die Konvertierfunktion in Codeunit 11501 GeneralMgt laufen lassen.

Re: Textdateiauslesung mit festen Feldstellen

28. Oktober 2012 13:28

hallo kai,

vielen dank für deinen tip - habe ich auch gleich ausprobiert und mir einen processing-only-report mit drei dataitems erstellt: der vk-rechnungskopf, dann eins eingerückt die vk-rechnungszeilen und wieder eins eingerückt die zusatzinfozeilen.
dann habe ich in jedes dataitem im onaftergetrecord-trigger folgenden code eingetragen:
Code:
FileName := 'C:\test\TestFile.txt';
IF EXISTS(FileName) THEN BEGIN
  TestFile.WRITEMODE(TRUE);
  TestFile.OPEN(FileName);
  TestFile.WRITE('Hello Header');  //bzw. "Hello Line" bei vkrg-zeilen-dataitem  bzw. "Hello Info" bei infozeilen-dataitem
  TestFile.CLOSE;
END
ELSE
  MESSAGE('%1 does not exit.', FileName);

die datei enthält dann aber nur die infos der letzten vk-rechnungszeile bzw. der letzten infozeile - die header-daten und alle vorherigen zeilendaten werden immer wieder überschrieben. wie kann ich denn hier angeben, daß wie beim ausdruck-body jede zeile in der datei mit crlf angehängt werden soll anstelle die vorhandenen daten wieder zu überschreiben..??
und wie kann ich ihm hier sagen, an welcher stelle der zeile ein wert stehen soll (z.b. preis soll an stelle 50 mit feldlänge 10 stehen, währung an stelle 65 mit länge 3 etc.)?

vielen dank schon mal,
liebe grüße,
heidi

Re: Textdateiauslesung mit festen Feldstellen

28. Oktober 2012 15:19

CRLF werden durch TEXTMODE(TRUE) am Ende der Zeile automatisch angefügt (Reihenfolge im Beispiel beachten, vor dem OPEN), innerhalb einer Zeile kann man das wie hier beschrieben einfügen und so manuell umbrechen.
Wenn man in einer existierenden Datei eine bestimmte Position sucht, nimmt man (POS,SEEK) bzw. für das Anfügen am Ende noch (LEN) mit dazu.

und wie kann ich ihm hier sagen, an welcher stelle der zeile ein wert stehen soll (z.b. preis soll an stelle 50 mit feldlänge 10 stehen, währung an stelle 65 mit länge 3 etc.)?

Alles nacheinander in der richtigen Länge zusammenstellen und dann richtig aneinanderfügen. Ich mache das meist so,
Code:
Ausgabezeile += ErstesFeld;
Ausgabezeile += ZweitesFeld;
Ausgabezeile += DrittesFeld;
… // usw.
Ausgabedatei.WRITE(Ausgabezeile);

das ist übersichtlich und man kann für jede Zeile einen Kommentar hinterlegen. Das ist wichtig für die schnelle Wartung bei Änderungen.

Re: Textdateiauslesung mit festen Feldstellen

31. Oktober 2012 11:16

hallo kai,

vielen dank für deine tips - jetzt hat es genau so geklappt, wie wir es gebraucht haben. :-D

vielen dank nochmal und liebe grüße,
heidi