Dinamik Tablo Oluşturma, Runtime Alan Kontrolü ve Düzenleme

Yazdığınız makaleleri ve üyelerimizin işine yarayacağını düşündüğünüz kodlarınızı gönderebilirsiniz. Bu foruma soru sormayın!
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Dinamik Tablo Oluşturma, Runtime Alan Kontrolü ve Düzenleme

Mesaj gönderen mrmarman »

Merhaba..

- Forumda buna ilişkin bir kaç soru mevcut ancak gösterdiğimiz metodik yol ile çözüm üretemeyenler için kod yardımı yapalım istedim.

- Aşağıdaki sistem kendimce geliştirdiğim otomatik alan ekleme / düzenleme sistemi. DivXTurk projem için geliştirdim ancak tüm projelerimde bunu kullanıyorum.

Özelliği : TEK NOKTADAN Tip tanımı yapmak ve herhangi bir tarihte tanımlardaki değişikliği kontrol ederek kendiliğinden tablo yapısının otomatik güncellenmesini sağlamak.

- ADO ile örnekledim. Ancak SQL universal bir kod çözümü olduğundan her türlü veritabanında uygulama özgürlüğünüz daima mevcut.

- İlk dikkat edilmesi gereken şey, Tip tanımlarının satır bazında standardını sağlamaktır. Aşağıda bir tablo tanım örneği veriyorum. Dikkat ederseniz ilk ve son satırı silersek geriye tipler ve uzunlukları kalıyor. Bu ilerde işimize yarayacak..

Kod: Tümünü seç

Procedure TipTanimlari_Tablo1( Liste:TStrings );
const
  FieldTanimi     = '%s %s(%d),';
  FieldTanimiDate = '%s %s,';
begin
  With Liste do begin
    Clear;
    Add('CREATE TABLE TabloNumara1 (');
    Add(Format(FieldTanimiDate, ['KaySiraNo',     'AutoIncrement']));
    Add(Format(FieldTanimi,     ['T1_Adi',        'Text',   30]));
    Add(Format(FieldTanimi,     ['T1_Soyadi',     'Text',   30]));
    Add(Format(FieldTanimi,     ['T1_TCKimlik',   'Text',   11]));
    Add(Format(FieldTanimi,     ['T1_DogumYeri',  'Text',   35]));
    Add(Format(FieldTanimiDate, ['T1_DogumTarihi','Date',    0]));
    Add(Format(FieldTanimiDate, ['T1_Secili',     'Logical', 0]));
    // Son virgülü silmek lazım,
    Liste[Liste.Count - 1] := Copy(Liste[Liste.Count - 1], 1, Length(Liste[Liste.Count - 1]) - 1);
    Add(')');
  end;
end;

// Şimdi de işin asıl sırrına iniyoruz...
kurgulana müstakil bir procedure halinde olduğundan dilediğiniz yerden çağırırsınız.

Kod: Tümünü seç

Procedure TabloKontrol( AdoQuery1, AdoQuery2 : TAdoQuery );
// -----------------------------------------------------------------------------
// Tablo varsa eksik veya değişiklik varsa tamamla, yoksa yenisini oluştur...
// İki adet TAdoQuery (AdoQuery1 ve AdoQuery2) ihtiyaç duyulur...
// Birisi kontrol diğeri uygulama içindir...
// AdoQuery1 EXECSQL için kullanılacak
// AdoQuery2 sadece Tablo Alan listesini elde ederek kontrol için.
// -----------------------------------------------------------------------------
Const // komut seti için hazırladığım format tanımlarım
  FieldSil        = 'ALTER TABLE %s DROP %s';
  FieldEkle       = 'ALTER TABLE %s ADD %s %s(%d)';
  FieldEkleDate   = 'ALTER TABLE %s ADD %s %s';
  FieldDegis      = 'ALTER TABLE %s ALTER COLUMN %s %s(%d)';
  FieldDegisDate  = 'ALTER TABLE %s ALTER COLUMN %s %s';
