|
[ Srbin do jaja @ 25.08.2009. 21:45 ] @
| evo u cemu je stvar. recimo da postoji rent a car, hotel, ili bilo sta drugo sto koristi od do datum i zelim da proverim period van tog (tih) intervala kada je nesto dostupno/slobodno. pa sad ne znam kako logicki da pridjem problemu da u accessu napravim upit koji ce mi dati kada je svako vozilo/sobu/bilo sta drugo dostupno (od kog datuma do kog datuma).
na primer auto 1 moze biti iznajmljen 1.8.2009. do 5.8.2009 pa opet iznajmljen 8.8.2009. do 10.8.2009. a recimo danas je 3.8.2009. i sad ja pokrenem upit i on treba da mi pokaze slobodan je od 6.8.2009 do 7.8.2009 i od 11.8.2009 pa nadalje.
hvala unapred
ps ne posedujem neko veliko znanje programiranja u accessu. samo neke osnove. |
[ smal @ 26.08.2009. 00:41 ] @
Citat: Srbin do jaja: i sad ja pokrenem upit i on treba da mi pokaze slobodan je od 6.8.2009 do 7.8.2009 i od 11.8.2009 pa nadalje.
ps ne posedujem neko veliko znanje programiranja u accessu. samo neke osnove.
Ako ti je samo ovo problem, onda mislim da nema potrebe da potežeš Access. MS Outlook i njegov kalendar je, čini mi se, primereniji takvim zadacima.
Em je lep i šaren, em što ne moraš da znaš programiranje i baze podataka :) Sa dva klika napraviš upit kojim dobijaš željenu informaciju...
Naravno, ukoliko je navedeni problem delić neke veće aplikacije, onda daj i nešto više podataka (koji podaci, kakve tabele...), pa da mozgamo...
[ Take 5 @ 26.08.2009. 01:34 ] @
^^ To mu dođe kao npr. evidencija video kluba...
U tabeli promet koja ima sledeća polja:
•šifra objekta koji se izdaje
•datum zaduženja
•datum razduženja
Treba da proveriš sledeći uslov: Da li u tabeli promet postoji polje sa šifrom objekta a da je datum razduženja prazan?
Objekat nije razdužen (znači da je zauzet), a ako ne postoji u toj tabeli sa takvim uslovom znači da je slobodan
Možda bi pomoglo i polje "zaduženje", tipa: true/false ...mada bi verovatno bilo nepotreban višak(?)
[ Getsbi @ 26.08.2009. 08:13 ] @
Da bi dobio informaciju koji su to dani slobodni, moraš imati neku tabelu sa datumima. Nešto kao kalendar. Ubacio sam dane od 31.07.2009 do 15.08.2009 i tvoje periode zauzetosti. Pokreni upit "qrySviSlobodniDani".
[ chachka @ 26.08.2009. 08:50 ] @
Čini mi se da je na ovakvo pitanje dat uopšten odgovor u temi SQL mozgalica broj 4. Možda nije loše da se pogleda i ta tema.
[ Srbin do jaja @ 26.08.2009. 21:59 ] @
Citat: Da bi dobio informaciju koji su to dani slobodni, moraš imati neku tabelu sa datumima. Nešto kao kalendar. Ubacio sam dane od 31.07.2009 do 15.08.2009 i tvoje periode zauzetosti. Pokreni upit "qrySviSlobodniDani".
postoji malo problemcic kod tvog predloga. prvo recimo da ima vise razlicitih vozila i kad pokrenem qviri da vidim koja su slobodna pokazace mi sve datume koji nisu zauzeti al necu znati koje vozilo je slobodno. i da li je to moguce uraditi da se vidi period. tipa vozilo te i te registracije slobodno je od 6.8.2009 do 7.8.2009.
pa ponovo slobodno od 11.8.2009. do 31.12.2100. jer ako ubacim bar jos jedno vozilo sa razlicitim datumima, ima cu jednu dugacku nepreglednu listu.
nadam se da ovo sto sam napisao ima nekog smisla.
al daj da postavim tabele bar.
Code:
tblCustomer: Customer ID (PK) Name LastName Address City
tblVehicles: Vehicle License (PK)
tblBooking: Vehicle License Customer ID
tblDates: Dates
[ Scelle @ 27.08.2009. 09:36 ] @
Meni je Zidar jednom davno pokusoa da objasni logiku datuma ovdje:
http://www.elitesecurity.org/t276216-0#1642790
[ Zidar @ 27.08.2009. 14:52 ] @
@ Srbin do jaja: problem koji resavas nije jednostavan niti je za pocetnika, pa mozda i ne bude sve jasno. U stvari iams dva problema:
1) kako u SQL raditi sa datumima i intervalima
2) kako to isprogramirati u Accessu
- Getsbi ti je dao resenje koje se verovatno najlakse realizuje.
- Postoji i drugi nacin, bez upotrebe kalendar tabele,a li je mnogo komplikovano. Nesto od toga se moze videti u mozgalici na koju te uputio Chachka.
- Scelle ti je dao dobar link za razumevanje intervala, vid pretposlednju poruku. medjutim, ti na prvi pogled nemas uporedjenje intervala nego zelis da vidis sve dane kada je neko vozilo slobodno.
Znaci, ostaje ti ono od Getsbiaj, da se doradi. Primeti da Getsbijevo resenje na kraju daje listu dana kada je vozilo slobodno. Ta lista ne sadrzi sve kalendarske dane, izbaceni su oni kad je vozilo zauzeto. Intervali se mogu izvaditi iz liste, ali su kveriji komplikovani.
Ako ti treba resenje za konkretan projekat, daj zakaci konkretnu bazu sa stvarnim tabelama i nesto podataka, pa cemo pokusati da napisemo konkretne kverije i ne pitaj nista dalje.
Ako je pitanje teorijsko, kao ucis za ispit ili slicno, ponovo, daj konkretnu bazu sa konkretnim tabelama (bez razmaka u imenima tabela i kolona, please) pa cemo pokusati da razmotrimo nekoliko resenja. Nije fer da Getsbi sam sastavlja bazu da bi ti utvrdio da njegove tabele nisu kao sto si ti zamislio.
Dakle, daj bazu sa konkretnim podacima i kazi da li je u pitanju skolski rad ili konkretan projekat. U oba slucaja cemo ti pomoci, jer je problem suvise tezak i ne mozemo ti reci 'idi procitaj neku knjigu o Accesu, pa se javi za neki mesec'. Ovo uglavnom nema u knjigama.
[ Zidar @ 27.08.2009. 22:17 ] @
Evo da dopunimo Getsbijevo resenje i da pokazemo i drugi nacin.
Kveriji qryZauzeceVozila_G i qryZauzeceVozlia_Z su dva nacina prikazivanja zauzetosti vozila. I jedan i drugi nacin imaju prednosti i mane jedan nad drugim, u smislu prikaza i citljivosti rezultata. Kad bih ja radio aplikaciju, oba nacina bi nasla primenu, direktno ovako ili kao osnova za druge prikaze podataka.
Oba nacina su relativno komplikovana za pisanje. Query Grid ne pomaze niti wizardi. Kako sve radi? Krenite unazad i gledajte koji kveri ulazi u SQL za onaj koji posmatrate.

