Tabloda Alan Var mı?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
baloglurecep
Üye
Mesajlar: 261
Kayıt: 21 Tem 2006 04:59
İletişim:

Tabloda Alan Var mı?

Mesaj gönderen baloglurecep »

selam arkadaşlar....Güncelleme işlemi yapacağım. ancak veri tabanıma yeni iki alan ekledim. alter table komutu ile alanları ekliyorum. ekleme işini de datamodul cretatinde yapıyorum .ilk açılışta alanlar eklediği için diğer açılışlarda bu alanlar zaten var diye hata veriyor. Tabloda alanların varlığını nasıl kontrol edeceğim. bilen varsa yardımcı olurmu?selam ve saygılar....
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Çok basit boş bir SQL sorgusu yap. örneğin

Kod: Tümünü seç

SELECT * FROM Tablo WHERE 1=0
gibi anlamsız olsun. Bu sorgu boş sonuç döndürür ancak alan isimlerin gelir. Sonra da bu Query'nin

Kod: Tümünü seç

If SorguQuery.FieldList.IndexOf('hangialan') < 0 then (oluştur) else (zaten var)
şeklinde yorumlarsınız..
Resim
Resim ....Resim
baloglurecep
Üye
Mesajlar: 261
Kayıt: 21 Tem 2006 04:59
İletişim:

TEŞEKKÜR

Mesaj gönderen baloglurecep »

arman hocam çok teşekkür ederim dediğinizi yaptım ve oldu. bir soru daha sorabilirmiyim. çoklu alan kontrolunu nasıl yapayım. her alanı tek tek mi kontrol edeyim.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

- Her projemde tablolar ve veri alanlarını ilgili proje içinden otomatik üretilmesini sağladığımdan bu üretilecek SQL kodunu şöyle oluşturuyorum. Aynı zamanda tek merkezden çalışıyorum. Yani yazılım içerisinde farklı farklı yerlerde aynı koddan yok.

Kod: Tümünü seç

Procedure StrucOlustur_Tablo1(KomutListesi  : TStringList); 
Const 
  FieldTanimi     = '%s %s(%d),'; 
  FieldTanimiDate = '%s %s,'; 
begin 
 { --- Table Structure --- } 
  With KomutListesi do 
  begin 
    Clear; 
    Add( 'CREATE TABLE Tablo1 ('); 
    Add( Format(FieldTanimiDate, ['S_KaySiraNo' ,'AutoIncrement',  0  ] ) ); 
    Add( Format(FieldTanimiDate, ['S_SerieId'   ,'Numeric',        0  ] ) ); 
    Add( Format(FieldTanimiDate, ['S_MovieId'   ,'Numeric',        0  ] ) ); 
    Add( Format(FieldTanimi,     ['S_Ses'       ,'Text',           3  ] ) ); 
    Add( Format(FieldTanimi,     ['S_EpNum'     ,'Text',           3  ] ) ); 
    Add( Format(FieldTanimi,     ['S_EpName'    ,'Text',         100  ] ) ); 
    KomutListesi[KomutListesi.Count-1] := Copy(KomutListesi[KomutListesi.Count-1], 1, Length(KomutListesi[KomutListesi.Count-1])-1); // Son Virgülü Attık 
    Add( ')'); 
  end; 
end;
- Bu örneği şunun için verdim, göreceğin gibi her satırda bir alanın adı ve tanımı var. Bu procedure ile KomutListesi isimli TStringList'e bu text üretiliyor.

- Şimdi programının herhangi bir yerinde bu SQL kodunu üreten bu procedure çağrıldığında elde ettiğim listeyi Copy, Delete gibi string operasyonlarla alan isimleri, tip ve uzunluğu şeklinde çekebiliyorum. Böylece olması gerekenlerin alan isimlerini elde ediyorum.

- Bu listeyi dilediğim her yerde kullanıyorum. Yeni bir alanı bu yapıya ekledim diyelim. Program açıldığında veritabanı tablosu mevcut değilsetümüyle bu kodu SQL kodu olaraj işletiyorum tablo create ediliyor. Tablo var ise bu sefer listedeki alan isimlerinin var olup olmadığını döngü ile kontrol ediyorum. Yoksa Alter Table için gerekenleri buradaki ilgili eksik olduğu tespit edilmiş alanın bilgilerinden faydalanmasını sağlıyorum.

- Şahsen şöyle bir otomatik sistem kurdum hep bunu uyguluyorum. Ben gidiyorum sadece bu yapı içindeki değişikliği yapıyorum, program bir dahaki çalışmasında bu değişikliği tabloya otomatik uyguluyor...

