Dateien aus Verzeichnis auslesen

2. Juni 2010 16:51

Hallo Zusammen.

Folgendes Thema möchte ich gerne lösen:

In einem vorab definierten Verzeichnis (Bspl.: C:\Import\) möchte ich mehrere Textdateien ablegen und diese dann über Navision auflisten lassen.

Ich habe also eine Form, die bei 'OnOpen 'auf das hinterlegte Verzeichnis zugreifen soll und dann eine Tabelle temporär mit den Namen der einzelnen Dateien füllen soll.

Mein Versuch das Ganze zu lösen sieht so aus, dass ich eine Automatisierung über Microsoft Scripting Runtime erstellt habe.
Mit den 'Classes' habe ich mir schon den Pfad herangeholt und kann auch die Anzahl der Dateien in diesem Verzeichnis zählen lassen. Jetzt benötige ich einen Schleifenlauf der mir auf die einzelnen Dateien läuft.

Hat da jmd eine Idee oder evtl. einen anderen Lösungsansatz?
Zuletzt geändert von Chris_BSS am 9. Juni 2010 15:04, insgesamt 1-mal geändert.

Re: Dateien aus Verzeichnis auslesen

2. Juni 2010 17:18

Hast du dich schon im Forum umgesehen?
Beipiel: viewtopic.php?f=8&t=4403
Demnach kannst du so ein Verzeichnis per Quelltext auslesen:

Code:
File.RESET;
File.SETRANGE(Path,SaleSetup."Dateiverzeichnis Import"); // hier Ordnerpfad
File.SETRANGE("Is a file",TRUE); // muss
File.SETFILTER(Name,'*.txt');  // kann
IF File.FINDSET THEN
  REPEAT
    // v
  UNTIL File.NEXT = 0;

File ist hier ein Record auf die Tabelle File.

Wenn dies Dateien einfach nur angezeigt werden sollen:
Erstelle also eine Form mit SourceTable = File und setze passende Filter im OnOpenForm-Trigger (nur die Filter), blende das Feld "Name" ein - und schon hast du deine aufgezählten Dateien.

Re: Dateien aus Verzeichnis auslesen

9. Juni 2010 15:03

Ich habe im Forum nach einer Lösung gesucht gehabt, allerdings wohl nicht ordentlich genug.

Vielen Dank für deine Hilfe, das ist genau das, was ich brauchte :-).

Re: Dateien aus Verzeichnis auslesen

16. Juni 2010 14:09

Mit dem RTC scheint die Filetabelle nicht wie bisher versorgt zu werden. Anscheinend sind die Einträge auch teilweise doppelt.
Bei UNC Netzwerkpfaden ( \\Server\Ordner\) steht aber gar nichts in der Tabelle.
Ich habe heute wie hier bei Mibuso beschrieben eine andere Methode mit FileSystemObject und ScriptControl versucht, um die Dateien abzuarbeiten, aber momentan hagelt es da noch bildschirmfüllende Fehlermeldungen beim Aufruf im RTC, im CC läuft der Code einwandfrei.
Assembly2.jpg
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Re: Dateien aus Verzeichnis auslesen

11. August 2010 11:49

Kowa hat geschrieben:Bei UNC Netzwerkpfaden ( \\Server\Ordner\) steht aber gar nichts in der Tabelle.

Das ist jetzt ein bestätigter Bug.

Re: Dateien aus Verzeichnis auslesen

25. August 2010 16:33

Sorry Kai, habe die Nachricht erst heute geöffnet...

Ich will heute (entgegen allen guten Vorsätzen :wink:)doch mal meine Lösung (zu der ich teilweise sicher auch inspiriert wurde) posten. Sie funktioniert jedenfalls.

Die File-Tabelle arbeitet in Verbindung mit dem RTC zurzeit auch mit den neuesten Builds nicht zuverlässig. Zudem ist sie auch einfach unpraktisch wegen der Begrenzung von ca. 100 Zeichen für Ordner- oder Dateinamenslänge.

