Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Fehlerbehandlung bei Datenbanken (https://www.delphipraxis.net/167744-fehlerbehandlung-bei-datenbanken.html)

Flash68 16. Apr 2012 09:19

Fehlerbehandlung bei Datenbanken
 
Hallo zusammen,

ich möchte eine Fehlerbehandlung in meine Programe einbauen die folgendermaßen aussieht:

Delphi-Quellcode:
procedure TFRM_Main.But_SpeichernClick(Sender: TObject);
begin
  try
    DM_Buecher.ADS_Buecher.Post;
    DM_Buecher.ADS_Buecher.Edit;
    setButtons(1)
  except
    DM_Buecher.ADS_Buecher.Cancel;
    DM_Buecher.ADS_Buecher.Edit;
    setButtons(1);
    MessageDlg('Es wurden nicht alle Felder ausgefüllt!',MtWarning,[mbOK],0)
  end;
end;
Allerdings wird im dem Fall das ein Feld das benötigt wird nicht ausgefüllt ist trotzdem ein neuer leerer Eintrag vorgenommen bzw. eine ID wird für den Versuch benutzt.

Kann mir jemand helfen wie ich die Fehlerbehandlung programmiere ohne das ein leerer Eintrag vorgenommen wird.

Gruß

Flash

p80286 16. Apr 2012 10:58

AW: Fehlerbehandlung bei Datenbanken
 
Was spricht dagegen dies so zu machen wie es seit Jahrzenten bekannt ist:
Delphi-Quellcode:
function FelderPrüfen:boolean;
begin
  if not(Feld1ok) then result:=false;
  if result then
    if not(Feld2ok) then result:=false;
  if result then
    if not(Feld3ok) then result:=false;
end;

if FelderPrüfen then speichern
else Fehlermeldung;
Du könntest natürlich auch einen Fehlercode generieren, von dem Deine Fehlernachricht und die weitere Verarbeitung abhängig sind.
Deiner Creativität sind da keine Gerenzen gesetzt.

Übrigens vor ein paar Monaten hier im Forum:
"bekannte Fehlerzustände sind keine Ausnahme"
(leider nicht von mir)

Gruß
K-H

Flash68 18. Apr 2012 09:22

AW: Fehlerbehandlung bei Datenbanken
 
Das hat mir schon mal gut weiter geholfen.

Allerdings weiß ich nicht wie ich überprüfe ob in einem DBEdit-Feld Text während der Append-Phase eingegeben wurde oder nicht.

Zusätzlich müsste ich auch noch prüfen ob in einer DBLookupCombobox ein Wert ausgewählt wurde.

pmoegenb 18. Apr 2012 11:46

AW: Fehlerbehandlung bei Datenbanken
 
Entweder bei Post, im Ereignis BeforePost z. B.:

Delphi-Quellcode:
If FieldByName('Field1').IsNull
oder durch Abfrage der Länge der Eingabe z. B.:

Delphi-Quellcode:
If Length(DBEdit1.Text) = 0

Flash68 18. Apr 2012 12:06

AW: Fehlerbehandlung bei Datenbanken
 
Kann das erste denn funktionieren?

Werden denn die Daten nicht erst nach dem post übertragen?

Flash68 9. Mai 2012 15:47

AW: Fehlerbehandlung bei Datenbanken
 
Ich hab jetzt die lösung zw. es zum laufen gebracht.
Delphi-Quellcode:
procedure TDM_Buecher.ADS_BuecherBeforePost(DataSet: TDataSet);
begin
  If  trim(FRM_Main.dbe_Titel.text) ='' then raise Exception.Create('Titel muss angegeben werden'); {abort}
end;
Allerding müsste ich jetzt noch eine DBLookupComboBox abfragen, kann mir jemand sagen was ich überprüfen muß um festzustellen das aus der zweiten Tabelle was ausgewählt wurde?

shmia 9. Mai 2012 15:59

AW: Fehlerbehandlung bei Datenbanken
 
Du solltest aus deinem Datenmodul NICHT auf das Formular zugreifen.
Delphi-Quellcode:
procedure TDM_Buecher.ADS_BuecherBeforePost(DataSet: TDataSet);
begin
  //if TrimRight(ADS_BuecherTitel.AsString) = '' then  // Alternative
  if TrimRight(Dataset.FieldByName('Titel').AsString) = '' then
    raise Exception.Create('Titel muss angegeben werden');
end;
Du musst auch nicht die DBLookupComboBox abfragen, sondern nur prüfen ob das Fremdschlüsselfeld gefüllt ist:

Delphi-Quellcode:
procedure TDM_Buecher.ADS_BuecherBeforePost(DataSet: TDataSet);
begin
  if Dataset.FieldByName('IdAuthor').IsNull then
    raise Exception.Create('Author muss ausgewählt werden');

  if TrimRight(Dataset.FieldByName('Titel').AsString) = '' then
    raise Exception.Create('Titel muss angegeben werden');
end;

mkinzler 9. Mai 2012 16:04

AW: Fehlerbehandlung bei Datenbanken
 
Ich würde die Abfrage früher durchführen (Eingabe?) und nicht erst beim Post. Eine Exception sollte wirklich nur eine "Ausnahme" sein und "nur" bei einer falschen Eingabe.

ADelph 9. Mai 2012 16:05

AW: Fehlerbehandlung bei Datenbanken
 
Hallo,

BeforePost wäre sehr günstig, um solche Sachen abzufragen. Da wurde noch nichts in die DB eingetragen - eben BeforePost.

Geeignet wäre auch, bei den Feldern die Property Required auf true zu setzen, dann geht auch nichts in die Datenbank, wenn es nicht gefüllt ist und das System meldet dir das.

Wenn du allerdings alle Felder, in denen nichts eingetragen ist, dem Benutzer anzeigen willst, dann wird es etwas aufwendiger. Die bisher genannten Methoden ergeben eine inkrementelle Fehlerabfrage, also einen nach dem anderen - was manchmal lästig sein kann. Da wäre es schöner, der Benutzer würde alle Fehler auf einmal sehen und könnte dann entsprechend gleich alles korrigieren.

Grüße

Flash68 9. Mai 2012 17:46

AW: Fehlerbehandlung bei Datenbanken
 
Zitat:

Zitat von mkinzler (Beitrag 1165672)
Ich würde die Abfrage früher durchführen (Eingabe?) und nicht erst beim Post. Eine Exception sollte wirklich nur eine "Ausnahme" sein und "nur" bei einer falschen Eingabe.

Das habe ich probiert, mit den Ansätzen von p80286, aber da habe ich es nicht geschafft abfzufragen ob etwas in meinem DBedit-Feld eingegeben ist, mit der BeforePost hat es dann geklappt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:56 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz