[ bane1234 @ 14.09.2015. 12:24 ] @
Pozdrav,
treba da napravim obracun sirovina u magacinu. Imam tabele sirovine(tu su ulazi sirovina u magacin), radni_nalozi(cim se kreira radni nalog skidaju se sirovine) i normativi(sastavnice proizvoda, bira se pri kreiranju radnog naloga). Problem je sto mi stored procedura vraca rezultat tacan samo kad jedan radni nalog unesem, nakon vise unosa uvecava stanje za sum kolicine u tabeli sirovine.

procedura
Code:

CREATE  PROCEDURE `stanje_sirovina`()
BEGIN
SELECT sirovine.Magacin,sirovine.naziv,(sum(sirovine.Kolicina)-ifnull(sum(radni_nalozi.kolicina*normativi.Kolicina),0)) as 'stanje'
from sirovine left join(radni_nalozi inner join normativi on normativi.IDNormativa=radni_nalozi.normativ) on  sirovine.IDSirovine=normativi.Sirovina
and sirovine.Magacin=radni_nalozi.MagacinSirovina
group by Naziv,Magacin;
END


create statements
Code:

CREATE TABLE `radni_nalozi` (
 `IDRN` int(11) NOT NULL AUTO_INCREMENT,
 `BrojRN` varchar(255) NOT NULL,
 `sifra_proizvoda` varchar(255) NOT NULL,
 `kolicina` decimal(10,2) NOT NULL,
 `normativ` varchar(100) NOT NULL,
 `DatumRN` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
 `ZadatiDatum` date DEFAULT NULL,
 `Proizvodnja` int(11) NOT NULL,
 `Realizovan` bit(1) NOT NULL DEFAULT b'0',
 `MagacinSirovina` int(11) NOT NULL,
 PRIMARY KEY (`IDRN`),
 KEY `BrojRN` (`BrojRN`),
 KEY `normativ` (`normativ`),
 KEY `Proizvodnja` (`Proizvodnja`),
 KEY `sifra_proizvoda` (`sifra_proizvoda`),
 KEY `normativ_2` (`normativ`),
 KEY `MagacinSirovina` (`MagacinSirovina`),
 CONSTRAINT `radni_nalozi_ibfk_4` FOREIGN KEY (`MagacinSirovina`) REFERENCES `magacini_sirovine` (`id_magacina`) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT `radni_nalozi_ibfk_1` FOREIGN KEY (`normativ`) REFERENCES `normativi` (`IDNormativa`) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT `radni_nalozi_ibfk_2` FOREIGN KEY (`Proizvodnja`) REFERENCES `proizvodnja` (`IDProizvodnje`) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT `radni_nalozi_ibfk_3` FOREIGN KEY (`sifra_proizvoda`) REFERENCES `proizvodi` (`SifraProizvoda`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=2626 DEFAULT CHARSET=utf8

CREATE TABLE `normativi` (
 `ID` int(11) NOT NULL AUTO_INCREMENT,
 `IDNormativa` varchar(100) NOT NULL,
 `SifraProizvoda` varchar(100) NOT NULL,
 `Sirovina` varchar(100) NOT NULL,
 `Kolicina` decimal(11,2) NOT NULL,
 PRIMARY KEY (`ID`),
 KEY `SifraProizvoda` (`SifraProizvoda`),
 KEY `Sirovina` (`Sirovina`),
 KEY `IDNormativa` (`IDNormativa`),
 KEY `IDNormativa_2` (`IDNormativa`),
 KEY `IDNormativa_3` (`IDNormativa`),
 CONSTRAINT `normativi_ibfk_5` FOREIGN KEY (`SifraProizvoda`) REFERENCES `proizvodi` (`SifraProizvoda`) ON UPDATE CASCADE,
 CONSTRAINT `normativi_ibfk_6` FOREIGN KEY (`Sirovina`) REFERENCES `sirovine_nazivi` (`Sifra`) ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=986 DEFAULT CHARSET=utf8

CREATE TABLE `sirovine` (
 `IDUF` int(11) NOT NULL AUTO_INCREMENT,
 `ID` varchar(255) NOT NULL,
 `IDSirovine` varchar(255) NOT NULL,
 `Dobavljac` varchar(255) NOT NULL,
 `Naziv` varchar(100) NOT NULL,
 `Kolicina` decimal(10,2) NOT NULL,
 `JM` varchar(100) NOT NULL,
 `Cena` decimal(10,2) NOT NULL,
 `Rabat` decimal(4,2) NOT NULL,
 `PDV` decimal(4,2) NOT NULL,
 `CenaBez` decimal(10,2) NOT NULL,
 `CenaSa` decimal(10,2) NOT NULL,
 `DatumUlaza` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
 `Magacin` int(11) NOT NULL,
 PRIMARY KEY (`IDUF`),
 KEY `Dobavljac` (`Dobavljac`),
 KEY `IDSirovine` (`IDSirovine`),
 KEY `Magacin` (`Magacin`),
 KEY `ID` (`ID`),
 CONSTRAINT `sirovine_ibfk_3` FOREIGN KEY (`Magacin`) REFERENCES `magacini_sirovine` (`id_magacina`) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT `sirovine_ibfk_4` FOREIGN KEY (`IDSirovine`) REFERENCES `sirovine_nazivi` (`Sifra`) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT `sirovine_ibfk_5` FOREIGN KEY (`Dobavljac`) REFERENCES `dobavljaci` (`IDDobavljaca`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8


Hvala!
[ dusans @ 14.09.2015. 12:39 ] @
Na prvu loptu, ne treba ti sum(sirovine.Kolicina) već samo sirovine.Kolicina u izrazu za račun stanja.
E sad, verovatno ni to neće do kraja biti dobro ako imaš sirovinu u više magacina.
[ bane1234 @ 14.09.2015. 12:52 ] @
To je to, radi! Hvala puno! Radi i u vise magacina(na brzinu sto sam probao) mada taj deo jos treba da istestiram.
[ bane1234 @ 14.09.2015. 13:15 ] @
Ipak ne radi, sad dobro skida sa stanja ali kad unesem u magacin(ulaz sirovina) ne povecava stanje... mislim da mora ici sum.... ali onda opet uvecava rezultat
[ dusans @ 14.09.2015. 13:54 ] @
Pojasni malo šta ti je koja količina u kojoj tabeli.
Npr. da li jedna ista sirovina može da bude u više magacina,
i šta predstavlja Kolicina u Sirovina tabeli (količinu te sirovine
u tom magacinu ili šta)?

I na kraju, šta trebaš da dobiješ kao rezultat, makar i opisno
(ja vidim otprilike šta ti treba ali nisam siguran, nejasno je).
[ bane1234 @ 14.09.2015. 14:02 ] @
kolicina u tabeli sirovine je kolicina koja ulazi u magacin po sifri sirovine, u toj tabeli su svi ulazi u magacin.
kolicina na radnom nalogu je kolicina proizvoda koja treba da se proizvede, odatle se vuce normativ koji ima kolicinu sirovine koja se potrosi za neki proizvod, znaci kolicina sa radnog naloga * kolicina sa normativa je utrosak sirovine...
Da, ista sirovina moze biti u vise magacina.
Kao rezultat treba da dobijem stanje sirovina po magacinima(naravno ukoliko ima vise magacina, taj deo je fleksibilno napravljen - moze da radi sa jednim ili vise magacinau zavisnosti od potreba firme)
[ dusans @ 15.09.2015. 10:45 ] @
Da, tako sam i mislio al' nisam bio načisto.

Pošto za istu sirovinu u istom magacinu možeš da imaš više rekorda (ulaza)
ne preostaje ti ništa drugo nego da uradiš prvo sumiranje i grupisanje
po sirovina-magacin i onda dalje join na te rezultate (umesto kao sada direkt sa sirovine).
Dakle:

Code:

SELECT ...
FROM (SELECT IDSirovine, Naziv, Magacin, SUM(Kolicina) AS Kolicina FROM Sirovine GROUP BY IDSirovine, Magacin) AS Sirovine
left join(radni_nalozi inner join normativi on normativi ...
...


Ne radim često ovakve upite, sad ne znam da li postoji neki bolji/elegantniji način
da se radi sumiranje po dve različite linije (seta podataka) osim ovog što sam napisao.
Ako neko zna bolje, neka napiše, i mene interesuje.
[ djoka_l @ 15.09.2015. 11:22 ] @
Da li ti je ovo za vežbu, ili je realan problem?

U svakom slučaju, baza je loše dizajnirana.

Evo šta ne valja:

1. jedan radni nalog je vezan za jedan normativ i jedan magacin. Prema ostatku tabela, ispada da po jednom radnom nalogu može da se izda samo jedna sirovina iz samo jednog magacina. Šta ako neki proizvod zahteva više od jedne sirovine, a čak i ako zahteva jednu sirovinu, šta ako je količina te sirovine u bilo kom magacinu nedovoljna, pa mora da se izda iz više magacina

2. zašto dva ista ključa u tabeli nad istim poljem normativ (normativ i normativ_2)

3. zašto dva ID-a u normativima (ID i IDNormativa). Pa čak i da su ti potrebni, zašto, o zašto, foreign key iz radnih naloga gleda na IDNormativa koji nije UNIQUE umesto na ID. ID je primarni i on MORA (ne mora, ali bi bilo dobro) da bude prenet kao foreign key u radne naloge.

4. zašto opet više indeksa (čak 3) nad istim poljem.

Čak i ako su ovo sitne zamerke, šta se dešava ako se normativ promeni. Nigde ne postoji ograničenje da se ne može promeniti, pa bi to izmenilo potrošnju sirovina u prošlosti.

Kako ide radni proces?

Ja, kako zamišljam, izdavanje radnog naloga NEMA VEZE sa izdavanjem robe (sirovine) iz magacina. Pretpostavljam da neko izda radni nalog, pa da onaj koji je dobio radni nalog ide do magacina gde mu magacioner izdaje sirovinu.

Zato je totalno nelogično da se u magacinu beleži samo ulaz, a ne i izlaz robe...

A i dizajn sirovina je nelogičan. Podaci koji se beleže za ulaz robe su po svojoj prirodi više za fakturu i dostavnicu a ne za magacin. Magacin treba da ima ulaz i izlaz robe, datume i slične stvari, a cene i dobavljači tu nemaju šta da traže.