Var
  VeritabaniDosya : TFileName;
  TabloListe,
  Liste           : TStringList;
  TabloAdi        : String;

  Sayac           : Integer;
  Alan, Tip       : String;
  Uz              : Integer;
  Gecici          : String;
begin
  VeritabaniDosya := ExtractFilePath(Application.ExeName) + 'Veritabani.MDB';
  If NOT AdoQuery1.Connection.Connected then begin
    AdoQuery1.Connection.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+VeritabaniDosya+';Persist Security Info=False';
    AdoQuery1.Connection.LoginPrompt := False;
  end;
  Liste      := TStringList.Create;
  TabloListe := TStringList.Create;
  // var olan Tablo listesini alıyoruz...
  AdoQuery1.Connection.GetTableNames( TabloListe, False );

  // TabloNumara01 tablosu için Create Table SQL text'ini Liste'ye alıyoruz.
  TipTanimlari_Tablo1(Liste);
  // Burada tablo adını değişkene atıyorum, siz bu isimleri döngü ile
  // her tablo için yinelersiniz. Ben birisine örnek veriyorum.
  TabloAdi := 'TabloNumara1';

  // Tablo mevcut değilse tümüyle create ediyoruz.
  If TabloListe.IndexOf( TabloAdi ) < 0 then begin
    AdoQuery1.SQL.Text   := Liste.Text;
    AdoQuery1.ExecSQL;
  end else begin
    Liste.Delete(0); // ilk satırı sildik. Hani Create table olanı.
    Liste.Delete(Liste.Count-1); // son satırı sildik. Hani parantez olanı.
    Liste[Liste.Count-1] := Liste[Liste.Count-1] + ','; // son satıra virgül ekliyoruz.
    // Bu eklenen virgül tüm satırlar tutarlı olsun diye. Çünkü parse edicez
    // ederken de satır sonundaki virgülden kerteriz alıcaz...

    // Artık elimizde alan isim ve tipleri var.
    // Yapılacak işlem bu satırlar String Parse edilerek
    // ------------------------
    //  1. Eksik alan varsa eklenir.
    //  2. Uzunluk değişikliği yapılmışsa güncellendir.
    //  3. Tip değişikliği yapılmışsa ( Böyle bir durum henüz yok )

    // Field Listesi için var olan Tablo boş olarak açılıyor...
    // AlanListe stringlist'ine aktarılıyor...

    AdoQuery2.SQL.Text := 'SELECT * FROM TabloNumara1 WHERE 1=0';
    AdoQuery2.Active   := True;

    // Kontrol edilecek alanlar Liste stringlist'inden sırayla kontrol edilecek.
    For Sayac := 0 to Liste.Count-1 do begin
      Gecici := Trim( Liste[Sayac] );

      // İlk boşluğa kadar olan kısım Alan Adı oluyor...
      Alan   := Copy(Gecici, 1, Pos(' ', Gecici)-1);
      System.Delete( Gecici, 1, Length(Alan) );
      Gecici := Trim(Gecici);

      // Parantez varsa parantezin önündeki, yoksa son virgülün önündeki Tip oluyor....
      Tip  := Gecici;
        If Copy( Tip, 1, Pos('(', Tip)-1 ) <> ''
          then Tip := Copy( Tip, 1, Pos('(', Tip)-1 )
          else Tip := Copy( Tip, 1, Pos(',', Tip)-1 );
        System.Delete( Gecici, 1, Length(Tip) );
        Gecici := Trim(Gecici);
      // Parantez varsa parantez içeriği Uzunluk, yoksa uzunluk 0 oluyor....
      If ( Gecici <> '' ) AND ( Gecici[1] = '(' )
        then Uz := StrToInt(Copy(Gecici, 2, Pos(')', Gecici)-2))
        else Uz := 0;

      // Bulduğumuz alan adını Tablodan kontrol ediyoruz...
      If AdoQuery2.FieldList.IndexOf(Alan) < 0 then begin
        // Alan yok ekliyoruz...
        If Uz = 0
          then AdoQuery1.SQL.Text := Format(FieldEkleDate, [TabloAdi, Alan, Tip ])
          else AdoQuery1.SQL.Text := Format(FieldEkle,     [TabloAdi, Alan, Tip, Uz ]);
        AdoQuery1.ExecSQL;
      end else begin
        // Alan var ancak Uzunluk aynı mı ? kontrol ediyoruz.
        If AdoQuery2.FieldByName(Alan).Size <> Uz then begin
          // Özel bir durum var. AUTOINC bir alan olacaksa o zaman eski alanı silip
          // yeniden oluşturucaz yoksa sadece düzelticez..
          If (UpperCase(Tip) = 'AUTOINCREMENT') then begin
            // Alan düşürülür, AutoInc alan baştan eklenir...
            // Alanı silme
            AdoQuery1.SQL.Text := Format(FieldSil, [TabloAdi, Alan]);
            AdoQuery1.ExecSQL;
            // Yenisini ekleme..
            If Uz = 0
              then AdoQuery1.SQL.Text := Format(FieldEkleDate, [TabloAdi, Alan, Tip ])
              else AdoQuery1.SQL.Text := Format(FieldEkle,     [TabloAdi, Alan, Tip, Uz ]);
            AdoQuery1.ExecSQL;
          end else begin
            // Sadece Düzeltme
            If Uz = 0
              then AdoQuery1.SQL.Text := Format(FieldDegisDate, [TabloAdi, Alan, Tip ])
              else AdoQuery1.SQL.Text := Format(FieldDegis,     [TabloAdi, Alan, Tip, Uz ]);
            AdoQuery1.ExecSQL;
          end;
        end;
      end;
    end; // For döngüsü
  end;
  TabloListe.Free;
  Liste.Free;
