1 Son düzenleyen, neyzen (12.06.2009 16:46:20)

Konu: Veritabanının,dbf den SQL servere çevrilmesi

üsdatlar merhaba.Mevcut programda dbf kullanmaktayım.Formların ve raporların dataenvironmet kısımlarında cursor olarak,dbf tablolarını çoğu yerde kullandım.Veri tabanını SQL servere çevirmeye karar verdim.ancak nereden başlayacağıma karar veremedim.Acaba SQL server tablolarınıda formların yada raporların dataenvironmet'ine ekleyerek kullanabiliyormuyuz?.Foxproda kullandığımız hazır data klaslarını(Ekle,sil,önceki,sonraki..)kullanabiliyornuyuz ?dikkat edilmesi gereken hususlarda,aydınlatırsanız memnun olurum.Şimdiden teşekkür ederim..

En büyük sermaye nakit,nakit sermaye vakittir...

2

Re: Veritabanının,dbf den SQL servere çevrilmesi

ben 2 programımı SQL'e çevirdim. Hazır klas ile yatıklarımdan pek verim alamadım, kızıp her seferinde elle kod yazdım.
Bir de SQL'de çok çeşitli data var. Uygununu byte tasarrufu için seçmek biraz da programcılığın gereği gibi oluyor.
Örneğin I (integer) karşılığı (bizde -9999 9999 arası)
bigint  -2^63 (-9,223,372,036,854,775,808) to 2^63-1 (9,223,372,036,854,775,807) 8 Bytes
int       -2^31 (-2,147,483,648) to 2^31-1 (2,147,483,647)  4 Bytes
smallint  -2^15 (-32,768) to 2^15-1 (32,767) 2 Bytes
tinyint  0 to 255 1 Byte

Bu transferleri yaparken biraz da VFP-SQL kod çalışmış olup işin ruhunu anlamakta eksersiz oluyor. Programlarda gördüğüm bazı acemilikler düzeliyor vs. vs.
Ezcümle kodla dosyaları transfer etmeni öneriyorum.

Dikkat etmen gereken, bence:
- .f. .t. yok 1 ve 0 var.
- biz vfp'da fieldleri kullanacağımız indexlere göre bir mantıkla planlardık. SQLde primary index var, onun dışında sorguyu hızlandıran, kolaylaştıran index yok.
- RECNO() yok, programda kayıt adresleme gerekiyorsa ayrı bir field yapmalısın (örneğin uniqueidentifier tipi field)
- bir de data işlerken hata kodu programı yazmazsan, hiç hata yokmuş gibi işe devam ediyor. sonra kodları çalıştırınca anlıyorsun.
-Bir de örneğin evde bilgisayarda SQL uygulamasını VFP ile çalıştırdıktan sonra, işteki servera SQL databasi kopyalarken (sağtıkla-> tasks ->import veya export data), viewları table diye transfer ediyor. Program çalışırken fark etmiyor, ama sonradan viewda düzenlemeyi işte (serverde) yapamıyorsun !

aklıma gelenler bunlar.  taşıma kodu istersen zevkle kafa yorarım.
kendi çapımda bu başlık altında SQL->dbf dbf->sql diye bir başlık açmıştım, incele istersen. (tam istediğinin karşılığı değil ama)

VFP9 SP2

3

Re: Veritabanının,dbf den SQL servere çevrilmesi

konuka yazdı:

...
- biz vfp'da fieldleri kullanacağımız indexlere göre bir mantıkla planlardık. SQLde primary index var, onun dışında sorguyu hızlandıran, kolaylaştıran index yok.
...

aman dikkat!.. bu çok yanlış bir yönlendirme. sql server'da da indeksler sorguyu hızlandırır. yalnız bit tipi alanlara indeks yapamazsın.

Haksızlıklar karşısında susanlar, dilsiz şeytanlardır!
www.metinemre.com

4

Re: Veritabanının,dbf den SQL servere çevrilmesi

selamlar;
Aşağıdaki kod karmaşık gelebilir belki ama benim 1 gb lık dbf dosyamı SQL e boş table oluşturmayı başarı ile gerçekleştiriyor.

Visual Fox Pro
Function MYSQLEXEC

