SP içinde Master-Detail ilişkisi

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ı
serbek_tr
Üye
Mesajlar: 362
Kayıt: 16 Ağu 2004 12:54

SP içinde Master-Detail ilişkisi

Mesaj gönderen serbek_tr »

Merhaba arkadaşlar;
Veri bütünlüğünde riski göze almayıp olabildiğince tüm işleri veritabanı kısmında procedure ler ile yapmaya çalışıyorum ancak bir konuda takıldım kısaca yapmak istediğimi özetliyeyim. Master-Detail ilişkisi olan Sipariş ve Sipariş detayları tablolarım var. Yazmak istediğim ama yazamadığım SP de Sipariş tablosundaki teslim tarihi girilip kayıt edildiğinde o siparişe ait olan tüm sipariş detaylarının bulunup burdaki ürün id lerine göre hareket kayıtları oluşturmak istiyorum.

Aşağıda ki procedure çalışıyor ama kod içinde de belirttiğim yerde göreceksiniz sipariş id ye bağlı olan detayları bulup kaç tane kayıt varsa o kadar insert yapmak istiyorum.

Kod: Tümünü seç

CREATE PROCEDURE SP_SIPARIS_INS(
  TARIH DATE,
  REF_TABLO VARCHAR(30) CHARACTER SET WIN1254,
  REF_ID INTEGER,
  CARI_ID INTEGER,
  FIYAT NUMERIC(18, 2),
  SIPARIS_ID INTEGER,
  TUR SMALLINT)
AS
DECLARE VARIABLE URUN_ADI VARCHAR(50) CHARACTER SET WIN1254;
DECLARE VARIABLE SIPARIS_NO VARCHAR(20) CHARACTER SET WIN1254;
DECLARE VARIABLE CARI_KOD VARCHAR(20) CHARACTER SET WIN1254;
DECLARE VARIABLE ACIKLAMA VARCHAR(200) CHARACTER SET WIN1254;
BEGIN
  IF (TARIH IS NULL) THEN EXIT; /*SİPARİŞ TESLİM TARİHİ BOŞ İSE İPTAL*/
  IF (TUR=0) THEN URUN_ADI ='PANAROMİK ALBÜM SİPARİŞİ';
  IF (TUR=1) THEN URUN_ADI ='SİPARİŞ';

  SELECT SIPARIS_NO FROM SIPARISLER WHERE SIPARIS_ID = :SIPARIS_ID /*Sipariş no alınıyor*/
  INTO :SIPARIS_NO;
  
  SELECT CARI_KOD FROM CARILER WHERE CARI_ID = :CARI_ID /*Cari kod alınıyor*/
  INTO :CARI_KOD;
  
  ACIKLAMA = URUN_ADI||' '||SIPARIS_NO||'; CARİ: '||CARI_KOD;/*Açıklama oluşturuluyor*/ 
     
  INSERT INTO CARI_HAREKET /*Cari Hareket kaydı giriliyor*/
  (TARIH,ACIKLAMA,BORC,REF_TABLO,REF_ID,CARI_ID)
  VALUES
  (:TARIH,:ACIKLAMA,:FIYAT,:REF_TABLO,:REF_ID,:CARI_ID);
  
  ACIKLAMA = 'SİPARİŞ: '||SIPARIS_NO||'; ÜRÜN: '||URUN_ADI||'; CARİ: '||CARI_KOD; /*Ürün Hareket girişi için açıklama oluşturuluyor*/
  
  {İŞTE AŞAĞIDAKİ İNSERT OLAYININ SIPARIS_ID İLE İLİŞKİLİ OLAN SIPARIS_DETAY KAYITLARININ BULUNUP BURDAKİ ÜRÜN İD LERİNE GÖRE GERÇEKLEŞMESİNİ İSTİYORUM, YANİ KAÇ TANE SİPARİŞ DETAY ATIRI VARSA O KADAR ÜRÜN HAREKET KAYDI GİRMEM GEREKLİ}

  INSERT INTO URUN_HAREKET
  (URUN_ID,TARIH,HAR_TIP,ACIKLAMA,REF_TABLO,REF_ID,EVRAK_NO,MIKTAR,BFIYAT,TUTAR)
  VALUES
  (:URUN_ID,:TARIH,'G',:ACIKLAMA,:REF_TABLO,:REF_ID,:SIPARIS_NO,:ADET,:FIYAT,:TFIYAT);
  
  SUSPEND;
END
Yani bana en sondaki insert olayını master a bağlı detailler için çoklu olarak nasıl yapacağımı söylemeniz yeterli. Döngü kurar gibi... Teşekkür ederim
Procedure Forum.Imza(Sender: TObject)
Begin
ShowMessage('Her türlü fikire, Her zaman açığım')
End;
zyildiz
Üye
Mesajlar: 115
Kayıt: 09 Mar 2004 01:22
Konum: Adapazarı

Re: SP içinde Master-Detail ilişkisi

Mesaj gönderen zyildiz »

Bence hareket kısmı (insert into bölümü) için yeni bir procedure yazsanız ve dongü işlerini orada halletseniz daha iyi olur.
Procedure içinden procedure çağırarak problemi çözersiniz diye düşünüyorum.
Medeniyet dediğin hayat almaz, hayat verir. Senin dedelerin ninelerin bunu gerçekleştirdi... Şemsettin YEŞİL
Kullanıcı avatarı
serbek_tr
Üye
Mesajlar: 362
Kayıt: 16 Ağu 2004 12:54

Re: SP içinde Master-Detail ilişkisi(Çözüldü)

Mesaj gönderen serbek_tr »

Tavsiye için teşekkür ederim. Forumu biraz daha araştırınca öğrendimki
for döngüsü varmış. Onu kullanarak istediğimi yaptım.

Kod: Tümünü seç

FOR
  SELECT URUN_ID FROM SIPARIS_DETAY WHERE SIPARIS_ID = :REF_ID
  INTO :URUN_ID
DO
BEGIN
  INSERT INTO URUN_HAREKET
   ...
   ...
   ...
END 
Procedure Forum.Imza(Sender: TObject)
Begin
ShowMessage('Her türlü fikire, Her zaman açığım')
End;
Cevapla