Einzelnen Beitrag anzeigen

Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#20

Re: Access - monatlich neue DB erstellen

  Alt 25. Aug 2006, 17:04
Zitat von stephan3309:
Ich bekomme ... einen Fehler beim Übersetzen, woran könnte das Liegen?

Könnt ihr sonst noch einen Denkfehler entdecken?
Warum erlaubst Du uns nicht, die vom Compiler gemeldeten Fehler zu lesen? So müssen wir raten...

Allerdings sind diverse Fehler offensichtlich. Ich sehe folgende Problemstellen oder Fehler:
Delphi-Quellcode:
function TForm1.Backup: Boolean;
// ...
procedure Backup_DB;
Backup ist Bestandteil der Klasse TForm1, Backup_DB ist eine (globale?) Prozedur; es bietet sich aber wohl an, beides in derselben Klasse zu deklarieren und zu implementieren - es sei denn, Du willst beides unabhängig voneinander benutzen.

if TForm1.Backup.Result := 1 then begin Hier gibt es folgende Fehler:
1. Du greifst auf TForm1, d.h. auf eine Klasse zu; Du würdest aber eine Instanz - z.B. Form1 - benötigen.
2. Backup ist eine Funktion vom Typ Boolean. Form1.Backup repräsentiert also bereits einen der Werte true/false.
3. Result kann nur als lokale Variable innerhalb einer Funktion verwendet werden; es ist aber kein Bestandteil einer Klasse TForm1.Backup (das wäre auch ein Widerspruch zur Deklaration als Funktion, also Quatsch).
4. Mit Result := 1 weist Du der (nicht existenten) Eigenschaft Result den numerischen Wert 1 zu.
Da muss der Compiler doch durcheinander kommen.

In der Folge gäbe es weitere gleichartige Probleme:
Delphi-Quellcode:
var clear_DB:Boolean ;
// ...
  if
// ...
    clear_DB := 1;
  end;
// ...
  if clear_DB := 1 then begin
    clear_DB := 0;
  end;
end;
Bitte nimm Einrückungen vollständig, d.h. auch innerhalb von if...begin/end vor; dann sollten Dir Fehler selbst auffallen:
1. clear_DB ist als Boolean deklariert, bekommt aber numerische Werte zugewiesen.
2. if clear_DB := 1 ist eine Zuweisung einer Zahl, soll aber ein bool-Vergleich sein.
3. Bei der zweiten if-Abfrage ist nicht sichergestellt, dass clear_DB überhaupt einen Wert hat: Es bekommt weder vor der ersten if-Abfrage noch innerhalb eines else-Zweiges einen Wert zugewiesen.
4. Am Ende bekommt clear_DB noch den Wert 0, mit dem Du aber nichts mehr machst. Wozu?

Ich vermute, dass Du Folgendes erreichen willst:

Delphi-Quellcode:
function TForm1.Neuer_Monat: Boolean;
var Year, Month, Day: Word;
    Vergleich: TDateTime;
begin
  // bei dieser Variante könnte man auf die Variable Vergleich verzichten
  // und DecodeDate(Now...) schreiben; aber zur Vergleichbarkeit lassen wir das
  Vergleich := Now;
  DecodeDate(Vergleich, Year, Month, Day);
  // Rückgabe: Day = 1 => Neuer_Monat ja
  // Rückgabe: Day <> 1 => Neuer_Monat nein
  Result := Day = 1;
end;

// geändert in Funktion innerhalb des Formulars:
// Rückgabe: Kopie erledigt und bearbeitet ja/nein
function TForm1.Backup_DB: Boolean;
var sDateiname: string;
begin
  // Result bezieht sich auf die aktuelle Funktion;
  // Vorgabe: es wurde keine Kopie erstellt
  Result := false;
  // Neuer_Monat ist der Rückgabewert der o.g. Funktion!!!
  if Neuer_Monat then
  begin
    // Versuch einer Kopie mit Fehlerprüfung
    try
      // der Dateiname könnte noch schöner erzeugt werden und benötigt
      // bei einmaliger Verwendung keine Variable
      sDateiname := 'c:\test\backup\daten' + datetostr(now) + '.mdb';
      copyFileTo('c:\test\db\daten.mdb' , sDateiname );
      // wenn kopiert werden konnte
      Result := true;
    except
      // wenn nicht kopiert werden konnte: Fehlermeldung
      on e:exception
      do ShowMessage(e.Message);
      // Result steht weiterhin auf false
    end;
  end;
  // wenn kopiert werden konnte, dann DB anpassen
  if Result then
  begin
    try
      // mit Fehlerprüfung
      DataModule6.ADOTable1.Close;
      DataModule6.ADOTable1.Open;
      DataModule6.ADOCommand1.Execute;
      DataModule6.ADOTable1.Close;
      DataModule6.ADOTable1.Open;
    except
      // wenn DB nicht bearbeitet werden konnte: Fehlermeldung
      on e:exception
      do ShowMessage(e.Message);
      // Result muss jetzt auf false gesetzt werden
      Result := false;
    end;
  end;
end;
Zur Verbesserung könnte man die zweite Funktion noch danach unterscheiden, ob überhaupt nicht kopiert werden sollte (Day <> 1) oder ob nicht kopiert werden konnte oder ob die DB nicht überarbeitet werden konnte. Außerdem kann die erste Funktion lokal in die zweite eingebaut werden (da schreien dann andere User wieder auf - bitte keine neue Diskussion darüber); und je nach Fehlermeldung kannst Du unterschiedlich reagieren.

Aber das solltest Du Dir alles später überlegen. Jürgen
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat