Фильтр даты не охватывает правильный временной диапазон

У меня есть два поля ("Дата начала","Дата окончания"), оба имеют тип 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;