SP ile Kayıt nasıl yapılır?

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
KoPilot
Üye
Mesajlar: 185
Kayıt: 05 Eki 2007 08:02

SP ile Kayıt nasıl yapılır?

Mesaj gönderen KoPilot »

Merhaba;
Arkadaşlar, SP yazmayı öğrenmeye çalışıyorum. Daha önce kullanmadım dolayısıyla ufak tefek sıkıntılarım karşısında yardımlarınızı bekliyorum.
Sorum şu: cari, fatura ve fatura detay isimli üç tablom var (master-detay yapıda). Yazdığım (kopya çekerek) bir sp ile ki şu

Kod: Tümünü seç

create or alter procedure spi_faturadetay (
    cari_id integer,
    alis_no integer,
    alis_miktari decimal(6,4),
    alis_kdv decimal(6,2),
    alis_iskonto decimal(6,4),
    alis_fiyat decimal(6,4))
as
declare variable dlr_kayitsayisi integer;
begin
  select count(*) from fatura_tbl where als_id = :alis_no
  INTO dlr_kayitsayisi;
  if (dlr_kayitsayisi=0) then
    insert into fatura_tbl(als_crid, als_id, als_tutar, als_tarih, als_faturano, als_kasiyer)
    values(:cari_id, :alis_no,0, 'today', 'fatura1', 1);
  update fatura_tbl set
    als_tutar = als_tutar+(:alis_miktari*(1+(:alis_kdv/100))*(1-(:alis_iskonto/100))*:alis_fiyat)
    where als_id = :alis_no;
End
faturadetay tablomda ki trigger ki şu

Kod: Tümünü seç

execute procedure spi_faturadetay (new.fd_crid, NEW.fd_alsid, NEW.fd_miktar, NEW.fd_kdv, NEW.fd_iskonto, NEW.fd_fiyat);
ibexpertte bu parametreleri elle girince kayıt sorunsuz bir şekilde oluyor ve tam olarak istediğim gibi oluyor. Yani fatura tablomda kayıt yoksa procedure kayıt oluşturuyor ve faturadetay tabloma girdiğim kayıt fatura tablosundaki kaydın anası oluyor.
Fakat bu işlemi delphi tarafında cr_id, fatura_id alıyorum ama atamasını bir türlü yapamadım. Delphi tarafında parametreleri nasıl atayacağız. Yani faturadetay tablosundaki faturaid alanına yeni oluşturulmuş (yukarıdaki SP ile) bir kaydın id'sini nasıl alabilirim.

D2007 ve firebird kullanıyorum.
Dosyalarınızı kendi bulutunuza yedekleyin. Yandex Disk
Eyvallah..
yusuf simsek
Üye
Mesajlar: 330
Kayıt: 09 Mar 2004 11:18
Konum: Konya
İletişim:

Re: SP ile Kayıt nasıl yapılır?

Mesaj gönderen yusuf simsek »

Kurguyu ters yapmışsınız gibi geldi bana... Önce faturayı kaydedip sonrasında FaturaId değeri ile FaturaDetay kaydetseniz daha sağlıklı olabilir diye düşünüyorum...


Kod: Tümünü seç

create or alter procedure spi_faturadetay (
    cari_id integer,
    alis_no integer,
    alis_miktari decimal(6,4),
    alis_kdv decimal(6,2),
    alis_iskonto decimal(6,4),
    alis_fiyat decimal(6,4))



returns (
    returnid integer)


as

declare variable dlr_kayitsayisi integer;

begin


  select count(*) from fatura_tbl where als_id = :alis_no
  INTO dlr_kayitsayisi;
  
  if (dlr_kayitsayisi=0) then
    insert into fatura_tbl(als_crid, als_id, als_tutar, als_tarih, als_faturano, als_kasiyer)
    values(:cari_id, :alis_no,0, 'today', 'fatura1', 1);

  update fatura_tbl set
    als_tutar = als_tutar+(:alis_miktari*(1+(:alis_kdv/100))*(1-(:alis_iskonto/100))*:alis_fiyat)
    where als_id = :alis_no;
    
  returnid = :DONECEK_DEGER; 
  suspend;
  
  
end
returnid değişken olarak tanımlanan dönecek değirdir,

suspend parametresi de değeri geri gönderdir...


delphi içinden select returnid from spi_faturadetay( ... parametreler ... ) şeklinde çağırıp değeri kullanabilirsiniz
Bugün bir kez daha,
Hiç Birşey Bilmediğimi Öğrendim!!!

