Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi TClientDataSet筛选器是否有限制,还是有缺陷?_Delphi_Delphi Xe_Datasnap_Tclientdataset - Fatal编程技术网

Delphi TClientDataSet筛选器是否有限制,还是有缺陷?

Delphi TClientDataSet筛选器是否有限制,还是有缺陷?,delphi,delphi-xe,datasnap,tclientdataset,Delphi,Delphi Xe,Datasnap,Tclientdataset,我使用TClientDataSet作为内存中的表,并且必须应用一个带有很多条件的过滤器 例如,在400或条件下,我在尝试启用筛选器时遇到访问冲突 模块“midas.dll”中地址4DADC76处的访问冲突。阅读地址00000034 例外情况如下: procedure TCustomClientDataSet.AddExprFilter(const Expr: Widestring; Options: TFilterOptions); begin if FExprFilter <&g

我使用
TClientDataSet
作为内存中的表,并且必须应用一个带有很多条件的过滤器

例如,在400
条件下,我在尝试启用筛选器时遇到访问冲突

模块“midas.dll”中地址4DADC76处的访问冲突。阅读地址00000034

例外情况如下:

procedure TCustomClientDataSet.AddExprFilter(const Expr: Widestring; Options: TFilterOptions); 
begin 
  if FExprFilter <> nil then FDSCursor.DropFilter(FExprFilter); 
  if Expr <> '' then 
  with TExprParser.Create(Self, Expr, Options, [poExtSyntax], '', nil, FieldTypeMap, True) do 
    try 
      CheckProviderEOF; 
      Check(FDSCursor.AddFilter(FilterData, DataSize, FExprFilter)); // ** AV HERE
    finally 
      Free; 
    end; 
end; 
我已经尝试在语句中使用,但我得到了相同的错误


我在网上没有找到关于这种情况的参考资料

我可以重现此错误,包括Delphi西雅图中的“读取地址00000034”。 当过滤器表达式中的项超过约280个时,会发生此错误。它是 显然是midas限制。你需要一个更好的方法来翻译你的问题领域 以达到所需的过滤器效果

如果您可以在代码中评估您的条件,那么我要做的就是添加 将布尔值FKC字段设置为CD,并将其设置为True或False 取决于结果。然后,过滤数据集是一件简单的事情
基于布尔值应用筛选器的方法。

您会遇到什么异常?为什么您可能需要添加400或更多条件?如果你不得不这么做,那你就大错特错了。如果需要过滤那么多,可以在主数据集中进行过滤,或者使用
TClientDataSet.OnFilterRecord
event.Legacy代码Ken White进行过滤,我不需要进行大量修改就可以轻松更改任何内容。这是一个权限过滤器,用户可以看到400辆车。您可以使用
OnFilterRecord
,无需进行重大修改。你还没有指出你会遇到什么异常。你看到了什么样的异常消息?我发现了一般访问冲突,我跟踪了代码:它发生在这一行:Check(FDSCursor.AddFilter(FilterData,DataSize,FExprFilter));打开:过程TCustomClientDataSet.AddExprFilter(const-Expr:Widestring;Options:TFilterOptions);如果FExprFilter为nil,则开始FDSCursor.DropFilter(FExprFilter);如果Expr为“”,则使用TExprParser.Create(Self、Expr、Options、[poExtSyntax]、“”、nil、FieldTypeMap、True)尝试检查Providerof;检查(FDSCursor.AddFilter(FilterData、DataSize、FExprFilter));终于自由了;结束;结束;我不相信我见过Delphi异常,它只说一般访问违规。第三次,您看到的确切错误消息是什么?不是我看到类似的,而是确切的错误消息,包括内存地址。谢谢MartynA。你在哪里找到瓦鲁280的?你知道记忆中的表格吗?thanksBy实验:注意到我得到了300个术语的异常,但不是200个,我在两者之间进行了二进制搜索。内存中还有很多其他的表,但我总是使用CD来处理这类内容,尽管它偶尔会有缺点。我在内存表中找到了其他表,但它们都是基于TDataSet的。还有一些我发现的,但我不知道它的实现,因为它们不是免费的。严格来说不是内存中的数据库,但是你试过Sqlite吗?最近的Delphi版本通过FireDAC对其提供了很好的支持,但您可能会发现XE中的DBExpress对其提供了支持。@RodrigoFariasRezino虽然这只是一个临时(但仍然不美观)解决方案,但您始终可以通过使用包含式过滤器将过滤器元素的数量(一组400个)减少到最多200个(即:包括所选ID)用于少于200个项目,排除过滤器(即:排除未选择ID)用于超过200个项目。
procedure TForm41.Button1Click(Sender: TObject);
var
  I: Integer;
  FilterStr: string;
begin
  FilterStr := '(vehicleId = -1)';
  //It is just an example, the original code I can have any integer number.
  for I := 0 to 400 do //If I change the limit value to 40 for example, it works. 
    FilterStr := FilterStr + ' or (vehicleId = ' + IntToStr(I) + ')';

  ClientDataSet1.Filter := FilterStr;
  ClientDataSet1.Filtered := True;
  ClientDataSet1.CreateDataSet; //Error here
end;