** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Sumar horas campo numero
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoSumar horas campo numero

 Responder Responder
Autor
Mensaje
JuanRB Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 06/Mayo/2004
Localización: España
Estado: Sin conexión
Puntos: 296
Enlace directo a este mensaje Tema: Sumar horas campo numero
    Enviado: 12/Noviembre/2015 a las 09:15
REEDITADO

Hola a todos y muchas gracias por vuestro tiempo:

Trabajo en ACCESS 2003 y estoy intentado resolver la cuestion que os planteo a continuación:

Tengo una tabla con registros de empleados con los siguientes datos (ejemplo):

 Empleado         Alta_Contrato       Baja_Contrato      Horas_Semana
(Tipo texto)     (tipo Fecha/Hora)   (tipo Fecha/Hora)      (tipo Número)
      ----                01/01/2015              31/12/2032                  40:00
      ----                01/01/2015              31/12/2032                  35:35
      ----                01/01/2015              31/12/2032                  20:50
      ----         Seguimos con mas datos .......

Los datos del campo Horas_Semana es numérico y tiene la mascara de entrada de datos 00:00;0;_ y el valor de cada campo se pone tal cual y significa las horas a la semana que trabaja el empleado (40:00 = 40 horas, 35:35 = 35 horas y 35 minutos, 20:50 = 20 horas y 50 minutos)

Tengo un informe basado en esa tabla con esos campos con la apariencia del ejemplo mostrado y al pie del mismo quiero poner un campo con la suma del campo HORAS_SEMANA debiendo de mostrar el siguiente resultado 96:25 según esos datos

¿Me podeis ayudar? GRACIAS




Editado por JuanRB - 12/Noviembre/2015 a las 12:16
<font color=BLUE>Las oportunidades que tu pierdes, otro las aprovecha.[/COLOR]
Arriba
E. Feijoo Ver desplegable
Moderador
Moderador


Unido: 16/Abril/2004
Localización: España
Estado: Sin conexión
Puntos: 19948
Enlace directo a este mensaje Enviado: 12/Noviembre/2015 a las 10:33
El formato es solo una forma de verlo, una fecha es un numero (y las horas días incompletos que se tratan como decimales).

Si se convierten a numero y la conversión se hace a la fracción mas pequeña (en este caso minutos), podemos sumar sin perdidas apreciables.

Convertir un numero en fecha hora, solo se trata de aplicar las reglas (cada sesenta minutos una hora, cada 24 horas un día ....etc.)

Con DateDiff se logra la conversión, sumar no merece comentario y la presentación es solo una división presentada de forma estética (y sin atenerse a las reglas consensuadas de: un día = 24 horas)

Por cierto ¿de donde salen esa cifras?....
Si '40:00' son cuarenta horas cero minutos, ya se parte de una conversión que no respeta las reglas consensuadas (esto es un FORMATO)

Si se opera (suma) antes de darle formato (o de forma paralela y oculta) se obtendría una cifra que (siguiendo las reglas de esa misma conversión utilizada) obtendría el resultado deseado.

Es curioso que se obtengan esos parciales y no se sepa obtener el total ¿una copia sin analizar 'como hace lo que hace' lo copiado?.
Arriba
fcoval Ver desplegable
Habitual
Habitual


Unido: 19/Enero/2013
Estado: Sin conexión
Puntos: 130
Enlace directo a este mensaje Enviado: 12/Noviembre/2015 a las 11:14

Horas_Semana (tipo Número)
40:00
35:35
20:50

 
Con resultado de 96:25   ¿ y no deberia de ser 01: 36 : 25 ?
 
Como solo te interesa la parte de los minutos, te pongo algo por si te sirve...aunque yo sigo sin ver el formato de esa suma final que mencionas.
 
 
 
Puedes hacer una consulta sobre tu tabla (vamos a suponer que se llama Tabla1):
 
SELECT Sum(TiempoH(CStr([Horas_Semana]))) AS Hor, Sum(TiempoM(CStr([Horas_Semana]))) AS Minu, SumaResto(([Hor]),([Minu])) AS TOTAL
FROM Tabla1;
 
y en un módulo, construimos unas funciones simples, donde vamos a trabajar por separado la parte de las horas y de los decimales
 
 
Option Compare Database
 
