Datum over aantal werkdagen

Maak je wel eens offertes of planningen waarbij het aantal werkdagen relevant is? Bijvoorbeeld iets als “We schatten dit op 9 dagen werk. Als we [datum 1] kunnen beginnen zijn we klaar op [datum 2]”.

Wanneer je 5-6 dagen moet inplannen lukt het je waarschijnlijk wel uit je hoofd om even te kijken wat er qua weekend tussen valt. Maar als je inschat dat iets 30 dagen is wordt het al meer gedoe.

En dan nog feestdagen misschien. Of specifieke dagen die jij vrij bent. Nu kun je je agenda er bij gaan pakken en met een pen tellen, de weekenden overslaan, en netjes turven.

Maar het is natuurlijk veel handiger om dit door je computer te laten doen. We kunnen bijvoorbeeld de Opdrachten app gebruiken om dit gewoon voor ons te laten doen.

Wat is het doel van deze automatisering?

We willen starten met een bepaalde datum (wat de datum van vandaag kan zijn), opgeven hoe veel werkdagen we nodig hebben, en dan weten wat de einddatum is.

Eventueel zou het ook handig kunnen zijn om de daadwerkelijke lijst met werkdagen te zien.

Wat hebben we nodig om het aantal werkdagen te berekenen?

Het aantal werkdagen uitrekenen op deze manier kunnen we op verschillende manieren doen, met verschillende programma’s.

Ik gebruik hier de gratis Opdrachten-app (voor de iPhone en iPad), maar op de Mac of Windows zou je het bijvoorbeeld met TextExpander’s script-functie kunnen doen.

Verder hebben we van de gebruiker de startdatum en het aantal werkdagen nodig. Een lijst met feestdagen is ook handig, dus die heb ik van de rijksoverheid overgenomen. Helemaal 100% is het niet, omdat er sommige feestdagen zijn waarvan de datum niet altijd gelijk is.Dat zou je eventueel één keer per jaar kunnen bijwerken.

We gaan straks in de Opdracht controleren of de datum in een weekend valt (klik voor volledige versie van de Opdracht)

We gaan straks in de Opdracht controleren of de datum in een weekend valt (klik voor volledige versie van de Opdracht)

Hoe kunnen we zien wat de einddatum is over “X” werkdagen?

Ok, door naar de Opdracht zelf!

Wanneer je de Opdracht alvast wilt downloaden kan dat door hier te klikken: download Opdracht.

Initialisatie: de eerste variabelen

We beginnen met het zetten van een aantal variabelen die we later nodig gaan hebben.

Eerst een lijstje feestdagen. Feestdagen slaan we straks over als werkdag, ook al vallen ze misschien op een doordeweekse dag.

We vragen de gebruiker — dat ben jij straks — om het aantal dagen wat ingepland moet worden. Dit is vrij belangrijk. 😉

En dan maken we nog twee variabelen aan die we later nodig hebben: maxAantalDagen en dagenTeller.

Die eerste hebben we nodig omdat Opdrachten geen “oneindige lus” kan doen. We kunnen alleen maar aangeven dat we iets X aantal keer willen doen. Bijvoorbeeld 10 keer dezelfde actie uitvoeren.

In dit geval weten we nog niet hoe vaak we het willen doen (als we dat wisten hadden we de Opdracht waarschijnlijk niet nodig), dus geven we een groot getal op en stoppen we de lus straks gewoon vroeg.

We gebruiken hier nu “999”, wat waarschijnlijk genoeg is in de meeste gevallen. Als je moet plannen over een periode die meer dagen dan dat beslaat (en we hebben het hier over het totale aantal dagen, niet alleen werkdagen) kun je dit getal verhogen.

In de dagenTeller houden we straks bij hoe veel werkdagen we gezien hebben. Als de dagenTeller gelijk is aan het aantal dagen dat we zoeken, hebben we de einddatum bereikt.

We starten met een paar variabelen

We starten met een paar variabelen

Zoeken naar het juiste aantal werkdagen

Dan gaan we nu de lus in! We gaan de acties binnen de lussen herhalen voor maxAantalDagen keer. Standaard is dat hier 999 keer.

Het eerste wat we gaan doen is de opgegeven startdatum ophalen (laatsteDag), daar 1 dag bij optellen, en dat de nieuwe startdatum maken.

Dan kijken we of het een werkdag is, door te controleren of het een doordeweekse dag is en of het een feestdag is.

Als het een werkdag is tellen we 1 op bij de dagenTeller. Op die manier kunnen we straks vergelijken of we al bij het totaal aantal werkdagen zijn.

Verder voegen we de huidige datum (laatsteDag) toe aan de (nieuwe) variabele werkdagen. Ik gebruik hier het datumformaat “Kort”, maar je kunt hier kiezen wat je zelf prettig vindt.

