Tenho uma rotina para cálculo de ponto eletrônico em menu sistema. Mas, quanto ao adicional noturno, empaquei.
A hora para cálculo do adicional noturno equivale a 52 minutos e 30 segundos (52,50 em decimal). Meu sistema calcula a hora como se ela tivesse 60 minutos. Alguém tem alguma função para calcular adicional noturno ou para converter horas base 60 para base 52,5?
Como calcular Adicional Noturno no Clipper?
Moderador: Moderadores
-
labaroazul
- Usuário Nível 2

- Mensagens: 83
- Registrado em: 26 Fev 2008 14:52
- Localização: São Paulo - SP
- Contato:
Como calcular Adicional Noturno no Clipper?
Windows XP Professional + Clipper 5.2e + Exospace + Dbase III Plus + SIX3 + NoDosImp + LXPic
"O trabalho afasta três males: o vício, a pobreza e o tédio." (Voltaire)
Site: http://www.labaroazul.xpg.com.br
Repositório: http://www.4shared.com/dir/31334106/e79 ... aring.html
"O trabalho afasta três males: o vício, a pobreza e o tédio." (Voltaire)
Site: http://www.labaroazul.xpg.com.br
Repositório: http://www.4shared.com/dir/31334106/e79 ... aring.html
- Toledo
- Administrador

- Mensagens: 3133
- Registrado em: 22 Jul 2003 18:39
- Localização: Araçatuba - SP
- Contato:
Re: Como calcular Adicional Noturno no Clipper?
Amigo, abaixo segue uma função para fazer este cálculo, mas antes quero explicar como cheguei ao coeficiente que é usado para calcular as horas de adicional noturno:
1 - A hora noturna tem 52 minutos e 30 segundos, que transformadas em segundos dá um total de 3150 segundos.
2 - A hora normal tem 60 segundos, que equivale a 3600 segundos.
Então basta fazer uma regrinha de três, pura matemática:
Segue agora um exemplo de como você pode fazer:
Abraços,
1 - A hora noturna tem 52 minutos e 30 segundos, que transformadas em segundos dá um total de 3150 segundos.
2 - A hora normal tem 60 segundos, que equivale a 3600 segundos.
Então basta fazer uma regrinha de três, pura matemática:
Código: Selecionar todos
3150 = 1 hora noturna
3600 = X
então
X = 3600 / 3150
X = 1,1428572
Código: Selecionar todos
CLEAR
@ 6,24 TO 15,55
@ 7,25 SAY "Entrada Intervalo Saida"
@ 8,25 SAY REPL(CHR(196),30)
@ 10,25 SAY REPL(CHR(196),30)
@ 12,26 SAY "Total de Horas....:"
@ 13,26 SAY "Horas Extras......:"
@ 14,26 SAY "Horas Ad.Noturno..:"
hsdia=8 //numeros de horas de trabalho no dia
DO WHILE .t.
cIntei=SPAC(5)
cIntef=SPAC(5)
cHorai=SPAC(5)
cHoraf=SPAC(5)
n_hsex=0
n_adno=0
@ 9,26 GET cHorai PICT "99:99" VALI !EMPT(cHorai)
@ 9,34 GET cIntei PICT "99:99"
@ 9,41 GET cIntef PICT "99:99" WHEN !EMPT(cIntei)
@ 9,49 GET cHoraf PICT "99:99" VALI !EMPT(cHoraf)
READ
IF LASTKEY()=27
RETU
ENDI
@ 11,26 SAY cHorai PICT "99:99"
@ 11,34 SAY cIntei PICT "99:99"
@ 11,41 SAY cIntef PICT "99:99"
@ 11,49 SAY cHoraf PICT "99:99"
nSegs=TEMPTRA(cHorai,cIntei,cIntef,cHoraf) //calcula total de segundos
n_hsex=(nSegs - (3600 * hsdia))
v_cal=INT(nSegs/3600) //calcula as horas
v_minut=(nSegs - (v_cal * 3600)) //separa minutos
v_hs=str(v_cal,2)+SUBS(TSTRING(v_minut),3,3) //calcula minutos e segundos
IF n_hsex>0
v_cal=INT(n_hsex/3600) //calcula as horas
v_minut=(n_hsex - (v_cal * 3600)) //separa minutos
v_hsex=str(v_cal,2)+SUBS(TSTRING(v_minut),3,3) //calcula minutos e segundos
ELSE
v_hsex=" 0:00"
ENDIF
v_cal=INT(n_adno/3600) //calcula as horas
v_minut=(n_adno - (v_cal * 3600)) //separa minutos
v_hsan=str(v_cal,2)+SUBS(TSTRING(v_minut),3,3) //calcula minutos e segundos
@ 12,46 SAY TRAN(v_hs,"99:99")
@ 13,46 SAY TRAN(v_hsex,"99:99")
@ 14,46 SAY TRAN(v_hsan,"99:99")
ENDDO
RETU
FUNC TEMPTRA(v_hri,v_ini,v_inf,v_hrf)
LOCAL ret,sega,segb,segc,segd,segp1,segp2,an1,an2
sega=SECS(v_hri) //transforma hora entrada em segundos
segb=SECS(v_hrf) //transforma hora saida em segundos
IF !EMPT(v_ini)
segc=SECS(v_ini)
segd=SECS(v_inf)
IF sega>segc
segp1=((86400 - sega)+segc)
ELSE
segp1=(segc - sega)
ENDIF
an1:=CALAD(sega,segc)
IF segd>segb
segp2=((86400 - segd)+segb)
ELSE
segp2=(segb - segd)
ENDIF
an2:=CALAD(segd,segb)
ret=(segp1 + segp2)
n_adno=an1+an2
ELSE
IF sega>segb
ret=((86400 - sega)+segb)
ELSE
ret=(segb - sega)
ENDIF
n_adno=CALAD(sega,segb)
ENDIF
RETU (ret) //retorna horas de uso em segundos
FUNC _ROUND(nvalor,ndec)
RETURN(ROUND(VAL(STR(nvalor)),ndec))
FUNC CALAD(vSegi,vSegf)
LOCAL vHA:=.t., ret2:=0
IF vSegf<=vSegi
IF vSegi=79200.and.vSegf>=18000
ret2:=28800
ELSEIF vSegi<79200.and.vSegf>=18000
ret2:=28800
ELSEIF vSegi>79200.and.vSegf<=86400.and.vSegf>79200
ret2:=(vSegf-vSegi) * 1.1428572
vHA=.f.
ELSEIF vSegi<=79200.and.vSegf<=86400.and.vSegf>79200
ret2:=(vSegf - 79200) * 1.1428572
vHA=.f.
ELSEIF vSegi>79200.and.vSegf<18000
ret2:=((vSegf + 86400) - vSegi) * 1.1428572
ELSEIF vSegi<=79200.and.vSegf<18000
ret2:=((vSegf + 86400) - 79200) * 1.1428572
ELSEIF vSegi>79200.and.vSegf>=18000
ret2:=(104400 - vSegi) * 1.1428572
ENDIF
ENDIF
IF vSegf>=79200.and.vHA
ret2:=(vSegf - 79200) * 1.1428572
ENDIF
IF vSegi<18000
IF vSegf<18000
ret2:=(vSegf - vSegi) * 1.1428572
ELSEIF vSegf>=18000
ret2:=(18000 - vSegi) * 1.1428572
ENDIF
ENDIF
RETU (ret2)
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao