Autor |
Beitrag |
Arne Danikowski
      
Beiträge: 194
|
Verfasst: Fr 31.07.09 09:54
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:
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 31.07.09 10:01
|
|
Arne Danikowski 
      
Beiträge: 194
|
Verfasst: 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.
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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 
      
Beiträge: 194
|
Verfasst: 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)]);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
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 31.07.09 11:05
Delphi-Quelltext 1:
| DM.Query.Parameters.ParamByName('pass').Value := pin; |
|
|
Arne Danikowski 
      
Beiträge: 194
|
Verfasst: 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"
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 pin := Format('%.4d', [Random(10000)]);
DM.Query.Close;
DM.Query.SQL.TEXT := 'SELECT COUNT (*) FROM KINDER WHERE passwort = :pin'; DM.Query.Parameters.ParamByName('pin').Value := pin;
DM.Query.Open;
Vorhanden := DM.Query.Fields[0].AsInteger > 0;
pass := BoolToStr(vorhanden);
pruef:= StrToInt(pass);
if pruef < 0 then begin ShowMessage('Passwort bereits vergeben. Bitte erneut generieren!'); DBEdit10.Text:=''; end else
DM.Query2.Edit; DM.Query2.FieldByName('Passwort').AsString := pin; DM.Query2.Post; end |
So funktioniert es jedenfals.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 pin := Format('%.4d', [Random(10000)]);
DM.Query.Close;
DM.Query.SQL.TEXT := 'SELECT COUNT (*) FROM KINDER WHERE passwort = :pin'; DM.Query.Parameters.ParamByName('pin').Value := pin;
DM.Query.Open;
if DM.Query.Fields[0].AsInteger > 0 then begin ShowMessage('Passwort bereits vergeben. Bitte erneut generieren!'); DBEdit10.Text:=''; end else
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.
|
|