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 calculos de hora (https://www.clubdelphi.com/foros/showthread.php?t=56872)

enecumene 29-05-2008 18:20:21

Problema con calculos de hora
 
Hola Compañeros del foro, estoy en un proyecto de control de asistencia de personal, y estoy teniendo problemas con la comparación de la hora para definir si el empleado llegó tarde o no, aqui os pongo una parte del código (porque es muy extenso):

Aqui las variables:

Código Delphi [-]
Var   Encontro :Boolean;
       MarcarLuego, Ahora: TTime;
      TiempoDespues: string;
      
   LongTimeFormat := 'hh:mm:ss';
   TiempoDespues := '00:30:00';
   MarcarLuego := ZMarcadoENTRADA.Value + StrToTime(TiempoDespues);
   Ahora := Time;


Aquí donde trato de hacer la comparación la cual lo ignora:

Código Delphi [-]
if ZTable1TANDA.AsInteger = 1 then
                   begin                    
                    if Ahora > ZConfigHORA1.Value then 
                      begin                         
                        ZAtraso.Close;
                        ZAtraso.SQL.Clear;               
                        ZAtraso.SQL.Add('insert into TARDANZAS(ID,EMPID,FECHA) values(NULL, :Cod, :Hoy)');
                        ZAtraso.ParamByName('Cod').AsInteger := ZTable1ID.AsInteger;
                        ZAtraso.ParamByName('Hoy').AsDate := Date;
                        ZAtraso.ExecSQL;
                      end;
                    end;


el objetivo de éste último código, si la tanda del usuario es 1 (Vespertina), verifica si la hora actual es mayor a la hora límite de la llegada, si es así, se le apunta como una tardanza, pero la ignora, igual ejecuta el código aunque la hora actual sea menor que la del límite, por eso pienso que el problema esta en el cálculo de las horas, estoy trabajando con Delphi 7 y FB2.0.

A ver quién me echa una manita :).

Saludos.

Caral 29-05-2008 19:20:07

Hola
Supongo que hay mucha mas informacion que la que proporcionas, para mi no coinciden algunas cosas.
Parece que:
TiempoDespues := '00:30:00'; es el dato que se introduce en el campo (ZConfigHORA1) pero como string.
Luego se quiere hacer una comparacion de un dato TIME con uno string.
Código Delphi [-]
if Ahora > ZConfigHORA1.Value then
No entiendo muy bien el asunto, me parece que formateando la hora seria suficiente pero no entiendo lo que pretendes hacer.
Saludos

enecumene 29-05-2008 19:54:29

Vale, Aquí más información:

ZConfigHORA1 = La hora límite de llegada, por defecto está como 8:15:59 AM.
TiempoDespues = viene siendo media hora despúes del registro, despúes de media se realiza la salida.
Ahora = viene siendo el tiempo en el momento.

Ahora bien, la hora de llega oficial es a las 8:00:00 AM y el límite es a las 8:15:59 (ZConfigHORA1) si el usuario llega en ese rango no se marca tardanza pero despúes de ahi si se marca la tardanza, ejemplo:

juan perez llego marco a la 8:05:27 AM tardanza: 0
Fernando Leonor llego marco a las 8:16:31 AM tardanza: 1

de ahi el codigo:

Código Delphi [-]
if Ahora > ZCondigHora1.asTime then...

Si Ahora es mayor que la hora limite pues se marca tardanza si no, No se marca.

Espero haberme explicado mejor, :D.

Saludos.

maeyanes 29-05-2008 19:56:59

Hola...

Caral, en que lugar se asigna TiempoDespues al campo ZConfigHora1? Por que yo no lo veo por ningún lado...

Ahora, enecumene, la verificación de la hora no debería ser:

Código Delphi [-]
if Ahora > MarcarLuego then
begin
  // ...
end
?

Saludos...

enecumene 29-05-2008 20:04:09

Gracias Maeyanes por responder, MarcarLuego se trata de otro código que forma parte de ese que posteé, su función es la siguiente:

ZMarcadoENTRADA = es la hora de llegada que marcó el empleado.
MarcarLuego = es la suma de 30 minutos + la hora de llegada.

Ejemplo;

Fernando Leonor llego marco a las 8:16:31 AM
Fernando Leonor vuelve a marcar por que olvido ya habia marcado, a las 8:28:15.

8:16:31 + 00:30:00 = 8:36:31;

Si 8:28:15 es menor que 8:36:31 le avisa al empleado que ya marcó, es para evitar doble registro.

Código:

Código Delphi [-]
if Ahora < MarcarLuego then
            begin
              Label1.Caption := '¡Ya habías Ponchado!';
              Actualizar.Enabled := True;
              Exit;
            end

Pero el problema es que las ignora, los brinca y sigue el proceso.

Saludos.

gluglu 29-05-2008 20:08:33

Sin entrar en mayores análisis del código expuesto, solamente digo que trabajar con horas y variables tipo TTime me ha traido demasiados quebraderos de cabeza. :o

Desde hace tiempo decidí convertir previamente todos los tipos Time a String, antes de cualquier operación, consultar, etc. (Eso no quita que en la base de datos las sigo almacenando como tipo Time).

Y desde entonces todos mis problemas desaparecieron.

Es simplemente una reflexión.

Caral 29-05-2008 20:09:54

Hola
Cita:

Empezado por maeyanes (Mensaje 289993)
Hola...

