Ver Mensaje Individual
  #27  
Antiguo 16-12-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Reputación: 31
Lepe Va por buen camino
Pues aunque dejaste claro que usabas paradox, no sé por qué me hice a la idea que era MySql.

Tienes razón, lo del login o logout no queda muy claro. Entre lo que me decías por el hilo y los mensajes privados me enrollé más que un gato con obillo de lana.

Como bien has dicho, el usuario no tiene por qué marcar si es login o logout ni tampoco saber si es horario de mañana o tarde, eso lo debe solventar el programa.

Como estamos en paradox (es para centrarme un poco jejeje) lo podemos solucionar "a nuestra manera". No hace falta la tabla HorariosFijos, lo podemos resolver desde delphi con una rutina.

Primer problema:
- Deducir si estamos en horario de trabajo de mañana o tarde.
Pues un procedimiento en delphi, que dada la hora actual, nos devuelva dos times, dándonos el horario al que corresponde. Un procedimiento (ResuelveHorario) con 3 variables, la fecha y hora actual del sistema (Tdatetime), Finicio y FFin (ambas TTimes). En Finicio nos devuelve la hora 8:30 y en FFin 12:30, eso si la hora actual está entre esas dos horas, en caso contrario devolvería el horario de tarde. Por supuesto debería lanzar una excepción si la fecha y hora no entra en ninguno de los periodos, al menos para poder localizar el error .

Podría ocurrir que un usuario entre a las 8:25 (porque su reloj esté adelantado) así que en lugar de usar 8:30, yo me curaría en salud y usaría las 8:00. Mejor pedir un intervalo más grande a la base de datos, que pedirlo justito a las 8:30 y que un buen trabajador que entra antes de tiempo no aparezca en el sistema. Lo mismo haría con 12:30 y el resto de horas, siempre ampliando los periodos lo máximo posible sin que intersecten entre sí.

Segundo problema:
- Deducir Login / Logout: Se trata de pedir una consulta con la fecha de hoy, cuya HoraEntrada esté dentro del periodo en el que debería estar trabajando, Si no devuelve datos, es un login. Si devuelve datos, es un Logout piénsalo

Código Delphi [-]
var FActual :Tdatetime;
 Finicio, FFin :Time;
begin
Factual := now;
ResuelveHorario(FActual, Fini, FFin);
query1.sql.text:= 'select HoraEntrada, HoraSalida from horarios where  (FechaEntrada = :FechaActual) and (HoraEntrada between :Fini and FFin) and (id_usuario = :Id)';
query1.parambyname('FechaActual').AsDate := Trunc(Factual);
query1.parambyname('Fini').AsTime := Fini;
query1.parambyname('FFin').AsTime := FFin;
query1.parambyname('Id').AsInteger:= id del usuario actual;
query1.Open;
if query1.fieldbyname('HoraEntrada').IsNull then
// es un login, no se encuentra la fecha de entrada de hoy, todavía no se ha realizado. grabar la fechaEntrada, código de usuario y HoraEntrada en un nuevo registro.
else 
  // es un logout,grabar la hora actual del sistema en HoraSalida y además computar las horas trabajadas en este periodo y los retrasos de entrada.

Problema derivado:
- Algún avispado podría modificar la hora de windows para engañar al sistema, deberás protegerlo. Bien limitando los privilegios del usuario con el que arranca windows, o haciendo que tu aplicación se cargue como Shell de Windows. Ya hay info en el foro, busca un poco o abre un nuevo hilo.

Calcular los retrasos de entrada:
- Se resolvería en un bucle delphi o en un enorme Sql, como prefieras. Al final, y viendo los cálculos que deben hacerse, si añadiría los campos MinutosRetraso y MinutosTrabajados en la tabla horarios.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita