Das Notes Forum

Domino 9 und frühere Versionen => ND9: Entwicklung => Thema gestartet von: theBastian am 17.10.16 - 14:54:33

Titel: Nächste Wochentage ausgehend von heute berechnen
Beitrag von: theBastian am 17.10.16 - 14:54:33
Hallo allerseits,

ich muss die nächsten Wochentage berechnen, habe mir dazu schon einige Threads durchgelesen, allein mir fehlt das Verständnis, wie man sowas berechnet.
Klingt für mich alles sehr nach Mathematik und da war ich schon immer schlecht.  :(

Ausgehend von Heute (@Today) muss ich die nächsten Wochentage berechnen und einzeln ausgeben, also

NächsterMontag : NächsterDienstag : NächsterMittwoch : ....

Mit @Weekday kriege ich den aktuellen Tag aber wie komme ich auf die anderen?  ???

Danke Euch schon mal.
Sebastian
Titel: Re: Nächste Wochentage ausgehend von heute berechnen
Beitrag von: Peter Klett am 17.10.16 - 15:36:17
Mal so hingewürfelt, vielleicht hilft Dir das

Code
_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)))
Titel: Re: Nächste Wochentage ausgehend von heute berechnen
Beitrag von: Peter Klett am 17.10.16 - 15:55:17
oder meinst Du die Liste der nächsten Wochentage ab heute im Klartext?

Code
_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; ", "))
Titel: Re: Nächste Wochentage ausgehend von heute berechnen
Beitrag von: ascabg am 17.10.16 - 16:06:34
Hallo,

Und was ist mit @Adjust?


Andreas
Titel: Re: Nächste Wochentage ausgehend von heute berechnen
Beitrag von: theBastian am 17.10.16 - 16:45:32
Danke erst mal Peter:

Würde also bedeuten:

Code
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?
Titel: Re: Nächste Wochentage ausgehend von heute berechnen
Beitrag von: Peter Klett am 17.10.16 - 17:05:03
Fast

Code
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 ...


Code
NaechsterMontagTmp1 := 2 - @Weekday (@Today);
NaechsterMontagTmp2 := @If(NaechsterMontagTmp1 <= 0 ; NaechsterMontagTmp1 + 7 ; NaechsterMontagTmp1); 
NaechsterMontag := (@Adjust (@Today; 0; 0; NaechsterMontagTmp2 ; 0; 0; 0))
Titel: Re: Nächste Wochentage ausgehend von heute berechnen
Beitrag von: theBastian am 17.10.16 - 21:01:46

und ich würde nie Umlaute in Formel- oder Scriptvariablen verwenden, also NaechsterDienstag


Ist klar, die Bezeichnung war ja auch nur dafür gedacht, darzustellen, was rauskommen soll.  ;)

Wären also 3 Zeilen pro Tag. Könnte man das noch irgendwie optimieren?
Titel: Re: Nächste Wochentage ausgehend von heute berechnen
Beitrag von: Peter Klett am 17.10.16 - 22:12:10
Ein bißchen kürzer ;)

Code
_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.

Code
_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.
Titel: Re: Nächste Wochentage ausgehend von heute berechnen
Beitrag von: koehlerbv am 17.10.16 - 22:17:37
Ja, das geht in drei Zeilen für alles.

Zeile 1:
Eine Liste der gewünschten Daten bilden. Hierzu brauchst Du @Explode und @TextToTime und eine scheinbar ungewöhnliche Nutzung der extrem starken Listenbearbeitung in der Formelsprache. Heraus kommt folgendes:
@Explode (@TextToTime (@Text (@Adjust (@Today; 0; 0; 1; 0; 0; 0)) + " - " + @Text (@Adjust (@Today; 0; 0; 7; 0; 0; 0))))
Achtung: Das ergibt als Rückgabewert ein Stringarray, zur Weiterverarbeitung brauchst Du also wieder @TextToTime!

Zeile 2:
Über die Ergebnisliste ein @WeekDay. Das kann natürlich auch gleich verwurschtet werden mit Zeile 3, dann hast Du einen Zweizeiler.

Zeile 3:
Wenn Du Wochentage als String brauchst, kannst Du das wieder über die ganze Liste aus Zeile 2 mit @Replace (und @Text!) machen oder mit @Word - das Resultat ist identisch.

Irgendwelche Abfrage auf einen "Overflow" des Wochentages (also grösser Samstag) entfällt, da wir nur pur mit den ermittelten Daten arbeiten. Nix mit Modulo oder so - man muss es ja nicht übertreiben, wenn man in Mathe schwach auf der Brust ist  ;)


HTH,
Bernhard
Titel: Re: Nächste Wochentage ausgehend von heute berechnen
Beitrag von: Tim Pistor am 17.10.16 - 22:30:56
Abendliche Formelrätsel....  ;D

Code
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))
) ;
Titel: Re: Nächste Wochentage ausgehend von heute berechnen
Beitrag von: Peter Klett am 17.10.16 - 22:38:22
Abendliche Formelrätsel....  ;D
Ja, besser als Fernsehen ...

Spannend ist nun, was wirklich gebraucht wird. Bei Euren Ergebnislisten ist das erste Element immer der nächste Tag (bzw. nur die Liste der Wochentage), wenn man daraus z.B. den nächsten Donnerstag ermitteln möchte, muss man durch alle Tage durchlaufen, bis man den gefunden hat. Bei mir ist das immer _n5 oder Tag5. So ganz klar ist mir die Aufgabenstellung allerdings diesbezüglich nicht, wobei meine Alternative zur Darstellung der folgenden Wochentage keine Resonanz gefunden hat, also vermutlich nicht das Gewünschte ist ...
Titel: Re: Nächste Wochentage ausgehend von heute berechnen
Beitrag von: theBastian am 18.10.16 - 08:19:56
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:

Code
NaechsterMontag := 
NaechsterDienstag :=
NaechsterMittwoch := 

@If(@Contains(Textliste ; 2 ; NaechsterMontag ; "") :
@If(@Contains(Textliste ; 3 ; NaechsterDienstag ; "") :
@If(@Contains(Textliste ; 4 ; NaechsterMittwoch ; "") ...
Titel: Re: Nächste Wochentage ausgehend von heute berechnen
Beitrag von: Peter Klett am 18.10.16 - 08:48:50
Code
_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
Titel: Re: Nächste Wochentage ausgehend von heute berechnen
Beitrag von: Tim Pistor am 18.10.16 - 09:14:45
Code
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
Titel: Re: Nächste Wochentage ausgehend von heute berechnen
Beitrag von: theBastian am 18.10.16 - 11:44:15
Danke Peter, habe ich keine fertige Lösung erwartet. ;)

@Tim: Krass. ;) Schaue ich mir auch an.
Titel: Re: Nächste Wochentage ausgehend von heute berechnen
Beitrag von: Tim Pistor am 18.10.16 - 12:08:14
Kann man natürlich schöner (lesbarer) machen...
Wenn einem so ein "Code-Blob" nach ein paar Monaten wieder über den Weg läuft wird man auch erstmal fluchen...  ::)