Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

Zasto ne valja ovaj trigger i trebali za ovako nesto triger?

  • 10 odgovora
  • 6.345 pregleda

Najnovija ↓

Zasto ne valja ovaj trigger i trebali za ovako nesto triger? 21.01.2008. u 14:46 · pre 228 meseci
izmenjeno 1 put, poslednji put avox 21.01.2008. u 20:48
  1. avox21.01.2008. u 20:48zapis iz teksta poruke
#1
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])
Re: Zasto ne valja ovaj trigger 21.01.2008. u 16:27 · pre 228 meseci #2
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
Re: Zasto ne valja ovaj trigger 21.01.2008. u 20:08 · pre 228 meseci #3
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

:-)
Re: Zasto ne valja ovaj trigger 21.01.2008. u 20:43 · pre 228 meseci #4
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?
Re: Zasto ne valja ovaj trigger i trebali za ovako nesto triger? 22.01.2008. u 08:42 · pre 228 meseci #5
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 :-)
Potpis
Uhvatili ste me nespremnog
Re: Zasto ne valja ovaj trigger i trebali za ovako nesto triger? 22.01.2008. u 17:49 · pre 228 meseci #6
@ 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


:-)
Re: Zasto ne valja ovaj trigger i trebali za ovako nesto triger? 28.01.2008. u 22:01 · pre 228 meseci
izmenjeno 1 put, poslednji put avox 28.01.2008. u 22:37
  1. avox28.01.2008. u 22:37zapis iz teksta poruke
#8
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.
Re: Zasto ne valja ovaj trigger i trebali za ovako nesto triger? 20.02.2008. u 15:48 · pre 227 meseci #11
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 :-)
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme