0

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

null
    • Team Lead Customer Service
    • joerg
    • vor 5 Jahren
    • Gemeldet - anzeigen

    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

    • Wilfried_Hennen
    • vor 5 Jahren
    • Gemeldet - anzeigen

    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

    • Team Lead Customer Service
    • joerg
    • vor 5 Jahren
    • Gemeldet - anzeigen

    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

    • Wilfried_Hennen
    • vor 5 Jahren
    • Gemeldet - anzeigen

    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

    • Team Lead Customer Service
    • joerg
    • vor 5 Jahren
    • Gemeldet - anzeigen

    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

    • Leonid_Semik
    • vor 5 Jahren
    • Gemeldet - anzeigen

    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

    • Wilfried_Hennen
    • vor 5 Jahren
    • Gemeldet - anzeigen

    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) end

    Sie 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

    • Leonid_Semik
    • vor 5 Jahren
    • Gemeldet - anzeigen

    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

    • Wilfried_Hennen
    • vor 5 Jahren
    • Gemeldet - anzeigen

    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
    end

    Die 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

    • Leonid_Semik
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Hallo Wilfried,

    Der Kalender berücksichtigt nur die echte Datumsfelder. Du kannst Reaktionsdatum als Datumsfeld anlegen und diese beim Start der Datenbank füllen. 

    Anmerkung 2019-06-11 095155

    Leo

    • Wilfried_Hennen
    • vor 5 Jahren
    • Gemeldet - anzeigen

    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

    • Leonid_Semik
    • vor 5 Jahren
    • Gemeldet - anzeigen

    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

    • Wilfried_Hennen
    • vor 5 Jahren
    • Gemeldet - anzeigen

    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)
    end

    wird abgelehnt mit dem Fehlerhinweis

    for j in ERR("ID erwartet") do
    "alle Daten"
    end

    Wilfried

    • Leonid_Semik
    • vor 5 Jahren
    • Gemeldet - anzeigen

    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