![]() |
Hallo Thea
Du kannst einfach das WHERE mit einem AND ergänzen und den gewünschten Text suchen
Code:
Berücksichtige aber die schon gemachten Aussagen bezüglich der LIKE-Suche! Wichtig ist, dass OR mit Klammern entsprechen getrent sind
SELECT * FROM TableName WHERE SearchField LIKE '%Text1%' AND SearchField LIKE '%Text2%'
Beispiel:
Code:
Eben wie gehabt....
WHERE (SField LIKE '% Freund%' OR SField LIKE '%Freund %') AND (SField LIKE '% Baum%' OR SField LIKE '%Baum %)
Gruss Xaver PS: Musst einfach sehen, dass Du vor lauter Bäumen den Wald nicht mehr siehst oder so etaw... |
Dazu müsste ich den eingegebenen String aber irgendwie aufteilen, nach dme Prinzip
Code:
Gell? Und nun noch ein Code bitte, den Delphi auch versteht :mrgreen:
if irgendeinZeichen vom eingegebenenString =' ' dann
teile den String in mehrere Teile suche nach jedem Einzelstring |
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:
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:
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; Gruss Xaver PS: ich verwende x bei lokalen Variablen; hat aber nichts mit meinem Namen zu tun.... :warn: |
Oh, danke schön, fühlte mich jetzt zeitweise etwas überfordert... ich schulde dir einen Glühwein ;)
|
Bitte gern geschehen, aber wie fühlt man sich nach einem virtuellen Glühwein? Etwa so? :kotz:
Gruss Xaver |
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. |
Ok, kannst Du einmal den Code, den Du hinein gehäckt hast hinein kopieren, dann sehe ich in mal an.
Gruss Xaver |
Also, zu Testzwecken hab ich dafür ein neues Programm geschrieben:
Code:
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!
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. |
Nein brucht keine zusätzliche if-Entscheidung. War mein Fehler. Die zweite Zuweisung an xWhere ist nicht korrekt
Wie es jetzt ist:
Code:
Wie es aussehen sollte:
......
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 ....
Code:
An Stelle von xWord muss natürlich xStr stehen. xWord ist ja in Falle, dass nur ein Wort eingegeben wurde leer!
......
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 .... Ü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:
So kannst Du mit dem Cursor immer vom begin zu end fahren und weisst sofort, was zusammen gehört.
procedure ......
var xVars.... begin if begin end else if .. begin while ... begin end; end; end; Gruss Xaver |
: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. |
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