Lparameters tnhandle, tcsql, tccursorname
tccursorname = Iif(Empty(tccursorname),'',tccursorname)
If SQLExec(tnhandle,tcsql,tccursorname) < 0
    Do errhand With tcsql
Endif
 
Function errhand
Lparameters tcsql
If !Empty(tcsql)
    lcerror=tcsql
    Aerror(arrcheck)
    For ix=1 To 7
        lcerror = lcerror+Trans( arrcheck [ix])+ Chr(13)
    Endfor
    If Len(lcerror)<1062
        Messagebox(lcerror,0,'Error def.')
    Else
        gnerrfile = Fcreate('_errFile.txt')  && If not create it
        If gnerrfile < 0     && Check for error opening file
            Wait 'Cannot open or create output file' Window Nowait
        Else  && If no error, write to file
            =Fwrite(gnerrfile , lcerror)
        Endif
        =Fclose(gnerrfile )     && Close file
        If gnerrfile > 0
            Modify File _errfile.txt Nowait  && Open file in edit window
        Endif
    Endif
Endif
 
Function mysqlexecX
Lparameters tnhandle, tcsql, tccursorname
tccursorname = Iif(Empty(tccursorname),'',tccursorname)
If SQLExec(tnhandle,tcsql,tccursorname) < 0
    If !Empty(tcsql)
        lcerror=tcsql
        Aerror(arrcheck)
        If File('errors.txt')  && Does file exist?
            gnerrfile = Fopen('errors.txt',2)     && If so, open read/write
            x1=Fseek(gnerrfile,0,2)
        Else
            gnerrfile = Fcreate('errors.txt')  && If not create it
            x1=Fseek(gnerrfile,0,2)
        Endif
        If gnerrfile > 0     && Check for error opening file
            For ix=1 To 7
                =Fwrite(gnerrfile ,Trans( arrcheck [ix])+ Chr(13))
            Endfor
        Endif
        =Fclose(gnerrfile )     && Close file
    Endif
Endif
 
Function credbf2sql
Parameter fname,litxtsql,sqlfname
litxtsql=Iif(Empty(litxtsql),.F.,.T.)
If Empty(sqlfname)
    sqlfname=fname
Endif
Private nfields, Afields, Lcf
If Used(m.fname)
    Use In (m.fname)
Endif
Use (m.fname)
nfields = Afields(aflds)
lcsorgu='create table '+m.sqlfname+'('
lcsorgu1=''
lcsorgu2=''
For Lcf = 1 To nfields
    If Upper(aflds(Lcf, 1))='GUID' Or Upper(aflds(Lcf, 1))='SIRANO'
    Else
        lcbaslik=aflds(Lcf, 1)
        Do Case
        Case lcbaslik=='NOT'
            lcbaslik='NOT1'
        Case lcbaslik=='INDEX'
            lcbaslik='INDEX1'
        Endcase
        lcsorgu1=lcsorgu1+lcbaslik
        lctipi=aflds(Lcf, 2)
        Do Case
        Case lctipi='C'
            lcsorgu1=lcsorgu1+' [char]'
        Case lctipi='D' Or lctipi='T'
            lcsorgu1=lcsorgu1+' [datetime]'
        Case lctipi='I' Or lctipi='L'
            lcsorgu1=lcsorgu1+' [int]'
        Case lctipi='M'
            lcsorgu1=lcsorgu1+' [text]'
        Case lctipi='N'
            lcsorgu1=lcsorgu1+' [numeric]'
        Endcase
 
        If aflds(Lcf, 2)='N' .And. aflds(Lcf, 4)=>0
            lcsorgu1=lcsorgu1+' ('+Alltrim(Str(aflds(Lcf, 3), 6))+','+Ltrim(Str(aflds(Lcf, 4)))+')'
        Else
            If lctipi='T' Or lctipi='D' Or lctipi='I' Or lctipi='M' Or lctipi='L'
            Else
                lcsorgu1=lcsorgu1+'('+Alltrim(Str(aflds(Lcf, 3), 6))+')'
            Endif
        Endif
        lcsorgu1=Lower(lcsorgu1)+' NULL,'+Chr(13)
    Endif
