1

Konu: Hafta hesabı

selamlar;
3 yildir tarih in haftaya çevrimi konusunda sıkıntılar yaşamaktayım.
Üstüne üstlük bir de hesapladığım haftanın +5 veya -5 gibi arttırılıp eksilmesi gibi hesaplamalar yapma ihtiyacı hisstemekteyim.
Sorunun özünde yıl başlarındaki 52,53,1 haftalarda yaşanmakta.


1. Aşağıdaki kodu çalıştırdığınızda 1/1/2008  tarihinin karşısında 08-53 göreceksiniz. Bu tarihin aslında hafta bitmediği için  1/1/2008 -07-53 olması gerekmektedir.

2. Diyelimki 08-03 haftasının -5 hafta değerini 07-51 olması gerekmekte.

Bu gün aşağıdaki kodu yazdım. İçinde problenmi yerleri elle düzelterek bundan sonraki hesaplamalarımı aşağıdaki table ın içinden aratrak hesaplatmayı düşünüyorum.

Bu konularda farklı bir çözümü olan yada önerisi olan varmı?

Visual Fox Pro
CREATE CURSOR haftaa(tarih d,yil N(4),hafta N(2),gun N(1),gunaciklama c(15),thafta c(5),sira i)

FOR a=1 TO 4000
    Lchafta=DATE(2005,12,31)+a
    Lchaftayaz=ALLTRIM(RIGH(STR(YEAR(Lchafta)),2))+"-"+PADL(ALLTRIM(STR(WEEK(Lchafta,3,2),2,2)),2,"0")
    INSERT INTO haftaa(tarih,yil,hafta,gun,gunaciklama,thafta,sira);
        VALUES (Lchafta,YEAR(Lchafta),WEEK(Lchafta,3,2),DOW(Lchafta,2),;
        CDOW(Lchafta),Lchaftayaz,a)
ENDFOR
BROW
Bilmediğin Neyse Yanıldığındır.

2

Re: Hafta hesabı

Visual Fox Pro
clear

o = CREATEOBJECT('WeekUtils',2,3)
 
*!*    CREATE CURSOR haftaa(tarih d,yil N(4),hafta N(2),gun N(1),gunaciklama c(15),thafta c(5),sira i)
*!*    FOR a=1 TO 4000
*!*      m.ldDate=DATE(2005,12,31)+m.a
*!*      INSERT INTO haftaa ;
*!*        (tarih,yil,hafta,gun,gunaciklama,thafta,sira);
*!*        VALUES ;
*!*        (m.ldDate,YEAR(m.ldDate),WEEK(m.ldDate,3,2),DOW(m.ldDate,2),;
*!*        CDOW(m.ldDate),o.DateToWeekString(m.ldDate),m.a)
*!*    ENDFOR
*!*    BROWSE
 
lcWeek = '08-03'
lcAddedWeek = o.AddWeek(m.lcWeek,-5)
? m.lcWeek, o.FDOWFromWeekString(m.lcWeek), o.LDOWFromWeekString(m.lcWeek)
? m.lcAddedWeek, o.FDOWFromWeekString(m.lcAddedWeek),  o.LDOWFromWeekString(m.lcAddedWeek)
 
DEFINE CLASS WeekUtils as Custom
  FDOW      = 0 && First day of week
  FirstWeek = 0 && Week first week flag setting
 
  PROCEDURE Init(tnFDOW,tnFirstWeek)
    this.FDOW      = IIF(EMPTY(m.tnFDOW),     this.FDOW,     m.tnFDOW)
    this.FirstWeek = IIF(EMPTY(m.tnFirstWeek),this.FirstWeek,m.tnFirstWeek)
  ENDPROC
 
  Procedure DateToWeekString(tdDate)
    LOCAL lnWeek
    lnWeek = WEEK(m.tdDate,this.FirstWeek,this.FDOW)
    RETURN ;
      RIGHT(LTRIM(STR(YEAR(m.tdDate) - ;
      iif( m.lnWeek > 51 AND MONTH(m.tdDate) = 1, 1, 0 ))),2) + ;
      '-'+PADL(m.lnWeek,2,'0')
  ENDPROC
 
  Procedure FDOWFromWeekString(tcWeekString,tnRollover) && return FDOW of date from string
    LOCAL lnCentury, lnRollover, lnYear, ldDate, lnWeek, ix, ldFoundDateInWeek
    lnCentury = SET('CENTURY',1)
    lnRollOver = IIF(EMPTY(m.tnRollOver),SET('CENTURY',2),m.tnRollOver)
    lnYear = VAL(m.tcWeekString)
    lnYear = (m.lnCentury + IIF( m.lnYear < m.lnRollOver, 1, 0 )) * 100 + m.lnYear
    ldDate = DATE(m.lnYear,1,1)
    lnWeek = VAL(SUBSTR(m.tcWeekString,4))
    FOR ix=0 TO m.lnWeek+1
      IF this.DateToWeekString(m.ldDate + m.ix * 7) == m.tcWeekString
        ldFoundDateInWeek = (m.ldDate + m.ix * 7)
        RETURN m.ldFoundDateInWeek - DOW(m.ldFoundDateInWeek,this.FDOW) + 1
      endif
    ENDFOR
  endproc
 
  Procedure LDOWFromWeekString(tcWeekString,tnRollover) && return LastDOW of date from string
    RETURN this.FDOWFromWeekString(m.tcWeekString,m.tnRollover)+7-1
  endproc
 
  Procedure AddWeek(tcWeekString,tnValue,m.tnRollover)
    RETURN this.DateToWeekString( ;
      this.FDOWFromWeekString(m.tcWeekString,m.tnRollover) + m.tnValue * 7)
  endproc
