Id numarası - Çözüldü

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
Serhat
Üye
Mesajlar: 203
Kayıt: 27 Tem 2014 11:10

Id numarası - Çözüldü

Mesaj gönderen Serhat »

Selam;

Databaseye kayıt işlemleri yaptırıyorum, yeni bir kayıt işlemi yaptırmadan önce en son kaydedilen kayıtın id numarasını nasıl alabilirim?

Kod: Tümünü seç

 With TFDQuery.Create(Nil) do 
    begin
      Connection := GenelConnection;
      Close;
      SQL.Clear;
      SQL.Add('Select Count(*) As ID From GENISLIK');
      Prepared := True;
      Open;
 
      begin
En son Serhat tarafından 25 Tem 2016 09:32 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2380
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: Id numarası

Mesaj gönderen freeman35 »

neye göre son? bu sorunun cevabı senin istediğin
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
cecihan
Üye
Mesajlar: 94
Kayıt: 30 Ara 2006 11:40
İletişim:

Re: Id numarası

Mesaj gönderen cecihan »

merhaba. soru çok açık olmadığı için tahminimce firebird kullanıyorsunuz. Herhalde sayaç kullanmak için generator'de kullanıyorsunuzdur.
işinizi 2 sql kullanarak çözebilirsiniz.
ilk sql ile
'SELECT GEN_ID( <GeneratorName>, <increment> ) FROM RDB$DATABASE;' ile sayaç numarasını alıp
2. sql de insert'in içinde kullanabilirsiniz.
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: Id numarası

Mesaj gönderen ertank »

Merhaba,

En son ID numarasına ne için ihtiyaç duyuyorsunuz?

Bende database altyapısının Firebird olduğunu varsayıyorum.

GENISLIK tablosunda Generator veya Firebird 3.0 ile gelen IDENTITY alanı tanımlanmamış durumda ise sizin yazdığınız kod ile ilgili şöyle bir sorun yaşama ihtimaliniz var. Misal 3 adet kayıt olan tablodan bir kayıt silindiği zaman sizin SQL sorgusu 2 cevabını verir ve siz daha önce 2'yi kullanmış olursunuz. Dolayısı ile yazılmaması gereken verinin üzerine/yanına yeni veri yazabilirsiniz.

İstediğinizi yapmak için aşağıdaki gibi bir kod yazabilirsiniz diye düşünüyorum. Ancak şu koşulların sağlanmış olduğu varsayımı ile:
1- GenelConnection'a bağlı aynı Transaction içinde veya farklı Transaction altında çalıştırılıyor ise kendi çalışacağı Transaction Commit edildikten hemen sonra çalıştırılması gerekli bu kodun. Aksi halde hatalı değer çevirme olasılığı var (Çok kullanıcılı bir uygulama ise biz B kullanıcısı olalım, A kullanıcısı kayıt girdi ise biz bu kaydı kendi Transaction'ımızı Commit edilmeden göremeyiz)
2- GENISLIK tablosunun aşağıdaki gibi bir yapıya sahip olduğunu varsayıyorum.
Firebird 3.0 öncesi

Kod: Tümünü seç

  CREATE TABLE GENISLIK (
    ID AS BIGINT NOT NULL PRIMARY KEY,
    SAYI AS INTEGER,
    METIN AS VARCHAR(20)
  );

  CREATE GENERATOR GEN_GENISLIK;
  SET GENERATOR GEN_GENISLIK TO 1;

  SET TERM ^ ;
  CREATE TRIGGER NEW_TABLE_BI ACTIVE
  BEFORE insert POSITION 0
  AS
  DECLARE VARIABLE tmp DECIMAL(18,0);
  BEGIN
    IF (NEW.ID IS NULL) THEN
      NEW.ID = GEN_ID(GEN_GENISLIK, 1);
    ELSE
    BEGIN
      tmp = GEN_ID(GEN_GENISLIK, 0);
    if (tmp < new.ID) then
      tmp = GEN_ID(GEN_GENISLIK, new.ID-tmp);
  END
END^
SET TERM ; ^
Firebird 3.0 ve sonrası