end;
- Geriye uygulama kalıyor...

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
begin
  TabloKontrol( AdoQuery1, AdoQuery2 )
end;
- Hepsi bu kadar...

- Doğru çalışıp çalışmadığını test ederek yolladım bir sıkıntı olursa bildirin gözden kaçan bişey varsa düzelteyim. Çünkü bu kodları sıfırdan sizin için ürettik.

- Orjinal projelerimden biraz daha farklı oldu. kod satırları arasında gereken açıklamalar eklenmiştir.

- Umarım size bir faydamız dokunmuştur... :idea:
Resim
Resim ....Resim
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

Bu makaleyi Firebird e çevircek biri olursa çok makbule geçer.Ben denedim ama beceremedim.Hocam bu arada eline sağlık Teşekkürler
Kullanıcı avatarı
White Rose
Üye
Mesajlar: 726
Kayıt: 06 Tem 2005 09:41
Konum: Güneyden
İletişim:

Mesaj gönderen White Rose »

Teşekkürler üstad...
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

@haydarxxx

yapman gereken sabitleri fb nin syntaxına uyacak şekilde ayarlamak.
alan

Kod: Tümünü seç

Add(Format(FieldTanimi,     ['T1_Adi',        'Text',   30])); 
burda text yerine varchar yazacaksın.

Kod: Tümünü seç

Add(Format(FieldTanimiDate, ['KaySiraNo',     'AutoIncrement'])); 
burda da autoincrement yerine kendi tanımladığın domainin adını yazabilirsin. (ki ben autoinc alanlar için tanımladığım domaini kullanıyorum).
tiptanimlari proceduresinde bunlara dikkat etmen yeterli...
tablokontrol proceduresinde dikkat etmen gereken iki nokta var biri connection string. adoquery ile yapmak istersen(ki yapabilirsin) conneciton stringi ona göre ayarlaman lazım.
diğer nokta ise constları fb nin syntaxına göre değiştirmen gerekebilir.
onun haricinde kodların çalışacağını zannediyorum.
vaktim olmadığı için uygulama yapıp test edemiyorum.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

yapman gereken sabitleri fb nin syntaxına uyacak şekilde ayarlamak.

Kod: Tümünü seç

Clear; 
    Add('CREATE TABLE TabloNumara1 ('); 
    Add(Format(FieldTanimiDate, ['KaySiraNo',     'AutoIncrement'])); 
    Add(Format(FieldTanimi,     ['T1_Adi',        'Text',   30])); 
    Add(Format(FieldTanimi,     ['T1_Soyadi',     'Text',   30])); 
    Add(Format(FieldTanimi,     ['T1_TCKimlik',   'Text',   11])); 
    Add(Format(FieldTanimi,     ['T1_DogumYeri',  'Text',   35])); 
hocam burada textleri varchar yada AutoIncrement şeklinde düzenleyebiliriz ama örneğin şöyle bir şey olurmu aralara virgül koyarak

Kod: Tümünü seç

Add(Format(FieldTanimiDate, ['KaySiraNo',     'AutoIncrement' ,'PRIMARY KEY (KaySiraNo)'] ));
şöyle bir yapıyı (örnek olarak veriyorum)

Kod: Tümünü seç

CREATE TABLE TBL_GIRIS (
    IDNO          INTEGER NOT NULL,
    DIDNO         INTEGER NOT NULL,
    URUN_ADI      VARCHAR(20) NOT NULL COLLATE PXW_TURK,
    BIRIM_FIYATI  DECIMAL(18,2) DEFAULT 0,
    URUN_SAYISI   INTEGER DEFAULT 1,
    KAYIT_TARIHI  DATE DEFAULT 'TODAY'
);
veya bir FK tanımı

Kod: Tümünü seç

ALTER TABLE TBL_GIRIS ADD CONSTRAINT FK_GIRIS FOREIGN KEY (DIDNO) REFERENCES TBL_FIRMA (IDNO) ON DELETE CASCADE ON UPDATE CASCADE;

gibi tip tanımlamasını nasıl uyarlayacağız koda

Ben standart firebird için gerekli olan bileşenler ile veritabanına bağlanıyorum (IBDatabase,Ibdataset,Ibquery vs.).AdoQuery1 yerine IBQuery kullanıyorum
VeritabaniDosya := ExtractFilePath(Application.ExeName) + 'Veritabani.MDB';
If NOT AdoQuery1.Connection.Connected then begin
AdoQuery1.Connection.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+VeritabaniDosya+';Persist Security Info=False';
AdoQuery1.Connection.LoginPrompt := False;
end;
nasıl düzenlenir.

AdoQuery1.Connection.GetTableNames( TabloListe, False );
bu yapıyı kaldırdığımda Connection bağlantısı nasıl olacak fb syntaxına göre birşeyler ekliyorum ama olmuyor.

TipTanimlari_Tablo1(Liste);
// Burada tablo adını değişkene atıyorum, siz bu isimleri döngü ile
nasıl yapılır.Yani bu kodları fb ye çevirmek benim için gerçekten zor fb nin syntax yapısı diğer veritabanlarına hiç benzemiyor.Daha geniş bir bilgi vermeniz dileği ile saygılar
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

tekrardan merhaba.
dikkat ettiysen @mrmarman ın kodlarında indexlerle ilgili herhangi bir işlem yok. sadece alan tanımları var...

Kod: Tümünü seç

Add(Format(FieldTanimiDate, ['KaySiraNo',     'AutoIncrement' ,'PRIMARY KEY (KaySiraNo)'] ));
peki yukardaki şekilde nasıl yapacağız.
burda const lara dikkatini çekmek istiyorum.

Kod: Tümünü seç

const
  FieldTanimi     = '%s %s(%d),';
  FieldTanimiDate = '%s %s,'; 
format fonksiyonu ile bu sabitlerde gerekli olan bilgiler yazılıyor. bu kodlara bakarak istediğin işlemi iki şekilde yaparsın.
birincisi aşağıdaki gibi yeni bir const tanımlarsın. ve format da bu constu kullanırsın.

Kod: Tümünü seç

fieldtanimipkey='%s %s Primary key'

ikincisi ve bence daha kolay olanı fieldtanimidate sabitini kullanarak primary key default değer vs atamaları yaparız.
örnek şöyle bişey olur.

Kod: Tümünü seç

Add(Format(FieldTanimiDate, ['KaySiraNo',     'AutoIncrement PRIMARY KEY (KaySiraNo)'] ));

Kod: Tümünü seç

URUN_ADI      VARCHAR(20) NOT NULL COLLATE PXW_TURK,
bu tarz bir alan ekleneceği zaman gene fieldtanimidate işimizi görebilir.

Kod: Tümünü seç

Add(Format(FieldTanimiDate, ['URUN_ADI', 'VARCHAR(20) NOT NULL COLLATE PXW_TURK'] ));
Foreign key için TabloKontrol gibi FKKontrol veya index kontrol isimlerinde procedureler hazırlanılması lazım gibime geliyor.

veritabanı dosyasının düzenlemesi de aşağıdaki gibi bişey olabilir.

Kod: Tümünü seç

VeritabaniDosya := ExtractFilePath(Application.ExeName) + 'Veritabani.fdb';
If NOT ibquery1.database.connected then begin
ibquery1.database.databasename := veritabaniDosya;
end;
burda zaten querylerin database bağlı olması ihtimalide göz önünde tuutlmalı. illa dinamik ayarlayacağım diye uğraşmaya gerek yok.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

Kod: Tümünü seç

  Add('CREATE TABLE TabloNumara1 (');
    Add(Format(FieldTanimiDate, ['TABLOID',     'AutoIncrement INTEGER NOT NULL PRIMARY KEY (TABLOID)']));
    Add(Format(FieldTanimi,     ['ADI',        'VARCHAR(20) NOT NULL COLLATE PXW_TURK']));
    Add(Format(FieldTanimi,     ['TARIH',     'DATE']));
    Add(Format(FieldTanimi,     ['PARA',   'DECIMAL(15,2)']));
şeklinde denedim ama cons ile ilgili hata alıyorum

Kod: Tümünü seç

No argument for format %d
dediğiniz const ayarıda yaptım benzer hata yapıyorum.
AdoQuery1.Connection.GetTableNames( TabloListe, False );
IbQuery1 nasıl düzenleyeceğiz.
Foreign key için TabloKontrol gibi FKKontrol veya index kontrol isimlerinde procedureler hazırlanılması lazım gibime geliyor.
bunu soramıyorum bile beni aşıyor

Hocam bu makaleyi baştan yaratmak çok zor benim için.

aslangeri hocam Keşke bu makaleyi tam anlamı ile firebird e çevirebilseniz ne güzel olurdu bizim için :D :roll:İlginiz için teşekkürler
adnansirca
Üye
Mesajlar: 135
Kayıt: 14 Kas 2005 12:24

Mesaj gönderen adnansirca »

Hocam bu güzel çalışma için tebrik ederim. Elinize sağlık.
Ancak ben kendi projeme uyarlayamadım.
Acces veritabanımda 23 adet tablo var. Her tabloda 50 yi aşkın alan var.
Ben tabloları ve alanları iki adet ayrı TListBox bileşenine aktarıyorum yalnız bunları structure yapı içerisine nasıl aktaracağımı çözemedim.
Yani;

Kod: Tümünü seç

Procedure Structure (Liste : TStringList);
......
Begin
 With Liste Do
  Begin
   Clear;
   //Listeye Alanları aktarıp tablodakilerle karşılaştır ve güncelle
   Add('CREATE TABLE '+lstTabloAlanlari.Items+'');
   .......................
   End;
şeklinde Alan adları ,tip ve uzunluğunu listeden alıp güncellemek istiyorum.
Alan adlarını listeye aktaramadım bir türlü.
Yardımınız olursa sevinirim.
İyi çalışmalar.
adnansirca
Üye
Mesajlar: 135
Kayıt: 14 Kas 2005 12:24

Mesaj gönderen adnansirca »

hocam mesajıma bir cevap veren yok mu..Rica ederim.Tıkandım....
Konuyu başka yerde açmak istemiyorum.. yoksa adminler kızıyor.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

