• Domingo 22 de Diciembre de 2024, 23:31

Autor Tema:  Calcular Hora  (Leído 13504 veces)

UserCode

  • Miembro MUY activo
  • ***
  • Mensajes: 338
    • Ver Perfil
Calcular Hora
« en: Lunes 21 de Mayo de 2007, 23:02 »
0
Saludos aquí nuevamente.

No tengo idea de como solventar este asunto, no sé si en algun momento haya tenido alguien este problema:

Tengo dos ComboBox (son más pero tratan de lo mismo pero distintas horas)
En uno se indica hora de Entrada del empleado, y en el otro se indica la hora de salida.
En un Label se coloca el estimado de Horas de ese rango.

Pero los Combo tienen lo siguiente: (ambos los mismos datos)
6:00 am
6:30 am
7:00 am
7:30 am
8:00 am
8:30 am
9:00 am
.... etc
.... etc
.... etc
12:00 pm
12:30 pm
1:00 pm
1:30 pm
2:00 pm

Si se selecciona en un combo 7:00 am y en el otro 12:00 pm, se deberia de mostrar en el Label de horas = 5 (horas trabajadas)

Ni idea en verdad de como atacar o darle la vuelta correcta a esto, no podría con algo como:

Código: Text
  1.  
  2. If CmbEntrada.Caption = "7:00 am" And CmbSalida.Caption = "12:00 pm" Then
  3.     LbTotalHrs.Caption = 5
  4. ElseIf CmbEntrada.Caption = "8:30 am" And CmbSalida.Caption = "12:00 pm" Then
  5.     Lb TotalHrs.Caption = 4.5
  6. ElseIf .....
  7. .... etc
  8. .... etc
  9.  
  10.  

Las combinaciones en la sentencia de deición son demasiadas, ha sido lo primero que me paso por la mente, no digo que sea lo que vaya a usar.
¿No habra algun control de VB que permita resolver este tipo de tarea?

