Das Notes Forum

Lotus Notes / Domino Sonstiges => Tipps und Tricks => Thema gestartet von: jr am 21.06.05 - 09:11:06

Titel: Berechnung der Arbeitstage zwischen zwei Terminen
Beitrag von: jr am 21.06.05 - 09:11:06
Hallo,

noch eine weitere @Formel, die vielleicht für einige interessant ist. Häufig hat man dass Problem, dass man in einem kleinen Workflow die Arbeitstage benötigt, weil z. B. nach 3 Arbeitstagen eine Eskalation stattfinden muss. Wenn man das richtig machen möchte, dann muss man Wochenden und Feiertage berücksichtigen und ist die Berechnung nicht mehr ganz trivial.

In der nachfolgenden Formel wird davon ausgegangen, dass die Liste der Feiertage in der Variablen "feierTage" als Text-Liste gespeichert ist (bei uns war das damals ein Konfiguratoinsdokument). Außerdem gibt es noch eine Liste mit halben Feiertagen, sofern der Arbeitgeber diese nicht als vollständig frei definiert.

Mit LotusScript geht das natürlich deutlich einfacher, aber damals war das noch keine Option und außerdem kann man die Formel so leichter in ein berechnetes Feld aufnehmen

Vielleicht kann ja der ein oder andere die Formel gebrauchen.


REM "Berechnung der Arbeitstage zwischen VON und BIS";

von           := ...;
bis           := ...;

feierTage     := "1.1.2005" : "6.1.2005" : ...;
halbeTage     := "24.12.2005" : "31.12.2005" : ...;

alleTageStr   := @Explode(@TextToTime(@Text(Von) + " - " + @Text(Bis)));
alleTage      := @TextToTime(alleTageStr);
wochenendeStr := @Replace(@Text(@Weekday(alleTage)); "1" : "7"; "x" : "x") + alleTageStr;
wochenende    := @Trim(@Right(wochenendeStr; "x"));
freieTage     := @Unique(feierTage : wochenende);
arbeitsTage   := @Trim(@Replace(alleTageStr; @Keywords(alleTageStr; freieTage; ""); ""));
halbeArbTage  := @Keywords(arbeitsTage; halbeTage; "");

anzahlTage    := @Elements(arbeitsTage) - (@Elements(halbeArbTage) / 2);
anzahlTage


Passend hierzu habe ich auch noch die Formel zu berechnen des n-ten Arbeitstags ab einem bestimmten Datum. Es werden die gleichen Konfigurationswerte wie oben benutzt.


REM "Berechnung des n-ten Arbeitstage ab VON";

von           := ...;
n             := ...;

feierTage     := "1.1.2005" : "6.1.2005" : ...;
halbeTage     := "24.12.2005" : "31.12.2005" : ...;

bis           := @Adjust(von; n; 0; 0; 0; 0; 0);
alleTageStr   := @Explode(@TextToTime(@Text(Von) + " - " + @Text(Bis)));
alleTage      := @TextToTime(alleTageStr);
wochenendeStr := @Replace(@Text(@Weekday(alleTage)); "1" : "7"; "x" : "x") + alleTageStr;
wochenende    := @Trim(@Right(wochenendeStr; "x"));
freieTage     := @Unique(feierTage : wochenende : halbeTage);
arbeitsTage   := @Trim(@Replace(alleTageStr; @Keywords(alleTageStr; freieTage; ""); ""));

zielDatum     := @Date(@TextToTime(@Subset(@Subset(arbeitsTage; n); -1)))
zielDatum



Gruß,

Joachim
Titel: Re: Berechnung der Arbeitstage zwischen zwei Terminen
Beitrag von: Semeaphoros am 21.06.05 - 09:22:52
Kannst Du kurz sagen, welches die Unterschiede zu @BusinessDays ist (ausser dass schon früher als ND6 verwendbar ist)?
Titel: Re: Berechnung der Arbeitstage zwischen zwei Terminen
Beitrag von: diali am 21.06.05 - 09:25:24
@BusinessDays zieht die Feiertage nicht ab!

Gruß
Dirk
Titel: Re: Berechnung der Arbeitstage zwischen zwei Terminen
Beitrag von: jr am 21.06.05 - 09:41:40
Du hast recht, unter R6 geht das auch mit @BusinessDays, außer, dass die halben Tage nicht berücksichtigt werden. Die Funktion ist noch aus R4. Ich weiß nicht, wieß den anderen geht, aber bei mir arbeitet die Hälfte meiner Kunden noch mit R5, und da brauche ich die Formel, obwohl ich unter R6 entwickle.

