[ avox @ 21.01.2008. 13:46 ] @
Pozdrav!!!
Radim neki program koji mi treba da bi prosao kolokvijum. Program radim u c#2005 sa sql 2005 express.
Treba mi triger koji ce iz tabele robaUsluga izeti cenu i pomnoziti je sa kolicinom robe koja je uzte a koja se nalazi u tabeli stavke. I dobijenim rezultatom osveziti kolonu Ukupno u tabeli racun. Trigger mi prodje debug ali kada probam da ga izvrsavam program pukne.
Posto sam pocetnik nisam ni siguran da li mi za ovako neto treba privremena tabela... Triger sam napravio na tabeli stavke.


Evo moje baze.

Evo i triggera koji sam napisao.
Code:

ALTER TRIGGER Trigger1 
ON dbo.Stavke 
FOR INSERT
AS
create table #privremena
(
racunID int,
ukupno smallmoney,
robaUslugeID int
)

insert into #privremena
select i.racunID
from Inserted i

update #privremena
set ukupno = (SELECT r.cenaPoKomadu * i.kolicina
from [robaUsluge] r
inner join Inserted i
on
r.[robaUslugeID] = i.[robaUslugeID])

update r
set ukupno = (SELECT ukupno + p.ukupno
from [Racun] r
inner join [#privremena] p
on
r.[racunID]=p.[racunID])




[Ovu poruku je menjao avox dana 21.01.2008. u 20:48 GMT+1]
[ Koce @ 21.01.2008. 15:27 ] @
Kod mene je ovo proslo bez problema:


alter trigger tr_triger
on stavka
for insert, update
as

create table #t (iznos float, racunid int)
insert into #t (iznos, racunid)
select robaUsluga.cenaPoKomadu * inserted.kolicina, inserted.racunid
from robaUsluga inner join inserted
on robaUsluga.[robaUslugeID] = inserted.[robaUslugeID]


update racun
set ukupno = i.iznos
from racun r, #t i
where r.racunID = i.racunID

drop table #t

probaj
[ Zidar @ 21.01.2008. 19:08 ] @
neces poloziti kolokvijum :-(
Ceo problem je kako uraditi UPADTE na koloni Ukupno u tabeli Racun. Ta kolona ne treba uopste da postoji, ukupno za racun se uvek moze izracunati kad tio zatreba. Prema tome, ukloni tu kolonu iz tabele i koristi najjednostavniji SELECT da izracunas ukupan iznos racuna akd ti zatreba. Time nestaje tvoj problem. Nemoj mi reci da to mora ovako, kao 'rekao asistent'. ne treba ti da naucis nesto pogresno. Ostace ti to tako do kraja zivota. To ti n treba u karijeri

:-)
[ avox @ 21.01.2008. 19:43 ] @
Bi osam kod asistenta danas i rekao je da za ovo ne koristim trigger nego i da bi bilo dobro da u tabelu racun stavim klonu Test koja je bit. Kada je bit=1 tada mogu da se u racun dodaju stavke , a kada je bit=0 tada ne mogu. Takodje je rekao da se u bazu nista ne upisuje sve dok je bit=1. Za kolokvijum nemam oderedjenu temu niti nacin na koji to da uradim. Trazi na program pisan u c# koji ima najmanje 4 tabele. Hvala puno na pomoci. Izbacicu Ukupno.
Sta mislis o ovome sto mi je preporucio asistent?
[ M E N E @ 22.01.2008. 07:42 ] @
Otprilike...
(necu govoriti po imenima tvojih tabela, ali ti ih prepoznaj)
Zaglavlje robnog dokumenta se jednom formira, a na njega se kace stavke (kojih moze biti vise, naravno)
U Zaglavlje dokumenta imas polje statusa... dok je polje statusa OTVORENO, mozes dodavati stavke, kad se jednom prebaci na ZATVORENO, nema vise vracanja na OTVORENO, jedino moze ici na STORNIRANO (dakle, ne moze niko da ti cacka po otpremnici, kad je roba vec otisla, moze samo da se stornira, ako dodje do povrata robe). Kako ces napraviti polje statusa, resis sam
U Artiklima imas cenapokomadu i imas kolicina (verovatno trenutno stanje zaliha). To bi trebalo izdvojiti. Napravi posebnu tabelu Magacin, ili Zalihe, ili kako god hoces (sad se to moze siriti na znacajno preko 4 tabele), gde ces imati artikle i kolicine.
Pitanja kolicina (smanjivanje, kad se nesto proda), racuna (sumiranje) i sl, resi iz stored procedura, a ne iz triggera

To ti je moj savet, a bice i drugacijih :-)
[ Zidar @ 22.01.2008. 16:49 ] @
@ avox:
Sad kazes ovako
Citat:
Bi osam kod asistenta danas i rekao je da za ovo ne koristim trigger nego i da bi bilo dobro da u tabelu racun stavim klonu Test koja je bit. Kada je bit=1 tada mogu da se u racun dodaju stavke , a kada je bit=0 tada ne mogu.

