1

Konu: kod la field ekleme

Merhaba..
database deki table lara sonradan field eklendiğinde ki uyumsuzluğu giderecek şekilde
databse deki bütün table ların field lerini karşılaştırıp eksik olanları tamamlayacak bir
kod u olan varmı acaba..
uyumsuzluktan kasıt sadece yeni eklenen field lar
database bazında olmayıp table bazında da olabilir..

iyi çalışmalar dilerim..

2

Re: kod la field ekleme

if type("mytable.myfield")="U"
alter table mytable add myfield c(10)
endif

burda dikkat etmen gereken eğer tablo açıksa exclusive olmalı.

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

3 Son düzenleyen, konuka (04.09.2007 18:27:22)

Re: kod la field ekleme

bu konuyla ilgili genel bir yorumumu paylaşmak istedim:
Bir projedeki dbf ler elden geldiğince stabil olmalı.
eğer program içerisinde bir dosya yaratıp, onunla ilgili alanlarda değişiklik yapılacaksa dosyayı CREATE CURSOR (SELECT .. INTO CURSOR READWRITE gibi) ile oluşturup onun üzerinde ALTER TABLE komutları ile oynamak daha uygun olur diye düşünüyorum.
-----
eğer proje safhasında  dosyaları ortak hale getirmek istiyorsan COPY STRUCTURE EXTENDED TO komutu işini görür

Visual Fox Pro
USE Dosya1

COPY STRUCTURE EXTENDED TO temp1
USE Dosya2
COPY STRUCTURE EXTENDED TO temp2
CLOSE DATA
USE temp1 IN 1
USE temp2 IN 2
SELE 1
SCAN
  SCATTER MEMVAR
  SELE 2
  LOCA FOR M.Field_Name
  IF ! FOUN()
    Xeklenecek=M.Field_Name+" "+M.Field_Type+"("+ALLT(STR(M.Field_len))+")"
    ALTER TABLE Dosya2 ADD COLUMN &Xeklenecek
  ENDI
  SELE 1
ENDS

gibi - herhalde çalışır...

umarım başöğretmenlik yapmadım - sevgiler....

VFP9 SP2

4

Re: kod la field ekleme

Bahattin,
FoxyClasses ornegini indir. DataDelta formu sana en azindan nelerin degistigini gosterir.

5

Re: kod la field ekleme

Günaydın..
Yardımlarınız için çok teşekkür ederim.
İyi Çalışmalar dilerim..

6

Re: kod la field ekleme

benim bu konu ile ilgili 2 adet .exe dosyam var dbc_creator ve dbc_updater seklinde

creator ile design time da kullandıgım data klasorundeki dbc dosyami secerek ve yeni olusacak datasetini nereye yaratilacaksa ( master_db ) oraya yaratiyorum ve guncelleme yapilacaksa bu bos kayitli data setini kullaniciya gonderiyorum yada download ediyor

kullanicida dbc_updater bulunuyor sadece ,
bu exe de de mevcut calisilan data klasoru ile yeni data set klasoru ( master_db ) sectirilip islem yapiliyor onun yaptigida kayitlari masterb_klasorundeki tablolara append yapmak ve daha sonra klasor isimleri degistirilerek isleme devam etmek yani once kaynak 2007 hedef master_db ise

2007 -> dbcuptater_20070905_1001 gibi bir isim aliyor
master_db de - 2007


dbc_creator ornegi

Visual Fox Pro
Set Safety Off

 
If Empty(Thisform.txtfrom.Value) Or Empty(Thisform.txtto.Value)
    Messagebox('Kaynak ve Hedef Dizinler Seçilmedi..',16,'Opppps')
    Return
Endif
 
If ! File(Addbs(Thisform.txtfrom.Value)+'data1.dbc')
    Messagebox('Kaynak Dizin Geçerli Database İçermiyor',16,'Hata...')
    Return
Endif
 
Close Databases All
 
Local LcFrom,Lcto,OldPath
 
OldPath = Sys(5)+Curdir()
 
LcFrom = Addbs(Thisform.txtfrom.Value)
Lcto = Addbs(Thisform.txtto.Value)
 
Set Path To Data
 
Open Database (m.LcFrom)+'Data1.dbc'
Do "gendbc.prg" With (m.Lcto)+'Make_Empty_DB.prg'
&&Do Home()+"tools\gendbc\gendbc.prg" With (m.Lcto)+'Make_Empty_DB.prg'
 
 
Close All
Cd (m.Lcto)
Do Make_Empty_DB.prg
Close All
Cd (m.OldPath)
 
Messagebox(m.LcFrom + ' Dizininden ' + m.Lcto + ' Dizinine Database ve Tablolar Oluşturuldu....',64,_Screen.Caption)


dbc_upater ornegi

Visual Fox Pro
Set Escape Off

