Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Duplicate-Value-Fehler bei Aufruf von Append

  Alt 9. Mai 2015, 08:30
Was ist daran in welcher Hinsicht besser? Immerhin müßte ich, um deinen Vorschlag umzusetzen, eine zusätzliche Unit einbinden. Exception fängt jedoch den Fehler einwandfrei ab, das genügt mir.
Problematisch ist daran, dass du eben egal welche Exception fängst und durch den großen Einzugsbereich von try .. except eben auch für alles Möglich eine Exception bekommen kannst.

Wenn du programmtechnisch alles richtig machst, dann wird diese Lösung exakt das machen, was du davon erwartest. Somit also keine Einwände.

Die Probleme fangen immer dann an, wenn es aus welchen Gründen auch immer in dem gekennzeichneten Bereich zu einer Exception kommt:
Delphi-Quellcode:
  Try

    {problematischer Bereich Anfang}

    DatMod.Qset_Personen.Append;
    Feld_Id.AsInteger := Id;
    Feld_Name.AsString := Person;
    If DateExists Then
    Feld_Datum.AsDateTime := Datum;

    {problematischer Bereich Ende}

    DatMod.Qset_Personen.Post;
    Result := True;
  Except
dann reagierst du so, als ob es sich um ein Duplikat handelt.

Besser wäre es zumindestens schon mal das so umzustellen

Delphi-Quellcode:
Function TFrame_PersonenAktuell.Eintragen(Id : Integer; Person : String; Datum : TDateTime; DateExists : Boolean) : Boolean;
begin
  DatMod.Qset_Personen.Append;
  Feld_Id.AsInteger := Id;
  Feld_Name.AsString := Person;
  If DateExists Then
  Feld_Datum.AsDateTime := Datum;

  Try
    // Nur Post-Methode abfangen
    DatMod.Qset_Personen.Post;
    Result := True;
  Except
    // Eine Einschränkung auf den konkreten Exception-Typ wäre noch besser
    On E: Exception Do
    Begin
      Result := False;
    // Das ist die Lösung: das Dataset ist noch im Insert-Mode, wenn ich es beim nächsten Mal anspreche
      If (DatMod.Qset_Personen.State = dsInsert) Or
         (DatMod.Qset_Personen.State = dsEdit) Then
          DatMod.Qset_Personen.Cancel;
      Memo_Log.Lines.Append(e.Message + GLD.TS + IntToStr(Id));
    End;
  End;
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)