0

If auf Auswahlfehl in verknüpfter Tabelle

Liebe Ninox Experten,

 

ich stehe gerade irgendwie auf dem Schlauch. Ich habe eine Tabelle "Kunden" und eine verknüpfte Tabelle (1:n) "Wartungen".

 

Ich möchte eine Funktion in der Ansicht für Kunden ausführen, die nur ausgeführt werden soll, wenn es in der Tabelle Wartungen ausschließlich solche gibt, die den Status "abgeschlossen" (5) haben.

 

if Wartungen.Status != 5 then

alert("Es besteht noch eine offene Wartung. Bis diese abgeschlossen ist, kann keine neue Wartung angelegt werden.")

else

[Code zur Anlage einer neuen Wartung]

end

Habe es auch schon mit einer Select Anweisung und vorheriger Variablenzuweisung versucht. Irgendwie stehe ich auf dem Schlauch, da die Ergebnismenge ja größer 1 ist und die If Abfrage damit wahrscheinlich ein Problem hat!?

 

Habt Ihr einen Ansatz / Tipp für mich?

 

VG

 

Arne

9 Antworten

null
    • Arne.1
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Das war die Variante mit Select:

     

    let xOffeneWartungen := (select Wartungen where Kunde = me and Status != 5);
    if xOffeneWartungen then

     

    Er scheint den Status nicht auszuwerten. Die Bedingung matched so immer : /

    • Arne.1
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Habs. Man muss bei der Select Anweisung anscheinend ein Feld mit ausgeben. Einfach nur das Select in die Variable zu schreiben hat nicht gereicht um die Variable nachher auf leer oder nicht leer prüfen zu können.

    So hat's jetzt bei mir geklappt:

     

    let xOffeneWartungen := (select Wartungen where Kunde = me and Status != 5).Nr;
    if xOffeneWartungen != "" then
    alert("Es besteht noch eine offene Wartung. Bis diese abgeschlossen ist, kann keine neue Wartung angelegt werden.")
    else

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

    Hallo Arne, zur Überprüfung, ob alle Wartungen abgeschlossen sind, könnte man die Einträge einfach zählen und mit der Gesamtzahl vergleichen. Da die Tabellen miteinander verknüpft sind, geht das auch ohne "select":

    if cnt(Wartungen[Status = 5]) < cnt(Wartungen) then
        alert("Hier dein Text")
    else
        Hier_dein_Code    
    end

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

    Oder, wie mir gerade auffällt, noch einfacher, in dem man gleich die Einträge ungleich 5 zählt. ;)

     

    if cnt(Wartungen[Status != 5]) > 0 then
    ...

    • Arne.1
    • vor 4 Jahren
    • Gemeldet - anzeigen

    ja, wie cool. Auch eine super Idee. Und noch einfacher. Ich glaube, das baue ich noch so um. Danke!

    • Arne.1
    • vor 4 Jahren
    • Gemeldet - anzeigen

    wann nehme ich eigentlich als bedingung eckige Klammern und wann ein where? Gibt es dafür irgend eine Regel?

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

    Die eckigen Klammern nutzt man bei verknüpften Tabellen (ohne "select", siehe oben). Sie funktionieren prinzipiell aber auch bei nicht-verknüpften, auf die man per "select" zugreift. Die ninox-interne Verarbeitung ist dann wohl etwas anders. Im Ergebnis macht es aber keinen Unterschied.

    Ich selbst habe mir angewöhnt, beim "select" immer "where" zu nutzen. Das ist aber eher ein persönliches Ding, für das ich jetzt keine überzeugende Begründung angeben kann. Außer der, dass ich bisher gut damit gefahren bin. ;)

    • Arne.1
    • vor 4 Jahren
    • Gemeldet - anzeigen

    danke! Erprobte Wege ersparen viele graue Haare. Von daher, Begründung brauche ich nicht. Mir reicht, dass es bei Dir bisher so gut funktioniert : )

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

    Nachtrag: Wenn Datumsfelder abgefragt werden, kann das ein Grund für die Nutzung eckiger Klammern beim "select" sein. Siehe 
    https://ninox.com/de/forum/technische-hilfe-5ab8fe445fe2b42b7dd39ee8/falsches-geburtsdatum-5f16790a233e2a0931020e76?post=5f1695ac233e2a0931020e7e&page=1