A poceo si pitanjem zasto ne radi triger
Citat:
koji ce iz tabele robaUsluga izeti cenu i pomnoziti je sa kolicinom robe koja je uzte a koja se nalazi u tabeli stavke. I dobijenim rezultatom osveziti kolonu Ukupno u tabeli racun.

To sto ti je asistent rekao i ono sto si pitao nem veze jedno s drugim. Asistent te je lepo savetovao kako da 'zakljucas' racun. Medjutim, tvoje pitanje je bilo nesto drugo - kako da pri unosu svakog artikla u racun azuriras novcani zbir za racun.

Poslusaj asistenta za zakljucavanje, a za azuriranje zbira poslusaj mene - dropni polje Zbir iz tabele racun i zaboravi na celu pricu, nikakav triger ti za to ne treba. Kad ti bude trebalo da prikazes zbir, odradis SELECT kveri za taj racun i eto ti zbira. Mozes da napravis stored proceduru ili funkciju kojoj saljes BrojRacuna kao parametar, a dobijes nazad SUM(cena*kolicina).

Za zakljucavanje ti treba triger, na tabeli Stavke, koji proverava da li je Racun zakljucan i ako jeste ponistava transakciju.

Otprilike ovako:
Code:

CREATE TRIGGER [dbo].[Stavke_ZakljucanRacun] ON [dbo].[Stavke] 
FOR UPDATE, DELETE 
AS
----- Svrha: sprecava Updates and Deletes u tabeli Stavke ako je roditelj tabela Racuni zakljucana (Racun.Test=1)

IF EXISTS (SELECT * 
                FROM deleted AS D -- ovde se nalaze redovi koje pokusavas da promenis ili obrises
                JOIN Racuni AS R ON R.racunID=D.racunID -- a ovde je njihov racun
                 WHERE R.test=1 --- i ako racun ima Test=1 onda se zabranjuju izmene
                )
    begin
        raiserror ('Racun je zakljucan (Test=1) pa brisanje ili izmena stavki nije dozvoljena :-)',16,1)
        ROLLBACK  --- ovo ponistava sve promene pokusane u ovoj transakciji (update/delete)
    end


[ avox @ 22.01.2008. 18:07 ] @
Prvo sam postavio pitanje, a posle sam isao isao kod asistenta, koji mi je rekao sta da ispravim.Ali posto je njegov predmet c# nije zalazio u detalje oko baze. :-)
Bacam se na posao.

Hvala!
[ avox @ 28.01.2008. 21:01 ] @
Sve radi. Poslusao sam zidara i asistenta. Naisao sam na novi problem. Sta se desava kada se cene promene, a meni treba Cena nekog racuna od pre 3 meseca. On ce mi tada izracunati cenu sa novim cenama iz tabele Roba. Takodje sam u tabelu kupac stavio popust i isto se desi kada se promeni popust kod nekog kupca.

[Ovu poruku je menjao avox dana 28.01.2008. u 22:37 GMT+1]
[ aleksandarpopov @ 28.01.2008. 21:17 ] @
U tabelu Stavke dodas kolone ProdCena - cenu po kojoj si prodao i kolonu ProcenatPopusta - popust u % koji si eventualno dao kupcu.
[ avox @ 19.02.2008. 16:20 ] @
Hvala puno. Program sam predao ovakav kakav je. Nije bilo problema, polozio sam :-)
Posto sam nameravao jos malo da se zezam sa ovim mojim programom, ubacicu jos te 2 kolone u tabelu.
[ Zidar @ 20.02.2008. 14:48 ] @
Cestitam na polozenom ispitu
Citat:
Prvo sam postavio pitanje, a posle sam isao isao kod asistenta, koji mi je rekao sta da ispravim.Ali posto je njegov predmet c# nije zalazio u detalje oko baze.


Jedna od najjezivijih stvari koje se danas desavaju u IT biznisu jeste recenica "Ali posto je njegov predmet c# nije zalazio u detalje oko baze."
Na taj nacin dobijamo izvanredne programere, koji izvanredno programiraju, ali ne razumeju bas mnogo sta se desava u bazi i oko baze. Rezultat: mnogo nepotrebnog programiranja, koje na kraju ne daje ocekivane rezultate. Ali je zato kod elegantan. I objektno orjentisan

Pazi da ne upadnes u tu zamku.

Srecan rad