Rekenen met Werkdagen

Status
Niet open voor verdere reacties.

Henk Benter

Gebruiker
Lid geworden
13 mei 2010
Berichten
158
Hallo Forumleden,

Ik heb een database Projectinformatie in ontwikkeling. Een onderdeel hierbij is het het vullen van een een uitvoeringsplanning. Bekend zijn hierbij de begindatum van het project alsmede het aantal dagen dat benodigd zal zijn om de klus te klaren. Graag wil ik het aantal dagen arbeid bij de begindatum optellen, waardoor een einddatum ontstaat. Hierbij dient de tabel rekening te houden met de niet gewerkte dagen (dus: weekenden, feest- en vakantie(vrije)dagen). De feest- en vakantiedagen wil ik benoemen in een aparte tabel. Ik heb al veel oplossingen die aangeboden worden op internet geprobeerd, maar heb helaas nog niet een mooie panklare oplossing voor mijn probleem kunnen vinden. Wie kan mij hierbij helpen. Bijgaand heb ik een schermafdruk gevoegd die waarschijnlijk het e.e.a. kan verduidelijken. Al vast dank voor de aangedragen oplossingen.
 

Bijlagen

  • Projectinformatie.JPG
    Projectinformatie.JPG
    77,4 KB · Weergaven: 94
Het helpt als je ook kunt laten zien welke oplossingen je al hebt geprobeerd. Of wil je dat wij die oplossingen ook nog opzoeken en voorstellen? Lijkt me een beetje zonde van onze tijd :).
 
Ik heb o.a. geprobeerd met de code te werken die ik vond op het internetadres http://access.xps350.com/Werkdagen.html. Deze code leek mij het meest geschikt om te gebruiken in mijn toepassing. De code heb ik ik opgenomen in een publieke module. De tabellen uit de voorbeelddatabase welke was bijgevoegd heb ik ook gekopieerd naar mijn eigen toepassing. Door een aantal onafhankelijke velden toe te voegen heb ik getracht bij een begindatum een aantal (werk)dagen op te tellen middels door te drukken op een gedefinieerde knop. Helaas geen resultaat. Ik moet toegeven dat programmeren in VBA voor mij niet gesneden koek is. Derhalve ben ik op zoek naar een eenvoudigere oplossing dan voornoemde oplossing.
 
De oplossing in de link was mij al bekend, en is een prima oplossing om mee te werken. Simpeler als dit kan het in ieder geval niet, d.w.z.: het kan wel, maar dan haal je jezelf enorm veel werk op de hals. Simpel is: handmatig elke werkdag invoeren als apart record in een tabel. Dan hoef je niks te berekenen. Maar zelfs dat is niet geheel feilloos, omdat je dan zelf rekening moet gaan houden met de feestdagen in een jaar. Je moet dus een controle doen op de ingevoerde werkdagen, en dan zit je toch weer vast aan vba. Kortom: met de oplossing zou je prima uit de voeten moeten kunnen. Ware het niet dat:
Ik moet toegeven dat programmeren in VBA voor mij niet gesneden koek is.
En dan zit je ongeveer op het niveau dat ik prima een brood kan snijden, en dat nu graag zou willen uitbreiden naar open hart operaties; een klus waarvoor ik jammerlijk genoeg de kwalificaties niet heb :). Ergo: een klus die ik toch zou uitbesteden aan een vakman die wél weet wat hij doet! En dat geldt voor jou dus ook: op het moment dat je iets wilt dat je zelf niet beheerst, haal er dan iemand bij die het voor je kan maken. Maar ga niet prutsen met een doe-het-zelf oplossing die nooit goed uit gaat pakken.

Uiteraard mag je jouw db ook posten, zodat we kunnen kijken waar je fout gaat, en eventueel aangeven hoe je het wél aan de praat kan krijgen. Want aan de functies ligt het niet, die werken prima.
 
Hallo Michel,

