Autor Beitrag
Nachtschrat
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: Sa 07.07.07 17:04 
Hallo zusammen,
es tut mir ja Leid, wenn ich mit so einer Leienfrage komme, aber mein schlaues Buch scheint mit Variablen nicht zu arbeiten.
Folgendes Problem:
Ich möchrte aus einer Datenbank (Paradox) einen namen suchen lassen. Der soll über ein TEdit in eine Variable eingelesen werden und wenn auf 'suchen' geklickt wird, soll nach dem Namen aus der Variable gesucht werden und im DBGrid angezeigt werden. Ich hoffe einer von euch ist so nett und sagt mir, wie ich mit variablen arbeiten kann in einer SQL-Abfrage.

Danke im vorraus
Flamefire
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Sa 07.07.07 18:40 
Query.SQL.ADD('SELECT * FROM Tabelle WHERE Name='''+Edit.Text+'''');
Nachtschrat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: Sa 07.07.07 18:50 
Danke! Eine Frage noch, wenn im Feld 'Name' zwei Namen stehen, Vor- und Nachname, ich aber nur einen der beiden namen eingebe, was bekomme ich dann als Ergebnis? Alle Mayers, Erwins etc. oder gar nichts?
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Sa 07.07.07 19:48 
Es wäre besser (SQL-)Parameter zu nehmen:
ausblenden SQL-Anweisung
1:
Query.SQL.Text := 'SELECT * FROM Tabelle WHERE Name=:name';					


ausblenden Delphi-Quelltext
1:
Query.ParamByName('name').Value := Edit.Text;					

_________________
Markus Kinzler.
KidPaddle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 351

WinXP,Linux
D7 Prof, XE7
BeitragVerfasst: So 08.07.07 11:19 
Bei der Bedinung wird "=" verwendet und somit kommt nur die Daten zurück, die genauso gespeichert sind wie der Suchbegriff. Am besten verwendet Du "like" in der Form:

Query.SQL.ADD('SELECT * FROM Tabelle WHERE Name LIKE ''%'+Edit.Text+'%''');

Damit kommen alle Datensätze, die den Suchbegriff enthalten. Leider kann für diese Suche kein Index verwendet werden, daher sehr langsam in großen Datenbeständen.

Gruß
THomas
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: So 08.07.07 20:11 
Geht es eigentlich um eine Klassenarbeit ? Die Frage taucht mir die letzte Zeit zu oft auf. Ist der Lehrer nicht zu sehr verbeamtet, dann fällt dem das auf. 8)

Kombiniere das LIKE mit den mkinzlerschen Parametern und das wars.

_________________
Gruß
Hansa
Nachtschrat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: Di 17.07.07 08:27 
Nein, es geht nicht um eine Klassenarbeit. Ich mache das außerschulisch :)

Funktioniert wunderbar - danke!

Hm, mir ist aufgefallen, dass ich einen so gesuchen Datensatz gar nicht editieren kann. Zumindest nicht mit den Buttons vom DBNavigator bzw. den DataSet-Actions der Actionlist. Ist das ein Privileg für TTable?
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Di 17.07.07 08:44 
Jein. Du kannst auch einen TQuery durch die Verwendung eines TUpdateSQL als Updateobjekt updatable machen, wenn die verwendete Datenbank das nicht direkt unterstützt.

_________________
Markus Kinzler.
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Di 17.07.07 11:36 
user profile iconKidPaddle hat folgendes geschrieben:
Bei der Bedinung wird "=" verwendet und somit kommt nur die Daten zurück, die genauso gespeichert sind wie der Suchbegriff. Am besten verwendet Du "like" in der Form:

Query.SQL.ADD('SELECT * FROM Tabelle WHERE Name LIKE ''%'+Edit.Text+'%''');

Damit kommen alle Datensätze, die den Suchbegriff enthalten. Leider kann für diese Suche kein Index verwendet werden, daher sehr langsam in großen Datenbeständen.

Und deshalb sollte man so etwas auch nie verwenden. Es sei denn, man wird von den großen DB- und Hardware-Herstellen dafür bezahlt. So eine Abfrage kann schon mal einen kompletten Server lahm lagen (also, nicht das er abschmiert, er wird eben nur ... lahm). Also: Nicht verwenden.

_________________
Na denn, dann. Bis dann, denn.
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Di 17.07.07 13:19 
Das Zeitverhalten ist vom Einzelfall abhängig. Rest ist Theorie. @Alzaimer :mrgreen: Geht es um ca. 1-5 stellige Anzahl an Datensätzen, in denen gesucht werden soll, dann ist das immer noch schneller, als 3 falsche Nummern einzugeben und dann irgendwas in einer Papierliste zu suchen, um es endlich zu finden. Für richtige DAUs sind solche LIKE - Konstrukte lebenswichtig. :lol: Muss man notfalls eben mal testen.

_________________
Gruß
Hansa
Nachtschrat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: Mi 18.07.07 08:09 
Bei meiner kleinen Datenmenge die sich in meiner kleinen Datenbank tummeln, habe ich weniger bedenken dass er langsamer wird :).

Also nochmal ganz konkret gefragt: Mit einem TQuery kann ich gesuchte Daten nicht auch noch auf DBTexte verteilen? Oder habe ich da was falsch verstanden?
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Mi 18.07.07 13:28 
Also nochmals : auf einer Form sind DBEdit, DBText usw. Die DB-Dinger haben zugewiesene Feldnamen usw. Ich mache es in der Praxis dann so : zweite kleine Form mit normalem TEdit. Dort kann der Suchbegriff eingegeben werden. Auf der Suchform sind noch weiter/zurück/abbrechen/gefunden-Buttons. Dahinter steckt Dataset.Next,Prior usw. Sobald ein Dataset.Open gemacht wird, dann sind DBEdit, DBText usw. bestückt und man kann da rumwandern. Der gefunden-Button schließt dann die Suchform und man kann Daten ändern. Voraussetzung ist dabei, dass nur ein Dataset für beide Forms verwendet wird, sonst kriegt die Eingabeform ja nichts von dem Next der Suchform mit. Deshalb gibt es ja auch DataModules. Ich glaube sogar SELECT * zu verwenden, damit direkt alle Felder zu sehen sind. Da könnte man bei Performance-Problemen ja noch einiges machen.

_________________
Gruß
Hansa
Nachtschrat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: Do 19.07.07 08:01 
Alles klar, super. Ich glaube ich habe es verstenden. Werde es mal versuchen und schauen ob ich es so verstanden habe wie es zu verstehen sein sollte :)