0

Dauer + Verbrauch Berechnung

In den Datensätzen werden Zeitstempel und Zählerstand erfasst. Errrechnen lassen möchte ich:

- die Dauer von letzten Datensatz zum aktuellen

- den Verbrauch von letzten Zählerstand zum aktuellen Datensatz

Leider fehlt mir die Info, wie ich in der Datenbank auf den letzten Datensatz zugreifen kann, um dann Dauer und Verbrauch für den aktuellen Datensatz ausrechnen zu können

14 Antworten

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

    Hallo, man könnte einfach jeweils einen Datensatz zurückgehen, die "alten" Daten auslesen und dann die Berechnung vornehmen. Das Berechnungsfeld für den Zählerstand könnte dann so aussehen:

    let SatzNr := number(Nr) - 1;
    let ZSalt := (select xTesttabelle where number(Nr) = SatzNr).'Zählerstand';
    'Zählerstand' - number(ZSalt)

    Das für die Anzahl der Tage seit dem letzten Datum so:

    let SatzNr := number(Nr) - 1;
    let ADalt := date((select xTesttabelle where number(Nr) = SatzNr).Zeitstempel1);
    days(ADalt, date(Zeitstempel1)) + 1

    Geht bestimmt eleganter, müsste aber funktionieren (ohne Gewähr).

    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Um auf Nummer sicher zu gehen, würde ich lieber den letzten Prüfdatum ermitteln:

    ---

    let myDate:='Prüfdatumdatum';

    let myZ:='Zählerstand';

    let lastDate:=max(select Tabelle where 'Prüfdatumdatum'<myDate.'Prüfdatumdatum');

    let lastRecord:=first(select Tabelle where 'Prüfdatumdatum'=lastDate);

    myZ-lastRecord.'Zählerstand'

    ---

    So bist du sicher, auch wenn mann die Zählerstände nachträglich erfasst wurden oder zwischendurch etwas gelöscht wurde.

    Die Namen musst du natürlich ensprechend anpassen

    Größe

    Leo

    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Prüfdatumdatum??? Unglaublich.

    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Prüfdatumdatum??? Unglaublich.

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

    Danke für die Verbesserung, Leo. Ich war mir der Schwächen meiner Lösung bewusst, dachte aber, sie sei erst mal besser als gar keine.

    Und 'Prüfdatumdatum' finde ich auch völlig in Ordnung. Ein Musterbeispiel für "sprechende" Feldbezeichnungen. ;)

    • swernsdorf
    • vor 6 Jahren
    • Gemeldet - anzeigen

    vielen Dank für die Lösungsvorschläge. Den Vorschlag vom Copytexter habe ich als alter Cobol, Fortran, PL/1-Programmierer verstanden und auch umgesetzt. Funktioniert sehr gut. Gern würde ich auch den Vorschlag vom Leonid Semik nachvollziehen und umsetzten. Doch leider fehlt mir die Syntax der Befehle/Funktionen. Wie komme ich an ein entsprechendes Handbuch, oder wo gibt es weitergehende Erläuterungen?

    Vielen Dank im Voraus

    Siegfried 

    • Support
    • vor 6 Jahren
    • Gemeldet - anzeigen
    • swernsdorf
    • vor 6 Jahren
    • Gemeldet - anzeigen

    das ist schon mal hilfreich, nur mit den Befehlsfolgen von Leonid Semik bin ich noch nicht klar gekommen:

    let lastDate:=max(select Tabelle where 'Prüfdatumdatum'<myDate.'Prüfdatumdatum');

    let lastRecord:=first(select Tabelle where 'Prüfdatumdatum'=lastDate);

    Die Funktion max gibt den größten Wert des Feldes einer zurück, wenn der letzte Wert kleiner als der aktuelle ist. (?) 

    In meiner DB habe ich nur die Felder "Datum" und "Zählerstand". Sind Hilfsfelder "lastDate" und "myDate"?

    Welcher Wert wird dem Feld "Prüfdatumdatum" wann zugewiesen?

    Vielleicht kann mir jemand helfen?

    Gruß Siegfried

    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hallo Siegfried:

    mit "let" deklarierst du die Variablen, welche nur innerhalb des Skriptes unterschiedlichen Werte annehmen und für interne Berechnungenbenutzt werden können.

    mit let myDate:='Prüfdatumdatum' deklarierst du die Variable myDate mit dem Wert des Prüfdatum.

    myZ - entsprechend Zählerstand.

    jtzt zu let lastDate:=max(select Tabelle where 'Prüfdatumdatum'<myDate.'Prüfdatumdatum')

    mit select wählst du die Tabelle aus. Die where Klausel filtert die Datensätze aus wo das Prüfdatum junger als Prüfdatum des aktuellen Datensatzes ist. Mit  .'Prüfdatumdatum'bekommt man einen Array aus Datums und mit max() wählt man das älteste Datum. Wir haben jetzt unseres letzten Datum als lastDate. Jetzt suchen wir in der Tabelle den Datensatz mit diesem letzten Datum. Da es theoretisch auch mehrere Datensätze mit dem Datum geben können, sagen wir dem Ninox, das er bitte den ersten gefundenen Datensatz nehmen soll:

     let lastRecord:=first(select Tabelle where 'Prüfdatumdatum'=lastDate);

    Da wir hier kein Datenfelld ausgewählt haben nimmt Ninox automatisch die ID von dem Datensatz als Wert von lastRecord. Im grunde ist lastRecord jetzt wie eine Tabelle mit nur einer Zeile.

    Zuletzt nehmen wir den vorher gespeicherten Zählerstand myZ und substrahieren den Zählerstand von dem lastRecord Zeile. Also

    myZ-lastRecord.'Zählerstand'

    Ich hoffe, ich habe verständlich rüber gebracht.

    Grüße

    Leo

    • swernsdorf
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hallo Leo,

    vielen Dank für Deine Erläuterungen, jetzt ist zumindestens die Syntax klar und Ninox meldet keine Fehler mehr.

    let myDate := Datum;
    let myZ := 'Zählerstand';
    let lastDate := max(select Gasverbrauch where Datum < myDate).Datum;
    let lastRecord := first(select Gasverbrauch where Datum = lastDate);
    myZ - lastRecord.'Zählerstand'

    Ich hatte noch ein Problem mit der Klammer .

    Ich hab´ aber noch ein Verständnisproblem mit "Prüfdatumdatum"! in der DB gibt es nur ein Feld mit Datum. Dies zum Vergleich zu benutzen, führt bei der Berechnung zu falschen Ergebnissen. Die Variable "Prüfdatumdatum" müsste jünger sein, aber wie kann ich diese erst mal kreieren, damit der Vergleich funktioniert? Irgendwie stehe ich auf dem Schlauch.. vielleicht kannst Du mir noch mal helfen.

    Gruß

    Siegfried

    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hallo Siegfried,

    Prüfdatumdatum hatte ich falch rein geschrieben. Deine Formel mit Datum ist scon richtig. Nur - du hast in der dritten Zeile die letzte Klammer falsch gesetzt. So sucht Ninox nich nach maximalen Datum, sondern nch dem Datensatz mit maximaler ID. 

    richtig wäre:

    let myDate := Datum;
    let myZ := 'Zählerstand';
    let lastDate := max(select Gasverbrauch where Datum < myDate.Datum);
    let lastRecord := first(select Gasverbrauch where Datum = lastDate);
    myZ - lastRecord.'Zählerstand'

     

    Grüße

    Leo

    • swernsdorf
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hallo Leo,

    Danke für die kurzfristige Nachricht. Wenn ich die Klammer in Zeile 3 wie von Dir beschrieben setzte, dann gibt es eine Fehlermeldung:

    "Expresssion does not return a record: myDate in Zeile 3, Spalte 61"

    Gruß

    Siegfried

    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hallo Siegfried,

    versuch "where" durch Eckklammer zu ersetzen:

    et myDate := Datum;
    let myZ := 'Zählerstand';
    let lastDate := max(select Gasverbrauch [Datum < myDate].Datum);
    let lastRecord := first(select Gasverbrauch [ Datum = lastDate]);
    myZ - lastRecord.'Zählerstand'

    • swernsdorf
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hallo Leo,

    jetzt hat´s geklappt, vielen Dank für die Unterstützung :-))

    Hier der Code, für den sich vielleicht noch andere Interssieren:

    let myDate := Datum;
    let myZ := 'Zählerstand';
    let lastDate := max((select Gasverbrauch)[Datum < myDate].Datum);
    let lastRecord := first((select Gasverbrauch)[Datum = lastDate]);
    myZ - lastRecord.'Zählerstand'

    Für die Berechnung der Dauer habe ich folgenden Code:

    let myDate := Datum;
    let lastDate := max((select Gasverbrauch)[Datum < myDate].Datum);
    let lastRecord := first((select Gasverbrauch)[Datum = lastDate]);
    days(lastDate, Datum)

    Gruß

    Siegfried

Content aside

  • vor 6 JahrenZuletzt aktiv
  • 14Antworten
  • 5594Ansichten