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定位到字段为空值的记录的主要内容,如果未能解决你的问题,请参考以下文章