Firebird SP'de Master-detail döngüsü?
Firebird SP'de Master-detail döngüsü?
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.
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.
Ben bu tip şeyleri Triger ile hallediyorum.
yada datasetlerin AfterInser gibi eventlerinde.
viewtopic.php?t=1342&highlight=afterinsert
Kolay Gelsin...
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.
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.
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...

* http://delphiturkiye.gunduz.info Seminerler...

* http://www.hakmar.com.tr Kalite bir haktır...

- sadettinpolat
- Moderator
- Mesajlar: 2131
- Kayıt: 07 Ara 2003 02:51
- Konum: Ankara
- İletişim:
çözmesi lazım ama çözmedi.
yapı bu şekilde ama detail kayıtları kaydetmiyor. IB Expert ile debug ettim, detail_tablo'nun döngüsüne hiç girmiyor.
Kolay gelsin.
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
Kolay gelsin.
- sadettinpolat
- Moderator
- Mesajlar: 2131
- Kayıt: 07 Ara 2003 02:51
- Konum: Ankara
- İletişim:
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
Kod: Tümünü seç
ID DETAILID
45 86
45 85
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:
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