Vec si uradio skoro sve.
Tvoj SQL statment MORAS da sacuvas kao view, pod nekim imenom, recimo ovako:
CREATE VIEW vwUlazIzlaz
AS
select DATUM, SIFRAARTIKLAUlaz AS SifraArtikla, NAZIVARTIKLA, JEDINICAMERE, KOLICINAULAZ, 0 as KOLICINAIZLAZ
from ULAZ
union
select DATUM, SIFRAARTIKLA, NAZIVARTIKLA, JEDINICAMERE, 0 AS KOLICINAULAZ , KOLICINAIZLAZ
from IZLAZ
ORDER BY sam izbacio, ne treba ti kad radis UNION
Imas dakle view vwUlazIzlaz koji prikazuje sve transakcije u tabelama ULAZ i IZLAZ. Kako dobiti ukupne zbirove? Pa pomocu agregatnih funkcija. U principu, treba da uradis nesto ovako:
CREATE VIEW vwStanje
AS
SELECT SifraArtikla, NAZIVARTIKLA, JEDINICAMERE,
SUM(KOLICINAULAZ) AS UkupanUlaz,
SUM(KOLICINAIZLAZ) AS UkupanIZlaz
FROM vwUlazIzlaz
GROUP BY SifraArtikla, NAZIVARTIKLA, JEDINICAMERE
ORDER BY SifraArtikla, NAZIVARTIKLA, JEDINICAMERE
Sada ti je Stanje u nekom sledecm koraku Stanje = UkupanUaz - UkupanIzlaz. Ovo mozes da izracunas i u SELECT iskazu:
CREATE VIEW vwSTanje
AS
SELECT SifraArtikla, NAZIVARTIKLA, JEDINICAMERE,
SUM(KOLICINAULAZ) AS UkupanUlaz,
SUM(KOLICINAIZLAZ) AS UkupanIZlaz,
STANJE = SUM(KOLICINAULAZ) - SUM(KOLICINAIZLAZ)
FROM vwUlazIzlaz
GROUP BY SifraArtikla, NAZIVARTIKLA, JEDINICAMERE
ORDER BY SifraArtikla, NAZIVARTIKLA, JEDINICAMERE
Jedini problem sa ovim pristupom su neaktivni artikli. Neaktivni su onio artikliza koje nije bio ni jedan ulaz, i ni jedan izlaz. U tom sluvcaju, UNION view ih nece videti pa se nece pojaviti ni na sumi. Ako je bio bar jedan ulaz, ili bar jedan izlaz (ne mora oba), sve je OK, jedan od komponenti UNIONa ce to pokupiti. Ako hoces da prikazes i neaktivne artikle, treb ati jos jedan view, ovako:
CREATE VIEW vwStanjeSaneaktivnimArtiklima
AS
SELECT A.SifraArtikla, S.NAZIVARTIKLA, S.JEDINICAMERE, S.UkupanUlaz, S.UkupanIZlaz, S.Stanje
FROM Artikli AS A
LEFT JOIN vwSTanje AS S ON A.SifraArtikla = S.SifraArtikla
Neaktivni artikli imace NULL vrednosti za S.UkupanUlaz, S.UkupanIZlaz, S.Stanje, sto se na front endu moze lako pretvoriti u nule (zero)
Mozda bi brza varijanta bila da se STanej izvadi iz vwStanje i da se ubaci u poslednji view:
CREATE VIEW vwUkupanUlazIzlaz
AS
SELECT SifraArtikla, NAZIVARTIKLA, JEDINICAMERE,
SUM(KOLICINAULAZ) AS UkupanUlaz,
SUM(KOLICINAIZLAZ) AS UkupanIZlaz
FROM vwUlazIzlaz
GROUP BY SifraArtikla, NAZIVARTIKLA, JEDINICAMERE
ORDER BY SifraArtikla, NAZIVARTIKLA, JEDINICAMERE
CREATE VIEW vwStanjeSaneaktivnimArtiklima
AS
SELECT A.SifraArtikla, S.NAZIVARTIKLA, S.JEDINICAMERE,
S.UkupanUlaz, S.UkupanIZlaz,
S.UkupanUlaz, - S.UkupanIZlaz AS Stanje
FROM Artikli AS A
LEFT JOIN vwSTanje AS S ON A.SifraArtikla = S.SifraArtikla
Prosto i jednostavno ;-)
Tri view-a i gotov posao. Delphi ima samo da prikaze rekorde iz poslednjeg view-a i formatira brojeve (i mozda konvertuje NULL vrednosti u 0)