Topic: счет всех столбцов таблицы с датами
вообщем то затея такая.. посчитать два столбца даты в таблице и в идеале красиво вывести информацию в edit.
1. Есть таблица Poslu, в таблице два поля (типа Дата) PosluDate, PosluDateEnd
в поле PosluDate всегда заносится начальная дата (пример: 01.07.2021)
в поле PosluDateEnd всегда заносится конечная дата (пример: 04.07.2021)
даты могут быть с перерывами (пример: 1)11.01.2021-11.02.2021 2)11.04.2021-11.05.2021)
и так далее... строк может быть много с периодами дат, последняя строка поле PosluDateEnd может быть пустым, в таком случае этой строке и этому полю задается текущая дата.
2. Посчитать все периоды дат и просчитать либо просто общее количество дней и потом разбивать на года, месяца, дни.. либо каждую строку разбивать на года, месяца, дни и потом складывать с другими строками.
Я думаю как это лучше сделать, возможно ли в массив загнать и посчитать, а может как то иначе... пока не могу сообразить
Может кто помочь?
На данный момент реализовано по одной нажатой в таблице строке просчет периода и вывода в года, месяца, дни в edit (все прекрасно работает)
procedure frmClient_gridPoslu_OnCellClick (Sender: TObject; ACol, ARow: Integer; Action: string);
var
years, months, days: integer;
monthsTotal: integer;
minDate: TDateTime;
i, c: integer;
DD, MM, YY: word;
date1, date2: TDateTime;
begin
frmClient.gridPoslu.BeginUpdate;
frmClient.Edit4.Clear;
if frmClient.gridPoslu.Cells[0, frmClient.gridPoslu.SelectedRow] = '' then date1:= (strtodate(DateToStr(Now))) else date1:= (strtodate(frmClient.gridPoslu.Cells[0, frmClient.gridPoslu.SelectedRow]));
if frmClient.gridPoslu.Cells[1, frmClient.gridPoslu.SelectedRow] = '' then date2:= (strtodate(DateToStr(Now))) else date2:= (strtodate(frmClient.gridPoslu.Cells[1, frmClient.gridPoslu.SelectedRow]));
date1 := trunc(date1);
date2 := trunc(date2);
years := YearsBetween(date1, date2);
monthsTotal := MonthsBetween(date1, date2);
months := monthsTotal - (years * 12);
if date1 > date2 then minDate := date2 else minDate := date1;
date1 := IncMonth(minDate, monthsTotal);
days := DaysBetween(date1, date2);
frmClient.Edit4.Text := 'выводим период ' +IntToStr(years)+ StrYears(years)+ IntToStr(months)+ StrMonths(months)+ IntToStr(days)+ StrDays(days);
frmClient.gridPoslu.EndUpdate;
end;
функция вывода года
function StrYears(iYear: integer): string;
var
s: string;
sYear: string;
i: integer;
begin
result := ' лет ';
if (iYear > 4) and (iYear < 21) then exit;
sYear := IntToStr(iYear);
s := Copy(sYear, Length(sYear), 1);
i := StrToInt(s);
case i of
1: result := ' год ';
2, 3, 4: result := ' года ';
end;
end;
функция вывода месяца
function StrMonths(iMonth: integer): string;
begin
Result:= ' месяцев ';
case iMonth of
1: Result:= ' месяц ';
2, 3, 4: Result:= ' месяца ';
end;
end;
функция вывода дней
function StrDays(iDay: integer): string;
begin
Result:= ' дней ';
case iDay of
1, 21, 31: Result:= ' день ';
2, 3, 4, 22, 23, 24: Result:= ' дня ';
end;
end;