https://extrayazilim.com
Kullanıcı avatarı
KoPilot
Üye
Mesajlar: 185
Kayıt: 05 Eki 2007 08:02

Re: SP ile Kayıt nasıl yapılır?

Mesaj gönderen KoPilot »

yusuf simsek yazdı: 05 Şub 2019 09:09 Kurguyu ters yapmışsınız gibi geldi bana... Önce faturayı kaydedip sonrasında FaturaId değeri ile FaturaDetay kaydetseniz daha sağlıklı olabilir diye düşünüyorum...
Bi terslik olduğunun farkındayım. Zaten delphiden yaptığımız zaman tam da öyle yapıyorum ama SP'de düzeltmek zor oldu benim için, sizin yaptığınız gibi yapmayı deneyeceğim. Umarım becerebilirim.
Dosyalarınızı kendi bulutunuza yedekleyin. Yandex Disk
Eyvallah..
Kullanıcı avatarı
KoPilot
Üye
Mesajlar: 185
Kayıt: 05 Eki 2007 08:02

Re: SP ile Kayıt nasıl yapılır?

Mesaj gönderen KoPilot »

KoPilot yazdı: 06 Şub 2019 11:10
yusuf simsek yazdı: 05 Şub 2019 09:09 Kurguyu ters yapmışsınız gibi geldi bana... Önce faturayı kaydedip sonrasında FaturaId değeri ile FaturaDetay kaydetseniz daha sağlıklı olabilir diye düşünüyorum...
Bi terslik olduğunun farkındayım. Zaten delphiden yaptığımız zaman tam da öyle yapıyorum ama SP'de düzeltmek zor oldu benim için, sizin yaptığınız gibi yapmayı deneyeceğim. Umarım becerebilirim.
yusuf simsek hocam yapamadım. asıl mesele neyi nereye atayacağımı bulamıyorum.

Kod: Tümünü seç

create or alter procedure spi_faturadetay (
    cari_id integer,
    alis_miktari decimal(6,4),
    alis_kdv decimal(6,2),
    alis_iskonto decimal(6,4),
    alis_fiyat decimal(6,4))
returns (alis_id integer)
as
declare variable dlr_kayitsayisi integer;
begin
  alis_id=gen_id(gen_fatura_tbl_id,1);
  select count(*) from fatura_tbl where als_id = :alis_id
  INTO dlr_kayitsayisi;
  if (dlr_kayitsayisi=0) then
    insert into fatura_tbl(als_crid, als_id, als_tutar, als_tarih, als_faturano, als_kasiyer)
    values(:cari_id, :alis_id,0, 'today', 'fatura1', 1);

  update fatura_tbl set
    als_tutar = als_tutar+(:alis_miktari*(1+(:alis_kdv/100))*(1-(:alis_iskonto/100))*:alis_fiyat)
    where als_id = :alis_id;
    
  alis_id = :alis_id;
  suspend;
  
end
Öğretileriniz ve aramalarım ışığında yukarıdaki gibi bir düzeltme yaptım. ibexpert içinden değerleri verince çalışıyor ama delphi tarafından yapamadım.
fatura_tbl : master tablo
faturadetay_tbl : detay tablo
Önce fatura_tbl tablosuna giriş yapmalı ama bu giriş otomatik olarak faturadetay_tbl tablosuna yaptığım girişle yapılmalı. ibexpert'te bu söylediğim oluyor.
Azıcık daha yardım talebinde bulunuyorum :D :oops:
Dosyalarınızı kendi bulutunuza yedekleyin. Yandex Disk
Eyvallah..
yusuf simsek
Üye
Mesajlar: 330
Kayıt: 09 Mar 2004 11:18
Konum: Konya
İletişim:

Re: SP ile Kayıt nasıl yapılır?

Mesaj gönderen yusuf simsek »

@KoPikot kardeşim Estağfurullah, biz hoca değiliz... Standart kullanıcıyız... Elimizden geldğince ve fırsat buldukça öğrendiklerimiz paylaşmaya çalışıyoruz...

Ben Master - Detail tablolarımda önce MASTER kaydediyorum, sonra DETAIL kaydediyorum...

Ör : Fatura ekranında Fatura Üst bilgilerini Editler de, Fatura Detay bilgileri de MEMORYTABLE da tutuyorum.

MemoryTable POST ve ya DELETE işlemi sonrasında ( sizin SP içerisinde FATUTA tablosu için yapmış olduğunuz Alış Tutar, İsk Tutar vs.. ) hesaplamaları yapıp değişkene atıyorum


Kullanıcı Kaydet butonuna bastığında öncelikle FATURA_SP ye fatura üst bilgilerini ve hesaplamalar elde ettiğim verileri gönderiyorum... FATURA_SP bana FaturaID değerini gönderiyor...

Gelen FaturaID değeri ile birlikte MemoryTable içerisinde kayıt sayısı kadar FATURADETAY_SP ye ( MemoryTable içerisinde ki ) verileri gönderip kayıt işlemini tamamlıyorum...

Fatura Kayıt işlemine bağlamadan önce ( Zeos Connection [ AutoCommit := False ] ) yapıyorum...

kayıt işlemi esnasında herhangi bir hata olursa CONNECTION.ROLLBACK yaparak yaptığım tüm işlemleri iptal ediyorum... herhangi bir sorun olmadan kayıt işlemi tamamlandığında CONNECTION.COMMIT yaparak kayıt işlemini tamamlıyorum...

Bu mantığı bir kurgulayın sonrasında sorularınızı tekrar alayım... Kurgu oturmadan yazılacak kodlar bir işe yaramayacaktır...
Bugün bir kez daha,
Hiç Birşey Bilmediğimi Öğrendim!!!

https://extrayazilim.com
Kullanıcı avatarı
KoPilot
Üye
Mesajlar: 185
Kayıt: 05 Eki 2007 08:02

Re: SP ile Kayıt nasıl yapılır?

Mesaj gönderen KoPilot »

yusuf simsek yazdı: 08 Şub 2019 09:25 @KoPikot kardeşim Estağfurullah, biz hoca değiliz... Standart kullanıcıyız... Elimizden geldğince ve fırsat buldukça öğrendiklerimiz paylaşmaya çalışıyoruz...

Ben Master - Detail tablolarımda önce MASTER kaydediyorum, sonra DETAIL kaydediyorum...

Ör : Fatura ekranında Fatura Üst bilgilerini Editler de, Fatura Detay bilgileri de MEMORYTABLE da tutuyorum.

MemoryTable POST ve ya DELETE işlemi sonrasında ( sizin SP içerisinde FATUTA tablosu için yapmış olduğunuz Alış Tutar, İsk Tutar vs.. ) hesaplamaları yapıp değişkene atıyorum


Kullanıcı Kaydet butonuna bastığında öncelikle FATURA_SP ye fatura üst bilgilerini ve hesaplamalar elde ettiğim verileri gönderiyorum... FATURA_SP bana FaturaID değerini gönderiyor...

Gelen FaturaID değeri ile birlikte MemoryTable içerisinde kayıt sayısı kadar FATURADETAY_SP ye ( MemoryTable içerisinde ki ) verileri gönderip kayıt işlemini tamamlıyorum...

Fatura Kayıt işlemine bağlamadan önce ( Zeos Connection [ AutoCommit := False ] ) yapıyorum...

kayıt işlemi esnasında herhangi bir hata olursa CONNECTION.ROLLBACK yaparak yaptığım tüm işlemleri iptal ediyorum... herhangi bir sorun olmadan kayıt işlemi tamamlandığında CONNECTION.COMMIT yaparak kayıt işlemini tamamlıyorum...

Bu mantığı bir kurgulayın sonrasında sorularınızı tekrar alayım... Kurgu oturmadan yazılacak kodlar bir işe yaramayacaktır...
yusuf simsek hocam bu dediğin mantığı zaten delphiden kodla bu dediğin şekilde yapıyorum. Önce master tablo kaydını girip oradan aldığım İD ile detay tablo kaydını yapıyorum. Bende fatura detayı memory tablede tutuyorum döngüyle faturanın altına işliyorum, burada hiçbir sorun yok. Sorun bu olayı veritabanı tarafına taşımaya çalıştığım zaman oluyor. Yani artık delphi tarafından kodla değil de firebird tarafında SP ile yapmak istiyorum. Fakat kayıt işlemini SP ile yapmaya çalıştığım zaman detay tablo kayıtlarına göre master tablo kaydını oluşturuyorum ve master İD alamıyorum.
Dosyalarınızı kendi bulutunuza yedekleyin. Yandex Disk
Eyvallah..
yusuf simsek
Üye
Mesajlar: 330
Kayıt: 09 Mar 2004 11:18
Konum: Konya
İletişim:

Re: SP ile Kayıt nasıl yapılır?

Mesaj gönderen yusuf simsek »

Kod: Tümünü seç

CREATE OR ALTER PROCEDURE SP_FATURA (
    faturaid integer,
    kullaniciid integer,
    carikartid integer,
   ...
   ...)


returns (
    returnid integer)


as
declare variable new_id integer;
begin
  if ( (:faturaid > 0 ) and (exists ( select faturaid from fatura  where faturaid =:faturaid ) ) ) then
    begin
        returnid = :faturaid;

        update fatura set
            Kullaniciid = :kullaniciid,
            carikartid = :carikartid,
		...
		...
        where (faturaid = :faturaid);
    end
  else
    begin
        
        insert into fatura ( kullaniciid, carikartid, ...)
        values ( :kullaniciid, :carikartid .... );

	select first 1 faturaid from fatura order by faturaid desc into :returnid;

    end

  suspend;
end;
ben bu şekilde kullanıyorum..

Kod: Tümünü seç

returns (
    returnid integer)
geri dönüş değişkeni,

son satırada ki suspend; da geri dönüşü sağlıyor...

delphiden de

Kod: Tümünü seç

SELECT ReturnId FROM SP_FATURA( .... )
olarak çağırıp kullanıyorum...

İyi çalışmalar dilerim
Bugün bir kez daha,
Hiç Birşey Bilmediğimi Öğrendim!!!

https://extrayazilim.com
Kullanıcı avatarı
KoPilot
Üye
Mesajlar: 185
Kayıt: 05 Eki 2007 08:02

Re: SP ile Kayıt nasıl yapılır?

Mesaj gönderen KoPilot »

yusuf simsek yazdı: 11 Şub 2019 04:05

Kod: Tümünü seç

CREATE OR ALTER PROCEDURE SP_FATURA (
    faturaid integer,
    kullaniciid integer,
    carikartid integer,
   ...
   ...)


returns (
    returnid integer)


as
declare variable new_id integer;
begin
  if ( (:faturaid > 0 ) and (exists ( select faturaid from fatura  where faturaid =:faturaid ) ) ) then
    begin
        returnid = :faturaid;

        update fatura set
            Kullaniciid = :kullaniciid,
            carikartid = :carikartid,
		...
		...
        where (faturaid = :faturaid);
    end
  else
    begin
        
        insert into fatura ( kullaniciid, carikartid, ...)
        values ( :kullaniciid, :carikartid .... );

	select first 1 faturaid from fatura order by faturaid desc into :returnid;

    end

  suspend;
end;
yusuf simsek hocam, bu yazdığınız SP'yi çağırma triggeri nasıl olacak.

Kod: Tümünü seç

execute procedure sp_fatura (new.faturaid, NEW.kullaniciid, new.carikartid);
yazdım ama derlemeye çalışırken

Kod: Tümünü seç

Unsuccessful execution caused by a system error that precludes successful execution of subsequent statements.
Dynamic SQL Error.
Output parameter mismatch for procedure SP_FATURA.
hatası veriyor. çıkış parametresini istiyor ama yanlış kişiden istiyor.
Dosyalarınızı kendi bulutunuza yedekleyin. Yandex Disk
Eyvallah..
yusuf simsek
Üye
Mesajlar: 330
Kayıt: 09 Mar 2004 11:18
Konum: Konya
İletişim:

Re: SP ile Kayıt nasıl yapılır?

Mesaj gönderen yusuf simsek »

yusuf simsek yazdı: 11 Şub 2019 04:05
delphiden de

Kod: Tümünü seç

SELECT ReturnId FROM SP_FATURA( .... )
olarak çağırıp kullanıyorum...
SP yi doğrudan delphiden çağırıyorum...

ReturnId değerini aldıktan sonra her satır için FaturaDetay_SP çağırıyorum
Bugün bir kez daha,
Hiç Birşey Bilmediğimi Öğrendim!!!

https://extrayazilim.com
Kullanıcı avatarı
KoPilot
Üye
Mesajlar: 185
Kayıt: 05 Eki 2007 08:02

Re: SP ile Kayıt nasıl yapılır?

Mesaj gönderen KoPilot »

yusuf simsek yazdı: 12 Şub 2019 12:07
yusuf simsek yazdı: 11 Şub 2019 04:05
delphiden de

Kod: Tümünü seç

