Firebird SP'de Master-detail döngüsü?

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ı
mussimsek
Admin
Mesajlar: 7602
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Firebird SP'de Master-detail döngüsü?

Mesaj gönderen mussimsek »

Merhaba,

2 tane tablom var. Bunlar arasında master-detail ilişki var. Mesela bir müşteriye yapılan satışlar ve bu satışların detayları diyebiliriz. Ben bu 2 tablodaki belirli bir ID'ye sahip müşterinin kayıtlarını LOG isimli başka bir tabloya kayıt etmek istiyorum.

Mesela 5 nolu müşteri için sırasıyla:

- birinci satışı tabloya insert edecek
- birinci satışın detaylarını insert edecek (mesela 3 detay)
- 2. satışı insert edecek
- 2. satışın detaylarını insert edecek (mesela 2 detay)
....

for select ile içiçe iki döngü yaptım ama detail döngüye hiç girmedi.

Teşekkürler.
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

Ben bu tip şeyleri Triger ile hallediyorum.
yada datasetlerin AfterInser gibi eventlerinde.
viewtopic.php?t=1342&highlight=afterinsert


Kolay Gelsin...

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7602
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

@husonet çok sağol,

bana bu şekilde lazım maalesef. Diğer türlüsü işime gelmiyor. Arada bir takım kontroller de yaptırıyorum vs.

Teşekkürler.
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Aklıma gelen alternatifler....
1. Bir sekilde ic ice dongu olusturmak... Firebird de nasıl olacagini bilmioyurm..
2. Master detay tablolar arasi join yapip tek bir select olusturarak tek dongu icinde farkli insert komutlari ile master ve detaylari ayni select icinden farklı alanlari çekerek insert etmek... Tabi bu durumda master'a insert aninda select distinct ifadesi gerekecek.
3. Bu islemleri tek bir SP icinden degil de satis, satis detay triggerlarina dagitarak yapmak. Boylece dongu diye bir dert kalmaz. Bahsettigin ilave kontrol vs 'leri de uygun yerlere dagitabilir veya bunlari ayri SP yapabilirsin belki...
4. Sybase'e gecersin. :)
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7602
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

4. maddeyi seçiyorum :D Sybase'in yeri ayrı tabii.
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

ben problemi tam olarak anlayamadım galiba.

iki tablo var ve bu tablodan seçilen belirli kayıtlar bir log dosyasına kaydedilecek..

içi içe 2 tane for - select döngüsüyle problemin çözülmesi lazım.
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7602
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

çözmesi lazım ama çözmedi.

Kod: Tümünü seç

for select master_tablo do
begin
  insert into LOG master_kayıt
  for select detail_tablo do
  begin
     insert into detail_kayıt
   end
end
yapı bu şekilde ama detail kayıtları kaydetmiyor. IB Expert ile debug ettim, detail_tablo'nun döngüsüne hiç girmiyor.

Kolay gelsin.
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

Kod: Tümünü seç

CREATE PROCEDURE MASTERDETAIL (
    IN_TESELLUMID INTEGER)
RETURNS (
    OUT_TESELLUMID INTEGER,
    OUT_DETAILID INTEGER)
AS
DECLARE VARIABLE VAR_TESELLUMID INTEGER;
DECLARE VARIABLE VAR_DETAILID INTEGER;
begin
DELETE FROM TEMP3;

FOR SELECT T.tesellumid FROM tesellumler T
WHERE T.tesellumid = :in_tesellumid
INTO :out_tesellumid
DO
BEGIN
  FOR SELECT TD.detailid FROM tesellum_detail TD
  WHERE TD.tesellumid = :out_tesellumid
  INTO :out_detailid
  DO
  BEGIN
    INSERT INTO TEMP3 (ID,DETAILID)
                VALUES (:out_tesellumid,:out_detailid);

   /*SUSPEND;*/
  END
END
end
şeklinde bir prosedürüm var ve çalıştırıp commit edince temp3 tablosunu aşağıdaki şekilde oluşturuyor.

Kod: Tümünü seç

ID	DETAILID
45	86
45	85
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7602
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

sağol hocam, ben deneyip, neticeyi bildiririm.

Kolay gelsin.
highmemo

Mesaj gönderen highmemo »

Mustafa Bey' birde bunu değerlendiriseniz.
Sadettin arkadaşımız yazmış gerçi ama, ek örneklerden zarar çıkmaz..
İsteğinize uygun olsun diye hemen yazdım.. Çalışan bir örnek:

Kod: Tümünü seç

CREATE PROCEDURE PRC_ADDTOLOG (I_CUST_ID INTEGER)
AS 
     declare variable L_ID Integer;
     declare variable L_TOT Integer;
begin
BEGIN

  FOR
    SELECT ID, TOT FROM TBL_MASTER WHERE ID= :I_CUST_ID
    INTO :L_ID, :L_TOT
  DO
   BEGIN
       INSERT INTO TBL_LOG(A,B,C) VALUES(-1, :L_ID, :L_TOT);

       FOR
         SELECT ID, TOT FROM TBL_DETAIL
         WHERE MASTER_ID=:I_CUST_ID INTO :L_ID, :L_TOT
      DO BEGIN
           INSERT INTO TBL_LOG(A,B,C) VALUES(-2, :L_ID, :L_TOT);
         END

    END

END
end
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7602
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

merhaba,

sağolun arkadaşlar sorun çözüldü. Verilerde bir bozukluk varmış :oops:

Deneme yaparken sanırım sildim o kayıtları. Ben 7 nolu ID ile deneme yapıyordum ama detail tabloda 7 nolu hiç kayıt yokmuş. Onun için döngüye hiç girmiyormuş. Kayıt ekleyince çalıştı :D

Teşekkürler.
Cevapla