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
-
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
-
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 -
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.
-
Hi, ja die Ergebnisse waren falsch, wenn ein Preis mit einem früheren Datum eine höhere Datensatznummer hatte. Aber jetzt gehts!
Danke!
-
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 -
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.
-
Ach so, der Screenshot ...
-
Das Backup ist unter folgendem Link erreichbar:
https://oberndoerfer-my.sharepoint.com/:u:/g/personal/andreas_hof-oberndoerfer_de/EQNv60O9-jdGnSzQUppYLB4BxApvxnwDfDrGVXNAc4nU8g?e=g9abyX -
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.
-
Jetzt funktionierts :)
Vielen Dank!
Content aside
- vor 5 JahrenZuletzt aktiv
- 10Antworten
- 2793Ansichten