Sorry Kai, habe die Nachricht erst heute geöffnet...
Ich will heute (entgegen allen guten Vorsätzen
)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