Hallo Freunde,
kann es sein, dass doch nicht alles so ist wie früher???? Bei folgendem Programmblock kommt es oft zur Exeption, obwohl ich mir keiner Schuld bewusst bin:
zuerst lösche ich in einem Transferpufferverzeichnis eine (alte) (Paradox-Tabelle) Datei, falls noch vorhanden:
Ausgangspunkt: meine aktuelle Datei ('TEMP\KUNDE.DB') soll in ein Tabellenpufferverzeichnis ('DEBITOREN\') kopiert werden und anschließend dort geöffnet werden:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76:
| Dateiname := 'DEBITOREN\KUNDE.DB; // zum Beispiel
// falls eine alte Tabelle vorhanden, soll sie gelöscht werden:
if FileExists(Dateiname) then DeleteFile(Dateiname);
// dann kopiere ich eine aktuelle Datei dorthin, wobei DEBITOREN ein // Tabellenpuffer ist, d.h. es können mehrere Tabellen dort sein für // einen Transfer in ein endgültiges Verzeichnis:
CopyFile('TEMP\KUNDE.DB', PChar(Dateiname), false);
// dann erfolgt die Abfrage, ob das Zielverzeichnis (auf einem Novell- // Server) existiert:
HS := 'F:\BUCHHALTUNG\DEBITOREN\'; if DirExists(HS) then // vorsichtshalber prüfen, ob Zielverzeichnis existiert begin
// nun versuche ich, die erste zu übertragende Tabelle im Tabellenpuffer zu öffnen:
if FindFirst('DEBITOREN\*.db', faAnyFile, SearchRec) = 0 then
repeat with SearchRec do begin Dateiname := Name; KundenNr := Copy(Dateiname, 1, Pos('.', Dateiname)-1); if (Name <> '.') AND (Name <> '..') then begin if copy(Dateiname, Pos('.', Dateiname)+1, 2) = 'db' then begin
// Eintrag (zu kopierende Paradox Tabelle) gefunden i := 0; gefunden := false;
// Versuch, die Tabelle zu öffnen:
repeat // weil meistens der erste Versuch zu öffnen scheitert, warum? Form1.Table1.Active:= false; Form1.Table1.close; Verz:= ExtractFilePath(ParamStr(0)); try Form1.Table1.DatabaseName:= Verz; Form1.Table1.TableName:= 'DEBITOREN\' + Dateiname; if FileExists(Form1.Table1.TableName) then begin // an dieser Stelle, wenn die Table auf active = true gesetzt wird, // entsteht sehr häufig eine Exception: Form1.Table1.Active:= true; Form1.Table1.First; gefunden := true; end; except gefunden := false; inc(i); end; until (gefunden) OR (i > 10);
if gefunden then begin
// ..... weitere Auswertung end;
end; end; end; until FindNext(SearchRec) <> 0;
FindClose(SearchRec);
end; |
Wenn der Versuch scheitert, die Tabelle zu öffnen, kann natürlich nichts ausgewertet werden und die Datei bleibt im Tabellenpuffer, bis zur nächsten Übertragung. Da die Übertragung beim nächsten Durchlauf meistens klappt, vermute ich Laufzeitprobleme mit dem Betriebssystem. Kann es vielleicht sein, daß der Copy-Befehl an die API von Windows NT ausgegeben wird und mein Delphi-Programm schon weitermacht, so daß zum Zeitpunkt, wenn die Table.active auf true gesetzt wird, die Datei noch gar nicht fertigkopiert ist? Ich finde alleine keine andere Erklärung, weiß jemand von euch Datenbank-Profis was darüber? Wäre toll, Danke.
euer
ibh_compucat