Konu: SQL --> dbf dbf --> SQL data taşıma
SQL datayı işteki serverden eve götürmek için notebooka alırken aşağıdaki kodları yazdım.
Mantığı temelde aynı table isimlerini kullanarak SQL datayı dbf'e ve de dbf datayı SQL'e yüklüyor.
Belki işe yarar diye paylaşıyorum. Kodlar ham, (bölümler ayrı ayrı da olmak üzere) çalışıyor, maksada uygun geliştirilebilinir.
Tabi ki Çetin'den 3-5 satırlık başkaca uzman çözümler gelmezse !
*** handle alma ve dbf'leri saklayacağın alan belirleme
lnHserver=SQLSTRIGCONNECT('Driver={SQL Server Native Client 10.0}; Server=ML350\SQLEXPRESS; Database=nkt; uid=sa; pwd=xx')
lnHlokal=SQLSTRIGCONNECT('Driver={SQL Server Native Client 10.0};'+;
'Server=KONUKPC\SQLEXPRESS;Database=nkt;Trusted_Connection=yes;' )
&& database i belirtmek iyi oluyor - bendeki nkt,
&& yanlışlıkla bütün SQLserverdeki database ile işlem yapılmasın
#DEFI DBF_SAKLAMA_YERI "c:\gecici\" && veya dilenen dizin \olmazsa kodda ADDBS() kullanılabilinir
IF ! DIRECTORY(DBF_SAKLAMA_YERI)
MD(DBF_SAKLAMA_YERI)
ENDIF
*** kopyalama bölümü
* #DEFI DBF_SAKLAMA_YERI "c:\gecici\"
SQLTABLES(m.lnHserver,'TABLE','curtable')
SCAN
m.Xkomut="select * from "+ALLTRIM(curtable.table_cat)+".."+ALLTRIM(curtable.table_name)
m.Xdbf=DBF_SAKLAMA_YERI+ALLTRIM(table_name)+".dbf"
WAIT WINDOW m.Xdbf NOWAIT NOCLEAR
SQLEXEC(m.lnHserver,m.Xkomut,"xcur")
SELECT * FROM xcur INTO DBF (m.Xdbf)
SELECT curtable
ENDSCAN
WAIT CLEAR
*** silme bölümü (lokalde eski datayı) primer indexler için iyi oluyor
SQLTABLES(m.lnHlokal,'TABLE','curtable')
BROWSE && neler SİLİNECEĞİNİ gözden geçirme -esc ile devam
SCAN
m.Xkomut="delete from "+ALLTRIM(curtable.table_cat)+".."+ALLTRIM(curtable.table_name)
m.Xdbf=DBF_SAKLAMA_YERI+ALLTRIM(table_name)+".dbf"
IF FILE(m.Xdbf) AND 6=MESSAGEBOX(m.Xdbf,292,"SQL dosyalar silinsin mi")
IF 1>SQLEXEC(m.lnHlokal,m.Xkomut)
DO hata
ENDIF
ENDI
SELECT curtable
ENDSCAN
***SQL'e yazma bölümü
CLOSE DATABASES
SQLTABLES(m.lnHlokal,'TABLE','curtable')
BROWSE && neler yazılacağını gözden geçirme -esc ile devam
SCAN
m.Xdbf=DBF_SAKLAMA_YERI+ALLTRIM(table_name)+".dbf"
IF FILE(m.Xdbf) AND 6=MESSAGEBOX(m.Xdbf,292,"SQL dosyalar eklensin mi")
SELECT 0
USE (m.Xdbf) AGAIN && ne olur ne olmaz
m.Xkomut="insert into "+ALLTRIM(curtable.table_cat)+".."+ALLTRIM(curtable.table_name)+" values (?arrayx[1]"
FOR m.Xi=2 TO FCOUNT(JUSTSTEM(m.Xdbf))
m.Xkomut=m.Xkomut+", ?arrayx["+ALLTRIM(STR(m.Xi))+"]"
ENDF
m.Xkomut=m.Xkomut+")"
DIMENSION arrayx(FCOUNT(JUSTSTEM(m.Xdbf))) && bunu yapmazsan bir sonraki fcount() küçükse hata oluşuyor
SCAN
SCATTER MEMO TO arrayx
IF 1>SQLEXEC(m.lnHlokal,m.Xkomut)
DO hata
IF 6=MESSAGEBOX("kayıt olmadı",292,"işlem sonlandırılsın mı ?")
RETURN
ENDIF
ENDIF
ENDSCAN
USE
ENDIF
SELECT curtable
ENDSCAN
*** bitti
SQLDISCONNECT(0)
CLOSE DATABASES
*** hata
RETURN
PROCEDURE hata && SQL komut hatalarını belirleme için (UTden almıştım)
LOCAL Array aHata[1]
LOCAL ix,lcHata
Aerror(aHata)
lcHata = ''
FOR ix = 1 TO 7
lcHata = m.lcHata + Transform(aHata[m.ix]) + Chr(13)
Endfor
Messagebox(m.lcHata)
RETURN