@adnansirca

Alan adları, tipleri ve uzunlukları String operasyonlarla ayrıştırıldığını örneklemiştim. Buradaki anlaşılmayacak nokta neresi ? Verdiğimiz örnek içerisinde bir çok noktada o aşamada neler yapıldığını da bildirdik.
@mrmarman yazdı:- İlk dikkat edilmesi gereken şey, Tip tanımlarının satır bazında standardını sağlamaktır.
bundan kasteddiğimiz şey, oluştruduğun yapının ürünü olan listenin ilk elemanı CREATE TABLE satırı, son elemanı ise parantez kapatma işareti oluyor. bu iki elemanı sildiğinde geriye alan isimlerin, tipleri ve uzunlukları kalıyor.

- Örnekte de gördüğün üzere bu satırlar döngü ile tek tek alınarak kontrol ediliyor. Yoksa ekleniyor,varsa tip değişikliği varsa o gerçekleşiyor...

- Verdiğim örneği kendi tablolarından birine uygularsan alacağın sonuç sana yol gösterecektir.
Resim
Resim ....Resim
adnansirca
Üye
Mesajlar: 135
Kayıt: 14 Kas 2005 12:24

Mesaj gönderen adnansirca »

Hocam sanırım soruyu yanlış noktadan yöneltmişim ve anlaşamadık.
Ben Field listesini ListBox1 den almaya çalışıyorum.
Şöyle ifade edeyim.
Formumda iki adet TListBox, Bir AdoDataset var. Bir de İki Adet Query var.
ListBox1 Accesteki tabloları alıyor. ListBox2 Bu tablolardaki alanları alıyor.
Şimdi tablolar listesinde bir tablo seçtiğimde bu tablodaki alanları Listeye eklemeye çalışıyorum(Ad,Alan,Uzunluk şeklinde)(Bu noktada sizin verdiğiniz Structure yapıyı kullanmaya çalışıyorum - (Forumda verdiğiniz procedure TipTanimlari ) )

Merak ettiğim konu şu.
Sizin belirttiğiniz Structure yapı genel bir yapı mı yoksa örneğin A Tablosu içerinde mevcut A,B,C alanları mı.

Şayet genel yapı şeklinde değilse 23 adet tabloyu ve bu tablolardaki her bir alanı ayrı ayrı yazmak gerekecek gibi bir mantık kuruyorum ki bu alanları listbox tan almanın yazılacak kodlar açısından da daha kısa olacağını düşünüyorum.

Bu şekilde yanlış bir mantığa mı kapıldım acaba. Kodlarınızı doğru mu anlamışım yoksa ben mi yanlış düşünüyor ve değerlendiriyorum. Malum programlama bilginiz ve mantığınız benimkinden çok çok fazla.....
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

@adnansirca;
gözden kaçırdığın nokta programın amacı.
amaç vt deki alanları güncellemek. vt deki alanları güncellemek için vtdeki alanları karşılaştıracağın bir liste olması lazım. Sabit olarak yazılan (ister 23 tablo olsun ister 233) tablo bilgileri tablolardaki alanların yeni hali. vt dekiler ise eski değişecek o yüzden alanları vt den çekmenin bir anlamı yok.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
adnansirca
Üye
Mesajlar: 135
Kayıt: 14 Kas 2005 12:24

Mesaj gönderen adnansirca »

Sayın aslangeri ve mrmarman,
Aydınlattığınız için teşekkür ederim.
Dün kodları kullanarak mevcut tabloda kontrol yaptım.
Ancak veritabanında mevcut olmayan bir tabloyu CREATE edemedim. Hata : Microsoft Jet....... TabloAdi tablosunu bulamadı....
TabloAdi : Benim tabloya verdiğim addır. Örneğin veritabanımda yer almayan Bilgiler tablosu gibi. Böyle bir durumda yukarıdaki hatayı veriyor.
Ancak veritabanında mevcut tablo için herhangi bir sorun ve hata yok.
Bu hata Create metodunun kullanılmamasından mı kaynaklanıyor yoksa .... Çünkü sayın mrmarman ın işin sırrı...... altında belirttiği procedure ü incelediğimde ALTER metodu var ancak CREATE metodu yok. CREATE metodu ise TipTanimlari_Tablo1 de var.
Hata sebebini açıklayabilir misiniz....
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

