[ nebojsa.rad @ 01.09.2011. 13:06 ] @
Potrebna mi je pomoć od vas. Naime, radio se o tome da sam dobio konkretan zadatak a da se ne snalazim baš najbolje sa bazama. Na osnovu svog skromnog znanja dizajnirao sam bazu kako treba (barem tako mislim) ali sam naleteo na problem.

Baza je zamišljena da služi za evidenciju slot mašina. Svaka slot mašina se nalazi na nekoj određenoj lokaciji. Slot mašina ima na sebi tri brojčanika:
- ulaz
-izlaz
- jack pot (jp)

Nisam sposoban da napravim View koji bi trebao da sadrži informacije:

masina_ID, lokacija_ID, vremePoslednjegOcitavanja, vremePredhodnogOcitavanja, poslednjiUlaz, poslednjiIzlaz, poslednjiJP,predhodniUlaz, predhodniIzlaz, predhodniJP, kredit

Ovaj prikaz mi je potreban da bi mogao izračunati razliku brojčanika između poslednja dva očitavanja na nekoj lokaciji.

Da li sam trebao drugačije odraditi dizajn baze? Da li je view pogrešan pristup?

Dok nisam počeo pisati query nisam ni predpostavio da će mi ovo zadati toliko muka. :(

U prilogu ove poruke sam zakačio skriptu za kreiranje i popunjavanje baze kako bi me lakše razumeli.

Ako neko zna kako ovo da se reši stvarno bi mi puno značilo kad bi mi pomogao. Hvala

[ nadavesela @ 01.09.2011. 14:24 ] @
Dok se Zidar ne javi, mozda neke koristi budes imao od teme Computed DatumDo.
Ja licno bih u tabelu PopisMasine, dodala kolonu PrethodniPopisMasine_Id. Za svaki novi red, tu upisijes vrednos prethodnog PopisMasine_Id, za datu masinu i lokaciju. Preko tog PrethodniPopisMasine_Id posle imas podatke za prethodniulaz, prethodniizlaz, prethodni JackPot, vremePrethodnogPopisa

[Ovu poruku je menjao nadavesela dana 01.09.2011. u 15:38 GMT+1]

[Ovu poruku je menjao nadavesela dana 01.09.2011. u 15:41 GMT+1]
[ nebojsa.rad @ 01.09.2011. 15:03 ] @
Nisam baš siguran da sam razumeo šta bi dobio sa dodatnom kolonom PrethodniPopisMasine_Id? Ustvari, pored toga što nisam razumeo, ne znam ni kako bi izveo da dođem do ID-ja prehodnog očitavanja za tu mašinu. Kad bi znao to onda bi verovatno bilo jednostavnije da dodam u tabelu tri kolone gde bi direktno upisao vrednosti starih ulaza, izlaza i jp i onda jednostavnim kverijem računao samo razlike za MAX(vremePopisa).

Totalno sam se zaglupio. :(

[ Zidar @ 01.09.2011. 15:30 ] @
Nazalost danas nemam puno vremena, a i na forumu Access dugujem post vec dva dana pa cemo diskusiju odloziti za posle vikenda verovatno.

Dizajn koji si napravio nema nekih velikih gresaka. Sa stanovista normalizacije, to je to, uz poneku zaista sitnu ispravku (sta ce ti lokacijaID u tabeli PopisMasine, imas je vec u tabeli Masina). Kome god da podneses ovakav dizajn baze, (profesori, revidenti, projektanti), svi ce ti s pravom reci da je dizajn OK.

Medjutim, sa ovakvim dizajno, iako teorijski ispravnim, mozes kasnije da imas poprilicnih problema u praksi. Ako je ovo skolski zadatak, bas te briga za kasnije. Ali ako je ovo profesionalni zadatak, koji vlasnici masina placaju, onda mozes da budes i u grdnoj nevolji kad nesto ne bude radilo kako treba. Za lose uradjen zadatak, u skoli padnes ispit, a vlasnici kockarnica lome kolena i seku prste, za pocetak...

Ako je ovo profesionalni zahtev, Nada te je uputila u dobrom pravcu, ukoliko mozes da razumes sta smo tamo pisali. Provedi neko vreme citajuci temu http://www.elitesecurity.org/t425853-Computed-DatumDo, citaj veoma polako. Posle vikenda mozemo da popricamo detaljnije. Za sada, pokusaj da napravis tabelu koja izgleda bas kao view koji si zamislio. Jeste, bas tako, kao view koji prikazuje sve moguce prethodno-sadasnje vrednosti. Znam da ne izgleda normalizovano, to tako samo izgleda na prvi pogled. Kad se udubimo u detalje, bice jasnije.

Ako je ovo samo skolski zadatak, onda mozes da ostavis dizajn kakav jeste i pomoci cemo ti da napises kveri koji vraca ono sto ti treba. Za skolski zadatak, ono sto predlaze Nada je pretesko i samo ce ti stvoriti probleme. Profesori cesto ne prihvataju lako ovako radikalne ideje, a u ovom momentu nisi spreman da im akademski dokazes valjanost pristupa, da se izboris za svoje resenje.

Strpi se malo do utorka (sledeci ponedeljak je ovde neradni dan, produzeni vikend).

[ nadavesela @ 01.09.2011. 15:35 ] @
Zidar, a sta ako profesor prosledi resenje kockarnici?
[ Zidar @ 01.09.2011. 15:45 ] @
To onda postaje profesorov problem :-) Neka slobodno proslede, znanje je javno dobro. Medjutim, ako su brzopleti pa pogrese, jer nisu razumeli kako treba, odose kolena :-)
[ nadavesela @ 01.09.2011. 17:56 ] @
Kad nadjemo(definisemo) nacin upisa PrethodniPopisMasine_Id (moj predlog je preko Computed Kolone), omoguceno je pracenje koji red u koji red prelazi, a to s druge strane olaksava dobijanje jednostavno generalnog View-a nad kojim se mogu izvlaciti ostali potrebni pregledi (querija)

SELECT a.PopisMasine_Id,a.PrethodniPopisMasine_Id,a.masina_Id,a.lokacija_Id,a.ulaz,a.izlaz, a.jp,a.kredit,a.vremePopisa,a.storno,
b.ulaz as PrethodniUlaz,b.izlaz as PrethodniIzlaz, b.jp as PrethodniJP,b.kredit as PrethodniKredit,
b.vremePopisa as PrethodnoVremePopisa,b.storno as Prethodnostorno
FROM
(SELECT PopisMasine_Id,PrethodniPopisMasine_Id,masina_Id,lokacija_Id, ulaz,izlaz, jp,kredit,vremePopisa,storno FROM PopisMasine) a
LEFT JOIN
(SELECT PopisMasine_Id, masina_Id,lokacija_Id, ulaz,izlaz, jp,kredit,vremePopisa,storno FROM PopisMasine) b
ON a.PrethodniPopisMasine_Id=b.PopisMasine_Id
order by masina_id,lokacija_id,PopisMasine_id

Izbegava se vezivanje po masina_Id,lokacija_Id..ili vec bilo kojoj drugoj potrebnoj kombinaciji za JOIN.





[Ovu poruku je menjao nadavesela dana 02.09.2011. u 10:32 GMT+1]
[ nadavesela @ 01.09.2011. 18:34 ] @
PrethodniPopisMasine_Id moze se odrediti i preko UDF (zavisno od MasineId ili ako treba i LokacijeId...)

CREATE FUNCTION [dbo].[fn_PrethodniPopisMasine_Id](@PopisMasineId AS int,@MasinaId as int, @LokacijaId as int)
RETURNS int
AS
BEGIN
DECLARE @PrethodniPopisMasine_Id as int
SET @PrethodniPopisMasine_Id =(SELECT MAX(PopisMasine_Id) as PrethodniPopisMasine_Id FROM PopisMasine WHERE PopisMasine_Id<@PopisMasineId and [email protected] and [email protected])
RETURN (@PrethodniPopisMasine_Id)
END







[Ovu poruku je menjao nadavesela dana 02.09.2011. u 10:13 GMT+1]

Computed kolonu PrethodniPopisMasina_id kreirana sa

ALTER TABLE dbo.popisMasine
ADD [PrethodnipopisMasine_id] AS [dbo].[fn_PrethodniPopisMasine_Id]([PopisMasine_ID],[masina_ID],[lokacija_ID])

[Ovu poruku je menjao nadavesela dana 02.09.2011. u 10:25 GMT+1]
[ nebojsa.rad @ 02.09.2011. 13:24 ] @
nadavesela,
stvarno ti puno hvala. Ovo je rešenje koje mi je trebalo. Ni blizu nisam bio na dobrom putu. Iskreno, ja sam se petljao sa trigerima i pomoću njih pokušavao doći do nekog rešenja.
[ nadavesela @ 02.09.2011. 13:40 ] @
Nema na cemu. Ubaci jedan zeton u masinu, umesto mene.
[ nebojsa.rad @ 02.09.2011. 14:08 ] @
Pokusavam rešiti ovaj zadatak što kvalitetnije. Voleo bi kad bi Zidar prokomentarisao koji sve problemi mogu nastati zbog ovog dizajna baze.