0

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

null
    • Mirko
    • vor 4 Jahren
    • Gemeldet - anzeigen

    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

    • Holzi
    • vor 4 Jahren
    • Gemeldet - anzeigen

    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

    • Mirko
    • vor 4 Jahren
    • Gemeldet - anzeigen

    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
    end

    Die 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

    • Ninox-Professional
    • planoxpro
    • vor 4 Jahren
    • Gemeldet - anzeigen

    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.

    • Holzi
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Mirko,

    vielen Dank für Deine Bemühungen. Mit den von Dir genannten Einschränkungen funktioniert es wunderbar.

    • Holzi
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Copytexter, ist ja der Wahndsinn. Probier ich nacher mal in Ruhe aus.

    • Ninox-Professional
    • planoxpro
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Ups, siehste. Hätte ich mal vorher auf "Aktualisieren" gedruckt. Mirkos Version mit den Arrays sieht so auf den ersten Blick besser aus.

    • Mirko
    • vor 4 Jahren
    • Gemeldet - anzeigen

    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

    • Holzi
    • vor 4 Jahren
    • Gemeldet - anzeigen

    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.

    • Holzi
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Danke Mirko, ich habe Deinen letzten post erst jetzt gesehen. Danke!!

Content aside

  • vor 4 JahrenZuletzt aktiv
  • 10Antworten
  • 1138Ansichten