Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 31-12-2007
victor2023 victor2023 is offline
Miembro
 
Registrado: abr 2006
Posts: 22
Poder: 0
victor2023 Va por buen camino
problema con HoursBetween

Hola que tal, tengo un buen problema que no he podido resolver espero me puedan ayudar, en el sistema que estoy desarrollando tengo problemas con un reporte, se trata de hacer el calculo entre dos horas para sacar el numero de horas trabajadas por un tecnico, lo que pasa que cuando hace el calculo de horas cuando las dos son p.m o a.m si da bien el resultado por ejemplo empezo el trabajo a las 9.00 p.m y termino a las 10.00 p.m es una hora entre esas horas pero cuando existe 10.59 p.m y que termino a la 1.25 a.m el resultado me da que son 21 horas de diferencia entre esas dos horas, utilizo una base de datos de firebird con sql dialect 1, el campo donde almaceno las horas de trabajo son campos doubleprecision, el resultado lo pongo en un campo calculado, el codigo es este:

Código Delphi [-]
 
procedure TfrmRepTecnicos.iqrHorasCalcFields(DataSet: TDataSet);
var
fHoras,horas,horas1,minutos: Double;
begin
iqrHorasCALC_HENTRADA.AsDateTime := FloatToDateTime(iqrHorasHENTRADA.AsFloat);
iqrHorasCALC_HSALIDA.AsDateTime := FloatToDateTime(iqrHorasHSALIDA.AsFloat);
iqrHorasCALC_HORAS.AsInteger := HoursBetween(FloatToDateTime(iqrHorasHENTRADA.AsFloat),FloatToDateTime(iqrHorasHSALIDA.AsFloat));
fHoras := HoursBetween(FloatToDateTime(iqrHorasHENTRADA.AsFloat),FloatToDateTime(iqrHorasHSALIDA.AsFloat));
if iqrHorasCALC_HORAS.AsInteger > 0 then
iqrHorasCALC_MINUTOS.AsFloat := (MinutesBetween(iqrHorasCALC_HENTRADA.AsDateTime,iqrHorasCALC_HSALIDA.AsCurrency)) mod (iqrHorasCALC_HORAS.AsInteger * 60) //(MinutesBetween(FloatToDateTime(iqrHorasHENTRADA.AsFloat),FloatToDateTime(iqrHorasHSALIDA.AsFloat)) mod (iqrHorasCALC_HORAS.AsInteger * 60))
else
iqrHorasCALC_MINUTOS.AsFloat := MinutesBetween(iqrHorasCALC_HENTRADA.AsDateTime,iqrHorasCALC_HSALIDA.AsCurrency);
if iqrHorasTIPO.Value = 'C' then
begin
iqrHorastipocte.Value := 'Casa';
end
else
begin
iqrHorastipocte.Value := 'Empresa';
end;
end;

Última edición por dec fecha: 31-12-2007 a las 15:40:19.
Responder Con Cita
  #2  
Antiguo 31-12-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Es normal que pase eso, ya que a las 1.25 ya cambió la fecha, pero al considerar solo la hora, se hace la resta y obviamente son 21 horas y pico.

Lo normal, crear campos TIMESTAMP, es decir, fecha y hora todo en el mismo campo. Así al realizar operaciones siempre dará el resultado que esperas.

Si ya no puedes cambiar el formato, tendrás que hacer la resta desde las 23:59:59 con las 22:59 y después sumarle 1 hora y 25 minutos.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #3  
Antiguo 31-12-2007
Avatar de Ferrari
Ferrari Ferrari is offline
Miembro
 
Registrado: jun 2006
Ubicación: Torreón, México
Posts: 154
Poder: 18
Ferrari Va por buen camino
Smile

Estoy de acuerdo con Lepe y creo seria tu mejor opcion ya que si manejas el campo completote puedo ayuda con algo similar a lo que requieres porque me sucedio una eventualidad similar a la tuya..solo que con enfermeras que entran en un dia X a las 9pm por ejemplo y salen al dia siguiente a las 7am.
saludos
Responder Con Cita
  #4  
Antiguo 22-03-2008
victor2023 victor2023 is offline
Miembro
 
Registrado: abr 2006
Posts: 22
Poder: 0
victor2023 Va por buen camino
Thumbs up Tema Resuelto

Gracias lepe y ferrari por su ayuda, estuve unos dias mobiendole a ese problema y nomas nada y lo deje por la paz un rato que hasta ya se me habia olvidado jajajja, ahora despues ya de un buen rato que paso, me puse a pegarle a ese asunto ya lo resolvi lo unico que hice fue comparar las horas en variables double como lo tengo en la base de datos doubleprecision y con esto ya porfin salio

if hentrada > hsalida then
begin
iqrHorasCALC_HORAS.Value := CompareTime(iqrHorasCALC_HENTRADA.Value,iqrHorasCALC_HSALIDA.Value);
end
else
begin
iqrHorasCALC_HORAS.Value := HoursBetween(FloatToDateTime(iqrHorasHENTRADA.AsFloat),FloatToDateTime(iqrHorasHSALIDA.AsFloat));
end;
Responder Con Cita
  #5  
Antiguo 22-03-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Desde luego, lo más rápido, seguro y cómodo para tí es crear el campo en formato DATE (en dialecto 1 guarda la fecha y hora) y ya solo hacer el cálculo. Todo lo demás creo que es marear la perdiz.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 01:24:31.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi