Son kayit numarasinin elde edilmesinin daha hizli yolu ?

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Burhan_ast
Üye
Mesajlar: 143
Kayıt: 15 Haz 2003 08:33
Konum: Almaty, Kazakhstan

Son kayit numarasinin elde edilmesinin daha hizli yolu ?

Mesaj gönderen Burhan_ast »

Merhabalar,

Ms-Sql server 2000 de veritabanimdaki tum tablolarda kayit no isimli alanim var bu kayit no alanimi surekli kendim kontrol ediyorum, bunun icin asagidaki fonksiyonu yazdim bu islemi Stored procedure ile yapabilimiyim, veya baska sekilde nasil yapabilirim, Ms-Sql server kendiside surekli olarak otomatik artirabiliyor istenilen alani ama ben bu alanin kendi kontrolumde artmasini istiyorum, yardimlarinizdan oturu tesekkur ederim,

function TFrm_Ana_form.Kayit_no_ataAdo(TableN: TAdoQuery; Tablo_adi, Alan, Alan_formati : String): String;
Begin
// Alan_formati parametresi ileriye yonelik olarak birakilmis bir parametredir
Tbl_KayitNoAdo.Connection := TableN.Connection;
Tbl_KayitNoAdo.SQL.Clear;
Tbl_KayitNoAdo.SQL.Add('Set DateFormat '+Frm_ana_form.Sql_Tarih_formati);
Tbl_KayitNoAdo.SQL.Add('Select Max('+Alan+') as '+Alan);
Tbl_KayitNoAdo.SQL.Add('From '+Tablo_adi);
Tbl_KayitNoAdo.ExecSql;
Tbl_KayitNoAdo.Open;
IF Tbl_KayitNoAdo.Fieldbyname(Alan).asinteger<>0 then Result:=floattostr(Tbl_KayitNoAdo.Fieldbyname(Alan).asInteger+1) else
Result:=floattostr(1);
Tbl_KayitNoAdo.Close;
end;
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Sybase'de bir alana default deger olarak sabit bir deger verebileceginiz gibi, otomatik artan bir deger de verebilirsiniz. ki b zaten her yerde boyle. Fakat bir ilave olarak da su var. Default deger olarak hesaplanmıs bir deger verebiliyorsunuz. (Computed value diye geciyor...) Bu alana istediginiz bir hesabı yapabildiginiz gibi bir fonksiyonu da yani SP de cagirabiliyorsunuz. Yani primary key'inizi arttiran ve yeni bir deger donen bir fonksiyon yazip bunu da compujted vaule olarak default degere tanımlanamız isinizi gorur. Bu veritabanının kendisinin otomatik deger vermesi ile hemen hemen aynı hızda gerceklesecek bir yontem olur ki daha hızlısı da olmaz herhalde....

TAbi bu durum dedigim gibi Sybase icin boyle olmakla birlikte siz MSSQL de benzeri bir yontemi bulabilirsiniz sanıyorum.
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

Kodu incelediğimde şunu farkettim, (çok kullanıcılı işlemler sırasında Max numarada sorun çıkar.)

Zira son numarayı alırken aynı anlarda herhangi bir kullanıcı da tutup aynı işlemi yapar ise her iki kullanıcıya da aynı numara gelebilir.

Bu tarz olaylarda Fahrettin beyin söylediği gibi bir yöntem izlemek daha doğru olur. Yani Identity veya Autoincremental field kullanımı olması daha sağlıklı olur.

Kolay gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Burhan_ast
Üye
Mesajlar: 143
Kayıt: 15 Haz 2003 08:33
Konum: Almaty, Kazakhstan

Tsk,

Mesaj gönderen Burhan_ast »

Sonuc su,

Galiba kendinden artan sekilde kullanmam gerekecek ama 50000 kadar donen bir for ile 5 makinada bu kodu deneyecegim eger problem yasamaz isem o zaman benim kodu aksi taktirde otomatik artan kullanacagim,


Yorumlarinizdan dolayi tsk

Burhan Cakmak
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Bir hatırlatma da benden :wink: Eğer master/Detail yapı kullanmıyorsanız, yada kayit no ya kayıt girişi esnasında ihtiyaç yoksa, post etmeden önce son kayıt numarasını alıp bir artırıp kayıt numarası olarak atayın. Böylece birden fazla kullanıcı durumunda da çakışma olmaz. Bu arada kayıtın post işleminden sonra cache lerde veya transection da kalmaması lazım ki diğer bir kullanıcı aynı numarayı almasın!
Cevapla