Mal so hingewürfelt, vielleicht hilft Dir das
_liste := "Sonntag" : "Montag" : "Dienstag" : "Mittwoch" : "Donnerstag" : "Freitag" : "Samstag";
_n := @Prompt ([OKCancelList] : [NoSort]; "Nächster"; "Wählen Sie bitte den Tag aus"; ""; _liste);
@If (_n = ""; @Return (""); "");
_n1 := @If (_n = "Sonntag"; 1; _n = "Montag"; 2; _n = "Dienstag"; 3; _n = "Mittwoch"; 4; _n = "Donnerstag"; 5; _n ="Freitag"; 6; _n ="Samstag"; 7; 0);
_n2 := _n1 - @Weekday (@Today);
_n3 := @If (_n2 <= 0; _n2 + 7; _n2);
@Prompt ([OK]; "Nächster" + _n; @Text (@Adjust (@Today; 0; 0; _n3; 0; 0; 0)))
oder meinst Du die Liste der nächsten Wochentage ab heute im Klartext?
_liste := "Sonntag" : "Montag" : "Dienstag" : "Mittwoch" : "Donnerstag" : "Freitag" : "Samstag";
_w := @Weekday (@Today);
_n := @If (_w = 7; _liste; @Subset (_liste; _w - 7) : @Subset (_liste; _w));
@Prompt ([Ok]; "Nächste Tage"; @Implode (_n; ", "))
Danke erst mal Peter:
Würde also bedeuten:
NächsterMontagTmp := @If(2 - @Weekday (@Today) <= 0 ; @Weekday (@Today) + 7 ; @Weekday (@Today))
NächsterMontag := (@Adjust (@Today; 0; 0; NächsterMontagTmp ; 0; 0; 0)))
NächsterDienstagTmp := @If(3 - @Weekday (@Today) <= 0 ; @Weekday (@Today) + 7 ; @Weekday (@Today))
NächsterDienstag := (@Adjust (@Today; 0; 0; NächsterMontagTmp ; 0; 0; 0)))
usw...
@Andreas: @Adjust ist doch da drin, oder?
Fast
NächsterMontagTmp := @If(2 - @Weekday (@Today) <= 0 ; 2 - @Weekday (@Today) + 7 ; 2 - @Weekday (@Today))
NächsterMontag := (@Adjust (@Today; 0; 0; NächsterMontagTmp ; 0; 0; 0))
NächsterDienstagTmp := @If(3 - @Weekday (@Today) <= 0 ; 3 - @Weekday (@Today) + 7 ; 3 - @Weekday (@Today))
NächsterDienstag := (@Adjust (@Today; 0; 0; NächsterDienstagTmp ; 0; 0; 0))
usw...
und ich würde nie Umlaute in Formel- oder Scriptvariablen verwenden, also NaechsterDienstag
Könnte man auch noch etwas eleganter schreiben, damit nicht soviel gerechnet werden muss ...
NaechsterMontagTmp1 := 2 - @Weekday (@Today);
NaechsterMontagTmp2 := @If(NaechsterMontagTmp1 <= 0 ; NaechsterMontagTmp1 + 7 ; NaechsterMontagTmp1);
NaechsterMontag := (@Adjust (@Today; 0; 0; NaechsterMontagTmp2 ; 0; 0; 0))
Ein bißchen kürzer ;)
_w := @Modulo ((1 : 2 : 3 : 4 : 5 : 6 : 7) - @Weekday (@Today) + 6; 7) + 1;
@For (_i := 1; _i <= @Elements (_w); _i := _i + 1;
@Set ("_n" + @Text (_i); @Adjust (@Today; 0; 0; _w [_i]; 0; 0; 0))
);
@Prompt ([Ok]; "Nächste Tage"; @Implode (@Text (_n1 : _n2 : _n3 : _n4 : _n5 : _n6 : _n7); ", "))
Anstelle von @Set kannst Du auch mit @Setfield die Werte gleich in Felder/Items des Dokuments schreiben, das obere Beispiel ist zum Testen ohne Veränderung irgendwelcher Dokumente, das untere zum Schreiben der Felder Tag1 bis Tag7, wobei Tag1 der nächste Sonntag ist.
_w := @Modulo ((1 : 2 : 3 : 4 : 5 : 6 : 7) - @Weekday (@Today) + 6; 7) + 1;
@For (_i := 1; _i <= @Elements (_w); _i := _i + 1;
@SetField ("Tag" + @Text (_i); @Adjust (@Today; 0; 0; _w [_i]; 0; 0; 0))
);
Die wesentliche Änderung ist die Nutzung des @Modulo, das den Rest einer Teilung ergibt. Damit spart man die Abfrage, ob z.B. 2 - Weekday kleiner gleich 0 ist. Und alle Operationen werden auf einer Liste von Daten ausgeführt, was in Formelsprache sehr elegant ist.
Abendliche Formelrätsel.... ;D
dLst := "Sonntag" : "Montag" : "Dienstag" : "Mittwoch" : "Donnerstag" : "Freitag" : "Samstag" ;
@Transform(
@TextToTime(@Explode(@TextToTime(@Text(@Adjust(@Today;0;0;1;0;0;0)) + "-" + @Text(@Adjust(@Today;0;0;7;0;0;0)))));
"item";
dLst[@Weekday( item )] + " " + @Text(@Date(item))
) ;
Guten Morgen allerseits,
erst mal Danke für die vielen Antworten. Da es noch ein wenig unklar ist, was ich brauche, versuche ich das noch mal genauer zu beschreiben.
Ein Mitarbeiter soll einen Liefertermin festlegen. Er kann aber nur an bestimmten Tagen beliefert werden. Diese Tage liegen als Textliste vor.
Beispiel 2:4 = mögliche Liefertermine sind Montag und Mittwoch.
Zwischen Bestellungtag (heute) und Liefertag müssen mindestens zwei Tage liegen (Wochenende nicht berechnen), also ausgehend von heute + 2 Tage sind das der kommende Montag und der kommende Mittwoch.
In einer Dialogliste soll er also diese zwei Werte sehen und einen auswählen können.
Ich dachte also, dass ich mir erst mal alle möglichen zukünftigen Wochentage ausgehend von heute + 2 berechne und dann eine Liste baue:
NaechsterMontag :=
NaechsterDienstag :=
NaechsterMittwoch :=
@If(@Contains(Textliste ; 2 ; NaechsterMontag ; "") :
@If(@Contains(Textliste ; 3 ; NaechsterDienstag ; "") :
@If(@Contains(Textliste ; 4 ; NaechsterMittwoch ; "") ...
_liefertage := 2 : 4;
_starttag := @Adjust (@Today; 0; 0; 2; 0; 0; 0);
_w := @Modulo (_liefertage - @Weekday (_starttag) + 6; 7) + 1;
@For (_i := 1; _i <= @Elements (_w); _i := _i + 1;
_liste := _liste : @Text (@Adjust (_starttag; 0; 0; _w [_i]; 0; 0; 0))
);
_liste := @Trim (_liste);
_ergebnis := @Prompt ([OkCancelList]; "Liefertag"; "Wählen Sie bitte den Liefertag aus"; _liste [1]; _liste)
Es gibt hier aber nicht immer fertige Lösungen, das hier hat einfach mal Spaß gemacht ;)
EDIT: Das mit dem nicht zu berücksichtigenden Wochenende ist da natürlich noch nicht dabei, das müsste bei der Berechnung des _starttag erfolgen ...
EDIT2: Und Du solltest eine Möglichkeit zur Eingabe eines abweichenden Liefertermins schaffen, oder mindestens eine Woche vor Weihnachten in Urlaub gehen ;D
dLst := "Sonntag" : "Montag" : "Dienstag" : "Mittwoch" : "Donnerstag" : "Freitag" : "Samstag" ;
start := @Today;
dtList := @Transform( @TextToTime(@Explode(@TextToTime(@Text(@Adjust(start;0;0;@If(@Weekday(start)= 6; 2; @Weekday(start)= 7;1;0) + 3 ;0;0;0)) + "-" + @Text(@Adjust(start;0;0;@If(@Weekday(start)= 6; 2; @Weekday(start)= 7;1;0) + 9;0;0;0)))));
"item";
@Text(@Weekday( item )) + "#" + dLst[@Weekday( item )] + " " + @Text(@Date(item))) ;
@Trim(@Right(dtList ; "2#") : @Right(dtList ; "4#"))
Bisschen "obfuscated" aber kann man ja noch aufdröseln....
Edit: Korrekturen