Joachim
Titel: Re: Berechnung der Arbeitstage zwischen zwei Terminen
Beitrag von: jr am 21.06.05 - 09:42:52
Ach ja, den n-ten Arbeitstag ab einem Datum kann man, glaube ich, mit @BusinessDays auch nicht berechnen.

Joachim
Titel: Re: Berechnung der Arbeitstage zwischen zwei Terminen
Beitrag von: jr am 21.06.05 - 09:51:15
Unter R6 habe ich mit der @For-Schleife natürlich noch andere Möglichkeiten...
Titel: Re: Berechnung der Arbeitstage zwischen zwei Terminen
Beitrag von: Semeaphoros am 21.06.05 - 09:51:36
Diali: @BusinessDays zieht die Feiertage ab, wenn diese korrekt im Adressbuch/Kalender hinterlegt sind. Allerdings kennt Notes - wie Joachim richtig sagt - keine halben Feiertage.
Titel: Re: Berechnung der Arbeitstage zwischen zwei Terminen
Beitrag von: diali am 21.06.05 - 09:57:16
@Semeaphoros
ja ich meinte die halben Tage - Sorry hatte das "halbe" vergessen.

Die Tage musst Du als Liste mitgeben oder funktionieren auch Feiertagseinträge im Kalender? Kann ich mir nicht vorstellen, da der Entwickler nicht garantieren kann, dass jeder User dies Feiertage einträgt oder ausversehen einen löscht usw.

Gruß
Dirk
Titel: Re: Berechnung der Arbeitstage zwischen zwei Terminen
Beitrag von: MNoering am 14.03.11 - 15:08:44
Hallo an Alle,

ich weiß, dass dieser Thread schon etwas älter ist, aber er beschreibt genau das Problem, welches ich gerade habe.
Ich habe das unten zitierte Codefragment in eine Datenbank implementiert und die Berechnung der Arbeitstage funktioniert hervoragend.

Hallo,

noch eine weitere @Formel, die vielleicht für einige interessant ist. Häufig hat man dass Problem, dass man in einem kleinen Workflow die Arbeitstage benötigt, weil z. B. nach 3 Arbeitstagen eine Eskalation stattfinden muss. Wenn man das richtig machen möchte, dann muss man Wochenden und Feiertage berücksichtigen und ist die Berechnung nicht mehr ganz trivial.

In der nachfolgenden Formel wird davon ausgegangen, dass die Liste der Feiertage in der Variablen "feierTage" als Text-Liste gespeichert ist (bei uns war das damals ein Konfiguratoinsdokument). Außerdem gibt es noch eine Liste mit halben Feiertagen, sofern der Arbeitgeber diese nicht als vollständig frei definiert.

Mit LotusScript geht das natürlich deutlich einfacher, aber damals war das noch keine Option und außerdem kann man die Formel so leichter in ein berechnetes Feld aufnehmen

Vielleicht kann ja der ein oder andere die Formel gebrauchen.


REM "Berechnung der Arbeitstage zwischen VON und BIS";

von           := ...;
bis           := ...;

feierTage     := "1.1.2005" : "6.1.2005" : ...;
halbeTage     := "24.12.2005" : "31.12.2005" : ...;

alleTageStr   := @Explode(@TextToTime(@Text(Von) + " - " + @Text(Bis)));
alleTage      := @TextToTime(alleTageStr);
wochenendeStr := @Replace(@Text(@Weekday(alleTage)); "1" : "7"; "x" : "x") + alleTageStr;
wochenende    := @Trim(@Right(wochenendeStr; "x"));
freieTage     := @Unique(feierTage : wochenende);
arbeitsTage   := @Trim(@Replace(alleTageStr; @Keywords(alleTageStr; freieTage; ""); ""));
halbeArbTage  := @Keywords(arbeitsTage; halbeTage; "");

anzahlTage    := @Elements(arbeitsTage) - (@Elements(halbeArbTage) / 2);
anzahlTage


Passend hierzu habe ich auch noch die Formel zu berechnen des n-ten Arbeitstags ab einem bestimmten Datum. Es werden die gleichen Konfigurationswerte wie oben benutzt.

...

Gruß,

Joachim

Allerdings funktioniert die Übergabe der Feiertage aus einem Profildokument nicht.

Meine Lösung:

Profildokument Feld:

Berechnen Button:

REM {Berechnung der Arbeitstage zwischen VON und BIS};

von           := StartDate;
bis           := EndDate;

FeierTage     := @GetProfileField("config";"f_tage");
halbeTage     := "24.12.2005" : "31.12.2005" : ...;

