Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   problema con HoursBetween (https://www.clubdelphi.com/foros/showthread.php?t=51835)

victor2023 31-12-2007 15:32:45

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;

Lepe 31-12-2007 15:46:47

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

Ferrari 31-12-2007 17:03:27

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

victor2023 22-03-2008 06:11:50

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 :D

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;

Lepe 22-03-2008 12:13:42

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


La franja horaria es GMT +2. Ahora son las 18:38:06.

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