Autor Beitrag
dm
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 83



BeitragVerfasst: Di 04.02.03 11:52 
Hallo,

ich möchte folgendes realisieren: Man kann nach einem Kriterium (z.B. Nachname in der Datenbank Personal) suchen. Jedoch nicht nur nach einem zur Zeit sondern man kann mehrere Nachnamen gleichzeitig suchen lassen.

Nun die Frage: Wie kann ich abfragen, ob ein Datensatz den ich gesucht habe vorhanden ist oder nicht ?

Ich habe eine Sucheingabemaske gebastelt, bei der der Anwender mehrere Nachnamen eingeben kann und die Daten werden dann, falls vorhanden, am BIldschirm ausgegeben.

Nun möchte ich aber bei den Nachnamen die nicht gefunden (weil nciht vorhanden) wurden eine Fehlermeldung danebenschreiben, damit der Anwender sofort sieht, WELCHE Datensätze nicht vorhanden sind.

Lange Rede kurzer Sinn: wie kann ich mit SQL überprüfen, ob ein Datensatz vorhanden ist ohne die Ausgabe (z.B. DBGrid) manuell zu durchsuchen?

Gruß Dennis
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Di 04.02.03 12:58 
Hi!

Nun, du nimmst einfach eine Query und lässt für jeden Namen das Statement
select count(*) from Tabelle where Nachname="MeinName"
eintragen. Nach dem Öffnen der Query kannst du einfach die Anzahl der für diesen Nachnamen gefundenen Datensätze prüfen (Query.RecordCount).

Cu,
Udontknow
neojones
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1206
Erhaltene Danke: 1



BeitragVerfasst: Di 04.02.03 13:13 
Man könnte temporör eine Tabelle anlegen, die alle Suchbegriffe enthält (z.B: tmp_namen). Dann mit einem LEFT JOIN suchen:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
SELECT tmp_namen.name, dat_suchtabelle.name, COUNT(dat_suchtabelle.name) AS anzahl

FROm tmp_namen

LEFT JOIN dat_suchtabelle ON tmp_namen.name = dat_suchtabelle.name

GROUP BY dat_suchtabelle.name


Um alle Datensätze zurückzuliefern, für die kein Ergebnis gefunden wurde:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
SELECT tmp_namen.name, dat_suchtabelle.name, COUNT(dat_suchtabelle.name) AS anzahl

FROm tmp_namen

LEFT JOIN dat_suchtabelle ON tmp_namen.name = dat_suchtabelle.name

WHERE dat_suchtabelle.name IS NULL

GROUP BY dat_suchtabelle.name

_________________
Ha! Es compiliert! Wir können ausliefern!
dm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 83



BeitragVerfasst: Di 04.02.03 13:35 
erstmal danke euch beiden,


werde das gleich nach der mittagspause :) mal ausprobieren
dm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 83



BeitragVerfasst: Di 04.02.03 13:54 
udontknow :


dann weiss ich aber immernoch nicht, WELCHE datensätze nicht geunden wurden, ich kenne nur die anzahl der gesuchten nud die anzahl der gefundenden datensätze.
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Di 04.02.03 16:26 
Hmm? Wieso? Was ist mit folgender Schlussfolgerung :

"Wenn die Anzahl der ermittelten Datensätze für den aktuellen Namen null ist, gibt es keinen Datensatz für diesen Namen." :wink:

Also, nehmen wir mal an, du hast die zu suchenden Namen in einer Listbox:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
for i:=0 to ListBox.Items.Count-1 do
begin
  Query.SQL.Text:='Select * from tabelle where Nachname="'+ListBox.Items[i]+'"';
  Query.Active:=True;
  if CDS.RecordCount=0 then
    ListBox.Items[i]:=ListBox.Items[i]+' NICHT GEFUNDEN';
  Query.Active:=False;
end;


Cu,
Udontknow


Zuletzt bearbeitet von Udontknow am Di 04.02.03 16:39, insgesamt 2-mal bearbeitet
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Di 04.02.03 16:34 
@Neojones: Dein Beispiel ist für Multi-User-Datenbanken nicht gerade zu empfehlen... Hmmm... Naja, sofern für jeden Benutzer ein eindeutiger Tabellenname genommen wird, gehts, aber elegant würde ich so etwas nicht nennen, Tabellen On-the-fly aufzubauen.
neojones
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1206
Erhaltene Danke: 1



BeitragVerfasst: Di 04.02.03 17:48 
Wir machen das so bei einer Datenbank, auf der 4000 (!!!) User arbeiten und übergeben in einem zusätzlichen Feld immer die Session-ID. Ein Trigger am Server löscht alle nicht mehr vorhandenen Session später raus.

_________________
Ha! Es compiliert! Wir können ausliefern!
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Di 04.02.03 19:50 
Also doch nicht temporär eine Tabelle anlegen und anschliessend wieder löschen, sondern einfach in einer Tabelle mit einem weiteren Feld für die Identifikation des Benutzers bzw. der Session Datensätze anlegen und löschen. So macht das Sinn, ja. :)