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.