场景,程序想检查是否存在某个字段的值是空的,如果存在,则不允许增加记录,否则允许增加记录。
解决这个问题,我一开始用了两种错误的方法
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';