Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi DBGRID über Lookupcombobox oder Edit feld Selektieren (https://www.delphipraxis.net/51180-dbgrid-ueber-lookupcombobox-oder-edit-feld-selektieren.html)

renekr 7. Aug 2005 23:30

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.

jensw_2000 8. Aug 2005 08:31

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:

jensw_2000 8. Aug 2005 08:44

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:
VORNAME = ''Paul''
bzw.
Delphi-Quellcode:
VORNAME = ''Paul'' AND Name = ''Meier''
Die Hochkommas sind wichtig, damit SQL den Suchbetriff als Wert identifizieren kann. Ohne Hochkommas nimmt SQL an, das es sich um einen Feldnamen handelt.

Um Unabhängig von Groß-Keinschreibung zu sein kannst du anstatt "=" den Operator "LIKE" verwenden.

z.B.

Delphi-Quellcode:
Vorname LIKE ''pAuL''
:hi:

renekr 8. Aug 2005 09:26

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.

jensw_2000 8. Aug 2005 09:49

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 ...

renekr 8. Aug 2005 15:51

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.

renekr 9. Aug 2005 10:58

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.

jensw_2000 9. Aug 2005 15:00

Re: DBGRID über Lookupcombobox oder Edit feld Selektieren
 
Es gibt eine weniger gute Alternative ....

Delphi-Quellcode:
if trim(Edit1.text) <> '' THEN
SQLWHERE :='Vorname = '''+edit1.text+''''
else begin
SQLWHERE = '(Vorname LIKE ''%'') OR (Vorname IS NULL)';
end;
und eine gute Alternative ...

Wenn ein Feld nicht "gefiltert" werden soll, dann baue die Bedingung garnicht erst in die WHERE Klausel ein.

Delphi-Quellcode:
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;
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 ...

:hi:

renekr 9. Aug 2005 22:58

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 .

renekr 10. Aug 2005 22:48

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 02:29 Uhr.
Seite 1 von 2  1 2      

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