Freitag, 11. Dezember 2009

Datumsspielereien (Teil 5) / Date gadgets (Part 5)

Heute gibt es eigentlich nur einen kleinen Nachtrag.

Im 4. Teil der Datumsspielereien drehte es sich u. a. darum, wie wir die korrekte Kalenderwoche berechnen. Der umgekehrte Weg, aus einer Kalenderwoche wieder ein Datum zu generieren fehlte allerdings.

Wenn wir ein solches Datum berechnen sollen, dann müssen wir uns auf einen von sieben Tagen der Woche einigen. Der Einfachheit halber habe ich in der folgenden Beispielfunktion den Wochenbegin (=Montag) gewählt.

Die Funktion GetMondayFromCalWeek() erwartet maximal 2 Parameter. Wird kein zweiter Parameter (=Jahr) übergeben, so erfolgt die Datumsberechnung auf dem aktuellen Kalenderjahr sowie der als Parameter 1 übergebenen Kalenderwoche.

CLEAR
?GetMondayFromCalWeek(51)        && Für 2009: 14.12.2009
?GetMondayFromCalWeek(4,2010)    &&           25.01.2010

FUNCTION GetMondayFromCalWeek as Date
LPARAMETERS vWeek as Integer, vYear as Integer
   
    LOCAL ldDate as Date
   
    * // Wenn kein Jahr übergeben wurde, dann arbeiten wir mit dem aktuellen
    m.vYear    = IIF ( VARTYPE ( m.vYear ) <> [N],YEAR ( DATE () ) ,m.vYear )
    * // der 1.1. des gewählten Jahres stellt die Basis für die Berechnung   
    ldDate    = CTOD ( [01.01.] + ALLTRIM ( STR ( m.vYear ) ) )
    * // Wenn der 01.01. in der 1. Kalenderwoche liegt, dann ist alles gut,   
    * // andernfalls müssen wir 7 Tage hinzuaddieren.                       
    ldDate    = IIF ( WEEK ( ldDate,2,2 ) <> 1,ldDate + 7,ldDate )
    * // Den Montag der Woche des Datums berechnen und die Anzahl der Wochen
    * // hinzuaddieren. Dies ergibt den Montag der übergebenen Kalenderwoche
    RETURN ldDate - ( DOW ( ldDate,2 ) - 1 ) + ( ( m.vWeek - 1 ) * 7 )

ENDFUNC

3 Kommentare:

  1. Hi Thomas,

    Isch hätt da mal wieder ein paar Optimierungen ;)

    a) Bei der Zuweisungen an Variablen brauchts kein "m." davor, denn aus der Syntax ist für VFP eindeutig klar, dass ein Variable zugewiesen wird. Das "m." muss nur bei der ABFRAGE einer Variablen verwendet werden.

    b) die ersten zwei Zeilen würd ich so schreibseln:

    vYear = EVL(m.vYear, YEAR(DATE()))
    ldDate = DATE(m.vYear,1,1)

    Und ALLTR(STR()) is ja sowieso sowas von Retro ;), besser durch TRANS() ersetzen.

    Abaer ansonsten find ich deine Beiträge echt gut! Mach weiter so...
    wOOdy

    AntwortenLöschen
  2. Hallo wOOdy,

    die Sache mit den m.-Variablen steckt zu tief drin, das bekomme ich in diesem Leben wohl nicht mehr raus :-)))

    Du hast mit dem DATE(m.vYear,1,1) ja sowas von Recht. Und was die Sache noch peinlicher macht, Du hast mich bei der Osternberechnung bereits diesbzgl. angeschubst... :-)

    Die EVL() Funktion ist aber auch nicht schlecht, die habe ich bisher immer irgendwie übersehen/ignoriert/geblindfischt.

    Also: Danke fürs lesen und kommentieren!!

    -Tom

    AntwortenLöschen
  3. Oh shitto. Stimmt.... Mai 2008 hatte ich dir schon mal genau dieselben Fehler "angekreidet" bzw EVL() und DATE() nahegelegt ;) Siehste: Alzheimer ist doch was praktisches! ;)

    AntwortenLöschen