Instrukcja administratora > Załączniki > Przykład funkcji i wyzwalacza użytkownika

Drukuj

Przykład funkcji i wyzwalacza użytkownika

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:

3008001

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.)

3008002

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.)

3008003

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.)

3008004