Posto vidim da se dosta studenata javlja sa problemima u vezi zadataka koje je potrebmno resiti trigerima i procedurama, da i ja pedstavim moj problem.
Verovatno ce te se pitati sta se sve uci na fakultetu...
zadatak:
Podatke o izvozu Ekonomski institut prima od Statističkog zavoda. Svaki mesec stižu novi podaci koji predstavljaju kumulativne količine i vrednosti izvoza određenog artikla od strane nekog preduzeća u neku zemlju (primarni ključ tabele izvoz je GOD+MES+MBPRE+SIFART+OZNZEM). Pretpostavimo da su za prva dva meseca u godini od Statističkog zavoda stigli sledeći podaci:
tabela izvoz:
Iz prispelih podataka se vidi da su kumulativna količina i vrednost izvoza artikla sa šifrom 30180 od strane preduzeća sa matičnim brojem 80077 u zemlju sa oznakom NL ostali isti u 2. mesecu kao što su bili i u 1. mesecu, iz čega se zaključuje da ovo preduzeće u 2. mesecu zapravo nije izvezlo ni jedan komad pomenutog artikla u zadatu zemlju. S druge strane za kombinaciju MBRPE=80111, OZNZEM=”IT” i SIFART=15512 došlo je do uvećanja kumulativne količine i vrednosti izvoza. Kako je kum. vrednost u 1. mesecu iznosila 3000 USD, a u 2. mesecu 5800 USD, zaključujemo da je u 2. mesecu preduzeće zapravo izvezlo 10000 komada artikla (22000-12000) u vrednosti od 2800 USD (5800-3000). Takođe primećujemo da se neke kombinacije preduzeća, artikla i zemlje javljaju po prvi put u 2. mesecu (npr. 80233, 54900 i IT). Kako nije bilo nikakvih podataka za 1. mesec zaključujemo da kumulativna količina i vrednost izvoza za ovakve slučajeve zapravo predstavlja ostvarenje u 2. mesecu.
Kako se u mnogim izveštajima i analizama koriste mesečni a ne kumulativni učinci nužno je da se prilikom punjenja tabele podacima (naredbom BULK INSERT – SQL Server, odnosno LOAD - Informix) na osnovu prispelog tekstualnog fajla) za svaki učitanu torku pored dobijenih kumulativnih izračunaju i u torci zapišu i mesečni učinci. Ove mesečne vrednosti se zapisuju u kolonama KOLIC i VREUSD (videti tačku A1). Definisati proceduralne mehanizme (trigere i/ili stored procedure) kojima će se obezbediti da se za svaku insertovanu torku u tabelu izvoz na osnovu dobijenih kumulativnih podataka odmah izračunaju mesečna količina i vrednost izvoza i isti zapišu u odgovarajućim kolonama.
ER MODEL je attachovan.
U ovom skolskom primeru se zahteva trigger I kursor kao obavezna demonstracija znanja na ispita.
Moje pitanje vezano za Ovaj zadatak:
1) Kako bi se racunali “MESECNI UCINCI” da je npr. kumulativna. vrednost u AVGUSTU. mesecu iznosila 3000 USD za preduzece ”80111”, zemlje ” IT ”, artikla ” 15512, a 3 meseca kasnije (to je NOVEMBAR MESEC) za isto preduzece, isti akrtikl, istu godinu, istu zemlju je doslo do povecanja kumulativne vrednosti na 6000. Tu mi nastaje problem. Ne znam kako da izracunam MESECNE UCINKE za nove kolone ”KOLICINA” i ”VREDNOST izvoza” ako meseci ne idu redom 1 , 2, 3, 4, 5,... nego idu sa preskakanjanjem (npr. Mesec: 2,3, 5, 7, 10)..
. Dakle, ovde se zelim da prikazem koliki su mi bili mesecni ucninci u mesecu NOVEMBRU u odnosu na prethodni 8 mesec AVGUST it to za isto preduzece, istu godinu, i za istu sifru artikla.
E sada, resenje koje sam dobio od drugih studenata, i koje je ako bojagi tacno. Medjuti, ja ne mogu da nateram da radi ovaj triger.
CREATE TRIGGER IZVOZ_I ON IZVOZ_MESEC AFTER INSERT AS
declare @god smallint,
@mes tinyint,
@mbpre char(5),
@oznzem char(2),
@sifart char(5),
@kolkum int,
@vrekum int ,
@kolkum1 int,
@vrekum1 int,
@kolusd int,
@vreusd INT
declare c1 cursor
for select god, mes, mbpre, oznzem, sifart, kolkum, vrekum from inserted
open c1
fetch c1 into @god,@mes,@mbpre,@oznzem,@sifart,@kolkum,@vrekum
while @@fetch_status=0
BEGIN
IF exists (select * from izvoz_mesec
where god=@god and mes=@mes-1 and mbpre=@mbpre and
sifart=@sifart and oznzem=@oznzem)
BEGIN
SELECT @kolkum=kolkum, @vrekum=vrekum
FROM izvoz_mesec
WHERE god=@god and mes=@mes and mbpre=@mbpre and sifart=@sifart and oznzem=@oznzem
select @kolkum1=kolkum, @vrekum1=vrekum
from izvoz_mesec
where god=@god and mes=@mes-1 and mbpre=@mbpre and sifart=@sifart and oznzem=@oznzem
PRINT'@kolkum: ' +cast(@kolkum as varchar)
PRINT'@vrekum: ' +cast(@kolkum as varchar)
SET @kolusd= @kolkum - @kolkum1
SET @Vreusd = @vrekum - @vrekum1
PRINT ''
PRINT ''
UPDATE izvoz_mesec
SET kolusd=@kolusd, vreusd=@vreusd
WHERE god=@god and mes=@mes and mbpre=@mbpre and sifart=@sifart and oznzem=@oznzem
PRINT'@kulusd: ' +cast(@kOlusd as varchar)
PRINT'@vreusd: ' +cast(@kOlusd as varchar)
END
ELSE
BEGIN
UPDATE izvoz_mesec
SET kolusd= @kolkum, vreusd=vrekum
WHERE god=@god and mes=@mes and mbpre=@mbpre and sifart=@sifart and oznzem=@oznzem
PRINT 'nece da racuna @mes-1' --
END
FETCH c1 into @god,@mes,@mbpre,@oznzem,@sifart,@kolkum,@vrekum
END
CLOSE C1
DEALLOCATE C1
[Ovu poruku je menjao elitnii dana 20.09.2010. u 13:54 GMT+1]
[Ovu poruku je menjao elitnii dana 20.09.2010. u 14:02 GMT+1]
[Ovu poruku je menjao elitnii dana 20.09.2010. u 14:04 GMT+1]
[Ovu poruku je menjao elitnii dana 20.09.2010. u 14:34 GMT+1]