Yeni oluşacak kaydın oluşmadan verilecek id isini bulabilirm

MS SQL Server veritabanı ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Yeni oluşacak kaydın oluşmadan verilecek id isini bulabilirm

Mesaj gönderen husonet »

S.a.

Yeni oluşacak kaydın oluşmadan verilecek id isini bulabilirmiyiz.

Bunu nicin soruyorum bir master ve buna bağlı detayları var ve kullanıcı kayıt eklerken master oluştururken detaylarıda tek tuşla insert etmek istiyor bunun en basit yolu sanırım alana atanacak indexlenen id iyi önceden bulmak olur die düşündüm fikirleriniz nelerdir?


Not:Firebird yada oracle olsaydı Generatorden son noyu alıp generatoru bir artırıp noyu manuel koyaardım ama mssql biraz garip yoksa varda benmi bilmiyorum :(

Teşekkürler...

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

Hüseyin logoda yaptıkları gibi id numaralarını autoinc yapmak yerine bir tabloda tutarak sen artırabilirsin. Bu şekilde tablodan bilgiyi okur bir artırır ve yeni değeri yazarsın. Böylece hangi numarayı kullanacağını da tabloya kaydetmeden önce bilmiş olursun.
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

Çalışan bir sistemde bu yapılandırmayı yapmam projeyi yeniden yazmak gibi :) evet oda benim aklıma geldi açıkcası ama bu autoincrement in attığı numraya ulaşmak mümkün olsaydı işim basit olurdu :S

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

Merhaba,
Ben ilgili tabloya fazladan birde GUID adında alan tanımlıyorum kayıdı Commit ederken oluşturduğum GUID i bu alana yazıyorum sonra bu GUID le o kayıdı çağırıp ID yi alıyorum, farklı yöntemlerde kullanmıştım örneğin giridğim kayıdın ayırı yani %100 tekil bir sahasını kullanmak gibi ama nadirenden olsa sorunlar yaşadım bence en iyisi GUID gibi uzunca random bir veriyi kullanmak.
İyi çalışamalar.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

AutoInc

Mesaj gönderen sabanakman »

Bu kod tabloya yazılan son değeri vereceği için, bir sonraki kayıt için bu değer (1) arttırılmalıdır.

Kod: Tümünü seç

SELECT IDENT_CURRENT('TabloAdı')
Bu kod veri tabanına yazılan son değeri verir. Bunun bir fazlası tabloya yazılacak değerdir fakat çok önemli bir uyarı. Buradan okunan değer eğer tabloya hiç kayıt yazılmadıysa ( veya truncate table ile boşaltılmışsa) okunan değer 1 olacak ve yazılan değer de 1 olacaktır. İlk kayıt yapıldıktan sonra bu değer tekrar okunursa yine 1 değerini verecektir ama bir sonraki kayda 2 yazacaktır. Eğer tablo delete from veya dataset üzerinden delete metodu çalıştırılarak boşaltılmışsa bunun önemi yok okunan değerin 1 fazlası sonraki eklenen kayda yazacaktır. Sadece tablo ilk oluştuğunda boş olunca bu sorun oluşuyor. Benzeri bir sorunu bende yaşamıştım ve tabloya 1 kayıt ekleyip sildikten sonra değeri istediğim gibi kontrol altında tutabildim.

İleride toparlayabilirsem AutoInc alanlar için değişik (değer okuma, bizim verdiğimiz değeri yazma, alan çevirme vs.) ihtiyaçları karşılayacak bir makale yazmaya hazırlanıyorum.
En son sabanakman tarafından 22 May 2007 10:46 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

s.a.
Verdiğiniz bilgi için teşekkür ederim peki aklıma takılan konu şu 3000 kişi userlı bir ortamda alacağım id iyi bloke etme olasılığım varmı? çünkü aynı anda birden fazla user ın post etme olasılığı oluşabilir yani kalıcı autoincrementi artırmak gibi kayıt olmadan :idea:

Teşekkür Ederim...

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
Kullanıcı avatarı
m_ekici
Kıdemli Üye
Mesajlar: 563
Kayıt: 11 Haz 2003 06:49
Konum: Adana
İletişim:

Logo dan örnek

Mesaj gönderen m_ekici »

s.a.
Bu işi Logo iyi yapmış. Her tablonun bir StoredProcedure u var. Kayıt oluşturmadan önce o SP den sıradaki numarayı alıyor, numarayı aldıktan sonra o numarayı kullanarak işlem yapıyor.
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

Logo belki araştırmadı belki de basitine geldi Oracle de yada Firebird de olsa bu kadar canbazlığada gerek yok ama işte mssql gerçi belki yolu vardır ama id tabloları oluşturmak bence çok ta mantıklı değil basitlik dışında bu olanağı bana Mssql sunmalı yoksa kötü reklam yapacam :P

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

SQL

Mesaj gönderen sabanakman »

Kod: Tümünü seç

DBCC CHECKIDENT('Tablo adı', RESEED, @Deger)
bu kod ise o alana yazılacak değeri ayarlamaya yarar. Bu kodları nasıl organize edersin bilmem ama işin zor kolay gelsin.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Hüseyin kardeş bu işlemi bir tablo üzerinden yapacaksan sıradaki ID yi alıp gireceğin bilgiler için kullanabilirsin. Bu arada aldığın ID yı alır almaz bir arttırıp yerine yazmalısın ki senden sonra alacak kullanıcı ile çakışma olmasın. Her alacak olan alıp bir artıracak ve tabloya yazacak. Herhangi biri kayıtı tamamlamasa (vazgeçerse) alınan ID tablodakiID - 1 e eşit ise tablodakini bir azaltabilirsin. Bu şekilde çok fazla boşluk olmasını da önleyebilirsin :idea:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

MS-SQL Server'ın sistem tablolarından/viewlarından veya master VT'sinden birçok bilgiye ulaşabiliyorsunuz. Eğer kastınız bir tablonun IDENTITY alanının en son aldığı değeri bulmak ise (ister o kayıt mevcut olsun ister silinmiş olsun) yapmanız gereken sys.identity_columns ve sys.all_objects adlı tablolardan (alternatifleri de var) yararlanmak:

Kod: Tümünü seç

SELECT
  T1.last_value
FROM sys.identity_columns T1
  INNER JOIN sys.all_objects T2 ON T2.object_id = T1.object_id
WHERE T2.name = 'TABLOADI'
İyi çalışmalar.
turkcanfidan
Üye
Mesajlar: 380
Kayıt: 31 Eki 2005 03:26

Mesaj gönderen turkcanfidan »

Benim kullandığım şekilde 90 kullanıcılı bir sistemde hiç çakışma olmadan işler yürüyor. Detay tablonun BeforePost olayına Master.CheckBrowseMode deyince henüz kaydedilmeyen master tablosunun kaydından sonra detayı kaydettiriyorum, ki detayın masterID si null olmasın.
Cevapla