1

Ansicht mit einer dynamischen Mehrfachwahl filtern

hallo liebes Forum! 

ich krieg's nicht hin, daher die Frage an Euch, mit der Bitte um Hilfe: 

In einer Tabelle Vokabeln sind mithilfe eines dynamischen Mehrfachauswahlfeldes (wird befüllt von der Tabelle Tags) ein oder mehrere Tags zugeordnet. 

In einer Lernansicht soll die vorhin genannte Tabelle mit diesem dynamischen Mehrfachauswahlfeld gefiltert werden. 

 

Bei meinem Ergebnis werden nur die Datensätze 3,7 angezeigt (siehe Grafik mit Ergebnis) während  lt. erster Grafik die Datensätze 1,3,7 richtig wären. 

Der einzige Coder der zum richtigen Ergebnis führt, ist aber nicht wirklich verwendbar, da nur ein Workaround. Ich schaff es nicht, den Code so zu automatisieren, dass die Anzahl des Arrays xTags beliebig ist: 

Wie löst man das? 

let xTags := numbers(Filter_Tags);
if string(xTags) = "" then
    select Vokabeln
else
    select Vokabeln where numbers(Tags) = item(xTags, 0) or numbers(Tags) = item(xTags, 1) or numbers(Tags) = item(xTags, 2)
end

DMA Test.ninox 

anbei die Test DB

Vielen Dank für eure Mühe vorab!

Michael 

7 Antworten

null
    • mirko3
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hi Michael. Schau mal, ob es geht. Sind ein Haufen Schleifen, aber ist halt so, bei dmulti.

    let xTags := for num in numbers(Filter_Tags) do
            record(Tags,num).Tag
        end;
    let result := [0];
    for tag in xTags do
        for i in select Vokabeln do
            let yTags := for num in numbers(i.Tags) do
                    record(Tags,num).Tag
                end;
            if contains(concat(i.yTags), tag) then
                result := array(result, [i.number(Nr)])
            end
        end
    end;
    for res in unique(result[!= 0]) do
        record(Vokabeln,res)
    end
    
      • 46wcxg
      • vor 2 Jahren
      • Gemeldet - anzeigen

      Mirko guten Morgen Mirko! 

      Vielen Dank für deine Lösung! Habe sie gleich mal reinkopiert und - siehe da, sie funktioniert (das habe ich natürlich erwartet 😉, da ich schon einige deiner Post/Hilfen gelesen habe)! Lieben Dank nochmals! Saludos....

    • Fox Concepts
    • Christoph.2
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo Michael,

    ich nutze die dynamischen Mehrfachauswahl sehr gerne für genau solche Filteranwendung. Durch die Verschachtelung mit Tags und Tag Kategorien wird es hier natürlich schon etwas komplizierter, aber auch das lässt sich recht sauber lösen.

    Anm. Ich habe mir da eine kleine Helper Funktion 'ismember()' gebaut, die ich bei jeder meiner Anwendungen gleich mal in den Global Functions platziere. Ich hab sie hier in der Ansichts-Funktion eingebaut. Die hilft dabei einen Array nach einem enthaltenen Wert zu suchen (über einen definierbaren Seperator auch gut abgesichert.

    Aber jetzt zu deiner Lösung. Das DMFA für Tags hab ich auch etwas vereinfacht. Ich rufe zuerst die Records der Kategorien ab und wähle dann die Rückverknüpften Tags:

    let tagKats := for k in numbers(Filter_Kategorie) do
            record(TagKat,k)
        end;
    tagKats.Tags
    

    In der Ansicht wähle ich nun alle Variablen, welche bei durchiterieren ihrer Tags mittels Überprüfung mit meiner kleinen Hilfsfunktion ein true liefern (also enthalten sind in der Tagliste DMFA). Das sieht dann so aus:

    function ismember(strgSet : text,element : text) do
        let sep := "#";
        if not contains(strgSet, sep) then
            strgSet := replace(replace(strgSet, ", ", sep), ",", sep)
        end;
        strgSet := sep + strgSet + sep;
        element := sep + element + sep;
        contains(strgSet, element)
    end;
    let selectedTagList := concat(numbers(Filter_Tags_neu));
    (select Vokabeln)[max(for t in numbers(Tags) do
                    ismember(selectedTagList, text(t))
                end) = true]
    

    Sieht kompliziert aus, ist aber im Endeffekt recht simpel implementiert. Kann dir das bei Bedarf auch mal kurz persönlich erklären.

    Anbei auch nochmal die Bsp. Datenbank mit Anpassungen.

    Kleine Anmerkung noch, du solltest bei Änderung der Kategorie DMFA einbauen, dass das Tag DMFA null gesetzt wird, da die Tags der abgewählen Kategorien zwar nicht mehr sichtbar, aber die Selektion nicht gelöscht wird.

      • 46wcxg
      • vor 2 Jahren
      • Gemeldet - anzeigen

      Christoph hallo und guten Morgen Christoph! 

      lieben Dank für deine elegante Lösung! Ich habe deine angepasste Datebank gleich mal ausprobiert. Sie macht genau das, was ich möchte - super!

      Ich hätte dazu 1 Frage: 

      Frage: wozu brauchst du das "max()" bei der Parameter Abfrage für "select Vokabeln" und könnte man nicht auch in der selben Zeile statt "..in numbers(Tags) do.." die weniger lange Filter_Tags_neu verwenden - "...in numbers(Filter_Tags_neu do..."? Wenn die Tabelle Tagssehr lange ist, wäre das unnötige Zeit? 

      Ich habe deinen Hinweis bezgl "bei Änderung der Kategorie DMFA" gecheckt, in der Tat ist das so. Die empfohlene Anpassung habe ich bereits eingebaut. 

      liebe Grüße und vielen Dank! 

      • Fox Concepts
      • Christoph.2
      • vor 2 Jahren
      • Gemeldet - anzeigen

      Michael Hallo Michael, die Schleife mit numbers(Tags) ist innerhalb der where Bedingung bei der Auswahl der Vokabel und iteriert nicht durch die Tag Tabelle, sondern durch die jeweils dem Vokabel zugeordneten Tags. (Die Liste der Ausgewählten 'Filter_Tags_neu' ist in selectedTagList vorab zusammengefasst und dient als Vergleichsliste bei der ismember() Abfrage.)

      Das bedeutet man bekommt bei einem Vokabel dem 3 Tags zugeordnet sind einen 3x1 Array mit true/false Werten. Die max() Funktion in Ninox erlaubt auch die Auswertung eines Boolean Array und gibt true zurück, wenn mindestens 1 Wert true ist (daher min. 1 gesuchter Tag beim Vokabel gefunden wurde). Sind alle Werte false gibt die max() Auswertung auch false zurück (keiner der Tags ist in der Liste der gesuchten).

      • 46wcxg
      • vor 2 Jahren
      • Gemeldet - anzeigen

      Christoph sehr interessant, danke! Wieder was dazugelernt! 

    • 46wcxg
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Christoph Mirko muchas gracias euch beiden! 👍