Datum genereren met behulp van een kwartaal en een interval

Status
Niet open voor verdere reacties.

mava

Nieuwe gebruiker
Lid geworden
3 jun 2022
Berichten
1
ik struikel over volgend probleem:

Voor mijn te onderhouden assets beschik ik over de volgende gegevens in de verschillende tabellen.
In de hoofdtabel van mijn assets is er een veld voorzien waarin kan ingegeven worden in welke kwartaalperiode het onderhoud zou moeten gebeuren. (numerieke waarde 1-4)
In dezelfde tabel is er een veld voorzien voor de interval van de onderhoudsbeurten. vb Jaarlijks, 6 maandelijks, 4 jaarlijks, 250 draaiuren enz... (numeriek veld die het ID bijhoud van de gelinkte tabel met daarin de omschrijving)
In een andere tabel word bijgehouden wanneer het laatste onderhoud is uitgevoerd. vb assetnr: "1" (weegbrug), Datum onderhoud: "22/02/2019"
De visuele weergave wordt getoond in een keuzelijst. (voorbeeld in een word document in bijlage)

Zoals zichtbaar staat er in de kolom "Volgende" reeds de Einddatum van de uit te voeren onderhoudsbeurt die momenteel enkel rekening houd met de interval frequentie en de laatst uitgevoerde datum.
Dit klopt echter niet helemaal omdat er ook moet rekening gehouden worden met de kwartaalperiode.
Mijn vraag is nu: hoe krijg ik uit de kwaartaal periode de laatste weekdag (in datumformaat) van die kwartaalperiode rekening houdende met de huidige kwartaalperiode waarin we zitten.
 

Bijlagen

  • Kwartaalprobleem.docx
    115,1 KB · Weergaven: 12
Ik vind a) je opzet (zoals ik 'm lees; ik heb niet zoveel aan/met een Word document als het een Access vraag betreft) niet goed, en b) snap ik je vraag niet. Als je een frequentie hebt waarin onderhoud moet plaatsvinden (jaarlijks, per kwartaal of maandelijks of op draaibeurten) dan heb je m.i. aan één veld meer dan genoeg. Dus de 4 kolommen Q1-Q4 zijn overbodig. Al was het maar omdat je bij Frequentie Jaarlijks kunt kiezen, en doodleuk dan alle 4 kwartalen kunt aanvinken. Onzinnig. Gebruik alleen velden waarbij geen afhankelijkheid is van andere velden. (Zoek zelf maar op met welke normaal regel je nu zondigt :)). Een onderhoudsbeurt is dan gebaseerd op een aantal standaardgegevens, zoals bijvoorbeeld Aanschafdatum, en/of laatste onderhoudsbeurt. Mij lijkt het dat als je een apparaat op 3-6-#### in bedrijf neemt, het eerstvolgende jaarlijks onderhoud ergens rond 3-6-(####+1) zal moeten plaatsvinden. Als dat niet op een dag steekt, zou het aangeven van een onderhoudsbeurt best met een periode aangegeven kunnen worden. Al doet mijn auto dat bijvoorbeeld niet: die telt echt wel af naar de volgende beurt.

Dus wat wil je dan met de laatste weekdag (bedoel je niet werkdag?) van een kwartaalperiode? En een onderhoudsbeurt baseren op de laatste onderhoudsbeurt lijkt mij ook niet handig. Als een apparaat elk jaar een beurt nodig heeft, dan maakt het niet uit of de laatste beurt door omstandigheden een maand later is uitgevoerd, de eerstvolgende beurt is dan nog steeds op basis van de oorspronkelijk geplande (de allereerste dus) beurt + 1 jaar. Anders loopt je schema dus elk jaar verder uit de pas.

Kortom: gooi de database in de groep, dan kunnen we wat beter zien wat je nu wilt. Of, in mijn ogen, zou moeten​ willen :).
 
Met de volgende formule (voor in een query berekening te zetten) kan je alvast de laatste dag van het kwartaal van een gegeven datum (in het voorbeeld de veldnaam [Datum1] ) in datum formaat krijgen. Dat kan je misschien al een eind verder helpen. Als je de laatste werkdag nodig hebt dan denk ik dat het duidelijker is om dat via VBA te doen en een eigen functie maken. Het kan zijn dat Access daar ook een eigen functie voor heeft, maar ik ben geen programmeur dus kunnen anderen daar misschien beter bij helpen.
Code:
fldQ: Choose(DatePart("q";[Datum1]);CVDate("31-3-" & Year([Datum1]));CVDate("30-6-" & Year([Datum1]));CVDate("30-9-" & Year([Datum1]));CVDate("31-12-" & Year([Datum1])))
 
laatste werkdag kwartaal

laatste werkdag in een kwartaal kan je deze functie vor gebruiken.



Code:
Private Sub Jouwdatum_AfterUpdate() 'Datum veld op het formulier
    Call LdagKwart(Me.Jouwdatum)
End Sub

Function LdagKwart(Jouwdatum As Date) As Date
    LdagKwart = DateSerial(Year(Jouwdatum), Int((Month(Jouwdatum) - 1) / 3) * 3 + 4, 0)
    Call Lwerkdag(LdagKwart)
End Function
Function Lwerkdag(LdagKwart As Date) As Date
    LdagKwart = DateSerial(Year(LdagKwart), Month(LdagKwart) + 1, 0)
        If Weekday(LdagKwart) = 1 Then
            LdagKwart = LdagKwart - 2
        End If
        If Weekday(LdagKwart) = 7 Then
            LdagKwart = LdagKwart - 1
        End If
    Me.LWdag = LdagKwart 'Me.LWdag is Veld op het formulier voor laatste dag in het kwartaal
End Function
 
@pletter: wellicht jou onbekend, maar het gebruik van Call is nu toch wel écht Old Skool programmeren :).
 
call werkt ook als je meer dan één variabele moet meegeven en is veel duidelijker. Good practices blijven belangrijk.
 
Je kunt ook meer variabelen geven zonder Call.
Of doe het zonder aanroep van functies

Code:
Private Sub Jouwdatum_AfterUpdate()
 Dim LdagKwart
 LdagKwart = DateSerial(Year(Jouwdatum), ((Month(Jouwdatum) - 1) \ 3) * 3 + 4, 0)
 
 Select Case Weekday(LdagKwart , 2)
    Case 6: LdagKwart = LdagKwart - 1
    Case 7: LdagKwart = LdagKwart - 2
  End Select
 LWdag = LdagKwart
End Sub
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan