Roger Posted November 17, 2007 Posted November 17, 2007 Beste FileMaker bollebozen, Even een puzzeltje voor de zaterdagmorgen: In een database bevatten de records o.a. twee velden waarvan de ene de maand (tekstveld) en de andere het jaar (getalveld) aanduidt. Ik wil nu graag van elke maand weten op welke datum de derde dinsdag valt. De vraag is, hoe doen we dat? Met vriendelijke groeten, Roger van Dongen Quote
0 Rony Rabijns Posted November 17, 2007 Posted November 17, 2007 Let ( [ m = If ( IsEmpty ( Maand ) or Maand < 1 or Maand > 12 ; Month ( Get ( CurrentDate ) ) ; Maand ) ; y = If ( IsEmpty ( Jaar ) ; Year ( Get ( CurrentDate ) ) ; Jaar ) ] ; Date ( m ; Mod ( 2 - DayOfWeek ( Date ( m ; 1 ; y ) ) + 7 ; 7 ) + 16 ; y ) ) Ik heb hiervoor een functie aangepast die ontwikkeld werd door Theo Ros. We vertrekken hier van een numerieke waarde voor de maand. Quote
0 Rony Rabijns Posted November 17, 2007 Posted November 17, 2007 Er zit nog wel een foutje in ... Als de eerste dag van de maand een dinsdag is, wordt de 4de dinsdag opgegeven als resultaat. Quote
0 Roger Posted November 17, 2007 Author Posted November 17, 2007 Dat ziet er mooier uit dan mijn oplossing (heb zelf ook nagedacht namelijk) : If ( DayName ( Date ( maand_getal ; 15 ; expiratie_jaar ) ) = "vrijdag" ; Date ( maand_getal ; 15 ; expiratie_jaar ) ; If ( DayName ( Date ( maand_getal ; 16 ; expiratie_jaar ) ) = "vrijdag" ; Date ( maand_getal ; 16 ; expiratie_jaar ) ; If ( DayName ( Date ( maand_getal ; 17 ; expiratie_jaar ) ) = "vrijdag" ; Date ( maand_getal ; 17 ; expiratie_jaar ) ; If ( DayName ( Date ( maand_getal ; 18 ; expiratie_jaar ) ) = "vrijdag" ; Date ( maand_getal ; 18 ; expiratie_jaar ) ; If ( DayName ( Date ( maand_getal ; 19 ; expiratie_jaar ) ) = "vrijdag" ; Date ( maand_getal ; 19 ; expiratie_jaar ) ; If ( DayName ( Date ( maand_getal ; 20 ; expiratie_jaar ) ) = "vrijdag" ; Date ( maand_getal ; 20 ; expiratie_jaar ) ; If ( DayName ( Date ( maand_getal ; 21 ; expiratie_jaar ) ) = "vrijdag" ; Date ( maand_getal ; 21 ; expiratie_jaar )))))))) Quote
0 Rony Rabijns Posted November 17, 2007 Posted November 17, 2007 Deze rekent beter dan de vorige: Let ( [ m = If ( IsEmpty ( Maand ) or Maand < 1 or Maand > 12 ; Month ( Get ( CurrentDate ) ) ; Maand ) ; y = If ( IsEmpty ( Jaar ) ; Year ( Get ( CurrentDate ) ) ; Jaar ) ] ; Date ( m ; Mod ( 2 - DayOfWeek ( Date ( m ; 1 ; y ) ) + 8 ; 7 ) + 15 ; y ) ) Quote
0 Roger Posted November 17, 2007 Author Posted November 17, 2007 Waarbij mijn oplossing overigens de derde vrijdag aangeeft i.p.v. dinsdag, maar het gaat uiteraard even om het principe... Quote
0 Roger Posted November 17, 2007 Author Posted November 17, 2007 Beste Rony, Een erg mooie oplossing. Complimenten! Groeten, Roger Quote
0 JeanWM Posted November 17, 2007 Posted November 17, 2007 Ik heb de vraag voor de grap vandaag even aan de groep gegeven, met dit verschil dat het voor gelijk welke dag, maand en jaar moest zijn. (het is de groep die nog in FM 6 zit, dus hier en daar zal een functie misschien een andere naam hebben) Ze kwamen op het volgende (het geheel kan in 1 monster Let() berekening, maar voor de duidelijkheid doen we het hier even afzonderlijk): day = text – valuelist : Sunday Monday Tuesday Wednesday Thursday Friday Saturday month = text – valuelist : January February March April May June July August September October November December occurrence = text - valuelist 1st 2nd 3rd 4th 5th year = number We converteren de dayText naar number dayConverted_cn = Case(day = "Sunday"; 6; day = "Monday"; 5; day = "Tuesday"; 4; day = "Wednesday"; 3; day = "Thursday"; 2; day = "Friday"; 1; day = "Saturday"; 0) We converteren de monthText naar number monthConverted_cn= Case(month = "January"; 1; month = "February"; 2; month = "March"; 3; month = "April"; 4; month = "May"; 5; month = "June"; 6; month = "July"; 7; month = "August"; 8; month = "September"; 9; month = "October"; 10; month = "November"; 11; month = "December"; 12) We converteren de occurrence naar number occurenceConverted_cn = ((GetAsNumber(occurrence) - 1) * 7) + 1 We gooien alles in een finale berekening: nthOccurrenceDate_cd = Date(monthConverted_cn; occurenceConverted_cn; year) + Mod(7 - (-1 * (Mod(-1 * (DayOfWeek(Date(monthConverted_cn; 1; Year)) + dayConverted_cn ); 7))); 7) Nu krijg je voor iedere nthDay van iedere nthMonth in ieder nthYear de datum. De volgende stap is het geheel in een CF gieten. Van de nthOccurrenceDate_cd kun je nog een 'display' berekening maken dat 'Invalid' geeft indien de vraag een 'onmogelijke datum' is, zoals b.v. de niet bestaande 5de woensdag van een maand. Dat zou dan iets kunnen zijn als: zi_dateDisplay_ct = If(Month(nthOccurrenceDate_cd ) <> GetAsNumber(monthConverted_cn); "Invalid"; GetAsText(nthOccurrenceDate_cd )) Quote
0 rmw Posted November 18, 2007 Posted November 18, 2007 En deze is zelfs zo aardig dat als je de 12e dinsdag van december 2007 opvraagt hij netjes 19-2-2008 teruggeeft Let ( [ xDagNr = DayofWeek ( Date ( maand ; 1 ; jaar ) ) ] ; Date ( maand ; 1 + dag - xDagNr + If ( xDagNr > dag ; 7 ; 0 ) + ( ( voorkomen - 1 ) * 7 ) ; jaar ) ) waarbij 'maand' , 'jaar', 'dag' en 'voorkomen' getalvelden zijn en deze berekening in een datum resulteert. Dus: maand=12, jaar=2007, dag=3 (dinsdag) en voorkomen=12 rmw Quote
0 JeanWM Posted November 18, 2007 Posted November 18, 2007 De onze doet dat ook, daarom de eerste beperking via Popup Menu valuelists. Dan kun je moeilijk 'rare' zaken opvragen. En met de Popup Menu kun je geen andere waarden ingeven zoals bij een simpel Popup List. Quote
Question
Roger
Beste FileMaker bollebozen,
Even een puzzeltje voor de zaterdagmorgen:
In een database bevatten de records o.a. twee velden waarvan de ene de maand (tekstveld) en de andere het jaar (getalveld) aanduidt. Ik wil nu graag van elke maand weten op welke datum de derde dinsdag valt.
De vraag is, hoe doen we dat?
Met vriendelijke groeten,
Roger van Dongen
9 answers to this question
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.