Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Нужна помощь [D7, XP]


Страницы:   1 2

Прохожев Максим ©   (2007-02-16 10:18:00) 

Добрый день !!! Мне нужна помощь, я только изучаю дельфи, не могу решить самостоятельно. В общем есть функция которая подсчитывает количество дней между двумя датами, появилась необходимость откорректировать эту функцию так, что бы она брала по умолчанию 30 дней за месяц (любой месяц) Помогите исправить ее так. Заранее спасибо.

function DaysBetween(d1 : Integer;
    m1 : Integer;
    y1 : Integer;
    d2 : Integer;
    m2 : Integer;
    y2 : Integer):Integer;forward;

function DaysBetween(d1 : Integer;
    m1 : Integer;
    y1 : Integer;
    d2 : Integer;
    m2 : Integer;
    y2 : Integer):Integer;
var
   n1 : Integer;
   n2 : Integer;
begin
   if m1>2 then
   begin
       m1 := m1+1;
   end
   else
   begin
       m1 := m1+13;
       y1 := y1-1;
   end;
   n1 := 36525*y1 div 100+306*m1 div 10+d1;
   if m2>2 then
   begin
       m2 := m2+1;
   end
   else
   begin
       m2 := m2+13;
       y2 := y2-1;
   end;
   n2 := 36525*y2 div 100+306*m2 div 10+d2;
   Result := n2-n1;
end;


iXT   (2007-02-16 14:30:00) [1]

А что за банк? :)
Непойму, как так можно проценты считать

Знавал я одну контору у которых (100 + 3%) + 5% = 108 :) Причем контора была не мелкая, да и сейчас живет :)


Desdechado   (2007-02-16 12:52:00) [2]

Я не пойду к вам брать кредит. Жулики какие-то...


Прохожев Максим   (2007-02-16 12:42:00) [3]

Проблема снята, всем спасибо.

2 fd979, отдельное большое спасибо !!!


Elen   (2007-02-16 12:38:00) [4]


>  Ато у меня ошибка выходит.

Какая?


Прохожев Максим   (2007-02-16 12:36:00) [5]


> Function DAYS360(pDateFrom, pDateTo: TdateTime): Integer;
>
>
> Var
>    d1, m1, Y1, d2, m2, y2 : Integer;
>    dtTemp1: Double;
> begin
>  d1 := dayof(pDateFrom);
>  m1 := monthof(pDateFrom);
>  Y1 := yearof(pDateFrom);
>  d2 := dayof(pDateTo);
>  m2 := monthof(pDateTo);
>  y2 := yearof(pDateTo);
>  dtTemp1 := pDateFrom + 1;
>  If (dayof(dtTemp1) = 1) And (monthof(dtTemp1) = 3) Then
>      d1 := 30;
>  If (d2 = 31) And (d1 = 30) Then
>      d2 := 30;
>
>  Result := Trunc(Int(((y2 - Y1) * 360) + ((m2 - m1) * 30)
> + (d2 - d1)));
> End;


А в Uses что нибудь нужно подключать ??? Ато у меня ошибка выходит.


fd979   (2007-02-16 12:21:00) [6]

Я проверил работает нормально - как ты указал:


> Прохожев Максим   (16.02.07 11:12) [16]
> 28.01.2006 по 28.02.2006 = 30
> 28.01.2006 по 28.03.2006 = 60
> 28.01.2006 по 01.03.2006 = 33


fd979   (2007-02-16 12:17:00) [7]

Попробуй так:
Function DAYS360(pDateFrom, pDateTo: TdateTime): Integer;

Var
   d1, m1, Y1, d2, m2, y2 : Integer;
   dtTemp1: Double;
begin
 d1 := dayof(pDateFrom);
 m1 := monthof(pDateFrom);
 Y1 := yearof(pDateFrom);
 d2 := dayof(pDateTo);
 m2 := monthof(pDateTo);
 y2 := yearof(pDateTo);
 dtTemp1 := pDateFrom + 1;
 If (dayof(dtTemp1) = 1) And (monthof(dtTemp1) = 3) Then
     d1 := 30;
 If (d2 = 31) And (d1 = 30) Then
     d2 := 30;

 Result := Trunc(Int(((y2 - Y1) * 360) + ((m2 - m1) * 30) + (d2 - d1)));
End;


Прохожев Максим   (2007-02-16 12:15:00) [8]


> Код писать ломота. Суть:
>  d1.m1.y1  d2.m2.y2
>
> кол-во полных (с 01 по 30-е) месяцев  m12              
> 01.(m1 + 1.y1)  - 01.m2.y2
>
> дней в левом месяце n1
> 30 - d1 + 1
> дней в правом месяце n2
> d2
>
> dd = m12 * 30 + n1 + n2


Сейчас попробую..


Прохожев Максим   (2007-02-16 12:12:00) [9]

Мастера, помогите плиз.  Мне больше ненакого надеяться. :-(


ЮЮ   (2007-02-16 12:08:00) [10]

Код писать ломота. Суть:
 d1.m1.y1  d2.m2.y2

кол-во полных (с 01 по 30-е) месяцев  m12              
01.(m1 + 1.y1)  - 01.m2.y2

дней в левом месяце n1
30 - d1 + 1
дней в правом месяце n2
d2

dd = m12 * 30 + n1 + n2


Прохожев Максим   (2007-02-16 11:50:00) [11]

Date1:= StrToDate('01.01.2006');
 Date2:= StrToDate('01.05.2006');

 i:=MonthsBetween(Date2, Date1) * 30 + DaysBetween(StartOfTheMonth(Date2),Date2)- DaysBetween(Date1, EndOfTheMonth(Date1));

Результат: 60 дней как 2 месяца берет.


Плохиш   (2007-02-16 11:38:00) [12]


> Прохожев Максим   (16.02.07 11:36) [22]

Второй плюс замени на минус.


Прохожев Максим   (2007-02-16 11:36:00) [13]

MonthsBetween(Date2, Date1) * 30 + DaysBetween(StartOfTheMonth(Date2),Date2)+ DaysBetween(Date1, EndOfTheMonth(Date1));

Совсем не правильно считает :(


Плохиш   (2007-02-16 11:33:00) [14]

Date1, Date2: TDatetime;

PS. в [18] надо поставить минус вместо плюса.


Прохожев Максим   (2007-02-16 11:32:00) [15]

АААА все понял. Сейчас проверю)))С ошибкой разобрался.


Прохожев Максим   (2007-02-16 11:28:00) [16]

Result := MonthsBetween(Date2, Date1) * 30 + DaysBetween(StartOfTheMonth(Date2), Date2);

Что то не компилится, Statment expected, but expression of type integer found :(


Плохиш   (2007-02-16 11:18:00) [17]


> Плохиш ©   (16.02.07 11:14) [17]

Хотя надо ещё добавить + DaysBetween(Date1, EndOfTheMonth(Date1)):-))


Плохиш   (2007-02-16 11:14:00) [18]


Result := MonthsBetween(Date2, Date1) * 30 + DaysBetween(StartOfTheMonth(Date2), Date2);

Что-то типа этого :-)


Прохожев Максим   (2007-02-16 11:12:00) [19]

28.01.2006 по 28.02.2006 = 30
28.01.2006 по 28.03.2006 = 60
28.01.2006 по 01.03.2006 = 33


Johnmen   (2007-02-16 11:03:00) [20]

>Прохожев Максим   (16.02.07 10:58) [13]

28.01.2006 по 28.02.2006 = ?

28.01.2006 по 28.03.2006 = ?

28.01.2006 по 01.03.2006 = ?

Сколько здесь?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо