Autor Beitrag
Arne Danikowski
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 194



BeitragVerfasst: 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

ausblenden 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



BeitragVerfasst: Fr 31.07.09 10:01 
ausblenden SQL-Anweisung
1:
2:
3:
SELECT COUNT(*) 
FROM TABELLE
WHERE pass = :pass

Wenn das Ergebnis > 0 ist, gibt es die Pin bereits. Übrigens:
ausblenden Delphi-Quelltext
1:
pass := Format('%.4d',[Random(10000)]);					

ist kürzer ;)
Arne Danikowski Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 194



BeitragVerfasst: 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



BeitragVerfasst: 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.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
Query.Close;
Query.ParamByName('pass').Value := pass;
Query.Open;
Vorhanden := Query.Fields[0].AsInteger > 0;
Arne Danikowski Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 194



BeitragVerfasst: Fr 31.07.09 11:02 
Ok ich habe nun folgendes:
ausblenden 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
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 31.07.09 11:05 
ausblenden Delphi-Quelltext
1:
DM.Query.Parameters.ParamByName('pass').Value := pin;					
Arne Danikowski Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 194



BeitragVerfasst: 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" :)
ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 02.08.09 18:03 
Oder direkt so:
ausblenden 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.