Kodbank İndir

! CODEBANK 2012 !

İNDİRMEK&DETAYLI BİLGİ ALMAK İÇİN BURAYI TIKLAYINIZ.

ÖNEMLİ AÇIKLAMA: MUTLAKA OKUYUNUZ!

Gönderen Konu: Otomatik Artan Alan Oluşturma  (Okunma sayısı 6800 defa)

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

Çevrimdışı Fatih

  • Emekli Yönetici
  • *****
  • İleti: 2.217
  • Rep: +43/-10
  • Cinsiyet: Bay
    • Delphi Dünyası
Otomatik Artan Alan Oluşturma
« : 07 Ekim 2005 22:14:59 »
İnterbase / Firebird de otomatik olarak çalışan bi AUTOINC field yoktur.Fakat bunu kendimiz bir kaç düzenleme ile yapabiliriz. Bunun için öncelikle interbase de bir kaç işlem yapmamız gerekiyor. ilk önce bir GENERATE oluşturmakla işe başlayacağız. GENERATE nedir onu öğrenelim önce GENERATE adınında yaptığı çağrışımdan da anlaşılacağı üzere bir jenerator yani üreteç.
yani sayı üretiyor ve bir önce üretilmiş sayıyı saklıyor.

Database Bölümünden Generators e sağ tıklayıp New Generator dediğinizde karşınıza aşağıdaki pencere gelecektir



+ ( Artı ) İşaretiyle Yeni Bir Generator Ekleyebilir - ( Eksi ) İşaretiyle Varolan Generatoru Silebilirsiniz.

Name Kısmına Generatorun ismi
Value Kısmına Artırımın kaçtan başlayacağını belirtin. 1000 yazarsanız 1001 den 0 yazarsanız 1 den başlar arttırım.
Değerleri Girdikten sonra ilk buttona ( şimşek iconu ) tıklayıp daha önce gördüğümüz pencere karşımıza çıkacaktır. Hata yoksa Commit'e tıklayıp Generatoru oluşturun.



Bundan sonra 3 yolumuz var. Ya bir triger oluşturup her şeyi interbase e bırakmak yada bir Stored Procedure yazıp olayı kendimiz kontrol etmek.


Trigger İle Oluştumak
Çıkan Pencerede trigger bölümüne geçip Create Trigger CheckBoxunu işaretleyin



Tek yapmanız gereken GEN_ID(BENIMGENERAOR,1); Bölümünde BENIMGENERAOR yerine kendi Generator isminizi , 1 yerinede Otomatik Artan (Autoınc) Alanın kaçar kaçar artacağını belirtmeniz. gerekiyor.2 yazarsanız ikişer ikişer artar. varsayılan 1 dir. ok'ledikten sonra tablonuzdaki şimşek iconuna tıklayıp çıkan pencerede Hata yoksa Commit'e tıklayıp değişikliği kaydedin
 

Procedure İle Oluştumak
Çıkan Pencerede Procedure bölümüne geçip Create Procedure CheckBoxunu işaretleyin





Yukardaki koda dikkat edecek olursak procedure a "SP_GEN_MUSTERI_ID" ismini verdik.Daha sonra "ID" adında integer tipli bir variable (değişken) tanımladık.Sonrada ınterbase / Firebird in GEN_ID fonksiyonunu kullanarak BENIMGENERAOR generatorunden aldığımız sayıyı bir artırarak "ID" değişkenine yüklemesini söyledik. ınterbase / Firebird in GEN_ID fonksiyonu Oluşturduğumuz GENERATOR den aldığımız sayıyı en sonunda verilen sayı kadar artırır tabi bu arada generatorde tutulan sayıyı da güncelleyecektir.
Şayet artırma sayıyısını farklı verirsek GEN_ID fonksiyonu verilen sayı kadar generatordeki sayıyı artıracaktır. Yani ID= GEN_ID(BENIMGENERAOR,1); bu satırın en sonunda ki 1 sayısının yerine 2 verirsek sayılarımız 2 şer 2 şer artacaktır. Şimdi ınterbase / Firebird de işimiz bitti.ınterbase / Firebird üzerinde yapılacak işlemler bu kadar.
Şimdi gelelim ikinci aşamaya:
Bu aşamada oluşturduğumuz stored procedure nin delphi tarafından nasıl tetikleneceğini göreceğiz. Öncelikle Bir DataModule ile ve IBX componentleri ile çalıştığınızı,bir Database nesneniz olduğunu ve bağlantıların yapıldığını varsayıyorum.
DataModulümüz üzerine bir IBStoredPoc nesnesi koyalım. Database özelliğini IBDatabase e gösterecek şekilde ayarlayın. Database nesnenizin connect özelliğini True yapın. Bu işlemden sonra IBStoredProc Nesnesinin Stored Proc Name kısmına tıklarsanız ınterbase / Firebird Oluşturduğumuz "SP_GEN_MUSTERI_ID" Proceduresinin orada göründüğünü göreceksiniz. Bu procedure yi seçin Ve projenizi kaydedin.
Şimdi gelelim Bu IBStoredProc nesnesini tetiklemeye :