Ya tenia el programita listo y viene el que lo mando a hacer a venir a desear tomar los datos de otra forma y me desperoleo todo, espero que no tenga que reestructurar las tablas o el reporte, alguien sabe por fa?  :(
Si esto es Leído por accidente, induzca al vomito

ElNapster

  • Moderador
  • ******
  • Mensajes: 727
    • Ver Perfil
Re: Calcular Hora
« Respuesta #1 en: Lunes 21 de Mayo de 2007, 23:48 »
0
Ya probaste con algo como esto :

Código: Text
  1. Private Sub Command1_Click()
  2. Dim d As Double
  3.     Dim res As Double
  4.     Dim h1 As Date
  5.     Dim h2 As Date
  6.    
  7.     d = 86400               'Nº de segundos de un día
  8.     On Error GoTo ErrorDat
  9.     h1 = CDate(Text1.Text)
  10.     h2 = CDate(Text2.Text)
  11.     res = DateDiff("s", h1, h2)
  12.     If res < 0 Then
  13.         res = d + res
  14.     End If
  15.     Text3.Text = DateAdd("s", res, "00:00:00")
  16.     Exit Sub
  17. ErrorDat:
  18.     res = MsgBox("Error en la introducción de la hora...", vbCritical)
  19.     Text1.SetFocus
  20. End Sub
  21.  

 :kicking:
"Somos lo que imaginamos ser"
-- --------------------------------------------------------------
-ElNapster
-Designer / Developer Software
-GuaTemALa



cpmario

  • Miembro HIPER activo
  • ****
  • Mensajes: 629
    • Ver Perfil
    • http://www.cpimario.com
Re: Calcular Hora
« Respuesta #2 en: Lunes 21 de Mayo de 2007, 23:56 »
0
Otra forma:

   
Código: Text
  1.  LbTotalHrs.Caption = DateDiff("h", dtmHoraEntrada, dtmHorasalida)
  2.  
:comp:

UserCode

  • Miembro MUY activo
  • ***
  • Mensajes: 338
    • Ver Perfil
Re: Calcular Hora
« Respuesta #3 en: Martes 22 de Mayo de 2007, 00:00 »
0
Lastima, ningno de los dos sirve  :(  si por ejemplo indico como primera hora 6:00 am y en la segunda 6:30 am, u 8:00am y 8:30 am, la misma hora siempre me da como resultado 12:30 am  :(
Si esto es Leído por accidente, induzca al vomito

UserCode

  • Miembro MUY activo
  • ***
  • Mensajes: 338
    • Ver Perfil
Re: Calcular Hora
« Respuesta #4 en: Viernes 25 de Mayo de 2007, 04:34 »
0
No importa por eso muchachos, seguire viendo, en la lucha como siempre  :comp:
Si esto es Leído por accidente, induzca al vomito

Angel38

  • Miembro MUY activo
  • ***
  • Mensajes: 370
    • Ver Perfil
Re: Calcular Hora
« Respuesta #5 en: Viernes 25 de Mayo de 2007, 06:46 »
0
Hola,

La forma de sumar o restar horas es esta.

Código: Text
  1. suma=timevalue(Hora1) + timevalue(Hora2)
  2.  

Para restarlas solo tienes que cambiar el simbolo. Ya como lo apliques seria cuestion tuya.

Te sugiero que los coloques en variables y luego hagas las operaciones correspondiente y suma (o resta) la envias a el label "Horas".

Espero haberte ayudado.
[size=109]Se me olvidó instalar los Drivers de Cordura en mi Cerebro.

UserCode

  • Miembro MUY activo
  • ***
  • Mensajes: 338
    • Ver Perfil
Re: Calcular Hora
« Respuesta #6 en: Viernes 25 de Mayo de 2007, 14:42 »
0
Igual si se coloca 6:00 am y 6:30 am y otro misma hora entre "hora en punto" y la msima hora pero "media hora" da 12:30am (resta de horas, la diferencia entre ellas) :(

Pero voy a trabajar con todo esto, creo que ni con hora militar serviria, puesto que igual estaria el problema por debajo de las horas de las 12pm. Eso porque tengo varios ComboBox con una lista de horas y existe datos de Horas Extra, sea Diurnas o Nocturnas y puede pasar que alguien trabaje al menos 30 minutos, tomandose eso en la parte de horas Extras.

gracias de igual forma  :)
Si esto es Leído por accidente, induzca al vomito

UserCode

  • Miembro MUY activo
  • ***
  • Mensajes: 338
    • Ver Perfil
Re: Calcular Hora
« Respuesta #7 en: Viernes 25 de Mayo de 2007, 17:51 »
0
Bueno, la diferencia entre H1 y H2 = Nº Hrs

Las horas se indican en unos Combo y la diferencia de hroas entre estos en un Label, pues mientras (no sé si para siempre) cambie el Label de salida de horas por un Text
Cuando coloquen 7:00 am - 7:30 am =12:30 am quitan el 12 y ponen un 0

Despues de todo, aunque los combo tienen un listado de horas
6:00 am
6:30 am
7:00 am
7:30 am
.... etc
.... etc

Igual en ocasiones se escribe la hora en vez de seleccionarse de la lista porque al parecer, una persona puede haber llegado a las 7:08 am y haber salido a las 11:43 am
El codigo funciona con esto, solo falla en lo ya comentado antes. No es la solución ni lo más elegante, podría tardarme no sé cuántos días intentando nuevas sintaxis y buscando en internet, pero por los momentos, cambie los Labels de salida por Text y así el mismo usuario que corriga el problema.

Por cierto, alguien sabe como poner en controles de Calendario DTPicker, el primer y ultimo dia del mes? tengo dos: DTPFecha1 y DTPFecha2 pero los actualizo con el día actual con un = Date
¿Cómo sería para poner en el DTPFecha1.Value = 01/M/Año y en el otro DTPFecha2.Value=31/M/Año (de cada mes). Esos calendarios controlan de llenar en un MSFlexGrid los registros, es para ver si muestran la panoramica del mes y no del día actual.

Voy a seguir viendo que hago con eso de sumar horas, saludos  :hola:
 :comp:
Si esto es Leído por accidente, induzca al vomito

Angel38

  • Miembro MUY activo
  • ***
  • Mensajes: 370
    • Ver Perfil
Re: Calcular Hora
« Respuesta #8 en: Viernes 25 de Mayo de 2007, 17:58 »
0
Busca informacion sobre la forma de sumar horas (TimeValue), y la verdad viejo eso funciona es sumando horas militar.


Aunque a mi parecer cuando trabajé con las sumas de horas, si escogias 3:00 p.m. como ejemplo, el en la suma la pasaba a Hora militar.

Lastima que no te pueda ayudar más, pues no recuerdo como solucionaba ese asunto, pero es por ahi. :P
[size=109]Se me olvidó instalar los Drivers de Cordura en mi Cerebro.

UserCode

  • Miembro MUY activo
  • ***
  • Mensajes: 338
    • Ver Perfil
Re: Calcular Hora
« Respuesta #9 en: Viernes 25 de Mayo de 2007, 19:05 »
0
Citar
Busca informacion sobre la forma de sumar horas (TimeValue), y la verdad viejo eso funciona es sumando horas militar.

Buscando...  :P  thx.
Si esto es Leído por accidente, induzca al vomito

UserCode

  • Miembro MUY activo
  • ***
  • Mensajes: 338
    • Ver Perfil
Re: Calcular Hora
« Respuesta #10 en: Viernes 25 de Mayo de 2007, 21:26 »
0
Bueno, creo que ya esta solucionado el asunto de las sumas, siempre quise probar algo que daba mal hasta que ya de forma más organizada dio.

Debido al problema de mostrar un Total (formato dato numerico) en base a datos de Hora (formato hora), decidí hacer una tablita en la Bd y desde el programa truncar o tomar la porción de interés de cada Total_Horas (las horas y los minutos de cada turno).

Recurri a esto porque de usar alguna función en VB, no sabía luego como solucionarlo igual en Crystal.



Luego de recopilar o llenar eso con cada ingreso de datos, los organizo y sumo asi:
Ejemplo:
Código: Text
  1.  
  2. Select Sum(hD) As HrsD, Sum(mD) As MinD,
  3.           Sum(hN) As HrsN, Sum(mN) As MinN,
  4.           Sum(hExtD) As HrsExtD, Sum(mExtD) As MinExtD,
  5.           Sum(hExtN) As HrsExtN, Sum(mExtN) As MinExtN
  6. From chl_totalesemp
  7. Where NumEmp=30915 And
  8. Fecha Between #01/05/2007# And #31/05/2007#
  9.  
  10.  

Y metiendo eso en unos Labels en la ventana:
Código: Text
  1.  
  2.     Dim THrsD As Integer
  3.     Dim TMinD As Integer
  4.     Dim THrsN As Integer
  5.     Dim TMinN As Integer
  6.     Dim THrsExtD As Integer
  7.     Dim TMinExtD As Integer
  8.     Dim THrsExtN As Integer
  9.     Dim TMinExtN As Integer
  10.     Dim Clau26 As Integer
  11.    
  12.     With Data2.Recordset
  13.         While Not .EOF
  14.             '....................................
  15.             'hD:
  16.             If IsNumeric(![HrsD]) = False Then
  17.                 Exit Sub
  18.             Else
  19.                 THrsD = THrsD + Val(![HrsD])
  20.             End If
  21.             'mD:
  22.             If IsNumeric(![MinD]) = False Then
  23.                 Exit Sub
  24.             Else
  25.                 TMinD = TMinD + Val(![MinD])
  26.             End If
  27.             '....................................
  28.             'hN:
  29.             If IsNumeric(![HrsN]) = False Then
  30.                 Exit Sub
  31.             Else
  32.                 THrsN = THrsN + Val(![HrsN])
  33.             End If
  34.             'mN:
  35.             If IsNumeric(![MinN]) = False Then
  36.                 Exit Sub
  37.             Else
  38.                 TMinN = TMinN + Val(![MinN])
  39.             End If
  40.             '....................................
  41.             'hExtD:
  42.             If IsNumeric(![HrsExtD]) = False Then
  43.                 Exit Sub
  44.             Else
  45.                 THrsExtD = THrsExtD + Val(![HrsExtD])
  46.             End If
  47.             'mExtD:
  48.             If IsNumeric(![MinExtD]) = False Then
  49.                 Exit Sub
  50.             Else
  51.                 TMinExtD = TMinExtD + Val(![MinExtD])
  52.             End If
  53.             '....................................
  54.             'hExtN:
  55.             If IsNumeric(![HrsExtN]) = False Then
  56.                 Exit Sub
  57.             Else
  58.                 THrsExtN = THrsExtN + Val(![HrsExtN])
  59.             End If
  60.             'mExtN:
  61.             If IsNumeric(![MinExtN]) = False Then
  62.                 Exit Sub
  63.             Else
  64.                 TMinExtN = TMinExtN + Val(![MinExtN])
  65.             End If
  66.             '....................................
  67.             .MoveNext
  68.         Wend
  69.     End With
  70.    
  71.     LbHrsD.Caption = THrsD & ":" & TMinD
  72.     LbHrsN.Caption = THrsN & ":" & TMinN
  73.     LbTotalHrs.Caption = (THrsD + THrsN) & ":" & (TMinD + TMinN)
  74.     If (THrsD + THrsN) > 44 Then
  75.         Clau26 = (THrsD + THrsN) - 44
  76.     Else
  77.         Clau26 = 0
  78.     End If
  79.     LbHrsExtD.Caption = THrsExtD & ":" & TMinExtD
  80.     LbHrsExtN.Caption = THrsExtN & ":" & TMinExtN
  81.     LbClau26.Caption = Clau26
  82.  
  83.  

Lo cual saca al final de los datos traidos a la ventana, el tan sufrido total de horas y minutos como se ve remarcado en recuadro rojo.
Probando como rula:


Y ya con eso, igual para el Reporte, al cual procedere a terminarlos
Además de los totales, preocupaba el dato llamado "Clausula 26" que estima que un Empleado debe trabajar 44 horas a la semana, no más de eso.

Código: Text
  1.  
  2. If TotalHrsLb >44 Then
  3.     Clau26 = TotalHrsLb - 44
  4. Else
  5.     Clau26 = 0
  6. End If
  7.  
  8.  

Ya ese problema lo había mencionado en otro post, antes que viniese el Sr y cambiase todo haciendome perder tiempo, por remplazarlo casi todo  :angry:

Yo creo que si furula bien, pues lo dejo así, aplicandose al dicho de "si funciona, dejalo así, ni lo toques"  :P

 :hola:
 :comp:
Si esto es Leído por accidente, induzca al vomito

F_Tanori

  • Moderador
  • ******
  • Mensajes: 1919
  • Nacionalidad: mx
    • Ver Perfil
Re: Calcular Hora
« Respuesta #11 en: Sábado 26 de Mayo de 2007, 00:30 »
0
Citar
09:00
08:30
02:30
--------
19:60 ?



 que no serian 20 hrs? en ese caso que pasaria si fueran algo como

Citar
09:50
08:40
02:30
--------
19:120


 :unsure:  :blink:

desde mi punto de vista (humilde opinion  :rolleyes: ) deberias de convertir todo a segundos y hacer las operaciones matematicas con ellas una vez obtenido el resultado convertir en formato hh:mm:ss


Saludos
" ExIsTo y A vEcEs PiEnSo "

NOTA:
===========================================================================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
===========================================================================================================================

Angel38

  • Miembro MUY activo
  • ***
  • Mensajes: 370
    • Ver Perfil
Re: Calcular Hora
« Respuesta #12 en: Sábado 26 de Mayo de 2007, 00:38 »
0
Huy man que pena contigo. Al final suma tienes que darle asi.

Código: Text
  1. Varsuma= format(suma,"hh:mm:ss")
  2.  

Prueba a ver que te sale.
[size=109]Se me olvidó instalar los Drivers de Cordura en mi Cerebro.

UserCode

  • Miembro MUY activo
  • ***
  • Mensajes: 338
    • Ver Perfil
Re: Calcular Hora
« Respuesta #13 en: Sábado 26 de Mayo de 2007, 04:00 »
0
Citar


09:00
08:30
02:30
--------
19:60 ?

que no serian 20 hrs? en ese caso que pasaria si fueran algo como

Son 19 Hrs con 60 minutos  :P

Citar
09:50
08:40
02:30
--------
19:120

Ese 120 me está asustando  :(
tendría que revisar. Pero no es que no sea valido.
Sería fabuloso que por cada 60 minutos o más, se incremente el de hora, es decir, se distribuya como deberia, porque 3:60 podría ser realmente 4:00 por ejemplo.

De todas formas, creo que el formato de todo esto siempre es semanal, claro está que si se desea ver registros de un Empleado de más de una semana, un mes o más, el acumulado excederia lo normal de totales, pero por ejemplo, todo esto a partido de algo en Excel en donde solo se observa la semana, siendo así un control de semana por semana los 7 dias.

Si si, ya sé, ahí dice AM y PM, es que ese era el formato viejo, ahora es con todo este dolor de cabezas de horas haciendo que lo hecho anteriormente haya ido directo al caño cuando yo era feliz y el programa trabajaba por numeros  :(

F_Tanori:
Citar
desde mi punto de vista (humilde opinion rolleyes.gif ) deberias de convertir todo a segundos y hacer las operaciones matematicas con ellas una vez obtenido el resultado convertir en formato hh:mm:ss
Aun no sé hacer eso, es la primera vez que trabajo tanto con horas  :unsure:
procedere a investigar un poco sobre como hacer eso.

Angel38:
Citar
Varsuma= format(suma,"hh:mm:ss")

Hmmmm.... con razón no furulaba bien, eso tambien lo voy a revisar  :huh:
Si esto es Leído por accidente, induzca al vomito

UserCode

  • Miembro MUY activo
  • ***
  • Mensajes: 338
    • Ver Perfil
Re: Calcular Hora
« Respuesta #14 en: Martes 29 de Mayo de 2007, 00:50 »
0
El código que he usado gracias a un ring y pregunta a alguien  :P

Código: Text
  1.  
  2. Dim hc As Variant
  3. Dim h As Variant
  4. Dim h1 As Variant
  5. Dim h2 As Variant
  6. Dim ht As Variant
  7. Dim m As Variant
  8. Dim s As Variant
  9. h1 = CmbEntradaD.Text
  10. h2 = CmbSalidaD.Text
  11. If h1 = "" Or h2 = "" Then
  12.    Exit Sub
  13. End If
  14. hc = Format(CDate(h2) - CDate(h1), "hh:mm:ss")
  15. h = Hour(hc)
  16. m = Format(Minute(hc) / 60, "0.00")
  17. s = Format(Second(hc) / 3600, "0.00")
  18. ht = h + m + s
  19. LbHorasTurnoD.Caption = ht
  20.  
  21.  

Resultados del código:
7:00 am - 12:00 pm = 5
7:30 am - 12:00 pm = 4,5
6:00 am - 6:30 am = 0,5

hc: Hora Completa
h1: Hora de Entrada
h2: Hora de Salida
h: La hora resultado de la diferencia de h2-h1 y ya con su formato "hh:mm:ss"
ht: Hora Total
m: minutos (obviamente)
s: segundos (obviamente)

Por cierto, había preguntado en una ocasión algo sobre como mostrar en controles de calendario DTPicker el 1er y ultimo dia del Mes. Bueno el ultimo día no es importante puesto que con respecto al día presente, no hay manera de conocer ni interes en ver datos que aun no han sido ingresados, ni que viesemos el futuro de los datos de mañana y los continuos dias  :P
Seria entonces desde el 1er día del mes hasta el día actual del mismo en el que nos encontramos para mostrar datos de días anteriores.

Primer día del Mes:
DTPicker.Value = "01/" & Month(Date) & "/" & Year(Date)

Para un TextBox pues seria eso mismo pero dentro de un Format.

Por fiiiiiiiin!!!  :P
Si alguien lo necesita, ahi ta :kicking:
Si esto es Leído por accidente, induzca al vomito