alleTageStr   := @Explode(@TextToTime(@Text(Von) + " - " + @Text(Bis)));
alleTage      := @TextToTime(alleTageStr);
wochenendeStr := @Replace(@Text(@Weekday(alleTage)); "1":"7" ; "x":"x") + alleTageStr;
wochenende    := @Trim(@Right(wochenendeStr; "x"));
freieTage     := @Unique(FeierTage : wochenende);
arbeitsTage   := @Trim(@Replace(alleTageStr; @Keywords(alleTageStr; freieTage; ""); ""));
halbeArbTage  := @Keywords(arbeitsTage; halbeTage; "");

anzahlTage    := @Elements(arbeitsTage) - (@Elements(halbeArbTage) / 2);
FIELD UTage   := anzahlTage;
@True


Meine Frage - wie kann ich die Feiertagsliste am besten aus einem Profildokument übergeben?

Freundliche Grüße

Mathias
Titel: Re: Berechnung der Arbeitstage zwischen zwei Terminen
Beitrag von: CarstenB am 14.03.11 - 15:12:52
Wo nutzt du die Formel? Maske, Ansicht, ...?

Gruß
Carsten
Titel: Re: Berechnung der Arbeitstage zwischen zwei Terminen
Beitrag von: MNoering am 15.03.11 - 08:08:55
Moin Carsten,

ich nutze dir Formel in einer Maske hinter einem Button.

Viele Grüße
Mathias
Titel: Re: Berechnung der Arbeitstage zwischen zwei Terminen
Beitrag von: Peter Klett am 15.03.11 - 08:46:51
Ich kann in der Formel keinen Fehler finden.

Wie kommen die Feiertage in das Profildokument? Bist Du sicher, dass die da wirklich drin stehen?
Titel: Re: Berechnung der Arbeitstage zwischen zwei Terminen
Beitrag von: MNoering am 15.03.11 - 12:11:32
Hallo Peter,

das Profildokument selber ist ebenfalls eine Maske in dem die Feiertage eingetragen wurden (per Hand, also Feiertage in die Maske eintragen (auch korrekt getrennt) -> Maske speichern). Wenn ich die gespeicherte Profilmaske hinterher öffne sind die Tage weiterhin in dieser vorhanden.


Viele Grüße
Mathias
Titel: Re: Berechnung der Arbeitstage zwischen zwei Terminen
Beitrag von: Peter Klett am 15.03.11 - 12:24:48
Und mit @GetProfileField kommst Du nicht ran? Sehr merkwürdig. Eigentlich kann man da doch nichts falsch machen, außer den falschen Profil- und/oder Feldnamen zu übergeben (bei Dir "config" und "f_tage", ist das korrekt?). Prüfe vielleicht noch einmal, welchen Profilnamen Du zum Öffnen des Profils und manuellen Eintragen der Daten verwendest.
Titel: Re: Berechnung der Arbeitstage zwischen zwei Terminen
Beitrag von: MNoering am 15.03.11 - 15:46:05
Ich komme mit @GetProfileField soweit ran, dass er das Feiertagsfeld aus dem Profil komplett korrekt in ein Textfeld der Bearbeitungsmaske überträgt (über Feldvorgabewert). -Alle Tage fein säuberlich untereinander... Allerdings ignoriert er dies in der Berechnung... Weil wenn man die Tage direkt in die Variable "FeierTage" schreibt funktioniert es nämlich.
Titel: Re: Berechnung der Arbeitstage zwischen zwei Terminen
Beitrag von: Peter Klett am 15.03.11 - 15:50:53
Wenn Du die Tage direkt schreibst, ist es Text. Vermutlich ist es im Profil Datum, vielleicht liegt da das Problem. Probier mal

FeierTage     := @Text (@GetProfileField("config";"f_tage"));

Wenn ich die Formel richtig verstehe, erwartet sie eine Textliste.
Titel: Re: Berechnung der Arbeitstage zwischen zwei Terminen
Beitrag von: MNoering am 15.03.11 - 16:04:26
Hab es eben kontrolliert- ist beides Text. Hab es nichts desto trotz mit @Text versucht, nur keine Wirkung erzielt. Allerdings habe ich eben mal die Funktion ein bischen umgestellt:

FeierTage := F_Tage (das Feld in dem die Werte vom Profil über den Vorgabewert kommen)

Nun frage ich mich ob Domino evtl. ein Problem hat Berechnungen mit Werten aus externen Dokumenten durchzuführen. Ob man vielleicht erst den Wert in ein Feld oder so schreiben muss bevor es damit arbeiten kann- weil mit dieser Änderung klappt es nämlich oO...

