0

Hallo, wie kann ich die Differenz bilden aus den Werten in einer Spalte ?

Ich möchte meine Zählerstände (wie Gas, Strom usw.) monatlich aufschreiben und habe dazu eine Tabelle angelegt mit den Spalten Ablesedatum und Zählerstände. Jetzt möchte ich mir in einer dritten Spalte den Verbrauch ausrechnen lassen, also die Differenz der Zählerstände zwischen 2 Ablesedaten und jeweils in der Zeile des älteren Ablesedatums eintragen lassen. Welche Formel muss ich dazu verwenden ?

17 Antworten

null
    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hallo Mario,

    die Formel für das Berechnungsfeld 'Verbrauch' wäre:

    ---

    let myDate:=Ablesedatum;

    let oldDate:=max(select 'DEINE TABELLE' where Ablesedatum<myDate.Ablesedatum);

    'Zählerstände'-first(select 'DEINE TABELLE' where Ablesedatum=oldDate).'Zählerstände'

    ---

    Leo

    • Mario
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Ich habe jetzt die Formel mit meinem Tabellenname in das Feld "Verbrauch" eingetragen

    let myDate:=Ablesedatum;
    let oldDate:=max(select 'Hauptgaszähler' where Ablesedatum<myDate.Ablesedatum);
    'Zählerstände'-first(select 'Hauptgaszähler' where Ablesedatum=oldDate).'Zählerstände'

    jetzt meldet Ninox den Fehler:

    Expression does not return a record: myDate in Zeile 2, Spalte 66

    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen

    ---

    if 'Zählerstände' then
    let myDate := Ablesedatum;
    let oldDate := max((select 'Hauptgaszähler')[Ablesedatum < myDate].Ablesedatum);
    'Zählerstände' - first((select 'Hauptgaszähler')[Ablesedatum = oldDate]).'Zählerstände'
    end

    ---

    • Mario
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Ich habe die neue Formel heute ausprobiert und sie funktioniert bis auf die erste Zeile. Wahrscheinlich rechnet Ninox die Differenz zwischen ersten Zählerstand und 0 so das Zählerstand und Verbrauch gleich ist. Daraufhin habe ich noch ein Feld angelegt als Anfangszählerstand und habe die Formel erweitert

    if 'Zählerstände' = 'Anfangszählerstand' then
    0
    else

    if 'Zählerstände' then
    let myDate := Ablesedatum;
    let oldDate := max((select 'Hauptgaszähler')[Ablesedatum < myDate].Ablesedatum);
    'Zählerstände' - first((select 'Hauptgaszähler')[Ablesedatum = oldDate]).'Zählerstände'
    end
    end

    jetzt kann ich den gleichen Wert eintragen wie es in "Zählerstände" steht und bekomme dann als Verbrauch 0 raus. Damit bekomme ich evtl. auch einen Zählerwechsel hin.

    Erstmal recht vielen Dank für die Hilfe.

    Gibt es für solche Begriffe wie "let" usw Unterlagen oder Internetseiten was diese Ninox-Sprache bedeutet oder es erlernen kann, da ich in diesem Gebiet ein absoluter Anfänger bin, wenn die Formeln zu komplex werden. 

    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hallo Mario,

    Es gibt in der Hilfe eine Funktions und Sprachreferenz auf englisch

    https://ninoxdb.de/de/manual/erweiterte-Berechnungen/funktions-und-sprachreferenz

     

    Using Variables
    Sometimes it can be useful to store the result of a intermediate calculation and do further calculations based on that result. Consider the case where you want to check the age of a person like:

    if age(Birthdate) > 18 then "Grown-up"
    else if age(Birthdate) > 12 then "Teenager"
    else "Child"
    end
    Since age(Birthday) is used multiple times, things may be simplified with a variable which stores the result of the age calculation:

    let a := age(Birthdate);

    if a > 18 then "Grown-up" else if a > 12 then "Teenager" else "Child" end

    A variable is declared with a let statement:

    let variable := expression;

    Any expression following that let statement can make use of that variable.

    var variable := expression

    These variables can be modified afterwards, such as in loops.

    let x := 1; ...; x := x + 1;
    var y := 1; ...; y := y + 1;

    Leo

    • Mario
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Ok, da werde ich da mal nachschauen.

    Nochmals vielen Dank.

    mfg

    Mario

    • Mario
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hallo,

    ich scheitere schon wieder an einer Formel mit Werten aus einer Spalte. Und zwar habe ich in meiner Tabelle 'Hauptgaszähler' noch ein Feld 'Verbrauch in €' angelegt und berechnen lassen - funktioniert - und ein Feld 'Jahr' für die Jahreszahl (z.B. 2018). Nun möchte ich in einem weiteren Feld 'Verbrauch in €/Jahr' alle Werte aus 'Verbrauch in €' aufsummieren lassen, die in dem gleichen Jahr angefallen sind und müsste dann zum nächsten Jahr (z.B. 2019) neu anfangen mit aufsummieren, so das ich in der letzten Zeile des Jahres den genauen Jahresverbrauch raus bekomme. Wäre das irgendwie möglich ?

    (einmal angefangen mit einer Tabelle versucht man sie immer mehr zu erweitern)

    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hallo Mario,

    da du schon ein Ablesedatum hast, brauchst du das Feld Jahr für die Berechnung gar nicht. Man kann es so für ein Funktionsfeld schreiben:

    ---

    let myYear:=year(Ablesedatum);

    sum(select 'Hauptgaszähler'[year(Ablesedatum)=myYear].'Verbrauch in €')

    ---

    Leo

    • Mario
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Ich habe das Jahr mit reingenommen, weil mein Ablesedatum am 1. des Folgemonats ist und somit am Jahresende der letzte Eintrag (z.B. Dezember 'Ablesedatum' der 1.1. im Folgejahr) zum nächsten Jahr mit dazu gerechnet wird. 

    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Ah so, dann ist es noch einfacher:

    ---

    let myYear:=Jahr;

    sum(select 'Hauptgaszähler'[Jahr=myYear].'Verbrauch in €')

    ---

    Leo

    • Mario
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Danke, das funktioniert einwandfrei. Kriegt man das auch irgendwie hin, das man eine PDF drucken kann mit z. B. nur Werte aus 2018. Auch wenn ich die Spalte 'Jahr' gruppiere zeigt es mir in der Druckervorschau trotzdem die ganze  Tabelle. Ich hätte aber gerne einen Ausdruck über die Werte nur von einem Jahr, geht das.

    • Support
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hallo Mario, 

    ja, du kannst ja auch in der Tabelle der Druckvorschau nach dem Jahr filtern und nur die Datensätze von 2018 anzeigen lassen. 

    Dazu klickst du einfach im Drucklayout auf die Tabelle und dann rechts auf "Anzuzeigende Spalten festlegen". Dort kannst dann die Filter für die einzelnen Felder festlegen, wenn du darauf klickst.

    Gruß, Jörg

    • Mario
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Danke für die Hilfe, in einer neuen Ansicht mit dem Filter 2018 klappt das wunderbar.

    Noch eine andere Frage, ich habe eine Tabelle 'Hauptgaszähler', eine 'Gasunterzähler Heizung' jeweils mit den Spalten Monat, Jahr, Ablesedatum, Verbrauch in m3 und Zählerstande. Nun möchte ich noch eine Tabelle mit 'Gasunterzähler 1. OG anlegen, den es in Wirklichkeit nicht gibt sondern nur rechnerisch aus der Differenz zwischen 'Hauptgaszähler' und 'Gasunterzähler Heizung'. Nun soll sich die Tabelle quasi selbst füllen. Jahr, Monat, Ablesedatum sind gleich, also müssten nur übertragen werden und der Verbrauch ist halt die Differenz zwischen 'Hauptgaszähler' und Gasunterzähler Heizung'. Das müssten ja erstmal alles Berechnungsfelder werden, aber wie kann ich Jahr, Monat und Ablesedatum übertragen, wobei das Ablesedatum der wichtigste Eintrag ist, da er einmalig vorkommt und dadurch den Verbrauch pro Zeile am besten bestimmen kann.

    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Ist es nicht einfacher eine Ansicht zu erstellen statt die ganze Tabelle?

    Leo

    • Mario
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Wenn ich das richtig verstehe, einfach an die Tabelle 'Hauptgaszähler' die Spalten, die ich berechnet haben möchte (z.B. Verbrauch in € für Gasunterzähler 1. OG) hinzufügen und in der Ansicht dann nur die Werte filtern, die ich für meinen Gasunterzähler 1. OG haben möchte ?

    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Genau

    • Mario
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Ja das funktioniert auch, vollkommen ausreichend, nochmals danke schön.

Content aside

  • vor 6 JahrenZuletzt aktiv
  • 17Antworten
  • 5064Ansichten