Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
SP ile master/detay
#11
(19-09-2019, Saat: 12:13)esistem Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Ben ayrı ayrı SP ile yapıyorum, C_KOD bende suspend ile çıktı verir (Her kaydet procedurumde), Delphi tarafında FAT1 için SP gonderip bir sorun yoksa C_KOD'u alıp, FAT2 (Faturadaki Stokları) döngüye sokup tek tek gönderirim, Bu arada tabi TransAction u bekletirim, herşeyi gönderip bir sorun çıkmazsa COMMIT yaparım, herhangi bir sorunda ROLLBACK yapar şu hata var derim. Bir seferde tüm faturayı göndermek yerine, parça parça yapıyorum yani. Diğer türlü daha karmaşık bir yapı oluşuyor, firebird tarafında çözmesi zor oluyor.

@esistem hocam, bir SP'nin output değerini başka bir SP'den almak mümkün mü? Nasıl?
Dosyalarınızı kendi bulutunuza yedekleyin. Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.

Eyvallah..
Cevapla
#12
Mümkün tabiki, örnek aşağıdadır;

create procedure DDDDD 
returns (
   CIKTI integer) 
as
begin
SELECT C_KOD
FROM stok_ekle (0,0,'DENEME')
INTO :CIKTI;



 suspend;
end

stok_ekle Proc 'u C_KOD çıktısını verir ve yeni bir stok kaydı ekler. (kod, tur,adi) olarak
aşağıda stok_ekle Proc'u var
create procedure STOK_EKLE (
    KOD integer,
   TUR smallint,
   ADI varchar(50)) 
returns (
   C_KOD integer) 
as
begin
if (KOD=0) then BEGIN
insert into stok (tur, adi)
values (:tur, :adi)
RETURNING KOD INTO C_KOD;
               END
if (KOD>0) then BEGIN
update stok
set tur = :tur,
   adi = :adi
where (kod = :kod);
C_KOD=:KOD;
               END
 suspend;
end
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
WWW
Cevapla
#13
Şimdi farkettim @3ddark zaten örneklemiş bu olayı önceki yorumunda, hatta daha açıklayıcı bir şekilde yazmış.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
WWW
Cevapla
#14
(19-09-2019, Saat: 14:52)esistem Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Mümkün tabiki, örnek aşağıdadır;

create procedure DDDDD 
returns (
   CIKTI integer) 
as
begin
SELECT C_KOD
FROM stok_ekle (0,0,'DENEME')
INTO :CIKTI;



 suspend;
end

stok_ekle Proc 'u C_KOD çıktısını verir ve yeni bir stok kaydı ekler. (kod, tur,adi) olarak
aşağıda stok_ekle Proc'u var
create procedure STOK_EKLE (
    KOD integer,
   TUR smallint,
   ADI varchar(50)) 
returns (
   C_KOD integer) 
as
begin
if (KOD=0) then BEGIN
insert into stok (tur, adi)
values (:tur, :adi)
RETURNING KOD INTO C_KOD;
               END
if (KOD>0) then BEGIN
update stok
set tur = :tur,
   adi = :adi
where (kod = :kod);
C_KOD=:KOD;
               END
 suspend;
end

@esistem verdiğin kodu aynen uyguladım çalıştı ama nedense kafamda hâlâ yerine oturtamadım.

(19-09-2019, Saat: 13:28)3ddark Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Bence doğru olan kullanım şu şekilde olmalı

Her zaman verilen güzel bir örnek üzerinden anlatayım.
CREATE OR REPLACE FUNCTION sp_fatura_insert(...faturaya ait bilgiler gelecek...) returning id
begin
...
  Insert Into fatura(...)Values(...) returning id;
...
end;

CREATE OR REPLACE FUNCTION sp_fatura_detay_insert(...fatura detayına ait bilgiler gelecek...) returning id
begin
...
  Insert Into fatura_detay(...)Values(...) returning id;
...
end;

CREATE OR REPLACE FUNCTION sp_hesap_hareketi_insert(...hesap hareketine ait bilgiler gelecek...) returning id
begin
...
  Insert Into hesap_hareketi(...)Values(...) returning id;
...
end;

CREATE OR REPLACE FUNCTION sp_fatura_business_insert(...faturaya ve fatura detayına ait bilgiler gelecek...) returning id
declare 
  ft_id: Integer;
  ft_detay_id: Integer;
begin
  begin_transaction;
  try
    ft_id := sp_fatura_insert(...fatura_bilgileri...);
    for döngüsü do
    begin
      ft_detay_id := sp_fatura_detay_insert(...fatura_detay_bilgileri...);
    end;
    
    //hesap hareketlerini kaydet borç ve alacak olarak
    hesap_hareketi_sp_insert(...hesap hareketine ait bilgiler...);   //borç kaydı
    ...
    hesap_hareketi_sp_insert(...hesap hareketine ait bilgiler...);   //alacak kaydı
    ...
    //fiş veya stok hareket kayıtları oluşturuyorsanız onları da ekleyin sonrasında hatanız yoksa hepsini birlikte kayıt edin.
    //birinde bile hata varsa tüm işlemlerinizi geri alın
    //tüm işlemleri onayla
    commit_transaction;
  except
    //hata varsa tüm işlemleri geri al
    rollback_transaction;
  end;
end;

@3ddark çok teşekkür ederim. Harika ve açıklayıcı bir örnek olmuş. Firebirde çevirince deneyeceğim hemen.
Dosyalarınızı kendi bulutunuza yedekleyin. Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.

Eyvallah..
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  master detail yapısı ve bileşenleri [Çözüldü] Lord_Ares 8 1.098 18-09-2018, Saat: 18:15
Son Yorum: ahmet_sinav



Konuyu Okuyanlar: 1 Ziyaretçi