Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Suche: Suchstrings (https://www.delphipraxis.net/1688-suche-suchstrings.html)

xbu58 19. Dez 2002 19:07

Hallo Thea

Du kannst einfach das WHERE mit einem AND ergänzen und den gewünschten Text suchen
Code:
SELECT * FROM TableName WHERE SearchField LIKE '%Text1%' AND SearchField LIKE '%Text2%'
Berücksichtige aber die schon gemachten Aussagen bezüglich der LIKE-Suche! Wichtig ist, dass OR mit Klammern entsprechen getrent sind
Beispiel:
Code:
WHERE (SField LIKE '% Freund%' OR SField LIKE '%Freund %') AND (SField LIKE '% Baum%' OR SField LIKE '%Baum %)
Eben wie gehabt....

Gruss
Xaver

PS: Musst einfach sehen, dass Du vor lauter Bäumen den Wald nicht mehr siehst oder so etaw...

Kuckuckskind 19. Dez 2002 19:21

Dazu müsste ich den eingegebenen String aber irgendwie aufteilen, nach dme Prinzip

Code:
if irgendeinZeichen vom eingegebenenString =' ' dann
 teile den String in mehrere Teile
suche nach jedem Einzelstring
Gell? Und nun noch ein Code bitte, den Delphi auch versteht :mrgreen:

xbu58 19. Dez 2002 19:46

Na sonst noch Wünsche? Du hast Glück, dass ich heute gut drauf bin.... :dancer:

Also hier ein Beispiel wie ich es löschen würde:

1. Eingabefeld auf eine Form legen. Am besten ein TEdit
2. Button für die Suche ebenfalls auf das Form (hast Du sicher schon)

3. In OnButtonClick folgenden Code einfügen:
Code:
procedure .....
var
  xStr,
  xWord,
  xWhere : string;
  xPos  : integer;
begin
  xWhere := '';
  xStr := Trim(Edit1.Text);
  while xStr <> '' do
  begin
    xPos := Pos(' ', xStr);
    if xPos > 0 then
    begin
      xWord := Trim(Copy(xStr, 1, xPos));
      if xWord <> '' then
      begin
        if xWhere <> '' then
          xWhere := xWhere +' AND SearchField LIKE %'+ xWord + '%'
        else
          xWhere := ' SearchField LIKE %'+ xWord + '%';
      end;
      Delete(xStr, 1, xPos);
      xStr := Trim(xStr);
    end
    else if xStr <> '' then
    begin
      if xWhere <> '' then
        xWhere := xWhere +' AND SearchField LIKE %'+ xWord + '%'
      else
        xWhere := ' SearchField LIKE %'+ xWord + '%';
      xStr := '';
    end;
  end;
  if xWhere <> '' then
  begin
    Query.SQL.Text := 'SELECT * FROM TableName '+
                      'WHERE '+xWhere;
    .... und so weiter...
  end;
end;
Du musst das natürlich noch etwas ergänzen, mit dem was in den vorgängigen Nachrichten so alles gesagt wurde. Will Dir ja nicht gleich das ganze Programm liefern :cat:

Gruss
Xaver

PS: ich verwende x bei lokalen Variablen; hat aber nichts mit meinem Namen zu tun.... :warn:

Kuckuckskind 20. Dez 2002 00:14

Oh, danke schön, fühlte mich jetzt zeitweise etwas überfordert... ich schulde dir einen Glühwein ;)

xbu58 20. Dez 2002 05:52

Bitte gern geschehen, aber wie fühlt man sich nach einem virtuellen Glühwein? Etwa so? :kotz:
Gruss
Xaver

Kuckuckskind 21. Dez 2002 13:03

Nein, dann fühlt man sich so: :hello: :dancer: :dancer2: *g*

Ähm, also, um noch mal zum Programm zurückzukehren:
Es klappt alles perfekt, wenn man nach zwei Suchbegriffen sucht, aber es geht nicht, wenn man nur einen Begriff eingibt! Dann bekommt man alle Datensätze ausgegeben, die in der Tabelle sind. Irgendwie muss man noch eine Überprüfung einbauen, ob sich in dem Suchstring überhaupt ein Leerzeichen befindet und daraus eine if-Bedingung ableiten.

xbu58 21. Dez 2002 13:07

Ok, kannst Du einmal den Code, den Du hinein gehäckt hast hinein kopieren, dann sehe ich in mal an.

Gruss
Xaver

Kuckuckskind 21. Dez 2002 13:27

Also, zu Testzwecken hab ich dafür ein neues Programm geschrieben:

Code:
unit usuche;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, XPMenu, Grids, DBGrids, DB, DBTables;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    DataSource1: TDataSource;
    Query1: TQuery;
    DBGrid1: TDBGrid;
    XPMenu1: TXPMenu;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
 var
  xStr, xWord, xWhere: String;
  xPos: Integer;
begin
 if Edit1.Text = '' then
  ShowMessage('Bitte Suchbegriff eingeben!')
 else begin

 xWhere := '';
 xStr := Trim(Edit1.Text);
 while xStr <> '' do
  begin
   xPos := Pos(' ', xStr);
   if xPos > 0 then
    begin
     xWord := Trim(Copy(xStr, 1, xPos));
     if xWord <> '' then
      begin
       if xWhere <> '' then
        xWhere := xWhere +' AND Titel LIKE "%'+ xWord + '%"'
       else
        xWhere := ' Titel LIKE "%'+ xWord + '%"';
      end;
      Delete(xStr, 1, xPos);
      xStr := Trim(xStr);
    end
   else
    if xStr <> '' then
     begin
      if xWhere <> '' then
       xWhere := xWhere +' AND Titel LIKE "%'+ xWord + '%"'
      else
       xWhere := ' Titel LIKE "%'+ xWord + '%"';
      xStr := '';
     end;
  end;
   if xWhere <> '' then
    begin
     Query1.Close;
     Query1.SQL.Clear;
     Query1.SQL.Text := 'SELECT * FROM buecher WHERE '+xWhere;
     Query1.Open;
    end;
   
end;
end;

end.
Müssen zwar noch ein paar Veränderungen vorgenommen werden, damit der Codein das richtige Programm übernommen werden kann, so müsste es aber trotzdem funktionieren!

xbu58 21. Dez 2002 13:43

Nein brucht keine zusätzliche if-Entscheidung. War mein Fehler. Die zweite Zuweisung an xWhere ist nicht korrekt

Wie es jetzt ist:
Code:
   ......
    end
   else
    if xStr <> '' then
     begin
      if xWhere <> '' then
       xWhere := xWhere +' AND Titel LIKE "%'+ xWord + '%"'
      else
       xWhere := ' Titel LIKE "%'+ xWord + '%"';
      xStr := '';
     end;
  end;
   if xWhere <> '' then
    begin
   ....
Wie es aussehen sollte:

Code:
   ......
    end
   else
    if xStr <> '' then
     begin
      if xWhere <> '' then
       xWhere := xWhere +' AND Titel LIKE "%'+ xStr + '%"'
      else
       xWhere := ' Titel LIKE "%'+ xStr + '%"';
      xStr := '';
     end;
  end;
   if xWhere <> '' then
    begin
   ....
An Stelle von xWord muss natürlich xStr stehen. xWord ist ja in Falle, dass nur ein Wort eingegeben wurde leer!

Übrigens, ich empfehle, dass Du bei der Einrückung darauf achtest, den Code immer um 2 Stellen einzurücken. Ist bei grösseren Programmen sehr hilfreich.
Beispiel:


Code:
procedure ......
var
  xVars....
begin
  if
  begin
  end
  else if ..
  begin
    while ...
    begin
    end;
  end;
end;
So kannst Du mit dem Cursor immer vom begin zu end fahren und weisst sofort, was zusammen gehört.

Gruss
Xaver

Kuckuckskind 21. Dez 2002 13:55

:spin: Danke schön! Wenn das jetzt klappt, bin ich für die nächsten drei Tage nicht mehr ansprechbar ;) (-> dann hab ich nämlich zu tun...)

:xmas:


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:16 Uhr.
Seite 2 von 3     12 3      

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-2025 by Thomas Breitkreuz