Cześć, mam do zrobienia raport, w którego podsumowaniu będzie liczony czas wyjść prywatnych i służbowych pracownika w danym dniu pracy, a także podsumowanie wszystkich.
Całość ma wyglądać jak na przykładzie:
http://img10.imageshack.us/img10/999/examplehra.jpg
Mam taki zbiór danych:
employeeID | StartDate | name | eventDate | direction | eventType |
---------------------------------------------------------------------------------------------------
1 | 2009-05-04 | Jan Kowalski | 2009-05-04 16:42:19 | Wyjście | Prywatne |
1 | 2009-05-04 | Jan Kowalski | 2009-05-04 16:41:00 | Wejście | Służbowe |
1 | 2009-05-04 | Jan Kowalski | 2009-05-04 13:02:21 | Wyjście | Prywatne |
1 | 2009-05-04 | Jan Kowalski | 2009-05-04 13:00:19 | Wejście | Służbowe |
1 | 2009-05-04 | Jan Kowalski | 2009-05-04 09:47:05 | Wyjście | Prywatne |
1 | 2009-05-04 | Jan Kowalski | 2009-05-04 09:23:24 | Wejście | Służbowe |
I tak dla innych pracowników i innych dni.
Problem stanowi dla mnie policzenie tych czasów spędzonych poza firmą.
Należy pamiętać o tym, że pracownik może nie mieć poprawnej sekwencji(czyli np: "WE - WE - WY" itp).
Mam kilka pomysłów, jak policzyć te podsumowania, ale może ktoś wpadnie na coś prostszego i lepszego.
Pomysł 1. Użycie procedury składowanej i dodatkowej tabeli.
Dodatkowa tabela miałaby kolumny takie jak: employeeID, startDate, out_inDutySum, out_outDutySum
Teraz w procedurze składowanej pobieram te dane do kursora i odejmuję czas wejścia(późniejsze) od wyjścia(wcześniejsze) i tak dla całego dnia pracy. Oczywiście zwracając uwagę na typ wyjścia(prywatne/służbowe).
Następnie, gdy policzę cały dzień, robię insert do tej dodatkowej tabeli.
(alternatywa jest taka, że najpierw robię insert z selecta(distinct) do tej dodatkowej tabeli wszystkich danych, a następnie w procedurze tylko updatuje te dwa pola z sumami. Tylko nie wiem, które lepsze i szybciej się wykona).
Pomysł 2. Sumowanie za pomocą funkcji agregujących
Nie mam zielonego pojęcia, jak to osiągnąć. Wiem, że byłoby najszybsze, ale nie mam pojęcia, jak to zrobić. Dla ułatwienia powiem, że mam dodatkowe dwa pola: isOut, które przyjmuje wartości 0(wejście) lub 1(wyjście) i includeWT, które też przyjmuje takie wartości(0 - prywatne; 1 - służbowe).
Mimo wszystko, nie mam pojęcia, jak się za to zabrać.
Pomysł 3. Sumowanie za pomocą FastReport
Tak chciałem na samym początku, dopóki się nie okazało, że nie ma jak wykombinować. A jeśli nawet się da to zrobić za pomocą FR, to na serwerze policzone na pewno będzie szybciej. Ten pomysł opisałem na forum i grupie dyskusyjnej dot. Fast-Report, ale jak na razie bez odzewu konkretnego :)
Więc jeśli ktoś z Was jest mi w stanie jakoś pomóc, to bardzo proszę :)