AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi DBGRID über Lookupcombobox oder Edit feld Selektieren
Thema durchsuchen
Ansicht
Themen-Optionen

DBGRID über Lookupcombobox oder Edit feld Selektieren

Ein Thema von renekr · begonnen am 8. Aug 2005 · letzter Beitrag vom 12. Aug 2005
Antwort Antwort
Seite 1 von 2  1 2      
renekr

Registriert seit: 27. Feb 2005
Ort: Karlsbad
534 Beiträge
 
Delphi 2007 Enterprise
 
#1

DBGRID über Lookupcombobox oder Edit feld Selektieren

  Alt 8. Aug 2005, 00:30
Datenbank: SQL 2000 / 2005 Beta • Zugriff über: ADO
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.
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#2

Re: DBGRID über Lookupcombobox oder Edit feld Selektieren

  Alt 8. Aug 2005, 09: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
jensw_2000
(Gast)

n/a Beiträge
 
#3

Re: DBGRID über Lookupcombobox oder Edit feld Selektieren

  Alt 8. Aug 2005, 09:44
War noch wichtig wäre ...

Wenn du 'ungebundene' WHERE Bedingungen verwenden möchtest (Edit oder Memo) dann muss der Suchbegriff
wie folgt eingegeben werden:

VORNAME = ''Paul'' bzw.
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.

Vorname LIKE ''pAuL''
  Mit Zitat antworten Zitat
renekr

Registriert seit: 27. Feb 2005
Ort: Karlsbad
534 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: DBGRID über Lookupcombobox oder Edit feld Selektieren

  Alt 8. Aug 2005, 10:26
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.
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#5

Re: DBGRID über Lookupcombobox oder Edit feld Selektieren

  Alt 8. Aug 2005, 10:49
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 ...
  Mit Zitat antworten Zitat
renekr

Registriert seit: 27. Feb 2005
Ort: Karlsbad
534 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: DBGRID über Lookupcombobox oder Edit feld Selektieren

  Alt 8. Aug 2005, 16:51
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.
  Mit Zitat antworten Zitat
renekr

Registriert seit: 27. Feb 2005
Ort: Karlsbad
534 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: DBGRID über Lookupcombobox oder Edit feld Selektieren

  Alt 9. Aug 2005, 11:58
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.
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#8

Re: DBGRID über Lookupcombobox oder Edit feld Selektieren

  Alt 9. Aug 2005, 16:00
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 ...

  Mit Zitat antworten Zitat
renekr

Registriert seit: 27. Feb 2005
Ort: Karlsbad
534 Beiträge
 
Delphi 2007 Enterprise
 
#9

Re: DBGRID über Lookupcombobox oder Edit feld Selektieren

  Alt 9. Aug 2005, 23:58
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 .
  Mit Zitat antworten Zitat
renekr

Registriert seit: 27. Feb 2005
Ort: Karlsbad
534 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: DBGRID über Lookupcombobox oder Edit feld Selektieren

  Alt 10. Aug 2005, 23:48
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:28 Uhr.
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