Calcular Horas y Minutos Trabajados

Quiero calcular las horas trabajadas de un empleado. Yo
tengo mi campo Hor_Ing, Hor_Sal y Hor_Trb.
Y en la tabla se graban así: Hor_Ing: 07:58, Hor_Sal: 17:05.
Pero en Hor_Trb: aquí debería después de Calcular grabar las horas y minutos que trabajo dicho empleado. Y este es mi problema no se como hacerlo

5 Respuestas

Respuesta
2

Yo hice un prog de control de ingresos y use algo parecido para saber si había entrado a tiempo comparaba la hora de ingreso con la que debía ingresar te paso la subrutina que utilice.

*-- Saca la diferencia en minutos entre dos horas en formato text
*------------------------------------
FUNCTION difer(dato1,dato2)
ho1=VAL(SUBSTR(dato1,1,2))
ho2=VAL(SUBSTR(dato2,1,2))
mi1=VAL(SUBSTR(dato1,4,2))
mi2=VAL(SUBSTR(dato2,4,2))
difhor=ho1-ho2
difmin=mi1-mi2
valor=difmin+(difhor*60)
Retu(valor)

Si resolviste tu problema finaliza tu pregunta y valora mi respuesta

Respuesta
2

Es cuestión de lógica e imaginación, lo que yo haría es lo siguiente :

Descomponer tanto la hora de entrada como la de salida

Hora entrada 7

Minuto entrada 58

Hora salida 17

Minuto salida 5

Luego transformo a minutos

minutos entrada = (7*60)+58 = 478

minutos salida = (17 * 60)+5 = 1025

la diferencia 1025 - 478 = 547 minutos, esto lo transformo a horas

total horas = int(547 / 60) = 9 horas

total minutos = (547 - ( 9 * 60)) = 7 minutos

Básicamente seria así.

Respuesta
1

Espero poder ayudarte! :)

Es fácil! :)

Yo te aconsejo que el tipo de campo que uses para almacenar Hor_Trb sea CARÁCTER de longitud 8!

Va así:

**--------

**--------

Local nHora, nMinuto, nSegundo, cHoraFinal, cHoraInicial, nhor_trb

cHoraInicial = "06:30:10" &&AM

cHoraFinal = "12:00:50" &&PM

**--Calculamos diferencia entre horas
nHora = Val( Left( cHoraFinal, 2 ) ) - Val( Left( cHoraInicial, 2 ) )

**--Calculamos diferencia entre los minutos
nMinuto = Val( SubStr( cHoraFinal, 4, 2 ) ) - Val( SubStr( cHoraInicial, 4, 2 ) )

**--Calculamos diferencia entre segundos
nSegundo = Val( Right( cHoraFinal, 2 ) ) - Val( Right( cHoraInicial, 2 ) )

**--Evitamos calculo sobre resultados negativos entre minutos y segundos.

DO CASE

CASE nSegundo < 0
nSegundo = nSegundo + 60
nMinuto = nMinuto - 1
CASE nMinuto < 0
nMinuto = nMinuto + 60
nHora = nHora - 1
ENDCASE

**--Armamos la cadena devuelta por el calculo, obteniendo la diferencia :)

nhor_trb = PadL( AllTrim( Str( nHora ) ), 2, "0" ) + ":" + PadL( AllTrim( Str( nMinuto ) ), 2, "0" ) + ;
":" + PadL( AllTrim( Str( nSegundo ) ), 2, "0" )

**----------

**----------

Te explico como procede: las funciones de TIME() y SECONDS() de fox, no permiten realizar operaciones aritmeticas de suma o resta entre ellas! Por tanto... debemos tomar el valor de ambas horas INICIAL y FINAL y trabajarlas por diferencia de horas, minutos y segundos.!

En este ejemplo... yo cargue las variables cHoraInicial y cHorafinal de forma manual... pero tu puedes tomarlas de tus campos en tu tabla así:

cHorainicial = tabla.Hor_Ing

cHorafinal = tabla.Hor_Sal

Ves! :)

Lo que hacemos es tomar la cadena formada por la hora, es decir, esto: 06:30:10 y separamos las horas de los minutos y segundos. EN la variable nHora sacamos el numero de horas, tanto de la hora de entrada como de salida, y las restamos así:

nHora = 12 - 6

Para los minutos, extraemos los minutos y los restamos:

nMinuto = 12 - 30

Y aplicamos el calculo para evitar minutos y horas negativas. Igual procedemos con los segundos! Luego.. unicamente unimos las variables en una cadena de caracteres para regresarte la cantidad de horas:minutos:segundo (HH:MM:SS) Ves!

Proba colocar el codigo de arriba en un boton y al final agregale esto:

MESSAGEBOX(nhor_trb)

Y prueba! Cambia los valores de las horas... y veras como se calculan las diferencias! Luego, ya con la variable cargada, pdoes proceder a guardar en tu tabla

SELECT tabla

REPLACE Hor_Trb WITH nhor_trb

TABLEUPDATE (.T.)

**--

THISFORM. Refresh

Saludos! Cualquier cosa, me avisas!

A tus ordenes! Un abrazo... desde Managua, Nicaragua!

Ravenn :D :D :D

Respuesta
1

nYear=YEAR(DATE())
nMonth=MONTH(DATE())
nDay=DAY(DATE())
nHora_salida=VAL(SUBSTR(Hor_Sal,1,2))
nMinuto_salida=VAL(SUBSTR(Hor_Sal,4,2))
nSegundo_salida=0
lcHora_salida=DATETIME(nYear, nMonth, nDay , nHora_salida , nMinuto_salida,nSegundo_salida)
nHora_ing=VAL(SUBSTR(Hor_Ing,1,2))
nMinuto_Ing=VAL(SUBSTR(Hor_Ing,4,2))
nSegundo_Ing=0
lcHora_Ing=
DATETIME(nYear, nMonth, nDay , nHora_Ing , nMinuto_Ing, nSegundo_Ing)
lcHorasTraba= (lcHora_salida-lcHora_ing)/3600

Respuesta
1

Disculpa la demora... Bueno revisando aquí encontré mas o menos un ejemplo solo lo modifique un poco aquí te lo escribo...

Crea un programa y colocas este código:

Parameters cHoraInicial, cHoraFinal
Local nHora, nMinuto, nSegundo
nHora=Val(Left(cHoraFinal,2))-Val(Left(cHoraInicial,2))
nMinuto=Val(SubStr(cHoraFinal,4,2))-Val(SubStr(cHoraInicial,4,2))
If nMinuto<0
nMinuto=nMinuto+60
nHora=nHora - 1
ENDIF
cHora=PADL(TRANSFORM(nHora),2,'0')
cMinuto=PADL(TRANSFORM(nMinuto),2,'0')
RETURN cHora+':'+cMinuto


Algo que tienes que tomar en cuenta es que los parámetros que le pases tienen que ser tipo carácter y que que el campo Hor_Trb tiene que ser tipo carácter también!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas