Firebird SP'de Master-detail döngüsü?
mussimsek29.11.2004 - 12:28:55
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.
 
husonet29.11.2004 - 12:38:20
Ben bu tip şeyleri Triger ile hallediyorum.
yada datasetlerin AfterInser gibi eventlerinde.
http://www.delphiturkiye.com/forum/viewtopic.php?t=1342&highlight=afterinsert


Kolay Gelsin...
 
mussimsek29.11.2004 - 12:41:00
@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.
 
fahrettin29.11.2004 - 13:24:45
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. :)
 
mussimsek29.11.2004 - 13:25:57
4. maddeyi seçiyorum :D Sybase'in yeri ayrı tabii.
 
sadettinpolat29.11.2004 - 14:15:32
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.
 
mussimsek29.11.2004 - 14:24:13
çözmesi lazım ama çözmedi.

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.
 
sadettinpolat29.11.2004 - 14:49:01
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.


ID DETAILID
45 86
45 85
 
mussimsek29.11.2004 - 15:19:24
sağol hocam, ben deneyip, neticeyi bildiririm.

Kolay gelsin.
 
highmemo30.11.2004 - 10:37:03
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:


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
 
mussimsek30.11.2004 - 11:14:00
merhaba,

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

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.
 
NOT : Bu sayfa google'un siteyi indekslemesi içindir. www.delphiturkiye.com/forum/ adresini kullanınız!
1998-2006 www.delphiturkiye.com