Instrukcja administratora > Załączniki > Przykład funkcji i wyzwalacza użytkownika | | Drukuj |
Ten przykład pokazuje jak w prosty sposób zmodyfikować działanie ewidencji czasu pracy (ECP), tak aby godziny pracy, nadgodziny i godziny nocne były obliczane zgodnie z założeniami użytkownika. Wykorzystano tutaj tylko i wyłącznie funkcje i wyzwalacze użytkownika. Założenia: •godziny zaliczone w ECP mają być zmodyfikowane, aby wcześniejsze wejście poniżej 15 min. względem nominalnej godziny wejścia, nie zaliczało wcześniejszego wejścia, tzn. godzina takiego wejścia będzie tożsama z nominalną godziną wejścia; dopiero wejście wcześniejsze o ponad 15 min. będzie zaliczone •analogicznie wyjście; późniejsze wyjście poniżej 15 min. względem nominalnej godziny wyjścia, nie będzie zaliczało późniejszego wyjścia, tzn. godzina takiego wyjścia będzie tożsama z nominalną godziną wyjścia; dopiero wyjście późniejsze o ponad 15 min. będzie zaliczone •godziny pracy będą obliczane zgodnie ze zmodyfikowanymi zaliczonymi godzinami wejścia i wyjścia oraz z uwzględnieniem przerwy 20 min. •nadgodziny będą obliczane nie jako różnica godzin pracy i godzin nominalnych (jak standardowo), tylko jako różnica pomiędzy zaliczoną godziną wejścia i nominalną godziną wejścia oraz różnica pomiędzy zaliczoną godziną wyjścia i nominalną godziną wyjścia •godziny nocne muszą być obliczane zgodnie ze modyfikowanymi zaliczonymi godzinami wejścia i wyjścia
Funkcja użytkownika obliczająca godziny Funkcja nazywa się CountECP i zawiera następujące parametry wejściowe: •@mode int - ponieważ musimy obliczyć wiele wartości (godziny zaliczone, godziny pracy, nagdodziny, itd) należy podać jaką wartość ma zwrócić funkcja; (1 - zaliczona godz.wejścia, 2 - zaliczona godz.wyjścia, 3 - godziny pracy, 4 - nadgodziny 50%, 5 - nadgodziny 100%, 6 - godziny nocne) •@gwe float - nominalna godzina wejścia z harmonogramu •@gwy float - nominalna godzina wyjścia z harmonogramu •@gzalwe float - zaliczona godzina wejścia wyliczona przez program •@gzalwy float - zaliczona godzina wyjścia wyliczona przez program •@gp float - godziny pracy wyliczone przez program •@g50 float - nadgodziny 50% wyliczone przez program •@g100 float - nadgodziny 100% wyliczone przez program •@gn float - godziny nocne wyliczone przez program •@nazwa varchar(30) - nazwa harmonogramu - funkcja ma zmodyfikować godziny tylko dla harmonogramu o nazwie 'AZ'
Definicja funkcji: CREATE function dbo.CountECP (@mode int, @gwe float, @gwy float, @gzalwe float, @gzalwy float, @gp float, @g50 float, @g100 float, @gn float, @nazwa varchar(30)) returns float as begin if @nazwa='AZ' begin --jeśli harmonogram nazywa się'AZ'
declare @gnod float, @gndo float, @res float
if ( @gwe-@gzalwe<0.01047) and ( @gwe-@gzalwe>0) set @gzalwe= @gwe else set @gzalwe=@gzalwe --jeśli różnica jest mniejsza niż 15 min.(0.01047) zmodyfikuj @gzalwe if (@gzalwy-@gwy<0.01047) and (@gzalwy-@gwy>0) set @gzalwy= @gwy else set @gzalwy=@gzalwy --jeśli różnica jest mniejsza niż 15 min.(0.01047) zmodyfikuj @gzalwy
set @gp=@[email protected] --godziny pracy pomniejszone o 20 min.(0.01389) przerwy set @g50=0
if @gwe-@gzalwe>0 set @g50= @gwe-@gzalwe if @gzalwy-@gwy>0 set @g50=@g50+@gzalwy-@gwy
set @gn=0 set @gnod=0.91667 --nocne zaczynają się o 6:00 set @gndo=0.25 --nocne kończą się o 22:00
--obliczenie nocnych if (@gzalwe-round(@gzalwe,0)<@gndo) and (@gzalwe-round(@gzalwe,0)>0) set @gn=@gndo-(@gzalwe-round(@gzalwe,0)) if (@gzalwy-round(@gzalwy,0)>0) and (@gzalwy-round(@gzalwy,0)>@gnod) set @gn=@gn+(@gzalwy-round(@gzalwy,0)-@gnod)
set @g100=0 --obliczenie początku i końca nocnych względem nadgodzin if @gwe-round(@gwe,0)<@gndo set @gndo=@gwe-round(@gwe,0) if @gwy-round(@gwy,0)<@gnod set @gnod=@gwy-round(@gwy,0)
--jeśli nadgodziny wypadają w porze nocnej, to mają być 100% if (@gzalwe-round(@gzalwe,0)<@gndo) and (@gzalwe-round(@gzalwe,0)>0) set @g100=@gndo-(@gzalwe-round(@gzalwe,0)) if (@gzalwy-round(@gzalwy,0)>0) and (@gzalwy-round(@gzalwy,0)>@gnod) set @g100=@g100+(@gzalwy-round(@gzalwy,0)-@gnod)
if @g100>0 set @g50=@g50-@g100 --pomniejsz nadgodziny 50% o 100%
--korekta wyliczonych godzin - w wyniku obliczeń są troszkę za małe set @gzalwe=@gzalwe+0.00001 set @gzalwy=@gzalwy+0.00001 set @gp=@gp+0.00001 set @g50=@g50+0.00001 set @g100=@g100+0.00001 set @gn=@gn+0.00001 end
--w zależności od @mode zwróć odpowiednią wartość if @mode=1 set @res=@gzalwe if @mode=2 set @res=@gzalwy if @mode=3 set @res=@gp if @mode=4 set @res=@g50 if @mode=5 set @res=@g100 if @mode=6 set @res=@gn
return @res
end
Wyzwalacz użytkownika modyfikujący godziny w tabeli ECP na poziomie bazy danych Wyzwalacz jest założony na tabeli EWIDENCJA CZASU PRACY i jest rodzaju AlwaysAfterPost, ponieważ będzie uruchamiany także podczas importu z czytnika RCP. Wyzwalacz wywołuje 6 razy funkcję CountECP aby wyliczyć wartości wszystkich potrzebnych godzin. Na wejściu funkcji podajemy wartości godzin z aktualnego rekordu ECP, wyliczone przez program - nazwy pól w nawiasach klamrowych {}
Definicja wyzwalacza: if {SZABLON HARMONOGRAMU CZASU PRACY.NAZWA}='AZ' begin
declare @gzalwe float, @gzalwy float, @gp float, @g50 float, @gn float, @g100 float
set @gzalwe = dbo.CountECP(1,{HARMONOGRAM CZASU PRACY.GWE},{HARMONOGRAM CZASU PRACY.GWY},{GZALWE},{GZALWY},{GPFAKT},{G50FAKT},{G100FAKT},{GNFAKT},{SZABLON HARMONOGRAMU CZASU PRACY.NAZWA})-2
set @gzalwy = dbo.CountECP(2,{HARMONOGRAM CZASU PRACY.GWE},{HARMONOGRAM CZASU PRACY.GWY},{GZALWE},{GZALWY},{GPFAKT},{G50FAKT},{G100FAKT},{GNFAKT},{SZABLON HARMONOGRAMU CZASU PRACY.NAZWA})-2
set @gp = dbo.CountECP(3,{HARMONOGRAM CZASU PRACY.GWE},{HARMONOGRAM CZASU PRACY.GWY},{GZALWE},{GZALWY},{GPFAKT},{G50FAKT},{G100FAKT},{GNFAKT},{SZABLON HARMONOGRAMU CZASU PRACY.NAZWA})
set @g50 = dbo.CountECP(4,{HARMONOGRAM CZASU PRACY.GWE},{HARMONOGRAM CZASU PRACY.GWY},{GZALWE},{GZALWY},{GPFAKT},{G50FAKT},{G100FAKT},{GNFAKT},{SZABLON HARMONOGRAMU CZASU PRACY.NAZWA})
set @g100 = dbo.CountECP(5,{HARMONOGRAM CZASU PRACY.GWE},{HARMONOGRAM CZASU PRACY.GWY},{GZALWE},{GZALWY},{GPFAKT},{G50FAKT},{G100FAKT},{GNFAKT},{SZABLON HARMONOGRAMU CZASU PRACY.NAZWA})
set @gn = dbo.CountECP(6,{HARMONOGRAM CZASU PRACY.GWE},{HARMONOGRAM CZASU PRACY.GWY},{GZALWE},{GZALWY},{GPFAKT},{G50FAKT},{G100FAKT},{GNFAKT}, {SZABLON HARMONOGRAMU CZASU PRACY.NAZWA})
update ECP set [GZALWE]=@gzalwe, [GZALWY]=@gzalwy, [GPFAKT]=@gp, [G50FAKT]=@g50, [G100FAKT]=@g100, [GNFAKT]=@gn where [X_I]={X_I}
end
Wyzwalacz ten modyfikuje rekord w tabeli ECP w bazie danych, jednakże zmiany wprowadzane przez użytkownika w oknie ECP nie będą widoczne on-line, tylko dopiero po zatwierdzeniu rekordu (wyzwalacz jest AfterPost) Aby użytkownik widział zmiany godzin na bieżąco podczas edytowania wpisu w ECP, trzeba jeszcze założyć drugi wyzwalacz na poziomie aplikacji.
Wyzwalacz użytkownika modyfikujący godziny w tabeli ECP na poziomie aplikacji Wyzwalacz jest założony na tabeli EWIDENCJA CZASU PRACY i jest rodzaju OnFieldChange. Wyzwalacz wywołuje 6 razy funkcję CountECP aby wyliczyć wartości wszystkich potrzebnych godzin, ale tym razem modyfikuje on poszczególne pola w tabeli ECP na poziomie aplikacji wykorzystując polecenie {nazwa_pola}:= Aby wyzwalacz nie wykonywał się dla zmian wszystkich pól rekordu, co spowolniłoby działanie programu, wykorzystano klauzulę onchange={pole}, która powoduje wykonanie kodu po zmianie wartości tylko jednego pola. Wykonanie każdej sekcji wyzwalacza jest oddzielone klauzulą go (można napisać 6 oddzielnych wyzwalaczy dla modyfikacji każdego z 6 pól)
Definicja wyzwalacza: onchange={GZALWE} {GZALWE}:=select dbo.CountECP(1,{HARMONOGRAM CZASU PRACY.GWE},{HARMONOGRAM CZASU PRACY.GWY},{GZALWE},{GZALWY},{GPFAKT},{G50FAKT},{G100FAKT},{GNFAKT},{SZABLON HARMONOGRAMU CZASU PRACY.NAZWA}) go
onchange={GZALWY} {GZALWY}:=select dbo.CountECP(2,{HARMONOGRAM CZASU PRACY.GWE},{HARMONOGRAM CZASU PRACY.GWY},{GZALWE},{GZALWY},{GPFAKT},{G50FAKT},{G100FAKT},{GNFAKT},{SZABLON HARMONOGRAMU CZASU PRACY.NAZWA}) go
onchange={GPFAKT} {GPFAKT}:=select dbo.CountECP(3,{HARMONOGRAM CZASU PRACY.GWE},{HARMONOGRAM CZASU PRACY.GWY},{GZALWE},{GZALWY},{GPFAKT},{G50FAKT},{G100FAKT},{GNFAKT},{SZABLON HARMONOGRAMU CZASU PRACY.NAZWA}) go
onchange={G50FAKT} {G50FAKT}:=select dbo.CountECP(4,{HARMONOGRAM CZASU PRACY.GWE},{HARMONOGRAM CZASU PRACY.GWY},{GZALWE},{GZALWY},{GPFAKT},{G50FAKT},{G100FAKT},{GNFAKT},{SZABLON HARMONOGRAMU CZASU PRACY.NAZWA}) go
onchange={G100FAKT} {G100FAKT}:=select dbo.CountECP(5,{HARMONOGRAM CZASU PRACY.GWE},{HARMONOGRAM CZASU PRACY.GWY},{GZALWE},{GZALWY},{GPFAKT},{G50FAKT},{G100FAKT},{GNFAKT},{SZABLON HARMONOGRAMU CZASU PRACY.NAZWA}) go
onchange={GNFAKT} {GNFAKT}:=select dbo.CountECP(6,{HARMONOGRAM CZASU PRACY.GWE},{HARMONOGRAM CZASU PRACY.GWY},{GZALWE},{GZALWY},{GPFAKT},{G50FAKT},{G100FAKT},{GNFAKT},{SZABLON HARMONOGRAMU CZASU PRACY.NAZWA}) go
Efekt działania funkcji i wyzwalaczy Jeśli skopiujemy tekst funkcji i wyzwalaczy z helpa do programu, należy z ich definicji usunąć komentarze (--tekst_komentarza) Harmonogram czasu pracy: ![]() Przypadek 1 Pracownik przyszedł 10 min.za wcześnie i wyszedł 10 min. po nominalnym czasie. Zgodnie z założeniami zaliczone godziny wejścia i wyjścia zostały obcięte do nominalnych godzin wejścia/wyjścia (5:40 do 14:00). Godziny pracy wynoszą tyle co nominał (8:00). Zostały obliczone tylko godziny nocne (20min.) ![]() Przypadek 2 Pracownik przyszedł 20 min.za wcześnie i wyszedł 10 min. po nominalnym czasie. Zgodnie z założeniami zaliczona godzina wyjścia została obcięta do nominalnej godziny wyjścia (14:00), zaś godzina wejścia została zaliczona. Godziny pracy wynoszą (8:20). Zostały obliczone nadgodziny 100% (20 min.), ponieważ wypadają w porze nocnej. Godziny nocne wyniosły (40 min.) ![]() Przypadek 3 Pracownik przyszedł 20 min. za wcześnie i wyszedł 20 min. po nominalnym czasie. Zgodnie z założeniami godziny wejścia i wyjścia zostały zaliczone. Godziny pracy wynoszą (8:40). Zostały obliczone nadgodziny 100% (20 min.), ponieważ wypadają w porze nocnej - przed wejściem, oraz nadgodziny 50% po wyjściu (20 min.). Godziny nocne wyniosły (40 min.) ![]() |