急!急!急!Delphi数据库问题:如何在查询结果上再次查询?200分奉送(200分)

  • 主题发起人 主题发起人 linin
  • 开始时间 开始时间
L

linin

Unregistered / Unconfirmed
GUEST, unregistred user!
我在做单机版的数据库系统,后台数据库是 sql sever ,前台用DBGrid显示,查询用query控件。
DBGrid 的 DataSoure 为 allDataS ,其DataSet 为allTable;
seachDataSoure 的 Dataset 为 query;
查询结束后将DBGrid.DataSource:=seachDataSoure;

如何实现在query的查询结果上再次查询?就像大富翁的查询。

如果谁有在网络数据库中如何用存储过程实现同样的功能的方法,也欢迎回答。

还有个小问题:如何得知DBGrid中有多少个记录,当前指针所指为第几个?
 
所谓的再次查询其实只不过是在Query的SQL语句中再加个WHERE条件罢了,其实很简单
如下:
以 'ExTable' 表说明
第一次
qryData.Close;
qryData.SQL.CLEAR;
qryData.SQL.Add('Select * '); //--SQL[0] Select 部分
qryData.SQL.Add('From ExTable');// --SQL[1] From 部分
qryData.SQL.Add('Where ... ');// --SQL[2] Where 部分,不进行查询时将SQL[2]:='';
qryData.SQL.Open;


第n次(前提是给出增加的查询条件,假定为STR)
qryData.Close;


if qryData.SQL[2]='' then
qryData.SQL[2]:=Str
else qryData.SQL[2]:=qryData.SQL[2]+' And '+Str;
//检测原来有没有查询条件,如果有就用AND加入

qryData.Open;

现在明白了吗?

得出DBGrid有多少个记录,用dbgrid.DataSource.DataSet.RecordCount即可
至于当前指针所指为第几个,在如果你用BDE可能有些麻烦,因为BDE的DATASET.RecNo
(ClientDataSet除外)始终返回-1;当然你可以通过DBGrid得出来,即:
TDrawGrid(DBGrid).Row

明白了吗?

 
楼上的一些简单错误
第一次
select ... where not a>0
第二次
加上一个b>0条件,按楼上的说法是
select ... where not a>0 and b>0
正确的应该是:
select ... where (not a>0) and (b>0)
直接加and不可以,因为存在优先级问题,就象加减乘除混合运算一样,需要使用
括号。

 
用query的filter
 
用视图view,然后用SQL语句操作view
 
你可以把查询结果在存储过程中做为一个临时表,再对临时表进行操作:
比如:
CREATE PROCEDURE 你的存储过程名
AS
--你的第一查询
SELECT 你想查询的字段 INTO #你的临时表
FROM XXXXX

--你的第二个查询
SELECT 你想查询的字段
FROM #你的临时表

--就OK了
 
to panyongze:
谢谢纠正
 
to cnaoszh
怎么用query的filter啊?我是菜鸟,可以说详细些吗?

to jammi
我知道可以用视图,可是我不晓得在delphi中如何创建
视图,如何将查询结果传给视图,由该如何向视图查询。
 
怎么不用子查询??
 
视图嘛: Create View...
Query.Filter := 'Age=16';
Query.FilterEd := True;

实际上以上大虾们说的办法: 扩展Where 条件或建临时表都可以。
建议找本数据库的书恶补一下:)
 
to 巡城浪子
我的意思就是怎样实现子查询啊。
 
query1.close;
query1.sql.claer;
query1.sql.add('select age,name from tbtable');
query1.open;


//filter
query1.filter:='age=25';
query1.filtered:=TRUE;

得到你想要的数据集
 
多人接受答案了。
 
后退
顶部