Einzelnen Beitrag anzeigen

jensw_2000
(Gast)

n/a Beiträge
 
#2

Re: DBGRID über Lookupcombobox oder Edit feld Selektieren

  Alt 8. Aug 2005, 08:31
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
  Mit Zitat antworten Zitat