当前位置:主页>仓库管理软件> 列表

简单的DataSet查询问题.想分的FW过来看看 找医药进销存软件

库存管理软件版1楼: 如何在TDataSet中获取相应记录.要求是某个字段值的一个部分作为查询条件.
比如: 字段Field1,它有值 111aaa, 111bbb, 111ccc, 111ddd, 222aaa ...
通过aaa作为查询条件查找到111aaa,222aaa ...
或通过111作为查询条件查找到111aaa, 111bbb, 111ccc, 111ddd ...
请各位兄弟多多支持,谢谢!!
在线等待.一解决立刻发分.

2楼: str:=''aaa''//or ''111''
SQL.TEXT:=''SELECT * FROM Table WHERE CHARINDEX(Field1,''+QUOTED(str) +'')>0''; 如零售管理

3楼: sql=''select * from tb where fld1 like %''+str+''%'';

4楼: to babibean:
首先谢谢您的回答.可是你的答案并不符合我的要求,可能是我说的不明白吧.
我是要在TDataSet数据集中获取数据.TDataSet已经Active了.本身存在数据,要从这存在数据的TDataSet中获取相关记录,条件如上,明白了嘛?我感觉用filter好像可以.但是本人知识浅薄.只能Filter := Format(''Field1 = ''''%s*'''''', [COPY(Value1, 1, 3)])获取前半部分的,可是当Filter := Format(''Field1 = ''''*%s'''''', [COPY(Value1, 3, 1)])的时候怎么也不行.假如用SQL的话我也就不麻烦大家了.


请大家多多执教.谢谢!!!

5楼: 查数据库函数介绍,找有没子串查询的函数,例如ms sql:
select * from table where ''111''=substring(field1,1,3)
或者
select * from table where ''aaa''=substring(field1,4,3)

6楼: 大家的回答都如同一辙[:)]
希望大家能回答有点建设性的,呵呵

库存管理软件版7楼: Filter := Format(''Field1 = ''''*%s'''''', [COPY(Value1, 3, 1)])
^^^^^^^^^^^^^^^^^^
这个只能取到一个值哦

8楼: to babibean:
仍然不行.您说的这样就成双引号了.更加不可能了.字符串在format格式化后还是双引号显然不行.

9楼: to babibean:
哦,这个没问题.
Filter := Format(''Field1 = ''''*%s'''''', [COPY(Value1, 3, 1)])
我只是举个例子.1和3是一样取值的.呵呵

10楼: * wildcard for partial comparisons (FilterOptions must include foPartialCompare)
---------------
我也意识到加引号是多余的,所以把上面的回答也改了.
另外你检查一下你的Dataset的FilterOptions 属性,把foPartialCompare选上试试.

11楼: 刚才看了一下别的资料,好象确实不能实现''左模糊查询''!!

12楼: 不知道楼主的意思是不是要实现过滤的功能,也就是在表格里看到的结果是根据你的条件出来的,为什么不选择用sql,那样很容易实现的 如sql超市进销存系统

13楼: 哦,在简化一下.您可以把Value1当成一个固定的值来用.你完全可以认为它就是
111aaa或者其他什么的.

库存管理软件版14楼: 或者查询时候这样写
table1.filtered:=false;
table1.filtered:=true;//设置使打开。
table1.close;//似乎不用重新打开数据集
table1.open;

table1.onFilterRecord中加入以下代码:
begin
with table1 do
begin
if copy(fieldByName(Field1).asString,1,3)= ''111'' then
// if copy(fieldByName(Field1).asString,3,3)= ''aaa'' then
accept:=true
else accept:=false;
end;
end;

15楼: to babibean:
真的无法实现嘛!!!那我就很麻烦了.还得循环.不想这么做.
to 空心:
这是本地的cds.是用loadfromfile进入TDataSet中去的,用SQL的话还得访问后台服务器.
难道真的就没法实现???难道就没有一个人能提出实用的见解???
期待...

16楼: to lczh8420:
没有那么麻烦吧,只要把你点查询后的语句写成上面那个样子就可以了啊,再在onFilterRecord写相应代码就行,不超过10行语句,也没有循环啊!

17楼: to babibean:
这我知道,可是我的这个TDataSet并不是只为了它一个所用啊.有很多Data会和它有关联.而且每个data都不相同.
只能在TDataSet中非事件下面过滤了.

18楼: 既然有数据在里面了,何不直接循环读取这些RecordCount个数据,在读取一个的时候
判断,如:
var
i :integer;
begin
for i :=0 to RecordCount-1 do
begin
if Pos(''111'',Fields[1].asstring) <> 0 then
begin
// 自定义操作
end;
Next;
end;
end;
>> 临时写的,不知正确否,供参考 <<

19楼: to Jonson_sunshine:
这个是可以的.假如有更好的方法就美满了.
我认为应该有更简单的方法解决这个问题.

20楼: 因为TDataset不是TAdoDataset,而且你的数据是从cds导来的,所以它对filter的支持很弱的.

库存管理软件版21楼: 因为你的数据是导入的,已经存在在Dataset里面的情况下,要选取,归根结底还是要
循环判断每一个记录(这已经细到判断单个记录是什么的问题了),所以我想即使是更
美满的方法也还是离不开循环这一步。

22楼: 很高兴有这么多朋友回答.我已经搞定了.
为了报答大家,我把我的做法告诉大家吧.
Filter := Format(''SXM like ''''%s%%'''' and not SXM like ''''%%00'''''', [COPY(SysSXM, 1, 4)])
其实我已经试过很多次like了.其他的都好.就是这个not不知道放在那个地方.试过not (SXM like ''''%%00'''')'' 试过 SXM not like ''''%%00''''''.怎么都不行.就是没试过not SXM like ''''%%00''''''.帮助里面狗屁都没有.还好最后一次测试成功. 如医药进销存软件