1 Son düzenleyen, mrduyar (25.05.2010 07:13:32)

Konu: weeklist hızlandırma

Visual Fox Pro
makeweeklist(2000,2099)

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 (tarih1 d,tarih2 d,cyil c(4),nyil N(4),chafta c(2),nhafta N(2),gun1 c(10),;
gun2 c(10), hafta c(5),nay n(2),guid c(40))
Do While Year(m.tdFDOW) <= m.tnEnd)
    Insert Into weeklist2 ;
        (tarih1,tarih2,cyil,chafta,gun1,gun2,nyil,nhafta,hafta,nay);
        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),;
        VAL(Padl(Year(m.tdFDOW+Iif(Week(m.tdFDOW,2,2)=1,6,0)),4)),;
        VAL(Padl(Week(m.tdFDOW,2,2),2,'0')),;
        Padl(Right(Ltrim(Str(Year(m.tdFDOW))),2), 2, '0')+'-' + Padl(Week(m.tdFDOW,2,2),2,'0'),;
        MONTH(m.tdFDOW+3))
    tdFDOW = m.tdFDOW + 7
Enddo
Endfunc

bu kod ile week list oluşturdum ve sql e kayıt yaptım.

Visual Fox Pro
Function datetostr

Lparameters tdTrh
Local lcTrh, lcSet, lcDon
m.lcSet = Set("Date")
Set Date Ymd
m.lcTrh = Dtoc(tdTrh)
Set Date &lcSet
If !Empty(Left(lcTrh,2))
*m.lcDon = "'"+Chrtran(lcTrh,"/","-")+"'"
    m.lcDon = Chrtran(lcTrh,"/","-")
Else
    m.lcDon = ''
Endif
Return m.lcDon
 
? datetoweekstring(Date())
Function datetoweekstring(Ldtarih,lnsayi)
Local lcfil,lcal
lcfil=''
m.lcal = Alias()
If !Empty(Ldtarih)
 
    If Used('HaftaTampon')
        Use In 'HaftaTampon'
    Endif
    lcfil="'"+datetostr(Ldtarih)+"'"
    TEXT TO LCCUMLE NOSHOW TEXTMERGE
    USE wka2009
    select TOP 1 * from haftaliste WHERE <<m.lcfil>> between tarih1 and tarih2
    ENDTEXT
    mysqlexec(appcmds.lnhandle,M.LCCUMLE,'HaftaTampon')
    Lcdonus=HaftaTampon.hafta
    If Used('HaftaTampon')
        Use In 'HaftaTampon'
    Endif
    If !Empty(m.lcal)
        Select &lcal
    Endif
    Return Lcdonus
Else
    Wait Window 'Tarih hatalı. Bilgi işleme bigli veriniz.'
Endif
Endfunc

bu kod ile haftalistesi (sql table) dan select ile gelen sonuc yavaş oluyor. 200 kayıtlık bi veriyi Scan ... endscan arasına aldıp çalıştırdığımda kayıt ekran da atlamayı görüyorum 20 saniye kadar sürüyor.
Daha da hızlandırmanın bir yolu varmı?