@adnansirca hocam CREATE TABLE zaten VERİ YAPISI içinde var. Tekrar bak istersen.

Kod: Tümünü seç

    Add('CREATE TABLE TabloNumara1 ('); 
    Add(Format(FieldTanimiDate, ['KaySiraNo',     'AutoIncrement'])); 
    Add(Format(FieldTanimi,     ['T1_Adi',        'Text',   30])); 
- Create ediliyorsa zaten direkt bu liste kullanılıyor execute ediliyor. Bunda sıkıntı yok zaten. Verdiğimiz kod Alan eksikliği veya tip değişikliği varsa buna otomatik müdahale edilmesini sağlamak. Yani program gelişim aşamsında ihtiyaç olunan yeni bir alanı eklerken veya uzunluğunu değiştirirken kod içerisinde değişiklik yapmaksızın sadece VERİ YAPISI tanımında gereken düzeltme tümüyle otomatik olarak veritabanına ve programa yansısın diye düşünülmüş bir yöntem idi.
Resim
Resim ....Resim
adnansirca
Üye
Mesajlar: 135
Kayıt: 14 Kas 2005 12:24

Mesaj gönderen adnansirca »

Mesele anlaşılmıştır sayın ARMAN.
ben veritabanında var olmayan bir tablo için de bu yapıyı kullanmak istediğim için soru yönelttim....

Bu arada sitenizi inceledim. Sanırım eşiniz( ya da bir yakınınız) hukukçu. Ben de hukukçuyum. İstanbul'da Avukatlık mesleği icra ediyorum. Şu anda avukatlar için ücretsiz bir program geliştiriyorum ve bu programda bir çok teknik konuya yer ayırıyorum ki bunun sebebini de size itiraf edeyim. Bir yazılım firmasından 1.500,00 YTL değerinde bir takip programı satın aldım ve fakat bir türlü istediğim verimi alamadım. Bunun yanısıra güncelleme ve şifre problemi yaşadım. Şu anda program sistemimde kayıtlı ancak kurlduğu günden sonra sıkıntıların başladığı ana kadar hep bir tereddüt yaşadım ve neticede toslayan bir program satın aldığımı anladım.
Zira devreye geçen UYAP projesi nedeniyle bir ay boyunca program yüzünden icra takibi başlatamadım. Bunun üzerine de bir proje hazırladım ve dağıtmaya başladım. Bu projedeki sıkıntılarımı da sizlerle paylaşıyorum.
Elbette ekmek teknesine saygımız sonsuz ancak ben avukatlık mesleğimde bir insanı mağdur ettiğimi hatırlamıyorum ki ben ceza alanıyla ilgileniyorum ve bu alan insanların hayatını ilgilendiren bir alan. Hal böyle olunca iş yaptığım şahıs veya kurumlardan da bu eylemi bekliyorum. Tabi mağdur olunca çıldırıp bağırmak sizi tatmin etmiyor. Bu durumda çözüm arıyorsunuz. Ve ben de bir proje hazırlayarak hukuki meseleler bakımından hukukçulara yardımcı olmaya çalışıyorum.
Bir programcı olarak bunu ne ölçüde tasvip edersiniz açıkçası benim için önemli. Ancak ben her zaman mağduriyeti giderici ölçütlere dayanıyorum.
Umarım ifadelerim yanlış anlaşılmamıştır.
Bunları sizinle tanışma isteğimden açıklıyorum.

Umarım tanışma ve görüşme imkanımız olur.
Av. Peyami AYDOĞDU
İstanbul Barosu
İncirli Cad. Yeşilada sk. Okyay Apt. 4/3 Bakırköy/İSTANBUL
adresimdir.
Her zaman beklerim.....
Cevapla