Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Generator kullanımı
#1
Merhaba,
Firebird veritabanında oluşturduğumuz generator veya stored prosedürleri delphi tarafında nasıl çağıracağız. Nasıl kullanıldığı hakkında kafam iyice karıştı.

Baştan temel yapım doğrumu onu öğrenmek istiyorum. Çünkü her baktığım kaynakta yapı farklı.

Oluşturduğum yapı :

1Smile Veritabanına bağlantı şeklim,  Formuma , Fdconnection - Fdtransaction - FdQuery - Fddatasource - FDMoniCustomClientLink ekledim.
Bazı kaynaklarda bu şekildeki bir yapı kullanılırken  bazıları bunlara ilaveten FDstoredprocedure ve FDUpdateSQL bileşeni eklemiş. Hangisi doğru kullanım ?

2) Konu başlığında da yazdığım üzere veritabanına tanımlamış olduğumuz generator, storedprosedür bunları nasıl kullanacağım.  Delphi tarafında butonun click eventından mı tetiklicem ( Nasıl ?)   yoksa bazı kaynaklardaki gibi updatesql bileşeninin özelliklerinden generator oluşturarak mı ? 

3) Transaction kullanmalıyım ? Eğer kullanılırsa kayıt ekleme silme işlemlerinde insertten sonra  commit mi  etmeliyim. ( bazı kaynaklara göre transaction bileşeni bunu otomatik yapıtığı için gerek yokmuş.. )

Eğer imkanınız olursa kayıt ekleme işlemine ait basit bir örnek sunabilirmisiniz.

Teşekkürler
Cevapla
#2
Merhaba
Generatoru, FD bileşenleri ile kullanamazsınız diye biliyorum. Bunun yerine AfterInsert Trigger yazmanız.

CREATE OR ALTER TRIGGER URUNTR FOR URUNLER
ACTIVE BEFORE INSERT POSITION 0
AS
begin
IF(NEW.UID IS NULL) THEN
NEW.UID = GEN_ID(GEN_URUNLER_ID, 1);
end

Burada UID, Autoinc bir alan. Fakat FB de generatoru Trigger ile tetiklemeseniz bunu atmaz.

SP çalıştırmak için: herhangi bir SQL (Query, TSql vs) bileşeinin SQL kod kısmına call execute procedure My_SP1 kodu yazarak çalıştırabilirsin. SP ye parametre vereceksen bir çok yerde örneği var bunun..

Transaction tabiiki kullanmalısın. Nesnenin after post olayına CommitRetaning yapman gerekiyor.
// Bilgi paylaştıkça çoğalır.. 

Cevapla
#3
Bahsettiğiniz trigger FB tarafındamı oluşturulacak , yoksa ilgili bileşenin özelliklerindeki mi ?  Karışıklık şuradan kaynaklanıyor. FB de generator oluşturduk. Delphi  tarafındaki bileşenin özelliklerinde de ayrı generator mu oluşturacağız yoksa FB deki generatorü mü seçicez. Çünkü iki seçenekte mevcut Big Grin Olayı karıştıran hem FB tarafında afterpost, beforeinsert, beforeupdate var hem bileşen tarafında ...
Cevapla
#4
(03-10-2018, Saat: 14:19)Lord_Ares Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Bahsettiğiniz trigger FB tarafındamı oluşturulacak , yoksa ilgili bileşenin özelliklerindeki mi ?  Karışıklık şuradan kaynaklanıyor. FB de generator oluşturduk. Delphi  tarafındaki bileşenin özelliklerinde de ayrı generator mu oluşturacağız yoksa FB deki generatorü mü seçicez. Çünkü iki seçenekte mevcut Big Grin Olayı karıştıran hem FB tarafında afterpost, beforeinsert, beforeupdate var hem bileşen tarafında ...

FB tarafında önce bir Generator olusturuyorsun, 
Misal : Tablo_Id
Tablomuzda : KOD ve ADI alanları olsun,
Tablonun Before Insert triggerine ;
if (new.kod is null) then

   new.kod = gen_id(Tablo_Id,1);
yazmanız yeterlidir. Tabloya kayıt atarkende KOD alanını NULL gonderirseniz Tablo_Id yi birer arttırıp kendisi yazacaktır.

