Imam 2 tabele. Jedna sadrzi id, id korisnika, datum, start_time, end_time i namjenjena je za pamcenje pauza radnika. Druga je slicna samo sto pamti radno vrijeme radnika. Npr u prvoj mogu imati unos tipa: 1, 1, 2013-02-05, 480, 490. Gdje je 480, kad se podjeli sa 60, 8 sati ujutro, a 490 predstavlja 8:10 minuta ujutro. Npr. neko je otisao na pauzu da ispusi cigarau i ostao 10 minuta. Pauza moze biti vise. Druga tabela moze imati unos npr. : 1, 1, xyz, 2013-02-05, 490, 660, gdje je xyz ime nekog posla koji je radio a 490 znaci da je poceo raditi u 8:10 i radio do 11 sati (660). Dakle, vrijeme se pamti u minutama.
Ono sto trebam napraviti je da se ne dozvoli preklapanje vremena. Npr. u gornjem slucaju radnik ne moze unjeti pocetak radnog vremena 8, jer je do 8:10 bio na pauzi. Isto tako ne moze unjeti da je poceo raditi neki posao2 u 10:30 jer je radio posao1 do 11:00 sati. Kako sam ovo rijesio? Imam dva polja za unos: start_time i end_time. Prodjem kroz navedene tabele da vidim da li ijedan posao ili pauza sa danasnjim datumom ima end_time veci od start_time-a koji upravo unosim. Ukoliko je tako javim gresku a ako nije dozvolim unos. Medjutim ovo i ne radi bas tako. Moj upit je tipa:
SELECT COUNT(*) FROM zeiterfassung, breaks WHERE zeiterfassung.end_time > $start_time OR breaks.end_time > $start_time AND zeiterfassung.datum = ‘$datum’…itd.
ako je count 0 dozvoli unos a ako nije javi gresku. Medjutim ovo mi uvijek vrati gresku. Kontam da je neki problem sa OR.
Jos veci je problem kad se unese nekoliko stavki (pauza i radnih sati), pa se zatim neka od njih obrise (i to je dozvoljeno), tada dobijem “rupu” u vremenu koji je ta stavka zauzimala. Kako da pri unosu nadjem i takvo nesto pa dozvolim da se ta rupa “popuni”? Npr. radio sam nesto od 11 do 13 i onda to obrisao. Treba da od 11 do 13 mogu ponovo unjeti neki posao. Problem je sto ja imam neki unos od 13 do 16 (kraj ranog vremena) i moj kod vidi da je zadnji end_time 16 i ne dozvoljava unos prije njega.
Kad imas TIME polje mozes raditi stvari tipa datum1 < datum2 u queryju da provjeris jel se datum1 desio prije datum2, a mozes dobit unix timestamp sto u mysqlu (UNIX_TIMESTAMP(datum1)) sto u phpu (strtotime($datum1)).
Ostace ipak INT polje za vrijeme a i nije to tako vazno. Sto se tice onih preklapanja vremena sto sam pisao ovo mi predlaze sef (navodno bi rijesilo sva ta preklapanja):
$overlay = db_result(db_query("SELECT COUNT(*) FROM zeiterfassung, breaks WHERE ((zeiterfassung.start_zeit < $start_zeit AND zeiterfassung.end_zeit > $start_zeit) OR
(zeiterfassung.start_zeit < $end_zeit AND zeiterfassung.end_zeit > $end_zeit) OR (breaks.start_zeit < $start_zeit AND breaks.end_zeit > $start_zeit) OR
(breaks.start_zeit < $end_zeit AND breaks.end_zeit > $end_zeit) AND zeiterfassung.datum = '$tag' AND zeiterfassung.uid = '$uid')"));
i ako je overlay nula dozvoli pisanje a ako nije ne dozvoli.
Medjutim ovdje je overlaj uvijek != 0.
Takodje mi je rakao da je to ok kod, samo ga malo treba popraviti. Ja ne kontam sta. Eto mozda vi vidite nesto sto ja ne vidim.
$overlay = db_result(db_query("SELECT COUNT(*) FROM zeiterfassung, breaks WHERE ((zeiterfassung.start_zeit < $start_zeit AND zeiterfassung.end_zeit > $start_zeit) OR
(zeiterfassung.start_zeit < $end_zeit AND zeiterfassung.end_zeit >= $end_zeit) OR (breaks.start_zeit < $start_zeit AND breaks.end_zeit > $start_zeit) OR
(breaks.start_zeit < $end_zeit AND breaks.end_zeit > $end_zeit)) AND (zeiterfassung.datum = '$tag' AND zeiterfassung.uid = '$uid')"));
Posto su ostali zauzeti raspravom po trugim temama, ako nekog zanima naci ce sta je u ovom kodu zamjenjno, tako da sad radi kako sam ocekivao.