件
在运行中,Query的SQL中可能已经带有WHERE或ORDER语句,在建立新查询时必须删除。可以作一个通用函数来完成,
procedure DelConditions(SQL:TStrings);
var
i,j:Integer;
begin
for i:=0 to SQL.Count-1 do
if (Pos('WHERE',UpperCase(SQL[i]))>0) or Pos('ORDER',UpperCase(SQL[i]))>0) then
begin
for j:=SQL.Count-1 downto i do
SQL.Delete(j);
Break;
end;
end;
2.5增加条件
从查询窗体得到的条件要转成WHERE语句,可以作一个通用函数来完成,
procedure AddConditions(SQL,Conditions:TStrings);
var
i:Integer; temp:TStrings;
begin
if Conditions.Count=0 then Exit;
temp:=TStringList.Create;
temp.AddStrings(Conditions);
temp[0]:='WHERE '+temp[0];
for i:=1 to temp.Count-1 do
temp[i]:='AND '+temp[i];
SQL.AddStrings(temp);
temp.Free;
end;
2.6刷新Query
procedure RefreshQuery(Qry:TQuery);
begin
with Qry do
begin
DisableControls;
Try
Close;
Open;
finally
EnableControls;
end;
end;
end;
刷新后,DBGrid将显示满足条件的记录。查询结束。
2.7排序
可以仿照Windows资源管理器的作法,当文件以详细内容方式查看时,单击列标题可以以列标题排序,再次单击将由升序转成降序,或由降序转成升序。现在用DBGrid来实现类似的功能。这要处理DBGrid的OnTitleClicked事件。
procedure TfrmQuery.DBGrid1TitleClick(Column: TColumn);
var
Qry:TQuery;
FieldName:String;
begin
Qry:=TQuery(DBGrid1.DataSource.DataSet);
if Qr
y=nil then Exit;
FieldName:=GetFieldName(Column.FieldName,Qry.SQL.Text);
AddOrder(Qry.SQL,FieldName);
RefreshQuery(Qry);
end;
这里要用到两个函数,GetFieldName和AddOrder。在GetFieldName中得到与Column相关的字段名,AddOrder在SQL中增加或修改ORDER子句,并自动增加或去掉DESC选项来实现升序或降序,由于篇幅限制,不再提供代码。
三、 小结
通过以上一些步骤,就可以完成复杂的查询
工作。其中关键函数,InitComboBox、RefreshQuery、DelConditions、AddConditions、GetFieldName、AddOrder可以放在DataModule中供所有数据库窗体共享,而且对所有不同的数据库的查询来说是通用的,可以在不同的数据库
系统中复制,不用修改。而GetSql重载函数可能根据不同的数据库系统有细微的差别。