[ captPicard @ 28.08.2009. 09:32 ] @
Vidim da si dobio već dosti odgovora, ali evo kako ja to radim, možda ti pomogne...
(Popis soba koje su slobodne na određeni dan)
Code: 'select j.sifra, j.naziv, j.sifra_str str, t.naziv struktura ' +
'from sobe j, strukture t ' +
'where j.sifra_str=t.sifra and j.sifra_so= :sifraobj
' and not exists ' +
'(select sifra_sj ' +
' from check_in ' +
' where check_in.sifra_sj = j.sifra ' +
' and :zadatum
' between check_in.datum_od and check_in.datum_do) ' +
'and ' +
'not exists( ' +
' select s.sifra_sj ' +
' from rezervacije_sj s, rezervacije r ' +
' where ' +
' s.broj_rez=r.broj and ' +
' s.sifra_sj = j.sifra ' +
' and r.oznaka = ''p'' ' +
' and :zadatum
' between r.dolazak and r.odlazak) order by sifra';
[Ovu poruku je menjao captPicard dana 29.08.2009. u 15:06 GMT+1]
[ Srbin do jaja @ 29.08.2009. 20:31 ] @
ne treba mi nista konkretno. malo se igram sa accessom, gledam tutoriale na youtubu i citam help iz samo accessa. samo me uhvatila znatizelja. interesovalo me je na koji nacim moram logicki da razmisljam ne bi li resio ovakav problem na jednostavan nacin. al ocigledno da je problem slozeniji.
[ Getsbi @ 31.08.2009. 17:14 ] @
Proverio sam fajl Iznajmljivanje_Get_Zid.rar - 14.44k. Rešenje je impresivno. Moram da priznam da bih ja stao na pola i pribegao pisanju VBA koda nad tabelom tblIznajmljivanje radi postizanja iole prihvatljivog rešenja
[ Srbin do jaja @ 31.08.2009. 23:55 ] @
@Iznajmljivanje_Get_Zid.rar - 14.44k
mislim da treba jos jedan uslov u qryPregledZauzecaVozilaOstaliRedovi.
Code: SELECT A.AutomobilID, A.DatumPocetka AS ZuzetOd, A.DatumZavrsetka AS ZauzetDo,
A.DatumZavrsetka+1 AS SlobodanOd, (SELECT MIN(DatumPocetka)
FROM tblIznajmljivanje As B
WHERE A.AutomobilID = B.AutomobilID
AND B.DatumPocetka > A.DatumZavrsetka)-1 AS SlobodanDo
FROM tblIznajmljivanje AS A
ORDER BY A.AutomobilID, A.DatumPocetka;
evo sta se desava. na primer, kada VS-222-333 je zauzet 1.8.2009 do recimo 2.8.2009 a ponovno je zauzet 3.8.2009 do ne bitno sada kojeg datuma. i kad se pokrene ovaj uput, access ce pokazati sledece automobilID VS-222-333, ZauzetOd 1.8.2009, ZauzetDo 2.8.2009, SlobodanOd: 3.8.2009, SloobodanDo: 2.8.2009
sta se desava, slobodanOd uzima prethodni zauzetDo i dodaje jedan dan, a slobodniDo uzima sledeci zauzetOd i oduzima jedan dan. i tako dolazi do apsurda prvo da je datum slobodanOd isti kao i zauzetOd sledeceg unosa, kao i da je slobodanDo manju od slobodanOd.
pretpostavljam da se ovo moze resiti sa nekom IF ili IIF funkcijom. malo sam ceprkao po access help file, samo ja ne znam kako. ipak znam samo neke najjednostavnije stvari iz sql.
ako ima jedan dan izmedju zauzetDo i zauzetOd sledeceg unosa, onda upit lepo pokaze slobodanOd i SlobodanDo (upisan je isti datum) sto je ok.
[ Zidar @ 01.09.2009. 13:42 ] @
@Srbin do jaja: u pravu si. Svaka cast na zapazanju i razumevanju logike upita.
Kveri lepo radi za sve slucajeve koji imaju konacen inervale Od-Do. Za slucajeve kad je OD ili DO neodredjen, moraje se pisati posebni upiti koji s eposle 'nalepe' na osnovni. Ja sam to uradio za neodredjeno OD, ali nisam za DO. Trenutno imamo negde u kverijima nesto sa UNION, treba nam jos jedan UNION. Ako stignem danas, uardicu i taj deo.
:-)
[ captPicard @ 01.09.2009. 13:52 ] @
Citat: Zidar: @Srbin do jaja: u pravu si. Svaka cast na zapazanju i razumevanju logike upita.
Kveri lepo radi za sve slucajeve koji imaju konacen inervale Od-Do. Za slucajeve kad je OD ili DO neodredjen, moraje se pisati posebni upiti koji s eposle 'nalepe' na osnovni. Ja sam to uradio za neodredjeno OD, ali nisam za DO. Trenutno imamo negde u kverijima nesto sa UNION, treba nam jos jedan UNION. Ako stignem danas, uardicu i taj deo.

