Ga naar inhoud

WeekFiscalToDate - Bereken datum met jaar en iso-weeknr


menno

Aanbevolen berichten

Filemaker is een amerikaans programma en dat is onder andere te merken aan wijze waarop met kalenderdata wordt omgegaan. In de functie WeekOfYear() is 1 januari altijd week 1 en dan is het heel gemakkelijk om aan de hand van een weeknummer de datum uit te rekenen.

 

Wij gebruiken echter in europa de iso-methode voor onze weekberekening en daarbij geldt dat wanneer 1 januari valt op maandag t/m donderdag, 1 januari in week 1 valt en anders in de laatste week van het voorgaande kalenderjaar. De functie die wij daarvoor kunnen toepassen is WeekOfYearFiscal ( datum ; 1edagvandeweek ). Dat wordt dan in de praktijk voor onze kalenders: WeekOfYearFiscal ( datum ; 2 ).

 

Het uitrekenen van de datum aan de hand van het weeknummer en het jaar wordt dan al iets lastiger. Ik kon op internet wel een aantal formules vinden die van een vaste begindag (maandag) uitgaan en dan keurig de datum uitrekenden, maar geen enkele die uitging van een specifiek opgegeven dag. Dus ik heb wat zitten knutselen en op ben de onderstaande formule uitgekomen.

 

De formule hieronder is als Custom Function geschreven, maar hij is niet recursief en daarom kan je hem ook gewoon in je velddefinities toepassen als je geen Filemaker Advanced hebt. Hij is toepasbaar in alle versies vanaf FMP7.

 

//    ########################################################################################
//    ##    WeekFiscalToDate function
//    ##    Author:
//    ##    Menno van Beek - STB Automatisering & Advies BV - Houten, the Netherlands
//    ##    
//    ##    Format:   
//    ##    WeekFiscalToDate ( Yearnr ; WeeknrOfYear ; Firstweekday )
//    ##    
//    ##    Parameters:
//    ##    Yearnr          =    between 1 and 4000 
//    ##    WeeknrOfYear    =    any natural number, limited only by the resulting date
//    ##    Firstweekday    =    1…7 (sunday…saturday)
//    ##    
//    ##    Data type returned:
//    ##    Date calculated from the given fiscal weeknumber in the given year at the given Firstweekday
//    ##    
//    ##    Description:   
//    ##    This function works more or less as the inverse function of WeekOfYearFiscal(), which
//    ##    is built into Filemaker. Only instead of calculating the weeknumber, it calculated the date
//    ##    for the given day of the given weeknr.
//    ##    
//    ##    Other use:
//    ##    You can also use this function to calculate a particular occurrence of a day in a given month:
//    ##    WeekFiscalToDate ( Year ; 
//    ##                       WeekOfYearFiscal ( Date ( Month ; 7 * occurrence ; Year ) ; Firstweekday ) ; 
//    ##                       Firstweekday )
//    ##    
//    ##    February 24, 2013
//    ########################################################################################

Let( 
[ 
Dd1Yr = Date ( 1 ; 1 ; Yearnr ) ;                                   // january 1st
Dy1Wk1 = DayOfWeek ( Dd1Yr - Firstweekday ) ;                       // 1st day of week of january 1st
WeekOfYear1 = WeekOfYearFiscal ( Dd1Yr ; Firstweekday ) ;           // weeknr of january 1st
Dd1Wk1 = Dd1Yr - Dy1Wk1 + If ( WeekOfYear1 > 1 or Dy1Wk1 = 7 ; 7 )  // date of 1st day of weeknr 1 of year
] ; 
Dd1Wk1 + ( WeeknrOfYear - 1 ) * 7 )                                 // the result as date

 

Je kan behalve dat je de datum van een gegeven week kan uitrekenen, ook aan de hand van de incidentie van een dag uitrekenen welke datum daar bij hoort met behulp van WeekOfYearFiscal. De formule die je dan gebruikt (gebruik makend van de CF) wordt dan:

WeekFiscalToDate ( Year ; 
                  WeekofYearFiscal ( Date ( Month ; 7 * incidentie ; Year ) ; Firstweekday ) ; 
                  Firstweekday )

Bijvoorbeeld met prinjesdag ... de derde dinsdag van september voor 2013 wordt dan:

WeekFiscalToDate ( 2013 ; WeekofYearFiscal ( Date ( 9 ; 7 * 3 ; 2013 ) ; 3 ) ; 3 ) = 17-9-2013

voor 2014: 16-9-2014

voor 2015: 15-9-2015

voor 2016: 20-9-2016

 

[edit 4-3-2013]code 2e formule gecorrigeerd[/edit]

aangepast door Gast
Link naar reactie

Doe mee aan dit gesprek

Je kunt dit nu plaatsen en later registreren. Indien je reeds een account hebt, log dan nu in om het bericht te plaatsen met je account.

Gast
Antwoord op deze discussie...

×   Geplakt als verrijkte tekst.   Plak in plaats daarvan als platte tekst

  Er zijn maximaal 75 emoji toegestaan.

×   Je link werd automatisch ingevoegd.   Tonen als normale link

×   Je vorige inhoud werd hersteld.   Leeg de tekstverwerker

×   Je kunt afbeeldingen niet direct plakken. Upload of voeg afbeeldingen vanaf een URL in

×
×
  • Nieuwe aanmaken...