Фильтр даты не охватывает правильный временной диапазон
У меня есть два поля ("Дата начала","Дата окончания"), оба имеют тип Date.
И еще у меня есть два сценария, которые я пытаюсь скрыть - безуспешно:
A: "Дата начала" не определена, но "Дата окончания" - это, например, Дата начала = 0D, Дата окончания =31.12.2020. Теперь это означает, что все между 0D и 31.12.2020 должно рассматриваться как перекрывающееся.
То же самое касается определения "Дата начала" и не определения "Дата окончания", например, Дата начала =02.02.2020, Дата окончания =''. Это будет выглядеть как 02.02.2020..∞
Для наглядности я добавил скриншот.
Примечание: "Дата начала" = "Gültig von" и "Дата окончания" = "Gültig bis").
Этот сценарий будет перекрываться, поскольку 02.02.2020 идет до "бесконечности", например, первая строка с "Дата окончания" находится в диапазоне второй строки.
B: В этом сценарии диапазоны не мешают (не перекрываются), например, Дата начала = 0D, Дата окончания =31.01.2020 для первой строки и Дата начала =02.02.2020, Дата окончания ='' для второй строки.
Снова визуализация:
Здесь мы видим, что обе строки имеют свои собственные диапазоны (не перекрывающиеся), поскольку первая строка заканчивается за два дня до начала следующего диапазона при начале второй строки.
Мой подход, который не работает:
local procedure ValidateRandomRec()
var
_random: Record Random;
begin
if (Rec."Gueltig bis" = 0D) and (Rec."Gueltig von" <> 0D) then begin
if _random.FindSet() then
_random.SetFilter("Gueltig von", '=''''|%1..', Rec."Gueltig von")
else begin
_random.SetFilter("Gueltig bis", '');
_random.SetFilter("Gueltig von", '%1..', Rec."Gueltig von");
end;
end;
end;
if (_random.FindSet()) and (_random.Count >= 1) then begin
if GuiAllowed then
Message('Date overlapping');
end;
Называется я на моей странице так:
trigger OnInsert()
begin
ValidateRandomRec();
end;
trigger OnModify()
begin
ValidateRandomRec();
end;
trigger OnRename()
begin
ValidateRandomRec();
end;
Это оказалось дольше, чем ожидалось. По крайней мере, воспроизводимо:)
1 ответ
Насколько я понимаю вам нужно что-то подобное. Я делал это без компилятора, может не хватает какой-то настройки.
Попробуй это
local procedure ValidateRandomRec()
var
_random: Record Random;
_totalReg: Integer;
begin
_random.Reset();
_totalReg := 0;
//Scenario A
if (Rec."Gueltig von" <> 0D) and (Rec."Gueltig bis" = 0D) then begin
_random.SetFilter("Gueltig von", '%1..', Rec."Gueltig von");
_random.SetRange("Gueltig bis", 0D);
_totalReg := _random.Count;
if(_totalReg = 1)then begin
_random.Reset();
_random.SetRange("Gueltig von", 0D);
_random.SetFilter("Gueltig bis", '%1..', Rec."Gueltig von");
_totalReg += _random.Count;
_random.Reset();
_random.SetFilter("Gueltig von", '..%1', Rec."Gueltig von");
_random.SetRange("Gueltig bis", 0D);
_totalReg += _random.Count;
end;
end;
Scenario B
if (Rec."Gueltig von" = 0D) and (Rec."Gueltig bis" <> 0D) then begin
_random.SetRange("Gueltig von", 0D);
_random.SetFilter("Gueltig bis", '..%1', Rec."Gueltig bis");
_totalReg := _random.Count;
end;
if (_totalReg > 1) then //More than one record in table with this filters
if GuiAllowed then
Message('Date overlapping');
end;