Delphiden Komut ile Veritabanı Yapısına Field Nasıl Eklenir?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
hedefbusiness
Üye
Mesajlar: 32
Kayıt: 11 Nis 2006 11:59
İletişim:

Delphiden Komut ile Veritabanı Yapısına Field Nasıl Eklenir?

Mesaj gönderen hedefbusiness »

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
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

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.
:ara execsql, alter table vs.
kolay gelsin
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

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
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

IBScript ile SQL komutlarını calıstırabilirsiniz,
ALTER TABLE VAT ALTER "TIP" TO VATTYPE

gibi bir SQL cumlesi VAT tablosunda TIP alanını VATTYPE olarak degistiriyor.
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
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

Mesaj gönderen hedefbusiness »

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ı ??
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

sahsen ben vt guncellemelerini ibscriptlerin icine parca parca yazıyorum,
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.
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.
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

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.

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;

Bununlada alanları kontrol ediyorum,

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;
Fikir verici olmasını ümit ediyorum.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

eski db de yeni alan/tablolar var mi kontrol edersin yoksa eklersin

Kod: Tümünü seç

if TableExist('YeniTablo') = false
  YeniTabloyuOlustur;

if FieldExist('OncekiTablo','YeniAlan') = false Then
  OncekiTabloyaYeniAlanFieldiniEkle;
stored procedurler için ise iş biraz daha kolay.

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
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Cevapla