Entwickler-Ecke

Datenbanken - überprüfen ob wert vorhanden


kabizolis - Do 08.09.05 08:37
Titel: überprüfen ob wert vorhanden
hallo,

ich habe eine ganz simple applikation, die via barcodeleser einen wert in eine Access-db einliest (ADO-komponenten). es handelt sich dabei um den strichcode von CD's... falls die CD schon in meinem Sortiment vorhanden ist, soll er eine Ausgabe tätigen... "CD schon vorhanden" oder ähnlich.
da ich nur diese angabe (strichcode) benötige, ist dieser eintrag mit dem primärschlüssel versehen... nun kann ich folglich nicht 2 mal den selben wert eintragen, ohne dass seitens der db ein hilferuf kommt....

meine frage:

wie kann ich zuerst überprüfen, ob der wert schon vorhanden ist, bevor ich schreibe?

ich benutze ein dbGrid.... ADOquery....


jasocul - Do 08.09.05 08:44

Du benutzt eine Query, in der du alle Datensätze abfragst, die diesen Barcode als Primary-Key haben. Wenn du einen Datensatz bekommst, dann gibt es den Barcode schon. Ansonsten dürftest du gar keinen Datensatz als Ergebnis bekommen.
Wenn die Datenbank schon offen ist, ginge mit einem normalen Query auch die Methode Locate. Ob Ado das auch kennt, weiß ich nicht.
Ich würde aber den ersten Weg wählen.


kabizolis - Do 08.09.05 09:09

hmmm hab nichts derartiges gefunden, wenn mir jemand konkreten code posten könnte wär ich sehr froh!


jasocul - Do 08.09.05 09:55

user profile iconkabizolis hat folgendes geschrieben:
hmmm hab nichts derartiges gefunden, wenn mir jemand konkreten code posten könnte wär ich sehr froh!

Was hast du nicht gefunden? :wink:
Da du ADOQuery verwendest, solltest du wissen, was eine SQL-Anweisung ist.
Ob ein Datensatz vorhanden ist, geht etwa so:

Quelltext
1:
select count(*) as Anzahl from Tabelle where DeinFeld = DeinWert                    

Tabelle, DeinFeld und DeinWert musst du noch durch deine eigenen Daten ersetzen.
Danach kannst du mit:

Delphi-Quelltext
1:
ADOQuery.FieldByName('Anzahl').AsInteger                    

feststellen, wieviele Datensätze gefunden wurden. In deinem Fall darf nur 0 oder 1 heraus kommen. Du solltest dafür natürlich eine andere Query verwenden, als die, die du für dein DBGrid verwendest.
Was du dann mit deinem Ergbnis machst sollte klar sein. Bei 0 kannst du den Datensatz hinzufügen, bei 1 existiert er schon.


kabizolis - Do 08.09.05 11:49

Ich habe absolut keinen durchblick.... was mache ich falsch?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.Button1Click(Sender: TObject);
begin
 ADOQuery1.SQL.Clear;
 ADOQuery1.SQL.Add('SELECT COUNT (*) AS Anzahl FROM Barcode WHERE Barcode = "'+ Edit1.Text +'";');
 ADOQuery1.FieldByName('Anzahl').AsInteger;
 ADOQuery1.ExecSQL;
end;


jasocul - Do 08.09.05 13:02


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.Button1Click(Sender: TObject);
begin
 ADOQuery1.SQL.Clear;
 ADOQuery1.SQL.Add('SELECT COUNT (*) AS Anzahl FROM Barcode WHERE Barcode = "'+ Edit1.Text +'";');
 ADOQuery1.Open;
 if ADOQuery1.FieldByName('Anzahl').AsInteger = 0 then
 begin
  // Kann erfasst werden. Hier deine Erfassungsroutine einbauen
 end
 else
 begin
  // Den Datensatz gibts schon. Fehlermeldung basteln
 end;
 ADOQuery1.Close;
end;

So sollte es funktionieren.