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‘;

  

 

  

原文地址:https://www.cnblogs.com/Kwong/p/10300597.html

时间: 2024-11-14 12:16:51

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

给Oracle数据库中CLOB字段插入空值

遇到往ORACLE数据库中插入数据时总是报ORA-01084 invalid argument in OCI call错误,经分析是因为表中的一个字段类型为CLOB,并且可为空,当在给该字段插入空值时引发的该错误.后来判断是否为空值,如果为空值使用DBNull.Value,以此解决了该问题. Null 指的是无效的对象引用:而 DBNull 是一个类, DBNull.Value 是它唯一的实例 .DBNull 的实例 DBNull.Value是数据库表中的空数据在 .Net 代码中的表现形式.我

sql语句查询同一表内多字段同时重复的记录 sql数据库重复记录删除

分享下用sql语句删除数据库中重复记录的方法.比如现在有一人员表 (表名:peosons) 若想将姓名.身份证号.住址这三个字段完全相同的记录查询出来select p1.* from persons p1,persons p2 where p1.id<>p2.id and p1.cardid = p2.cardid and p1.pname = p2.pname and p1.address = p2.address可以实现上述效果.几个删除重复记录的SQL语句 1.用rowid方法2.用gr

如何查出同一张表中字段值重复的记录

如何查出同一张表中字段值重复的记录 (2013-03-25 11:28:51) 转载▼ 比如现在有一人员表(表名:peosons) 若想将姓名.身份证号.住址这三个字段完全相同的记录查询出来select p1.* from persons p1,persons p2where p1.idp2.id and p1.cardid = p2.cardid and p1.pname = p2.pname and p1.address = p2.address 可以实现上述效果. 几个删除重复记录的SQL

sqlserver中怎么查询字段为空的记录

sqlserver中怎么查询字段为空的记录的两种方法:

获取分组后取某字段最大一条记录

获取分组后取某字段最大一条记录 方法一:(效率最高) select * from test as a where typeindex = (select max(b.typeindex) from test as b where a.type = b.type );

SQL中查找某字段值重复或多个字段值重复的记录数

只筛选一个字段值相同的记录 select * from A where PDDT in( select PDDT FROM A group by PDDT having count(PDDT)>1 ) 筛选多个字段值相同的的记录 SELECT COUNT(*),DeptID, PDDT , DLNo , DLNoRe, MacNo FROM A GROUP BY DeptID, PDDT , DLNo , DLNoRe, MacNo having count(*)>1 原文地址:http://

获取分组后取某字段最大一条记录(求每个类别中最大的值的列表)

获取分组后取某字段最大一条记录方法一:(效率最高) select * from test as a where typeindex = (select max(b.typeindex) from test as b where a.type = b.type ); 方法二:(效率次之) select a.* from test a, (select type,max(typeindex) typeindex from test group by type) b where a.type = b.

自动驾驶定位算法-直方图滤波(Histogram Filter)定位

然后定义一个新的状态空间\(y_t \in \{0,-,n?1\}\),当且仅当\(x(t)∈b_i\)时,\(y_t=i\),由于\(y_t\)是一个离散的状态空间,我们就可以采用离散贝叶斯算法计算\(bel(y_t)\).\(bel(y_t)\)是对\(bel(x_t)\)的近似,它给出x(t)在每一个\(b_i\)的概率,\(b_i\)划分的越精细,计算的结果就越精确,当然精确的代价是计算成本的上升. 2.1D直方图滤波在自动驾驶定位的应用 如下图所示,无人驾驶汽车在一维的宽度为5m的世界

mssql sqlserver 将字段null(空值)值替换为指定值的三种方法分享

转自:http://www.maomao365.com/?p=6965   摘要: 下文将分享两种将字段中null值替换为指定值的方法分享,如下所示: 实验环境:sqlserver 2008 R2 例: create table test(keyId int identity, info varchar(30)) go insert into test(info)values('a'),('b'),(null),('d') go ---方法1:使用isnull替换 select keyId,is