0

Den Inhalt einer Ansicht abhängig von einer Mehrfachauswahl machen

Also ich habe eine Tabelle Kontakte, inder ich eine Mehrfachauswahl habe mit Familie, Arbeit, Freunde ... .Und dann habe ich eine Tabelle Ansicht mit einer Ansicht und einer Mehrfachauswahl mit dem gleichen Inhalt. Jetzt möchte ich Freunde auswählen und dann sollen alle angezeigt werden, bei denen bei Kontakte  inder Mehrfachauswahl Freunde ausgewählt wurde. 

Momentan schaff ich es nur wenn ich jemanden habe der als Freund und als Arbeit zählt, dann muss ich auch beide anklicken damit er erscheint, möchte aber dass er auch kommt, wenn ich nur Freunde auswähle.

Dann habe ich es versucht mit chosen() und dann mit contains(), da hat er aber gemeckert, da es beides Arrays sind

Was könnte man da machen?

Lg

Lorenz

12 Antworten

null
    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Lorenz,

    ist ein bisschen kompliziert. Ich habe eine Formel entwickelt, die bei mir sehr gut funktioniert. Angenommen dein Mehrfachauswahlfeld heißt Status und die Einträge sind identisch:

    ---

    let me := this;
    if me.Status then
    (select Kontakte)[Status and cnt(unique(chosen(me.Status), chosen(Status))) < cnt(chosen(Status)) + cnt(chosen(me.Status))]
    else
    (select Kontakte)[not Status]
    end

    ---

    Wenn du nichts ausgewählt hast werden Kontakte angezeigt, wo der Status auch nicht ausgewählt ist.

     

    Leo

    • Lamping & Reisig Gmbh & Co.KG
    • LuRLorenz
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Es klappt, danke sehr.
    Aber wieso muss man das mit cnt machen?

    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Ich versuche es zu erklären:

    Wir möchten zwei MFA-Felder Vergleichen und Übereinstimmungen finden. Wählen wir beim Ersten Familie und beim Zweiten Familie und Arbeit.

    mit chosen(MFAF) bekomme ich zwei Arrays: ["Familie"] und ["Familie","Arbeit"]. Es gibt leider keinen Befehl für "Prüfe ob irgend etwas aus dem ersten Array auch in dem zweiten vorkommt. Um das zu realisieren musste man zwei ineinander liegenden Schleifen bauen und jeden einzelnen Element prüfen. etwa so:

    let myFlag:=false;
    for i in chosen(MFAF1) do
    for j in chosen(MFAF2) do
    if i=j then 
    myFlag:=true
    end
    end
    end
    if myFlag=true then alert ("Es gibt eine Übereinstimmung")
    end.
    Generell funktioniert das auch für Ansichten aber bei größeren Tabellen fürchte ich, dass zwei Schleifen und ein if then Befehl zu Performance-Problemen führt.
    Deswegen bin ich einen anderen Weg eingeschlagen:
    Wenn ich die Summe der Einträge bei beiden Arrays betrachet dann ist das in unserem Fall ->3: cnt(chosen(MFAF1))+cnt(chosen(MFAF2)-> 3

    Packe ich die beiden Arrays in ein unique-Befehl (eindeutige Ergebnisse): wird Familie nur einmal ausgeführt: unique(chosen(MFAF1),chosen(MFAF2)) - > ["Familie","Arbeit"]

    und die Anzahl der Mitglieder ist 2:

    cnt(unique(chosen(MFAF1),chosen(MFAF2))) -> 2

    Man kan daraus als Theorem festlegen: wenn irgendwelche Einträge bei zwei Arrays übereinstimmen dann ist die Anzahl der Einträge in unique(Arr1,Arr2) immer kleiner als die Summe allen Einträge.

    Und so bin ich auf die Formel gekommen.

    Ich hoffe, es war einigermassen verständlich.

     

    Leo

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

    So ganz habe ich's auch noch nicht kapiert, aber es funktioniert und erscheint mir ziemlich genial. Darauf muss man erst mal kommen. Wieder mal: Hut ab!

     

    PS: Wäre auch ein hilfreicher Beitrag für die Praxisbeispiele der Referenz.

    • Lamping & Reisig Gmbh & Co.KG
    • LuRLorenz
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hui ja das ist wirklich klever. Ich hatte es auch mit schleifen probiert, aber dann immer noch mit contains. Das hat aber nicht geklappt. 
    Da ist auch die Anzahl der Einträge in der MFA sind egal oder ?

    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Ist drin.

    • Rene
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Leo, ist diese Formel bzw. Abfrage hilfreich z.B. in der Ansich bei Kunden wo noch Rechnungen offen sind, sofern die Mehrfachfelder identisch sind ? Danke.

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

    Wenn(!) ich es richtig verstehe, dann spielt die Anzahl der Einträge keine Rolle, und man kann den Code für alle Ansichten nutzen, bei denen zwei inhaltlich identische Mehrfachauswahlfelder verglichen werden.

     

    @Leo: Danke für's Eintragen! Das ist bestimmt für viele Nutze hilfreich.

    • Stephan_Haumann
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Hallo Zusammen,

    @Leo: Deine Formal oben hat mir schon an mehreren Stellen geholfen! Vielen Dank dafür!

    Trotzdem habe ich noch eine Frage: Was mache ich, wenn ich auf der einen Seite zwei einfache Auswahlfelder habe das die Altersklasse der Mannschaft bestimmt (nämlich ein Auswahlfeld mit Männlicher Jugend A, B, C, usw. und ein Auswahlfeld mit Weiblicher Jugend A, B, C usw. - beide erscheinen jeweils bei vorherigem klick auf "männlich" oder "weiblich") und auf der anderen Seite ein MFA Feld mit allen Altersklassen und ich möchte mir alle Datensätze in einer Ansicht anzeigen lassen? Habt ihr dafür eine Lösung? Ich habe mal versucht das chosen() wegzulassen, aber das klappt so nicht...

    Liebe Grüße

    • Stephan_Haumann
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Ich habs so gelöst:

    let me := this;
    let myID := MFA
    let myTeam := select 'Tabelle zum anzeigen';
    for i in myTeam do
    for ii in chosen(myID) do
    if i.Mannschaft like ii then i end
    end
    end

    • Maurice
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo,

    ich hatte ein ähnliches Problem, etwas komplexer, da ich mit einem dynamischen Auswahlfeld gearbeitet habe, an das man mit chosen() nicht dran kommt. Deshalb hier auch noch mein Code

    let suchBegriff := 'Kurs Suche';
    let thisKJ := Kursjahrgang.Jahrgang;
    let thisFach := (select 'Fächer' where contains(lower(Fach), lower(suchBegriff))).number(Nr);
    if Kursjahrgang.Jahrgang != null then
    select '01 Kurse' where (contains(lower(Kursname), lower(suchBegriff)) or cnt(unique(number(Fach), thisFach)) < cnt(thisFach) + cnt(Fach)) and Kursjahrgang.Jahrgang = thisKJ
    else
    select '01 Kurse' where contains(lower(Kursname), lower(suchBegriff)) or cnt(unique(number(Fach), thisFach)) < cnt(thisFach) + cnt(number(Fach))
    end

    'Kurs Suche' ist dabei das Suchfeld, auf das die Ansicht reagieren soll. Kursjahrgang.Jahrgang ist einfach ein weiteres verknpüftes Feld, auf das die Suche eingeschränkt werden kann. In der Tabelle 'Fächer' werden die Nr der Fächer ausgelsen, auf die die Texteingabe zutrifft und ein Array thisFach ist das Zahlen-Array zu den passenden Fächer. Beispiel: bei Eingabe von "tik" in 'Kurs Suche' gibt das Array thisFach die NUmmern der Fächer Mathematik, Informatik, Politik als array zurück.

    In der Tabelle '01 Kurse' werden jetzt (neben den Kursnamen) die passenden Fächer dazu gesucht, also jene Kurse mit Mathematik, Informatik und Politik im dynamischen Mehrauswahlfeld 'Fach'.

    Danke Leo für die geniale Idee mit dem cnt-Befehl und letztendlich der angewandten Dreiecksgleichung.

    Grüße Maurice

    • Maurice
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Dreicksungleichung natürlich

Content aside

  • vor 2 JahrenZuletzt aktiv
  • 12Antworten
  • 2531Ansichten