Een brood kan ik prima snijden. Aan het uitvoeren van een open hart operatie ben ik nog niet toe. Wel ben ik zover dat ik mijn db wil gaan posten. Ik had de code etc. vanuit de voorbeeldatabase al gekopieerd naar mijn database en het e.e.a. aangepast naar mijn database. Voor zover ik na kan zien is het e.e.a. correct gebeurd. Ik heb geen onafhankelijke velden gebruikt in mijn formulier FrmDetailUitvoering, maar heb hier gebruik gemaakt van de velden welke ik heb aangemaakt in mijn tabel, t.w. aanvangsdatum / [aantal dagen arbeid] en einddatum. Door op de knop te drukken zal einddatum gevuld moeten gaan worden. Helaas gebeurd er totaal niets na het indrukken van de gedefinieerde knop, wat ik ook probeer. Ik weet absoluut niet wat ik fout doe. Waar en hoe kan ik mijn database posten. Ik vermoed dat ik de oplossing nabij ben. Al vast dank voor je bericht.

Groet, Henk Benter - Raalte
 
Laatst bewerkt:
Hallo Henk,
De db kun je pas posten als je hem minstens hebt gezipt, want in tegenstelling tot bijv. Excel bestanden accepteert HelpMij geen databases. Die moeten dus in ieder geval een andere extensie hebben dan accdb of mdb, maar zippen is veruit het makkelijkst omdat het bestand daarmee ook nog eens verkleind wordt. Beter nog is om de db eerst te comprimeren om 'de lucht er uit te slaan'. Alles bij elkaar zou hij dan klein genoeg moeten zijn. Is hij nog steeds te groot, dan kun je hem op een fileserver als www.mijnbestand.nl o.i.d. neerzetten, dan kunnen we hem daar ophalen. Dan hoef je hem ook niet te zippen.
 
Hallo Michel,

De database was gezipt nog steeds 180kb. Te groot dus om toe te voegen. Ik heb de database derhalve naar www.mijnbestand.nl geupload.

Dit is het uploadadres:
Al vast dank voor het meedenken.

Groet, Henk Benter - Raalte
 
Laatst bewerkt:
En om welk formulier gaat het? Er zit nogal wat in...
 
De procedure loopt fout op de regel
Code:
     If Not IsNull(DLookup("VAN", "Vakantie", "VAN<=#" & hDat & "# AND TEM>=#" & hDat & "#")) Then
Wat op zich logisch is, want ik zie geen tabel Vakantie. Dus zijn er geen vakantiedagen op te zoeken.
 
En met een kleine aanpassing kun je de functie omzeilen:
Code:
    'Controleren op vakantie dagen
    hDat = Format(Datum, "mm-dd-yyyy")
    On Error GoTo Einde
    If Not IsNull(DLookup("VAN", "Vakantie", "VAN<=#" & hDat & "# AND TEM>=#" & hDat & "#")) Then
        IsZZFVdag = True
        GoTo Einde
    End If

Overigens kun je het berekenen keurig automatisch laten doen op basis van een gebeurtenis op het invullen van het tekstvak <Dgn arbeid>:
Code:
Private Sub Aantal_dagen_arbeid_Change()
    If Not IsNull(Me.Aanvangsdatum) And Not Me.Aantal_dagen_arbeid.Text = vbNullString Then
        Me.Einddatum = PlusWerkdagen(Me.Aanvangsdatum, Me.Aantal_dagen_arbeid.Text)
    Else
        Me.Einddatum = Null
    End If
End Sub
In mijn ogen moet je het de gebruiker zo makkelijk mogelijk maken, dus als hij/zij zonder klikken kan, dan des te beter :).
 
En de laatste aanvulling: de functie IsZZFVdag kan ook een stuk korter.

Code:
Function IsZZFVdag(Datum As Date) As Boolean
Dim Jaar As Integer
Dim TDag As String
Dim Pa1 As Date, hDat As Date

IsZZFVdag = False