Nachteil der Lösung sind eine Menge Automation-Variablen, die verwendet werden. Man könnte da auch sparen, wenn der Umweg über Visual Basic nicht notwendig wäre, weil die Methoden z. B. in 'Microsoft Scripting Runtime'.Dictionary unvollständig implementiert sind (daher möglicherweise auch die Fehlermeldung im Beitrag oben).

Vorläufig wird man spezielle Dinge wohl leider nicht ohne bestimmte Automation-Variablen lösen können, wie z. B. bestimmte Workarounds über Send Keys in Main-/Subform-Konstrukten.

Hier also die Lösung:

Die Variablen:

FileSystemObject -> Automation: 'Windows Script Host Object Model'.FileSystemObject
FilesDict -> Automation: 'Microsoft Scripting Runtime'.Dictionary
ScriptControl -> Automation: 'Microsoft Script Control 1.0'.ScriptControl
FileSystemObject -> Automation: 'Windows Script Host Object Model'.FileSystemObject
WSHFolder -> Automation: 'Windows Script Host Object Model'.Folder
WSHFile -> Automation: 'Windows Script Host Object Model'.File
WSHFiles -> Automation: 'Windows Script Host Object Model'.Files
ImportFolder -> Text, 1024
txtCR -> Text, 1
txtCode -> Text, 1024


Der Code:

Code:
IF ISSERVICETIER THEN BEGIN
  ImportFolder := <Import-Ordner>;

  IF ISCLEAR(FileSystemObject) THEN
    CREATE(FileSystemObject,FALSE,TRUE);

  IF NOT FileSystemObject.FolderExists(ImportFolder) THEN BEGIN
    MESSAGE(<Text:Isnixda>,ImportFolder);
    CLEAR(FileSystemObject);
    EXIT;
  END;

  IF ISCLEAR(FilesDict) THEN
    CREATE(FilesDict,FALSE,TRUE);
  IF ISCLEAR(ScriptControl) THEN
    CREATE(ScriptControl,FALSE,TRUE);
 
  WSHFolder := FileSystemObject.GetFolder(ImportFolder);
  WSHFiles := WSHFolder.Files;

  ScriptControl.Language := 'VBScript';
  ScriptControl.AddObject('FilesByName',WSHFiles);
  ScriptControl.AddObject('FilesById',FilesDict);

  txtCR := '';
  txtCR[1] := 13;
  txtCode :=
     'dim f1' + txtCR +
     ' For Each f1 in FilesByName' + txtCR +
     ' FilesById.Add (FilesById.Count+1), f1' + txtCR +
     ' Next' + txtCR;
  ScriptControl.AddCode(txtCode);
  txtCode :=
  'function GetItem(i)' + txtCR +
  ' GetItem = FilesById(i)' + txtCR +
  'end function' + txtCR;
  ScriptControl.AddCode(txtCode);
  ScriptControl.ExecuteStatement(txtCode);

  FOR i := 1 TO WSHFiles.Count DO BEGIN
    ImportFileName := ScriptControl.Eval('GetItem(' + FORMAT(i) + ')');
    ImportFileName := UPPERCASE(ImportFileName);
    FileName := DELCHR(ImportFileName,'<');
    WHILE STRPOS(FileName,'\') <> 0 DO
      FileName := COPYSTR(FileName,STRPOS(FileName,'\') + 1);

       
      <Datei vielleicht noch abfiltern (z. B. anhand der Endung), ob sie bearbeitet werden soll oder nicht>
      <Irgendwas mit der Datei machen>
      …
    END;
    …
  END;
  CLEAR(FilesDict);
  CLEAR(FileSystemObject);
  CLEAR(ScriptControl);
END ELSE BEGIN
  ...


Das Importverzeichnis muss lokal oder als Netzwerkfreigabe für den ausführenden Client zugänglich sein.

Für alle Interessierten viel Spaß beim Nachbasteln!

Grüße
Walter

Re: Dateien aus Verzeichnis auslesen

21. Februar 2012 10:44

Zu der Problematik mit der File Tabelle beim RTC hier im MSDN eine Alternative.

Re: Dateien aus Verzeichnis auslesen

21. Februar 2012 12:39

Oder auch hier :-D