Auswahlfelder abfragen
Hallo
folgendes Problem:
Ich habe 3 normale Auswahlfelder: das 1 heisst Type und hat 2 Auswahlmöglichkeiten: immobilier (1) und financier (2).
Abhängig von der Auswahl wird ein 2. Auswahlfeld "Objet" eingeblendet, wenn die 1. Auswahl auf "immobilier" steht oder ein 3. Auswahlfeld "Genre", wenn das 1. auf "financier" steht.
Soweit funktioniert das perfekt.
Jetzt möchte ich in einem Feld (eigentlich im Printlayout, aber es funktioniert genausowenig in einem normalen Brechnungsfeld) die Auswahl anzeigen lassen, also entweder die Auswahl Objekt, wenn die 1. Auswahl auf "immobilier" steht oder die Auswahl Genre, wenn die 1. Auswahl auf "financier" steht. Klingt einfach, geht aber nicht.
if Type=1 then Objet else Genre sollte eigentlich funktionieren. Solange die 1. Auswahl auf immobilier sthet, wird die Objet-Auswahl auch angezeigt, bei der 2. nicht.
auch if text(Type)="immobiler" then Objet else Genre funktioniert nur bei der 1. Auswahl, ebensowenig wie eine switch case Anweisung.
Drehe ich den if-Befehl um, frage also erst Genre ab, wird diese angezeigt, aber Objet nicht mehr.
Ich habe sogar 2 Berecnungsfelder gebastelt, die einfach das Resultat von Objet und Genre anzeigen und in ein 3. dann die Abfrage verpackt:gleiches Resultat, die 1. if-Anweisung funktioniert, die "else" nicht.
Bug? oder sehe ich den Wald von lauter Bäumen nicht?
über Tipps würde ich mich freuen
lg
Arsène
11 Antworten
-
Hallo Arsène, versuch's mal so:
if Type = 1 then text(Objekt) else text(Genre) end
-
Hallo Arsène,
die Frage ist blöd, ich muss aber fragen: ist bei den eingeblendeten Auswahlfelder (Objet,Genre) eine Auswahl getrofen? denn wenn diese leer sind - wird auch nichts angezeigt. Ansonsten:
---switch Type do
case 1:
if Objet then text (Objet) else "Bitte Objet Auswahl treffen" end
case 2:
if Genre then text (Genre) else "Bitte Genre Auswahl treffen" end
end
---
Leo
-
Hallo Leo, mit deinen weitergehenden Überlegungen hast du natürlich Recht, aber es ist tatsächlich so, dass Ninox bei
if Type = 1 then Objekt else Genre end
nicht die jeweils gewählte numerische ID von 'Objekt' oder 'Genre' anzeigt, sondern den entsprechenden Text von 'Objekt'. Auch dann, wenn Type = 2 ist und bei Genre eine Auswahl getroffen wurde. Warum, ist mir auch nicht klar, aber mit der Funktion text() funktioniert es.
-
Hallo
@copytexter habe ich auch schon probiert, leider mit dem gleichen Resultat
@Leo, ja versuchsweise hatte ich sämtliche Auswahlen getroffen, Ursprünglich hatte ich auch eine verschachtelte if-Abfrage:
if Type=1 then Objet else if Type=2 then Genre else null end end. Das würde auch gerade im Printlayout Sinn machen.
aber mit der Kombination switch case und if habe ich es noch nicht ausprobiert. Das werde ich nachholen
Danke erst mal an euch beide, melde mich mit dem Resultat
-
Hello again
@copytexter: ich finde zwar nicht die Logik dahinter, aber mit deinem Tipp funktionniert es. Ich hatt bei meinem Versuch wohl nur bei Type mit text gearbeitet.
Warum wirft er ohne "text" das 1. Resultat dann trotzdem richtig aus? hmm, wohl mal wieder die berühmten kleinen grünen Männchen im Computer, die durcheinander sind...
anyway, vielen Dank
lg
Arsène
-
Sehr seltsam. Denn der beschriebene Fehler ließ sich bei mir (Cloud) reproduzieren. Und mit text(Objekt) bzw. text(Genre) beheben. Selbes Verhalten übrigens auch bei switch.
-
Ach so, klappt doch. Na bitte ... (Unsere Kommentare haben sich überschnitten.)
Normalerweise müssten ohne text() m. E. die numerischen IDs der gewählten Optionen angezeigt werden. Warum statt dessen der Textwert des ersten Auswahlfeldes angezeigt wird? Tja ... Ich denke, das ist ein Bug. Den man allerdings vermeiden kann. Und wenn man den Textwert eines Auswahlfeldes auslesen will, sollte man ja immer text(AUSWAHLFELD) nehmen. Ich selbst schreibe sogar oft number(AUSWAHLFELD), wenn ich explizit den numerischen Wert haben will, obwohl das ja eigentlich Standard ist. Sicher ist sicher ... ;)
-
ich habe unzählige IF-Abfragen in meinem Printlayout, alle auf die Auswahl Type bezogen, und alle funktionieren mit einfacher Type=1,2,3...Abfrage, allerdings mit Text- und Zahlenfeld dahinter, eine sogar alternativ mit Text oder Auswahlfeld.
Nur bei 2 Auswahlfelder spinnt Ninox ein wenig rum. Aber den Tipp behalte ich jetzt im Hinterkopf. :-)
-
Noch mal zur Klarstellung: Wenn man den Textwert der gewählten Option eines Auswahlfeldes abfragen oder darstellen will, dann IMMER mit
text(AUSWAHLFELD)
Also bspw.
if text(AUSWAHLFELD) = "immobilier" then ...
bzw.
let myTxtChoice := text(AUSWAHLFELD)
Will man die numerische ID der gewählten Option abfragen oder darstellen, dann
if number(AUSWAHLFELD) = 1 then ...
bzw.
let myNumChoice := number(AUSWAHLFELD)
Gibt man so oder so nur AUSWAHLFELD ohne number() und text() an, geht Ninox als Standard davon aus, dass die ID gefragt ist und gibt wie bei number() deren numerischen Wert zurück. Deshalb ist die Angabe von number() optional, die von text() ggf. nicht.
Das heißt, deine ursprüngliche Formel war insofern falsch, als du ja eigentlich den Textwert von 'Objet' oder 'Genre' haben wolltest, dafür aber text(Objet) bzw. text(Genre) hättest schreiben müssen. Dass Ninox in dieser Konstellation statt der numerischen IDs immer den Textwert von 'Objet' zurückgegeben hat, ist wie gesagt m. E. ein Bug, der aber normalerweise gar nicht aufgetreten wäre.
Unabhängig von diesem Bug kann es zur besseren Lesbarkeit des Codes sinnvoll sein, ggf. auch number(AUSWAHLFELD) auszuschreiben, insbesondere dann, wenn mit Variablen verglichen wird (if AUSWAHLFELD = XY).
So, nun aber genug der Klugscheißerei. Hoffe, es ist jetzt verständlich.
-
war mir eh klar, aber ich habe ja am Anfang nicht den Text abgefragt, sondern die ID, und da genügt Type=1 (ohne number). Type="Genre" funktioniert eh nicht ohne text.
-
Ja die Abfrage des ersten Auswahlfeldes Type = 1 funktioniert ja auch. Und sie hätte auch mit text(Type) = "immoblier" funktioniert. Als Ergebnis wolltest du aber den Textwert des zweiten oder dritten Auswahlfeldes. Deshalb konnte das "then Objet else Genre" nicht funktionieren. Es musste heißen,
entweder:
if Type = 1 then text(Objet) else text(Genre) end
bzw.
if number(Type) = 1 then text(Objet) else text(Genre) end
oder
if text(Type) = "immobilier" then text(Objet) else text(Genre) end
Nur nochmal, damit andere nicht verwirrt werden.
Content aside
- vor 3 JahrenZuletzt aktiv
- 11Antworten
- 1196Ansichten