Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Simultaneidad de fechas (https://www.clubdelphi.com/foros/showthread.php?t=40762)

gluglu 27-02-2007 14:09:50

Es muy facil. Es dificil de creer que la solución que te voy a dar es la más simple y eficiente. Puedes comprobarla, y analiza el algoritmo que te explico, y verás que es correcto.

Yo lo utilizo en mi sistema de gestión de reservas de hoteles.

1. Obtienes todos los registros de fechas de trabajo de un profesor de terminado, ordenados por fechas de inicio. (Muy importante esto último.)

2. Realizas un loop 'Do while not eof' de esos registros obtenidos, habiendo creado previamente dos variables tipo fecha, p.ej. FechaMin y FechaMax.

3. Reemplazas FechaMin y FechaMax con los respectivos valores del 1er registro.

4. Realizamos el 'Do while not eof'

Código Delphi [-]
If (Fecha Inicio Nuevo Registro <= FechaMax)
  and  (Fecha Final Nuevo Registro >= FechaMin) then begin
    if Fecha Final Nuevo Registro > FechaMax then
      FechaMax := Fecha Final Nuevo Registro
end;

Presta especial atención a lo expuesto : Tienes que comparar Fecha Inicio nuevo registro con FechaMax (<=), y Fecha Final nuevo registro con FechaMin (>=).

5. Si la condición anterior NO se cumple estamos ante un nuevo periodo de fechas que NO se solapa con ningún otro, por lo que sumamos el número de días entre FechaMin y FechaMax a una variable TotalComputo o algo parecido.

6. Procedemos de nuevo por el punto 3 con el último registro y las nuevas FechasMin y FechaMax con los respectivos valores de FechaInicio y FechaFinal

7. Al final de recorrer todos los registros, obtendrás el total de días trabajados en la variable TotalComputo.

... envío este hilo y ahora intentaré añadir otro con un código más concreto como ejemplo.

gluglu 27-02-2007 14:20:04

Intentaré hacerlo con un código 'genérico' para que sea más comprensible.

Ya lo adaptas a la base de datos que utilices.

Código Delphi [-]
Select FechaInicio, FechaFinal from FECHAS
where Profesor = CodigoSeleccionado
order by FechaInicio
 
First;
FechaMin := FechaInicio;
FechaMax := FechaFinal;
TotDiasTrabajados := 0;
 
while not Eof do begin
 
  if (FechaInicio <= FechaMax) and (FechaFinal >= FechaMin) then begin
    if FechaFinal > FechaMax then FechaMax := FechaFinal;
  end
  else begin
    TotDiasTrabajados := TotDiasTrabajados + (FechaMax - FechaMin);
    FechaMin := FechaInicio;
    FechaMax := FechaFinal;
  end;
 
  Next;
 
end;
 
TotDiasTrabajados := TotDiasTrabajados + (FechaMax - FechaMin);

;) Pruébalo. Espero sorprenderte con el resultado.

Un saludo.

Lepe 27-02-2007 14:49:35

Hola gluglu:

Debo reconocer que tu método es bastante ingenioso. Acabo de realizar un par de trazas y veo que el resultado es correcto en los casos más peliagudos.

Incluso restar los fínes de semana sería fácil.

Esa fue mi primera idea, pero no los ordené por fecha de inicio y claro... tu "else" se me atragantaba jejeje.


Saludos


La franja horaria es GMT +2. Ahora son las 02:51:32.

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