0

Berechnung der Summe einer Spalte

Ich komme mit dem Befehl sum() nicht klar.

Ich bin dabei eine Lagerbewertung zu erstellen. Der Lagerwert ergibt sich als BESTAND * EINKAUFSPREIS, das ergibt ein Feld im Artikelstamm, genannt LAGERWERTERMITTLUNG ARTIKEL. In der Tabellenansicht kann ich mir die Summe über alle Artikel anzeigen lassen, soweit auch alles klar.

Nun wollte ich die Summe über eine Funktion ermitteln lassen und habe es mit sum(LAGERWERTERMITTLUNG ARTIKEL) versucht, das ergibt aber keine Summe, sondern immer nur den Lagerwert des Artikels, auf dem ich gerade stehe.

Auch eine Berechnung über eine Verknüpfung in einer anderen Tabelle (da wo ich die Auswertung machen will), ergab keinen Wert, hier kam immer Null raus. 

Kann mir jemand helfen und sagen, wie die Syntax lautet, wenn ich die Summe einer Spalte berechnen will?

41 Antworten

null
    • Ninox-Professional
    • planoxpro
    • vor 6 Jahren
    • Gemeldet - anzeigen

    So müsste es gehen:

     

    sum((select TABELLE).DATENFELD)

      • Frank_Heitmann.1
      • vor 3 Wochen
      • Gemeldet - anzeigen

       

      Ich hole mal so ein altes Thema wieder hoch. Ist es eigentlich möglich in einem Formelfeld die Spaltensumme/-maximun/-minimum etc. auszugeben OHNE Select? Performancetechnisch ist das ja bei etwas größeren Zeilenmengen nicht vertretbar.

      • Ninox-Professional
      • planoxpro
      • vor 3 Wochen
      • Gemeldet - anzeigen

       

      Man könnte die Datensätze in ein Array einlesen und dann summieren:

      let myArray := select TABELLE;
      sum(myArray.DATENFELD)

      Oder eine Schleife bilden. Ich glaube aber nicht, dass das schneller geht. Bei 1:N verknüpften Tabellen kann man das "select" auch komplett weglassen.

      Aber über wieviele Datensätze/Zeilen reden wir? Bei Formelfeldern sollte man aufpassen, dass die Berechnung nicht mehrfach ausgeführt werden muss. Wenn man eine solche Formel bspw. in jedem Datensatz hat, dann muss sie auch in jedem ausgeführt werden. Oder wenn man auf das Ergebnis zugreift, um es in weiteren Formelfeldern zu verarbeiten. Dann sollte man lieber mit Triggern arbeiten.

      • Frank_Heitmann.1
      • vor 3 Wochen
      • Gemeldet - anzeigen

       

      Also ich möchte das eigentlich in der selben Tabelle so haben, Beispiel:

      Nr    Spalte1     maxSpalte1
      -----------------------------
      1      2           4
      2      3           4
      3      4           4
      -----------------------------
             4
      

      Hintergrund ist, dass in Abhängigkeit eines Spaltenmaximums die einzelenen Datensätze skaliert werden sollen. Bisher mache ich das einfach per Sktript von einem Button ausgelöst: Einmal per Select das Spaltenmaximum ermitteln und dann für jeden Datensatz in das entsprechende Feld eintragen. Das sind in der Regel ein paar hundert und dauert dann schon auch ein paar Sekunden. Ist aber natürlich immer noch besser als mehrere Hundert selects auszuführen. Trotzdem bin ich an einer noch schnelleren Lösung interessiert.

    • OliverS
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Vielen Dank!!! So hat es funktioniert :)

    • OliverS
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Vielen Dank!!! So hat es funktioniert :)

    • Tacho
    • vor 6 Jahren
    • Gemeldet - anzeigen

    in einer verknüpften Tabelle hätte man auch ohne select arbeiten können:

    sum(Tabelle.Datenfeld)

    • Peter_Humm
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hat auch mir geholten - danke.

    Anschlussfrage:   ich möchte jeweils in einer Zelle das Total einer Spalte bis hierhin. Also nicht die Summe der ganzen Spalte, sondern nur jeweils bis zum aktuellen Eintrag. Gibt es dazu eine einfache Lösung ?

    Schon mal im Voraus bestend Dank

    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hallo Peter,

    ---

    let myNUM:=number(Nr);

    sum(select Tabelle where number(Nr)<=myNUM.Datenfeld)

    ---

    Leo

    • Peter_Humm
    • vor 6 Jahren
    • Gemeldet - anzeigen

    hmmmm..... da blick' ich nicht ganz durch.

    Ich habe eine Tabelle "Auto" mit den Spalten "Benzin Liter" und "Benzin total". Wenn ich also heute tanke, soll die eingegebene Anzahl Liter bei "Benzin total" hinzuaddiert werden. Mit meiner bisherigen Formel sum((select 'Auto').'Benzin Liter') wird auf jeder Zeile der gleiche Betrag angezeigt. Hinzu kommt, dass die von Ninox vergebenen Zeilen-Nummern nicht fortlaufend sind, weil ich zwischendurch mal einen Eintrag lösche. 

    Gruss, Peter

    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hallo Peter,

    Versuch mal so für 'Benzin Total':

    ---

    let myDate:=Tankdatum;

    sum (select Auto [Datum<=myDate].'Benzin Liter')

    ---

    Leo

    • Peter_Humm
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hi Leo

    Mit kleiner Änderung auf Datum in beiden Zeilen hat's geklappt. Vielen Dank

    Nun wollte ich auf diese Weise das danebenliegende Feld "Benzin Totalbetrag" ebenfalls als Summe von "Benzin Betrag" ermitteln. Natürlich änderte ich die Veriable myDate auf myAmount ab. Das resultiert mit einer Fehlermeldung "RangeError: Maximum call stack size exceeded". 

    Was mach' ich denn jetzt wieder falsch. 

    Gruss, Peter

    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Wie sieht die Formel aus? myDate hat mit Beträgen erstmal nichts zu tun, nur mit Datum. Theoretisch sollte es so gehen für "Benzin Totalbetrag":

    let myDate:=Tankdatum;

    sum (select Auto [Tankdatum<=myDate].'Benzin Betrag')

     

    Leo

    • Peter_Humm
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Vielen Dank, Leo

    Damit konnte ich meine Fahrzeug-Buchhaltungen fertigstellen - sie laufen jetzt so, wie ich mir das vorgestellt hatte. Ich find's halt schade, dass Ninox keine Importfunktion für Filemaker-Dateien kennt. Immerhin ist Ninox wohl DER Ersatz für Filemaker.... Ich habe bei den Ninoxern mal einen entsprechenden Wunsch geäussert. Der Umweg über Excel und .CSV ist halt nicht optimal, weil sämtliche Formeln verloren gehen. Aber vielleicht ist das ja gar nicht machbar - schau'n wir mal. 

    Schöne Zeit noch.... Gruss, Peter

    • Peter_Humm
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Weiss jemand, was es mit der Fehlermeldung "RangeError: Maximum call stack size exceeded" auf sich hat ?

    Die kommt bei mir ziemlich häufig, und danach ist die Formel weg.

    • bernd
    • vor 6 Jahren
    • Gemeldet - anzeigen

    bei der Fehlermeldung ruft sich die Funktion selbst wieder auf (oder üner Umwegen)... und irgendwann ist dann halt Schluß

    z.B. zwei Berechnungsfelder "Berechnung 1" und "Berechnung 2". In der ersten steht als Funktion sum("Berechnung 2") und in der zweiten steht Sum("Berechnung 1")... die beiden Funktionen rufen sich dann ständig gegenseitig auf...

    • Peter_Humm
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Danke Bernd

    Ich wollte bei der Eingabe eines Datensatzes eine Zahl aus dem letzten Datensatz verwenden und probierte es analog zu vorherigen Antworten so:

    let myDate := Tankdatum;
    'Kilometer alt' =((select 'Auto')[Tankdatum <= myDate].'Kilometer aktuell')

    Im nächsten Feld steht dann:  Distanz = 'Kilometer aktuell' - 'Kilometer alt'. 

    Kilometer alt soll also bei der Dateneingabe automatisch eingesetzt werden, sodass ich nur noch die aktuellen Kilometer eingeben muss. 

    • bernd
    • vor 6 Jahren
    • Gemeldet - anzeigen

    select gibt eine Tabelle zurück, Du mußt aber auf den letzten Datensatz zurück greifen mit:

    last

    last gibt dir den letzten Datensatz zurück, mit first den ersten Datensatz

     

    ich würde das aus der Ferne so machen: 'Kilometer alt' := last(select 'Auto' where 'Tankdatum' <= myDate).'Kilometer aktuell')

    • bernd
    • vor 6 Jahren
    • Gemeldet - anzeigen

    fehler: last((select... zwei klammern

    • Peter_Humm
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Tja - das bringt zwar einen Eintrag in der gewünschten Zelle, der lautet aber auf "Nein" statt einer Zahl :-)

    • bernd
    • vor 6 Jahren
    • Gemeldet - anzeigen

    'Kilometer alt' := last(select 'Auto' where 'Tankdatum' <= myDate).'Kilometer aktuell'

    teste es mal so

    • Peter_Humm
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Zum Verzweifeln.... Wie ich's auch drehe, es kommt immer "Nein" oder "0" dabei raus. last() liefert offenbar nicht den gewünschten Wert.
    Derzeit versuche ich, ein solches Script beim Anlegen eines neuen Datensatzes zu starten - komme aber nicht weiter.

    Hier nochmals der Sinn der Übung:  

    'Kilometer alt' soll bei der Eingabe eines neuen Datensatzes automatisch eingesetzt werden, sodass ich nur noch die aktuellen Kilometer eingeben muss. Die folgende Berechnung der Distanz ist dann kein Problem 

    • bernd
    • vor 6 Jahren
    • Gemeldet - anzeigen

    wenn myDate das aktuelle, neue Datum ist dann muß 'Tankdatum' < myDate   sein

    • Peter_Humm
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Das war's (< statt <=) !!!       Vielen Dank

    Aktuell sieht die Formel so aus:
    let myDate := Datum;
    'Kilometerstand alt' := last((select 'Auto' where Datum < myDate).Kilometerstand aktuell)

    Wichtig war noch die doppelte Klammer, sonst ging's nicht. Jetzt läuft's aber wieder wie vorher unter FileMaker.

    • Peter_Humm
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Zwei Fragen drängen sich mir grad noch auf: 

    was bedeutet das ":=" im Unterschied zu "=" ??

    Gibt es in Ninox keine Kommentare in Scripts ?  Ich kannte bisher das "--", was aber in Ninox nicht funktioniert.