Entwickler-Ecke

Datenbanken - Ist ID vorhanden


Mysterio08 - Mi 22.09.10 16:00
Titel: Ist ID vorhanden
Hallo,

ich suche eine Funktion, welche mit als Rückgabewert sagt, ob es in einer Spalte einer Datenbanktabelle einen Eintrag mit dem Wert "Beispielwert" gibt. Das ist mein Ansatz:
DataSource2.DataSet.FieldByName('AuftragID').?
Natürlich könnte ich auch einfach eine SQL-Abfrage starten und prüfen, ob die Anzahl der gefundenen Aufträge > 0 ist, aber mit einer Funktion wäre es doch schöner!

mfg.


Tankard - Mi 22.09.10 16:08

mit

select * from auftrag where aufrtagsid=XXXXXX

dann wie folgt:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
dataset.open;
dataset.first;
if dataset.eof then
  begin
    //nix da
  end
else  // was da


Mysterio08 - Mi 22.09.10 16:15

Mhm, aber wie genau muss die Anweisung lauten? Ich habe ja nicht nur einen Datensatz, sondern mehrere. Ich habe deinen Ansatz, Tankard, mal so verwendet:

Delphi-Quelltext
1:
2:
3:
4:
DataSource2.DataSet.Open; //Muss das explizit "geöffnet" werden?
while not DataSource2.DataSet.Eof do begin
  DataSource2.DataSet.FieldByName('AuftragID').??? then Existiert := True
end;


Edit: Da warst du schneller ;D
Aber ich wollte mich gerade um diese SQL-Anweisung (die ja noch ausgeführt werden muss?) "drücken", weil es auch darum geht, eine neue SQL-Abfrage zu starten, um die Datensätze im TDBGrid wieder anzuzeigen, oder geht das nicht verloren?


Tankard - Mi 22.09.10 16:18

ahso meintest du das

schau dir mal locate, lookup, bzw seek an.

hier ne artikel zu den funktionen:

http://delphi.about.com/od/database/l/aa052901a.htm

gruss
tankard


bummi - Mi 22.09.10 16:25

Ich würde das ganze einmalig wegkapseln ....


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
Procdure GetHelpQuery(Ads:Tadodataset;const SQL:String);
begin
   Ads.Close;
   Ads.Commandtext := SQL;
   Ads.Open;
end;

Function GetCountForFieldAndValue(Ads:Tadodataset;const Table,Field,Value:String):Integer;
begin
  GetHelpQuery(Ads,'Select Count(*) from ' + Table + ' where ' + Field + '=' + Value);
  Result := Ads.Fields[0].asInteger;
end;


jasocul - Do 23.09.10 07:49

Wenn auf der ID ein Index liegt, wovon ich mal ausgehe, würde ich ein SQL-Abfrage machen.
Ein Locate verschiebt meines Wissens auch den Datensatzzeiger, was oft zu unerwünschten Nebeneffekten führt.

Also einfach ein weiteres Dataset ezeugen und eine passende SQL-Abfrage definieren.


mkinzler - Do 23.09.10 08:12

Alternativ zu .Locate() gäbe es noch .Lookup(), welches den Datensatzzeiger nicht verschiebt.


Mysterio08 - Fr 24.09.10 17:01

Danke, das hat mir alles geholfen, ich habe es jetzt hinbekommen!