日期过滤器未覆盖正确的时间范围

问题描述

我有两个字段(“开始日期”,“结束日期”)均为日期类型。

我还想掩盖两种情况-没有成功:

A: “开始日期” 未定义,但是“结束日期” 为e。 G。开始日期= 0D ,结束日期= 2020年12月31日。现在,这意味着从0D到2020年12月31日之间的所有内容都应视为重叠。

定义“开始日期” 和未定义“结束日期” 的情况相同。 G。开始日期= 2020年2月2日,结束日期= ''。那将被视为02.02.2020..∞

为使其可视化,我添加一个屏幕截图。

overlapping

注意“开始日期” = “Gültigvon” “结束日期” = “Gültigbis” )。

由于2020年2月2日一直持续到“无限” e,所以这种情况将是重叠的。 G。 “结束日期” 的第一行在第二行的范围内。

B:在这种情况下,范围不会以自己的方式出现(不重叠)e。 G。开始日期= 0D ,结束日期= 2020年1月31日,开始日期= 2020年2月2日,结束日期= 作为第二行。

重新获得可视化效果

not overlapping

在这里,我们看到两行都有自己的范围(不重叠),因为第一行在第二行的下一个范围开始的两天前结束。

我的方法无效:

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;

结果比预期更长。至少它是可重现的:)

解决方法

据我了解,您需要这样的东西。我是在没有编译器的情况下完成的,可能缺少一些调整。

尝试一下

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",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",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;