0

Zwei Optionen in DMAF gegenseitig ausschließend

Hallo,

habe ein dynamisches Mehrfachauswahlfeld mit - sagen wir  - 10 Optionen. Wie schaffe ich es, dass sich zwei Optionen gegenseitig ausschließen, also wenn Option 1 gesetzt wird, muss Option 10 deaktiviert sein, wenn Option 1 nicht gesetzt ist, muss 10 aktiv sein. Ebenso, wenn 10 gesetzt wird, muss 1 deaktiviert sein, wenn 10 nicht gesetzt wird, muss 1 aktiv sein.

Das dürfte wohl über den Trigger Änderung laufen, aber das Skripting dazu übersteigt meine Fähigkeiten. Für Hilfe oder Wink mit dem Zaunpfahl bin ich dankbar.

Maurice

6 Antworten

null
    • Ninox-Professional
    • planoxpro
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Hallo Maurice, wie der Name schon andeutet, werden die Einträge dynamischer Auswahlfelder eben dynamisch erzeugt. Das heißt, im Gegensatz zu statischen Auswahlfeldern gibt es keine feste, vorgegebene Nummerierung von 1 bis X, über die man auf einzelne Einträge zugreifen könnte.

    Ninox verwendet die Nummern der Datensätze. Theoretisch könnte man sich die betreffenden Nummern nun aus der Quelltabelle heraussuchen und als Kriterium nutzen. Das wäre als Ansatz aber insofern problematisch, als die gewünschte Dynamik damit ja verloren ginge. Dann könnte man gleich ein statisches Auswahlfeld nehmen.

    Wenn es aber unbedingt ein dynamisches Auswahlfeld sein muss, dann würde ich eher in den Datensätzen der Auswahleinträge ein Kriterium hinterlegen, anhand dessen andere Datensätze von der Auswahl ausgeschlossen werden könnten. Eine konkrete Idee habe ich dafür jetzt nicht, aber das wäre m. E. der sinnvollere Ansatz.

      • Maurice
      • vor 1 Jahr
      • Gemeldet - anzeigen

      planox. pro Die grundsätzliche Überlegung, ob das Feld dynamisch ist oder nicht, kann ich nochmal anstellen. Danke für den Hinweis. Aber selbst, wenn es statisch ist: wie ließe sich das realisieren. Bei einem dynamischen MAF muss ich mich dann per Nr auf die Tabelleneinträge beziehen. Das dürfte der wesentliche Unterschied sein.

      Meine Idee war:

      • Auslesen des aktuellen arrays mit array1:=numbers(MAF)
      • Prüfen ob Option 1 gesetzt, falls ja, dann prüfe, ob Option 10 gesetzt, falls ja entferne Option 10 und erstelle neues array2 ohne Option 10, falls nein behalte array1 else (falls Option 1 nicht gesetzt) dann prüfe ob Option 10 gesetzt, falls ja behalte arry1, falls nein erstelle neues array2 mit Option 10.

      Jetzt muss ich das noch ins Skripten bringen. Mir ist nicht klar, wie ich ein array um einen Eintrag ergänze bzw. kürze. Da hängt es bei mir.

      Maurice

      • UweG
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Maurice Vielleicht hilft dir das Beispiel zu diesem Feed https://forum.ninox.de/t/x2h79sn/hinweis-fur-dynamische-awf einen programmiertechnischen Anstoss zu erhalten.

      • Ninox-Professional
      • planoxpro
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Maurice 

      Hm, falls es darum geht, die Nr. 10 immer abzuwählen, wenn die Nr. 1 gewählt wird, dann könnte man das so machen:

      if chosen(MFAF, 1) then
         if chosen(MFAF, 10) then
            let myA := numbers(MFAF)
            let myArray := for i in myA do
            if i != 10 then i end;
         end;
         MFAF := myArray
      end
      

      Das bedeutet aber zwangsläufig, dass die 10 nicht ausgewählt werden kann, wenn die 1 bereits gewählt ist. Soll auch der umgekehrte Fall berücksichtigt werden, dann wird's komplizierter, weil man im Moment nach der Änderung ja nicht weiß, welche der beiden Optionen zuerst ausgewählt war. Da müsste man wohl mit einem temporären Feld arbeiten, in dem die gewählten Optionen zwischengespeichert und mit den geänderten abgeglichen würden. Sowas schüttle ich mir aber auch nicht mal eben so aus dem Ärmel.

      • Maurice
      • vor 1 Jahr
      • Gemeldet - anzeigen

      planox. pro Ich habe mal diesen Ansatz versucht 

      let oldArray := numbers(Tags);
      let newArray := if not (chosen(Tags, 1) or chosen(Tags, 10)) then
               array(oldArray, [10]);
          else
              if chosen(Tags, 1) and chosen(Tags, 10) then
                  for i in oldArray do
                      if i != 10 then i end
                  end
              else
                  oldArray
              end
          end;
      Tags := newArray
      

      Das von dir genannte Grundproblem bleibt: Wenn ich mal die Option 1 gesetzt habe, werde ich sie los durch Wählen der Option 10, aber wenn ich Option 1 deaktiviere, erscheint 10. Damit kann ich leben. Option 1 ist die dominante Option. Vielen Dank. Ich werde mal vorerst damit arbeiten. 

      UweG Den Bug und das Fixing werde ich im Kopf behalten. Vielleicht wird der Bug ja schneller gefixt wie ich ein manuelles fixing benötige. Danke allen hier (mal wieder) für die Inspiration und das Ermöglichen von Lernen.

      Grüße Maurice

      • Maurice
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Korrektur: Das von dir genannte Grundproblem bleibt: Wenn ich mal die Option 1 gesetzt habe, werde ich sie NICHT los durch Wählen der Option 10, ...

Content aside

  • Status Answered
  • vor 1 JahrZuletzt aktiv
  • 6Antworten
  • 48Ansichten
  • 3 Folge bereits