enddefine

3

Re: Hafta hesabı

Çetin abi teşekkür ederim

Tam istediğim gibi.
Ancak  belki basit bir şey ama ben bunu "?" ile keran da görebiliyorum  ama vfp sql  içinde kullanmam gerekiyor.
sele * from test where WeekUtils(haftasi,"-5") gibi kullanmak istiyorum. Nasıl yapabiliyim.

Bilmediğin Neyse Yanıldığındır.

4

Re: Hafta hesabı

Function haline çevrilmiş halini yazdım ama test edemedim.

Visual Fox Pro
Function AddWeek

LParameters tcWeekString, tnValue, m.tnRollover
    RETURN DateToWeekString( ;
              FDOWFromWeekString(m.tcWeekString, m.tnRollover) + m.tnValue * 7)
EndFunc
 
Function DateToWeekString
LParameters tdDate, tnFDOW, tnFirstWeek
    Local lnWeek
 
    m.tnFDOW        = IIf(Empty(m.tnFDOW), 2, m.tnFDOW) && First day of week
    m.tnFirstWeek    = IIf(Empty(m.tnFirstWeek), 3, m.tnFirstWeek) && Week first week flag setting
 
    m.lnWeek = Week(m.tdDate, m.tnFirstWeek, m.tnFDOW)
    Return ;
      Right(LTrim(Str(Year(m.tdDate) - ;
          IIf(m.lnWeek > 51 AND Month(m.tdDate) = 1, 1, 0))), 2) + ;
          '-' + PadL(m.lnWeek, 2, '0')
EndFunc
 
Function FDOWFromWeekString
LParameters tcWeekString, tnRollover, tnFDOW && return FDOW of date from string
    m.tnFDOW        = IIf(Empty(m.tnFDOW), 2, m.tnFDOW) && First day of week
    Local lnCentury, lnRollover, lnYear, ldDate, lnWeek, ix, ldFoundDateInWeek
    lnCentury     = SET('CENTURY',1)
    lnRollOver     = IIF(EMPTY(m.tnRollOver), SET('CENTURY',2), m.tnRollOver)
    lnYear = VAL(m.tcWeekString)
    lnYear = (m.lnCentury + IIF( m.lnYear < m.lnRollOver, 1, 0 )) * 100 + m.lnYear
    ldDate = DATE(m.lnYear,1,1)
    lnWeek = VAL(SUBSTR(m.tcWeekString,4))
    For ix = 0 TO m.lnWeek+1
      IF DateToWeekString(m.ldDate + m.ix * 7) == m.tcWeekString
        ldFoundDateInWeek = (m.ldDate + m.ix * 7)
        RETURN m.ldFoundDateInWeek - DOW(m.ldFoundDateInWeek,m.tnFDOW) + 1
      endif
    EndFor
EndFunc
/o---------------------o\
     www.haser.com
\o---------------------o/

5

Re: Hafta hesabı

Visual Fox Pro
lcWeek = '08-03'

o = CREATEOBJECT('WeekUtils',2,3)
 
lcAddedWeek = o.AddWeek(m.lcWeek,-5)
ldStart = o.FDOWFromWeekString(m.lcAddedWeek)
ldEnd   = o.LDOWFromWeekString(m.lcAddedWeek)
 
select * from myTable where Tarih between ;
  m.ldStart and m.ldEnd

6

Re: Hafta hesabı

Artık her 2 yöntemide kullanıyorum. çok teşekkür ederim.

Bilmediğin Neyse Yanıldığındır.