Sada bubam, ne radim baš puno u Access-u, ali možda je moguće napraviti slijedeće:
Ako datum nije definiran uzmi datum 31.12.3000 (u drugim bazama postoji funkcija COALESCE) i onda ako je taj datum,
sa iif se definira iif(datum_do = '31.12.3000', 'nepoznato', datum_do)
A slučaj kada je Datum_od nedefiniran a Datum_do definiran se ne bi smio dogoditi, makar se može riješiti na sličan način.
Ako sam bubnuo glupost, ispričavam se... 
[ Zidar @ 01.09.2009. 13:59 ] @
Povlacim prethodni post, nije problem u poslednjem, problem je u unutrasnjem delu. Ono dodavanje +1 ili -1 sa datumima je 'tricky'. Pogledacu, pa cu se javiti. Moguce je da je potreban potpuno drugaciji pristup. Ne volim da upotrebljavam IIF u kveriju, ali videcemo, kad su datumi u pitanju nema pravila.
[ Zidar @ 01.09.2009. 16:52 ] @
Kao sto sam mislio, mora da se promeni pristup kompletno. Evo resenja koje ne pravi gresku kad se intervali zauzetosti dodiruju (jedno izavanje zavrseno danas, i autio se izdaje vec sledeceg dana).
Kvari koji daje rezultate je qryZauzeceVozila. To je UNION sledecih kverija:
Code:
SELECT AutomobilID, Status, Od, Do
FROM (SELECT AutomobilID, Status, Od, Do
FROM qrySlobodniPrviRed
UNION ALL
SELECT AutomobilID, Status, Od, Do
FROM qryZauzeti
UNION ALL
SELECT AutomobilID, Status, Od, Do
FROM qrySlobodniSrednjiRedovi
UNION ALL
SELECT AutomobilID, Status, Od, Do
FROM qrySlobodniPoslednjiRed
) AS X
ORDER BY AutomobilID, Od;
Svi kveriji u ovom izrazu dolaze direktno iz tblIZnajmljivanje osim qrySlobodniSrednjiRedovi. Taj dolazi iz qrySrednjiRedovi_B koji dolazi iz qrySrednjiRedovi_A koji dolazi iz tblIznajmljivanje.
Nije jednostavno, ali tu se ne moze nista.

