1

Konu: haftadan tarih çevirimi

selamlar ;
Aşağıda 2008 yılına kadar kullancığım kod var ama 2008 de bir türlü çalıştıramadım.
tarih olaran 7/1/2008 çıkıyor o da 2. hafta.

Visual Fox Pro
LOCAL yilbasi,hafta,haftatar,tarih

** gelenhafta="07-36" doğru çalışıyor
gelenhafta="08-01"
hafta=VAL(RIGHT(ALLTRIM(gelenhafta),2))
yilbasi = CTOD("01/01/"+LEFT(ALLTRIM(gelenhafta),2))
haftatar = yilbasi + ((hafta-1) * 7)
IF DOW(haftatar) = 1
    haftatar = haftatar + 1
ENDIF
IF DOW(haftatar) > 2
    haftatar = haftatar + 9 - DOW(haftatar)
ENDIF
? haftatar
Bilmediğin Neyse Yanıldığındır.

2

Re: haftadan tarih çevirimi

sesimi duyarn varmı?

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

3

Re: haftadan tarih çevirimi

http://www.tek-tips.com/faqs.cfm?fid=3683

yukaridaki linkteki ornekler isine yararmi bilmiyorum

4

Re: haftadan tarih çevirimi

selamlar;
malesef bu sadece ayın ilk ve son günü ile ilgili benim sorunum ise "36. hafta nın salı günü hangi tarihidir" şeklinde

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

5

Re: haftadan tarih çevirimi

Visual Fox Pro
Xgün=DATE(2007,1,1)

DO WHIL ! DOW(Xgün)=3 AND ! WEEK(Xgün)=36
*DOW() ve WEEK() fonksiyon parametrelerini kontrol et
  Xgün=Xgün+1
ENDD
?Xgün
VFP9 SP2

6

Re: haftadan tarih çevirimi

sanırım anlatamadım.
elimde tarih olsa sorun olmaz zaten. elimde sadece "08-01" bu var. ilk 2 karekter yil son 2 karekter hafta
bunu tarihe çevrilmesi lazım.
gün önemli değim!
2008 yılının 1. haftasına gelen gerhangibi bir günün tarihi lazım bana.
pazarteside olur pazarda.

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

7 Son düzenleyen, taRKan (07.09.2007 12:30:07)

Re: haftadan tarih çevirimi

Aslında sorun şu 31.12.2007 tarihide 1. hafta olarak görünür.
Senin işini aşağıdaki kod çözecektir.

Visual Fox Pro
? TarihBul(2008, 1) && 06.01.2008

Return
 
Function TarihBul
LParameters tnYil As Integer, tnHafta As Integer
*!*    Haftanın son gününü bulur
    Local lnI As Integer
    m.lnI = 0
    Do While Week(Date(m.tnYil, 1, 1) - m.lnI, 0, 2) = 1
        m.lnI = m.lnI + 1
    EndDo
    m.lnI = m.lnI - 1
 
    Return Date(m.tnYil, 1, 1) - m.lnI + 7 * m.tnHafta - 1
EndFunc
/o---------------------o\
     www.haser.com
\o---------------------o/

8

Re: haftadan tarih çevirimi

çok teş bu işime yaradı.

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

9

Re: haftadan tarih çevirimi

selamlar;
ayıtır sorma cuma güne ait tarih için için ne yapıla bilir.
(yaptım gerçide yinede bi sorayım dedim)

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

10 Son düzenleyen, taRKan (07.09.2007 14:49:06)

Re: haftadan tarih çevirimi

Gönderilen yıl ve hafta için; o yılda cuma günü yoksa yılın ilk günü getirir.

Örneğin; 2011 yılının ilk haftası dediğimizde 27.12.2010 ile 02.01.2011 tarihleri anlamına gelir.
01.01.2011 yılı cumartesinden başlar.

Visual Fox Pro
? TarihBul(2008, 1) && 04.01.2008

? TarihBul(2010, 1) && 01.01.2010
? TarihBul(2011, 1) && 01.01.2011
Return
 
Function TarihBul
LParameters tnYil As Integer, tnHafta As Integer
*!*    Haftanın cuma gününü bulur
    Local lnI As Integer, ldHesaplanan As Date
    m.lnI = 0
    Do While Week(Date(m.tnYil, 1, 1) - m.lnI, 0, 6) = 1
        m.lnI = m.lnI + 1
    EndDo
    m.lnI = m.lnI - 1
 
    m.ldHesaplananGun = Date(m.tnYil, 1, 1) - m.lnI
 
    If (Year(m.ldHesaplananGun) <> m.tnYil And Day(m.ldHesaplananGun) = 31) Or ;
            (Year(m.ldHesaplananGun) = m.tnYil And Day(m.ldHesaplananGun) = 1)
        Return Date(m.tnYil, 1, 1)
    Else
        Return m.ldHesaplananGun + 7 * m.tnHafta
    EndIf
EndFunc
/o---------------------o\
     www.haser.com
\o---------------------o/

11

Re: haftadan tarih çevirimi

Ramazan,
Ne yapmak istedigini anlamadan yaziyorum:)

Visual Fox Pro
gelenhafta="08-01"

? HaftaninIlkGunu(m.gelenhafta)
 
gelenhafta="07-36"
? HaftaninIlkGunu(m.gelenhafta)
 
FUNCTION HaftaninIlkGunu(tcYearAndWeek, tnFDOW)
tnFDOW = iif(empty(m.tnFDOW),1,m.tnFDOW)
ldDate = DATE(2000+VAL(m.tcYearAndWeek),1,1)
DO while WEEK(m.ldDate,3,m.tnFDOW) != VAL(SUBSTR(m.tcYearAndWeek,4))
    ldDate = m.ldDate + 1
ENDDO
return m.ldDate

12 Son düzenleyen, konuka (08.09.2007 13:28:17)

Re: haftadan tarih çevirimi

