Entwickler-Ecke

Datenbanken - Fehleingabe in einem Datumsfeld


[TP]Hawk274 - Di 10.12.02 10:49
Titel: Fehleingabe in einem Datumsfeld
Ich ein DBEdit eine Datumsspalte zugeordnet. Ist es ratsam dafür ein Editmask festzulegen?
Nun aber mein Problem. Wenn ich in diesem DBEdit ein falsches Wert als Datum eingebe z.B. nur 50 (als Tag) und danach mit TAB rausgehe tritt immer eine EDBEditError( Ungültiger Eingabewert. Mit der Taste ESC machen Sie Änderungen rückgängig. ) Nun gut ... dann dachte ich ... gehst mal auf die Table Komponenten, wählst das Feld Datum aus und benutzt die Events OnValidate oder OnChange. Aber es die Exception tritt bereits früher auf. Wie kann man diese nun abfangen?


LCS - Di 10.12.02 11:50

Hi
Solche Fehler kannst du IMHO bei OnDataChange der DataSource abfangen. Wenn du mit persistenten Feldern arbeitest, kannst du auch OnValidate des Feldes verwenden.

Gruss Lothar


[TP]Hawk274 - Di 10.12.02 18:08

Ich habe bereits OnValidate ausprobiert, aber hatte kein Erfolg. Der Fehler tritt noch früher auf.
Man musste im Prinzip die Funktion IsValidDate in eine Try Except Block ausführen. Vorher muss man noch das Jahr, den Monat und Tag ermitteln. Dazu habe ich die Funktion DecodeDate gefunden. Das würde vielleicht funktionieren. Aber leider weiß ich nicht wo ich den try except Block "hinschieben" soll!? Vielleicht hat jemand einen Vorschlag.

Wie ich der Hilfe entnehmen durfte wird übrigens OnDataChange nach OnValidate ausgeführt. Was irgendwie auch logisch klingt.


LCS - Mi 11.12.02 12:30

Hi
ich habs gerade noch mal ausprobiert. Das OnValidate Ereignis ist schon die richtige Stelle. Wenn du in diesem Ereignis eine Exception auslöst, findet keine Aktualisierung der Datenmenge statt. Primitive Form:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.tblSaleDateValidate(Sender: TField);
var
  datum:  TDateTime;
begin
  try
    Datum := StrToDate(DBEdit1.EditText);
  except
  end;
end;

Tritt hier bei der Konvertierung ein Fehler auf, weil es kein gültiges Datum ist, wird die Datenmenge nicht aktualisiert und es wird auch keine Fehlermeldung ausgegeben. Dafür wärst du im Except-Block selbst zuständig.

Gruss Lothar


[TP]Hawk274 - Mi 11.12.02 18:12

Bei mir erscheint trotzdem eine Exceptions. Hier mal der Quellcode ...

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:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, StdCtrls, Mask, DBCtrls;

type
  TForm1 = class(TForm)
    DBEdit1: TDBEdit;
    ADOConnection1: TADOConnection;
    ADOTable1: TADOTable;
    DataSource1: TDataSource;
    ADOTable1Geburtsdatum: TDateTimeField;
    DBEdit2: TDBEdit;
    procedure ADOTable1GeburtsdatumValidate(Sender: TField);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ADOTable1GeburtsdatumValidate(Sender: TField);
var
 datum:  TDateTime;
begin
 try
  Datum := StrToDate(DBEdit1.EditText);
 except
  on E: Exception do showmessage( E.Message );
 end;
end;

end.


Ich greife übrigens auf eine Access DB zu ... vielleicht hat das damit auch noch zu tun. :?: :?: :?:


LCS - Do 12.12.02 10:02

Hi
mit Access dürfte das wenig zu tun haben. Deshalb stell ich jetzt erst mal die ketzerische Frage:
Hast du das jemals ausserhalb der IDE getestet?
Wenn die Antwort darauf Nein ist, dann solltest du das mal schleunigst nachholen. :mgreen:

Gruss Lothar