0

Zuordnung eines Wertes aus anderem Datensatz über Datum

Hallo, 
ich bin noch recht neu und bräuchte etwas "Starthilfe".
Ich habe zwei Tabellen. In Tabelle "Tankerfassung" besteht ein Datensatz aus "Datum" und "Dieselmenge"

In Tabele 2 "Dieselpreis" wird der gekaufte Diesel erfasst - mit "Datum.Dieselpreis" und "Preis/l"

Nun würde ich gerne in Tabelle "Tankerfassung" den Datensätzen jeweils den "Preis/l" zuordnen, der dem nächst kleineren "Datum.Dieselpreis" entspricht.

Geht das überhaupt so wie ich mir das vorstelle?

Besten Dank im Voraus.

Grüße, Andi

10 Antworten

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

    Hallo Andi, versuch es doch mal so (Code für ein Funktionsfeld in der Tabelle 'Tankerfassung'):

     

    let myDatum := Datum;
    let myPreis := max((select Dieselpreis where 'Datum.Dieselpreis' <= myDatum).'Preis/l');
    Dieselmenge * myPreis

    • Direktvermarktung Oberndörfer OHG
    • Andi.3
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo, 
    danke für die Rückmeldung. Grundsätzlich funktioniert die Funktion.
    Nur ist nicht sichergestellt, dass die Datensätze in der Dieselpreis - Tabelle chronologisch erfasst sind. 

    Lässt sich das bewerkstelligen? Oder kann ich die Tabelle "Dieselpreis" nach Dateneingabe neu anordnen lassen?

    Grüße

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

    Moin, hast du denn falsche Ergebnisse bekommen? Weil: Eigentlich(!) müsste das so funktionieren, meine ich. Man kann aber prophylaktisch beim "select" auch noch die Sortierung der Tabelle angeben:

     

    let myDatum := Datum;
    let myPreis := max((select Dieselpreis where 'Datum.Dieselpreis' <= myDatum order by 'Datum.Dieselpreis' ).'Preis/l');
    Dieselmenge * myPreis

     

    "Neu anordnen" im Sinne von "Datensatznummern neu vergeben" geht nicht. Ist aber normalerweise auch nicht nötig, denn Sortieren ist für eine Datenbank wie Ninox eine der leichtesten Übungen. Kernkompetenz, sozusagen.

    • Direktvermarktung Oberndörfer OHG
    • Andi.3
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hi, ja die Ergebnisse waren falsch, wenn ein Preis mit einem früheren Datum eine höhere Datensatznummer hatte. Aber jetzt gehts!

    Danke!

    • Direktvermarktung Oberndörfer OHG
    • Andi.3
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Ok. Hab mich zu früh gefreut. Habe noch etwas rumprobiert und wollte eigentlich in die Tabelle "Dieselpreis" noch eine Bedingung einbauen, dass ich in der "Dieselpreis" - Tabelle verschiedene Arten erfassen kann (Diesel, AdBlue, Benzin)

    Dabei ist mir aufgefallen dass die Funktion doch nicht wie gewünscht funktioniert. Sprich sobald ein niedrigeres Datum eine höhere ID besitzt bekomme ich die falschen Werte. Ich war mir bis zu dem Zeitpunkt eigentlich sicher, dass es funktioniert...

    let myDatum := Datum;
    let myPreis := max(((select Dieselpreis where Lieferdatum <= myDatum) order by Lieferdatum).'Preis / Liter');
    myPreis


    Die Tabelle "Dieselpreis" ist nicht verknüpft. Wenn ich die Spalte entsprechend deinem Beispiel definiere 'Lieferdatum.Dieselpreis' wirft Ninox gleich einen Fehler, dass die Spalte nicht auffindbar ist. Die zusätzlichen Klammern setzt Ninox auch nach Beendigung der Eingabemaske. Definiere ich wie in meinem Beispiel, bekomme ich zumindest einen Wert zurück auch wenn der wie oben beschrieben falsch sein kann...

    Grüße, Andi

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

    Hallo Andi, ich kenne deine Feldbezeichnungen nicht, deshalb hatte ich das 'Datum.Dieselpreis' aus deinem ersten Posting einfach mal genau so als Feldbezeichnung übernommen, analog zu 'Preis/l'. Wo jetzt das 'Lieferdatum.Dieselpreis' herkommt, weiß ich nicht. Wobei es letztlich ja auch egal ist, wie die Felder heißen. Man muss sie halt immer korrekt benennen, wenn man sie ansprechen will.

    Das Problem der falschen Datums-Zuordnung kann ich hier auch nicht nachvollziehen. Wie der Screenshot zeigt, hat der Preis-Eintrag vom 17.12.2019 eine höhere ID als die anderen, dennoch wird er beim 19.12. als das nächst-niedrigere Datum korrekt zugeordnet (sowohl Cloud als auch Mac-App). Die Formel im Berechnungsfeld 'Literpreis' lautet:

    let myDatum := Datum;
    max(((select Dieselpreis where 'Datum.Dieselpreis' <= myDatum) order by 'Datum.Dieselpreis').'Preis / Liter')

    Möglicherweise habe ich aber einfach das Problem falsch verstanden. Oder unpassende Testdaten. Eventuell kannst du die Datenbank ja mal mit Demodaten irgendwo zum Download hochladen. Das würde die Fehlersuche natürlich erleichtern.

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

    Ach so, der Screenshot ...

     

    2020-01-02_Dieselpreise01

    • Direktvermarktung Oberndörfer OHG
    • Andi.3
    • vor 4 Jahren
    • Gemeldet - anzeigen
    • Ninox-Professional
    • planoxpro
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Okay, versuch's mal mit last() statt max() und überprüfe das Ergebnis bei dir. Bei mir hat's funktioniert. Glaube ich ... ;)

    let myArt := 1;
    let myDatum := Datum;
    last(((select Dieselpreis where Art = myArt and Lieferdatum <= myDatum) order by Lieferdatum).'Preis / Liter')

    Wobei der Code auch schon die Abfrage nach der Art des Kraftstoffs enthält (1 = Diesel, 2 = AdBlue). Für die AdBlue-Berechnung müsste man also nur bei "let myArt =" die 1 durch eine 2 ersetzen (entsprechend den numerischen IDs des Auswahlfeldes 'Art' in der Tabelle 'Dieselpreise'). Wenn du statt der numerischen lieber die Textwerte vergleichen willst, dann sähe das für "Diesel" so aus:

    let myArt := "Diesel";
    let myDatum := Datum;
    last(((select Dieselpreis where text(Art) = myArt and Lieferdatum <= myDatum) order by Lieferdatum).'Preis / Liter') 

    Wobei man darauf achten müsste, dass die Schreibweisen exakt übereinstimmen.

    • Direktvermarktung Oberndörfer OHG
    • Andi.3
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Jetzt funktionierts :) 
    Vielen Dank!

Content aside

  • vor 4 JahrenZuletzt aktiv
  • 10Antworten
  • 2783Ansichten