Entwickler-Ecke

Datenbanken - Feldsuche in ADO Datenbank über Anfangsbuchstaben


Arne Danikowski - Mi 27.08.08 12:06
Titel: Feldsuche in ADO Datenbank über Anfangsbuchstaben
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:


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 - Mi 27.08.08 12:17

Die äußeren Klammern brauchts nicht, ausserdem evtl. die Property FilterOptions prüfen (CaseSensitivity).


Arne Danikowski - 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 - Mi 27.08.08 12:45

Welche Datenbank wird denn benutzt?

ADOTable.FilterOptions


Arne Danikowski - 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 - Mi 27.08.08 12:58
Titel: Re: Feldsuche in ADO Datenbank über Anfangsbuchstaben
user profile iconArne Danikowski hat folgendes geschrieben:


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



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

Edit:
und afaik auch ein LIKE

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

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


Arne Danikowski - 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 - 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


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


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.