SQL
CREATE TABLE [dbo].[haftaliste](

    [tarih1] [datetime] NULL,
    [tarih2] [datetime] NULL,
    [cyil] [nchar](4) COLLATE SQL_Latin1_General_CP1254_CI_AS NULL CONSTRAINT [DF_haftalistesi_cyil]  DEFAULT (''),
    [nyil] [int] NULL CONSTRAINT [DF_haftalistesi_nyil]  DEFAULT ((0)),
    [chafta] [nchar](2) COLLATE SQL_Latin1_General_CP1254_CI_AS NULL CONSTRAINT [DF_haftalistesi_chafta]  DEFAULT (''),
    [nhafta] [int] NULL CONSTRAINT [DF_haftalistesi_nhafta]  DEFAULT ((0)),
    [hafta] [nchar](5) COLLATE SQL_Latin1_General_CP1254_CI_AS NULL CONSTRAINT [DF_haftalistesi_hafta]  DEFAULT (''),
    [gun1] [nchar](10) COLLATE SQL_Latin1_General_CP1254_CI_AS NULL,
    [gun2] [nchar](10) COLLATE SQL_Latin1_General_CP1254_CI_AS NULL,
    [nay] [int] NULL CONSTRAINT [DF_haftaliste_nay]  DEFAULT ((0)),
    [acan] [char](10) COLLATE SQL_Latin1_General_CP1254_CI_AS NULL CONSTRAINT [DF_haftalistesi_acan]  DEFAULT (user_name()),
    [actar] [datetime] NULL,
    [duzelten] [char](10) COLLATE SQL_Latin1_General_CP1254_CI_AS NULL CONSTRAINT [DF_haftalistesi_duzelten]  DEFAULT (''),
    [duzelttar] [datetime] NULL,
    [guid] [uniqueidentifier] NOT NULL CONSTRAINT [DF_haftalistesi_guid]  DEFAULT (newid()),
    [sirano] [int] IDENTITY(1,1) NOT NULL,
CONSTRAINT [PK_haftalistesi] PRIMARY KEY CLUSTERED
(
    [sirano] ASC
)WITH (PAD_INDEX  = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]


week listin sql oluşturma kodu.

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

2

Re: weeklist hızlandırma

Ramazan, ne yapmak istediğini biraz açabilirmisin? Belki kod ile değilde, fikir olarak daha kolay bir çözüm önerilebilir. Yada daha farklı bir optimizasyon yolu bulunabilir.

bu kod ile haftalistesi (sql table) dan select ile gelen sonuc yavaş oluyor. 200 kayıtlık bi veriyi Scan ... endscan arasına aldıp çalıştırdığımda kayıt ekran da atlamayı görüyorum 20 saniye kadar sürüyor.

200 record -> scan ...endscan ile 20 sn ye mi? İnanılmaz... O arada neyi hesaplatıyorsun ki?

Uğur
-------------------------------------------------------------------------------------------------------------
Hayat bir bisiklete binmek gibidir. Pedalı çevirmeye devam ettiğiniz sürece düşmezsiniz. Claude Peppeer
Kusuru söylenmeyen adam, ayıbını hüner sanır.  Türk Atasözü

3

Re: weeklist hızlandırma

Kullandığıım tüm kodlar yukarıda zaten.
Weeklist=haftalistesi adli bir sql table ım var.  buradaki verilerin bazılarını elle değiştirme ihtiyacı hissediyoruz. şöyle bizde 52 ve 53 haftalar baze 52 de birleşe biliyor yada herhangibir aydaki hafta sayısı 5 olabiliyor. bunları raporlarda kullanıyoruz. Yani kısaca hafta konusunda standartları kullanamıyoruz. Oluşturduğumuz bu listede elle istediklerimizi değiştiriyoruz.  Ben bu hafta olayı ve çevirimleri için başka bir çözüm bulamadım.  Şimdiki sorunum ise oluşturduğum listeden tarihin hafta karşılığını hangi aya ve haftaya denk geldiğini bulabiliyorum. ama biraz yavaşlama oluştu.

daha önce kullandığım kod ve diğer açıklamalar
http://www.fox4um.com/topic/337/hafta-hesabi/ linkte mevcut. aynı konu aslında.

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

4 Son düzenleyen, mrduyar (25.05.2010 09:52:19)

Re: weeklist hızlandırma

tekrar selamlar çetin hocadan kapılanlarla sorun görüntüsü. Sen çok yaşa cetin hoca.
http://www.screentoaster.com/watch/stUE … hafta_yava

ekran daki sevkiyat ve üretim tarihlerini haftaya çeviriyor.

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

5

Re: weeklist hızlandırma

Ramazan,
Ne yazik ki kayittan derdini anlamak pek mumkun degil:) Koddan ve anlattiklarindan anladigimla:
O kod o kadar zaman alacak bir kod degil. Ben lokalde denedim 20000 tarih icin 11-12 saniye suruyor. O zaman aklima gelen senin SQL servera baglanip networkten bunu alman asil problem. SQL serverdan sadece tek sorgu yapman gerekse hizlanir diye dusunuyorum:

Test tarihleri (20000 tarih):

Visual Fox Pro
Rand(-1)

Create Cursor test (checkDate d)
For ix = 1 To 10000
  Insert Into test Values (Date() - Int(Rand()*3500))
  Insert Into test Values (Date() + Int(Rand()*3500))
Endfor

Bu da tek SQL server sorgusu yapip gerisini lokalde halleden test kodu:

