Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Como convertir hora a tipo numeric? (https://www.clubdelphi.com/foros/showthread.php?t=84976)

negrokau 08-01-2014 12:39:12

Como convertir hora a tipo numeric?
 
Hola amigos, tengo un inconveniente en un calculo, ya busque mucho en el foro pero no estoy encontrando una solucion, o por lo menos no lo estoy entendiendo lo que ya encontre...

Mi inconveniente es que necesito calcular la diferencia entre hora de entrada y hora de salida de un estacionamiento, el resultado de horas utilizadas tengo que calcularlo por un TARIFA establecido...

Este es mi codigo:

Boton1
Establece la hora de entrada

Código Delphi [-]
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
DATAMODULE1.Q_PRUEBA.Open;
DATAMODULE1.Q_PRUEBA.Append;
DATAMODULE1.Q_PRUEBA.FieldValues['COD_PRUEBA']:=1;
DATAMODULE1.Q_PRUEBA.FieldValues['HORA1']:=TIME;//hora de entrada
end;

Boton2
Establece
-La hora de Salida
-Calcula la diferencia de (hora de salida - hora de entrada)
-Multiplica la cantidad de horas utilizadas con la TARIFA establecida

Código Delphi [-]
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
DATAMODULE1.Q_PRUEBA.FieldValues['HORA2']:=TIME;//hora de salida
DATAMODULE1.Q_PRUEBA.FieldValues['T_HORA']:=DATAMODULE1.Q_PRUEBA.FieldValues['HORA2']-DATAMODULE1.Q_PRUEBA.FieldValues['HORA1'];//total de horas
DATAMODULE1.Q_PRUEBA.FieldValues['MONTO']:=DATAMODULE1.Q_PRUEBA.FieldValues['T_HORA']*DATAMODULE1.Q_PRUEBA.FieldValues['TARIFA'];//total de horas * TARIFA
end;

Los Campos HORA1, HORA2 Y T_HORA son tipo TIME
Los campos MONTO y TARIFA son tipo NUMERIC

Como multiplicar un dato tipo TIME con un NUMERIC?

Ojala lo hayan entendido, le agradezco desde ya... que pasen un buen dia... gracias...

Caminante 08-01-2014 18:49:04

Podrías calcular la diferencia de horas con la función HoursBetween que devuelve un entero y así multiplicarlo con el monto por hora.
Aunque cuando resto fechas de la forma que lo haces siempre me devuelve un entero.

Saludos

Casimiro Notevi 08-01-2014 20:36:46

Deberías guardar la hora de entrada y la de salida en tipo "datetime", ahora llamado "timestamp". Aunque sólamente presentes la hora al usuario.

Así que:
Código Delphi [-]
 importe = preciohora * HoursBetween( fechahorasalida, fechahoraentrada )

ecfisa 08-01-2014 20:58:44

Hola negrokau.
Cita:

Empezado por negrokau (Mensaje 471426)
...
Como multiplicar un dato tipo TIME con un NUMERIC?

Respondiendo a esa consulta, la ayuda de Delphi dice:
Cita:

Delphi stores date and time values in the TDateTime type. The integral part of a TDateTime value is the number of days that have passed since 12/30/1899. The fractional part of a TDateTime value is fraction of a 24 hour day that has elapsed.
Atendiendo a lo anterior, podemos hacer por ejemplo:
Código Delphi [-]
function HourValue(const Entrada, Salida: TDateTime; const Valor: Double): Double;
begin
  Result :=  Frac(Salida - Entrada) * 24 * Valor;
end;

Y luego usar la función de este modo:
Código Delphi [-]
  with DATAMODULE1.Q_PRUEBA do
    FieldValues['MONTO'] := HourValue(FieldValues['HORA1'], FieldValues['HORA2'], PRUEBA.FieldValues['TARIFA']);

Saludos :)


La franja horaria es GMT +2. Ahora son las 10:02:18.

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