0

Summenprodukt

Gibt es die Möglichkeit (ähnlich wie bei Excel) das Summenprodukt mehrerer Spalten (Felder) zu bilden? Derzeit löse ich das über eine Hilfsspalte.

12 Antworten

null
    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hallo Johanes,

    die Formel dazu (ähnlich wie bei Excel)

    ---

    sum(Feld1,Feld2,Feld3......)

    ---

    Leo

    • john_eans
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hallo Leo,

    erstmal vielen Dank für die schnelle Antwort.

    Aber leider passt das nicht ganz, hier werden nur alle Werte in Feld 1 zu den Werten in Feld 2 addiert, aber nicht multipliziert.

    SpalteA _ SplateB _ SpalteC

    a1 * b1 = c1

    a2 * b2 = c2

    a3 * b3 = c3

    ....

     

    x = c1 + c2 + c3 ...usw

    Ich würde nun eben gerne auf die Spalte C verzichten. In Excel würde man nun schreiben x = Summenprodukt(SpalteA;SpalteB).

    Hintergrund ist, dass ich gerne auf das Feld C verzichten würde. Nun kann man zwar in der Ansicht der Haupttabelle der Ansicht der Untertabelle eine Spalte mit formel hinzufügen und kann in der Fußzeile der Untertabelle auch die Summe ausweisen, jedoch kann ich nicht mit dieser Summe weiterrechnen.

    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Ah so. Dann:

    ---

    sum (select 'Deine Tabelle'.(a*b))

    ---

    Leo

    • john_eans
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Okay, so bekomm ich das Summenprodukt, perfekt. Allerdings von der gesamten Tabelle und nicht nur von den in der Untertabelle ausgewählten Rezepten.

    https://www.dropbox.com/s/dy0tg2thiyysnwe/Rezepte.ninox?dl=0

    In der Tabelle "Menü" werden einem Menü Rezepte zugeordnet. Hier kann ich in der Untertabelle dann auch weitere Splaten hinzufügen und diese in der Fußzeile der Untertabelle aufsummieren lassen. Ich kann aber die Summe nicht "weiterverwenden" und dachte ich komme hier irgendwie mit dem Summenprodukt weiter.

    Wenn du hier noch ne Idee hast, wäre super..

     

    Johannes

    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hallo Johannes,

    für Summen:

    ---

    sum(Positionen.Rezepte.('Rezept-Portionen' * '€ pro Portion'))

    ---

    für Auflistung der Produkte mit Mengen:

    ---

    let AA := unique(Positionen.Rezepte.Zutaten.Produkt.Produkt);
    var TT := "";
    for II in AA do
    let SS := sum(Positionen.Rezepte.Zutaten[Produkt.Produkt = II].Menge);
    let EE := II + " " + SS;
    TT := TT + ";" + EE
    end;
    let myARRAY := split(TT, ";");
    join(myARRAY, "
    ")

    ---

    Leo

    • john_eans
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hallo Loe,

    einfach spitze! Die Summe funktioniert genau so wie ich es mir gedacht habe. Die Auflistung funktioniert ebenfalls. Ans verstehen mach ich mich dann morgen ;-)

    Herzlichen Dank!

    • john_eans
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Bei der Auflistung der Produkte mit Mengen hätte ich noch eine Frage:

    Die Funktion join() müsste das Trennzeichen eigentlich "hinter" die einzelnen Einträge stellen, stellt diese momentan allerdings vor die einzelnen Einträge. Daraus resultiert auch irgendwie eine Leerzeile ganz oben.

    Wie könnte ich denn zum beispiel noch die Einheiten hinzufügen und/oder das Zahlenformat der Menge ändern?

    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hallo Johannes,

    "Join" macht schon alles richtig - schuld an der leeren Zeile oben ist das Semikolon in dem Array. 

    Eine Formel, um alle deine Wünsche zu erfüllen:

    ---

    let AA := unique(Positionen.Rezepte.Zutaten.Produkt.Produkt);
    var TT := "";
    for II in AA do
    let SS := sum(Positionen.Rezepte.Zutaten[Produkt.Produkt = II].Menge);
    let EIN := first(Positionen.Rezepte.Zutaten[Produkt.Produkt = II].Einheit);
    let EE := II + " " + format(SS, "0.#") + " " + EIN;
    TT := if TT = "" then EE else TT + ";" + EE end
    end;
    let myARRAY := split(TT, ";");
    join(myARRAY, "
    ")

    ----

    Leo

    • john_eans
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hallo Leo,

     

    perfekt. Vielen Lieben Dank!

    • john_eans
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Soo...bisher hat alles super funktioniert.

    Jetzt habe ich die Anwendung um eine Mengenangabe der Cocktails (Positionen sind mittlerweile Cocktails) erweitert. Ich kann also angeben, dass Cocktail A 10 mal, Cocktail B aber nur 8 mal benötigt wird.

     

    ___

    let AA := unique(Cocktails.Rezepte.Zutaten.Produkt.ProduktName);
    var TT := "";
    for II in AA do
    let SS := sum(Cocktails.Rezepte.Zutaten[Produkt.ProduktName = II].(Menge * Rezept.Cocktails.Menge));
    let EIN := first(Cocktails.Rezepte.Zutaten[Produkt.ProduktName = II].Einheit);
    let EE := II + " " + format(SS, "0.#") + " " + EIN;
    TT := if TT = "" then EE else TT + ";" + EE end
    end;
    let myARRAY := sort(split(TT, ";"));
    join(myARRAY, "
    ")")

    ___

    hier bekomm ich aber die Fehlermeldung "Ungültiger Operator: number * [number] in Zeile 4 Spalte 117"

    Ich hoffe es ist verständlich was ich machen möchte...

    Vielen Dank im Voraus!

    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Dein Konstrukt  Rezept.Cocktails.Menge gibt ein Array zurück. Ich würde dies mit summe zusammenführen.

    let SS := sum(Cocktails.Rezepte.Zutaten[Produkt.ProduktName = II].(Menge * sum(Rezept.Cocktails.Menge)));

    Leo

    • john_eans
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Achso...
    Jetzt hatte ich kurz einen Hänger und hab überlegt was er denn alles mit in das Array nimmt. Durch das Aufsummieren werden alle Cocktails an jedem Abend berücksichtigt. Ich glaube/hoffe, dass ich das jetzt mit dem Filter ausgeschlossen hab. Das Überprüfen ist schon etwas komplexer geworden ;-)

    ___

    let CA := Nr;
    let AA := unique(Cocktails.Rezepte.Zutaten.Produkt.ProduktName);
    var TT := "";
    for II in AA do
    let SS := sum(Cocktails.Rezepte.Zutaten[Produkt.ProduktName = II].(Menge / Rezept.'Rezept-Portionen' * sum(Rezept.Cocktails[Cocktailabend.Nr = CA].Menge)));
    let EIN := first(Cocktails.Rezepte.Zutaten[Produkt.ProduktName = II].Einheit);
    let EE := II + " " + format(SS, "0.#") + " " + EIN;
    TT := if TT = "" then EE else TT + ";" + EE end
    end;
    let myARRAY := sort(split(TT, ";"));
    join(myARRAY, "
    ")

    ___

    So klappt es glaube ich..zumindest in ersten Tests, bin mal gespannt, ob irgendwann krumme Dinger raus kommen :-P

    Ich dank dir vielmals!