Ayrıca en önemli konu olarakta şundan bahsedeyim;
Firebird RDMBS bir veritabanıdır, SQL ile delphi tarafından insert, update, delete yapmaktansa Stored Procedure ile işlemlerinizi yapın. Basit bir stored procedure şu şekilde yazılabilir;
Banka isimli bir tabloma yazdığım insert ve update yapan Stored Procedure örneğidir.
Alanları ; görüldüğü gibi KOD, ADI, SUBEKODU, HESAPNO, IBAN, BORC, ALACAK dır.
create procedure BANKA_EKLE (
   KOD integer,
   ADI varchar(50),
   SUBEKODU varchar(10),
   HESAPNO varchar(20),
   IBAN varchar(50)) 
returns (
   C_KOD integer) 
as
begin
if (KOD=0) then BEGIN
insert into banka (adi, subekodu, hesapno, iban, borc, alacak)
values (:adi, :subekodu, :hesapno, :iban, 0, 0)
RETURNING KOD INTO C_KOD;
               END ELSE BEGIN
update banka
set adi = :adi,
   subekodu = :subekodu,
   hesapno = :hesapno,
   iban = :iban
where (kod = :kod);
C_KOD=:KOD;
                        END
 suspend;
end
Eğer KOD alanı 0 "sıfır" gönderilirse Insert yapar, Sıfırdan büyük ise Update yapar. Insert yaparken ilk kez kaydedildiği için BORC ve ALACAK alanları 0 "sıfır" olarak kaydedilir. Banka_Islem tablosuna kayıt girildikçe de BORC ve ALACAK alanları arttırılır yada eksiltilir.
BANKA Before Insert triggerinde ise aşağıdaki kod vardır;
  if (new.kod is null) then

   new.kod = gen_id(gen_banka_id,1);

gen_banka_id generatordur.

Ayrıca C_KOD alanıda Insert Yada Update yapılan kaydın KOD alanını geri döndürür.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
WWW
Cevapla
#5
Bilgi için teşekkürler , ama şurada karışıklık var . FB kısmındaki tabloda da after insert var burada ilgili generator ve triggerlar tanımlı

Tablo


1EqVnY.png



Bileşen kısmında da var. 

Q2mv4v.png
İbexpert ile gösterdiğim tabloda bunları yarattım var.  Fakat delphi tarafında bileşen özelliklerindeki insert ve update kısımlarına birşey yazılacak mı veya generator özelliğine veritabanındaki generatorlerden seçim yapılacak mı?
Formumuzdaki standart Kaydet butonundan bunu tetiklemek için herhangi bir kod yazacakmıyız yoksa bildiğimiz sql insert komutu yeterlimi . Yani örnek bir kaydet buttonunda ne olmalı..
Cevapla
#6
eğer firebird 3 kullanıyorsan identity kullan uğraşmazsın generatorlerle inssert sp ile identitiy değerini de alabilirsin.
create or alter procedure URUN_ACIKLAMA_INS (
   ACIKLAMA_TR type of column URUN_ACIKLAMA.ACIKLAMA_TR not null collate UNICODE_CI_AI,
   ACIKLAMA_UK type of column URUN_ACIKLAMA.ACIKLAMA_UK)
returns (
   G_ACIKLAMA_ID integer)
as
begin
 insert into urun_aciklama (
   aciklama_tr,
   aciklama_uk)
 values (
   :aciklama_tr,
   :aciklama_uk) returning URUN_ACIKLAMA_ID into:g_aciklama_id;
end

“Do. Or do not. There is no try.”
Cevapla
#7
Ben Query leri sadece veri çekmek için kullanıyorum, stored procedure ler ile çalıştığım için UpdateSQL, DeleteSQL ile felan işim olmadı şimdiye kadar. İşin kolayı varken neden kendinizi yoracaksınız ki, gerek yok bence.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
WWW
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Generator sıfırlama 41linea41 8 903 25-04-2019, Saat: 19:59
Son Yorum: 41linea41
  FireBird Merge Into Kullanımı mcuyan 2 642 13-08-2018, Saat: 12:40
Son Yorum: mcuyan
  Firebird'de bellek Kullanımı rmzgenius 1 616 25-06-2018, Saat: 15:34
Son Yorum: klavye
  Tigger Kullanımı cscoding 1 646 24-06-2018, Saat: 15:09
Son Yorum: masteryoda
  Firebird Emmbeded kullanimi ? Ugur 26 9.454 18-02-2017, Saat: 08:31
Son Yorum: DelphiCanR



Konuyu Okuyanlar: 1 Ziyaretçi