Seite 1 von 1

[Gelöst] Merkwürdiges Verhalten der Tabelle File

Verfasst: 22. November 2006 10:15
von mikka
Hallo,

ich habe bei der Tabelle File ein unerklärliches Verhalten.
In einem Report (alle 5 Min. durch einen Timer aufgerufen!) wird die Tabelle gefiltert wie folgt:
Code:
RESET;
file.SETRANGE(Path,'D:\Test\');
file.SETRANGE("Is a file",TRUE);
file.SETFILTER(file.Name,'*.MBS|*.mbs');
IF file.FIND('-') THEN
  REPEAT
  .
  .

  CLEAR(MeinDataport);
  MeinDataport.FILENAME(file.Path + file.Name);
  MeinDataport.RUNMODAL;

Werden die Datensätze zunächst wie gwünscht gefiltert und verarbeitet. (Der Pfad und der Dateiname werden an einen Dataport übergeben)
Nach der Verarbeitung werden die Dateien aus dem Verzeichnis gelöscht.
Das klappt auch in >99 % aller Fälle.

Es kommt vor, das das Verzeichnis entweder leer bzw. eine neue Datei (mit anderen Namen) vorhanden ist.

Leider zeigt der Record file machmal auf eine nicht vorhandene Datei, so das an den Dataport ein Pfad übergeben wird der nicht existiert.
Die Folge ist ein Error. -->Navision muss beendet und neu gestartet werden :twisted:

Wer hat eine Idee zu diesem Problem / Verhalten?!
Gruß Mikka

Verfasst: 22. November 2006 10:30
von martinst
Das Problem ist bekannt. Du musst die Variable File (Record) immer clearen clear(File).
Eventuell musst Du sogar das Objekt, welches den File-Record filtert, von aussen mit clear "clearen".

Gruss

Verfasst: 22. November 2006 10:36
von Natalie
Vielleicht vorher ein CLEAR(file)?
Im Übrigen könnte ich mir vorstellen, dass man statt
Code:
file.SETFILTER(file.Name,'*.MBS|*.mbs');

auch
Code:
file.SETFILTER(file.Name,'%1','@*.mbs');

angeben könnte (nicht getestet).

Im Übrigen hat man mir schon bei der Development-Schulung eingetrichtert, dass man SETFILTER immer mit dem %1 verwendet, weil dann genau solche wie von dir beschriebenen Fehler auftreten können.

Verfasst: 22. November 2006 12:10
von mikka
Danke für Eure Antworten.

Ich habe bereits ein CLEAR(file) und ein file.RESET drin.
Die Fehlermeldung erscheint trotzdem :cry:

@Natalie
Das mit den Filtern habe ich ausprobiert, --> Kein Erfolg
Der Syntax ist mir auch bekannt, das es hier zu Problemen kommen kann wuste ich noch nicht.

@martinst
martinst hat geschrieben:Eventuell musst Du sogar das Objekt, welches den File-Record filtert, von aussen mit clear "clearen".

Wie meinst du das?
Ich habe die Variable, die die Tabelle file Filtert auch in einem CLEAR eingebunden. Meinst du das?

Ich habe mir eine Form auf die Tabelle file erstellt, um mir den aktuellen Datensatz anzuzeigen. Hier wird nach wie vor die Datei angezeigt, die bereits aus dem Verzeichnis gelöscht wurde.

Ebenso ist mir gerade aufgefallen, wenn ich eine neue Datei im Verzeichnis ablege, diese nicht sichtbar ist. Könnte es sein, das Windows oder Navision irgendwo nicht sauber Synchrnisiert?
Gruß Mikka

Verfasst: 22. November 2006 12:18
von martinst
Mikka

Wie meinst du das?
Ich habe die Variable, die die Tabelle file Filtert auch in einem CLEAR eingebunden. Meinst du das?


Beispiel:
In der CodeUnit xy wird der Record File gefiltert.
Die CodeUnit wird irendwo aufgerrufen.
Und dort braucht es ein clear(xy).

Habe bei einer unseren Datenbanken nochmals nachgeschaut. Das funktioniert.

Gruss

Verfasst: 22. November 2006 13:49
von Timo Lässer
Die Ursache für dein Problem dürfte wohl das etwas seltsame Verhalten von Navision mit der virtuellen Tabelle File sein.

Navision bemerkt Unterschiede erst, wenn man neu in das Verzeichnis springt, daher musst du immer zwischen zwei Verzeichnissen wechseln, um Änderungen zu erkennen:
Code:
file.RESET;
file.SETRANGE(Path,'C:\');      // Kurz mal hierhin wechseln ...
file.find('-');                 // ... Inhalt holen ...
file.SETRANGE(Path,'D:\Test\'); // ... dann zum richtigen Verzeichnis
file.SETRANGE("Is a file",TRUE);
file.SETFILTER(file.Name,'%1','@*.MBS');
IF file.FIND('-') THEN
  REPEAT
    [...]
  UNTIL file.next = 0;

Verfasst: 22. November 2006 16:53
von mikka
Danke an Euch,
bisher habe ich keine weiteren Fehlermeldungen bekommen.
Gruß Mikka

Verfasst: 22. November 2006 17:01
von Natalie
Aber nur Timos Lösung war jetzt richtig, oder?

Verfasst: 23. November 2006 02:41
von Michael Schumacher
Nein, Natalie,
auch ein Clear(Codeunit) hilft, aber wenn z.B. zuerst nach Customer*.xml und dann nach Order*.xml gesucht werden soll, weil damit verschiedene XML-Ports gefüttert werden sollen (Daten aus Webshop einlesen) dann ist die Methode mit dem Pfadwechsel schneller als die Codeunit zu clearen und neu aufzurufen...
Dein Hinweis mit dem %1 im Filter war aber auch wichtig, auch wenn er hier nicht das Problem verursacht hat. nur mit %1 kann z.B. auf nicht leer (<>'') geprüft werden...

Verfasst: 23. November 2006 11:53
von mikka
Hallo,
sorry, das ich mich nicht Ausführlicher ausgedrückt habe.

Die Lösung die zum Erfolg geführt hat war Timo´s.
Ein CLEAR auf die Codeunit (oder anderes Objekt) ist bei mir nicht Möglich, da ich keine weiteren habe! --> Daher ja auch meine Probleme!

Allerdings ist es, wie Ihr beschrieben habt in CU´s notwendig, um Probleme zu Vermeiden.
Gruß Mikka