Filter bei Summe
Hallo zusammen,
anbei 2 Fragen bei denen ich grade irgendwie eine Blockade hab.
Ich hab hier folgenden Code:
let AA := unique(Tage_n.Rezept_1.Zutaten_n[Produkt_1.BestBuy = kk].Produkt_1.Bezeichnung);
let BB := for ii in AA do
let SS := sum(Tage_n.Rezept_1.Zutaten_n[Produkt_1.Bezeichnung = ii].M);
let EIN := first(Tage_n.Rezept_1.Zutaten_n[Produkt_1.Bezeichnung = ii].Produkt_1.ME);
ii + " - " + format(round(SS, 2), "0.##") + " " + EIN
end;
In der ersten Zeile müsste der Filter doch auch weiter hinten gesetzt werden können...also so:
let AA := unique(Tage_n.Rezept_1.Zutaten_n.Produkt_1[BestBuy = kk].Bezeichnung);
Ich bekomm dann aber die Fehlermeldung "Expression does not return multiple values". Ebenso in Zeile 4. Dadurch ist jedoch der Teil "Produkt_1" in der Zeile doppelt enthalten, was irgendwie nicht sehr elegant ist.
Weiterhin die Frage, wie ich bei verknüpften Tabellen mit "where" anstatt "[]" arbeiten kann.
sum((Tage_n.Rezept_1.Zutaten_n where Produkt_1.Bezeichnung = ii).M)
Funktioniert "where" nur mit der anweisung "select"?
Mit "select" kann ich jedoch nicht arbeiten, da mir so die direkte Verknüpfung verloren geht und eine Zutat z.B. in mehreren Rezepten auftauchen kann.
Viele Grüße
Johannes
4 Antworten
-
Hallo Johannes, ich vermute(!) mal, dass 'Produkt_1' (trotz des Namens) die N-Seite der Verknüpfung darstellt, also prinzipiell nur 1 Datensatz zurückgibt. Und bei nur einem Datensatz ergibt ein Filter natürlich schon technisch keinen Sinn. Es sollen, wenn ich es richtig verstehe, ja auch nicht Produkte gefiltert werden, sondern Zutaten, deren verknüpftes Produkt einer bestimmten Bedingung entspricht (BestBuy = kk). 'Zutaten_n' ist also quasi die aktive Instanz, deshalb muss man immer wieder den Namen der Verknüpfung davor schreiben, wenn man auf verschiedene Felder der Tabelle 'Produkt_1' zugreifen will.
Zur Syntax: Ja, "where" ist ein Parameter der "select"-Anweisung. Verknüpfte Tabellen spricht man direkt an, also ohne "select", zum Filtern nutzt man dabei immer eckige Klammern. Die man übrigens auch beim "select" statt des "where" nutzen kann. Aber "where" ohne "select" funktioniert m. W. nicht.
Sollte ich zum einen und/oder anderen Thema Blödsinn geschrieben haben, bitte ich um schonungslose Kritik.
-
Da hast du Recht. 'Produkt_1' stellt die N-Seite dar.
Wobei die Systematik bei meiner Benennung dazu da ist, dass ich weiß wie viele Werte in dem Feld stehen. Auf der N-Seite kann das Feld nur 1 Wert annehmen, auf der 1-Seite entsprechend mehrere. Hilft mir bei den Überlegungen, ob ich noch ein sum oder concat brauche.
Irgendwie leuchtet alles ein, was du schreibst...ich komm nur nie selbst darauf, wenn ich davor sitzte.
-
Hast du vielleicht auch eine Erklärung, warum
-----
let my := this;
let REZ := (select Rezepte where last(Tage.Wochenplan) = my).Bezeichnung;
cnt(REZ) + "
" + join(REZ, "
")
-----
funktionier, aber nicht
-----
let my := this;
let REZ := (select Rezepte where last(Tage.Wochenplan) != my).Bezeichnung;
cnt(REZ) + "
" + join(REZ, "
")
-----
Sobald ich 'let my := this.Nr' und 'last(Tage.Wochenplan).Nr' schreibe gehts auch beim Ist-Nicht-Vergleich...
VG
-
Puh, solche Konstrukte mit "select ... where last(..." habe ich selbst noch nie genutzt. Es könnte aber was damit zu tun haben, dass die Datensatz-ID alphanumerisch sortiert wird, weshalb es bei first() und last() oft zu unerwarteten Ergebnissen kommt. Bei "select" kann man mit "order by Nr" arbeiten, aber hier bezieht sich last() ja auf die Verknüpfung, da besteht die Möglichkeit vermutlich nicht. Ich würde deshalb bei beiden Abfragen mit "Nr" arbeiten, eventuell sogar mit number().
Content aside
- vor 4 JahrenZuletzt aktiv
- 4Antworten
- 575Ansichten