Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   diferencia de dias , suponiendo que los meses son de 30 dias. (https://www.clubdelphi.com/foros/showthread.php?t=69816)

ingabraham 10-09-2010 21:55:39

y si nadi me da la idea de como hacer un algoritmo para esto, lo planteo de otra forma.

ingabraham 10-09-2010 22:14:04

los dias son 30 dias de cada mes.
de los 12 meses.

existen 360 dias al año-

hay q hacer un algoritmo para obtener la dif de dias basandose en estos datos.

Hellpppp.-

Casimiro Notevi 10-09-2010 23:08:03

El problema es que no sabemos qué hace exactamente esa función days360.
Pero se supone que si cuentas los días que hay entre dos fechas, qué hace, calcular todos los meses a 30 días?, es que si es así, entonces no se puede usar daysbetween, salvo que luego restemos los días de meses de 31 días y sumemos las de febrero, teniendo en cuenta si ese año es bisiesto.
No sé, me da la sensación de estar sumando peras y manzanas, algo no cuadra.

ingabraham 11-09-2010 03:26:10

tengo una idea, es la siguiente

supongamos que las fechas son 1 enero a al 31 agosto.
algoritmo seria

diferencia de dias con el DaysBetween

luego
recorrer desde la fi, hasta la final
y hacer lo siguiente

ciclo

if fi[mes1 ( maximo dia ) ]== 31
cuentadias = cuentadias -1

fi[mes1 ( maximo dia ) ]== 28
cuentadias = cuentadias +2

fi[mes1 ( maximo dia ) ]== 29
cuentadias = cuentadias + 1

fciclo
dias+cuenta
y creo q ya.

pero como recorro estos meses de la fi, a la ff.?

espero q me hayan entendido.

nota: la idea es calcular sin importar los 30 dias de cada mes
luego recorrer esos meses y si hay q agregarle se agrega y si hay q quitarles se le quita.

ecfisa 11-09-2010 06:50:26

Hola ingabraham.

Busqué y encontré código de días360, sobre todo en VB, y ningúno funcionó. Es más, ni siquiera arrimaban a un resultado coherente, DaysBetween aproximaba mejor.

Así que pasé el borrador sobre lo leido, dejé de perder el tiempo e hice la función desde cero.
No sé si es buen código... seguramente algún compañero con mas luces que yo ( y reconozco que son muchos :o ) pueda optimizarlo.

Pero bueno, hace lo que tiene que hacer. Al menos hasta que se demuestre lo contrario... :p
Código Delphi [-]
function Dias360(Des,Has: TDateTime): Integer;
begin
  if Abs(YearOf(Has)-YearOf(Des)) = 0 then
    Result:= 30-DayOf(Des)+
             (Abs(MonthOf(Des)-MonthOf(Has))-1)*30+DayOf(Has)
  else
  begin
    Result:= Abs(YearOf(Has)-YearOf(Des)-1)*360+
             360-MonthOf(Des)*30+30-DayOf(Des)+
             (MonthOf(Has)-1)*30+DayOf(Has)
  end
end;

Saludos.:)

Casimiro Notevi 11-09-2010 10:05:36

Cita:

Empezado por ecfisa (Mensaje 376064)
[..] Busqué y encontré código de días360, sobre todo en VB, y ningúno funcionó. Es más, ni siquiera arrimaban a un resultado coherente, DaysBetween aproximaba mejor.[..]

Incluso microsoft se equivocó en algunas versiones de excel con su función days360 y luego lo han modificado varias veces hasta dejarlo como está ahora.

ecfisa 11-09-2010 18:02:08

Cita:

Empezado por Casimiro Notevi (Mensaje 376065)
Incluso microsoft se equivocó en algunas versiones de excel con su función days360 y luego lo han modificado varias veces hasta dejarlo como está ahora.

Como verás Casimiro, equivocarse no es exclusividad de microsof, pero mía sí ... :D

Acabo de corregir un pif de la función que escribí. Lo dá cuando el día ingresado en la fecha inicial es 31, por suerte es fácil de corregir.

Queda así:
Código Delphi [-]
function Dias360(Des,Has: TDateTime): Integer;
begin
  if DayOf(Des) = 31 then Des:= IncDay(Des, -1); // Línea agregada
  if Abs(YearOf(Has)-YearOf(Des)) = 0 then
    Result:= 30-DayOf(Des)+
             (Abs(MonthOf(Des)-MonthOf(Has))-1)*30+DayOf(Has)
  else
  begin
    Result:= Abs(YearOf(Has)-YearOf(Des)-1)*360+
             360-MonthOf(Des)*30+30-DayOf(Des)+
             (MonthOf(Has)-1)*30+DayOf(Has)
  end
end;

Saludos. :)

Casimiro Notevi 11-09-2010 20:28:22

Cita:

Empezado por ecfisa (Mensaje 376083)
Como verás Casimiro, equivocarse no es exclusividad de microsof, pero mía sí ... :D

La diferencia es que ellos son tropecientos mil programadores que cobran una barbaridad, que tienen control de calidad, testeadores, revisores, probadores... o como se les quiera llamar, etc. :)
Por lo tanto, tu código es mucho mejor, más seguro, más eficiente, más económico y no hay que esperar a una versión nueva del programa para solucionar el problemilla, jejeje :)
Y por si fuese poco, tu código es libre como el viento, el de ellos no lo verás jamás aunque pagues por un excel.

ecfisa 12-09-2010 00:35:43

En los parrafos 1 y 3 estoy totalmente de acuerdo con vos.
Ahora en el 2 tengo mis dudas... :D

Gracias Casimiro.:)

ingabraham 12-09-2010 20:57:28

gracias, lo he probado con varias fechas
hasta el momento todo esta bien, no se si depronto con algun rango de fechas podra fallar-

muchas gracias esto era lo que esperaba,
pero me podrias dar una breve explicacion de lo q hicistes q no entendi nda de la funcion de la logica q tiene.

ecfisa 12-09-2010 22:37:48

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.:)


La franja horaria es GMT +2. Ahora son las 19:24:26.

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