Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Poslednji dan u nedelji i sedmicni izvestaji

[es] :: Access :: Poslednji dan u nedelji i sedmicni izvestaji

[ Pregleda: 2655 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Zidar
Canada

Moderator
Član broj: 15387
Poruke: 3085
*.eqao.com



+79 Profil

icon Poslednji dan u nedelji i sedmicni izvestaji17.05.2004. u 15:59 - pre 242 meseci
Imao sam zanimljiv problem da resavam ovih dana pa mi se ucinilo da je pitanje "od opsteg znacaja". Ovako. Programeri u jednoj velikoj banci upisuju sta su i kada radili. Za svaki dan ima po nekoliko recorda, koji izgledaju kao (EmployeeID, ActDate, ProjectID, HoursWorked). Svaki zaposleni (employee, EmployeeID) radi na nekoliko projekata (ProjectID). Bilo kog dana svako moze da radi na jednom ili vise projekata. U tabelu se upisuje na kom projektu i koliko sati su ljudi radili.

Pitanje je kako dobiti sedmicne izvestaje po programeru, po projektu, zbir sati, koliko para to vredi i tako dalje. Bilo bi lako kad bi u tabeli bilo polje koje odredjue ID svake radne sedmice. Tog polja nema, a svaki datum pripada nekoj sedmici. U toj banci, sedmice se identifikuju na osnovu poslednjeg radnog dana. Na zapadu je uobicajeno da se kaze na primer "report for the week ending 5/21/2004". Za danasnji dan, week ending je sledeci petak, 5/21/2004. Za sutrasnji dan, pa za sredu, cetvrtak week ending dan je takodje 5/21/2004. I Petak, 5/21/2004 spada u tu istu radnu nedelju, pa je i za sam petak week ending dan opet taj isti 5/21/2004.
U subotu pocinje nova sedmica i za sve njene dane bice week ending dan petak, 5/28/2004.

Izraz
Code:
 NextEoW = datDate + (intDayConst - (datDate Mod 7)) 
vraca week ending date. Koji dan je week ending date, to odredjuje intDayConst. Treba upotrebiti sledece vrednosti intDayConst :
1 = Nedelja
2 = Ponedeljek
3 = Utorak
4 = Sreda
5 = Cetvrtak
6 = Petak
7 = Subota

Znaci,
Code:
 NextEoW = datDate + (6- (datDate Mod 7)) 
dace nam sledeci petak za zadati datDate. Super, za sve slucajeve, osim kada je datDate petak. Tada dobijamo - sledeci petak, nedelju dana kasnije. Posto smo rekli da petak pripada svojoj nedelji, onda mora malo da se modifikuje funkcije pa se dobije ovo:
Code:

Function NextEoW(datDate As Date, intDayConst As Integer) As Date
'For any given datDate calculates next DayOfWeek, specified as intDayConst
'intDayConst IN (vbSunday, vbMonday, vbTuesday, vbWednesday, vbThursday, vbFriday, vbSaturday)
' same as (1,2,3,4,5,6,7)
'Example: want to find next Friday for given date #5/18/2004# = 18 May 2004
'Call: NextDoW(#18 may 2004#,vbFriday)
'
If Weekday(Date) = intDayConst Then
    'This prevents moving end of week to the enxt week
    NextEoW = datDate
Else
    'This calculates Next Friday or so,just as NextGivenDay()
    NextEoW = datDate + (intDayConst - (datDate Mod 7))
End If
End Function


Kako sad do kverija koji sumira stavri po radnim sedmicama? Pa mozemo da upotrebimo funkciju u kveriju ili da malo preradimo IF Then ELSE statement i dobijem nesto kao:
Code:

SELECT tblAvailableDates.ID, tblAvailableDates.ActDate, IIf(Weekday([ActDate])=1,[ActDate],[ActDate]+(1-([ActDate] Mod 7))) AS NextSunday
FROM tblAvailableDates;

Ona jedinica u SQL statmentu predstavlja dan koji je week ending - uovom slucaju Nedelja. Umesto 1 mozete da stavite brojeve od 1 do 7, 1= nedelja.. 7=Subota.

Ako neko ima bolje resenje, sa zadovoljstvom cemo da to uvrstimo u bazu znanja. Komentari i pitanja dobrodosli.

:-)
 
Odgovor na temu

mladenovicz
Zeljko Mladenovic
Xoran Technologies, Inc., Ann Arbor, MI,
USA / Software Engineer
Ann Arbor, MI, USA

Član broj: 6598
Poruke: 2065
62.108.109.*

Jabber: mladenovicz@elitesecurity.org
ICQ: 95144142
Sajt: yubc.net/~mz


Profil

icon Re: Poslednji dan u nedelji i sedmicni izvestaji17.05.2004. u 17:20 - pre 242 meseci
Mozda nisam razumeo kako treba, ali zar ne bi i ovo radilo

Code:

SELECT SUM(..) ... WHERE Format(ActDate,'ww/yyyy')= Format(EndWeekDate,'ww/yyyy', FirstDayOfWeek).

 
Odgovor na temu

Zidar
Canada

Moderator
Član broj: 15387
Poruke: 3085
*.eqao.com



+79 Profil

icon Re: Poslednji dan u nedelji i sedmicni izvestaji17.05.2004. u 20:30 - pre 242 meseci
Odlicna ideja, mada nije bas potpuno isto. Dok sam probao tvoju ideju nasao sam ozbiljnu gresku u mom resenju (radi dobro za kad je Subota poslednji dan u nedelji, a za ostale gresi ponekad).

Tvoje resnje za svaki zadati datum pronalzi redni broj sedmice u godini, sto moji knjigovodje smatraju jako korisnim u svakom slucaju. Slicno je onome sto meni treba, ali nije isto. Meni treba ovako: Subota je poslednji dan u sedmici, ili bilo koji drugi dan. Za svaki zadati dan odrediti njegvu sedmicu, ali ne kao redni broj sedmice, nego preko Subote u toj sedmici (ili odabranog dana).

Ima li neko ideju?
 
Odgovor na temu

mladenovicz
Zeljko Mladenovic
Xoran Technologies, Inc., Ann Arbor, MI,
USA / Software Engineer
Ann Arbor, MI, USA

Član broj: 6598
Poruke: 2065
62.108.109.*

Jabber: mladenovicz@elitesecurity.org
ICQ: 95144142
Sajt: yubc.net/~mz


Profil

icon Re: Poslednji dan u nedelji i sedmicni izvestaji18.05.2004. u 09:50 - pre 242 meseci
Problematika mi je manje vise poznata, posto sam ja nesto slicno pravio. Radio sam sajt (ASP + Access) za firmu u kojoj radim i mi programeri (consultanti) isto tako upisujemo vreme koje smo radili na nekom projektu (s tim sto mi imamo i Description sta je radjeno :)). Elem, tu postoji izmedju ostalog i filtriranje zapisa po nedeljama, gde sam koristio kod iz prethodnog posta (pocetak nedelje je vbMonday), pa je bilo malo jednostavnije.

Koliko ja razumem, tebi je ulazni parametar datum koji predstavlja kraj radne nedelje. Znaci, ako je ulazni datum "5/21/2004", datumi koji su ti potrebni su:
5/15/2004, 5/16/2004, 5/17/2004, 5/18/2004, 5/19/2004, 5/20/2004 i 5/21/2004.

Ovaj kod, na primer

Code:

Dim d   As Date
Dim ew  As Date

    d = "1/1/2004"
    ew = "5/21/2004"

    For i = 0 To 365
        If Format(d, "ww/yyyy", (Weekday(ew) Mod 7 + 1)) = Format(DateAdd("d", -6, ew), "ww/yyyy", (Weekday(ew) Mod 7 + 1)) Then
            Debug.Print d
        End If
        d = DateAdd("d", 1, d)
    Next


daje

5/15/2004
5/16/2004
5/17/2004
5/18/2004
5/19/2004
5/20/2004
5/21/2004

tj. 7 sukcesivnih datuma, zakljucno sa datumom koji je prosledjen kao ulazni parametar.

Poenta je da redni broj nedelje u godini prilagodis svojim potrebama.

Ako ovo nije resenje tvog problema, daj jos informacija, pa da mozgamo :)
 
Odgovor na temu

Zidar
Canada

Moderator
Član broj: 15387
Poruke: 3085
*.eqao.com



+79 Profil

icon Re: Poslednji dan u nedelji i sedmicni izvestaji18.05.2004. u 14:10 - pre 242 meseci
Hvala ti na trudu! :-) Iz ko zna kog razloga nisam upotrebljavao Format funkciju na ovaj nacin i moram da priznam da je korisno i zanimljivo.

Sto se tice mog problema, to je inverzija funkcije koju si dao u poslednjem postu. Ti si uspesno pokazao kako se za zadati ulazni datum "Petak, 5/21/2004" dobiju svi dani koji cine njegovu radnu sedmicu
5/15/2004
5/16/2004
5/17/2004
5/18/2004
5/19/2004
5/20/2004
5/21/2004
Meni treba obrnuto. Kad zadam bilo koji od ovih 7 datuma, da mi vrati 5/21/2004. Dakle, naci funkciju f(nekiDatum, "petak") koja vraca prvi sledeci petak za nekiDatum. Na primer

f(#5/15/2004#,"petak") treba da vrati #5/21/2004#
f(#5/17/2004#,"petak") treba da vrati takodje #5/21/2004#
f(#5/21/2004#,"petak") treba da vrati takodje #5/21/2004#

U medjuvremenu sam pronasao funkciju koja ovo radi korektno. Ne koristi Format, ali bi bilo dobro da vidimo kako moze pomocu Format. Na kraju bi bilo lepo da sve to mozemo da strpamo u kveri, bez pozivanja fukncija.

Moja ispravljena funkcija radi ovako:
Code:

Function FirstTargetDay(datStart As Date,intTargetWeekDay As Integer ) As Date
'Inputs:
'   intTargetWeekDay = dan koji oznacava kraj sedmice, upotrebiti
'       1=Sunday, 2=Moday, 3=Tuesday, 4=Wednesday, 5=Thursday, 6=Friday, 7=Saturday
'   datStart =  dan za koji trazimo WeekEnding (prvi sledeci "petak" ili "subota" ili "nedelja"...)
'
    Dim datReturn As Date
    If Weekday(datStart) <= intTargetWeekDay Then
        datReturn = datStart + intTargetWeekDay - Weekday(datStart)
    Else
        datReturn = datStart + intTargetWeekDay - Weekday(datStart) + 7
    End If
    Debug.Print Format(datStart, "dddd, mmm dd, yyyy"), Format(datReturn, "dddd, mmm dd, yyyy")
    FirstTargetDay = datReturn
End Function


Hvala na pomoci jos jednom
:-)
 
Odgovor na temu

mladenovicz
Zeljko Mladenovic
Xoran Technologies, Inc., Ann Arbor, MI,
USA / Software Engineer
Ann Arbor, MI, USA

Član broj: 6598
Poruke: 2065
62.108.109.*

Jabber: mladenovicz@elitesecurity.org
ICQ: 95144142
Sajt: yubc.net/~mz


Profil

icon Re: Poslednji dan u nedelji i sedmicni izvestaji18.05.2004. u 14:44 - pre 242 meseci
Sada kontam sta ti tacno treba i tvoja funkcija radi posao. Ne verujem da postoji jednostavnije resenje. Naravno, kad se ovo "spakuje" u query izgledace krace :).
Medjutim, nije mi jasno zasto ti ovo treba za nedeljne izvestaje. U stvari, ovo ti treba ako je ulazni parametar za nedeljni izvestaj datum koji nije (ne mora da bude) end of week. Ja sam zbog "report for the week ending 5/21/2004" skontao da je ulazni parametar end of week.
 
Odgovor na temu

[es] :: Access :: Poslednji dan u nedelji i sedmicni izvestaji

[ Pregleda: 2655 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.