0

count mit zwei Bedingungen

Hallo,

ich bin ganz neu auf ninox und versuche mich gerade mit den Formeln vertraut zu machen. 

Momentan stecke in bei der Formel count im Zusammenhang mit select where. 

Ich möchte gerne eine Formel schaffen, die alle Datensätze in einer Untertabelle zählt, welche Status = zugesagt und Stimmfach = Sopran haben. 

Ich weiß nicht ob es relevant ist, aber diese Untertabelle ist sowohl mit der Tabelle Projekte als auch mit der Tabelle Kontakte verknüpft. 

Mein Ansatz wäre: count(select Projektteilnahme where "Kontakte.Stimmfach" = "Sopran" and "Projektteilnahme.Status" = "zugesagt")

aber leider funktioniert es nicht. 

Ich wäre um etwas Hilfe sehr froh :-) 

Vielen, vielen Dank

7 Antworten

null
    • Developer by Smartplanung
    • smartplanung
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Hallo Marion,

    Du hast bei dem Status nochmal die Tabelle Projektteilnahme in den Pfad reingenommen (Projektteilnahme.Status). Da Du aber schon im Select in der Projektteilnahme bist, wäre Status auf der selben Ebene. Stimmfach z.B. ist in einer unteren Ebene in der Tabelle Kontakte. Daher ist dort Kontakte.Stimmfach korrekt.

    Zudem hast Du die Adressierung zu den Feldern in Anführungszeichen gesetzt. Adressierungen gehen aber nur ohne Anführungszeichen oder mit einfachen Anführungszeichen ('xyz'), wenn z.B. Sonderzeichen oder Umlaute im Namen drin sind. 

    Die dritte Sache ist, was für ein Feld ist "Status"? Ein Auswahlfeld? Dann musst Du folgendes beachten. Spreche ich das Feld normal an, wird die ID der Auswahl zurückgegeben (1, 2, 3, usw.). Möchte ich den Text haben, muss ich diesen gezielt anfordern: text(Status). Also:

    text(Status) = "zugesagt"

    oder

    Status = 1 (was auch immer die ID für zugesagt ist - das siehst Du, wenn Du in die Feldoptionen gehst, rechts neben dem Auswahlnamen)

    cnt(select Projektteilnahme where Kontakte.Stimmfach = "Sopran" and text(Status) = "zugesagt")
    
    • Ninox-Professional
    • planoxpro
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Hallo Marion, ich nehme an, dass es sich bei 'Stimmfach' und 'Status' um Auswahlfelder handelt. Wenn man deren Textwert abfragen will, muss man das explizit angeben, ansonsten gibt Ninox die Nummer des Eintrags als Zahl zurück. Und die passt nicht zu dem Vergleichstext (z. B. "Sopran"). Die Feldbezeichnungen selbst wiederum werden nicht in doppelte Anführungszeichen gesetzt. Und wenn die Tabellen miteinander verknüpft sind, kann auch das "select" entfallen. Ich würde es mal so versuchen:

    cnt(Projektteilnahme[text(Kontakte.Stimmfach) = "Sopran" and text(Projektteilnahme.Status) = "zugesagt")
    
    • Marion_Feichter
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Hallo, 

    vielen, vielen Dank euch beiden! 

    So hats funktioniert: count(select Projektteilnahme where text(Kontakte.Stimmfach) = "Sopran" and text(Status) = "zugesagt")

    Gibt es eine Übersicht über Formeln, Operatoren, Syntax usw. ?

    Ich komme nicht aus der Informatik und kann auch nicht programmieren, deshalb währe es ganz praktisch, wenn ich mich irgendwo einlesen könnte. 

    Sollte also jemand eine Übersicht oder ähnliches haben wäre ich unglaublich froh darüber. 

    Dankee :-)

    • Marion_Feichter
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Dankeschön! 

    jetzt habe ich in meiner vorherigen Frage zu count doch noch ein Problem entdeckt. 

    Ninox greift laut Formel natürlich auf die Untertabelle Projektteilnahme zu und gleicht dort ab. Das ist ja grundsätzlich richtig. Das Problem ist nur, dass dort die Projektteilnahmen von mehreren Projekten eingespeichert sind, weshalb ich in meine Formel irgendwie noch einbauen müsste, dass nur die Datensätze zum jeweiligen Projekt ausgewählt werden. 

    Versteht man was ich meine?

    Danke

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

      Marion Feichter 

      Hallo Marion, um eine sicher funktionierende Lösung vorzuschlagen, müsste man mehr über das Datenmodell wissen, also die beteiligten Tabellen, Felder und Verknüpfungen. Deshalb spekuliere ich jetzt mal ein bisschen ...

      Wenn 'Projektteilnahme' tatsächlich eine Untertabelle der Tabelle ist, in der die cnt()-Formel läuft, dann müsstest du wahrscheinlich einfach nur das "select" weglassen und statt des "where" die Bedingung in eckige Klammern setzen:

      cnt(Projektteilnahme[text(Kontakte.Stimmfach) = "Sopran" and text(Status) = "zugesagt"])

      Wenn man so auf direkt auf die Verknüpfung zugreift, werden auch nur verknüpfte Datensätze berücksichtigt.

      Nutzt man hingegen "select", wird auf die gesamte Tabelle zugegriffen. Also auch auf alle Datensätze, die nicht mit dem aktuellen verknüpft sind.

      Sollte jedoch keine direkte Verbindung bestehen, dann könnte man das Projekt als weitere Bedingung in die Abfrage einbeziehen (sofern man sich im richtigen Projekt befindet):

      let myP := this;
      cnt(select Projektteilnahme where Projekt = myP and text(Kontakte.Stimmfach) = "Sopran" and text(Status) = "zugesagt")

      Man bräuchte dazu allerdings ein eindeutiges Kriterium, anhand dessen der betreffende Projekt-Datensatz identifiziert werden kann. Hier ist es die interne ID des aktuellen Projekt-Datensatzes. Es könnte aber auch ein bestimmtes Datenfeld sein.

      PS: Zum Thema Verknüpfungen hatte ich übrigens mal was geschrieben. Vielleicht hilft es ein wenig weiter:
      https://forum.ninox.de/t/p8h0t0r/einsteiger-tutorial-zu-verknupfungen-in-ninox

      • Marion_Feichter
      • vor 1 Jahr
      • Gemeldet - anzeigen

      planox. pro 

      Vielen, vielen Dank!

      Die erste Variante hat funktioniert! 

      So langsam, langsam verstehe ich worums bei den ganzen Dingen geht, ich vermute aber, dass noch einige Fragen meinerseits kommen werden😅

      Vielen Dank fürs Helfen!

Content aside

  • Status Answered
  • vor 1 JahrZuletzt aktiv
  • 7Antworten
  • 80Ansichten
  • 3 Folge bereits