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
anbei die Test DB
Vielen Dank für eure Mühe vorab!
Michael
7 Antworten
-
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
-
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.
-
Christoph Mirko muchas gracias euch beiden!
Content aside
- Status Answered
-
1
„Gefällt mir“ Klicks
- vor 1 JahrZuletzt aktiv
- 7Antworten
- 132Ansichten
-
3
Folge bereits