nächstes Datum aus mehreren Datumsfeldern auswählen
Guten Tag,
ich suche für ein Funktions-/Berechnungsfeld eine Formel, mit der ich aus mehreren Datumsfeldern immer das nächstliegende Datum in der Zukunft finde.
Gruß
Wilfried Hennen
14 Antworten
-
Hallo,
versuche es bitte mal mit:
let mydatum := Datumsfeld;
max(select Tabellenname where Datumsfeld < mydatum).Datumsfeld
für letzte Datum for deinem aktuellen.
Gruß, Jörg
-
Hallo Jörg,
ich habe mir folgende Formel entwickelt:
let myD := today();
let myN := 500000000 * 1000 * 60 * 60 * 24;
for ii in [Preisgarantie_bis, Vertragsende, 'Kdg_prüfen_120Tg', 'Kdg_prüfen_90Tg', 'Kdg_prüfen_60Tg', 'Kdg_spätestens', SoBonus_bis] do
if ii > today() then
let tempN := number(ii - today());
if tempN < myN then
myN := tempN;
myD := ii
end
end
end;
myD
Die funktioniert auch ganz gut. Allerdings hat sie einen kleinen Schönheitsfehler: Wenn alle abgefragten Datumsfelder in der Vergangenheit liegen, dann wird das heutige Datum angezeigt.
Ich schaffe es aber nicht, dass stattdessen der Inhalt eines weiteren Feldes (Beendigungsfeld) angezeigt wird.
Gruß Wilfried -
Hallo Wilfried,
jetzt verstehe ich deinen Anwendungsfall ein bisschen besser. Wahrscheinlich funkioniert die folgende Formel so wie du möchtest:
let myMax := max('Vergleichsdatum 1', 'Vergleichsdatum 2', 'Vergleichsdatum 3');
if myMax < today() then Beendigungsdatum else myMax end
Gruß, Jörg
-
Hallo Jörg,
danke für die Formel. Sie funktioniert aber noch nicht.
Ich versuche noch einmal eine Beschreibung:
Ich suche das Datum, welches beim Aufruf meiner Datenbank jeweils das nächstliegende Datum (in der Klammer) in der Zukunft sucht und anzeigt. Liegen alle Datum in der Vergangenheit, dann soll das Beendigungsdatum angezeigt werden.
Gruß Wilfried
-
Hallo Wilfried,
bitte versuche es einmal mit dieser Formel:
let myMax := max('Vergleichsdatum 1', 'Vergleichsdatum 2', 'Vergleichsdatum 3');
let myd1 := if 'Vergleichsdatum 1' > today() then
'Vergleichsdatum 1'
end;
let myd2 := if 'Vergleichsdatum 2' > today() then
'Vergleichsdatum 2'
end;
let myd3 := if 'Vergleichsdatum 3' > today() then
'Vergleichsdatum 3'
end;
let myMin := min(myd1, myd2, myd3);
if myMax < today() then Beendigungsdatum else myMin end
Gruß, Jörg
-
Ich würde es lieber so angehen:
---
let myDD := [Preisgarantie_bis, Vertragsende, 'Kdg_prüfen_120Tg', 'Kdg_prüfen_90Tg', 'Kdg_prüfen_60Tg', 'Kdg_spätestens', SoBonus_bis];
let myARR := for i in myDD do
if i > today() then i end
end;
if max(myDD) < today() then Vertragsende else min(myARR) end
----
Leo
-
Hallo Leo,
vielen Dank für die Formel. Aus deinem Lösungsvorschlag lautet meine Formel nunmehr:
let myDD := [Preisgarantie_bis, Vertragsende, 'Kdg_prüfen_120Tg', 'Kdg_prüfen_90Tg', 'Kdg_prüfen_60Tg', 'Kdg_spätestens', SoBonus_bis];
let myARR := for i in myDD do
if i > today() then i end
end;
if max(myDD) < today() then Vertrag_beendet else min(myARR) endSie deckt schon fast alles ab.
Allerdings muss der Formel noch folgende Bedingung vorangestellt werden (hat sich erst bei den Tests herausgestelltt):
Wenn das Feld Vertrag_beendet gefüllt ist (also <> nichts) dann ist der Inhalt dieses Feldes immer vorrangig, egal ob ein anderes Feld in der Klammer ziehen würde,
und anschließend die Routinen deiner Formel ausführen.
Wilfried
-
Hallo Wilfried,
an sich ist es keine große Sache:
---
if Vertrag_beendet then Vertrag_beendet else
let myDD := [Preisgarantie_bis, Vertragsende, 'Kdg_prüfen_120Tg', 'Kdg_prüfen_90Tg', 'Kdg_prüfen_60Tg', 'Kdg_spätestens', SoBonus_bis];
let myARR := for i in myDD do
if i > today() then i end
end;
if max(myDD) < today() then Vertrag_beendet else min(myARR) end
end
---
Allerdings sehe ich hier ein Problem: wenn das Feld leehr ist, wird es wenn alle Datumsfelder in Vergangenheit liegen auch ein leehres Feld angezeigt.
Leo
-
Guten Morgen Leo,
ich habe nunmehr folgende Formel im Einsatz:
if Vertrag_beendet then Vertrag_beendet else
let myDD := [Strom_ablesen, Preisgarantie_bis, Vertragsende, 'Kdg_prüfen_120Tg', 'Kdg_prüfen_90Tg', 'Kdg_prüfen_60Tg', 'Kdg_spätestens', SoBonus_bis];
let myARR := for i in myDD do
if i > today() then i end
end;
if max(myDD) < today() then Vertrag_beendet else min(myARR) end
endDie Formel liefert das von mir gewünschte Ergebnis. Herzlichen Dank für deine wertvolle Hilfe!
Noch eine andere Frage:
Kann mein Berechnungsfeld "Reaktionsdatum" auch den Typ=Datumsfeld erhalten?
Dann könnte es auch in den Kalender einfließen.Wilfried
-
Hallo Wilfried,
Der Kalender berücksichtigt nur die echte Datumsfelder. Du kannst Reaktionsdatum als Datumsfeld anlegen und diese beim Start der Datenbank füllen.
Leo
-
Hallo Leo,
danke für den Hinweis. Ich habe das Feld=Reaktionsdatum als Datum angelegt und das Script einkopiert.
Allerdings gibt es bei meiner ninox-version nur das Feld "Nach Änderungen folgendes Script ausführen" und nicht "Nach dem Öffnen der Datenbank folgendes Script ausführen". Aber es wird kein Datum mehr angezeigt.
Wilfried
-
Hallo Wilfried,
Die Option "Nach dem Öffnen der Datenbank folgendes Script ausführen" gibt es nicht bei einem Feld sondern auf Datenbannkebene. Dafür musstest du zuerst in Admin-Modus schalten (Schraubenschlüssel oben rechts) dann auf schwarzen Haussymbol (oben links) und dann in der Mitte auf Optionen. Und die Formel sollte dann auch angepasst werden:
---
for j in select "DEINE TABELLE" do
j.(Reaktionsdatum:=
if Vertrag_beendet then Vertrag_beendet else
let myDD := [Strom_ablesen, Preisgarantie_bis, Vertragsende, 'Kdg_prüfen_120Tg', 'Kdg_prüfen_90Tg', 'Kdg_prüfen_60Tg', 'Kdg_spätestens', SoBonus_bis];
let myARR := for i in myDD do
if i > today() then i end
end;
if max(myDD) < today() then Vertrag_beendet else min(myARR) end
end)
end
---
Statt DEINE TABELLE solltest du den Namen deiner Tabelle eintragen, wo die Felder liegen. Dann Datenbank schliessen und neu starten.
Leo
-
Hallo Leo,
die folgende Formel/das Script auf Datenbankebene
for j in select "alle Daten" do
j.(Reaktionsdatum:=
if Vertrag_beendet then Vertrag_beendet else
let myDD := [Strom_ablesen, Preisgarantie_bis, Vertragsende, 'Kdg_prüfen_120Tg', 'Kdg_prüfen_90Tg', 'Kdg_prüfen_60Tg', 'Kdg_spätestens', SoBonus_bis];
let myARR := for i in myDD do
if i > today() then i end
end;
if max(myDD) < today() then Vertrag_beendet else min(myARR) end
end)
endwird abgelehnt mit dem Fehlerhinweis
for j in ERR("ID erwartet") do
"alle Daten"
endWilfried
-
Hallo Wilfried, Statt doppelte Anführungszeichen bitte einfache Anfürungszeiche benutzen:
---
for j in select 'alle Daten' do
j.(Reaktionsdatum:=
if Vertrag_beendet then Vertrag_beendet else
let myDD := [Strom_ablesen, Preisgarantie_bis, Vertragsende, 'Kdg_prüfen_120Tg', 'Kdg_prüfen_90Tg', 'Kdg_prüfen_60Tg', 'Kdg_spätestens', SoBonus_bis];
let myARR := for i in myDD do
if i > today() then i end
end;
if max(myDD) < today() then Vertrag_beendet else min(myARR) end
end)
end
---
Leo
Content aside
- vor 5 JahrenZuletzt aktiv
- 14Antworten
- 2938Ansichten