Titel: Re: Berechnung der Arbeitstage zwischen zwei Terminen
Beitrag von: Peter Klett am 15.03.11 - 16:08:55
Das wundert mich schon, allerdings arbeite ich selten mit Profildokumenten, deshalb kann ich nicht sagen, ob es da Merkwürdigkeiten gibt. Wenn es mit dem Feld funktioniert, würde ich das so lassen. Wenn das Feld "berechnet zur Anzeige" ist, wird es auch immer neu gerechnet und nicht im Dokument gespeichert.
Titel: Re: Berechnung der Arbeitstage zwischen zwei Terminen
Beitrag von: MNoering am 15.03.11 - 16:22:09
Lotus/ Domino und seine Mysterien ;) ...

Werd's jetzt erstmal so lassen- nur noch das Feld verstecken in der Arbeitsmaske und fertig.
Ich danke allen für ihre Lösungsvorschläge, insbesondere dem Peter, der ja quasi eine Reaktionszeit von 30 Sekunden hat ;) .

Falls einem Crack in Sachen Profildokumente noch Einfälle kommen sollten, bin ich natürlich trotzdem interessiert diese zu lesen :)

In dem Sinne
Freundliche Grüße
Mathias


EDIT: Noch einmal einen schönen Gruß in die Runde- wollte nur kurz noch vermerken lassen, dass ich es geschafft habe, die Daten direkt aus dem Profil verwerten zu können ohne den Umweg über's Feld nehmen zu müssen. Das Stichwort heißt "Lotus-/ Dominohilfe"- noch einmal ein neues Profildokument nach dortiger Anleitung erstellt (haarklein bis auf den Punkt zu befolgen) und was soll ich sagen- es funktioniert. Mein Fehler beim ersten Profil war wohl, dass es in einer Ansicht angezeigt wurde und/ oder die Erstellung des Profils nicht über die Aktion @Command([EditProfileDocument];Profilname;Schlüssel) erfolgte. Deshalb auch nochmals obigen Aufruf an die Profil-Cracks durchgestrichen...
Titel: Re: Berechnung der Arbeitstage zwischen zwei Terminen
Beitrag von: Tode am 17.03.11 - 17:03:09
<OffTopic>: Witzig... Diese Formel kommt mir irgendwie sehr bekannt vor... Die habe ich zum ersten Mal in einer Workflow- Anwendung meiner Neckarsulmer Kollegen gesehen, die sicherlich schon 10 Jahre alt ist...

Ob die damals schon irgendwo geklaut haben?
</OffTopic>
Titel: Re: Berechnung der Arbeitstage zwischen zwei Terminen
Beitrag von: Peter Klett am 17.03.11 - 19:45:20
Ein Dokument wird nicht automatisch zum Profildokument, weil es die Maske "Profil" hat. Das sind besondere Dokumente, die mit besonderen Methoden angesprochen werden.

Wenn Du anstelle von Profildokumenten lieber gewöhnliche Dokumente verwenden willst, wie Du es zuerst getan hast, kannst Du nicht mit den speziellen Methoden für Profildokumente darauf zugreifen. Stattdessen verwendest Du eben die Methoden, die zum Zugriff auf gewöhnliche Dokumente existieren. In Formelsprache sind dies z.B. @DBLookup oder auch @GetDocField, wenn Dir die UniversalID (oder @DocumentUniqueID) bekannt ist (z.B.  mittels @DBLookup ermittelt).

Profildokumente sind angeblich schneller, lassen sich aber grundsätzlich nicht in Ansichten anzeigen (hier kennt bestimmt wieder irgendwer einen Trick, deshalb schreibe ich "grundsätzlich"). Die Verwaltung von Profildokumenten ist daher schwieriger. Beim Zugriff auf ein nicht existierendes Profildokument wird es erstellt, was zur Fehlermeldung führt, wenn der Benutzer nicht genügend Rechte dazu hat. Programmatisch sind sie natürlich einfacher anzusprechen, so dass sie schon auch Ihre Vorteile insbesondere bei personenbezogenen Einstellungen haben. Bei solchen Einstellungen, wie Du sie benötigst (Feiertage), halte ich sie nicht für besonders geschickt. Da die Information über die Feiertage auch in anderen Datenbanken interssant sein könnten, würde ich sie lieber irgendwo zentral in einer separaten DB definieren, ansonsten musst Du die Daten zwischen den Profildokumenten der verschiedenen Datenbanken abgleichen (ok, heute nutzt Du sie nur in einer DB, aber morgen?)