Dataport Datenprüfung vorab

15. Februar 2012 09:19

Hallo Beisammen,

ich habe hier wieder was kniffliges bekommen:
bei uns werden eingehende Bestellungen (.txt) autom. in ein Server-Verzeichnis gestellt. Der Innendienst drückt dann ab und an auf einen "Import"-Knopf, der dann über eine Codeunit den Import per Dataport aufruft:
Code:
lokalFile.RESET;
lokalFile.SETRANGE(Path,"Import Pfad");
lokalFile.SETRANGE("Is a file",TRUE);
lokalFile.SETFILTER(Name,'BESTELL*');

IF lokalFile.FIND('-') THEN
 REPEAT
   lokalImpFileName := lokalFile.Path + lokalFile.Name;
    IF FILE.EXISTS(lokalImpFileName) THEN BEGIN
      CLEAR(lokalImportBestell);
      lokalImportBestell.FILENAME(lokalImpFileName);
      lokalImportBestell.RUNMODAL;
    END;
 UNTIL lokalFile.NEXT = 0
ELSE
  MESSAGE('Keine Bestellungen vorhanden");

Sprich: wir prüfen in dem Verzeichnis, ob es Bestellungs-Dateien gibt, wenn ja, rufen wir für diese den Dataport ("lokalImportBestell") auf, der die Daten dann in diverse relevante Tabellen importiert.

Das funktioniert zwar gut - wenn aber eine der hunderte Bestell-Dateien (.txt) irgendeinen Fehler in der Datenstruktur hat, bricht der Import des Dataport natürlich mit Fehlermeldung ab und alle auflaufenden Bestellungen "hängen fest", bis der Übeltäter gefunden ist.

Gibt es hier eine Möglichkeit, eine Vorabprüfung laufen zu lassen bzw. zu sagen, lies nur die Dateien ein, die korrekt sind, alle anderen laß´ link liegen oder verschiebe diese in ein anderes Verzeichnis oder benenne diese um..?!?!

Vielen Dank für Eure Hilfe,
Grüße,
Heidi

Re: Dataport Datenprüfung vorab

15. Februar 2012 09:27

Wenn man die Codeunit etwas umbaut, kann man sie mit "IF DeineCodeunit.RUN ... "starten und den Fehler abfangen. Da könnte sich etwas mit anfangen lassen.

Re: Dataport Datenprüfung vorab

15. Februar 2012 09:36

Hallo McClane,
es scheint also Hoffnung zu geben - aber wie meinst Du das mit dem Umbauen der CU..?!? :-?
Sobald ich sage, CU.RUN startet ja auch der Dataport und rennt ggf. auf einen Fehler bei fehlerhaften .txt-Bestellungen..?!?

Wie sollte ich denn hier konkret die CU umgestalten..??? :?:

Dank´ Dir für einen kurzen Tipp...!!!
Viele Grüße,
Heidi

Re: Dataport Datenprüfung vorab

15. Februar 2012 09:53

Ich glaube, ich muss das zurück nehmen. Mit "If Codeunit.run" kann man einen Fehler in der Codeunit abfangen, aber keinen, der aus einem Objekt kommt, der aus dieser Codeunit aufgerufen wird, also dem Dataport.

Sprich, da müsste eine Codeunit her, die das Text-File zeilenweise einliest und auf Gültigkeit überprüft.

Re: Dataport Datenprüfung vorab

15. Februar 2012 10:04

:-( ...ohje, das sind hier aber acht Tabellen, die mit knapp 90 unterschiedlichen Feldern/Werten gefüllt werden...

Wie müssten denn hier diese "Prüf-CU" aufgebaut sein - hättest Du mir hier evtl. ein Beispiel - ich bin hier nicht so die Ober-Spezialistin... :?: :?:

Dank´ Dir,
Heidi

Re: Dataport Datenprüfung vorab

15. Februar 2012 10:26

Siehe hier: http://www.mibuso.com/forum/viewtopic.php?f=14&t=2419

Man könnte die Überprüfung der Werte möglicherweise auch im Dataport durchführen. Was für Fehler haben die Dateien denn?

Re: Dataport Datenprüfung vorab

15. Februar 2012 10:36

Hallo McClane,

teilweise sind hier die Daten mit falschen Umbrüchen versehen, wenn z.B. ein Kunde eine txt-Datie erstellt hat und diese manuell nachträglich noch abändert und dann an ns schickt.
Es sind dann so Sache wie bspw.:
Nr00012,Beschreibung1,Beschreibung2,Menge
Nr00013,Beschreibung1,Beschreibung2,Menge
Nr00014,Beschreibung1,
Beschreibung2,Menge
Nr00015,Beschreibung1,Beschreibung2,Menge

Hier wurde bei Artikel Nr. 0014 fälschlicherwiese ein Umbruch eingefügt, so daß der Import hier abstürzt.
Der Dataport hat feste Feldlängen, um alle möglichen Feldeingaben abfangen zu können, aber es kommen oft solche Sachen rein, die dann den ganzen Laden aufhalten.
Kann der Dataport so etwas überhaupt abprüfen???

Viele Grüße,
Heidi

Re: Dataport Datenprüfung vorab

15. Februar 2012 10:37

Wenn Fehler bei der Konvertierung der einzelnen Felder auftreten, könntest du doch erstmal alles in Textvariablen importieren und dann mit "IF NOT EVALUATE(...)" prüfen, ob die Felder sich einlesen lassen.

Re: Dataport Datenprüfung vorab

15. Februar 2012 10:51

Falsche Zeilenumbrüche sind natürlich gemein. Da könnte man das File vorab zeilenweise darauf prüfen, ob die Anzahl der Feldtrenner pro Zeile richtig ist oder, ob ein CRLF zu früh auftaucht und versuchen, das zu korrigieren. Es ist aber generell haarig, wenn die Importdateien noch von Anwendern bearbeitet werden. Es könnte sich jemand einfallen lassen, innerhalb einer Beschreibung ein Komma einzufügen, welches dann natürlich als Feldtrenner interpretiert würde.

Re: Dataport Datenprüfung vorab

15. Februar 2012 10:57

HeiBai hat geschrieben:Hier wurde bei Artikel Nr. 0014 fälschlicherwiese ein Umbruch eingefügt, so daß der Import hier abstürzt.
Der Dataport hat feste Feldlängen, um alle möglichen Feldeingaben abfangen zu können, aber es kommen oft solche Sachen rein, die dann den ganzen Laden aufhalten.
Kann der Dataport so etwas überhaupt abprüfen???

Viele Grüße,
Heidi


Wenn die Kunden da selber das noch manuell abändern wird es natürlich schwierig für eine automatische Korrektur.
Man könnte einige Fehler aber sicher abfangen und automatisch korrigieren.

Ich weiß nicht ob du es schon weißt, aber auf jedem Dataport Field im Dataport kannst du auch mit F9 C/AL Code hinterlegen.
Beispielsweise im OnBeforeEvaluateField Trigger.

Beispielsweise Feldlänge Liefername kürzen auf Feldlänge:
Code:
Text := COPYSTR(Text, 1, MAXSTRLEN(DeinRecord.Liefername));


mfg,
winfy

Re: Dataport Datenprüfung vorab

16. Februar 2012 20:06

McClane hat geschrieben:Mit "If Codeunit.run" kann man einen Fehler in der Codeunit abfangen, aber keinen, der aus einem Objekt kommt, der aus dieser Codeunit aufgerufen wird, also dem Dataport.

Bist du dir sicher? Ich hätte das Gegenteil behauptet.

Re: Dataport Datenprüfung vorab

16. Februar 2012 20:49

Ich sag mal so: ziemlich sicher. Genau so, wie hier beschrieben, habe ich es allerdings nicht getestet.

Re: Dataport Datenprüfung vorab

20. Februar 2012 09:26

Also für neuere Versionen kann ich sicher sagen: man kann Fehler aus untergeordneten Objekten mit einem IF abfangen.

Beweis: Dataport erstellen und im OnImportRecord-Trigger einen ERROR einbauen. Codeunit erstellen, der den Dataport ausführt, zweite Codeunit (oder sonstiger Aufruf der ersten CU) sieht wie folgt aus:
Code:
IF NOT CODEUNIT.RUN(50002) THEN
  ERROR('Dies ist der Fehler: %1',GETLASTERRORTEXT);

Funktioniert. Sonst würde der Befehl GETLASTERRORTEXT ja auch nur begrenzt Sinn machen.

Re: Dataport Datenprüfung vorab

20. Februar 2012 09:43

Krieg ich nicht nachvollzogen

Alles klar, stimmt :)