Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Wert vergleichen


Arne Danikowski - Fr 31.07.09 09:54
Titel: Wert vergleichen
Hallo ich habe folgendes Problem:

über einen Button generiere ich eine Zufallszahl. Diese soll einen 4 Stelligen Pin ergeben


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
 pass := IntToStr(Random(10000));
 while Length(pass) < 4 do
 pass := '0' + pass;
 DM.KinderQuery.Edit;
 DM.KinderQuery.FieldByName('PIN').AsString:= pass;
 DM.KinderQuery.Post;


Nun möchte ich die eben generierte Pin mit allen anderen Datensätzen vergleichen. Denn Die Pin darf ja nicht doppelt vorkommen.
Ich habe da schon ein wenig mit einer while Schleife versucht zu basteln aber nicht hinbekommen:


Delete - Fr 31.07.09 10:01


SQL-Anweisung
1:
2:
3:
SELECT COUNT(*) 
FROM TABELLE
WHERE pass = :pass

Wenn das Ergebnis > 0 ist, gibt es die Pin bereits. Übrigens:

Delphi-Quelltext
1:
pass := Format('%.4d',[Random(10000)]);                    

ist kürzer ;)


Arne Danikowski - Fr 31.07.09 10:23

Vielen Dank für die Antwort, kannst Du mir ein Beispiel dafür geben? So ganz verstehe ich das nicht.


Delete - Fr 31.07.09 10:34

Pack eine Query auf Dein Formular und gib das Statement von oben in der Eigenschaft SQL ein (mit dem Doppelpunkt, der kennzeichnet einen Parameter). Dann kannst Du von Delphi aus prüfen.

Delphi-Quelltext
1:
2:
3:
4:
Query.Close;
Query.ParamByName('pass').Value := pass;
Query.Open;
Vorhanden := Query.Fields[0].AsInteger > 0;


Arne Danikowski - Fr 31.07.09 11:02

Ok ich habe nun folgendes:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure Tfrm_admin.BitBtn1Click(Sender: TObject);
var pin,pass: string;
    vorhanden:Boolean;
begin
pin := Format('%.4d',[Random(10000)]);//Zufallszahl erzeugen
DM.Query.Close;
DM.Query.SQL.TEXT:='SELECT COUNT (*) FROM KINDER WHERE passwort = :pass';
DM.Query.Parameters.ParamByName('pass').Value := pass;
DM.Query.Open;
Vorhanden := DM.Query.Fields[0].AsInteger > 0;
Label12.Caption := BoolToStr(vorhanden);


Der Wert von vorhanden ist immer 0, egal. ob die Pin schon vorhanden ist oder nicht


Delete - Fr 31.07.09 11:05


Delphi-Quelltext
1:
DM.Query.Parameters.ParamByName('pass').Value := pin;                    


Arne Danikowski - Fr 31.07.09 13:47

Vielen Dank für die Hilfe. Ich habe es mit diesen Hinweisen geschafft. Zur vollständigkeit hier
der gesamte "KOT" :)

Delphi-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:
procedure Tfrm_admin.BitBtn1Click(Sender: TObject);
var pin, pass: string;
  vorhanden: Boolean;
  pruef:Integer;
begin
 //Zufallszahl erzeugen
  pin := Format('%.4d', [Random(10000)]);

 //Datenmenge im Query schliessen
  DM.Query.Close;

//Inhalt von Variable PIN mit Datenbankfeld PAsswort vergeleichen
  DM.Query.SQL.TEXT := 'SELECT COUNT (*) FROM KINDER WHERE passwort = :pin'
  DM.Query.Parameters.ParamByName('pin').Value := pin;

//Datenbank öffnen
  DM.Query.Open;

//In Variable VORHANDEN das Ergebnis des Vergleichs übergeben (entweder 0 oder -1)
  Vorhanden := DM.Query.Fields[0].AsInteger > 0;

//Variable VORHANDEN in String-Variable
  pass := BoolToStr(vorhanden);

//String-Variable in Integer Variable (wird noch weiter benötigt)
  pruef:= StrToInt(pass);

//if Abfrage wenn Ergebnis kleiner wie 0 also pin schon vorhanden
  if pruef < 0 then
    begin
    ShowMessage('Passwort bereits vergeben. Bitte erneut generieren!');
    DBEdit10.Text:='';
    end
  else

// wenn Pin nicht vorhanden dann 
    DM.Query2.Edit;
    DM.Query2.FieldByName('Passwort').AsString := pin;
    DM.Query2.Post;
end



So funktioniert es jedenfals.


BenBE - So 02.08.09 17:53

Anstatt deiner komischen Verrenkungen mit BoolToStr und StrToInt würd ich in der IfAbfrage einfach if Vorhanden then ... nehmen. Das ist tausendmal schneller ... Und vor allem wesentlich sauberer.


jaenicke - So 02.08.09 18:03

Oder direkt so:

Delphi-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:
procedure Tfrm_admin.BitBtn1Click(Sender: TObject);
var
  pin, pass: string;
begin
 //Zufallszahl erzeugen
  pin := Format('%.4d', [Random(10000)]);

 //Datenmenge im Query schliessen
  DM.Query.Close;

//Inhalt von Variable PIN mit Datenbankfeld PAsswort vergeleichen
  DM.Query.SQL.TEXT := 'SELECT COUNT (*) FROM KINDER WHERE passwort = :pin'
  DM.Query.Parameters.ParamByName('pin').Value := pin;

//Datenbank öffnen
  DM.Query.Open;

//if Abfrage wenn Ergebnis kleiner wie 0 also pin schon vorhanden
  if DM.Query.Fields[0].AsInteger > 0 then
    begin
    ShowMessage('Passwort bereits vergeben. Bitte erneut generieren!');
    DBEdit10.Text:='';
    end
  else

// wenn Pin nicht vorhanden dann 
    DM.Query2.Edit;
    DM.Query2.FieldByName('Passwort').AsString := pin;
    DM.Query2.Post;

end
Und in dem gehighlighteten Teil stimmt die Einrückung nicht mit dem Quelltext überein. Die Einrückung hieße, dass alles in else ist, im Quelltext ist aber nur das DM.Query2.Edit; im else, da begin..end fehlt.