Autor Beitrag
Arne Danikowski
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 194



BeitragVerfasst: Mi 27.08.08 12:06 
Hallo,
ich möchte über ein EditTextFeld in meiner Datenbank suchen. Dabei sollen immer die Datensätze angezeigt werden, die mit der Eingabe im EditFeld übereinstimmen.

Also bei nur einem a = alle Datensäte die mit A beginnen
bei einem ab = alle Datensätze die mit Ab beginnen

Das hier hatte ich mir schon zusammengebastelt:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TLagermain.suchelieferEditChange(Sender: TObject);
var suche: string;
   filter: string;
begin
  suche := suchelieferedit.text;
  filter:= '(Firma = ' + QuotedStr(suche + '*') + ')';
  Lagerdata.ADOLieferTable.Filter :=filter;
  Lagerdata.ADOLieferTable.Filtered := true;
  if suchelieferedit.text= ''  then
  Lagerdata.ADOLieferTable.Filtered := false;

  end;

end.


Wenn ich nun einen Buchstaben eingebe verschwinden alle Datensätze.

Weiß jemand Rat?
iKilledKenny
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 8

Win XP
D5 Prof, C# Express 2005
BeitragVerfasst: Mi 27.08.08 12:17 
Die äußeren Klammern brauchts nicht, ausserdem evtl. die Property FilterOptions prüfen (CaseSensitivity).
Arne Danikowski Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 194



BeitragVerfasst: Mi 27.08.08 12:42 
OK die Klammern können weg, aber das löst nicht das Problem.
Wo finde ich denn die Property FilterOptions?

Aber wenn ich ein großen A eingebe müssten doch auch die Datensätze, die mit einem großen A beginnen im Grid angezeigt werden

Mir scheint es eher, sobald ein Buchstabe im EditFeld steht, der Filter nicht stimmt und keine Treffer angezeigt werden.
Ich habe die gleichen Programmzeilen mal mit einer DBASE Datei getestet, da funktioniert es.
iKilledKenny
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 8

Win XP
D5 Prof, C# Express 2005
BeitragVerfasst: Mi 27.08.08 12:45 
Welche Datenbank wird denn benutzt?

ADOTable.FilterOptions
Arne Danikowski Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 194



BeitragVerfasst: Mi 27.08.08 12:54 
Ich verwende eine Access Datenbank, ist relativ neu für mich. Habe früher alles mit Dbase Dateien gemacht
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Mi 27.08.08 12:58 
user profile iconArne Danikowski hat folgendes geschrieben:

ausblenden Delphi-Quelltext
1:
  filter:= '(Firma = ' + QuotedStr(suche + '%') + ')';					



soviel ich weiß muss da ein % hin, kein *, analog zu SQL

Edit:
und afaik auch ein LIKE
ausblenden Delphi-Quelltext
1:
  filter:= '(Firma LIKE ' + QuotedStr(suche + '%') + ')';					

ebenfalls analog zu SQL (benutze lieber gleich ein Query und füttere es direkt mit SQL ^^)

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
Arne Danikowski Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 194



BeitragVerfasst: Mi 27.08.08 13:09 
Vielen dank das funktioniert schon mal.
Das mit dem Query weiss ich noch nicht wie das so richtig funktioniert.
Ich hatte das schom versucht hat aber nicht funktioniert
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Mi 27.08.08 13:28 
hab jetzt auf anhieb kein Tutorial dazu gefunden, vielleicht schreib ich selbst mal eins...

Mal ganz einfach.

1) Du erstellst ein Query
2) Du verbindest das Query mit deinem ADOConnector
3) Du verbindest ein DBGrid mit dem Query
4) Du gibst im Query als SQL z.B. "Select * From TabellenName ORDERED BY Feld1"
5) Query.Active:=True;

//edit:

oder
4) Du gibst im Query als SQL z.B. "'Select * From TabellenName WHERE (Firma LIKE ' + QuotedStr(suche + '%') + ')'"

an sich genügt der Table.Filter aber auch für kleine sachen

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
tfischer
Hält's aus hier
Beiträge: 4

Win7
Delphi XE
BeitragVerfasst: Fr 03.10.08 21:36 
Titel: Tabellen über ADOQuery filtern
Hi,

also bei mir hat es folgendermaßen funktioniert.

1) Erstelle eine Query und verbinde sie mit deinem Connector mit der Access-Datenbank
2) Füge im Wide-String-Listen-Editor folgende SQL-Anweisung ein:

SELECT name_der_tabelle.Firma, name_der_tabelle.Feld2, ......usw (je nachdem welche Felder du in deinem Grid darstellen willst)
FROM name_der_tabelle
WHERE (((name_der_tabelle.Firma) LIKE (:searchname)))
GROUP BY patientenstamm.Firma;

searchname gibst du in die Eigenschaft Parameters ein.

3) Erstelle eine DataSource und verbinde sie mit der Query und verbinde dein DataGrid mit der DataSource

4) Schreibe folgende Anweisung für das OnChange-Ereignis: (Ich habe es allerdings einem Button-Click-Ereignis zugeordnet

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TLagermain.suchelieferEditChange(Sender: TObject);
var
  SearchOptions: TLocateOptions;
  suche: string;
begin
  SearchOptions := [loPartialKey];
  suche := suchelieferedit.Text;
  if Dein_Datenmodul.name_der_tabelle.Locate('Firma', suche, SearchOptions) = true then
    begin
      Dein_Datenmodul.name_deiner_query.Close;
      Dein_Datenmodul.name_deiner_query.Parameters.Items[0].Value :=
                      suche + '%';
      Dein_Datenmodul.name_deiner_query.Open;
    end
  if not Datenmodul.name_der_tabelle.Locate('Firma', SearchValue, SearchOptions) = true then begin
       Datenmodul.name_deiner_query.Close;
       Dein_Grid.Refresh;
       end;
end;


Ein paar Erklärungen dazu. Ich habe die Methode Locate vorgeschaltet, da der Filterstring in der Tabelle vorhanden sein muss. Gibst du ein X in das Suchfeld ein, und es beginnt in deiner Datenbank keine Firma mit X, gibt es eine Exception, wenn es direkt in den Filter eingetragen wird. Da Locate aber nur auf den ersten Datensatz der Übereinstimmung positioniert, reicht dies nicht aus (Wichtig sind die SearchOptions, damit auch Teilstrings gesucht werden).
Gibst du nun ein A ein und es werden Datensätze gefunden, die mit A beginnen, dann wird der Inhalt deines Suchfeldes als Parameter in die Query eingetragen. Natürlich plus Wildcard %. Du kannst zwar in Access selbst auch als Wildcard * verwenden. Bei Zugriffen über ADO ist aber nur das %-Zeichen erlaubt. Ja und dann muss nur noch die Query geöffnet werden. Das mit der dazugehörigen DataSource verbundene Grid zeigt dann alle Datensätze an, die dem Filterkriterium entsprechen. Du musst nur beachten, dass dann auch jedesmal der Datensatzzeiger deiner Firmentabelle bewegt wird.

Wird gar nichts gefunden, bleibt die Query zu oder wird geschlossen und das Datengitter geleert.
Ich hoffe, ich habe keine Fehler gemacht und konnte dir helfen.