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 29-07-2010 23:23:28

Dias360 en delphi
 
en excel para calcular el numero de dias es asi:
pero ojo excel toma como 360 dias por año.

DIAS360(fecha_inicial;fecha_final;método)

quiero hacer igual a excel, q me arroje el mismo resultado de dias pero en delphi.

ecfisa 29-07-2010 23:29:01

Hola ingabraham.

La función DaysBetween que esta en la unit DateUtils, te da la cantidad de días entre dos fechas.


Saludos.

delphi.com.ar 29-07-2010 23:31:53

Supongo que será algo como:
Código Delphi [-]
function DaysBetween360(const ANow, AThen: TDateTime): Integer;
begin
  Result := (DaysBetween(ANow, AThen) div 30) *  30;
end;

Saludos!

delphi.com.ar 30-07-2010 00:06:45

Después de responder, me di cuenta que la funcion DAYS360 / DIAS360 no cuenta simplemente meses de 30 días, sino que es algo mas complejo:

http://office.microsoft.com/en-us/ex...005209047.aspx


Encontre en la web este código en VB: http://www.experts-exchange.com/Data..._24634023.html
Y lo traduje a esto SIN PROBARLO:

Código Delphi [-]
function Days360(const ANow, AThen: TDateTime; Method: boolean): Integer;
var
  dStartDate,
  dEndDate: TDateTime;
  wStartDay,
  wStartMonth,
  wStartYear,
  wEndDay: Word;
  FebruaryAdjustment: Integer;
begin
  { Local copy }
  dStartDate := ANow;
  dEndDate := AThen;

  DecodeDate(dStartDate, wStartYear, wStartMonth, wStartDay);
  wEndDay := DayOf(dEndDate);

  if not Method Then
  begin
    { U.S. (NASD) method.
      If the starting date is the 31st of a month, it becomes equal to the 30th of the same month.
      If the ending date is the 31st of a month and the starting date is earlier than the 30th of a month,
      the ending date becomes equal to the 1st of the next month;
      otherwise the ending date becomes equal to the 30th of the same month.
    }

    if wStartDay > 30 then
      dStartDate := dStartDate - 1;

    if (wEndDay = 31) and (wStartDay < 30) then
      dEndDate := dEndDate + 1
    else
    if(wEndDay = 31) and (wStartDay >= 30) then
      dEndDate := dEndDate - 1;

    // adjust for February
    if (wStartMonth = 2) and (wStartDay = DaysInAMonth(wStartYear, wStartMonth)) then
      FebruaryAdjustment := 30 - wStartDay // Last day of February (either 28 or 29)
    else
      FebruaryAdjustment := 0;

  end else
  begin
    {
     European method.
     Starting dates and ending dates that occur on the 31st of a month become
     equal to the 30th of the same month.
    }

    if wStartDay > 30 Then
      dStartDate := dStartDate - 1;

    if wEndDay > 30 Then
      dEndDate := dEndDate - 1;

    FebruaryAdjustment := 0;
  end;

  Result := (MonthsBetween(dStartDate, dEndDate) * 30) + (wStartDay - wStartDay) - FebruaryAdjustment;
end;

ingabraham 16-08-2010 18:52:14

como se llama esta función?
Method: boolean
que es?
que se le pasa por parametro.

ecfisa 16-08-2010 23:15:15

Cita:

Empezado por ingabraham (Mensaje 373645)
como se llama esta función?
Method: boolean
que es?
que se le pasa por parametro.

Hola ingabraham.

El nombre de la función es Days360, como lo expuso Delphi.com.ar.

Method es un parámetro de tipo Boolean (Verdadero o Falso). Aparentemente, sirve para indicarle
a la función por que método se va a realizar el cálculo: U.S. (NASD) method ó European method



Saludos.

afunez2007 16-08-2010 23:29:04

Cita:

Empezado por delphi.com.ar (Mensaje 372055)
Supongo que será algo como:
Código Delphi [-]function DaysBetween360(const ANow, AThen: TDateTime): Integer; begin Result := (DaysBetween(ANow, AThen) div 30) * 30; end;


Saludos!

La funcion DasyBetween es bastante simple de usar y devuelve la cantidad de dias entre 2 fechas, si tuevieramos dos datetimepcikers por ejemplo seria asi:

Código Delphi [-]
Var
dias: Integer
Begin
 dias:=DaysBetween(Dtp1.Date, Dtp2.date);
end;

Saludos

ingabraham 18-08-2010 23:47:39

NO ME FUNCIONA NINGUNO DE LOS DOS CODIGOS :confused:
Ingresen a excel dos fechas

y en la celda resultado escriban =dias360(f1,f2);

esto es lo que yo quiero obtener en delphi

?????
ayudenme.

afunez2007 19-08-2010 00:31:57

1 Archivos Adjunto(s)
Cita:

Empezado por afunez2007 (Mensaje 373682)
La funcion DasyBetween es bastante simple de usar y devuelve la cantidad de dias entre 2 fechas, si tuevieramos dos datetimepcikers por ejemplo seria asi:

Código Delphi [-]Var dias: Integer Begin dias:=DaysBetween(Dtp1.Date, Dtp2.date); end;


Saludos

Lo probe en excel y en delphi 7, en ambos funciona pero dan 1 dia de diferencia debiado a que excel utiliza meses de 30 dias y delphi utiliza dias reales.

Código Delphi [-]
IntEdit1.Value:=DaysBetween(dtp1.Date , dtp2.Date);
No olvidar poner en las uses DateUtils

Saludos

Caral 19-08-2010 00:56:37

Hola
Código Delphi [-]
procedure TForm1.btn1Click(Sender: TObject);
begin
IntEdit1.Value:=DaysBetween(dtp1.Date , dtp2.Date + 1);
end;
Saludos

ecfisa 19-08-2010 10:42:56

A ver ingabraham... probá con esta función:

Código Delphi [-]
function Dias360(FechaIni,FechaFin: TDateTime; MetodoEuro: Boolean): Longint;
var
  DiaIni, DiaFin: Longint;
begin
  DiaIni:= DayOf(FechaIni);
  DiaFin:= DayOf(FechaFin);
  if not MetodoEuro then
  begin
   if DiaIni = 31 then
     FechaIni:= IncDay(FechaIni, -1);
   if (DiaFin = 31)and(DiaIni = 31) then
     FechaFin:= IncDay(FechaFin, -1)
   else
     if DiaFin = 31 then
       FechaFin:= IncDay(FechaFin, 1);
  end
  else
  begin
    if DiaIni = 31 then
      FechaIni:= IncDay(FechaIni, -1);
    if DiaFin = 31 then
      FechaFin:= IncDay(FechaFin, -1);
  end;
  DiaIni:= DayOf(FechaIni);
  DiaFin:= DayOf(FechaFin);
  if YearOf(FechaFin) > YearOf(FechaIni)  then
    FechaFin:= IncMonth(FechaFin, 1);
  Result:= MonthsBetween(FechaIni, FechaFin)* 30 + DiaFin - DiaIni;
end;

Al igual que la de Federico es una traducción.

No uso Microsoft Office por lo que no puedo probarla con Excel, pero pareciera funcionar.

De no ser así, con todo lo que te han posteado, tenés una buena base para desarrollarla
por vos mismo. Al fín y al cabo, sos el interesado ¿no ? :D

Por supuesto, cuando esté funcionando, todos te vamos a agradecer el aporte si decidís compartirlo. :)

Saludos.

ingabraham 20-08-2010 01:11:58

hola gracias por el codigo, lo probare.
a mis compañeros que me mencionan la funcion DaysBetween

prueben con 22 febrero del 2010 y 10 agosto 2010

dias360 excel da 168

DaysBetween delphi da 169


casi pega en el blanco, lo que no se es si con un rango de fecha mas grande existan más dias de diferencia.

ingabraham 20-08-2010 01:56:29

hola gracias por el codigo, pero nda, no me funciona.

a mis compañeros que me mencionan la funcion DaysBetween

prueben con
22 -02--2010 y 10-08-2010
dias360 excel da 168
DaysBetween delphi da 169

diferencia 1 dia

06 -11-2009 y 30-07-2010
dias360 excel da 264
DaysBetween delphi da 266

diferencia 2 dias


28-03-2010 y 10-08-2010
dias360 excel da 132
DaysBetween delphi da 135

diferencia 3 dias

ingabraham 10-09-2010 18:50:57

diferencia de dias , suponiendo que los meses son de 30 dias.
 
necesito un algoritmo para calcular la diferencia de dias entre dos fechas

partiendo de que cada mes tiene 30 dias y año 360.

Casimiro Notevi 10-09-2010 18:52:46

Pues entonces sólo has de dividir entre 30 :)

ingabraham 10-09-2010 19:03:20

Cita:

Empezado por Casimiro Notevi (Mensaje 376008)
Pues entonces sólo has de dividir entre 30 :)

como asi,
ej.

31.01.2010
al
15.09.2010

o

27.02.2010
al
15.09..2010

ecfisa 10-09-2010 19:18:50

Hola.

Este tema ya se trató aca .

Saludos.

Casimiro Notevi 10-09-2010 19:29:33

ingabraham, si no has conseguido resolver el problema, no inicies un nuevo hilo, sigue con el que estabas, gracias.

Ya he unido los dos en uno sólo.

ecfisa 10-09-2010 19:37:35

Gracias Casimiro.

Avisé para evitar múltiples resultados de un mismo tema en las busquedas.

Saludos. :)

Casimiro Notevi 10-09-2010 19:48:23

Cita:

Empezado por ecfisa (Mensaje 376018)
Gracias Casimiro.
Avisé para evitar múltiples resultados de un mismo tema en las busquedas.
Saludos. :)

Claro, de la otra forma nos quedamos con temas sin solucionar, hay que continuar en el mismo hasta que esté resuelto el problema. Gracias.


La franja horaria es GMT +2. Ahora son las 17:08: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