*============================================================================== * GetDate * ------- * * Purpose.......: Returns the date that falls on the specified day, week, * year combination. * Author........: Daniel Rouleau - Metro Information Services * Last Revision.: 2001-02-27 * * Syntax........: GetDate( tnYear, ; * tnWeek, ; * tnDayOfWeek, ; * [tnFirstWeek], ; * tnFirstDayOfWeek) ; * ) * Returns.......: Date * Arguments.....: tnYear * Specifies the year of the date to return. * * tnWeek * Specifies the week number of the date to return. * * tnDayOfdWeek * Specifies the day of the week of the date to return. * * tnFirstWeek * Specifies the requirements for the first week of the year. * Default is 0. See Week() in VFP 6.0 Help for details. * * tnFirstDayOfWeek * Specifies the first day of the week. Default is 0. * See Week() in VFP 6.0 Help for details. * * Remarks.......: *============================================================================== Lparameters tnYear, tnWeek, tnDayOfWeek, tnFirstWeek, tnFirstDayOfWeek Local ldRetVal Local lnFirstDay Local ldFirstDayOfYear Local lnFirstWeek Local ldJanuary01 Local lnJanuary01Dow Local lcCenturry Local lcDate Local lnStrictDate *----------------------- * Validate parameters. *----------------------- If Vartype(tnYear) 'N' Or Int(tnYear) tnYear Or Not Between(tnYear, 1, 9999) Or ; Vartype(tnWeek) 'N' Or Int(tnWeek) tnWeek Or Not Between(tnWeek, 1, 53) Or ; Vartype(tnDayOfWeek) 'N' Or Not Inlist(tnDayOfWeek, 1, 2, 3, 4, 5, 6, 7) Then *-- Return an empty date as we have an invalid combination. Return {} EndIf If Vartype(tnFirstWeek) = 'N' And Inlist(tnFirstWeek, 1, 2, 3) Then lnFirstWeek = tnFirstWeek Else lnFirstWeek = 0 EndIf If Vartype(tnFirstDayOfWeek) = 'N' And Inlist(tnFirstDayOfWeek, 1, 2, 3, 4, 5, 6, 7) Then lnFirstDayOfWeek = tnFirstDayOfWeek Else lnFirstDayOfWeek = 0 EndIf If lnFirstWeek = 0 Then lnFirstWeek = Set('FWeek') EndIf If lnFirstDayOfWeek = 0 Then lnFirstDayOfWeek = Set('FDow') EndIf *------------------- * Change settings. *------------------- lnStrictdate = Set('Strictdate') lcCentury = Set('Century') lcDate = Set('Date') Set Strictdate to 0 Set Century On Set Date to Ansi *----------- * Process. *----------- ldJanuary01 = CTOD(Right('0000' + Ltrim(Str(tnYear, 4)),4) + '.01.01') lnJanuary01Week = Week(ldJanuary01, lnFirstWeek, lnFirstDayOfWeek) lnJanuary01Dow = Dow(ldJanuary01) Do Case Case tnFirstWeek = 1 ldFirstDayOfYear = ldJanuary01 - (lnJanuary01Dow - lnFirstDayOfWeek) Case tnFirstWeek = 2 If lnJanuary01Dow - lnFirstDayOfWeek >= 4 Then ldFirstDayOfYear = ldJanuary01 + (7 + lnFirstDayOfWeek - lnJanuary01Dow) Else ldFirstDayOfYear = ldJanuary01 + (lnFirstDayOfWeek - lnJanuary01Dow) Endif Case tnFirstWeek = 3 If lnFirstDayOfWeek >= lnJanuary01Dow Then ldFirstDayOfYear = ldJanuary01 + (lnFirstDayOfWeek - lnJanuary01Dow) Else ldFirstDayOfYear = ldJanuary01 + (7 + lnFirstDayOfWeek - lnJanuary01Dow) EndIf EndCase If tnDayOfWeek >= lnFirstDayOfWeek Then ldRetVal = ldFirstDayOfYear + (7 * (tnWeek-1)) + (tnDayOfWeek - lnFirstDayOfWeek) Else ldRetVal = ldFirstDayOfYear + (7 * (tnWeek)) + (tnDayOfWeek - lnFirstDayOfWeek) EndIf Clear ? ldJanuary01 ? lnJanuary01Dow ? ldFirstDayOfYear ? ldRetVal *------------------- * Rstore settings. *------------------- Set Date To &lcDate Set Century &lcCentury Set Strictdate to &lnStrictDate Return ( ldRetVal )