Topic: Вычислительное поле период дат
Здравствуйте Уважаемые форумчане
не удается решить проблему с вычислительным полем, а может даже лучше это сделать в скрипте
суть такова, есть две таблицы client, contracts
client - в этой таблице основные данные о заказчике (является родителем contracts)
contracts - находятся данные данные о заказчике типо какой контракт, с какого времени, по какое время
в самой таблице client сделал вычислительное поле для вычисления последней записи с таблицы contracts, а именно окончание контракта и все прекрасно работает
(SELECT IFNULL(strftime('%d.%m.%Y', ContractsDateEnd),"укажите дату") FROM Contracts WHERE Client.id=Contracts.id_Client ORDER BY Contracts.ContractsDateEnd DESC)
появилась нужда в выделение строк тех клиентов у кого подходит конец контракта по договору, а именно за период 12 месяцев, 6 месяцев, 4 месяца, 1 месяц, в текущем году, в текущем месяце... не могу сообразить как это правильно реализовать... сначала пошел методом вычислительного поля
CASE
WHEN strftime('%m', 'now', '+1 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+2 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+3 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+4 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+5 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+6 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+7 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+8 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+9 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+10 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+11 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+12 month') = strftime('%m', DateName) THEN 12
WHEN strftime('%m', 'now', '+1 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+2 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+3 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+4 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+5 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+6 month') = strftime('%m', DateName) THEN 6
WHEN strftime('%m', 'now', '+1 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+2 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+3 month') = strftime('%m', DateName) AND strftime('%m', 'now', '+4 month') = strftime('%m', DateName) THEN 4
WHEN strftime('%m', 'now', '+1 month') = strftime('%m', DateName) THEN 1
WHEN strftime('%YYYY', 'now') = strftime('%YYYY', DateName) THEN 0
WHEN strftime('%m', 'now') = strftime('%m', DateName) THEN 2
ELSE NULL
END
ничего не вышло, даже добавлял в этом вычислительное поле разные условия (типо FROM Contracts WHERE Client.id=Contracts.id_Client ORDER BY Contracts.ContractsDateEnd DESC))... но мог где-то ошибиться
Далее пробовал скриптом
procedure Form1_gridClient_OnChange (Sender: string);
var
i, c, q, r, d, a, year, Month12, Month6, Month4, Month1, nowMonth: integer;
iToday, iTomorrow: integer;
sCell: string;
sCellContr: string;
DD, MM, MMMM, YY, YYNow: word;
dtBirth: TDateTime;
nextMonth: TDateTime;
vi: integer;
Contr: TDateTime;
begin
Form1.gridClient.BeginUpdate;
r := 0;
q := 0;
d := 0;
a := 0;
year := 0;
Month12 := 0;
Month6 := 0;
Month4 := 0;
Month1 := 0;
nowMonth := 0;
c := Form1.gridClient.RowCount - 1;
for i := 0 to c do
begin
sCellContr := Form1.gridClient.Cells[16,i];
if ValidDate(sCellContr) then
begin
DecodeDate(Now, YYNow, MM, DD);
DecodeDate(StrToDate(sCellContr), YY, MM, DD);;
Contr := EncodeDate(YY, MM, DD);
Contr := Trunc(Contr);
if (Trunc(Now) - Contr) <= 25 then
begin
Form1.gridClient.Cell[16,i].Color := clSilver;
Inc(year);
end;
end;
end;
end;
Form1.Button5.Caption:= '12 месяцев (' +IntToStr(Month12)+ ')';
Form1.Button6.Caption:= '6 месяцев (' +IntToStr(Month6)+ ')';
Form1.Button7.Caption:= '4 месяца (' +IntToStr(Month4)+ ')';
Form1.Button10.Caption:= '1 месяц (' +IntToStr(Month1)+ ')';
Form1.Button8.Caption:= 'в текущем году (' +IntToStr(year)+ ')';
Form1.Button11.Caption:= 'в ' +MonthName(Date())+ ' (' +IntToStr(nowMonth)+ ')';
Form1.gridClient.EndUpdate;
end;
В итоге скрипт закрашивает столбец, но не учитывает год. Тоесть я указал <=25 он сравнивает только дни...
Кто может навести в правильное русло как сделать сравнение с сегодняшней датой с датой в столбец и закрасить эту строку, при условии что этот сравниваемый столбец должен быть либо в течение 12 месяцев, либо 6 месяцев, либо 4 месяцев, либо 1 месяца, либо в текущем году, либо в текущем месяце.
Например: 29.06.2021 - текущая дата; в столбце дата=29.12.2021 (тоесть эта дата попадает под 12 месяцев, под 6 месяцев и под текущий год);
Прошу Вашей помощи в правильности составления кода, бьюсь три дня, результатом никак не доволен...