Kod: Tümünü seç

  CREATE TABLE GENISLIK (
    ID BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    SAYI AS INTEGER,
    METIN AS VARCHAR(20)
  );
Yukarıda sıralanan koşullar sağlandıktan sonra son kayıtlı ID bilgisini öğrenmek için aşağıdaki gibi bir kod yazabilirsiniz.

Kod: Tümünü seç

With TFDQuery.Create(Nil) do 
begin
  try
    Connection := GenelConnection;
    Close();
    SQL.Clear();
    SQL.Add('Select MAX(ID) As ID From GENISLIK');  // Tablo içinde ID adını 
    Prepare();
    Open();
  finally
    Free();  // Bunu unutmamak gerekli. Yoksa hafıza kaçağı oluşur.
  end;
end;
Ancak, yukarıdaki şekilde bir kod yazmaya çoğu zaman gerek kalmayacaktır. Çünkü örnekte verilen şekilde oluşturulmuş tablolarda ID değeri her zaman için bir artırılarak kaydedilecek. Yinede sizin bu ID bilgisini ne amaçlı kullanacağınızı bilemiyorum. Sizin açınızdan öğrenilmesi gereken bir bilgi olabilir.
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Id numarası

Mesaj gönderen Lord_Ares »

Veritabanınızda autoincrement (otomatik artan ) bir alan yaratın örneğin artankod ve tipi autoincrement ve benzersiz olsun . Böylece en son kaydettiğiniz bilgi herzaman için buradaki rakamdır. Buna bakarak dilediğiniz işlemi yapabilirsiniz.
Kullanıcı avatarı
Serhat
Üye
Mesajlar: 203
Kayıt: 27 Tem 2014 11:10

Re: Id numarası

Mesaj gönderen Serhat »

Selamlar;

Veritabanı olarak sqlite kullanıyorum id alanı (autoincrement) veritabanı na günlük ortalama 1000 ve üzeri kayıt ekleniyor veya siliniyor; kayıtları listviewde listeliyorum.
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Re: Id numarası

Mesaj gönderen mkysoft »

Bazı companentlerde lastrowid özelliği mevcut, varsa onu kullanabilirsiniz. Yoksa last_insert_rowid() fonksiyonu ile alabilirsiniz.
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: Id numarası

Mesaj gönderen ertank »

Serhat yazdı:Selamlar;

Veritabanı olarak sqlite kullanıyorum id alanı (autoincrement) veritabanı na günlük ortalama 1000 ve üzeri kayıt ekleniyor veya siliniyor; kayıtları listviewde listeliyorum.
Kayıtları listview içinde listlemek için neden en son kayıt ID bilgisine ihtiyacınız var?

myksoft arkadaşımızın da dediği gibi SQLite için aşağıdaki gibi bir SQL çalıştırarak bu bilgiye ulaşabilirsiniz. Transaction ile ilgili daha önce yazdıklarım aşağıdaki kod içinde geçerlidir.

Kod: Tümünü seç

With TFDQuery.Create(Nil) do 
begin
  try
    Connection := GenelConnection;
    Close();
    SQL.Clear();
    // Aşağıdaki kod tabloda 1000 kayıt var ise 1000 kayıt çevrir. En büyük değeri almak yeterli olacak ise Max(last_insert_rowid()) kullanılabilir
    SQL.Add('SELECT last_insert_rowid() as ID FROM GENISLIK'); 
    // Alternatif olarak aşağıdaki satır da kullanılabilir.
    // Ancak Tablo oluşturulur iken AUTOINCREMENT ifadesi kullanılmadı ise bu kod çalışmayacaktır
    // SQL.Add('SELECT SEQ as ID from sqlite_sequence WHERE name=''GENISLIK''');
    Prepare();
    Open();
  finally
    Free();  // Bunu unutmamak gerekli. Yoksa hafıza kaçağı oluşur.
  end;
end;
Kullanıcı avatarı
Serhat
Üye
Mesajlar: 203
Kayıt: 27 Tem 2014 11:10

Re: Id numarası

Mesaj gönderen Serhat »

Emeği geçen herkese teşekkürler...
Cevapla