Autor Beitrag
ibh_compucat
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130

Win 2000, Win 8.1
D6, Ent. XE5 Ent.
BeitragVerfasst: Do 22.08.02 22:03 
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:
ausblenden volle Höhe Quelltext
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
Renegade
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 358

Win XP Pro, Win 7 Beta
BDS 2006
BeitragVerfasst: Fr 23.08.02 00:14 
Moin erstmal!

ibh_compucat hat folgendes geschrieben:
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 habe mir die Delphi-Sourcen noch nicht angeguckt denke aber, daß du mit deiner Vermutung recht hast.

Du kannst dir ja mal testhalber eine eigene kopierfunktion basteln und dann das ganze noch mal testen. Das Ergebnis würde mich sehr interessieren.

Gruß Renegade

_________________
Sokrates (468 v.Chr. - 399 v.Chr.)
"Es ist keine Schande, nichts zu wissen, wohl aber, nichts lernen zu wollen."
ibh_compucat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130

Win 2000, Win 8.1
D6, Ent. XE5 Ent.
BeitragVerfasst: Fr 23.08.02 12:45 
Hallo Renegade,

Danke erstmal für die Antwort. Ich habe Deinen Tipp aufgegriffen und eine Testprogramm geschrieben, indem ich eine Datei umkopiere und dann anschließend mit einem Try - except Konstrukt öffne.
"Leider" klappt jeder Versuch beim erstenmal, das allein kann also nicht das Problem sein.
Vielleicht müssen mehrere Dinge zusammenkommen, z.B. Windows ist mit Netzwerkzugriffen beschäftigt, ich habe die Ursache nicht finden können.

Gruß
ibh_compucat