![]() |
Datenbank: SQL 2000 / 2005 Beta • Zugriff über: ADO
DBGRID über Lookupcombobox oder Edit feld Selektieren
Hi @,
Hoffe mir kann jemand helfen? Folgende Situation: Suchmaske über Tabelle mit DBgrid ,DBLookupcombobox und Memo oder Edit Feld.: DBGrid als Anzeige von AdoQuery Ergebniss mit dem Komplette Inhalt der Tabelle: ( Select * from xyx) Jetzt will ich einige Suchkriterien einbauen wo nach auswahl ( DBLookupcombobox,oder Memo feld ) (beim Edit oder Memo feld über onkeypress ) nur die Ergebnisse in dem DBGrid angezeigt werden,die der Eingabe Kriterien der Felder zutreffen. Wenn möglich gleich nach dem Closeup der DBLookupcombobox. In der DBLookupcombobox stehn natürlich nur die werte wo auch in der Tabelle sind. Zudem noch ein Sucheingabe feld wo ev auf 2 oder 3 Spalten der Tabelle suchen soll. Ist das überhaupt möglich ? Danke. |
Re: DBGRID über Lookupcombobox oder Edit feld Selektieren
Das ist relativ unkompliziert.
Erstelle dir einfach eine Procedure in der du die Query mit den entsprechenden WHERE Paramatern neu öffnest. Die Procedure rufst du dann im onKeyPress deines EditFeldes bzw. im onCloseUp der Combobox auf. Die Variante mit der DBLookupCombobox kannst du vergessen. Damit bekommst du nur eine Notlösungen hin. Verwende statt dessen eine Combobox. kleines Beispiel: (Den Code habe ich hier schnell zusammengetippt. Habe grade keine IDE zur Verfügung.)
Delphi-Quellcode:
procedure TForm1.RunQuery;
var SQL, Option_e, Option_c, SQLOperator: String; // Option_e = Bedingung des EditFeldes, Option_c = Bedingung der Combobox begin // Optionen parsen // Edit if trim(Edit1.text) <> '' then Option_e = Edit1.text; // Combobox Option vervollständigen (Feldname) if Combobox1.text <> '<alle>' then begin Option_c = 'Vorname = '''+Combobox1.text+''''; // Suchbegriff muss immer so aussehen ''Suchbegriff'' end; // SELECT zusammenbauen SQL='SELECT * FROM MeineTabelle'; // Falls Optionen angegeben wurden, dann hinzufügen if Length(Option_e + Option_c)> 0 then begin if (Length(Option_e) <> 0) AND (Length(Option_c) <> 0) THEN SQLOperator = 'AND'; SQL :=SQL + ' ' + Option_e + ' ' + SQLOperator + ' ' + Option_c; // Query Öffen, ggf. Fehlermeldung ausgeben try AdoQuery1.close; AdoQuery1.SQL.text:=SQL; AdoQuery1.open; except on e: Exception do Showmessage('Bei der Ausführung der Query ist folgender Fehler aufgetreten:'+#13#10+ e.message); end; end; end; Nachdem die Query geöffnet wurde füllst du die Combobox wieder mit gültigen Werten: im AdoQuery1.AfterOpen
Delphi-Quellcode:
Procedue TForm1.AdoQuery1.AfterOpen(Dataset:TDataset);
var Q:TAdoQuery; S:String; begin // Combobox für den Filter "Vorname" leeren Combobox1.items.clear; // die Option "<alle>" hinzufügen Combobox1.items.add('<alle>'); // jetzt alle Werte der Spalte z.B. "Vorname" in einer zweiten Abfrage noch einmal holen // Diesesmal jedoch mit "DISTINCT" um doppelte Werte zu vermeiden und "ODERR BY" zum sortieren // dynamische Query instanzieren, SQL zusammenbauen und Öffnen try Q:=TAdoAuery.create(self; Q.Connection:=AdoQuery1.Connection; // Den SQL String deiner AdoQuery ab dem Wort FROM in S einlesen S:=COPY(AdoQuery1.sql.text,pos('FROM'),length(AdoQuery1.sql.text); // neuen SQL String fpr Q.SQL bauen Q.SQL.text := 'SELECT DISTINCT VORNAME'+ ' ' + S + ' ' + 'ORDER BY VORNAME'; // Sollte jetzt z.B. so aussehen // SELECT DISTINCT VORNAME FROM XYZ WHERE Name = ''Meier'' ORDER BY VORNAME // Query öffnen und Combobox füllen Q.open; While not Q.eof do begin Combobox.items.add(Q.FieldByName('Vorname').AsString; Q.next; end; finally FreeAndNil(Q); end; // Jetzt sieht die Combobox in etwa so aus: // <alle> // Anton // Berta // Sigfried end; Ich hoffe es hilft etwas. Wie gesagt, der Code ist hier live getippt und nicht getestet. Kleine Fehler bitte ich zu entschuldigen ... Schöne Grüße, Jens :hi: |
Re: DBGRID über Lookupcombobox oder Edit feld Selektieren
War noch wichtig wäre ...
Wenn du 'ungebundene' WHERE Bedingungen verwenden möchtest (Edit oder Memo) dann muss der Suchbegriff wie folgt eingegeben werden:
Delphi-Quellcode:
bzw.
VORNAME = ''Paul''
Delphi-Quellcode:
Die Hochkommas sind wichtig, damit SQL den Suchbetriff als Wert identifizieren kann. Ohne Hochkommas nimmt SQL an, das es sich um einen Feldnamen handelt.
VORNAME = ''Paul'' AND Name = ''Meier''
Um Unabhängig von Groß-Keinschreibung zu sein kannst du anstatt "=" den Operator "LIKE" verwenden. z.B.
Delphi-Quellcode:
:hi:
Vorname LIKE ''pAuL''
|
Re: DBGRID über Lookupcombobox oder Edit feld Selektieren
Hi Jens,
Klasse Vielen dank. Das muß i erst mal testen. Ich will zudem noch eine Checkbox hinzumachen für die True or False Bedingungen in der Tabelle. Ich habe schon mal was probiert aber da hatte ich folgendes Problem: Wenn ich select mit edit feld mache und das edit Feld war leer , dann hat er nix als Ergebniss gebracht. Das Like verwende ich immer in der Stelle weil ich ja wie gesagt 3 Spalten mit 1 Edit oder Memo feld durch suchen muß. Vielen dank. |
Re: DBGRID über Lookupcombobox oder Edit feld Selektieren
Wenn ein Edit-Suchbegriff leer ist lass die Bedingung am Besten beim Zusammenbauen des WHERE Anschitts weg oder mach es so ..
if trim(Edit1.text) <> '' THEN SQLWHERE :='Vorname = '''+edit1.text+'''' else SQLWHERE = 'Vorname LIKE ''%'''; Bearbeitet: Fehler korrigiert ... |
Re: DBGRID über Lookupcombobox oder Edit feld Selektieren
Hi,
Vielen Dank. Hab jetzt mal einiges Probiert und es fast hinbekommen. Muß nur noch alles zusammen führen . Habe 3 Radio Groups ,6 DBLookupcomboboxen,1 Edit Feld für 4 Spalten in der DB,2 DateTime Felder. Das alles richtig in einen Sting zu bekommen bei jeden onchange oder OnKeyPress oder onselect event ist Mühsellig, Aber du hast mir echt geholfen . Danke. |
Re: DBGRID über Lookupcombobox oder Edit feld Selektieren
Hi Jens,
so jetzt hab ich fast alles zusammengebaut aber einen Fehler entdeckt. Wenn ich das mit Like mache bekomme ich nicht das richtige Ergebniss zurück. Im Sql Ent Manager hab i es a getetet und glecihes Falsches Ergebniss zurückbekommen. Mit Like '%' bekomme ich einfach nicht alles zurückvon der Spalte. Gibts da einen anderen SQL Befehl? Weil in der Tabelle auch eine Leer Strings , NULL usw. drinstehn. Danke. |
Re: DBGRID über Lookupcombobox oder Edit feld Selektieren
Es gibt eine weniger gute Alternative ....
Delphi-Quellcode:
und eine gute Alternative ...
if trim(Edit1.text) <> '' THEN
SQLWHERE :='Vorname = '''+edit1.text+'''' else begin SQLWHERE = '(Vorname LIKE ''%'') OR (Vorname IS NULL)'; end; Wenn ein Feld nicht "gefiltert" werden soll, dann baue die Bedingung garnicht erst in die WHERE Klausel ein.
Delphi-Quellcode:
So kommst du ohne LIKE aus, und wenn du z.B. nur nach Vornamen suchst, wird auch nur " Vorname = ''Paul'' " als Bedingung in die WHERE Klausel geschrieben. "Name" kann einen beliebigen Wert enthalten oder NULL sein ...
if trim(such_vorname.text) <> '' THEN
SQLWHERE1 :='Vorname = '''+such_vorname.text+'''' else SQLWHERE1 = ''; if trim(such_name.text) <> '' THEN SQLWHERE2 :='Name = '''+such_name.text+'''' else SQLWHERE2 = ''; IF (SQLWHERE1<>'') AND (SQLWHERE2<>'') THEN SQLWHERE1:=SQLWHERE1+' AND '; SQLWHERE_COMPLETE:=SQLWHERE1+SQLWHERE2; :hi: |
Re: DBGRID über Lookupcombobox oder Edit feld Selektieren
Danke.
Ich habe es gelöst. Mache am anfang eine Abfrage ob edit1.text was eingegeben wurde dann setze ich das 1. SQL zusammen Weiter unten wo ich dann dien SQL Befehl komplett zusammen baue mach i wida ne abfrage und da kommt dann die Option rein oder nicht. So klappt es Perfect. Vielen Dank . |
Re: DBGRID über Lookupcombobox oder Edit feld Selektieren
Hi,
Kannst du mri ev eine Letzte Frage beantworten? Gibt es sowas wie bei MSAccess? Checkbox mit 3 zustände? Also Wahr ,Falsch und Egal!? Weil ich habe ziemlich viele Bit in der Tabelle und die einzeln wegmachen ist zu viel. Deswegen wäre es gut wenn ich so ne Komponente hätte. Die normalen können ja nur True or False. Danke |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:55 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