Delphiden Komut ile Veritabanı Yapısına Field Nasıl Eklenir?
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
- hedefbusiness
- Üye
- Mesajlar: 32
- Kayıt: 11 Nis 2006 11:59
- İletişim:
Delphiden Komut ile Veritabanı Yapısına Field Nasıl Eklenir?
MERHABA HERKESE
Firebird 1.5 Veritabanı
ile oldusturulmus olan DATA.FDB dosyamız Yapmıs oldugumuz Muhasebe Programının data dosyasını olusturuyor
Müsterilerimize daha onceden gondermiş oldugumuz Programlardaki DATA.FDB dosyasının Güncellenmesini (Eklenmesi gereken Alanların Eklenmesini) sağlayabilmek icin Delphi icerisinden Guncelleme program nasıl bir yol izlemeliyiz.
Özet olarakData Yapısı icerisinde Veritabanı Fieldlarının Delphi tarafndan verecegimiz Komutla Eklenip Kaldırılması icin nasıl bir yol izlemeliyiz.
HERKESE iyi calısmalar..
http://www.hedefyazilim.net
hedefbusiness@hotmail.com
Firebird 1.5 Veritabanı
ile oldusturulmus olan DATA.FDB dosyamız Yapmıs oldugumuz Muhasebe Programının data dosyasını olusturuyor
Müsterilerimize daha onceden gondermiş oldugumuz Programlardaki DATA.FDB dosyasının Güncellenmesini (Eklenmesi gereken Alanların Eklenmesini) sağlayabilmek icin Delphi icerisinden Guncelleme program nasıl bir yol izlemeliyiz.
Özet olarakData Yapısı icerisinde Veritabanı Fieldlarının Delphi tarafndan verecegimiz Komutla Eklenip Kaldırılması icin nasıl bir yol izlemeliyiz.
HERKESE iyi calısmalar..
http://www.hedefyazilim.net
hedefbusiness@hotmail.com
s.a.
1.lütfen aynı soruyu farklı forumlara sormayın.
2.sql komutları ile vt de değişiklik yapablirsiniz.
arama yaparak detaylı bilgi bulabilirsiniz.
execsql, alter table vs.
kolay gelsin
1.lütfen aynı soruyu farklı forumlara sormayın.
2.sql komutları ile vt de değişiklik yapablirsiniz.
arama yaparak detaylı bilgi bulabilirsiniz.

