2006

Maj

19

Av

Med FileMaker Pro 8 och egna funktioner är det relativt lätt att beräkna svenska helgdagar. Svenska helgdagar kan delas in i fasta dagar, dvs. de som alltid förekommer på en speciell dag på året som Nyårsafton och Julafton, dagar som är beroende av när påsk infaller och dagar som infaller t.ex. första fredagen efter en viss datum (t.ex. midsommarafton).

Det behövs 3 egna funktioner i FileMaker Pro 7/8 för att åstadkomma detta. Den första funktionen beräknar datum för Påskdagen för ett specifikt år. Denna beräkning kan hittas på många ställen på internet, ett utmärkt ställe att leta på för FileMaker-användare är www.briandunning.com, alla FileMaker-utvecklares Mecka. Där har jag hittat en funktion för att beräkna påskdagen enligt följande: 

mvEaster (myDate) = 
Let( [ 
   Y = Year(myDate) ;
     C = Floor(Y/100);
     N = Y - 19*Floor(Y/19);
     K = Floor((C - 17)/25);
     I = C - Floor(C/4) - Floor((C - K)/3) + 19*N + 15;
     I2 = I - 30*Floor((I/30));
     I3 = I2 - Floor(I2/28)*(1 - Floor(I2/28)*Floor(29/(I2 + 1))
          *Floor((21 - N)/11));
     J = Y + Floor(Y/4) + I3 + 2 - C + Floor(C/4);
     J2 = J - 7*Floor(J/7);
     L = I3 - J2;
     M = 3 + Floor((L + 40)/44);
     D = L + 28 - 31*Floor(M/4)
 ] ; 

 Date ( M ; D ; Y )
)

Jag ska inte närmare gå in på hur denna fungerar, utan konstaterar bara att den fungerar.

Den andra funktionen ser till att hitta första datum som infaller en viss veckodag efter ett givet datum. Den hittar t.ex. första datum efter 19 juni som infaller en fredag, dvs. Midsommarafton (jag är lite osäker på om det är den 19 juni som är det magiska datumet, men om jag inte minns helt fel är det så).

Denna ser ut så här:

mvFirstAfter(veckodag; datum) = 
If(DayOfWeek ( datum ) = veckodag;datum;mvFirstAfter(veckodag;datum+1))

Parametern “veckodag” är t.ex. 5 för fredag. Till sist kommer den stora funktionen där alla helgdagar finns uppräknade (jag kan ha glömt någon?):

mvHoliday (datum) =
Let([
sDay = Day(datum);
sWeekDay = DayOfWeek(datum);
sMonth = Month(datum);
sEaster = mvEaster(datum);
sEasterDay1 = Day(sEaster-2);
sEasterMonth1 = Month(sEaster-2);
sEasterDay2 = Day(sEaster-1);
sEasterMonth2 = Month(sEaster-1);
sEasterDay3 = Day(sEaster);
sEasterMonth3 = Month(sEaster);
sEasterDay4 = Day(sEaster+1);
sEasterMonth4 = Month(sEaster+1);
sKH = sEaster+39;
sKHDay1 = Day(sKH);
sKHMonth1 = Month(sKH);
sMidsommar = mvFirstAfter(6;Date(6;19;Year(datum)));
sMidsommarDay = Day(sMidsommar);
sMidsommarMonth = Month(sMidsommar);
sAllaHelgon = mvFirstAfter(7;Date(10;31;Year(datum)));
sAllaHelgonDay = Day(sAllaHelgon);
sAllaHelgonMonth = Month(sAllaHelgon)
];
Case(
sMonth = 1 and sDay = 1;"Nyårsdagen";
sMonth = 1 and sDay = 5;"Trettonafton";
sMonth = 1 and sDay = 6;"Trettondagen";
sMonth = 5 and sDay = 1;"1 maj";
sMonth = 6 and sDay = 6;"Sveriges Nationaldag";
sMonth = 12 and sDay = 24;"Julafton";
sMonth = 12 and sDay = 25;"Juldagen";
sMonth = 12 and sDay = 26;"Annandag jul";
sMonth = 12 and sDay = 31;"Nyårsafton";
sMonth = sEasterMonth1 and sDay = sEasterDay1;"Långfredag";
sMonth = sEasterMonth2 and sDay = sEasterDay2;"Påskafton";
sMonth = sEasterMonth3 and sDay = sEasterDay3;"Påskdagen";
sMonth = sEasterMonth4 and sDay = sEasterDay4;"Annandag påsk";
sMonth = sKHMonth1 and sDay = sKHDay1;"Kristi Himmelfärdsdag";
sMonth = sMidsommarMonth and sDay = sMidsommarDay;"Midsommarafton";
sMonth = sAllaHelgonMonth and sDay = sAllaHelgonDay;"Alla Helgons dag";
sWeekDay = 7;"Lördag";
sWeekDay = 1;"Söndag";
"")
)

Först tar jag reda på påskens alla helgdagar, Kristi Himmelfärdsdag som alltid infaller 39 dagar efter Påskdagen, sedan Midsommarafton och alla Helgons dag som alltid infaller på en viss veckodag och till sist de fasta helgdagarna.

Om du inte vill kopiera funktionerna från web-sidan finns ett exempelregister att ladda ner här.

Som vanligt gäller att egna funktioner endast kan göras med FileMaker Advanced.

Skriv en kommentar

  • (will not be published)
  • × one = 6

Läs också: