Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #21  
Antiguo 10-09-2010
Avatar de ingabraham
ingabraham ingabraham is offline
Miembro
 
Registrado: ago 2007
Posts: 614
Poder: 17
ingabraham Va por buen camino
y si nadi me da la idea de como hacer un algoritmo para esto, lo planteo de otra forma.
__________________
Enseñar es la virtud de un sabio.
Responder Con Cita
  #22  
Antiguo 10-09-2010
Avatar de ingabraham
ingabraham ingabraham is offline
Miembro
 
Registrado: ago 2007
Posts: 614
Poder: 17
ingabraham Va por buen camino
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.-
__________________
Enseñar es la virtud de un sabio.
Responder Con Cita
  #23  
Antiguo 11-09-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.022
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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.
Responder Con Cita
  #24  
Antiguo 11-09-2010
Avatar de ingabraham
ingabraham ingabraham is offline
Miembro
 
Registrado: ago 2007
Posts: 614
Poder: 17
ingabraham Va por buen camino
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.
__________________
Enseñar es la virtud de un sabio.
Responder Con Cita
  #25  
Antiguo 11-09-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 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 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 ) pueda optimizarlo.

Pero bueno, hace lo que tiene que hacer. Al menos hasta que se demuestre lo contrario...
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.

Última edición por ecfisa fecha: 11-09-2010 a las 08:10:01.
Responder Con Cita
  #26  
Antiguo 11-09-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.022
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por ecfisa Ver Mensaje
[..] 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.
Responder Con Cita
  #27  
Antiguo 11-09-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 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
Cita:
Empezado por Casimiro Notevi Ver Mensaje
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í ...

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.

Última edición por ecfisa fecha: 11-09-2010 a las 19:05:22.
Responder Con Cita
  #28  
Antiguo 11-09-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.022
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por ecfisa Ver Mensaje
Como verás Casimiro, equivocarse no es exclusividad de microsof, pero mía sí ...
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.
Responder Con Cita
  #29  
Antiguo 12-09-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 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
En los parrafos 1 y 3 estoy totalmente de acuerdo con vos.
Ahora en el 2 tengo mis dudas...

Gracias Casimiro.
Responder Con Cita
  #30  
Antiguo 12-09-2010
Avatar de ingabraham
ingabraham ingabraham is offline
Miembro
 
Registrado: ago 2007
Posts: 614
Poder: 17
ingabraham Va por buen camino
Thumbs up

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.
__________________
Enseñar es la virtud de un sabio.
Responder Con Cita
  #31  
Antiguo 12-09-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 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
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
rpt. manager: meses y días transcurridos entre dos fechas dandia28 Impresión 1 20-02-2008 16:56:08
Diferencia 2 Dias entre Tdatetime (delphi) y Datetime (SQL server) sinalocarlos Varios 2 10-05-2007 04:00:38
Diferencia en dias entre dos fechas. AMINOA2R Firebird e Interbase 2 15-12-2005 16:58:37
Dias y meses romansiux Varios 5 13-06-2005 18:19:12
agrupar por dias meses y años en Interbase????? mguixot Conexión con bases de datos 0 03-10-2003 20:31:08


La franja horaria es GMT +2. Ahora son las 13:02:01.


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
Copyright 1996-2007 Club Delphi