musteri isminde bir table ımızın olduğunu ve Bu table da SIRA_NO isminde Primary key ve not null olarak tanımlanmış bir fieldımız olduğunu varsayıyorum.

Tablenızın BeforePost olayına tıklayın ve aşağıdaki kodları kendinize uygun olarak güncelleyerek yazın:
Tabi bu kod illaki table ın BeforePost olayında olmak zorunda. AfterPost gibi bir olaya yazarsanız Table kayıt işleminde hata verecektir.

Kod: Delphi
  1.  IF (MUSTERI.State=dsInsert) AND ( MUSTERISIRA_NO.IsNull) then
  2. begin
  3. MUSTERISIRA_NO.AsInteger:=0;
  4. IbStoredProc1.Prepare;
  5. IbStoredProc1.ExecProc;
  6. MUSTERISIRA_NO.AsInteger:=IbStoredProc1.ParamByName('ID').As Integer;
  7. end;


Şimdi yukardaki kodu inceleyelim.
Öncelikle Tableımızın durumunu kontrol ediyoruz. Yani table sadece insert modunda ise bu kod çalışmalı yoksa bir sürü hata alacağız..


Kod: Delphi
  1.  IF (MUSTERI.State=dsInsert) AND ( MUSTERISIRA_NO.IsNull) then // şayet table insert modunda ve Autoinc Alan Boş ise
  2. begin
  3. MUSTERISIRA_NO.AsInteger:=0; //Table ın Kayıt Değişkenini boşalt
  4. IbStoredProc1.Prepare;// StoredProc nesnesini hazırla
  5. IbStoredProc1.ExecProc;// storedProc Nesnesini tetikle
  6. MUSTERISIRA_NO.AsInteger:=IbStoredProc1.ParamByName('ID').As Integer; //ınterbase / Firebirdün tored Procedure'ünde
  7. //oluşan ve "ID" değişkenine aktarılan sayıyı MUSTERISIRA_NO.AsInteger: değişkenine aktar.
  8. end;


Bu işlem Table ınıza her post işlemi gönderildiği anda henüz post işlemi yapılmadan önce tetiklenecek ve artık interbase de sizinde bir AUTOINC fieldınız olacaktır.
 

Delphi İle Oluştumak
Çıkan Pencerede Generator bölümüne geçiyoruz



Bir DataModule ile ve IBX componentleri ile çalıştığınızı,bir Database nesneniz olduğunu ve bağlantıların yapıldığını varsayıyorum. Diyelim IBDataset kullanıyorsunuz. IBDataset seçip Object inspectordan GeneratorField'e tıklayın ( IBTable de yoktur ). Karşınıza aşağıdaki pencere gelecektir.



Penceredeki

Generator bölümünden Generatorunuzu Field bölümünfden otomatik artacak alanı Increment By kısmına kaçar kaçar artacağıını yazdıktan sonra On Post kutucuğunu Seçip OK leyin.
 

Not : Trigger Kullandıysanız Otomatik artan alan Not Null olarak ayarlanmışsa ( Not Null olduğuna eminim çünkü otomatik artan alanlar Primary key için kullanılır. ) Delphi'den IBTABLE,IBQUERY,IBDATASET datasetiniz her neyse Çift tıklayıp Fields Editörden Otomatik artan alanınızı seçip Object inspector'dan Required özelliğini false yapın. aksi taktirde tek kayıt işleyemezsiniz tabloya. Ayrıca Master Detail Tablolarda Detail Tabloya Kayıt Girmeden önce Master Tabloyu Kapatıp açın
« Son Düzenleme: 09 Haziran 2007 22:37:57 by kocaturk »
Malulen emekli programcı / yazar. Bildiklerini unutmakta olduğundan size cevap veremez.

Çevrimdışı Amuzende

  • Üye
  • ***
  • İleti: 39
  • Rep: +1/-0
Ynt: Otomatik Artan Alan Oluşturma
« Yanıtla #1 : 21 Haziran 2008 21:02:31 »
Hocam ben Compile yaptığımda şu hatayı veriyor.

---------- STATEMENT ----------

CREATE SEQUENCE OTO


---------- ERROR MESSAGE ----------

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 1, char 7.
SEQUENCE.


oto isminde bir generator yapmak istedim ama bir türlü olmuyor. Yardımlarınızı bekliyorum

Çevrimdışı redbix

  • Kıdemli Üye
  • *****
  • İleti: 209
  • Rep: +0/-0
  • Cinsiyet: Bay
Ynt: Otomatik Artan Alan Oluşturma
« Yanıtla #2 : 21 Ağustos 2008 01:36:24 »
Hocam ben Compile yaptığımda şu hatayı veriyor.

---------- STATEMENT ----------

CREATE SEQUENCE OTO


---------- ERROR MESSAGE ----------

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 1, char 7.
SEQUENCE.


oto isminde bir generator yapmak istedim ama bir türlü olmuyor. Yardımlarınızı bekliyorum


hocam peki bu otomatik artan alanı EMS SQL de nasılyaparız yine firebird kullanarak. Ben EMS SQL Manager 2008 for İnterbase & Firebird 5.0.1.1 kullanıyorum bununla ilgilide bir örnek verebilirmisiniz çünkü bunda çok denedim ama maalesef yapamadım :(

Çevrimdışı Cturk

  • Kıdemli Üye
  • *****
  • İleti: 256
  • Rep: +5/-1
  • Cinsiyet: Bay
Ynt: Otomatik Artan Alan Oluşturma
« Yanıtla #3 : 21 Ağustos 2008 20:20:52 »
Selamlar..Hocamın izni olursa EMS'de yapılan Otomatik artan alanı ben cevaplıyayım!?...............

Firebird'de VT'nizde INTEGER Bir IDNO Field oluşturunuz? ve EMS DataBases Menüsünde VT'nizi açınız burada Generators'ün üstüne geliniz?,Sırayla; New Object \ generators Penceresi açılacak burada ilk açılışta New_Generetor..gibi ilk değer verilecek,bu aynı kalabilir veya değiştirilebilir,bir isim yazınız?..Value bölümüne 1 veya 0 (zaten ilk değer 0'dır) değerini giriniz ve Sarı ikona tıklayıp "Compile" ediniz..sonra kayıt ederek çıkınız. generetors'de Sarı parantes içinde (1) rakamıyla ilk otomatik alan oluşturuldu..

Sıra Delphide bunu aktif hale getirmek; İnterBase Bileşenlerinden IBTable veya IBDataSet'de (Hangisiyle bağlanacaksanız!.) üstüne geliniz ?..Properties\generetor Field'ın karşısındaki 3 noktalı icona tıklayınız?.açılan pencerede IDNo Field'ınızla New_Generetor'u seçili hale getiriniz?..Altta Üç seçenekten "Post.." olanı işaretleyiniz?..(Kayıt ederken Numara devam eder) Talonuzdada Field'ınızı DBText'de atadınızmı otomatik artan alan hazırdır...Kolay gelsin?...

Çevrimdışı redbix

  • Kıdemli Üye
  • *****
  • İleti: 209
  • Rep: +0/-0
  • Cinsiyet: Bay
Ynt: Otomatik Artan Alan Oluşturma
« Yanıtla #4 : 21 Ağustos 2008 21:06:06 »
Selamlar..Hocamın izni olursa EMS'de yapılan Otomatik artan alanı ben cevaplıyayım!?...............

Firebird'de VT'nizde INTEGER Bir IDNO Field oluşturunuz? ve EMS DataBases Menüsünde VT'nizi açınız burada Generators'ün üstüne geliniz?,Sırayla; New Object \ generators Penceresi açılacak burada ilk açılışta New_Generetor..gibi ilk değer verilecek,bu aynı kalabilir veya değiştirilebilir,bir isim yazınız?..Value bölümüne 1 veya 0 (zaten ilk değer 0'dır) değerini giriniz ve Sarı ikona tıklayıp "Compile" ediniz..sonra kayıt ederek çıkınız. generetors'de Sarı parantes içinde (1) rakamıyla ilk otomatik alan oluşturuldu..

Sıra Delphide bunu aktif hale getirmek; İnterBase Bileşenlerinden IBTable veya IBDataSet'de (Hangisiyle bağlanacaksanız!.) üstüne geliniz ?..Properties\generetor Field'ın karşısındaki 3 noktalı icona tıklayınız?.açılan pencerede IDNo Field'ınızla New_Generetor'u seçili hale getiriniz?..Altta Üç seçenekten "Post.." olanı işaretleyiniz?..(Kayıt ederken Numara devam eder) Talonuzdada Field'ınızı DBText'de atadınızmı otomatik artan alan hazırdır...Kolay gelsin?...

tamam üstadım teşekkür ederim deneyip tekrar haber vereyim olmazsa yardımlarınız için sağolun saygılar

Çevrimdışı redbix

  • Kıdemli Üye
  • *****
  • İleti: 209
  • Rep: +0/-0
  • Cinsiyet: Bay
Ynt: Otomatik Artan Alan Oluşturma
« Yanıtla #5 : 22 Ağustos 2008 05:47:03 »
hocam dediğiniz gibi yaptım generator çalışıyo her post olayında 1 er 1 er artıyo
fakat şöyle bir durum var biz bu kayıtların tamamını silsek bile en son atadığı kayıttan devam ediyo 0 dan başlamıyo veya örneğin 5 kaydımız var diyelim 3 üncü kaydı sildiğimizi düşünürsekkayıtlar geriye doğru 1 er düşmüyo 3 üncü kayıtı halen varmış gibi kabul ediyo bunlara nasıl bi çözüm bulabiliris acaba saygılar

Çevrimdışı Cturk

  • Kıdemli Üye
  • *****
  • İleti: 256
  • Rep: +5/-1
  • Cinsiyet: Bay
Ynt: Otomatik Artan Alan Oluşturma
« Yanıtla #6 : 22 Ağustos 2008 19:10:35 »
Bu konu daha önce tartışılmıştı araştırırsanız fikir sahibi olabilirsiniz!?....Normalde silinen kayıtın yeri boş kalır..zaten mantıkda budur..Örnek ;eğer silinen kayıt kaydırılarak yeri bir üst numara ile doldurulur fakat bu kayıtların otomatik olarak numaraları değişeği için her silinen kayıttan sonra veriler kayacaktır...işte o zaman her şey karışır atıyorum 10 numaralı kayıt ,3 tane kayıt silinirse 7 rakamını alır ..Proğramcılar bunu çözmek için değişik uygulamalar yapıyorlar mesela Muhasebe Proğramlarında Otomatik artan alan saklanarak, Rakamların başlarına Harflerle kodlar verilerek bu sorun çözülüyor..silinen kayıt olduğu zaman sadece o müşteri,isim gibi değer siliniyor..problemde olmuyor..artık bu proğramcıya kalmış birşey araştırırsanız çok değişik yöntemlerle karşılaşacaksınız!..kolay gelsin?.

Çevrimdışı akıncı

  • Yeni Üye
  • *
  • İleti: 1
  • Rep: +0/-0
Ynt: Otomatik Artan Alan Oluşturma
« Yanıtla #7 : 20 Şubat 2009 17:24:20 »
Delphi de yapmamız gereken şeyleri adım adım anlatırsanız çok iyi olacak.Şimdiden teşekkürler.

Çevrimdışı h_ozkilinc_

  • Yeni Üye
  • *
  • İleti: 12
  • Rep: +0/-0
  • Cinsiyet: Bay
Ynt: Otomatik Artan Alan Oluşturma
« Yanıtla #8 : 03 Kasım 2009 01:05:50 »
Öncelikle Selamlar;
yapılan paylaşımlar için önce teşekkür etmek istiyorum.
ben veri tabanlarında yeniyim.
formu takip ederek Ibexpert yükledim.
Firebird'i öğrenmem gerekiyor.
aslında güzel gidiyorduk. taaki içinden çıkamadığım şu sorunla karşılaşana dek:

--------------------------------------------------------------------
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 1, char 7.
SEQUENCE.
-----------------------------------------------------------------------
generator oluştururken bu hatayı alıyorum. çok kontrol ettim. muhakkak gözümden kaçan bir şey vardır dedim. hatta Ibexbert'i tekrar tekrar yükledim. Ne yaptıysam da bu sorunu çözemedim. bir türlü derleme yapamadım.

yardımcı olabilirseniz canı gönülden müteşekkir olurum.

Çevrimdışı Fatih

  • Emekli Yönetici
  • *****
  • İleti: 2.217
  • Rep: +43/-10
  • Cinsiyet: Bay
    • Delphi Dünyası
Ynt: Otomatik Artan Alan Oluşturma
« Yanıtla #9 : 12 Aralık 2009 22:11:35 »
SEQUENCE son sürümlerde gelen bir özellik. Firebird sürümünüz bunu desteklemiyor olabilir.

SEQUENCE yerine GENERATOR ifadesini kullanın
Malulen emekli programcı / yazar. Bildiklerini unutmakta olduğundan size cevap veremez.

Çevrimdışı h_ozkilinc_

  • Yeni Üye
  • *
  • İleti: 12
  • Rep: +0/-0
  • Cinsiyet: Bay
Ynt: Otomatik Artan Alan Oluşturma
« Yanıtla #10 : 12 Aralık 2009 23:25:56 »
çok teşekkür ederim. sorunun nedenini hala bilmiyorum ama
bilgisayarıma format attım.
düzeldi.
çok format atan biriyim. 3 defa daha format attım o günden beri ve bidaha bu sorunla karşılaşmadım.

ilginiz için teşekkür ederim.

Çevrimdışı tesisatçı

  • Üye
  • ***
  • İleti: 21
  • Rep: +1/-0
Ynt: Otomatik Artan Alan Oluşturma
« Yanıtla #11 : 13 Aralık 2009 12:09:07 »
fatih hocam ellerinize saglık kitabınızdan cok faydalandım,
bu konuda teşekkürederim
selamlar

Çevrimdışı regenboog

  • Yeni Üye
  • *
  • İleti: 2
  • Rep: +0/-0
Ynt: Otomatik Artan Alan Oluşturma
« Yanıtla #12 : 09 Ağustos 2010 14:38:24 »
makalelerde boolean veri tipine dönüştürme işlemi hakkında bir yazıya rastlayamadım. bu konuda bana yardımcı olabilirmisiniz.

Çevrimdışı maske007

  • Yeni Üye
  • *
  • İleti: 7
  • Rep: +0/-0
Ynt: Otomatik Artan Alan Oluşturma
« Yanıtla #13 : 05 Ocak 2011 13:41:26 »
Selamlar..Hocamın izni olursa EMS'de yapılan Otomatik artan alanı ben cevaplıyayım!?...............

Firebird'de VT'nizde INTEGER Bir IDNO Field oluşturunuz? ve EMS DataBases Menüsünde VT'nizi açınız burada Generators'ün üstüne geliniz?,Sırayla; New Object \ generators Penceresi açılacak burada ilk açılışta New_Generetor..gibi ilk değer verilecek,bu aynı kalabilir veya değiştirilebilir,bir isim yazınız?..Value bölümüne 1 veya 0 (zaten ilk değer 0'dır) değerini giriniz ve Sarı ikona tıklayıp "Compile" ediniz..sonra kayıt ederek çıkınız. generetors'de Sarı parantes içinde (1) rakamıyla ilk otomatik alan oluşturuldu..

Sıra Delphide bunu aktif hale getirmek; İnterBase Bileşenlerinden IBTable veya IBDataSet'de (Hangisiyle bağlanacaksanız!.) üstüne geliniz ?..Properties\generetor Field'ın karşısındaki 3 noktalı icona tıklayınız?.açılan pencerede IDNo Field'ınızla New_Generetor'u seçili hale getiriniz?..Altta Üç seçenekten "Post.." olanı işaretleyiniz?..(Kayıt ederken Numara devam eder) Talonuzdada Field'ınızı DBText'de atadınızmı otomatik artan alan hazırdır...Kolay gelsin?...

Hocam bilgileriniz için teşekkürler fakat benim de bir sorum olacak.

ID tanımlamayı ve integer değerine kadar herşeyi tamamladım. EMS SQL Manager ile de tanımlamaları istediğiniz gibi ayarladım. Delphi 'ye bağlantıda Zeos 'un ZQuery i kullanıyorum fakat bu bileşende dediğiniz ayarları bulamadım. Yardımcı olursanız sevinirim.

Çevrimdışı maske007

  • Yeni Üye
  • *
  • İleti: 7
  • Rep: +0/-0
Ynt: Otomatik Artan Alan Oluşturma
« Yanıtla #14 : 05 Ocak 2011 14:33:55 »
Hocam bilgi vermek amacıyla Tablo yapısından KAYIT ismini verdiğim tablonun size rapor çıktısını gönderiyorum.



Açılmaz ise resim linki : http://img192.imageshack.us/i/tables1.jpg/
« Son Düzenleme: 05 Ocak 2011 14:34:46 by maske007 »