'Controleren of de datum een zaterdag of een zondag is
If DatePart("w", Datum) = 1 Or DatePart("w", Datum) = 7 Then
    IsZZFVdag = True
    GoTo Einde
End If

'Controleren op feestdagen met een vaste datum
TDag = Format(Datum, "dd-mm")

Select Case TDag
    Case "01-01"
        IsZZFVdag = True
    Case "30-04"
        IsZZFVdag = True
    Case "05-05"
        IsZZFVdag = True
    Case "25-12"
        IsZZFVdag = True
    Case "26-12"
        IsZZFVdag = True
    Case Else
        Jaar = Year(Datum)
        Pa1 = Pasen(Jaar)
        Select Case Datum
            Case Pa1 - 2            'Controle goede vrijdag
                IsZZFVdag = True
            Case Pa1 + 1            'Controle tweede paasdag
                IsZZFVdag = True
            Case Pa1 + 39            'Controle hemelvaartdag
                IsZZFVdag = True
            Case Pa1 + 50            'Controle tweede pinksterdag
                IsZZFVdag = True
            Case Else                'Controleren op vakantie dagen
                hDat = Format(Datum, "mm-dd-yyyy")
                On Error GoTo Einde
                If Not IsNull(DLookup("VAN", "Vakantie", "VAN<=#" _
                    & hDat & "# AND TEM>=#" & hDat & "#")) Then
                    IsZZFVdag = True
                End If
        End Select
End Select

Einde:
End Function
 
Hallo Michel,

Ik heb het e.e.a. aangepast in mijn database. Ik heb de tabel Vakantie aangemaakt, onder het veld aantal_dagen_arbeid (dit is overigens een nummeriek veld. Ik weet niet of de toevoeging .text in jou code dan correct is) heb ik de code gehangen als boven "bij wijzigen" zoals jij aangeeft. Het laten rekenen van een einddatum op deze wijze is inderdaad mooier en gebruiksvriendelijker dan het gebruik van een aparte knop. Verder heb ik de algemene code ook aangepast zoals door jou voorgesteld. Helaas wordt het veld einddatum na wijziging of toevoeging van het aantal werkdagen tot op heden nog steeds niet gevuld met een einddatum. Er verschijnt helemaal niets in dit veld. Het heeft mij ondertussen al veel tijd gekost en zal me nog wel veel tijd gaan kosten. Ik wil het gewoon voor elkaar zien te krijgen. Ondanks het mooie weer hier in het oosten van het land, kruip ik iedere keer weer achter de computer en tracht ik het e.e.a. werkend te krijgen. Mocht je, ondanks je hulp tot op heden, nog bereid zijn te helpen, dan stel ik dit overigens zeer op prijs. Ik ben zo vrij geweest nogmaals de bijgewerkte database te uploaden naar mijnbestand.nl.

Groet, Henk Benter - Raalte
 
Laatst bewerkt:
Ik snap het niet; in mijn variant werkt het prima. Die post ik hier dus maar even bij. Kijk maar wat er gebeurt als je 5 dagen of 7 dagen invult.
 

Bijlagen

Hallo Michel,

We zijn eruit. Inhoud Inschakelen via opties van VBA-macros wil wel eens helpen. Dit was het probleem. Mijn eigen database werkt nu ook correct. Ik wil je hartelijk danken voor je hulp. Ik vermoed dat ik verder niet tegen al te veel problemen aan zal lopen. De toepassing is vrij basic op dit moment.

Groet, Henk Benter - Raalte
 
Ik had het kunnen weten... Bericht #13:
Helaas gebeurd er totaal niets na het indrukken van de gedefinieerde knop, wat ik ook probeer.
Typisch een geval van te hoge macrobeveiliging! Zijn zo van die zinnetjes waar je makkelijk overheen leest, maar die vrij essentieel zijn bij het programmeren. Excuses derhalve dat ik dat zelf niet gezien heb :)
 
Mag je de vraag nog op <Opgelost> zetten :)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan