ClientDataSet使用locate或Filter定位到字段为空值的记录

Posted kwong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ClientDataSet使用locate或Filter定位到字段为空值的记录相关的知识,希望对你有一定的参考价值。

场景,程序想检查是否存在某个字段的值是空的,如果存在,则不允许增加记录,否则允许增加记录。

解决这个问题,我一开始用了两种错误的方法

 if not clientdataset.locate(‘AFieldName‘,‘‘,[]) then  //如果存在字段AFieldName的值为空的记录,则不允许增加一行记录append
  clientdataset.append
else
  exit;

  第二种错误方法

ClientDataset.Filtered := false;
ClientDataset.Filter := ‘AFieldName=‘‘‘‘‘;
ClientDataset.Filtered := true;
if ClientDataset.Recordcount>0 then
  exit
else
  ClientDataset.append;

  第三种,遍历记录,记录太多了,不适用。

前两种方法,如果字段值为‘’(emptystr),那就没问题,但问题是,字段值为null,那么就定位不到或过滤不到这种记录了。

于是百度了一下,发现使用较多的方法是

clientdataset.locate(‘AFieldName‘,null,[])

  当时觉得不可行,因为Delphi里的空是用nil表示的,不存在null关键字。

后来鬼使神差的,居然还是试了一下,居然编译通过了!!!而且,居然能成功定位到了字段值为null的记录。真是狠狠地给我上了一堂课。

后面查看代码,原来这个null是Variants单元里的一个方法,所以要使用还得先引用这个单元。

unit Variants;

function Null: Variant;
begin
  _VarNull(TVarData(Result));
end;

原来是这么一回事。然后再看看ClientDataset的locate函数,发现里面有个判断

if VarIsNull(Value) then
    Expr := Expr + Format(‘[%s] IS NULL‘,[TField(Fields[i]).FieldName])  { Do not localize }
 else
    Expr := Expr + Format(‘[%s]=%s‘,[TField(Fields[i]).FieldName, ValStr]);

这一句是拼凑Filter表达式的判断语句,也由此可知,想使用Filter过滤空值(null)的记录就需要这样写 

Filter := ‘AFieldName is null‘;

  

 

  

    

以上是关于ClientDataSet使用locate或Filter定位到字段为空值的记录的主要内容,如果未能解决你的问题,请参考以下文章

ClientDataSet建立索引和排序

ClientDataSet中动态添加计算字段并用计算字段显示记录的UpdateStatus

通过ClientDataSet复制表的结构及数据

clientdataset的使用

Delphi ClientDataSet 主从结构 BUG

ClientDataSet应用