Set Deleted On
Set Safety Off
Set Date To Dmy
Set Century On
 
If Empty(Thisform.txtfrom.Value) Or Empty(Thisform.txtto.Value)
    Messagebox('Kaynak ve Hedef Dizinler Seçilmedi..',16,'Opppps')
    Return
Endif
 
If ! File(Addbs(Thisform.txtfrom.Value)+'data1.dbc')
    Messagebox('Kaynak Dizin Geçerli Database İçermiyor (data1.dbc)',16,'Hata...')
    Return
Endif
 
If ! File(Addbs(Thisform.txtto.Value)+'data1.dbc')
    Messagebox('Hedef Dizin Geçerli Database İçermiyor (data1.dbc)',16,'Hata...')
    Return
Endif
 
Local LcFrom,Lcto,OldPath,FirstLcFrom1,FirstLcFrom,FirstLcTo
 
OldPath = Sys(5)+Curdir()
FirstLcFrom = Alltrim(Thisform.txtfrom.Value)
FirstLcFrom1 = Justfname(Alltrim(Thisform.txtfrom.Value))
FirstLcTo = Alltrim(Thisform.txtto.Value)
LcFrom = Addbs(Thisform.txtfrom.Value)
Lcto = Addbs(Thisform.txtto.Value)
 
Close Databases All
 
&&--- first backup current database -----------------------------------------------------
Local LcSourcePath,LcTargetPath
 
LcSourcePath =Alltrim(Thisform.txtfrom.Value) &&Sys(5)+Curdir()+'data03'
LcTargetPath = LcSourcePath + '_BACKUP_' + Substr(Dtoc(Date()),1,2) + Substr(Dtoc(Date()),4,2) + Substr(Dtoc(Date()),7,4)+"_" + ;
    SUBSTR(Tran(Time()),1,2)+Substr(Tran(Time()),4,2)+Substr(Tran(Time()),7,2)
 
Wait Window "Update Öncesi Yedek Alınıyor...." Nowait
oFSO=Createobject("Scripting.FileSystemObject")
oFSO.CopyFolder("&LcSourcePath","&LcTargetPath",.T.)  && data olmazsa kendi yaratır
Messagebox("Yedekleme Başarılı....Yedeklenen Klasör Adı: "+ m.LcTargetPath,64,_Screen.Caption)
 
&&----- renaming current data dir -------------------------------------------------------
Local LcRenameTo
LcRenameTo = 'RENAMED_' + Substr(Dtoc(Date()),1,2) + Substr(Dtoc(Date()),4,2) + Substr(Dtoc(Date()),7,4)+"_" + ;
    SUBSTR(Tran(Time()),1,2)+Substr(Tran(Time()),4,2)+Substr(Tran(Time()),7,2)
 
fso = Createobject("Scripting.FileSystemObject")
oFolder = fso.GetFolder(m.LcFrom)  &&rename folder
oFolder.Name = m.LcRenameTo
Messagebox("Mevcut Data Dizini "+ m.LcRenameTo + " Olarak Değiştirildi...",64,_Screen.Caption)
 
&&----- renaming new data structure data dir to current dir name ------------------------
fso1 = Createobject("Scripting.FileSystemObject")
oFolder1 = fso1.GetFolder(m.Lcto)  &&rename folder
oFolder1.Name = m.FirstLcFrom1 &&"data03" &&m.FirstLcFrom muste be give only folder name
Messagebox("Yeni Yapılandırılmış " + m.FirstLcTo + " Dizini " + m.FirstLcFrom + " Olarak Değiştirildi...",64,_Screen.Caption)
*---------------------------------------------------------------------------------------
 
Set Path To Data &&update for myaudit
 
Local LcOldDir,LcNewDir,LcTable
LcOldDir = m.OldPath + m.LcRenameTo + "\"  &&ADDBS("...")
LcNewDir = m.OldPath + m.FirstLcFrom1 + "
\"  &&ADDBS("...")
 
Local lcUpdatelog
lcupdatelog = Sys(5)+Curdir()+"
updatelog.txt"
 
Set Textmerge To (m.lcupdatelog) Noshow
Set Textmerge On
 
\UPDATED TABLE LIST
 
 
LOCAL lnFileNums
m.lnFileNums = Adir(laTableList, m.LcNewDir + "
*.dbf")
For i=1 To lnFileNums
    LcTable = laTableList[i,1]
    \<<m.lctable>>
    Wait Window "
Eski " + m.LcTable +" Kayıtları..Yeni Tabloya Kopyalanıyor... " + m.LcTable Nowait
    IF NOT EMPTY(SYS(2000,m.LcOldDir + m.LcTable))
       Use (m.LcNewDir + m.LcTable) Exclusive
       Append From (m.LcOldDir + m.LcTable)
       Use
    ENDIF
Endfor
&&---------------
 
Set Textmerge Off
Set Textmerge To
 
Messagebox("
Eski Kayıtlar Yeni Dataset e kopyalandı...tablo listesini log dan inceleyebilirsiniz..." + ;
    m.lcupdatelog,64,'Data Updater Result')
 
Close All

daha pratik yontemi olan varsa paylasirsa sevinirim...
structure taramasi yapip alter table yontemi kullanarak mesela

7

Re: kod la field ekleme

Soykan,
Sana dusunmen icin basit bir soru:) Bu kodda hangi onemli parca eksik?

