Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Einträge in einem DBGrid filtern (https://www.delphipraxis.net/99368-eintraege-einem-dbgrid-filtern.html)

f4k3 11. Sep 2007 08:45


Einträge in einem DBGrid filtern
 
Moin liebe DP'ler ;)

Ich möchte eine art Suchfunktion programmieren und steh etz vor dem Problem dass ich überhaupt nicht weiß wie ich das realisieren könnte ...

Ich hab mir zunächst ein Grundkonzept überlegt.

Ich hab ne Paradox-Datenbank in der Kundeninformationen gespeichert werden sollen.
zuerst will ich einen Oberbegriff ( der zugleich oberbegriff in den Tabellen ist ) wählen. Dann möchte ich dass bei jedem neu eingegebenen Buchstaben mein DBGrid gefiltert wird.

sprich ... wenn ich "abc" eingebe dann soll das Grid nur noch einträge anzeigen die diese Buchstaben enthalten!

Also müsste es laut Pseudo-Code so aussehen.

Delphi-Quellcode:

procedure Form1.Edit1Change (Sender: TObject);
begin

case Combobox1.ItemIndex of
begin

//Oberbegriff Firma
1: *Suche in Spalte "Firma" nach eingegebener Zeichenkette*
//Oberbegriff Ansprechpartner
2: *Suche in Spalte "Ansprechpartner" nach eingegebener Zeichenkette*
//Oberbegriff PLZ
3: *Suche in Spalte "PLZ" nach eingegebener Zeichenkette*
//Oberbegriff Ort
4: *Suche in Spalte "Ort" nach eingegebener Zeichenkette*

end;
Also ich denk mal die einfachste Methode wäre das ganze über FieldByName(*Oberbegriff*) zu lösen, nur hab ich das Problem dass ich nicht weiß ich alle einträge erfassen soll, da die Datenbank ja sicherlich auch erweitert wird, und wie ich dann eben nur die "passenden" Einträge in meinem DBGrid anzeigen lasse.

Hättet ihr ne Idee wie ich das ganze realisieren könnte?

Ich danke schon mal im Vorraus ;)

Euer f4k3

Bolt Thrower 11. Sep 2007 09:21

Re: Einträge in einem DBGrid filtern
 
Hallo f4k3,

alternativ könntest Du Dir mal die SMDBGrid-Komponente anschauen. Sie ist Freeware und über die Option "eoShowFilterBar" kannst Du Dir einen Balken zum Filtern der Daten anzeigen lassen (für jede Spalte, so dass Du die Konstruktion mit der "ComboBox" auch nicht benötigst).

Grüße,

Bolt Thrower

mkinzler 11. Sep 2007 09:24

Re: Einträge in einem DBGrid filtern
 
Oder du filterst das dahinterliegende DataSet.

MondoShiva 11. Sep 2007 09:34

Re: Einträge in einem DBGrid filtern
 
Delphi-Quellcode:

var
j: Integer;
i: Integer;
begin
    for j:=0 to DBGrid1.colCount-1 do
    begin
    for i:=0 to DBGrid1.rowCount-1 do
      begin
      if pos(lowercase(SucheText.text),lowercase(DBGrid1.Cells[j,i]))>0 then
        begin
         DBGrid1.Row := i;
         DBGrid1.Col := j;
         UdbTable_Produkte.RecNo := i; //  hier kannst du beispielsweise nur aus der tabelle produkte suchen
                                       //jenachdem ob du table oder querry benutzt kannst das ja austauschen
         ShowMessage(SucheText.Text+' wurde in Zeile '+intToStr(i)+ ' in Spalte ' + inttostr(j+1)+' gefunden');
        end;
      end;
    end;
end;
hoffe das hilft dir ein wenig!
Musst es deinen wünschen nach umgestalten :zwinker:

hoika 11. Sep 2007 09:45

Re: Einträge in einem DBGrid filtern
 
Hallo,

wie mkinzler schon schrieb, filtere das darunterliegende DataSet.

Am einfachsten ist es, statt einer TTable eine TQuery zu benutzen,
und die Query basierend auf deiner Suche bei jeder Änderung
in der Suchmaske neu aufzubauen.

Es ist dann aber keine direkte Änderung mehr möglich,
wenn joins verwendet werden.

Als Alternative könnte man auch SetRange des TTable verwenden,
falls es nur eine Tabelle ist.

Dritte Möglichkeit, normales StringGrid benutzen,
Ergebnismenge wie auch immer erzeugen,
und in das Grid eintragen.


Heiko

f4k3 11. Sep 2007 09:51

Re: Einträge in einem DBGrid filtern
 
Zitat:

Zitat von mkinzler
Oder du filterst das dahinterliegende DataSet.

Ja lol ... danke ... aber meine Frage war ja wie ich dass eben anstell.