Function TiempoH(SearchString As String) As Double
'Vamos a averiguar la posicion de los Dos Puntos
Dim TestPos As Integer
TestPos = InStr(SearchString, ":")
'Separamos las dos partes
strHoras = Left(SearchString, TestPos - 1)
strMinutos = Mid(SearchString, TestPos + 1, Len(SearchString) - (Len(strHoras) - 1))
TiempoH = CDbl(strHoras)
End Function
 
Function TiempoM(SearchString As String) As Double
'Vamos a averiguar la posicion de los Dos Puntos
Dim TestPos As Integer
TestPos = InStr(SearchString, ":")
'Separamos las dos partes
strHoras = Left(SearchString, TestPos - 1)
strMinutos = Mid(SearchString, TestPos + 1, Len(SearchString) - (Len(strHoras) - 1))
TiempoM = CDbl(strMinutos)
End Function
 
Function SumaResto(H As Double, M As Double) As String
'Vamos a tratar las dos partes, horas y los minutos
'Procesamos los minutos y los sumamos a H
Dim ElResto As Double, ParteEntera As Double
ElResto = M Mod 60  'Averiguamos el RESTO que seria 25
ParteEntera = Fix(M / 60)
SumaResto = (H + ParteEntera) & ":" & ElResto
End Function
Con ello, cuando ejecutas la consuta tendras en el campo que he llamado TOTAL el resultado que querias:
 
Consulta1
Hor Minu TOTAL
96    85   96:25
 
 
 
 
 
Arriba
JuanRB Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 06/Mayo/2004
Localización: España
Estado: Sin conexión
Puntos: 296
Enlace directo a este mensaje Enviado: 12/Noviembre/2015 a las 11:23
En el campo Horas_Semana (tipo numero) introduzco las horas y minutos que el trabajador realiza a las semana, no se hace ningún cálculo se menten las horas tal cual 40:00 = 40 horas; 35:35 = 35 horas y 35 minutos.

<font color=BLUE>Las oportunidades que tu pierdes, otro las aprovecha.[/COLOR]
Arriba
fcoval Ver desplegable
Habitual
Habitual


Unido: 19/Enero/2013
Estado: Sin conexión
Puntos: 130
Enlace directo a este mensaje Enviado: 12/Noviembre/2015 a las 11:29
¿ y que usas una mascara de entrada (como esta ##:##) para ese campo en la tabla ?
Arriba
JuanRB Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 06/Mayo/2004
Localización: España
Estado: Sin conexión
Puntos: 296
Enlace directo a este mensaje Enviado: 12/Noviembre/2015 a las 11:31
Si correcto la mascara de entradas es esta = 00:00;0;_
<font color=BLUE>Las oportunidades que tu pierdes, otro las aprovecha.[/COLOR]
Arriba
fcoval Ver desplegable
Habitual
Habitual


Unido: 19/Enero/2013
Estado: Sin conexión
Puntos: 130
Enlace directo a este mensaje Enviado: 12/Noviembre/2015 a las 11:32
Si usas mascara de entrada y el caracter de los Dos Puntos no esta almacendado en el campo no te sirve lo que te he puesto...
pero lo tienes muy facil, te olvidas de los Dos Puntos y coges 2 digitos por la derecha para los minutos y 2 digitos por la izquierda para las horas
 
 
O, usar esta otra Consulta, te la pongo en formato SQL:
 
SELECT Sum(TiempoH(CStr(Left(CStr([Horas_Semana]),2) & ":" & Right(CStr([Horas_Semana]),2)))) AS Hor, Sum(TiempoM(CStr(Left(CStr([Horas_Semana]),2) & ":" & Right(CStr([Horas_Semana]),2)))) AS Minu, SumaResto(([Hor]),([Minu])) AS TOTAL
FROM Tabla1;
A sustituir por el nombre de tu tabla


Editado por fcoval - 12/Noviembre/2015 a las 11:50
Arriba
JuanRB Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 06/Mayo/2004
Localización: España
Estado: Sin conexión
Puntos: 296
Enlace directo a este mensaje Enviado: 12/Noviembre/2015 a las 11:45
He reeditado el primer mensaje, para que se entienda mejor. fcoval no consigo entender muy bien lo que tengo que hacer, si repasamos el primer mensaje haber que proceso o función tengo que hacer en el informe.

GRACIAS
<font color=BLUE>Las oportunidades que tu pierdes, otro las aprovecha.[/COLOR]
Arriba
fcoval Ver desplegable
Habitual
Habitual


Unido: 19/Enero/2013
Estado: Sin conexión
Puntos: 130
Enlace directo a este mensaje Enviado: 12/Noviembre/2015 a las 11:53
Yo solo pretendo hacerte ver como conseguir el TOTAL que buscas... desconozco el informe que tienes hecho y que estas usando... aunque todo informe se basa en una tabla o consulta, por lo que no deberias de tener mucho problema en enlazarlo con la consulta que te he puesto o adaptar mi ejemplo a tu consulta
 
 


Editado por fcoval - 12/Noviembre/2015 a las 11:57
Arriba
JuanRB Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 06/Mayo/2004
Localización: España
Estado: Sin conexión
Puntos: 296
Enlace directo a este mensaje Enviado: 12/Noviembre/2015 a las 12:17
Estoy muy cortito en cuanto a programación, sigo sin conseguir lo que pretendo.
<font color=BLUE>Las oportunidades que tu pierdes, otro las aprovecha.[/COLOR]
Arriba
arcangelcaos Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 15/Noviembre/2012
Localización: España
Estado: Sin conexión
Puntos: 236
Enlace directo a este mensaje Enviado: 12/Noviembre/2015 a las 12:31
Hola, yo tampoco es que sea muy bueno en esto, pero se me ocurre una cosa. Por lo que veo no quieres que ponga los días, sino el total de horas. Pues haz lo siguiente..
Quita los 2 puntos y pon una coma de toda la vida.
Luego separa cada valor en parte entera y parte decimal.
Sumas la parte entera 40+35+20 = 95
Sumas la parte decimal 35+50 = 85
Divides la parte decimal entre 60 85/60 = 1,41666666666
Luego vuelves a coger la parte entera 1, se lo sumas al total 95+1= 96
Se lo restas al total de los decimales 85 - (1*60)= 25
Y este resto es la parte decimal

Luego sumas 95 + 1 + 0,25 = 96,25

Quizás se pueda simplificar más, pero ya te haces una idea

Esto te puede valer????

Para obtener la parte entera de un número usa la función INT(cantidad), y la parte decimal sería cantidad - INT(cantidad)

Editado por arcangelcaos - 12/Noviembre/2015 a las 12:38
Arriba
E. Feijoo Ver desplegable
Moderador
Moderador


Unido: 16/Abril/2004
Localización: España
Estado: Sin conexión
Puntos: 19948
Enlace directo a este mensaje Enviado: 12/Noviembre/2015 a las 13:26
Si el dato es un texto, como texto habrá que tratarlo:

(en la ventana de inmediato)
EnMinutos ="40:25"
? 60*(left(EnMinutos,instr(EnMinutos,":")-1)) + mid(EnMinutos,instr(EnMinutos,":")+1)
2425

Y si, cuarenta horas y veinticinco minutos son .... dos mil cuatrocientos veinticinco MINUTOS

Y si sumando y sumando llegamos a los 214567 (minutos, que es lo que sumamos), se puede 'traducir' asi:

(nuevamente en la ventana de inmediato)
?214567 \ 60 & ":" & Format(214567 mod 60,"00")
3576:07
Arriba
JuanRB Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 06/Mayo/2004
Localización: España
Estado: Sin conexión
Puntos: 296
Enlace directo a este mensaje Enviado: 12/Noviembre/2015 a las 14:30
Muchas gracias a todos, lo he CONSEGUIDO, un pozo chapuza pero me funciona y lo "entiendo"

En la consulta de la que tira el informe me he creado dos campos

Horas: Izq([Contrato_Horas];2)
Minutos: Der([Contrato_Horas];2)

Con esto saco los valores del campo Horas_Seman por separado horas y minutos

Esos campos (por separado) los sumo al pie del informe y haciendo algunas operaciones y sacando los numeros enteres he conseguido que la suma en un campo Total_Horas sea la correcta.

Un saludo.

<font color=BLUE>Las oportunidades que tu pierdes, otro las aprovecha.[/COLOR]
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable