0

Summe mit Datumseinschränkung

Wir möchten einen Liquiditätsplan erstellen. 
Es gibt schon Tabellen mit generellen Kosten, Einnahmen, Projektkosten, Personalkosten usw. 
Daher müssen wir die jeweiligen Summen aus diesen Tabellen übernehmen. 

Die Idee ist, zunächst alle Positionen für einen Monat in die Tabelle Liquidität zu übertragen. 
Dabei aber nur die Werte, welche innerhalb eines Datums liegen. 

Liquidität hat also die Felder: Datum von, Datum bis, Text und dann die Berechnungen aus z.B. Kosten. In den Kosten Tabellen gibt es immer Felder für die Fälligkeit. 

Ich möchte nun also in einer Zeile zunächst die Berechnungen aller Kosten im November zusammenfassen. 

Ich habe einiges versucht: 
sum((select Kosten)['Datum von' <= Kosten.'Fällig'] and ['Datum bis' >= Kosten.’Fällig'])

let varsummen := ['Datum von' <= Kosten.'Fällig'] and ['Datum bis' >= Kosten.'Fällig'];
sum((select Kosten).Summe);

Komme aber nicht ans Ziel. Hätten Sie eine Idee? 

16 Antworten

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

    Hallo, ungeachtet sonstiger Gegebenheiten und Zusammenhänge sehe ich neben der Syntax vor allem das Problem, dass die Funktion sum() keinen Feldbezug hat. Ein möglicher Ansatz wäre folgender:

    sum((select Kosten where 'Datum von' <= Kosten.'Fällig' and 'Datum bis' >= Kosten.’Fällig').Betrag)

    Wobei "Betrag" beispielhaft für den tatsächlichen Namen des Feldes steht, dessen Inhalt summiert werden soll.

    • schleich
    • vor 5 Jahren
    • Gemeldet - anzeigen

    sum((select Kosten where ['Datum von' <= Kosten.'Fällig'] and ['Datum bis' >= Kosten.’Fällig']).Summe)

    sum((select Kosten where 'Datum von' <= Kosten.'Fällig' and 'Datum bis' >= Kosten.’Fällig')Kosten.Summe)

    Ich habe mal diese Varianten ausprobiert. Hier findet er die Tabellenspalte in Spalte 36 nicht. Also das Datum von wenn ich es richgitg verstehe. 

    Im Grunde hat die Tabelle Liquidität die Felder Datum von, Datum bis und "Berechnung" in der ich diese Formel einfügen möchte. 

    Die Tabele Kosten hat die Felder Fällig worauf sich meine Datumsabfrage beziehen soll und ein berechnetes Feld "Summe" worin die Summen stehen die adiert werden sollen. 

    Danke für die Hilfe und viele Grüße, Marc 

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

    Vielleicht so?

    sum((select Kosten where 'Datum von' <= Kosten.'Fällig' and 'Datum bis' >= Kosten.’Fällig').Summe)

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

    Ach nee, Quatsch, ich hatte die Zeile einfach per Copy and Paste übernommen ....

     

    Eher so:

     

    let Stichtag := 'Fällig';

    sum((select Kosten where 'Datum von' <=  Stichtag and 'Datum bis' >= Stichtag).Summe)

    • schleich
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Ich denke wir kommen der Sache näher. 

    let Stichtag := Kosten.'Fällig';
    sum((select Kosten where 'Datum von' <= Stichtag and 'Datum bis' >= Stichtag).Summe)

    Ich habe in der ersten Zeile die Kosten. ergänzt. Sonst finder er das Feld nicht. 
    Jetzt meldet er aber immer noch den Fehler in Zeile 2. Spalte 36. Also das Feld 'Datum von'. 

    Dieses müsste er doch finden? 

    let Stichtag := Kosten.'Fällig';
    sum((select Kosten where Liquidität.'Datum von' <= Stichtag and 'Datum bis' >= Stichtag).Summe)

    Kann es sein, dass er ein Problem mit dem Umlaut in dem Tabellennamen hat? 

    • schleich
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Habe es getestet. Am Umlaut scheint es nicht zu liegen. 

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

    Tabellen- und Feldnamen mit Umlauten, Leer- und sonstigen Sonderzeichen müssen halt immer in einfache Anführungszeichen gesetzt werden. Dann funktionieren sie.

     

    Ich habe aber auch ein Problem mit der Logik. Frei interpretiert würde das Ganze sinnvoller, wenn es in der Tabelle 'Kosten' ein Datumsfeld 'Fällig' gäbe, das nach 'Datum von' und 'Datum bis' gefiltert würde, also genau umgekehrt. Wobei mir nicht ganz klar ist, wo diese beiden Daten herkommen. Falls sie aber Bestandteil der Tabelle sind, von der aus die Funktion gestartet wird, dann wäre die nächste Idee:

     

    let VonDat := 'Datum von';
    let BisDat := 'Datum bis';
    sum((select Kosten where 'Fällig' <=  VonDat and 'Fällig' >= BisDat).Summe)

     

    Ansonsten nenn doch bitte mal die beteiligten Tabellen und Felder, soweit sie für die Aufgabe relevant sind.

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

    Ich antworte mir mal selbst ... 

    Das Schema zum Filtern einer Tabelle lautet:

    select TABELLE where FELDNAME = Bedingung

    Wobei FELDNAME ein Feld von TABELLE sein muss. Laut Ausgangsposting befinden sich die zu filternden Felder 'Datum von' und 'Datum bis' aber in der Tabelle 'Liquidität', das Vergleichsdatum 'Fällig' hingegen in der Tabelle 'Kosten'. Sollte dem tatsächlich so sein, dann müsste man beim select also die Tabelle 'Liquidität' ansprechen, nicht 'Kosten'. Aus der Tabelle 'Kosten' heraus zum Beispiel so:

    let Stichtag := 'Fällig';
    sum((select 'Liquidität' where 'Datum von' <= Stichtag and 'Datum bis' >= Stichtag).FELDNAME)

    Der umgekehrte Weg aus der Tabelle 'Liquidität' heraus:

    let VonDat := 'Datum von';
    let BisDat := 'Datum bis';
    sum((select Kosten where 'Fällig' >= VonDat and 'Fällig' <= BisDat).FELDNAME)

    Wobei FELDNAME natürlich jeweils durch den Namen des Feldes mit dem zu summierenden Betrag in der mit select abgefragten Tabelle ersetzt werden müsste.

    • schleich
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Das funktioniert! VIELEN DANK!
    Ich musste nur die operatoren umdrehen. 
    Richtig (in meinem Fall) ist also: 

    let VonDat := 'Datum von';
    let BisDat := 'Datum bis';
    sum((select Kosten where 'Fällig' >= VonDat and 'Fällig' <= BisDat).Summe)

     

    Ich habe das ganze nun auf mehrere Tabellen angewendet. Bei einer, gibt es eine Untertabelle. 
    Hier werden Projekte eingetragen und in der genannten Untertabelle die Extrenen Kosten eingetragen. Wenn ich hier das gleiche Prinzip anwende, wird in Zeile 3 Spalte 43 ein ")" erwartet. Habe ich hier einen Syntax fehler? Ich habe verucht alles so genau wie möglich anzugeben, damit das System alle Felder genau finden kann. 

    let VonDat := 'Datum von';
    let BisDat := 'Datum bis';
    sum((select Projekte.'Externe Kosten' where Projekte.'Externe Kosten'.'Fällig' >= VonDat and Projekte.'Externe Kosten'.'Fällig' <= BisDat).Projekte.'Externe Kosten'.'Kosten Brutto')

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

    Puh, da blicke ich jetzt so auf die Schnelle nicht wirklich durch. Aber grundsätzlich: Wenn man mit select eine Tabelle anspricht, dann bezieht sich alles folgende auf diese Tabelle. Man muss den Tabellennamen nicht jedesmal wieder mit angeben, sondern spricht dann nur noch die in dieser Tabelle befindlichen Felder an (siehe "select Kosten where 'Fällig'").

     

    Wenn also 'Externe Kosten' eine Tabelle ist, in der die 'Kosten Brutto' innerhalb des Zeitraumes summiert werden sollen, dann würde ich so ganz spontan sagen, dass man nur Tabellen- und Feldnamen austauschen muss:

     

    let VonDat := 'Datum von';
    let BisDat := 'Datum bis';
    sum((select 'Externe Kosten' where 'Fällig' >= VonDat and 'Fällig' <= BisDat)'Kosten Brutto')

     

    Falls die Konstellation komplizierter ist, wäre es wie gesagt hilfreich, mehr über das Datenmodell und die beteiligten Tabellen bzw. Felder zu wissen.

    • schleich
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Bildschirmfoto 2018-12-04 um 15.05.45

    Okay, vielen Dank. So sieht das bei mir aus. 
    Extrene Kosten, liegt als Untertabelle unter Projekte. Ich verstehe nicht, warum sich die Tabellen Felder nicht ansprechen lassen. 

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

    Ich hatte vor 'Kosten Brutto' den Punkt vergessen. Davon abgesehen müsste es so funktionieren, wie ich es oben geschrieben hatte. Noch mal mit Punkt: 

     

    let VonDat := 'Datum von';
    let BisDat := 'Datum bis';
    sum((select 'Externe Kosten' where 'Fällig' >= VonDat and 'Fällig' <= BisDat).'Kosten Brutto')

     

    Nebenbei: Um eine Tabelle aus einer anderen heraus abzufragen, müssen nicht beide miteinander verknüpft sein. Man kann jede Tabelle einfach direkt über den Namen ansprechen.

    • schleich
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Das hatte ich zwischenzeitlich auch getestet. 
    Wenn ich die Abfrage so nehme, findet er die Tabelle Kosten Extern nicht. 

    let VonDat := 'Datum von';
    let BisDat := 'Datum bis';
    sum((select 'Externe Kosten' where 'Fällig' >= VonDat and 'Fällig' <= BisDat).'Kosten Brutto')

    Also muss ich diese, da Sie in der Struktur auch eine Untertabelle von Projekte ist vermutlich auch benennen. 
    Wäre ein erster Schritt, weil sich die Fehlermeldung dann wie oben auf das erwartete Symbol bezieht. 

    let VonDat := 'Datum von';
    let BisDat := 'Datum bis';
    sum((select Projekte.'Externe Kosten' where 'Fällig' >= VonDat and 'Fällig' <= BisDat).'Kosten Brutto')

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

    Dann bin ich auch überfragt. Ich habe die Konstellation, soweit sie für mich erkennbar ist, extra noch mal mit Minimaldaten nachgestellt. Und bei mir funktioniert es:

     

    Kostenabfrage1

    Der Screenshot zeigt den Code eines Berechnungsfeldes in der Tabelle 'Liquidität'. Und es werden korrekt alle Werte der Spalte 'Kosten Brutto' im angebenen Zeitraum summiert. Warum dasselbe bei dir nicht funktionert - keine Ahnung. Eigentlich ist es ja eine recht simple Sache.

    Vielleicht hat jemand anderes eine Idee, woran es liegen könnte?

    • schleich
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Wow! Vielen Dank für die Mühe! 

    Ich habe den Fehler gefunden. Die Tabelle Externe Kosten war bei mir mit "Extrene Kosten (Projekt) benannt. Das wurde aber nicht wie woben in dem Screen angezeit und wenn man die Felder direkt mit einem Klick eingefügt hat auch nicht berücksichtigt. Deshalb wohl auch die Meldung mit dem erwarteten Symbol ")". Ich habe die Tabelle nun umbenannt und es funktioniert genau wie von dir angegeben. 

    Nochmals vielen Dank! 

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

    👍

Content aside

  • vor 5 JahrenZuletzt aktiv
  • 16Antworten
  • 5001Ansichten