Es soll ja dann nicht nur die eine Spalte angeben werden in der Das vorkommt, sondern die komplette Zeile rausgefiltert wird.

Das Programm sieht folgendermaßen aus ...
DBGrid

Und so soll es nach dem filtern dann praktisch aussehen ...
Nach Filterung

f4k3 11. Sep 2007 10:21

Re: Einträge in einem DBGrid filtern
 
Zitat:

Zitat von MondoShiva
Delphi-Quellcode:

var
j: Integer;
i: Integer;
begin
    for j:=0 to DBGrid1.colCount-1 do
    begin
    for i:=0 to DBGrid1.rowCount-1 do
      begin
      if pos(lowercase(SucheText.text),lowercase(DBGrid1.Cells[j,i]))>0 then
        begin
         DBGrid1.Row := i;
         DBGrid1.Col := j;
         UdbTable_Produkte.RecNo := i; //  hier kannst du beispielsweise nur aus der tabelle produkte suchen
                                       //jenachdem ob du table oder querry benutzt kannst das ja austauschen
         ShowMessage(SucheText.Text+' wurde in Zeile '+intToStr(i)+ ' in Spalte ' + inttostr(j+1)+' gefunden');
        end;
      end;
    end;
end;
hoffe das hilft dir ein wenig!
Musst es deinen wünschen nach umgestalten :zwinker:

So n ähnlichen Code Hatte ich auch schon ... nur dass n paar unklarheiten dabei sind ...

für mich sieht der code so aus ...

Delphi-Quellcode:

var
j: Integer;
i: Integer;
begin
    for j:=0 to DBGrid1.colCount-1 do  // Schleife beginnt bei null wobei der Endwert -1 ist, somit endlos läuft?
    begin                              // Weil die schleife läuft ja nicht rückwärts oder sonstiges
    for i:=0 to DBGrid1.rowCount-1 do  // Gleiches "Problem" wie oben ^^
      begin
      if pos(lowercase(SucheText.text),lowercase(DBGrid1.Cells[j,i]))>0 then // Mit der Zeile kann ich gar nix anfangen, ich             könnte mir jedoch denken dass Sie überprüft ob in der Zeile bzw. Spalte nach übereinstimmungen sucht
        begin
         DBGrid1.Row := i;  // Wenn dies passiert, wird die Zeile markiert
         DBGrid1.Col := j;  // Und die dazugehörige spalte
         UdbTable_Produkte.RecNo := i; //  hier kannst du beispielsweise nur aus der tabelle produkte suchen
                                       //jenachdem ob du table oder querry benutzt kannst das ja austauschen

                                       // Was macht RecNo? 

         ShowMessage(SucheText.Text+' wurde in Zeile '+intToStr(i)+ ' in Spalte ' + inttostr(j+1)+' gefunden');
        end;
      end;
    end;
end;
Versteh ich den Quellcode bis dahin richtig?

Danke für eure Geduld ;)

:coder2:

hoika 11. Sep 2007 10:52

Re: Einträge in einem DBGrid filtern
 
Hallo,

mal in Kürze

Query -> DataSource -> DBGrid


Delphi-Quellcode:
sSearchType:= 'Firma'; // wenn Firma ausgewählt
sSearchItem:= Edit.Text+'%'; // das % muss sein

with Query do
begin
  Close;
  SQL.Clear;
  SQL.Add('Select * From TableXXX Where '+sSearchType+' Like '+QuotedStr(theSearchItem));
  Open;
end;
Du baust die Query, auf der das DBGrid basiert,
also jedesmal neu auf.


Heiko

mkinzler 11. Sep 2007 11:08

Re: Einträge in einem DBGrid filtern
 
Delphi-Quellcode:
DataSet.Filter
oder besser einen TQuery nehmen.

f4k3 11. Sep 2007 12:35

Re: Einträge in einem DBGrid filtern
 
Zitat:



Delphi-Quellcode:
sSearchType:= 'Firma'; // wenn Firma ausgewählt
sSearchItem:= Edit.Text+'%'; // das % muss sein

with Query do
begin
  Close;
  SQL.Clear;
  SQL.Add('Select * From TableXXX Where '+sSearchType+' Like '+QuotedStr(theSearchItem));
  Open;
end;

So ... Query = Neuland ^^

hab n TQuery und ne DataSource die darauf zeigt ...

Wenn ich nun ...

Delphi-Quellcode:

procedure eSuchbegriffChange (Sender: TObject); // Wenn Editfeld verändert wird
begin

   case cbSuchkriterium.ItemIndex of           // Suchkriterium aus Combobox

    1: sSearchType := 'Firma';
       sSearchItem := eSuchbegriff.Text + '%';

...
schreibe dann bekommm ich ne Fehlermeldung dass sSearchType und sSearchItem undefinierte Bezeichner sind ...
sind das var's?

Sorry ... SQL + Query + Delphi newb :P

:duck:


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:56 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