SELECT ReturnId FROM SP_FATURA( .... )
olarak çağırıp kullanıyorum...
SP yi doğrudan delphiden çağırıyorum...

ReturnId değerini aldıktan sonra her satır için FaturaDetay_SP çağırıyorum
Şimdi anladım, ben sorunumu anlatamamışım.
Hocam bu SP denilen şeye delphi tarafından parametreleri gönderiyoruz o da bu parametreleri alıp yerlerine koyarak kayıt yapıyor, değil mi?

Yukarıda söylediğim her şeyi veritabanı tarafında yaptım ben ve beklentim şu:
Benim veritabanımda Cari, Fatura, FaturaDetay ve Stok tablolarım var. Cari, Fatura ve FaturaDetay tablolarım foreign key ile birbirlerine bağlı. FaturaDetay tabloma gireceğim bir hareket eğer yeni bir giriş ise Fatura tablosunda yeni bir giriş oluşturup Cari tablosunun id'sini foreign keye alacak FaturaDetay tablosunun foreign keyine de Fatura tablosunun id'sini alacak. (Bu söylediğim işi anlatmak ne kadar zormuş şimdi farkettim).
Yapamadığım şey şu (veritabanı tarafında) Cari tablosunun id'sini alıp Fatura tablosunda kullanmak, Fatura tablosunun id'sini alıp FaturaDetay tablosunda kullanmak ki bunu yapamadığım yer veritabanı tarafı. Veritabanı tarafında parametreleri elle girdiğim zaman kayıt tam istediğim şekilde oluyor ama Cari tablosunun id'sini, Fatura tablosunun id'sini elimle girmek mantıklı değil.
Acaba mantık hatası mı yapıyorum.
Dosyalarınızı kendi bulutunuza yedekleyin. Yandex Disk
Eyvallah..
Kullanıcı avatarı
KoPilot
Üye
Mesajlar: 185
Kayıt: 05 Eki 2007 08:02

Re: SP ile Kayıt nasıl yapılır?

Mesaj gönderen KoPilot »

Ayrıca bir şey daha sormak istiyorum.

-Geri dönen değeri yani returnid değerini nasıl alıp kullanacağız.
-Bu SP'yi tetiklemek için trigger oluşturmak istedim

Kod: Tümünü seç

Unsuccessful execution caused by a system error that precludes successful execution of subsequent statements.
Dynamic SQL Error.
Output parameter mismatch for procedure SP_FATURA.
ibexpert böyle bir hata verdi.
Dosyalarınızı kendi bulutunuza yedekleyin. Yandex Disk
Eyvallah..
Kullanıcı avatarı
KoPilot
Üye
Mesajlar: 185
Kayıt: 05 Eki 2007 08:02

Re: SP ile Kayıt nasıl yapılır?

Mesaj gönderen KoPilot »

yusuf simsek hocam, uğraştım uğraştım yapamadım. Artık kesinlikle mantık hatası yaptığıma kanaat getirdim ama nerede.
Hocam ekte kayıt eklemeyi beceremediğim veritabanı var, SP'sini sizden kopya çektim ama triggerdan çağıramadım.
Bi el atar mısınız?
Dosya ekleri
SPLI.rar
Veritabanı
(155.24 KiB) 247 kere indirildi
Dosyalarınızı kendi bulutunuza yedekleyin. Yandex Disk
Eyvallah..
yusuf simsek
Üye
Mesajlar: 330
Kayıt: 09 Mar 2004 11:18
Konum: Konya
İletişim:

Re: SP ile Kayıt nasıl yapılır?

Mesaj gönderen yusuf simsek »

Kopilot hocam detay tablodan ana tabloya erişmeye çalışmak.

Trigger bana göre yanlış seçim

Delphi den önce fatura SP çalıştırıp faturaid alın, sonra sp ile faturadetay ekleyin....

Şuan müsait değilim, müsait olduğumda veritabanina bakıp örnek uygulama yazmaya çalışacağım
Bugün bir kez daha,
Hiç Birşey Bilmediğimi Öğrendim!!!

https://extrayazilim.com
Kullanıcı avatarı
KoPilot
Üye
Mesajlar: 185
Kayıt: 05 Eki 2007 08:02

Re: SP ile Kayıt nasıl yapılır?

Mesaj gönderen KoPilot »

Güncel...
Dosyalarınızı kendi bulutunuza yedekleyin. Yandex Disk
Eyvallah..
Cevapla