[ elitnii @ 20.09.2010. 12:37 ] @
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:

[att_img]



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]
[ nemanjal @ 20.09.2010. 13:13 ] @
To je primer sa moga faksa. Javi mi se na pp pa da razmenimo neke zadatke?

Inace, bilo bi lepo ako bi neko mogao da prikaze demonstraciju zadatka koji je postavio Elitnii samo sa kursorom. TO muci vecinu studenata na nasem faksu. Prosto, ako se trazi da se izracunaju neki mesecni ucinci, a razlika izmedju dva meseca je vise od 2 (npr. u mesecu Januaru kumulativna vrednost izvoza je 5000, a u mesecu Aprilu je 7000.), tu nastaje problem. Ne znamo kako da napravimo razliku izmedju izmedju ta dva meseca i izracunamo mesecni ucinak.

mi sto to radili kako i gore u resenju;

select @kolkum1=kolkum, @vrekum1=vrekum
from izvoz_mesec
where god=@god and mes=@mes-1 and mbpre=@mbpre and sifart=@sifart and oznzem=@oznzem
, i to je palilo dok je razlika izmedju tekuceg meseca i proslog bila jednaka 1. Kada je razlika izmedju dva meseca bila veca od 1, e tu je nastajao problem. Tu ne znamo kako da nateramo program da radi i izracuna razliku izmedju dve kumulativne vrednosti i da je potom skadisti u tekuci mesec.
[ Zidar @ 20.09.2010. 14:34 ] @
Ovo je jos jedan primer lose postavljenog zadtka da bi se na silu naucilo nesto sto ne treba da se uci. Ako zele da vide kako pomocu kursora od kumulativa dobijate pojedinacne iznose, treba da vam daju zadatak u kome nema preskocenih meseca.

Znaci, ne sme u zadatku biti ono 'kumulativ u januaru, pa kumulativ u Aprilu. Kolika je vrednost za Februar?' Na to pitanje se ne moze odgovoriti. Kumulativ u januaru zanci "sve sto je pristiglo do 31 januara zakljucno". Kumulativ u aprilu znaci 'sve sto je pristiglo zakljucno sa 30 aprilom'. Moglo je da u februaru i martu ne stigne nista, pa da onda u aprilu imate dve isporuke, pa s ekumulativ od januara promeni. Ne mozete znati da li je roba uopste stigla u februaru ili ne.

Kumulativ po definiciji je suma, sabirci su vrednosti u intervalima. Kumulativ za April jednak je

April = Januar + Februar +Mart + April...

Generalno, moze se reci:

Kumulativ (i) = Kumulativ(i-1) + Vrednost(i)

Ono sto vi radite kursorom jeste

Vrednost(i) = Kumulativ (i) - Kumulativ(i-1)

Ako ne postoji Kumulativ (i-1) ne moze se izracunati Vrednost(i). Cista aritmetika iz petog osnovne.

Mogli biste da interpolujete vrednosti, ali to znaci da pravite predpostavku da se svakog meseca dodaje ista kolicina na kumulativ. To je glupa pretpostavka, jer u tom slucaju ne treba vam kumulativ.

Prema tome, zadatak je neresiv za slucajeve kada nedostaje neki mesec.

Posto resenje 'normalnog' pzadatka postoji, kad neem preskocenih meseci, napisali su ga neki studenti, znaci da nije problem u neznanju, vi definitivno znate da napisete kursor i da ga ubacite u triger, ali to ne vredi nista ako je zadatak glup ili nekompletan ili podaci nisu dobri. Mozda da preskocite te mesece koji ne postoje? Nemojte da trazite da vam to napisem u kursoru, jer moj mozak vec odavno ne radi proceduralno, negop sa skupovima. Principe znate, pa na posao, ako bas morate.

U stavrnom zivotu samo bi budala i pomislila da ovako dodje do mesecnih prodaja. Kumulativi po definiciji dolaze od pojedinacnih podataka. Zar nije lakse da direktor firme kojoj trebaju podaci, napise pismo zavodu za statistiku i zatrazi mescne podatke, umesto kumulativa?

Zidareva teorema: The best code is no code at all