Autor Beitrag
kabizolis
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 86



BeitragVerfasst: Do 08.09.05 08:37 
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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 86



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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:
ausblenden 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 86



BeitragVerfasst: Do 08.09.05 11:49 
Ich habe absolut keinen durchblick.... was mache ich falsch?

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Do 08.09.05 13:02 
ausblenden 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.