Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL Abfragen (https://www.delphipraxis.net/98838-sql-abfragen.html)

Christian18 2. Sep 2007 17:57

Datenbank: Paradox • Version: 7 • Zugriff über: BDE

SQL Abfragen
 
Hallo,

ich habe eine kleine Tabelle, in der ich folgende Inhalte abspeichere.

KundenID A 10
Name A 20
Vorname A 20
Strasse A 50
PLZ A 5

Jetzt möchte ich alle Kunden mit A anzeigen lassen. das soll man irgendwie TQuery machen können. Kann mir jemand helfen?


MFG Christian18

DeddyH 2. Sep 2007 17:58

Re: SQL Abfragen
 
Ich verstehe nicht ganz, was "A 10" bedeuten soll. Wie ist die Tabelle denn aufgebaut?

Andreas H. 2. Sep 2007 17:59

Re: SQL Abfragen
 
Hallo,

mit einer TQuery und als SQL
SQL-Code:
select * from Tabelle where Name like 'A%';

mkinzler 2. Sep 2007 18:00

Re: SQL Abfragen
 
SQL-Code:
Select * from Tabelle where name like 'A%';

DeddyH 2. Sep 2007 18:01

Re: SQL Abfragen
 
Es empfiehlt sich hier, einen Index auf das Feld "Name" zu setzen.

Christian18 2. Sep 2007 18:02

Re: SQL Abfragen
 
Hallo,

was macht der Index für einen Sinn??? Verstehe ich jetzt nicht ganz.

mkinzler 2. Sep 2007 18:03

Re: SQL Abfragen
 
Durch einen Index kann man die Suche beschleunigen. Nur bei like-Abfragen hilft das leider oft nicht.

DeddyH 2. Sep 2007 18:04

Re: SQL Abfragen
 
Solange die Wildcard hinten steht, schon.

Matze 2. Sep 2007 18:05

Re: SQL Abfragen
 
Ich denke, das sinnvollste wäre, eine extra Spalte für die Zuordnungsbuchstaben zu machen und diese als Index zu nutzen, dann sparst du dir das langsame "like". So hat Christian dies vermutlich auch.
Sein Problem ist vermutlich, dass er nicht weiß, wie man prinzipiell SQL-Abfragen mit TQuery ausführt.

PS: Ist eine Spalte mit einem Index versehen ist der Lesezugriff deutlich schneller als ohne, allerdings dauert der Schreibzugriff ein wenig länger. man muss also schauen, was häufiger getan wird (lesen/schreiben). Das, was im WHERE-/AND-/ORDER-Abschnitt ist, sollte meines Wissens mit einem Index versehen werden.

Ralf Kaiser 2. Sep 2007 18:06

Re: SQL Abfragen
 
Zitat:

Zitat von Christian18
Hallo,

was macht der Index für einen Sinn??? Verstehe ich jetzt nicht ganz.

Die Abfrage ist schneller als ohne Index. Wenn auf der Spalte keine Index sitzt dann muss die gesamte Tabelle Datensatz für Datensatz durchsucht werden. Mit Index "weiss" die Datenbank sozusagen schon, welch Datensätz zurückgeliefert werden müssen.

Edit: schon wieder kein roter Kasten... :evil:

mkinzler 2. Sep 2007 18:06

Re: SQL Abfragen
 
Aber nur bei manchen DBMS. Bei Paradox aber eher nicht

Christian18 2. Sep 2007 18:06

Re: SQL Abfragen
 
Hallo,

so funktioniert es aber leider nicht.
Delphi-Quellcode:
DM.QKunden.SQL.Add('select * from TKunden where Name like 'A%';');
DM ist ein Datenmodul

QKunden ist eine TQuery Komponente

was habe ich falsch gemacht?

LG Chris

mkinzler 2. Sep 2007 18:08

Re: SQL Abfragen
 
Delphi-Quellcode:
DM.QKunden.SQL.Text := 'select * from tabelle where name like '+QuotedStr('%A')+';';

Matze 2. Sep 2007 18:08

Re: SQL Abfragen
 
Wenn ich es richtig sehe, hast du doch eine extra Spalte für die Buchstaben. Also A steht alleine in einer Spalte, oder nicht? Denn das wäre zu empfehlen, dann brauchst du kein "like", das immer etwas langsamer sein wird, was ich bereits geschrieben habe.

@Markus: Im Falle, dass Strings wie "A xxx" in einer Spalte stehen, müsste der Platzhalter "%" nach dem A stehen.

Ralf Kaiser 2. Sep 2007 18:09

Re: SQL Abfragen
 
Zitat:

Zitat von Christian18
so funktioniert es aber leider nicht.

Zitat:

Zitat von Christian18
was habe ich falsch gemacht?

Es wäre gut, wenn du uns sagen würdest, was nicht funktioniert! Kommen keine Daten zurück obwohl Datensätze mit den Kriterien vorhanden sind? Gingt es eine Fehlermeldung? Öffnest du die Query auch nachdem das Statement hinzugefügt wurde?

Zeig doch mal etwas mehr Code als nur eine Zeile! Im allgemeinen tun sich die Leute hier mit hellsehen etwas schwer (ich zumindest)

Andreas H. 2. Sep 2007 18:09

Re: SQL Abfragen
 
Ruft Du auch

Delphi-Quellcode:
DM.QKunden.open
auf?

DeddyH 2. Sep 2007 18:16

Re: SQL Abfragen
 
Nochmal kurz zurück zum Index:
Man stelle sich vor, man hat ein tolles Buch über Delphi, das schön thematisch gegliedert ist. Nun möchte man zu einem Befehl etwas nachschlagen (z.B. zu "StringReplace"). Die meisten Bücher weisen auf den letzten Seiten einen (alphabetisch geordneten) Index auf. Hier schaut man unter "S" nach "StringReplace" und kann die Seitenzahl(en) nachschauen, in denen dieser Befehl verwendet/erklärt wird. Ohne diesen Index muss man zwangsläufig das gesamte Buch durchblättern, um die entsprechenden Seiten zu finden. Weiß man allerdings nur noch, wie die Bezeichnung des gesuchten Befehls endet, nützt einem der Index leider logischerweise auch nichts mehr.

Christian18 2. Sep 2007 18:47

Re: SQL Abfragen
 
Hi,

Delphi-Quellcode:
  DM.QPatienten.SQL.Add('select * from Data\Patienten where Name like ' + QuotedStr('B%') + ';');
  DM.QPatienten.ExecSQL;
so sieht mein code nun aus. Leider werden trotzdem noch alle datensätze angezeigt.

mkinzler 2. Sep 2007 18:49

Re: SQL Abfragen
 
Dann scheinst du eine andere Datenmenge anzuzeigen, weil diese zeigt gar bichts an. Wg. .ExecSQL att .Open

DeddyH 2. Sep 2007 18:50

Re: SQL Abfragen
 
Delphi-Quellcode:
DM.QPatienten.Close;
DM.QPatienten.SQL.Clear;
DM.QPatienten.SQL.Add('select * from Data\Patienten where Name like ' + QuotedStr('B%') + ';');
DM.QPatienten.Open;

Christian18 2. Sep 2007 19:08

Re: SQL Abfragen
 
Hi,

muss ich an der Komponente TQuery noch was einstellen??? Weil es immernoch nicht funktioniert. Ich habe auch die richtige DataSource angeklemt. Ich habe nochmal nachgeschaut.

Fehler: In meinem DBGrid werden trotzdem alle Datensätze angezeigt.

Christian18 2. Sep 2007 20:53

Re: SQL Abfragen
 
Hallo,

hat jemand zufällig eine kleine Beispiel anwendung parat?

mkinzler 2. Sep 2007 20:55

Re: SQL Abfragen
 
Und bist du wirklich sicher, daß das Grid mit der DataSource des Queries verknüpft ist?

Christian18 2. Sep 2007 20:58

Re: SQL Abfragen
 
ja ganz sicher

Christian18 2. Sep 2007 21:07

Re: SQL Abfragen
 
Also,

ich habe eine Tabelle TPatienten, eine DataSource DSPatienten und eine Querry QPatienten.

DataSource habe ich bei DataSet mit der Tabelle verknüpft. Die DataSource habe ich dann an mein DBGrid angeklempt. Und die Querry habe ich auch an meiner DataSource drann.

Ist doch richtig oder?

mkinzler 2. Sep 2007 21:08

Re: SQL Abfragen
 
Wechsel mal die DataSource von Tabelle auf den Query.

Christian18 2. Sep 2007 21:12

Re: SQL Abfragen
 
Zitat:

Zitat von mkinzler
Wechsel mal die DataSource von Tabelle auf den Query.

wird mir in der Liste nicht angeboten. Und wenn ich es eintippe, dann kommt eine meldung:

DSPatienten: Zirkuläre Datenverbindung sind nicht erlaubt.

mkinzler 2. Sep 2007 21:14

Re: SQL Abfragen
 
Also nicht in der Table/Query sondern in der DataSource

Christian18 2. Sep 2007 21:16

Re: SQL Abfragen
 
ja habe ich doch gemacht

mkinzler 2. Sep 2007 21:18

Re: SQL Abfragen
 
Delphi-Quellcode:
Query.DataSource := DataSource;
DataSource.DataSet := QPatienten;

Christian18 2. Sep 2007 21:20

Re: SQL Abfragen
 
Ja,

genau dann komme die Meldung:
Delphi-Quellcode:
  QPatienten.DataSource := DSPatienten;
  DSPatienten.DataSet := QPatienten;

mkinzler 2. Sep 2007 21:22

Re: SQL Abfragen
 
QPatienten.DataSource := DSPatienten;

Christian18 2. Sep 2007 21:24

Re: SQL Abfragen
 
nur mal so ne frage muss ich die QPatienten (TQuerry) auch noch Active auf true setzen?

mkinzler 2. Sep 2007 21:24

Re: SQL Abfragen
 
Sollte durch .Open passieren

Christian18 2. Sep 2007 21:27

Re: SQL Abfragen
 
Zitat:

Zitat von mkinzler
Sollte durch .Open passieren

ok


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz