[gelöst] Probleme beim Schließen einer csv Datei nach Import

21. Juli 2017 11:39

Guten Morgen liebe Community,

ich habe folgendes Problem.

Ich lese eine csv Datei aus dem Netzlaufwerk über eine Codeunit ein.

Die Datei wird jedoch nicht beendet. Sprich ich kann die Datei anschließend nicht löschen oder umbenennen.

Die Fehlermeldung sagt mir aus, dass die Datei noch von einem anderen Programm verwendet wird. Starte ich einmal den NAV Dienst neu, kann ich wieder auf die Datei zugreifen.

Ich habe jedoch bislang noch keine Ahnung warum das Problem auftritt.
Das Einlesen funktioniert ohne Probleme. Anbei die Codeschnipsel.

Code:
Datei.TEXTMODE(FALSE);
Datei.OPEN(Explorer.Path + '\' + Explorer.Name)

.....


Datei.CLOSE;

Zuletzt geändert von simon123 am 21. Juli 2017 17:49, insgesamt 1-mal geändert.

Re: Probleme beim Schließen einer csv Datei nach Import

21. Juli 2017 12:11

Hallo,

welche NAV- Version nutzt du NAV 2017 oder NAV 5 ?

Bei letzterer ist das bekannt. :wink:

Gruß Fiddi

Re: Probleme beim Schließen einer csv Datei nach Import

21. Juli 2017 12:13

Benutze NAV17...

Re: Probleme beim Schließen einer csv Datei nach Import

21. Juli 2017 12:21

Hast du mal gestet ob der CLOSE Befehl auch ausgeführt wird?
Entweder per Breakpoint oder per MESSAGE?

Im Falle eines EXITs oder Bedingungen könnte es sein, dass der Code garnicht bis zum CLOSE ausgeführt wird.

Re: Probleme beim Schließen einer csv Datei nach Import

21. Juli 2017 12:57

Du könntest auch mal das ganze versuchen über die CSV Buffer Table zu realisieren.

Re: Probleme beim Schließen einer csv Datei nach Import

21. Juli 2017 13:09

Ich glaube ich konnte das Problem lokalisieren.

Es handelt sich um eine Leere Zeile am Ende der csv-Datei. Lösche ich diese raus. Läuft die Codeunit ohne Probleme durch.

Jetzt muss ich nur noch eine Idee finden wie ich die entfernen kann...

Bzw. gibt es hier eine Möglichkeit das NAV das erkennt?

Re: Probleme beim Schließen einer csv Datei nach Import

21. Juli 2017 13:29

zeig doch mal den Schnippsel, wie du die Datei liest/verarbeitest

Re: Probleme beim Schließen einer csv Datei nach Import

21. Juli 2017 13:34

Code:
 Datei.TEXTMODE(FALSE);

    EOF := FALSE; // Dateiende (End of File)
    EOL := FALSE; // Zeilenende (End of Line)
    IF (COPYSTR(Explorer.Path,STRLEN(Explorer.Path),1) <> '\') THEN
      Datei.OPEN(Explorer.Path + '\' + Explorer.Name)
    ELSE
      Datei.OPEN(Explorer.Path + Explorer.Name);

     WHILE NOT EOFReached DO BEGIN
     .....

     SetNextLine; // Nächste Zeile in der Datei ansteuern
    END;


EOFReached() : Boolean

p_CarriageReturn := 13;
p_LineFeed := 10;
p_InpChar := 32;
p_StartPos := Datei.POS;
EOF := Datei.READ(p_InpChar) <= 0;
Datei.SEEK(p_StartPos);

IF NOT EOF THEN BEGIN
  p_InpChar := 32;
  WHILE (Datei.READ(p_InpChar) > 0) AND (p_InpChar IN [p_CarriageReturn, p_LineFeed]) DO;
  EOF := (p_InpChar IN [p_CarriageReturn, p_LineFeed]);
  Datei.SEEK(p_StartPos);
END;
EXIT(EOF);



SetNextLine()

p_CarriageReturn := 13;
p_LineFeed := 10;
p_InpChar := 32;
WHILE (Datei.READ(p_InpChar) > 0) AND (NOT (p_InpChar IN [p_CarriageReturn, p_LineFeed])) DO;
IF (p_InpChar IN [p_CarriageReturn, p_LineFeed]) THEN BEGIN
  Datei.SEEK(Datei.POS - 1);
  IF EOFReached THEN
    Datei.SEEK(Datei.LEN - 1) // = EOF-Position
  ELSE BEGIN
    WHILE (Datei.READ(p_InpChar) > 0) AND (p_InpChar IN [p_CarriageReturn, p_LineFeed]) DO;
    Datei.SEEK(Datei.POS - 1);
    EOL := FALSE; //End of Line
  END;
END ELSE
  EOF := TRUE;







Re: Probleme beim Schließen einer csv Datei nach Import

21. Juli 2017 13:53

Warum verwendest du keinen XMLport zum Importieren der Datei?

Re: Probleme beim Schließen einer csv Datei nach Import

21. Juli 2017 13:59

Weil wir ein Update durchführen und ich natürlich vermeiden möchte alles neu Programmieren zu müssen...

In der aktuellen Version funktioniert dies ja auch ohne Probleme...

Re: Probleme beim Schließen einer csv Datei nach Import

21. Juli 2017 17:09

Du kannst den Import so anpassen dass die Leerzeile gelesen wird und Du tatsächlich EOF erreichst. Oder, dass wenn Du den "lesenden" Teil des Imports verlässt immer das CLOSE machst. Beides würde m.E. gehen

Re: Probleme beim Schließen einer csv Datei nach Import

21. Juli 2017 17:49

Ich habe jetzt die Codeunit in einen XML Port umgeschrieben. Damit funktioniert alles ohne Probleme. War zwar etwas Fleißarbeit da es über 100 Werte je Zeile sind ist aber glaube ich die einfachere Variante.

Vielen Dank.

Re: [gelöst] Probleme beim Schließen einer csv Datei nach Im

21. Juli 2017 18:42

Hallo,

ich habe für solche Zwecke einen Muster- Report (siehe Anhang)

Der bietet im wesentlichen die gleiche Funktionalität wie der gute alte DataPort und verhält sich auch (fast) genauso.
Wer nicht gerade Dateien mit fester Satzlänge ohne Zeilenvorschub, bzw. Dateien mit sehr langen Zeilen importiert, der kommt damit ohne Anpassungen der internen Abläufe klar.

Wenn nötig, kann man den Code aber auch in eine Codeunit packen, wenn der Dateiname klar ist, und das ganze im Hintergrund laufen soll und kann.

Wer Dateilisten abarbeiten muss, der sollte die Funktionen "GetClientDirectoryFilesList" bzw. "GetServerDirectoryFilesList" aus der Codeunit 419 benutzen, die funktionieren wesentlich stabiler als die Tabelle "File".

Wie es auch sehr sinnvoll ist für das Dateihandling die Funktionen aus der Codeunit 419 zu benutzen.

Gruß Fiddi
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.