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
Content aside
- gesternZuletzt aktiv
- 15Ansichten
-
1
Folge bereits