Ver Mensaje Individual
  #31  
Antiguo 12-09-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Reputación: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Mirá te documento el código que es la mejor manera que se me ocurre para explicarlo.
Creo que, como a mí, tener un calendario en la mano te va ayudar a entender como es la lógica de dias360.
Código Delphi [-]
function Dias360(Des,Has: TDateTime): Integer;
var
  dd,dm,dh,da: Integer;
begin
  if DayOf(Des) = 31 then Des:= IncDay(Des, -1); // mes de 30 días
  if Abs(YearOf(Has)-YearOf(Des)) = 0 then  // mismo año
  begin
    // días que faltan para completar mes (Des)
    dd:= 30 - DayOf(Des);
    // días comprendidos entre meses
    dm:= (Abs(MonthOf(Des)-MonthOf(Has))-1)*30;
    // días transcurridos del mes (Has)
    dh:= DayOf(Has);
    // sumar días
    Result:= dd + dm + dh;
  end
  else    // años diferentes
  begin
    // días transcurridos entre años
    da:= Abs(YearOf(Has)-YearOf(Des)-1)*360;
    // (total dias del 1 año) - dias transcurridos fecha (Des)
    dd:= 360 - MonthOf(Des)*30;
    // total días transcurridos meses fecha Has + los días fecha (Has)
    dm:= (MonthOf(Has)-1)*30 + DayOf(Has);
    // diás faltantes  para completar mes (Des)
    dh:= 30 - DayOf(Des);
    // sumar días
    Result:= da + dd + dm + dh;
  end
end;

A la reducción de la fórmula llegué simplemente reemplazando las variables por su equivalente, como por ejemplo en:
Código Delphi [-]
     Result:= dd + dm + dh
     // es igua a:
    Result:= 30-DayOf(Des)+(Abs(MonthOf(Des)-MonthOf(Has))-1)*30+DayOf(Has)

Por último, los resultados los cotejé contra el OpenOffice.org.calc.

Saludos.
Responder Con Cita