Query ile insert edilen kaydın ID değerini bulma paradoksu

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
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Query ile insert edilen kaydın ID değerini bulma paradoksu

Mesaj gönderen aLonE CoDeR »

Selamlar.

Query nesnesi ile bir kaydı insert ediyoruz ve bize hemen Committen sonra bu kaydın ID değeri gerekli. Max çekip alabilirim ama network ortamında iki kullanıcı aynı anda insert işlemi yaparsa karışabiliyor. Unique alan ve değeri sorgulayarak bu ID değerine ulaşabiliyorum ancak bazı durumlarda Unique alan bir Generatorden alınabiliyor. Bu durumda olay biraz daha karmaşık hale geliyor, Unique alan Generatorden alındığında eğer insert işlemi bir hatadan dolayı yapılamamışsa "GEN_ID" içindeki parametreye göre (1 verildiğinde) değeri artıyor arada boşluk meydana geliyor bu bazı durumlarda istenmeyen bir sonuç. Örneğin Netsis herhangi bir evrak numarası verirken bildiğim kadarıyla repeat until gibi bir döngü içinde Unique alanın değeri olumlu sonuç döndürene kadar deniyor (yanılıyor olabilirim). Bu bir çözüm evet ama ne kadar stabil tartışılır. Bu çözümü kullansak bile türetilmiş bir form kullanıldığı ve kayıt organizasyonunun ata formda yapıldığı için yöntem çeşitliliği yani bazılarında repeat until bazılarında standart işlem yapmak kontrolü daha da güçleştirecek ilerde. Uzattım biliyorum :) Aslında bu işlemin çok basit bir çözümü de vardır belki zira dataset nesnesi (bildiğim kadarıyla) Generator değerini kontrol ederek yapabiliyor ancak ben çözemedim. Şimdiden teşekkürler.
bgoktas
Kıdemli Üye
Mesajlar: 769
Kayıt: 27 Nis 2004 10:32
Konum: istanbul

Re: Query ile insert edilen kaydın ID değerini bulma paradoksu

Mesaj gönderen bgoktas »

sql server 'da şöyle bulunabiliyor

Kod: Tümünü seç

select IDENT_CURRENT('tabloadı')
serkan
Üye
Mesajlar: 666
Kayıt: 10 Tem 2003 12:08
Konum: bursa

Re: Query ile insert edilen kaydın ID değerini bulma paradoksu

Mesaj gönderen serkan »

ıd dediğin alanı senmi veriyorsun yoksa generator filanmı.yani cari kart kaydettin diyelim hemen sana 12 ID nolu cari kaydedildi gibi bişey lazım galiba.insert işlemini nasıl yapıyorsun.yani append-post ile mi yoksa sql cümlesiylemi,bunlarıda bilelimde demi :)
Kullanıcı avatarı
selimr
Üye
Mesajlar: 556
Kayıt: 16 Eki 2003 02:07

Re: Query ile insert edilen kaydın ID değerini bulma paradoksu

Mesaj gönderen selimr »

şöyle bir yapı var ama denemedim bir dene istersen;

tablodaki alanlar IDNO, ALAN1, ALAN2 OLSUN

Kod: Tümünü seç

INSERT INTO T2 (ALAN1, ALAN2)
    VALUES (:F1,:F2 )
      RETURNING IDNO INTO :V;
burdaki V insert den sonraki idno alanının aldığı değeri döndürecektir.. ( sanıyorum )
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Re: Query ile insert edilen kaydın ID değerini bulma paradoksu

Mesaj gönderen aLonE CoDeR »

Öncelikle ilginiz için teşekkürler.

@bgoktas
Veritabanımız FireBird, SQL Server de olsa bu komut çözüm olmayacak bence zira network ortamında aynı anda iki kullanıcı kayıt yaparsa ikisine de en son kaydın ID değerini döndürecek.

@serkan
Query nesnesi ile Insert into SQL cümlesiyle kayıt yapıyoruz. Evet örneğin müşteri kaydettik ve o kaydın ID değeri 12 olarak atandı, tabloya insert yapıldıktan hemen sonra bana bu kaydın 12 yani Primary Key değeri gerekli. Bu alanın değeri standart işlem olan Trigger ile Generatorden alınıyor. Örneğin bu işlemi DataSet ile yaparsak Post ettikten sonra bile (Generator seçimindeki parametreye bağlı olarak) FieldByName(ID) şeklinde bir komutla ID değerini alabiliyoruz ve hangi durumda olursa olsun bu değeri net olarak bize veriyor, karışıklık olmuyor. Benim aradığım da bu özellik :)

@selimr
Bu komut hangi sürüm için geçerli onu bilmek gerek, ben şu an 1.5.3 kullanıyorum (2.1'e geçmeyi planlıyorum ancak henüz değil..). Araştıracağım bu komutu şimdi.
Kullanıcı avatarı
selimr
Üye
Mesajlar: 556
Kayıt: 16 Eki 2003 02:07

Re: Query ile insert edilen kaydın ID değerini bulma paradoksu

Mesaj gönderen selimr »

şu anda 2.1 i inceliyorum ve orda gördüm daha öncesinde varmı bilmiyorum..
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Re: Query ile insert edilen kaydın ID değerini bulma paradoksu

Mesaj gönderen aLonE CoDeR »

Evet 2.1 sürümünde mevcut, dolayısıyla işimi görmedi bu.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: Query ile insert edilen kaydın ID değerini bulma paradoksu

Mesaj gönderen aslangeri »

s.a.
eğer id değeri hemen lazımsa bu durumda iki ihtimal var.
birincisi insert işlemini sp ile yapacaksınız. generatoru manuel çekip insert sql de manuel yazacaksınız.
ikincisi başka bir query ile generatorden değeri alıp insert sql de manuel göndereceksin. (ki ibdataset in yaptığıda bu)
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Re: Query ile insert edilen kaydın ID değerini bulma paradoksu

Mesaj gönderen aLonE CoDeR »

a.s.
aslangeri yazdı:s.a.
ikincisi başka bir query ile generatorden değeri alıp insert sql de manuel göndereceksin. (ki ibdataset in yaptığıda bu)
Bu durumda Trigger ile ID atama işlemi olmayacak anladığım kadarıyla ve mantıklı bir çözüm. Merak ettiğim için soruyorum, IBDataset Trigger olmasına rağmen bu işlemi yapıyor, GEN_ID parametresini 0 vererek mi alıyor değeri yani yukardaki Returning fonksiyonu için mi kullanıyor. Kodlarını incelemekte fayda var :o İlgin için teşekkürler.
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Re: Query ile insert edilen kaydın ID değerini bulma paradoksu

Mesaj gönderen aLonE CoDeR »

Kodlara baktım, dediğin gibi yapıyor yalnız Trigger konusu muamma.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: Query ile insert edilen kaydın ID değerini bulma paradoksu

Mesaj gönderen aslangeri »

s.a.
trigera bakarsan eğer orda id=null şartı var.
ib dataset veya bizim yaptığımız işlemde id null olmadığı için triger çalışmayacak.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Re: Query ile insert edilen kaydın ID değerini bulma paradoksu

Mesaj gönderen aLonE CoDeR »

a.s. Evet onu düşünmedim hiç, tekrar teşekkürler.
Cevapla