[ Zidar @ 01.09.2009. 17:00 ] @
Evo i malo doterano resenje koje je dao Getsbi. Prikaz zauzeca na svaki kalendarski dan je jako lepa stvar za izvestaje.
Finalni kveri je qryAutomobilDan_Status. On dolazi iz qrySviZauzetDani i qryAutomobilDan. qrySviZauzetDani dolazi iz qryIznajmljivanje a ovaj iz (tblIznajmljivanje, tblAutomobili). qryAutomobilDan dolazi iz tblAutomobili i tblDatumi - dekartov proizvod automobila i dana.
Kveriji qrySviZauzetDani dolazi iz qryIznajmljivanje su isti koje je Getsbi dao u prvom resenju. tabelu tblDatumi sam popunio datumima od 1 Jan 2000 do neke 2017 godine. Datumi su napravljeni pomocu tabele brojeva, zBrojevi i kverija zqryNapraviDatume.
Treba mi neko vreme da pronadjem kako se od kverija qryAutomobilDan_Status pravi izlaz koji prikazuje intervale zauzeca, kao u prethodnom postu. kad se setim, zakacicu primer.

[ Srbin do jaja @ 10.09.2009. 18:29 ] @
imam jos jedno pitanje. nije konkretno u vezi ovog problema ali se tice datuma. kako treba da mi glasi criteria u upitu ako zelim da vidim podatke od recimo trenutnog datuma, pa unazad svi protekli dani tog meseca plus 11 meseci unazad ne razunajuci trenutni mesec jer vec racunamo dane tog meseca.
[ Zidar @ 11.09.2009. 14:43 ] @
Citat: zelim da vidim podatke od recimo trenutnog datuma, pa unazad svi protekli dani tog meseca plus 11 meseci unazad ne razunajuci trenutni mesec jer vec racunamo dane tog meseca.
Za interval trebaju ti dva datuma, Od i Do. Do je ocigledno danasnji datum. Od je neki datum u proslosti koji racunas po pravilu koje si izneo. Pogledaj funkcije DateAdd, dateDiff i slicno. Nesto ovako bi odradilo posao (pesudo kod)
Danasnji datum, bez sati, minuta, sekundi:
? date()
9/11/2009 ' format datuma kod mene je mm/dd/yyyy kod tebe ce se pojaviti verovatno 11.9.2009
Oduzimam 11 meseci od danasnjeg datuma:
? dateadd("m",-11, date())
10/11/2008
Dobio sam 11 Oktobar 2008, a meni treba 1 Oct
Znaci, treba da oduzmem onoliko dana koliko je proslo u ovom mesecu, i dodam 1.
(Kad se sabiraju/oduzimaju dani cesto treba dodati ili oduzeti jedinicu, pa probas dok ne upali)
? dateadd("m",-11, date()) - day(date())+1
10/1/2008 '1 Oktobar 2008, ono sto mi treba
Znaci, tvoj [Do] datum bi bio Date().
[OD] datum bi bio dateadd("m",-11, date()) - day(date())+1
Prouci funkcije za rad sa datumima 
[ Srbin do jaja @ 12.09.2009. 19:23 ] @
ovako sam ga uradio i radi kako treba! :) hvala zidaru.
ps. zidar, ima li koja ebook da preporucis da procitam u vezi tih funkcija?
Code: SELECT T_Dates.Dates
FROM T_Dates
WHERE (T_Dates.Dates)>=(DateAdd("m",-11, Date())-day(date())+1)
AND (T_Dates.Dates)<=Date();
[ Zidar @ 14.09.2009. 17:56 ] @
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|