8

Re: kod la field ekleme

sanırım bilmedigim yada gozden kacan bir seydir o eksik sad

gendbc nin bug yada eksigini hesaba katmamissin dersen simdiye kadar karsima cikmadi
eksik neymis simdi bende merak ettim smile

9 Son düzenleyen, foxman (05.09.2007 16:31:31)

Re: kod la field ekleme

Aşağıdaki program ile iki table arasındaki eksik field ları oluşturabilirsiniz.
Table1 ve Table2 isimleri parametrik olabilir, case lerden birini iptal edip structure lardan birini  master olarak kullanabilirsiniz. Stru1 in içeriğini kendiniz oluşturabilir ona göre program database ini
gerektiği zaman değiştirebilirsiniz. Fazla vaktim olmadığı için class haline getiremedim, belki daha sonra yaparım.


Visual Fox Pro
Close Database All

 
* table1 ve table2 karşılaştırma yapılacak table'lar olsun.
Create Cursor table1 (kod c(10),ad c(15),soyad c(15),adres2 c(40),ücret N(13,2))
Create Cursor table2 (kod c(10),ad c(15),soyad c(15),adres1 c(40),dtarihi d,ücret N(13,2))
 
 
**********************************************************************
Create Cursor stru1 (fname c(20),ftype c(1),flen N(3),fdec N(3))
Create Cursor stru2 (fname c(20),ftype c(1),flen N(3),fdec N(3))
 
nf1=Afields(atable1,"table1")
nf2=Afields(atable2,"table2")
 
Insert Into stru1 From Array atable1
Insert Into stru2 From Array atable2
 
Select ;
    "table1" As tname1,stru1.fname As fname1,stru1.ftype As ftype1,stru1.flen As flen1,stru1.fdec As fdec1,;
    "table2" As tname2,stru2.fname As fname2,stru2.ftype As ftype2,stru2.flen As flen2,stru2.fdec As fdec2;
    FROM stru1 ;
    FULL Join stru2 On stru2.fname=stru1.fname ;
    INTO Cursor difflist Readwrite
 
Select difflist
Browse Last
Go Top
Do While Not Eof()
    Do Case
        Case Isnull(fname1)
            cmacro="ALTER TABLE "+tname1+" ADD COLUMN "+fname2+" "+ftype2+" ("+Str(flen2)+","+Str(fdec2)+")"
            &cmacro
        Case Isnull(fname2)
            cmacro="ALTER TABLE "+tname2+" ADD COLUMN "+fname1+" "+ftype1+" ("+Str(flen1)+","+Str(fdec1)+")"
            &cmacro
    Endcase
 
    Select difflist
    Skip
Enddo
**********************************************************************

10

Re: kod la field ekleme

Soykan,
Soru ilk bakıldığında basit gibi, sorun da oradan kaynaklanıyor. Cevabı aslında hic basit değil:)

Bu kod senin verdiğin örnekten ve asıl işi yapıyor:

Visual Fox Pro
IF NOT EMPTY(SYS(2000,m.LcOldDir + m.LcTable))

       Use (m.LcNewDir + m.LcTable) Exclusive
       Append From (m.LcOldDir + m.LcTable)
       Use
    ENDIF

Foxpro DOS zamanlarında bu ve benzeri cözümler sorun olmazdı. Cünkü o zamanlar:
-Primary-Foreign key
-Trigger
-Default value
-Candidate index
...
gibi kavramlar yoktu. Transferi yapan kodun bütün bunları hesaba katması gerekiyor.

11

Re: kod la field ekleme

evet eksik olanlar bunlar bu kodda
ama ben burada gendbc nin index,trigger,stored procedure,relations,views,connectins larıda aynen yarattigini biliyorum ( en azindan aksine rast gelmedim ) vfp9 ile birlikte blob,varchar ve varbinary de desteklenmeye basladi ayrica data bir yerden bos bir yere aktariliyor cakisma da soz konusu degil ustelik birde pkey icin GUID kullaniyorum ...

ama cozumumum 0 hatali oldugunu kesinlikle iddia etmiyorum sadece simdiye kadar negatif bir duruma rastlamadigim icin bana iyi bir cozum gibi geldi smile