Op deze manier hebben we aan het einde straks een variabele met alle werkdagen die we zijn tegengekomen. Dit kunnen we straks gebruiken om een lijst met de werkdagen te maken.

Maar hoe werkt die controle nu echt? Hoe weten we of iets een werkdag is?

Controleren of de datum een doordeweekse dag is

Om te controleren of iets een werkdag is doen we twee dingen: we kijken of het een doordeweekse dag is, en of het geen feestdag is.

Voor beide controles gebruiken we Formatteer datum, wat de datum omzet naar een specifiek formaat. (Zo zou je 8 maart 1993 kunnen weergeven als 8-3-1993, 1993/03/08, of “Maandag, 8 maart 1993”.)

We gebruiken in beide gevallen een aangepaste datumnotatie, waar we zelf een formaat kunnen opgeven met bepaalde letters. d betekent hier bijvoorbeeld “dag zonder voorloopnul” (dus “8” in “8 maart 1993”), en dd is “dag mét voorloopnul” (dus “08”).

Een volledig overzicht vind je terug in de Unicode Technical Standard #35.

Hier gebruiken we simpelweg “e”. In de Unicode standaard vinden we hier over:

Local day of week number/name, format style. Same as E except adds a numeric value that will depend on the local starting day of the week. For this example, Monday is the first day of the week.

1 = maandag, 2 = dinsdag, 3 = woensdag, 4 = … Je snapt het principe.

Dat betekent dat de weekend-dagen 6 en 7 zijn.

Nu we dat weten kunnen we kijken of de huidige datum kleiner is dan 6. Als dat het geval is, hebben we te maken met een doordeweekse dag.

Feestdagen uitsluiten

Dan willen we nog kijken of het een feestdag betreft. Als dat zo is willen we het overslaan.

Eerder hebben we de variabele feestdagen gemaakt, en nu kunnen we controleren of de huidige dag overeenkomt met een onderdeel uit die lijst.

In de lijst met feestdagen hebben we het formaat “08-03” gebruikt, dus hier moeten we de datum ook op die manier zetten: “dd-MM”. (Let op dat we een hoofdletter M moeten gebruiken; een kleine letter m geeft minuten, niet de maand.)

Kerst is voor kerstballen, niet om te werken ;)

Kerst is voor kerstballen, niet om te werken 😉

Einde bereikt

Na elke controle kijken we of we al aan het aantal werkdagen zitten. Als de gebruiker bijvoorbeeld “10” heeft opgegeven, en we hebben nu 10 werkdagen opgeteld, hebben we de einddatum bereikt.

We geven nu twee opties aan de gebruiker: alleen de einddatum kopiëren, of de hele lijst met werkdagen.

Voor het laatste gebruiken we de actie Voeg tekst samen om alle werkdagen in de lijst samen te voegen, steeds op een nieuwe regel.

Dan kopiëren we het gekozen resultaat naar het klembord en eindigen we met Sluit Opdracht.

Als we dat laatste niet zouden doen moeten we wachten op de 999 herhalingen (of hoe veel je hebt ingesteld) voor we klaar zijn. Dat is niet zo handig, dus zetten we de “Sluit Opdracht” die de Opdracht vroegtijdig stopt.

Download de Opdracht

Wil je aan de slag met deze Opdracht? Je kunt het downloaden via de volgende link:

https://strategischlui.nl/download-opdracht/datum-over-aantal-werkdagen

Je kunt natuurlijk zelf nog wijzigingen maken, zoals de lijst met feestdagen. En er zijn nog een paar dingen die je zou kunnen doen…

Uitbreidingen op deze Opdracht

Er zijn nog een aantal dingen die je zou kunnen doen om de Opdracht uit te breiden voor jouw situatie.

Wanneer je bijvoorbeeld geen vijf dagen, maar drie dagen per week wilt werken aan dit project.

Of misschien werk je niet van maandag t/m vrijdag, maar alleen op maandag, dinsdag en donderdag.

Of je wilt niet het lijstje feestdagen gebruiken, maar echt een agenda waarin je feestdagen en andere vrije dagen noteert.

Oefening voor de lezer om dat te implementeren… 😉 (Hoewel je me ook altijd mag mailen, en dan help ik je graag.)

[voornaam]
[voornaam]
[emailadres]
[emailadres]
[submit]
[submit]
[submit]
[submit]
[formId]
[formId]
[return]
[return]
[formName]
[formName]
[voornaam]
[voornaam]
[emailadres]
[emailadres]
[submit]
[submit]
[submit]
[submit]
[formId]
[formId]
[return]
[return]
[formName]
[formName]
[voornaam1]
[voornaam1]
[email1]
[email1]
[submit]
[submit]
[submit]
[submit]
[formId]
[formId]
[return]
[return]
[formName]
[formName]
[voornaam1]
[voornaam1]
[email1]
[email1]
[submit]
[submit]
[submit]
[submit]
[formId]
[formId]
[return]
[return]
[formName]
[formName]