Tabelle nach Suchbegriffen mit "or" bzw. "and" durchsuchen.
Über einen Tip würde ich mich freuen:
Ich wähle in einem Auswahlfeld aus, ob eine Suche mit "und" bzw. "oder" durchgeführt werden soll.
Es stehen 5 Textfelder für Suchbegriffe zur Verfügung. Mit dem nachfolgenden Code soll (abhängig vom Auswahlfeld) mit "and" bzw. "or" gesucht werden. Die Suche mit "or" funktioniert, bei "and" passiert nichts.
Woran könnte das liegen?
if Suchvorgabe = 1 then ****(Anmerkung = and)
if 'Suchbegriff 1' or 'Suchbegriff 2' or 'Suchbegriff 3' or 'Suchbegriff 4' or 'Suchbegriff 5' then
let mySuchbegriff1 := lower('Suchbegriff 1');
let mySuchbegriff2 := lower('Suchbegriff 2');
let mySuchbegriff3 := lower('Suchbegriff 3');
let mySuchbegriff4 := lower('Suchbegriff 4');
let mySuchbegriff5 := lower('Suchbegriff 5');
select Fotoalben where contains(lower(Stichwort), mySuchbegriff1) and contains(lower(Stichwort), mySuchbegriff2) and contains(lower(Stichwort), mySuchbegriff3) and contains(lower(Stichwort), mySuchbegriff4) and contains(lower(Stichwort), mySuchbegriff5)
else
select Fotoalben
end
end;
if Suchvorgabe = 2 then
if 'Suchbegriff 1' or 'Suchbegriff 2' or 'Suchbegriff 3' or 'Suchbegriff 4' or 'Suchbegriff 5' then
let mySuchbegriff1 := lower('Suchbegriff 1');
let mySuchbegriff2 := lower('Suchbegriff 2');
let mySuchbegriff3 := lower('Suchbegriff 3');
let mySuchbegriff4 := lower('Suchbegriff 4');
let mySuchbegriff5 := lower('Suchbegriff 5');
select Fotoalben where contains(lower(Stichwort), mySuchbegriff1) or contains(lower(Stichwort), mySuchbegriff2) or contains(lower(Stichwort), mySuchbegriff3) or contains(lower(Stichwort), mySuchbegriff4) or contains(lower(Stichwort), mySuchbegriff5)
else
select Fotoalben
end
end
10 Antworten
-
Hallo Holzi,
dein Skript setzt aber voraus, dass in dem Feld "Stichwort" in Tabelle Fotoalben ALLE 5 Suchbegriffe in einem Datensatz vorhanden sind und auch ALLE 5 Suchbegriffe in den Suchfeldern eingeben worden sind. Ist das so? Wenn nicht, werden auch keine Datensätze zurückgeliefert, da die Bedingungen nicht stimmen.
Gruß
Mirko
-
Hallo Mirko,
Danke für die Antwort. Hast Du eine Idee, wie die Formulierung richtigerweise sein müßte?
In dem Fel Stichwort kann ein Begriff oder auch 5, durch Leerzeichen getrennte stehen. Was ich möchte:
Ich weiß, dass es in der Tabelle unter hundertenn von Datensätzen einen geben muss, der z.B. die Begriffe (Baum Sonne Wasser) enthält. Also gebe ich in die Suchfelder diese drei Begriffe ein und sage: suche mit and.
Klappt natürlich so nicht. Aber wie könnte man den Code dann fomulieren?
Ich bin da leider wieder mal am Ende meines lateins -
let my := this;
let sv := number(my.Suchvorgabe);
let searchStr := "";
if 'Suchbegriff 1' != "" then
searchStr := 'Suchbegriff 1' + ","
end;
if 'Suchbegriff 2' != "" then
searchStr := searchStr + 'Suchbegriff 2' + ","
end;
if 'Suchbegriff 3' != "" then
searchStr := searchStr + 'Suchbegriff 3' + ","
end;
if 'Suchbegriff 4' != "" then
searchStr := searchStr + 'Suchbegriff 4' + ","
end;
if 'Suchbegriff 5' != "" then
searchStr := searchStr + 'Suchbegriff 5' + ","
end;
let searchArry := split(searchStr, ",");
let anz := cnt(searchArry);
if sv != 0 then
select Fotoalben
where if sv = 1 then
let myS := 0;
for i in range(0, anz) do
if contains(upper(Stichwort), upper(item(searchArry, i))) then
myS := myS + 1
end
end;
if myS = anz then true else false end
else
let myS := 0;
for i in range(0, anz) do
if contains(upper(Stichwort), upper(item(searchArry, i))) then
myS := myS + 1
end
end;
if myS then true else false end
end
else
select Fotoalben
endDie Suchfelder 1-5 müssen aber in der Reihenfolge ausgefüllt werden, sonst funktioniert das Skript nicht. D.h.
z.B. suche nach Baum Sonne Wasser
Suchfeld 1 = Baum
Suchfeld 2 = Sonne
Suchfeld 3 = Wasser
Suchfeld 4 =
Suchfeld 5 =
sollte funktionieren.
Suchfeld 1 = Baum
Suchfeld 2 = Sonne
Suchfeld 3 =
Suchfeld 4 =
Suchfeld 5 = Wasser
funktioniert nicht.
Gruß
Mirko
-
Bin sicher, dass es deutlich effizienter geht, aber hier auf die Schnelle mal eine ganz simple Lösung für fünf einzelne Suchfelder:
let myS1 := null;
let myS2 := null;
let myS3 := null;
let myS4 := null;
let myS5 := null;
let myZ := 0;
if Suchbegriff1 then
myS1 := lower(Suchbegriff1);
myZ := myZ + 1
end;
if Suchbegriff2 then
myS2 := lower(Suchbegriff2);
myZ := myZ + 1
end;
if Suchbegriff3 then
myS3 := lower(Suchbegriff3);
myZ := myZ + 1
end;
if Suchbegriff4 then
myS3 := lower(Suchbegriff4);
myZ := myZ + 1
end;
if Suchbegriff5 then
myS3 := lower(Suchbegriff5);
myZ := myZ + 1
end;
if Suchvorgabe = 1 then
switch myZ do
case 1:
(select Fotoalben where contains(lower(Stichworte), myS1))
case 2:
(select Fotoalben where contains(lower(Stichworte), myS1) and contains(lower(Stichworte), myS2))
case 3:
(select Fotoalben where contains(lower(Stichworte), myS1) and contains(lower(Stichworte), myS2) and contains(lower(Stichworte), myS3))
case 4:
(select Fotoalben where contains(lower(Stichworte), myS1) and contains(lower(Stichworte), myS2) and contains(lower(Stichworte), myS3) and contains(lower(Stichworte), myS4))
case 5:
(select Fotoalben where contains(lower(Stichworte), myS1) and contains(lower(Stichworte), myS2) and contains(lower(Stichworte), myS3) and contains(lower(Stichworte), myS4) and contains(lower(Stichworte), myS5))
default:
(select Fotoalben)
end
else
if Suchvorgabe = 2 then
switch myZ do
case 1:
(select Fotoalben where contains(lower(Stichworte), myS1))
case 2:
(select Fotoalben where contains(lower(Stichworte), myS1) or contains(lower(Stichworte), myS2))
case 3:
(select Fotoalben where contains(lower(Stichworte), myS1) or contains(lower(Stichworte), myS2) or contains(lower(Stichworte), myS3))
case 4:
(select Fotoalben where contains(lower(Stichworte), myS1) or contains(lower(Stichworte), myS2) or contains(lower(Stichworte), myS3) or contains(lower(Stichworte), myS4))
case 5:
(select Fotoalben where contains(lower(Stichworte), myS1) or contains(lower(Stichworte), myS2) or contains(lower(Stichworte), myS3) or contains(lower(Stichworte), myS4) or contains(lower(Stichworte), myS5))
default:
(select Fotoalben)
end
else
select Fotoalben
end
end
Die Suchfelder müssten in der vorgebenen Reihenfolge ausgefüllt werden, was sich aber sicherstellen ließe, indem man Feld2 nur anzeigen lässt, wenn Feld1 einen Wert hat usw.
-
Hallo Mirko,
vielen Dank für Deine Bemühungen. Mit den von Dir genannten Einschränkungen funktioniert es wunderbar.
-
Hallo Copytexter, ist ja der Wahndsinn. Probier ich nacher mal in Ruhe aus.
-
Ups, siehste. Hätte ich mal vorher auf "Aktualisieren" gedruckt. Mirkos Version mit den Arrays sieht so auf den ersten Blick besser aus.
-
Danke,
@Holzi
Wenn du bei meinem Skript folgendes austauschst, dann klappt es auch mit leeren Suchfeldern dawischen, also ohne Reihenfolge einhalten.
Du musst "" durch null ersetzen. Dann hat das Array keine leeren Zwischenräume.
if 'Suchbegriff 1' != null then
searchStr := 'Suchbegriff 1' + ","
end;
if 'Suchbegriff 2' != null then
searchStr := searchStr + 'Suchbegriff 2' + ","
end;
if 'Suchbegriff 3' != null then
searchStr := searchStr + 'Suchbegriff 3' + ","
end;
if 'Suchbegriff 4' != null then
searchStr := searchStr + 'Suchbegriff 4' + ","
end;
if 'Suchbegriff 5' != null then
searchStr := searchStr + 'Suchbegriff 5' + ","
end;Gruß
Mirko
-
Hallo Copytexter,
funktioniert genauso, wie der von Mirko, ist nur etwas länger. Einen wirklichen Unterschied kann ich nicht feststellen. Ich danke Euch beiden auf jeden Fall ganz herzlich für Eure Hilfe.
Das mit dem Anzeigen der Felder (Feld2 wenn Feld1) habe ich umgesetzt. -
Danke Mirko, ich habe Deinen letzten post erst jetzt gesehen. Danke!!
Content aside
- vor 4 JahrenZuletzt aktiv
- 10Antworten
- 1143Ansichten