kolay gelsin
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kodla yapmak için sanırım veri tabanını son DDL e göre yeniden başka bir isimde oluşturup tablolardaki bilgileri aktarmak olabilir.
Yada ; viewtopic.php?t=13447&highlight=compare+ibexpert
Yada ; viewtopic.php?t=13447&highlight=compare+ibexpert
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
- hedefbusiness
- Üye
- Mesajlar: 32
- Kayıt: 11 Nis 2006 11:59
- İletişim:
Peki Tabloda O alanın olup olmadıgını yoksa ALTER ile ekleme
Peki Tabloda O alanın olup olmadıgını yoksa ALTER ile ekleme işlemini nasıl yaparız
Öncelikle Tesekkurler
Yani Alan Tabloda varmı Önce onu kontrol edelim daha sonra yoksa alter ile ekleyelim bunun icin yolunuz varmı ??
Öncelikle Tesekkurler
Yani Alan Tabloda varmı Önce onu kontrol edelim daha sonra yoksa alter ile ekleyelim bunun icin yolunuz varmı ??
sahsen ben vt guncellemelerini ibscriptlerin icine parca parca yazıyorum,
mesela bir procedure degismis,tablonun tekinin alanı silinmis,index eklenmis vs.
sonra
diye bir yama seklinde derliyorum,
yukardaki kodda
db nin bulundugu yerde bu yamanın bir kere calısması yeterli oluyor,
su ana kadar bir problem olmadı gayet de kullanımı pratik
islem sonunda guncellestirmenin saglıklı yapılıp yapılmadıgını bir sekilde kontrol de edebilirsiniz.
mesela bir procedure degismis,tablonun tekinin alanı silinmis,index eklenmis vs.
sonra
Kod: Tümünü seç
unit Patch;
interface
uses
Windows, Messages, SysUtils, Classes, Controls, Forms,IBDatabase, Db, IBScript, IniFiles;
type
TForm1 = class(TForm)
IBScript1: TIBScript;
IBDatabase1: TIBDatabase;
IBTransaction1: TIBTransaction;
IBScript2: TIBScript;
IBScript3: TIBScript;
IBScript4: TIBScript;
IBScript5: TIBScript;
IBScript6: TIBScript;
IBScript7: TIBScript;
IBScript8: TIBScript;
IBScript9: TIBScript;
IBScript10: TIBScript;
IBScript11: TIBScript;
IBScript12: TIBScript;
procedure FormCreate(Sender: TObject);
private
procedure RunScript(IBScript: TIBScript);
public
{ Public declarations }
end;
var
Form1: TForm1;
AppPath: string;
cr: string = #13;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
try
AppPath := ExtractFilePath(Application.ExeName);
with TIniFile.Create(AppPath + 'T2K.ini') do
if ReadString('Extra', 'Db Path', '') <> '' then
IBDatabase1.DatabaseName := ReadString('Extra', 'Db Path', '')
else
IBDatabase1.DatabaseName := AppPath + 'DATA.GDB';
try
IBDatabase1.Connected := True;
except
on e: exception do
if (ParamCount <> 1) and (ParamStr(1) <> '/SILENT') then
Application.MessageBox(PChar('Veritabanına bağlanılamadı.' + cr + e.message),PChar('Hata'),0);
end;
//UPDATELER SIRASI İLE YAPILIR.
RunScript(IBScript1); //versiyon procedurunu sil
RunScript(IBScript2); //PLU_BIU_BARCODEUPDATE triggerini guncelle
RunScript(IBScript3); //PLU tablosundaki eski iki kontrolu sil
RunScript(IBScript4); //PLU sınır degerleri kontrollerini ekle
RunScript(IBScript5); //KDV tablosu ve sınır kontrolleri
RunScript(IBScript6); //Plu_report ve Vendor_report icin procedurleri guncelle,
// yenilerini ekle
RunScript(IBScript7); //Barcode ondegerler
RunScript(IBScript8); //Kdv tablosundaki ondegerleri ayarlayan trigger eklendi
RunScript(IBScript9); //Plu tablosundaki CODESTR alanını 15 karakter olarak degistirildi.
RunScript(IBScript10); //Code tablosunda insert yada update yapılınca plu tablosu triggerları tetiklemek icin guncelleni.
RunScript(IBScript11); //Kdv tablosunda Type alanı VatType olarak degistirildi.
RunScript(IBScript12); //Plu tablosuna 14 Metinalanı indexleri eklendi
finally
if (ParamCount <> 1) and (ParamStr(1) <> '/SILENT') then
Application.MessageBox(PChar('Veritabanı Güncellemesi tamamlandı.'),PChar('Bilgi'),0);
Application.Terminate;
end;
end;
procedure TForm1.RunScript(IBScript: TIBScript);
begin
try
IBScript.ExecuteScript;
except
end;
end;
end.
yukardaki kodda
db nin bulundugu yerde bu yamanın bir kere calısması yeterli oluyor,
su ana kadar bir problem olmadı gayet de kullanımı pratik
islem sonunda guncellestirmenin saglıklı yapılıp yapılmadıgını bir sekilde kontrol de edebilirsiniz.
ÜŞENME,ERTELEME,VAZGEÇME
Merhaba ,
MySQL veritabanı kullanıyorum, her zaman güncel boş bir veritabanım oluyor bir kenarda ve güncel olmayan veritabanlarında ki önce tabloların omayanlarını olduğu gibi, sonrada var olan tabloların içindeki farklı alanları taratıp güncelletiyorum.
Bununlada alanları kontrol ediyorum,
Fikir verici olmasını ümit ediyorum.
MySQL veritabanı kullanıyorum, her zaman güncel boş bir veritabanım oluyor bir kenarda ve güncel olmayan veritabanlarında ki önce tabloların omayanlarını olduğu gibi, sonrada var olan tabloların içindeki farklı alanları taratıp güncelletiyorum.
Kod: Tümünü seç
procedure TDatabaseBakim.TableIsExist;
var
Liste:TStringList;
qSource,qTarget,qExecute:TQuery;
Kontrol:Byte;
i:integer;
Cumle,alanadi:AnsiString;
begin
try
qSource:=TQuery.create(nil);
qTarget:=TQuery.create(nil);
qExecute:=TQuery.create(nil);
Database4.Connected:=false;
Database4.AliasName:='dbs'+RxDBLookupCombo2.Value;
Database4.Connected:=true;
Database3.Connected:=false;
Database3.AliasName:='dbsempty';
Database3.Params.Clear;
Database3.Connected:=true;
liste:=TStringList.create;
qSource.DatabaseName:='vtbackup';
qTarget.DatabaseName:='vttarget';
qExecute.DatabaseName:='vttarget';
with qSource do
begin
close;
sql.clear;
sql.add('SHOW tables from dbsempty');
Active:=true;
first;
end;
with qTarget do
begin
close;
sql.clear;
sql.add('SHOW tables from dbs'+RxDBLookupCombo2.Value);
Active:=true;
first;
end;
while not qSource.eof do
begin
Kontrol:=0;
qTarget.first;
while not qTarget.eof do
begin
if qTarget.Fields[0].AsString=qSource.fields[0].AsString then Kontrol:=1;
qTarget.Next;
end;
if Kontrol=0 then Liste.add(qSource.fields[0].AsString);
qSource.next;
end;
if liste.count>0 then
begin //1
for i:=0 to liste.Count-1 do
begin //2
with qSource do
begin
close;
sql.clear;
sql.add('SHOW fields from '+liste[i]);
Active:=true;
first;
end;
alanadi:='';
Cumle:='CREATE TABLE '+liste[i]+' (';
while not qSource.eof do
begin//3
if not qSource.bof then Cumle:=Cumle+',';
Cumle:=Cumle+qSource.Fields[0].AsString+' '+qSource.fields[1].AsString;
if qSource.fields[2].AsString='' then cumle:=Cumle+' NOT NULL';
if qSource.fields[5].AsString='auto_increment' then begin cumle:=cumle+' AUTO_INCREMENT';alanadi:=qSource.Fields[0].AsString; end;
if qSource.fields[4].AsString<>'' then cumle:=cumle+' DEFAULT "'+qSource.fields[4].AsString+'"';
qSource.next;
end;//3
if alanadi<>'' then begin Cumle:=Cumle+', PRIMARY KEY('+alanadi+'), UNIQUE('+alanadi+')'+', INDEX('+alanadi+')';alanadi:=''; end;
cumle:=cumle+') TYPE=InnoDB';
with qExecute do
begin
close;
sql.clear;
sql.add(cumle);
ExecSQL;
end;
end;//2
end;//1
finally
begin
qSource.free;
qTarget.free;
qExecute.free;
liste.free;
end;
end;
end;
Kod: Tümünü seç
procedure TDatabaseBakim.FieldIsExist;
var
qSource,qTarget,qExecute,qFields:TQuery;
Kontrol:Byte;
i:integer;
Cumle,alanadi:AnsiString;
begin
try
qSource:=TQuery.create(nil);
qTarget:=TQuery.create(nil);
qExecute:=TQuery.create(nil);
qFields:=TQuery.create(nil);
Database4.Connected:=false;
Database4.AliasName:='dbs'+RxDBLookupCombo2.Value;
Database4.Connected:=true;
Database3.Connected:=false;
Database3.AliasName:='dbsempty';
Database3.Connected:=true;
Gauge3.Visible:=true;
qSource.DatabaseName:='vtbackup';
qTarget.DatabaseName:='vttarget';
qExecute.DatabaseName:='vttarget';
qFields.DatabaseName:='vtbackup';
with qSource do
begin
close;
sql.clear;
sql.add('SHOW tables from dbsempty');
Active:=true;
first;
end;
Gauge3.MaxValue:=qSource.RecordCount;
while not qSource.eof do
begin //while qsource
Kontrol:=0;
with qFields do
begin
close;
sql.clear;
sql.add('show fields from '+qsource.fields[0].AsString);
Active:=true;
first;
end;
with qTarget do
begin
close;
sql.clear;
sql.add('show fields from '+qsource.fields[0].AsString);
Active:=true;
first;
end;
while not qFields.eof do
begin
Kontrol:=0;
while not qTarget.eof do
begin
if qTarget.Fields[0].AsString=qFields.Fields[0].AsString then Kontrol:=1;
qTarget.next;
end;
if kontrol=0 then
begin
alanadi:='';
Cumle:='ALTER TABLE '+qSource.Fields[0].AsString+' ADD '+qFields.Fields[0].AsString;
Cumle:=Cumle+' '+qFields.fields[1].AsString;
if qFields.fields[2].AsString='' then cumle:=Cumle+' NOT NULL';
if qFields.fields[5].AsString='auto_increment' then begin cumle:=cumle+' AUTO_INCREMENT';alanadi:=qFields.Fields[0].AsString; end;
if qFields.fields[4].AsString<>'' then cumle:=cumle+' DEFAULT "'+qFields.fields[4].AsString+'"';
if alanadi<>'' then begin Cumle:=Cumle+', PRIMARY KEY('+alanadi+'), UNIQUE('+alanadi+')'+', INDEX('+alanadi+')';alanadi:=''; end;
with qExecute do
begin
close;
sql.clear;
sql.add(cumle);
ExecSQL;
end;
end;
qTarget.first;
qFields.next;
end;
Gauge3.Progress:=Gauge3.Progress+1;
qSource.next;
end; //while qsource
Gauge3.Visible:=false;
with qExecute do
begin
close;
sql.clear;
sql.add('ALTER TABLE arac CHANGE yeradet yeradet VARCHAR(5)');
ExecSQL;
end;
Application.MessageBox('Güncelleme İşlemi Başarıyla Tamamlandı..!','DB UPDATE',mb_ok+MB_ICONINFORMATION);
finally
begin
qSource.free;
qTarget.free;
qExecute.free;
end;
end;
end;
Volkan KAMADAN
www.polisoft.com.tr
www.polisoft.com.tr
- sadettinpolat
- Moderator
- Mesajlar: 2131
- Kayıt: 07 Ara 2003 02:51
- Konum: Ankara
- İletişim:
eski db de yeni alan/tablolar var mi kontrol edersin yoksa eklersin
stored procedurler için ise iş biraz daha kolay.
prosedurun basin Create Or Alter ifadesi eklersen sp varsa alter calistirilir yoksa create calistirilir....
tableExist
fieldExist
Kod: Tümünü seç
if TableExist('YeniTablo') = false
YeniTabloyuOlustur;
if FieldExist('OncekiTablo','YeniAlan') = false Then
OncekiTabloyaYeniAlanFieldiniEkle;
prosedurun basin Create Or Alter ifadesi eklersen sp varsa alter calistirilir yoksa create calistirilir....
tableExist
Kod: Tümünü seç
SELECT COUNT(RDB$RELATION_NAME)
FROM RDB$RELATIONS
WHERE (RDB$RELATION_NAME = TABLOADI)
AND RDB$VIEW_SOURCE IS NULL;
fieldExist
Kod: Tümünü seç
SELECT COUNT(RF.RDB$FIELD_NAME)
FROM RDB$RELATION_FIELDS RF
LEFT JOIN RDB$FIELDS F ON (F.RDB$FIELD_NAME = RF.RDB$FIELD_SOURCE)
LEFT JOIN RDB$TYPES T ON (T.RDB$TYPE = F.RDB$FIELD_TYPE)
WHERE RF.RDB$RELATION_NAME = TABLOADI AND
T.RDB$FIELD_NAME = 'RDB$FIELD_TYPE' AND
RF.RDB$FIELD_NAME = FIELDADI