Merhaba,
Bu soruyu buraya mı yoksa programlamaya mı yazacağıma bir türlü karar vermedim.
FireBird'de bir stored procedure ile bir kayıt ekliyorum ancak bu kaydın id'sini nasıl geri elde edebilirim? Query ile mi? Yoksa bir output parameter ekleyerek mi? Cevap output parameter ise bu paramtreye sp içinde nasıl değer atayabilirim ve bunu delphi de nasıl kullanabilirim?
dbexpress tabındaki TSQLConnection ve TSqlStoredProc'u kullanıyorum? (bunlar da doğru component mi emin değilim )
merhaba ,
bildiğimiz gibi Firebird de autoincrement alan olayı yok, bu gibi ihtiyaçlarda GENERATOR adı verilen numara üreteçlerini kullanıyoruz, dolayısıyla sen INSERT procedure ' nde id alanına önce bu generator un ürettiği numarayı atayacaksın hazır numarayı elde etmişken bir çıkış parametresinede bunu gönderirsin,
dephiden erişim için bence TIBStoreProc nesnesini kullan , gönderdiğin çıkış paametresinide örneğin
insert into tbl_ariza (user_id, baslik, tarih) values (:v_user_id, :v_baslik, :v_tarih);
Bu dizilimde user_id trigger ile generator'u arttırarak yazılıyorsa şöyle yapabilirsin.
Öncelikle trigger ile generator'u almayacaksın. Bu işi SP'de yapacaksın
yani:
USER_ID = GEN_ID(GEN_USER_ID, 1);
ile generator'den user_id'yi alacaksın. Daha sonra Insert ile ekleyeceksin. Böylece elinde, aldığın ID kalacak. Dönüş değerinde suspend; yaparak bu id değerine ulaşacaksın.
CREATE PROCEDURE SP_INS_ARIZA (V_USER_ID Integer,
V_BASLIK Varchar(30),
V_TARIH Date)
returns (V_ID Integer)
AS
begin
insert into tbl_ariza (id, user_id, baslik, tarih) values (GEN_ID(gen_ariza,1), :v_user_id, :v_baslik, :v_tarih);
select id from tbl_ariza where user_id=:v_user_id and baslik=:v_baslik and tarih=:v_tarih into :v_id;
end
Bişnev in ney çün hikâyet mîküned
Ez cüdâyîhâ şikâyet mîküned
Bak ilk önce V_ID dönüş değerine GEN_ID'den aldığın değeri koy. Daha sonra insert'ini V_ID'yi kullanarak yap. INSERT'ten sonra suspend yaptığında V_ID'ye atanan GEN_ID değerini alabileceksin zaten.
Buradaki amaç generator'un ne olduğunu sorgulamak değil, insert ettiğimiz kaydın id'sini öğrenebilmek. Çok kullanıcılı bir ortamda "generator'un son değeri benim son insert ettiğim kaydın id'sidir" diyemezsiniz.
TIBQuery'nin GeneratorField Özelliği olması lazım. Bu özellik ile siz Generator'den istediğiniz değeri online (On New Record, On Post, On Server) gibi seçeneklerden birini kullanarak istediğiniz anda ID değer,ini çekebilirsiniz.
SP'den de kurtarır sizi bu diye tahmin ediyorum. Generator Field özelliğini inceleyin muhtemelen işinizi görecektir.