[Gelöst] autom. Datenimport mittels Dataport verschiedener D

8. Juni 2006 15:55

folgendes Problem:

Ich möchte Dateien im Text-Format über einen Dataport automisch einlesen lassen.

Der Dataport funktioniert soweit schon, wenn ich die Geschichte manuell anstosse und dann direkt auf die Datei klicke, die importiert werden soll.
Auch den Dataport über einen Timer ansprechen ist kein Problem. Aber der Dataport soll alle Dateien aus einem bestimmten Verzeichnis, die mit XY... beginnen automatisch nacheinander einlesen.

Keine Ahnung wie ich da ran gehen soll.

Gruß RobRoy
Zuletzt geändert von RobRoy am 14. Juni 2006 11:17, insgesamt 4-mal geändert.

8. Juni 2006 17:21

Ich würde das folgendermassen machen:

- Eine Funktion im Dataport erstellen, über welche das Import-File an den Dataport übergeben werden kann.
- In einer Codunit den Dataport als Variable deklarieren
- In einer Schleife pro einzulesendes File den Dataport aufrufen und vorher jeweils den Filenamen übergeben

Innerhalb des Dataports musst du dann natürlich den übergebenen Filenamen an den Dataport zuweisen. Das Property Import im Dataport stelle ich in diesen Fällen immer bereits im Dataport auf JA, UseReqForm hingegen auf NEIN. So kann der Dataport ohne anzuhalten durchlaufen

9. Juni 2006 08:32

Hallo,
ich habe es folgendermaßen Realisiert:
Erstelle zwei neue Variablen auf die Tabelle "File" und eine Textvariable
Name_______DataType_____Subtype Length
Verzeichnis__Record________File
Pfad________Text__________250
In Pfad steht der Pfad in dem die Dateien liegen:
Code:
Verzeichnis.RESET;
Verzeichnis.SETRANGE(Path,Pfad);
Verzeichnis.SETRANGE("Is a file",TRUE);
Verzeichnis.SETFILTER(Name,'*.bmp');    // Hier den Filter XY setzen
IF Verzeichnis.FIND('-') THEN BEGIN
  REPEAT
    // Hier Irgendetwas machen
  UNTIL Verzeichnis.NEXT = 0;
END;


Gruß Mikka

12. Juni 2006 13:05

in meiner kleinen Funktion steht nun folgendes: (es funktioniert !!!) aber...

in meinen Verzeichnis sind meintwegen 5 Dateien, diese Datein werden nun gesucht gefunden und dem Filehandle zur Verfügung gestellt. Die Schleife wird auch schön durchlaufen und wenn das file eingelesen ist wird es in ein anderes Verzeichnis geschoben und gelöscht. Das gleiche mit allen Dateien die gefunden wurden bis keine mehr da sind. Nun verläßt der Filehandle die Schleife, weil er ja nix mehr findet. Nun fängt der Timer wieder an (steht auf 5000) und die Geschichte geht von vorne los, aber nun das Problem. Es sind keine Files im Verzeichnis, mein FileHandle findet aber angeblich eins, zumindest ist es das, was zuerst eingelesen wurde. und dann kommt eine Fehlermeldung, das das Betriebsystem das File nicht finden kann - kann es ja auch nicht - es ist ja keines da. Irgentwoher kommt diese Varibale zum Vorschein - obwohl ich meinen Filehandle doch reset habe.

FileHandle ist ein Record auf file und BMImport ein dataport

KredEinr.GET;

FileHandle.RESET;
FileHandle.SETRANGE(Path, KredEinr."Pfad für Online BM");
FileHandle.SETRANGE("Is a file",TRUE);
FileHandle.SETFILTER(Name, '*.txt');

IF FileHandle.FIND('-') THEN REPEAT

