Hallo Leute,
ich habe eine
SQL-Abfrage, die mir ALLE Datensätze liefert (DSLibrary).
Delphi-Quellcode:
SQL := '
select * from SONG ';
SQL :=
SQL + '
inner join ARTIST on ARTIST.ID = SONG.ARTIST_ID ';
SQL :=
SQL + '
inner join SONG_DETAIL on SONG_DETAIL.SONG_ID = SONG.ID ';
SQL :=
SQL + '
inner join GENRE on GENRE.ID = SONG.GENRE_ID ';
SQL :=
SQL + '
inner join LANGUAGE on LANGUAGE.ID = SONG.LANGUAGE_ID ';
SQL :=
SQL + '
order by SONG';
with DMMedia.DSLibrary
do
begin
Close;
SelectSQL.Clear;
SelectSQL.Add(
SQL);
Open;
Last;
First;
end;
Diese lade ich in einen VirtualStringTree (siehe Bild). In dieser möchte ich jetzt suchen. Aufgrund von Sonderzeichen würde ich gerne Parameter verwenden. Allerdings müsste ich den Suchbegriff auseinandernehmen, da ich in der Suchmaske mehrere Begriffe eingeben möchte.
Ein Beispiel:
'Beastie Boys', 'Beast Boy', 'boys, beastie', ... sollen ALLE das selbe Ergebnis liefern.
Ohne Parameter funktioniert das, nur dass ich dann Probleme mit den Sonderzeichen bekomme (aus einem älteren Programm):
Delphi-Quellcode:
procedure TFLibrary.sortfind;
var str, str1, help, help1:
string;
sql:
string;
i: integer;
begin
try
Screen.Cursor := crSQLWait;
Application.ProcessMessages;
sql := '
select * from SONG inner join SONG_DETAIL on (SONG_DETAIL.SONG_ID = SONG.ID) ';
sql :=
sql + '
inner join ARTIST on (ARTIST.ID = SONG.ARTIST_ID) ';
sql :=
sql + '
inner join GENRE on (GENRE.ID = SONG.GENRE_ID) ';
sql :=
sql + '
inner join LANGUAGE on (LANGUAGE.ID = SONG.LANGUAGE_ID) where UPPER(ARTIST) LIKE ''
%';
help := EArtist.Text;
for i := 1
to length(help)
do
begin
if (help[i] = '
''
')
then
if i = length(help)
then Insert('
''
',help,i)
else
begin
insert('
''
',help,i);
Delete(help,i-1,1);
end;
end;
while pos('
',help) > 0
do
begin
str:= help;
delete(str,pos('
',str),length(str));
delete(help,1,pos('
',help));
sql :=
sql + AnsiUpperCase(str) + '
%''
AND UPPER(ARTIST) LIKE ''
%';
end;
if pos('
',help)=0
then sql :=
sql + AnsiUpperCase(help) + '
%''
AND UPPER(SONG) LIKE ''
%';
help1 := ESong.Text;
for i := 1
to length(help1)
do
begin
if (help1[i] = '
''
')
then
if i = length(help1)
then Insert('
''
',help1,i)
else
begin
insert('
''
',help1,i);
Delete(help1,i-1,1);
end;
end;
while pos('
',help1) > 0
do
begin
str1:= help1;
delete(str1,pos('
',str1),length(str1));
delete(help1,1,pos('
',help1));
sql :=
sql + AnsiUpperCase(str1) + '
%''
AND UPPER(SONG) LIKE ''
%';
end;
if pos('
',help1)=0
then sql :=
sql + AnsiUpperCase(help1) + '
%''
AND UPPER(GENRE) LIKE ''
%';
sql :=
sql + AnsiUpperCase(EGenre.Text) + '
%''
AND UPPER(LANGUAGE) LIKE ''
%';
sql :=
sql + AnsiUpperCase(ELanguage.Text) + '
%''
order by ' + sortfield + sort;
DMClient.DSLibrary1.Close;
DMClient.Library1.Enabled := false;
DMClient.DSLibrary1.SelectSQL.Clear;
DMClient.DSLibrary1.SelectSQL.Add(
sql);
DMClient.DSLibrary1.Open;
DMClient.Library1.Enabled := true;
Screen.Cursor := crDefault;
except
Screen.Cursor := crDefault;
ShowMessage('
Invalid input');
end;
end;
Wie kann ich am günstigsten mehrere Parameter dynamisch deklarieren?
Oder gibt es eine Alternative bei TVirtualStringTree, so dass ich nicht jedesmahl (bei OnSuchEditChange) eine Abfrage ausführe?
Danke für eure Hilfe
[Edit=djmasi]
Hat sich erledigt. Hab es ohne
SQL gemacht. Die Suchfunktion im VirtualStringTree ist gigantisch schnell im Vergleich dazu. Man muss halt nur wissen wie's geht
[/Edit]