0

Fehlermeldung bei Case 2 (wöchentlich) und Case 3 (monatlich) in Switch

Hallo zusammen,

ich habe eine Switch-Abfrage zur Berechnung der nächsten Fälligkeit erstellt. Dabei nutze ich unterschiedliche Cases (täglich, wöchentlich, monatlich, jährlich).

Leider bekomme ich bei Case 2 (wöchentlich) und Case 3 (monatlich) Fehlermeldungen:

  • Case 2: „Die Ausdrücke für 'dann' und 'sonst' liefern unterschiedliche Datentypen: string, date“

  • Case 3: „Return types of case statements do not match“

Siehe Screenshots im Anhang.

Mein Ziel wäre:

  • Bei wöchentlich soll immer der nächste gewählte Wochentag berechnet werden, nie zurück in die Vergangenheit. Wenn der Wochentag = heute (Freitag) ist, dann soll eine Woche weitergerechnet werden.

  • Bei monatlich soll ein fixer Tag im Monat genommen werden (oder der Monatsletzte, falls kein Tag eingetragen ist).

Weiss jemand, warum diese Fehlermeldungen entstehen und wie man die Abfrage am besten schreibt, damit immer ein Datum zurückgegeben wird?

Vielen Dank für eure Unterstützung!

 

"// Nächste Fälligkeit berechnen (robust: Choice ODER Textcaption)";
let my := this;
let heute := today();

"// Basis = letzte Erledigung oder Start ab; Fallback = heute";
let letzteErledigung :=
    if cnt(my.Protokolle) = 0 then
        my.'Start ab'
    else
        max(my.Protokolle.'Protokoll erstellt am')
    end;
let basis := if letzteErledigung != null then letzteErledigung else heute end;
let wdBasis := weekday(basis);

"// Ausführungszeitpunkt robust ermitteln: erst Zahl, sonst Caption -> Zahl";
let apRaw := my.'Ausführungszeitpunkt';
let ap :=
    if number(apRaw) != null then
        number(apRaw)
    else
        switch upper(trim(text(apRaw))) do
            case "TÄGLICH": 1
            case "TAEGLICH": 1
            case "WÖCHENTLICH": 2
            case "WOECHENTLICH": 2
            case "MONATLICH": 3
            case "JÄHRLICH": 4
            case "JAEHRLICH": 4
        end
    end;

switch ap do

case 1:
(
    "// täglich: Fr/Sa/So → nächster Montag, sonst +1 Tag";
    if wdBasis >= 4 then
        basis + 7 - wdBasis
    else
        basis + 1
    end
)

case 2:
(
    "// wöchentlich: nächster gewählter Wochentag (immer in der Zukunft)";
    let alle :=
        if my.Tag != null then
            for i in numbers(my.Tag) do
                i - 1
            end
        else
            [wdBasis]
        end;

    let naechste := null;
    for i in sort(alle) do
        if i > wdBasis and (naechste = null or i < naechste) then
            naechste := i
        end
    end;

    let ergebnis :=
        if naechste != null then
            let wochenanfang := basis - wdBasis;
            wochenanfang + naechste
        else
            let naechsterWochenanfang := basis - wdBasis + 7;
            naechsterWochenanfang + min(alle)
        end;

    if ergebnis <= basis then
        ergebnis + 7
    else
        ergebnis
    end
)

case 3:
(
    "// monatlich: fester Tag oder Monatsletzter, immer in der Zukunft; Wochenende -> Montag";
    let tagMonat := my.'Tag im Monat';
    let y := year(basis);
    let m := month(basis);

    let cand :=
        if tagMonat != null then
            let c0 := date(y, m, tagMonat);
            if c0 <= basis then date(y, m + 1, tagMonat) else c0 end
        else
            let lastThis := date(y, m + 1, 1) - 1;
            if lastThis <= basis then date(y, m + 2, 1) - 1 else lastThis end
        end;

    if weekday(cand) = 5 then cand + 2
    else if weekday(cand) = 6 then cand + 1
    else cand end end
)

case 4:
(
    "// jährlich: gewählte Monate + Tag im Monat; Standard = 31.12.; Wochenende -> Montag";
    let tagMonat := my.'Tag im Monat';
    let sel := if my.Monate != null then numbers(my.Monate) else [] end;
    let y := year(basis);
    let m := month(basis);

    let cand :=
        if cnt(sel) = 0 then
            let d := date(y, 12, 31);
            if d <= basis then date(y + 1, 12, 31) else d end
        else
            let target := null;
            for mm in sort(sel) do
                if target = null then
                    let dd := if tagMonat != null then date(y, mm, tagMonat) else date(y, mm, 1) end;
                    if month(dd) != mm then dd := date(y, mm + 1, 1) - 1 end;
                    if dd > basis and mm >= m then target := dd end
                end
            end;
            if target = null then
                let mm := min(sort(sel));
                let dd := if tagMonat != null then date(y + 1, mm, tagMonat) else date(y + 1, mm, 1) end;
                if month(dd) != mm then dd := date(y + 1, mm + 1, 1) - 1 end;
                target := dd
            end;
            target
        end;

    if weekday(cand) = 5 then cand + 2
    else if weekday(cand) = 6 then cand + 1
    else cand end end
)

end

 Screen 1

Screen 2

Antwort

null

Content aside

  • gesternZuletzt aktiv
  • 15Ansichten
  • 1 Folge bereits