Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Filterkriterium in Datenbank (https://www.delphipraxis.net/132764-filterkriterium-datenbank.html)

Stocki1990 19. Apr 2009 09:35

Datenbank: Access • Zugriff über: Microsoft.Jet.OLEDB.4.0

Filterkriterium in Datenbank
 
Liste der Anhänge anzeigen (Anzahl: 1)
Servus Leute!

Bin gerade dabei, die Filterfunktion innerhalb von Datenbanken kennenzulernen.
Hab' schon einige Möglichkeiten ausprobiert, doch keine scheint zu funktionieren.

Der Filter sollte so funktionieren:

Wenn ich eine Musikkategorie auswähle, werden mir die dazugehörigen
Lieder bzw. Musikstücke präsentiert.

Wähle ich nun jedoch auf der rechten Seite einen Komponisten aus, sollen
nur Stücke dieses Interpreten angezeigt werden.




Hier wäre einmal der Delphi-Code:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ADODB, DB, ComCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    ADOConnection1: TADOConnection;
    ADOQuery1: TADOQuery;
    ADOTable1: TADOTable;
    TreeView1: TTreeView;
    ListView1: TListView;
    ListBox1: TListBox;
    procedure FormShow(Sender: TObject);
    procedure TreeView1Change(Sender: TObject; Node: TTreeNode);
  private
    function DatenverbindungHerstellen(): boolean;
    procedure FillTreeview;
    procedure FillListbox;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}



procedure Tform1.FillTreeview;
var
 Node: TTreenode;
begin
 //Bereits vorhandene Knotenelemente (Items) werden gelöscht:
 Treeview1.items.clear;

 ADOQuery1.close;
 ADOQuery1.SQL.clear;
 ADOQuery1.SQL.Add('Select * from MVO_Sparten');
 ADOQuery1.Open;

 While not ADOQuery1.Eof do begin
  Node := Treeview1.items.add(nil,ADOQuery1.FieldValues['Sparten_Bezeichnung'] + ' (' + ADOQuery1.FieldValues['Sparten_Abkürzung'] + ')');
  Node.ImageIndex := 0;
  // Verwende ich zum Speichern der Tabellen-ID je Knotenelement:
  Node.StateIndex := ADOQuery1.FieldValues['Spartennummer'];
  ADOQuery1.Next;

 end;
 AdoQuery1.Close;

end;

procedure Tform1.FillListbox;
begin
 Listbox1.items.clear;

 ADOQuery1.close;
 ADOQuery1.SQL.clear;
 ADOQuery1.SQL.Add('Select * from MVO_Notenverzeichnis');
 ADOQuery1.Open;

 While not ADOQuery1.Eof do begin
 Listbox1.Items.add(ADOQuery1.FieldValues['Komponistnachname']) ;
  ADOQuery1.Next;
 end;
 
 Adoquery1.close;

end;
 
procedure TForm1.FormShow(Sender: TObject);
begin
Datenverbindungherstellen();
Filltreeview();
Filllistbox();
end;

procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
var

LI: TListitem;

begin
 Listview1.items.clear;

 ADOQuery1.close;
 ADOQuery1.SQL.clear;
 ADOQuery1.SQL.Add('Select * from MVO_Notenverzeichnis where Spartennummer = ' + inttostr(Node.stateindex));
 ADOQuery1.Open;

 While not ADOQuery1.Eof do begin
  LI := Listview1.items.add;
  LI.caption := ADOQuery1.FieldValues['Name'];
//  LI.subitems.add(ADOQuery1.FieldValues['PR_Bezeichnung']);
  ADOQuery1.Next;

 end;

 AdoQuery1.Close;

end;

function tform1.DatenverbindungHerstellen(): boolean;
var
   Provider, DataProvider, DataSource: string;
begin
   Provider := 'MSDataShape.1';
   DataProvider := 'Microsoft.Jet.OLEDB.4.0';
   DataSource := extractfilepath(application.ExeName) + 'MVerein.mdb';

   if fileexists(DataSource) then begin
      if ADOConnection1.Connected then ADOConnection1.Close;
      ADOConnection1.ConnectionString := 'Provider=' + Provider + ';Data Provider=' + DataProvider + ';Data Source=' + DataSource;
      try
        ADOConnection1.Connected := true;
        result := true;
      except
        result := false;
      end;

   end else begin
       result := false;
   end;

