Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2002.12.16;
Скачать: [xml.tar.bz2];

Вниз

Дата   Найти похожие ветки 

 
Stupid   (2002-11-26 05:47) [0]

здравсвуйте, мастера. У меня возник вопрос:
Есть поле DBEdit1 - дата убытия в командировку
Есть поле DBEdit2 - дата окончания командировки
Как мне в поле DBEdit3 вывести количество дней в командировке, при условии, что учитываются и день убытия и день прибытия? Заранее благодарен. Если можно, с примером.


 
BoxTer   (2002-11-26 06:58) [1]

Создаешь новый TField с именем Itog с типом fkCalculated и типом данных Integer. Затем на событие onCalcFields твоей таблицы (например Table1) пишешь что-то типа:
...
with Table1. do Begin
FieldByName("Itog").asInteger:=FieldByName("DataEnd").asDateTime-FieldByName("DataStart").asDateTime+1;
end;
//+1 - учитываем все дни!
...
enjoy...


 
Stupid   (2002-11-26 07:27) [2]

Большое спасибо.


 
Stupid   (2002-11-26 08:54) [3]

А почему-то не пошло.


 
tanuha   (2002-11-26 09:16) [4]

//Привожу пример кода:
//даты записаны в Edit1 и Edit2 соответственно

var vDay1, vMonth1, vYear1, vDay2, vMonth2, vYear2: Word;
ColDays, //Количество дней (результат)
i, dd1, dd22, dd12: Integer;
monthes: array[0..11] of Integer;
begin
monthes[0]:=31;
monthes[1]:=28;
monthes[2]:=31;
monthes[3]:=30;
monthes[4]:=31;
monthes[5]:=30;
monthes[6]:=31;
monthes[7]:=31;
monthes[8]:=30;
monthes[9]:=31;
monthes[10]:=30;
monthes[11]:=31;
ColDays:=0;
DecodeDate(StrToDate(Edit1.Text), vYear1, vMonth1, vDay1); //Декодируем дату (дата отбытия)
DecodeDate(StrToDate(Edit2.Text), vYear2, vMonth2, vDay2); //Декодируем дату (дата прибытия)

//---------------------------------------------------------------dd1:=0; //Сколько дней прошло с начала отнимаемого года до отнимаемой даты

for i:=0 to vMonth1-2 do //проходим по всем месяцам с начала года до текущего (второго), текущий не учитываем
dd1:=dd1+monthes[i]; //добавляем к общей сумме количество дней в нашем месяце

dd1:=dd1+vDay1; //Добавляем количество дней в нашей дате

if (IsLeapYear(vYear1)) and (vMonth1>2) then dd1:=dd1+1; //если год високосный, то увеличиваем кол-во дней на 1

//---------------------------------------------------------------dd22:=0; //Сколько дней прошло с начала текущего(второго) года до текущей даты

for i:=0 to vMonth2-2 do dd22:=dd22+monthes[i];

dd22:=dd22+vDay2;

if (IsLeapYear(vYear2)) and (vMonth2>2) then dd22:=dd22+1;

//---------------------------------------------------------------dd12:=0; //Сколько дней во всех годах от того до нашего

if (vYear1<vYear2) //отнимаемый год меньше текущего
then begin
for i:=vYear1 To vYear2-1 do
begin
if IsLeapYear(i) then dd12:=dd12+366
else dd12:=dd12+365;
end;
ColDays:=dd12+dd22-dd1;
end
else //отнимаемый год меньше или равен текущему (второму)
begin
for i:=vYear2 To vYear1-1 do
begin
if IsLeapYear(i) then dd12:=dd12+366
else dd12:=dd12+365;
end;
ColDays:=dd22-dd12-dd1;//-1 = поправка, т.к. считает включая текущий день одной даты и текущий день второй даты.
end;
//---------------------------------------------------------------Label1.Caption:=IntToStr(ColDays); //Результат

// Удачи! ТМ.


 
Johnmen   (2002-11-26 09:20) [5]

Trunc(Date2)-Trunc(Date1)+1


 
thick   (2002-11-26 10:50) [6]

CountDays:=(Date2-Date1+1)/EncodeTime(1,0,0,0)*24;


 
Johnmen   (2002-11-26 10:58) [7]

>thick (26.11.02 10:50)

Забавно...А главное - неверно...:)


 
Sras   (2002-11-28 09:01) [8]

DaySpan function
Returns the number of days (including fractional days) between two specified TDateTime values.

Unit

DateUtils

Category

datetime routines

Delphi syntax:

function DaySpan(const ANow, AThen: TDateTime): Double;

C++ syntax:

extern PACKAGE double __fastcall DaySpan(const System::TDateTime ANow, const System::TDateTime AThen);

Description

Call DaySpan to obtain the difference, in days, between two TDateTime values. Unlike the DaysBetween function, which only counts whole days, DaySpan reports incomplete days as a fraction of an entire day.


 
Wolf226   (2002-11-28 09:53) [9]

2 tanuha
Ну ты и намудрила! Ужас!

2 Stupid
Делай так:
На событие OnChange у DBEdit1 и DBEdit2 цепляй код.

edit3.text:=inttostr(floor(FieldByName("DataEnd").asDateTime)-floor(FieldByName("DataStart").asDateTime)+1);

Я использовал, edit вместо dbedit, т.к. думаю, что не стоит хранить это поле.



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2002.12.16;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.007 c
3-51581
Miss
2002-11-27 13:44
2002.12.16
Фильтр


14-51954
Sergey_Suhoy
2002-11-26 10:28
2002.12.16
Сохранение ветки реестра в текстовый файл.


14-51906
Filat
2002-11-24 10:00
2002.12.16
Запись на CD-R, CD-RW


4-52021
Anar
2002-11-03 22:54
2002.12.16
Handle


1-51790
zavdim
2002-12-05 09:13
2002.12.16
Свойство - массив?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский