Autor |
Beitrag |
Nachtschrat
      
Beiträge: 16
|
Verfasst: 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
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: Sa 07.07.07 18:40
Query.SQL.ADD('SELECT * FROM Tabelle WHERE Name='''+Edit.Text+'''');
|
|
Nachtschrat 
      
Beiträge: 16
|
Verfasst: 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
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Sa 07.07.07 19:48
_________________ Markus Kinzler.
|
|
KidPaddle
      
Beiträge: 351
WinXP,Linux
D7 Prof, XE7
|
Verfasst: 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
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: 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.
Kombiniere das LIKE mit den mkinzlerschen Parametern und das wars.
_________________ Gruß
Hansa
|
|
Nachtschrat 
      
Beiträge: 16
|
Verfasst: 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
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: 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
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Di 17.07.07 11:36
KidPaddle 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
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Di 17.07.07 13:19
Das Zeitverhalten ist vom Einzelfall abhängig. Rest ist Theorie. @Alzaimer  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.  Muss man notfalls eben mal testen.
_________________ Gruß
Hansa
|
|
Nachtschrat 
      
Beiträge: 16
|
Verfasst: 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
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: 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 
      
Beiträge: 16
|
Verfasst: 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 
|
|