- Umarım kafanı karıştırmadım...
Resim
Resim ....Resim
baloglurecep
Üye
Mesajlar: 261
Kayıt: 21 Tem 2006 04:59
İletişim:

teşekkür

Mesaj gönderen baloglurecep »

hocam bilgilerinie beyni sağlık. dediğini anladım benim çok işimi görecek. acizane fikirlerini almak isterim. sitemdeki programlara bakarmısınız. http://www.balogluyazilim.com
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

slm mrmarman hocam birinci bölümde verdiğiniz kodlamayı firebird için nasıl düzenleyebiliriz.
Bu listeyi dilediğim her yerde kullanıyorum. Yeni bir alanı bu yapıya ekledim diyelim. Program açıldığında veritabanı tablosu mevcut değilsetümüyle bu kodu SQL kodu olaraj işletiyorum tablo create ediliyor. Tablo var ise bu sefer listedeki alan isimlerinin var olup olmadığını döngü ile kontrol ediyorum. Yoksa Alter Table için gerekenleri buradaki ilgili eksik olduğu tespit edilmiş alanın bilgilerinden faydalanmasını sağlıyorum.

açıklamanız şeklinde bir şey yapmak istiyorum bir buton aracılığı ile firebird de Create ve alter table yöntemi ile table yada alan eklemesi yapıyorum fakat yazdığınız Procedure firebird için nasıl kullanabiliriz yani
butonumuzdaki
döngü ile tablo var mı yokmu kontrol ettirip varsa alanlarının bizim yazacağımız kod ile kontrol ettirip alan ve/veya typ ını düzenlemeği nasıl sağlayabiliriz bu alanları sağlarken özellikle FK (foreign key) tanımlası nasıl elde edilir.

Kodlarınızın kullanım şeklini biraz açabilirseniz çok sevinirim (Procedure delphide kullanımı).
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Mesaj gönderen ulu coder »

@haydarxxx,

Firebird kullanıyorsanız IBExpert kesin vardır. IBExpert'de alan oluştururken, değiştirirken vs. vs. önce SQL oluşturur, kullanıcıya gösterir ve biz de 'commit' deriz, değişiklik gerçekleşir.

Yani bu tür işlemler için gerekli SQL cümleciklerini IBExpert'den öğrenebilirsiniz.

Ayrıca herhangi bir tabloyu açıp, DDL sekmesine tıkladığınızda da o tabloyu 0'dan üretmek için gereken cümlecikleri görebilirsiniz (index vs. için).

IBDatabase'in GetTables ve GetFields prosedürleri de tablo ve alan isimlerini almak için daha kolay bir yöntem olur.

Kolay gelsin...
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

ulu coder teşekkür ediyorum dediğiniz gibi hepsi IBExpert te varmış sağolasın
IBDatabase'in GetTables ve GetFields prosedürleri
nasıl kullanılıyor.Biraz açarmısınız.
Örneğin

Tablo isimlerini bir listbox a döngüye sokarakmı alıyoruz.(nasıl) Diyelim ki Listbox1 e A,B,C isimli tabloları aldık (veri tabanında mevcut olan).

Başka bir listboxt2 stringde tanımlı A,B,C,D isimleri var
Ama listboxt1 de D tablosu yok.Eğer D tablosu yoksa ekle diyeceğiz böyle bir yöntem ile mi tablo kontrolü yaptırılıp olmayan tablo ekletiliyor.Örnek verebilirseniz çok menun olurum.

Kod: Tümünü seç

If DataModule1.IBDataSet_STOK.FieldList.IndexOf('Z') < 0 then
begin
DataModule1.IBQuery2.Close;
DataModule1.IBQuery2.SQL.Clear;
DataModule1.IBQuery2.SQL.Add('ALTER TABLE TBL_STOK ADD  Z INTEGER')  ;
DataModule1.IBQuery2.ExecSQL;
 SHOWMESSAGE('ALAN EKLENDİ')
 end
 else
 SHOWMESSAGE('ZATEN VAR');
end
Burada Z alanı yoksa ekleme yapıyoruz bu şekilde tablo ve alanları bir döngü yada mrmarman hocamın yazdığı Procedure ile tablo yoksa ekle alan yoksa ekle şekline getirme nasıl olur.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Makaleler kısmında hazırlık yaptım inceleyebilirsiniz.

bkz.
viewtopic.php?t=21162&start=0&postdays= ... highlight=
Resim
Resim ....Resim
Cevapla