Endfor
lcsorgu1=lcsorgu1+' [guid] [uniqueidentifier] NOT NULL CONSTRAINT [DF_'+Alltrim(sqlfname)+'_guid]  DEFAULT (newid()),'
lcsorgu1=lcsorgu1+' [sirano] [int] IDENTITY(1,1) NOT NULL,'
lcsorgu1=lcsorgu1+' CONSTRAINT [PK_'+Alltrim(sqlfname)+'] PRIMARY KEY CLUSTERED'
TEXT TO Lcsorgu2 NOSHOW PRETEXT 7 TEXTMERGE
( [guid] ASC )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
ENDTEXT
lcsorgu=lcsorgu+lcsorgu1+lcsorgu2+' ) ON [PRIMARY] '
Use
If litxtsql=.T.
    If File('NesSQLData.txt')  && Does file exist?
        gnerrfile = Fcreate('NesSQLData.txt')  && If not create it
*        gnErrFile = Fopen('NesSQLData.txt',12)     && If so, open read/write
    Else
        gnerrfile = Fcreate('NesSQLData.txt')  && If not create it
    Endif
    If gnerrfile < 0     && Check for error opening file
        Wait 'Cannot open or create output file' Window Nowait
    Else  && If no error, write to file
        =Fwrite(gnerrfile , lcsorgu)
    Endif
    =Fclose(gnerrfile )     && Close file
    If gnerrfile > 0
        Modify File nessqldata.txt Nowait  && Open file in edit window
    Endif
Else
** bilgi yaz.
    If File('errors.txt')  && Does file exist?
        gnerrfile = Fopen('errors.txt',2)     && If so, open read/write
        x1=Fseek(gnerrfile,0,2)
    Else
        gnerrfile = Fcreate('errors.txt')  && If not create it
        x1=Fseek(gnerrfile,0,2)
    Endif
    If gnerrfile > 0     && Check for error opening file
        =Fwrite(gnerrfile ,m.fname+Ttoc(Datetime())+ Chr(13))
    Endif
    =Fclose(gnerrfile )     && Close file
    lcokkk=MYSQLEXEC(baglan(),m.lcsorgu)
    Wait Window m.fname+' Oluşturuldu.' Nowa
Endif
If Used(m.fname)
    Use In (m.fname)
Endif
If lcokkk=.T.
    Return=.T.
Else
    Return=.F.
Endif
Endfunc
Bilmediğin Neyse Yanıldığındır.

5

Re: Veritabanının,dbf den SQL servere çevrilmesi

üsdatlar basit bir bilgi giriş ekranında, dbf i dataenvironment'e ekleyip class butonları forma yerleştirdiğimizde,otomatik olarak önceki kayıt,sonraki kayıt,ilk kayıt,son kayıt gibi işleri halledebiliyorduk.İstersek kendimiz class buton içerisine kodda ekleyebiliyorduk.
Şimdi SQL de bunu nasıl yapacağız,tam olarak bunu anlayamadım.Hazır toolları kullanacakmıyım? Örnek olarak Sonraki kayıtda gitmek için (SKIP) İşlemini nasıl yapacapım?

En büyük sermaye nakit,nakit sermaye vakittir...

6

Re: Veritabanının,dbf den SQL servere çevrilmesi

xkod=kod
select top 1 kod from musteri where kod>xkod
xyenikod=kod
select * from musteri where kod=xyenikod

böyle yapman lazım. skip seek vs... bunları unut. daha yolun çok başındasın. epeyce bir sıkıntı çekeceğin belli...

Haksızlıklar karşısında susanlar, dilsiz şeytanlardır!
www.metinemre.com

7

Re: Veritabanının,dbf den SQL servere çevrilmesi

smile dediğin doğru metin üsdat,daha yolun başındayız..

En büyük sermaye nakit,nakit sermaye vakittir...

8 Son düzenleyen, neyzen (18.06.2009 15:25:25)

Re: Veritabanının,dbf den SQL servere çevrilmesi

Sonunda başardım.Evet yeni başladığım projemde veritabanı olarak,SQL server kullanmaya başladım.İnsanların alışkanlıklarından vazgeçmesi oldukça zor.Ama yavaş yavaş SQL servere ısınmaya başladım galiba.Ancak halen DBF mantığını üzerimden atamadım.:Ama olsun Başlamak bitirmenin yarısı derler.hepinize desteklerinizden dolayı teşekkür etmek istedim..

En büyük sermaye nakit,nakit sermaye vakittir...