CLEAR(BMImport);
BMImport.FILENAME(FileHandle.Path + FileHandle.Name);
BMImport.RUNMODAL;
COPY(FileHandle.Path + FileHandle.Name, FileHandle.Path + 'Archiv\' + FileHandle.Name);
ERASE(FileHandle.Path + FileHandle.Name);
COMMIT;
Eingelesen := TRUE;
UNTIL FileHandle.NEXT=0;

12. Juni 2006 18:58

ich würde vor der ersten Zeile ein CLEARALL machen oder vor dem Filehandle.reset ein clear(filehandle).
Das sollte wirklich alles löschen.

13. Juni 2006 08:04

nein, hat leider nix gebracht. wo ich schon überall clear's und reserts machen wollte....

das file Objekt "filehandle" ist (so sieht es im Debugger aus) nehm ich an resetet.

an dieser Stelle
IF FileHandle.FIND('-') THEN REPEAT

steht dann plötzlich wieder als Name die Datei, die als erstes eingelesen wurde. Ich hab noch mal nachgedacht :oops: und meine, wenn ich einen Dataport über die Requestform manuell starte, steht doch da auch immer
der Pfad mit Dateinamen der letzten eingelesenen Datei. Das heißt doch das irgentwo irgentwas zwischengespeichert wird. Und ich denke von da her zieht sich mein Filehandle trotz jeder Menge clear und resets seinen
falschen Wert.
Keine Ahnung wie ich da weiter komme. Ich schmeiss hier gleich alles hin :heul:

13. Juni 2006 08:11

Das was da im Dataport steht, wenn man ihn aufruft, wird in der ZUP-Datei gespeichert....

13. Juni 2006 09:02

zup löschen hat auch nix gebracht

13. Juni 2006 11:03

Dann bleibt nur noch, dass du nach dem Clear(BMImport); noch ein

If File.Exists(FileHandle.Path + FileHandle.Name) then begin

und nach dem eingelesen:=true; ein

END;

einfügst, dann wird alles dazwischen nur ausgeführt, wenn das File auch existiert.

File ist eine Variable vom typ file.

13. Juni 2006 11:27

If File.Exists - solch einen hab ich auch schon gesucht, aber den scheint es in der 2.6 version nicht zu geben. :-(

****************
Am 13.06.2006 12:25 Uhr nachgetragen

ich hab ne möglichkeit gefunden ist zwar schwer gepfuscht find ich, aber es funktioniert:


CLEAR(BMImport);

IF file.OPEN(FileHandle.Path + FileHandle.Name) THEN BEGIN

file.CLOSE();

BMImport.FILENAME(FileHandle.Path + FileHandle.Name);

Hallo RobRoy,

bitte Editiere künftig deinen vorhandenen Beitrag, wenn innerhalb von 24 Stunden kein weiter Beitrag von anderen Mitgliedern geschrieben wurde.

Vielen Dank für dein Verständnis.
Solltest du dich ungerecht behandelt fühlen, so wende dich bitte an einen Administrator.

Mikka
MBS-Support.info-Team

13. Juni 2006 13:19

in 4.0 funktioniert auch einfach:

if exists(filehandle.path+filehandle.name) then ...
in der Doku (F1) steht halt file.exists

13. Juni 2006 15:13

hmmm, zu früh gefreut.

Die Fehlermeldung wird zwar mit der erweiterten Abfrage umgangen, aber nicht das Problem mit dem "omninösen" Variablen Wert meines File-Records. Der bleibt und somit wird die Schleife nicht wieder durchlaufen.

Was mir noch aufgefallen ist: ein "delete" oder "deleteall" auf den FileHandle (ist übrigens ein Record auf File) geht nicht, da laut Fehlermeldung auf die Tabelle "File" nur lesend zugegriffen werden kann. Werden meine eingelesenen Dateien denn wohl dort gepuffert ? und wenn ja wo befindet sich diese Tabelle und wie kann ich dort meine Werte wieder löschen ???? Wenn die dort wirklich gepuffert werden, würde das natürlich auch erklären warum ich meinen "Filehandle" bis ins ultimo reseten kann, ohne das etwas passiert.

13. Juni 2006 17:29

Die Tabelle File ist eine Systemtabelle, die Ein Abbild des Filesystem ist, man sieht darin nur etwas, wenn man einen Filter auf das Feld Path setzt und so die Tabelle gefüllt wird mit dem Inhalt des Pfads.

Aber zurück zu deinem Problem, wieso wird die Schleife nicht mehr durchlaufen?
Der Timer stösst das doch einmal an, er findet den ominösen und stellt mit if exists() fest, dass es den nicht gibt und beendet die Schleife mit until file.next=0
und beim nächsten Timerevent gehts von vorne los, wenn dann tatsächlich ein File da sein sollte, wird auch der Bereich zwischen Begin und End ausgeführt, oder etwa nicht?

13. Juni 2006 22:54

na eben nicht, weil die Variable meines Files immer noch mit dem "ominösen" Wert der nichtexistenten Datei gefüllt wird.

13. Juni 2006 23:11

der findet dann auch mit next nicht die wirklich existente Datei?

seeeeehr merkwürdig....

14. Juni 2006 11:13

Michael Schumacher hat geschrieben:Die Tabelle File ist eine Systemtabelle, die Ein Abbild des Filesystem ist, man sieht darin nur etwas, wenn man einen Filter auf das Feld Path setzt und so die Tabelle gefüllt wird mit dem Inhalt des Pfads.


:-D Ich glaube das war der entscheidene Hinweis, wenn ich nur über "path" da ran komme warum setz ich nicht "path" := nix.

Den Code hab ich wie folgt angepasst und scho funktionierts endlich !!!!!

Code:
FileHandle.RESET;
FileHandle.SETRANGE("Is a file",TRUE);
FileHandle.SETRANGE(Path,'');
IF FileHandle.FIND('-') THEN;
FileHandle.SETRANGE(Path, KredEinr."Pfad für Online BM");
FileHandle.SETFILTER(Name, 'BM*.txt');

IF ((FileHandle.FIND('-')) AND (EXISTS(FileHandle.Path + FileHandle.Name))) THEN REPEAT


Danke an alle die sich an der Lösung beteiligt haben und besonders an Michael ;o)