Caral, en que lugar se asigna TiempoDespues al campo ZConfigHora1? Por que yo no lo veo por ningún lado...

Pues es una buena pregunta, pero no tengo la respuesta, como tampoco veo por ningún lado la relación de marcarluego como indicas.
Normalmente es para pedir un poco mas de información, ya que no se entiende.
Os dejo con esto, que para eso sois los que sabéis.:)
Saludos

gluglu 29-05-2008 20:11:28

Código Delphi [-]
Ahora       := FormatDateTime('hhnnss', Time);
MarcarLuego := FormatDateTime('hhnnss', ZMarcadoENTRADA.Value + StrToTime(TiempoDespues));
if Ahora < MarcarLuego then
  ....

enecumene 29-05-2008 20:12:01

Cita:

Empezado por gluglu (Mensaje 290001)
Sin entrar en mayores análisis del código expuesto, solamente digo que trabajar con horas y variables tipo TTime me ha traido demasiados quebraderos de cabeza. :o

Desde hace tiempo decidí convertir previamente todos los tipos Time a String, antes de cualquier operación, consultar, etc. (Eso no quita que en la base de datos las sigo almacenando como tipo Time).

Y desde entonces todos mis problemas desaparecieron.

Es simplemente una reflexión.

Pues deja hacer el intento de convertir todos los time en string, luego os comento.

enecumene 29-05-2008 21:04:11

Hola, gracias a Gluglu pude resolver esa parte del código de esta manera:


Código Delphi [-]
var  MarcarLuego, Ahora, Limite: string;
           TiempoDespues: TTime;
      
      TiempoDespues := IncMinute(ZMarcadoENTRADA.value, 30);
      MarcarLuego := FormatDateTime('hhnnss', TiempoDespues);
      Ahora := FormatDateTime('hhnnss', Time);
      Limite := FormatDateTime('hhnnss', ZConfigHORA1.Value);

if ZTable1TANDA.AsInteger = 1 then
                  begin
                    if Ahora > Limite then
                      begin
                        ZAtraso.Close;
                        ZAtraso.SQL.Clear;
                        ZAtraso.SQL.Add('insert into TARDANZAS(ID,EMPID,FECHA) values(NULL, :Cod, :Hoy)');
                        ZAtraso.ParamByName('Cod').AsInteger := ZTable1ID.AsInteger;
                        ZAtraso.ParamByName('Hoy').AsDate := Date;
                        ZAtraso.ExecSQL;
                      end;
                    end;

Gracias Gluglu, ahora, hice lo siguiente para esta otra parte del código:

Código Delphi [-]
if Ahora < MarcarLuego then
            begin
              Label1.Caption := '¡Ya habías Ponchado!';
              Actualizar.Enabled := True;
              Exit;
            end

Pero no me la está tomando en cuenta:confused:, no entiendo, por qué en un lado funciona y en el otro no?. Bueno, el código anterior tiene la función como había explicado anteriormente, que si un empleado marcó a una hora y por cosa de la vida no recuerda que habia marcado su entrada y vuelve a marcar antes de media hora luego de haber marcado la primera, el sistema le avisa que ya marcó su hora, pues a pesar de la propuesta de Gluglu en este caso me sigue ignorando el calculo.

Saludos.

gluglu 30-05-2008 10:06:30

Se debe de escapar algo en tu código ...

Algo tiene que haber en tu código que te modifique los valores. Deberás comprobar justo antes de la comparación, los valores que toman las variables. ;)

enecumene 30-05-2008 14:12:04

Cita:

Empezado por gluglu (Mensaje 290112)
Se debe de escapar algo en tu código ...

Algo tiene que haber en tu código que te modifique los valores. Deberás comprobar justo antes de la comparación, los valores que toman las variables. ;)

Vale, estoy en eso y no he encontrado el problema, pero ya lo encontraré y luego te comento la solución, y de Nuevo gracias por tu ayuda ;).

Saludos.

Casimiro Notevi 30-05-2008 19:30:02

Yo lo que no entiendo es por qué tratar los datos time como strings. Los times son números y por lo tanto más fáciles de hacer cálculos con ellos.

gluglu 30-05-2008 22:36:21

Pongo un ejemplo en el que (para mi) la ventaja de utilizar strings es muy grande.

Hace poco se me presentó el problema de obtener todos aquellos registros que se encuentren entre una fecha y hora, y otra fecha y hora.

Vuelvo a indicar que en la base de datos sí que almaceno los valores como Date y Time, pero para cálculo COMPARATIVO es mucho más rápido y facil utilizar strings. Puede ser (y ciertamente le doy la razón) que como dice Casimiro, para sumas, restas, y otras operaciones de cálculo sea más fácil tratarlos como Time y Date que son.

Pero volviendo al problema que planteaba :

Supongamos que quiero obtener todos los registros cuya Fecha y Hora se encuentren entre el 28/05/2008 a las 19:41:02 y el 02/06/2008 a las 08:12:59.

Creo que cualquier comparación posible se hace mucho más fácil e inmediata si manejamos esos valores como 20080528194102 y 20080602081259

Por ejemplo, vemos que si convertimos 31/05/2008 00:45:13 en 20080531004513 obtendremos que ese string está comprendido entre los dos valores anteriores. Al tratarlo como String, Delphi nos da la solución directamente, con una única comparación.

Es mi opinión personal en cualquier caso. ;)


La franja horaria es GMT +2. Ahora son las 06:17: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