WEEK() fonksiyonunu 1. parametresi ile neden kullanmıyorsunuz ? (Aslında ÇetinB kullanmış, ben Tarkan'ın örneğinden yola çıkmıştım)
?DATE(2008,1,1)                 = 01.01.08
?WEEK(DATE(2008,1,1))      = 1
?WEEK(DATE(2008,1,1),3)   =52

Visual Fox Pro
Xgün=DATE(2008,1,1)  && 2008->2000+VAL(LEFT("08-01",2))

DO WHIL  ! WEEK(Xgün,3)=VAL(RIGH("08-01",2))
  Xgün=Xgün+1
ENDD
?Xgün
VFP9 SP2

13

Re: haftadan tarih çevirimi

Çetin,
Mrduyar'ın sıkıntısı senenin ilk haftasıyla ilgili oluyor. Örneğin 2011 yılının ilk haftasında cuma yok, o zaman kod hatalı değer döndürüyor.

/o---------------------o\
     www.haser.com
\o---------------------o/

14

Re: haftadan tarih çevirimi

Valla gene anlamadim, Cuma nasıl yok? Her haftada vardir.

15

Re: haftadan tarih çevirimi

ben de ilk önce anlamamıştım ama alt sağda windows  saat ikonuna 2 tıklayıp tarihi 1/1/2011 yılına çekince anladım.
1/1/2011 tarihi 2011 yılının ilk ayının ilk haftası ve ilk günü. ayrıca cumartesi yani haftanın son günü.
(eğer haftayı pazardan başlatırsanız). tarihi 1 gün geri alırsanız (31/12/2010) 1 yıl 12 ay 52 hafta geri almış olursunuz. tarihi 1 gün ileri alırsanız (02/01/2011) 1 hafta 1 gün ileri almış olursunuz. yani 1/1/2011 tarihi yılın ilk haftasında sadece 1 gün içermektedir , 7 gün değil.sonraki gün hafta atlatır çünkü.
böyle olunca da dönüş değeri yanlış oluyor. Tarkan'ın demek istediği bu.

16

Re: haftadan tarih çevirimi

Takvim sistemini papaz Grogeryan'a bırakırsanız olacağı budur.

Sorunu hesaplamada öncelikler ile mantık bazına oturtmak gerekiyor diye düşünüyorum:
Aynı hafta önceki yılın sonu ve bu yılın başı olunca bu yıl öncelik alıyor.

WEEK(tarih,hafta sistemi,haftanın ilk günü) gibi oluşturulmuş.
Galiba hafta sistemi belirleyici oluyor 1-1 Ocak'lı hafta yılın ilk haftası , 2-ilk hafta 4 günlük olmalı (demokratik), 3-İlk hafta tam 7 gün.    örneklersek: (önce takvim)
? "Pt    Sa    Ça    Pe    Cu    Ct    Pa"
? "27    28    29    30    31    01    02"
özelgün=DATE(2011,1,1)
?CDOW(özelgün)        && Ct
?CDOW(özelgün-1)     && Cu
?WEEK(özelgün,1,1)      && 1. hafta, Pazar başlayan haftada 1.1.11 Ct ilk takvim haftası oldu
?WEEK(özelgün+1,1,1)  &&  2. hafta, Pazar başlayan haftada 2.1.11 Ct 2. takvim haftası oldu
?WEEK(özelgün-1,1,1)   &&  1. hafta, aynı hafta 52 ve 1 olmuyor (31.12.2010)
?WEEK(özelgün,1,2)
?WEEK(özelgün-1,1,2)
?WEEK(özelgün,3,1)
?CDOW(özelgün+1)

soru aşağıdaki şekilde konmuştu: "gün önemli değim!
2008 yılının 1. haftasına gelen gerhangibi bir günün tarihi lazım bana.
pazarteside olur pazarda." o zaman önerilen çözüm WEEK parametreleri ile ilgili oluyor (haftanın ilk iş günü, ilk tatil günü gibi)

VFP9 SP2

17

Re: haftadan tarih çevirimi

Cetin,
Ercan güzel ifade etmiş demek istediğimi. smile

/o---------------------o\
     www.haser.com
\o---------------------o/

18

Re: haftadan tarih çevirimi

ercan yazdı:

ben de ilk önce anlamamıştım ama alt sağda windows  saat ikonuna 2 tıklayıp tarihi 1/1/2011 yılına çekince anladım.
1/1/2011 tarihi 2011 yılının ilk ayının ilk haftası ve ilk günü. ayrıca cumartesi yani haftanın son günü.
(eğer haftayı pazardan başlatırsanız). tarihi 1 gün geri alırsanız (31/12/2010) 1 yıl 12 ay 52 hafta geri almış olursunuz. tarihi 1 gün ileri alırsanız (02/01/2011) 1 hafta 1 gün ileri almış olursunuz. yani 1/1/2011 tarihi yılın ilk haftasında sadece 1 gün içermektedir , 7 gün değil.sonraki gün hafta atlatır çünkü.
böyle olunca da dönüş değeri yanlış oluyor. Tarkan'ın demek istediği bu.


Ben gene de anlayamıyorum kusura bakmayın. 1 gun geri alınca nasıl 1 yıl 12 ay 52 hafta geri  almıs oluyorum, ya da ileri alınca 1 gun 1 hafta ileri hic mi hic anlamadım. Week() gerekli parametreleri iceriyor bence.
Neyse anlasılan benim kafamın basmadıgı bir konu.

19 Son düzenleyen, ercan (09.09.2007 18:43:26)

Re: haftadan tarih çevirimi

Anlatayım Çetin hocam
(öncelikle 1/1/2011 yılının takvimini ekrana getirin.)
1/1/2011 tarihi 2011 yılının ilk haftasının ilk ve son günü. değil mi?
1 gün ileri gitseniz 2. hafta oluyor. değil mi?
halbuki sadece 1 gün ileri gittik fakat buna rağmen 1 hafta ileri atlıyor.
tarihi 1 gün geri alınca geçen yılın 52. haftası oluyor.
dolayısıyla 2011 yılının sadece 1. günü , 1. haftası oluyor.              2. gün 2. haftaya atlıyor.
Umarım dilim dolaşmadan anlatabildim.

Ya da şöyle bir soru sorayım:2011 yılının ocak ayının ilk haftasının 2. ya da 3. günü hangi gündür?

20 Son düzenleyen, mrduyar (10.09.2007 08:01:04)

Re: haftadan tarih çevirimi

selamlar;

ercan yazdı:

Ya da şöyle bir soru sorayım:2011 yılının ocak ayının ilk haftasının 2. ya da 3. günü hangi gündür?


Şaşıracaksın ama 04/01/2011 ve 05/01/2011 dir nedeni ise; hafta 7 gündür ve bütündür bölünemez, önemli olan ilk günüdür, içinde barındırdığı günler değildir.
Bu durumda 1/1/2011 ve 2/1/2011 2010 yılının son haftasıdır ve daha bitmemeiştir.
Ocak ayına girmiş olmamız yeni bir haftaya başlayacağımız anlamına gelmez. Bir önceki yılın son haftası ne zaman biterse yeni yılın ilk haftası o zaman başlamalı.

ben sorunumu daha demode bir yöntemle çözdüm.

Visual Fox Pro
? haftatotarih("08-01") 

? haftatotarih("11-01")
RETURN
FUNCTION haftatotarih
    LPARAMETERS gelenhafta
    SET SYSFORMATS ON
    tnhafta=VAL(RIGHT(ALLTRIM(gelenhafta),2))
    tnyil=2000+VAL(LEFT(ALLTRIM(gelenhafta),2))
    *!* Haftanın son gününü bulur
    LOCAL lni AS INTEGER,haftatar AS DATE
    m.lni = 0
    DO WHILE WEEK(DATE(m.tnyil, 1, 1) - m.lni, 0, 2) = 1
        m.lni = m.lni + 1
    ENDDO
    m.lni = m.lni - 1
    haftatar=DATE(m.tnyil, 1, 1) - m.lni + 7 * m.tnhafta - 1
    *!* Haftanın son gününü pazartesiye çevirir
    IF  DOW(haftatar)= 1
        haftatar = haftatar - 2
    ENDIF
    SET SYSFORMATS OFF
    RETURN haftatar
ENDFUNC

buradan edindiğim bilgileride değerlendirmekteyim.
Tüm arkadaşlara emeklerinden dolayı teşekkürler.

Bu çalışmada fark ettiğim bir şey daha oldu. sysytem formatlarını kullanmak la el ile ayarlarığım
formatlarda sorun çıkmakta. Bu tarih/hafta sorunlarını yenmek için doğru parametreler ne olmalı
http://www.wagner.com.tr/silme_vfp/vfp_tarih.jpg

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

21

Re: haftadan tarih çevirimi

ercan yazdı:

Anlatayım Çetin hocam
(öncelikle 1/1/2011 yılının takvimini ekrana getirin.)
1/1/2011 tarihi 2011 yılının ilk haftasının ilk ve son günü. değil mi?
1 gün ileri gitseniz 2. hafta oluyor. değil mi?
halbuki sadece 1 gün ileri gittik fakat buna rağmen 1 hafta ileri atlıyor.
tarihi 1 gün geri alınca geçen yılın 52. haftası oluyor.
dolayısıyla 2011 yılının sadece 1. günü , 1. haftası oluyor.              2. gün 2. haftaya atlıyor.
Umarım dilim dolaşmadan anlatabildim.

Ya da şöyle bir soru sorayım:2011 yılının ocak ayının ilk haftasının 2. ya da 3. günü hangi gündür?


"1/1/2011 tarihi 2011 yılının ilk haftasının ilk ve son günü. değil mi?"

Degisir. Ilk hafta biraz kisisel bir kavram. VFP'nin yardim dosyasinda da bu durum belirtiliyor:

1 Ilk hafta 1 Ocak'i icerir.
2 Ilk haftanin buyuk bolumu (4 gun) o seneye dahildir.
3 Ilk haftanin 7 gunu vardir.

3.parametre de haftanin ilk gunu belirtmene izin veriyor.

1/1/2011 2011 yilinin ilk haftasi olsa bile, ilk ve son gunu demek degil. Kural hafta Pazartesiden baslar ise, 3 Ocak'ta ilk hafta baslar. 1 ve 2 Ocak 2010 yilinin son haftasina aittir.

Isi karmasiklastirmanin anlami da yok zaten. Haftalar yillara ait olmayan 7 gunluk bloklar. Yilin ilk haftasi gibi ayin ilk haftasi demeye baslaninca o zaman daha da karisacak, bu durum aylar icin cok daha fazla goruluyor.

2. 3. gunlerini sorman gerekiyorsa sen kural olarak:
-o haftanin 7 gunu oldugunu
-cumartesinin haftanin son gunu
oldugunu varsayiyorsun.

"halbuki sadece 1 gün ileri gittik fakat buna rağmen 1 hafta ileri atlıyor." Bir hafta atlamiyor, bir sonraki haftaya geciyor diyebilirsin, hafta 7 gun, 7 gun atlamiyor.

31 Aralik'tan da 1 gun ileri gidersen bir sonraki seneye gecer, bir sene atlamaz. Yoksa o mantikla 31 Aralik ile 1 Ocak arasi 1 sene ya da 1 ay ya da 1 haftadir denebilirdi.

Cumartesi gunu ise baslayan ve haftalik pesin maas alan birisi icin hafta daima Cumartesi gunu baslar ve daima 7 gundur. 2011 yilinin ilk gunu maas alir ama, 2010 yilinin ilk gunu almaz. Yani onun icin iki yilin ilk haftasi farkli tarihlerde baslar. 2010 yilinin ilk gunu onun icin 2009 yilinin 53.haftasidir. Bu da sanki 1 yil 52 haftadir demekle celisiyor gibi duruyor ama ne bir yil 52 haftadir, ne de 1 ay 4 haftadir.

Uzun lafin kisasi, week() parametreleriyle esneklik sagliyor.

22 Son düzenleyen, mrduyar (10.09.2007 12:44:04)

Re: haftadan tarih çevirimi

selamlar;
cetin abi bende week() parametreleriyle esneklik sağlandığına inanıyorum.
Ama kullanıcı tarafında bazı sorunları çıkıyor. 1 gün(31/12/2007) için 53. hafta olurmu onuda 52 ye dahil ediverelim" denilip bizler hafatayı 8 güne çıkarıyoruz.
Başka söze gerek varmı?:D

Ondan sonrada İş içinden çıkılmaz bir hal alıyor.

Benim çözümüm;

Visual Fox Pro
crea table haftalitarih (tarih d,hafta c(5),rhafta c(5),id i)


bu  table yaparak çözüyorum.  tarihlerin karşısına gelmesi gereken haftaları yazdırıyor.
genelde yıl sonu ve başlarınıda elle düzlttiriyorum.
Tabi bende özel bir durum daha var rapor aylarını içeren haftalarda kaymada olabiliyor.
Şubat gibi martın ilk haftasıda şubat raporunda olması gerektiği için onun içinde bir kolonum var.

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

23 Son düzenleyen, foxman (10.09.2007 14:27:56)

Re: haftadan tarih çevirimi

ISO 8601 Standartına göre. Bir yılın haftasından tarih hesaplama.

http://www.phys.uu.nl/~vgent/calendar/isocalendar.htm

http://www.personal.ecu.edu/mccartyr/isowdcal.html


Visual Fox Pro
* WeekToDate("2007-W14-1") yıl-haftanumarası-haftanın kaçıncı günü.

 
 
?WeekToDate("2007-W14-1")
?WeekToDate("1903-W53-4")
 
Function WeekToDate()
    Lparameters strWeek
 
    intYY = Val(Left(strWeek, 4))
    intWW = Val(Substr(strWeek, At("W",strWeek,1) + 1, 2))
    intDD = 1
    intDS = Val(Right(strWeek, 1))-1
 
    If ( intYY % 4 = 0  And  intYY % 100 <> 0) Or  intYY % 400 = 0
        lyear = 1
    Else
        lyear = 0
    Endif
 
    D104   = Date(intYY, 1, 4)
    D104WD = Dow(D104, 2)
    Y104   = (intWW - 1) * 7 + intDD - D104WD
    Do Case
        Case Between(Y104, -7 ,-4 )
            nYY = intYY-1
            nMM = 12
            nDD = 31 + 4 + Y104
        Case Between(Y104, -3 ,27 )
            nYY = intYY
            nMM = 1
            nDD = Y104 + 4
        Case Y104>=28 And Y104<56+lyear
            nYY = intYY
            nMM = 2
            nDD = Y104 - 27
        Case Y104>=56+lyear+0 And Y104<87+lyear
            nYY = intYY
            nMM = 3
            nDD = Y104 - 55 - lyear
        Case Y104>=87+lyear+0 And Y104<117+lyear
            nYY = intYY
            nMM = 4
            nDD = Y104 - 86 - lyear
        Case Y104>=117+lyear+0 And Y104<148+lyear
            nYY = intYY
            nMM = 5
            nDD = Y104 - 116 - lyear
        Case Y104>=148+lyear+0 And Y104<178+lyear
            nYY = intYY
            nMM = 6
            nDD = Y104 - 147 - lyear
        Case Y104>=178+lyear+0 And Y104<209+lyear
            nYY = intYY
            nMM = 7
            nDD = Y104 - 177 - lyear
        Case Y104>=209+lyear+0 And Y104<240+lyear
            nYY = intYY
            nMM = 8
            nDD = Y104 - 208 - lyear
        Case Y104>=240+lyear+0 And Y104<270+lyear
            nYY = intYY
            nMM = 9
            nDD = Y104 - 239 - lyear
        Case Y104>=270+lyear+0 And Y104<301+lyear
            nYY = intYY
            nMM = 10
            nDD = Y104 - 269 - lyear
        Case Y104>=301+lyear+0 And Y104<331+lyear
            nYY = intYY
            nMM = 11
            nDD = Y104 - 300 - lyear
        Case Y104>=331+lyear+0 And Y104<361+lyear
            nYY = intYY
            nMM = 12
            nDD = Y104 - 330 - lyear
        Case Y104>=361+lyear+0 And Y104<365+lyear
            nYY = intYY + 1
            nMM = 1
            nDD = Y104 - 365 - lyear + 4
    Endcase
 
    WToDate = Date(nYY,nMM,nDD)+intDS
 
    Return WToDate
Endfunc


ISO 8601 Standartına göre. Tarih vererek yıl hafta hesaplama.

Visual Fox Pro
?ISOWeekNum(Date(2005,1,1),2)

?ISOWeekNum(Date(2005,1,8),2)
 
Function ISOWeekNum
    Lparameters AnyDate,WhichFormat
    * WhichFormat: missing or <> 2 then returns week number, = 2 then YYWW
 
    ThisYear = Year(AnyDate)
    ThisYearStart = YearStart(ThisYear)
    PreviousYearStart = YearStart(ThisYear - 1)
    NextYearStart = YearStart(ThisYear + 1)
    Do Case
        Case AnyDate >= NextYearStart
            ISOWeekNum = (AnyDate - NextYearStart) / 7 + 1
            YearNum = Year(AnyDate) + 1
        Case AnyDate < ThisYearStart
            ISOWeekNum = (AnyDate - PreviousYearStart) / 7 + 1
            YearNum = Year(AnyDate) - 1
        Otherwise
            ISOWeekNum = (AnyDate - ThisYearStart) / 7 + 1
            YearNum = Year(AnyDate)
    Endcase
 
    If Pcount()=1
        Return ISOWeekNum
    Endif
    If Pcount()=2 And WhichFormat = 2
        ISOWeekNum = Trans(YearNum, "@L ####")+"-"+Trans(ISOWeekNum, "@L ##")
        Return ISOWeekNum
    Endif
Endfunc
 
Function YearStart
    Lparameters WhichYear
 
    NewYear = Date(WhichYear, 1, 1)
    WeekDay = Dow(NewYear,3)
 
    If WeekDay < 4
        YearStart = NewYear - WeekDay
    Else
        YearStart = NewYear - WeekDay + 7
    Endif
 
    Return YearStart
Endfunc


Bir cursor veya table içinde verilen tarih aralığında weeklist oluşturma.

Visual Fox Pro
Close Database All

 
Create Cursor weeklist (DATE1 D,DATE2 D,CYEAR C(4),CWEEK C(2),DAY1 C(10),DAY2 C(10))
Select weeklist
Index On CYEAR+CWEEK Tag YEARWEEK
 
SET ENGINEBEHAVIOR 70
 
oweeklist=Createobject("weeklist")
Set Date YMD
oweeklist.makelist(Date(1900,1,1),Date(2500,12,31))
Set Date German
 
Define Class weeklist As Custom
 
    dpsdate=Ctod("  .  .  ")
    dpedate=Ctod("  .  .  ")
 
    Procedure makelist
        Parameters psdate,pedate
        Set Fdow To 2
        Set Fweek To 2
 
        Create Cursor weeks (Year C(4),Week C(2),dat1 D,dat2 D,dn1 C(10),dn2 C(10))
        Select weeks
        Index On dat2 Tag yw
 
        DATE1=psdate
        nday =pedate-psdate
        For iw=1 To nday
            DATE1=DATE1+1
            CYEAR=Transform(Year(DATE1),"@L ####")
            CWEEK=Transform(Week(DATE1,0,2),"@L ##")
            Select weeks
            Seek DATE1
            If Not Found()
                Append Blank
                Replace Year With CYEAR,Week With CWEEK,dat2 With DATE1
            Endif
        Endfor
        Go Top
        Do While Not Eof()
            cyw=Week
            dd2=dat2
            Replace dat1 With dd2 While Week=cyw
        Enddo
        Replace All Year With Transform(Year(dat1),"@L ####"),dn1 With Cdow(dat1),dn2 With Cdow(dat2)
        Go Top
        Select dat1 As DATE1,dat2 As DATE2,Year As CYEAR,Week As CWEEK,dn1 As DAY1,dn2 As DAY2,Max(Year+Week+Dtos(dat2)) From  weeks Group By Year,Week,dat1 Into Cursor weeks1 Readwrite
        Select weeks1
        Do While Not Eof()
            Do Case
                Case DATE1<>DATE2 And CWEEK<"02"
                    Replace CYEAR With Transform(Year(DATE2),"@L ####")
                Case DATE1<>DATE2 And CWEEK>="52"
                    Replace CYEAR With Transform(Year(DATE1),"@L ####")
            Endcase
            Skip
        Enddo
        Index On CYEAR+CWEEK Tag yw
        Select weeks1
        Go Top
        Do While Not Eof()
            If weeks1.DAY1="Monday" And weeks1.DAY2="Sunday"
                cfinder=weeks1.CYEAR+weeks1.CWEEK
                Select weeklist
                Seek cfinder
                If !Found()
                    Insert Into weeklist (DATE1,DATE2,CYEAR,CWEEK,DAY1,DAY2) Values (weeks1.DATE1,weeks1.DATE2,weeks1.CYEAR,weeks1.CWEEK,weeks1.DAY1,weeks1.DAY2)
                Endif
            Endif
            Select weeks1
            Skip
        Enddo
        Use In weeks
        Use In weeks1
    Endproc
 
Enddefine

24

Re: haftadan tarih çevirimi

Tartismak filan degil niyetim, sunu soyleyeyip cekileyim. Week() ISO icin gerekli parametreleri iceriyor. O kadar karmasik kodlara gerek yok. Mesela son kod bolumu icin daha dogru ve hizli bir sekilde yaratabilirisiniz:

Visual Fox Pro
makeweeklist(1900,2500)

 
FUNCTION makeweeklist(tnStart,tnEnd)
  tdFDOW = DATE(m.tnStart,1,1)
  DO while WEEK(m.tdFDOW,2,2) != 1
    tdFDOW = m.tdFDOW + 1
  ENDDO
  Create Cursor weeklist2 (DATE1 D,DATE2 D,CYEAR c(4),CWEEK C(2),DAY1 C(10),DAY2 C(10))
  DO WHILE YEAR(m.tdFDOW) <= m.tnEnd)
    INSERT INTO weeklist2 ;
      (DATE1,DATE2,CYEAR,CWEEK,DAY1,DAY2) ;
      VALUES ;
      (m.tdFDOW, ;
      m.tdFDOW+6,;
      PADL(YEAR(m.tdFDOW+IIF(WEEK(m.tdFDOW,2,2)=1,6,0)),4),;
      PADL(WEEK(m.tdFDOW,2,2),2,'0'),;
      CDOW(m.tdFDOW),;
      CDOW(m.tdFDOW+6))
    tdFDOW = m.tdFDOW + 7
  enddo
  Index On CYEAR+CWEEK Tag YEARWEEK
ENDFUNC

25 Son düzenleyen, foxman (10.09.2007 21:37:16)

Re: haftadan tarih çevirimi

Hız konusunda haklısın. Weeklist i ilk yaptığımda week() nasılsa doğru çalışır diye parametrelerini fazla önemsemeden direk kullanmıştım, tabiki yıl değerleri hatalı oluşmuştu. Yaklaşık iki yıl önce burada verdiğim weeklist i yaptım doğru çalıştığını gördükten sonra bir daha da ellemedim.

Week() in handikapı sadece hafta numarasını geri döndürmesi, eğer programcı 53. hafta, LeapYear gibi konularda yeteri kadar ön bilgiye sahip değilse yıl değerini kolaylıkla yanlış hesaplayabilir, ikimizinde yaptığı gibi doğru yıl değerini bulmak için ilave case veya if kullanmak gerekiyor. Oysa ISOWeekNum() yıl ve hafta değerini birlikte döndürüyor.