end;

end.
Ich hoffe, dass ihr mir hierbei weiterhelfen könnt.

Danke schonmal jetzt im Voraus für eure Hilfe.

Grüße Christoph

jaenicke 19. Apr 2009 10:02

Re: Filterkriterium in Datenbank
 
Zitat:

Zitat von Stocki1990
Hab' schon einige Möglichkeiten ausprobiert, doch keine scheint zu funktionieren.

Was funktioniert denn nicht und wo im Code ist das?

Stocki1990 19. Apr 2009 10:42

Re: Filterkriterium in Datenbank
 
Servus jaenicke!

Ich hab's wieder entfernt. Hab' einiges versucht, doch immer wieder
sind Fehlermeldungen gekommen.

Ich weiß nur soviel, dass man folgenden SQL-Code verwenden soll:

SQL-Code:
"SELECT MVO_Notenverzeichnis.Name, MVO_Notenverzeichnis.KomponistNachname
FROM MVO_Notenverzeichnis
WHERE (((MVO_Notenverzeichnis.KomponistNachname)="Bach"));"
Hierbei würden alle Musikstücke innerhalb einer bestimmten Kategorie von Bach ausgewählt.

Jedoch sollte dieser Code variabel sein.

Wenn ich in der Listbox zB Mozart auswähle, sollen alle Stücke von Mozart innerhalt einer
bestimmten Kategorie angezeigt werden.

Leider weiß ich nicht ganz, wie man dies am besten machen kann.

Bild des Layouts

Grüße Christoph

DeddyH 19. Apr 2009 12:20

Re: Filterkriterium in Datenbank
 
Als Stichwort für die Forensuche seien hier Hier im Forum suchenSQL-Parameter genannt.

Stocki1990 19. Apr 2009 13:35

Re: Filterkriterium in Datenbank
 
Danke für den Hinweis, aber das hilft mir auch nicht so wirklich weiter

DeddyH 19. Apr 2009 13:43

Re: Filterkriterium in Datenbank
 
Und wieso nicht?
Delphi-Quellcode:
Query.SQL.Text := 'SELECT * FROM Tabelle WHERE Feld = :wert';
Query.ParamByName('wert').Value := 'Bach'; //oder Mozart, Beethoven, etc.
Query.Open;

Stocki1990 19. Apr 2009 13:58

Re: Filterkriterium in Datenbank
 
Danke für deine rasche Antwort.

In der Listbox sind viele Komponisten eingetragen.
Wenn ich auf einen Wert (Komponistenname) in der Listbox klicke, sollen die Werke vom Komponisten
in einem Listview in der Mitte erscheinen.

Kann sein, dass ich es ein wenig verwirrend erklärt habe.
- Bin ja ein Newbie :)

Hier wäre mal mein Ansatz bezüglich der Listbox:

Delphi-Quellcode:
procedure Tform1.FillListbox;
begin
 Listbox1.items.clear;

 ADOQuery1.close;
 ADOQuery1.SQL.clear;
 ADOQuery1.SQL.Add('Select * from MVO_Notenverzeichnis');
 ADOQuery1.Open;

 While not ADOQuery1.Eof do begin
 Listbox1.Items.add(ADOQuery1.FieldValues['Komponistnachname']) ;
  ADOQuery1.Next;
 end;
 
 Adoquery1.close;

 adoquery1.SQL.Clear;
 adoquery1.sql.add('SELECT MVO_Notenverzeichnis.Name, MVO_Notenverzeichnis.KomponistNachname FROM MVO_Notenverzeichnis
 WHERE MVO_Notenverzeichnis.KomponistNachname=' +listbox1.Selected.item);
 adoquery1.ExecSQL;

end;
Grüße Christoph

mkinzler 19. Apr 2009 14:15

Re: Filterkriterium in Datenbank
 
Warum keine DBLookupListBox?

DeddyH 19. Apr 2009 14:20

Re: Filterkriterium in Datenbank
 
Und wieso alle Daten abfragen, wenn man nur den Namen will? Außerdem werden Abfragen (SELECT) mit Open geöffnet und nicht mit ExecSQL.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:14 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 by Thomas Breitkreuz