Visual Fox Pro
If appcmds.lnHandle > 0

  Start = Seconds()
 
  Local Array laDates[1]
  Select Min(checkDate), Max(checkDate) From test Into Array laDates
  Local minTar,maxTar
  minTar = laDates[1]
  maxTar = laDates[2]
  TEXT TO LCCUMLE NOSHOW
    USE wka2009
    select * from haftaliste WHERE tarih2 >= ?m.minTar AND tarih1 <= ?m.maxTar
  ENDTEXT
  SQLExec(appcmds.lnHandle,M.LCCUMLE,'HaftaTampon')
 
  Select test.checkDate, tarih1,tarih2,hafta ;
    FROM test INNER Join haftatampon hlist ;
    ON WeekStart(test.checkDate,2) = hlist.tarih1 ;
    INTO Cursor haftalar nofilter
  Index On checkDate Tag cDate
  ? 'Bitti', Seconds()-m.start
Else
  ?"Handle hatali"
Endif
 
Function WeekStart(tdDate,tnFDOW)
  Return m.tdDate - Dow(m.tdDate,m.tnFDOW) + 1
Endfunc


Not: DateToStr() gibi zimbirtilar kullanma, parametre kullan.

6

Re: weeklist hızlandırma

select TOP 1 * from haftaliste WHERE <<m.lcfil>> between tarih1 and tarih2
Satırındaki between yavaşlamaya sebep olabilirmi?

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

7

Re: weeklist hızlandırma

Dolayli olarak evet ama senin yavaslamani aciklamaz. Sen benim ne dedigime hic bakmamissin bile:( Denemedin, di mi:(

8 Son düzenleyen, mrduyar (26.05.2010 13:35:39)

Re: weeklist hızlandırma

hocam alınıyorum ama. inan dediklerinin hepsinidefalarca deniyorum. datetostr ortadan kaldırdım.
?m.lcfil tarih olarak beceremedim. (şimdi tekrar denedim oldu.çözümü aşağıda buldum. tatmim edici bie hız elde ettim. Saygılar.

Visual Fox Pro
Function datetoweekstring(Ldtarih,lnsayi)

Local lcfil,lcal
LcTar=Ldtarih
lcfil=''
m.lcal = Alias()
If !Empty(Nvl(Ldtarih,""))
    If Used('HaftaTampon')
        Use In 'HaftaTampon'
    ENDIF
    lcfil="'"+transform(Ldtarih)+"'"
    If !Empty(lcfil)
        TEXT TO LCCUMLE NOSHOW TEXTMERGE
    USE wka2009
    select TOP 1 * from haftaliste WHERE ?m.LcTar between tarih1 and tarih2
--    select TOP 1 * from haftaliste WHERE convert(datetime,<<m.lcfil>>, 104) between tarih1 and tarih2
        ENDTEXT
        mysqlexec(appcmds.lnhandle,M.LCCUMLE,'HaftaTampon')
        Lcdonus=HaftaTampon.hafta
        If Used('HaftaTampon')
            Use In 'HaftaTampon'
        Endif
        If !Empty(m.lcal)
            Select &lcal
        Endif
        Return Lcdonus
    Endif
Else
    Wait Window 'Tarih hatalı. Bilgi işleme bigli veriniz.'
Endif
Endfunc
Bilmediğin Neyse Yanıldığındır.

9

Re: weeklist hızlandırma

1) lcFil'e ne gerek var zaten anlamadim. Ben onu at demistim.
2) Bu kod benim dedigim degil. Hala 200 kayit icin gereksiz yere SQL server'a 200 sorgu yapilacak.
20000 kayitla benim local serverda sonuc senin kodla 11-12 saniye idi. Benim gonderdigim kodla 0.142 saniye. Senin tatmin edici dedigin 1 saniye altinda mi simdi?

10

Re: weeklist hızlandırma

Haklısın. lcfil i temizledim.
datetostr ortadan kaldırınca hızlandı. ve ?m.lctar yapıncada cursor gridede en başta ve en sonda bir anda (1 sn gibi) bir sürede görünüyor.

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

11

Re: weeklist hızlandırma

Kayit sirasinda biraz daha yavas oldu ama gene de fikir veriyor:

http://www.screentoaster.com/watch/stUE … erver_test

12

Re: weeklist hızlandırma

http://www.screentoaster.com/watch/stUE … a_hizlandi
ben sevdim bu siteyi. (bu kayiti uzak masaüstü ile alabildim. işyerinde değilim.)

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

13

Re: weeklist hızlandırma

Simdi de ben merak ettim hangi kodu kullandigini:) Benim testte 20000 tarih vardi. 200 ile senin kod mu, yeni kod mu:)

14

Re: weeklist hızlandırma

gözden kaçırdın sanırım. "datetostr ortadan kaldırınca hızlandı."

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