dbgrid排序的问题(20分)

  • 主题发起人 主题发起人 kenmen
  • 开始时间 开始时间
K

kenmen

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TForm3.DBGrid1TitleClick(Column: TColumn);
var
ss:string;
begin
ss:='select * from client order by'+' '+column.FieldName;
query1.SQL.Clear;
query1.SQL.Text:=ss;
query1.close;
query1.Filtered:=false;
Query1.OPEN;
end;
这段代码,若字段有数据排序正常;若没有数据,则会出现“第一行:'by'附近
有语法错误”的提示。请问为啥呢?
 
比较急!
有人在吗?
 
by'+' '+column.FieldName;
没数据,上面的你从那里取?
 
我的意思是,某些列有数据,某些列没数据;点激有数据的列可以排序,但点激
没数据的列就会出现上面的错误。
 
ss:='select * from client';
query1.SQL.Clear;
query1.SQL.Text:=ss;
query1.close;
Query1.OPEN;
if not isempty(query1) then
begin
ss:='select * from client order by'+' '+column.FieldName;
query1.SQL.Clear;
query1.SQL.Text:=ss;
query1.close;
query1.Filtered:=false;
Query1.OPEN;
end;
 
procedure TCovText.DBGrid1TitleClick(Column: TColumn);
begin
with ADOTable1do
begin
if DBGrid1Boolean then
TADOTable(ADOTable1).Sort := Column.FieldName + ' DESC'
else
TADOTable(ADOTable1).Sort := Column.FieldName;
DBGrid1Boolean := not(DBGrid1Boolean);
end;
end;
 
即使查询结果数据集为空字段名也不会为空啊!
是不是点了计算字段或LOOKUP字段,而在表中根本不存在这个字段啊??
 
查询结果数据为空,那么就取不到一个空结果的任何字段。
既然是按照字段来排序,那么去掉column效果应该一样,也没有这个问题了。
 
不好意思,最近比较忙,来不及回复各位!
但在此先谢过了!
 
是不是你的这段 SQL查询错了?
ss:='select * from client order by'+' '+column.FieldName;
其中加入的两个单引号里面的空字符纯属多余 你可以TRY
ss:='select * from client order by '+column.FiledName;
 
用ADO内存排序
 
那是肯定的,因为order by 后必须有字段名称的
以上的部分答案是使用adotable 的,估计斑竹是不同意更换 adotable 的
不过你可以实验一下
procedure TCovText.DBGrid1TitleClick(Column: TColumn);
begin

if Trim(column.FieldName)<>'' then

with ADOquerydo
begin
fielded:=False ;
close ;
sql.clear ;
sql.add('select * from client order by '''+column.FieldName+'''') ;
open ;

end;
end;



 
procedure TForm3.DBGrid1TitleClick(Column: TColumn);
var
ss:string;
begin
ss:='select * from client';
query1.SQL.Clear;
query1.SQL.Text:=ss;
query1.close;
query1.Filtered:=false;
if column.fieldname<>'' then
order by'+' '+column.FieldName;
Query1.OPEN;
end;
 
这是我自己写的,可能不好用:
//DBGrid1的title点击排序
procedure DBGridSorted(aADOQuery:TADOQuery;Column:TColumn);
var
ls_Filter :string;
li_Number :integer;
begin
ls_Filter :=aADOQuery.SQL.Text;
li_Number := 0;
li_Number := Pos('ORDER',ls_Filter);
IF li_Number = 0 then
ls_Filter := ls_Filter + ' ORDER BY ' + Column.FieldName + ' ASC'
else
begin
li_Number := 0;
li_Number := Pos('ASC',ls_Filter);
IF li_Number > 0 then
begin
li_Number := Pos('ORDER',ls_Filter);
ls_Filter := Copy(ls_Filter,1,li_Number - 1) + ' ORDER BY ' + Column.FieldName + ' DESC'
end
else
begin
li_Number := Pos('ORDER',ls_Filter);
ls_Filter := Copy(ls_Filter,1,li_Number - 1) + ' ORDER BY ' + Column.FieldName + ' ASC'
end;
end;
with aADOQuerydo
begin
close;
sql.Clear;
sql.Add(ls_Filter);
open;
end;
end;
 
procedure TForm1.DBGrid1TitleClick(Column: TColumn);
begin
DBGridSorted(ADOQery1,Column);
end;
//这里adoquery1和DBGrid1关联
 
procedure Tform1.DBGrid1CellClick(Column: TColumn);
begin
if (Not Query1.Active) or (Query1.RecordCount = 0) then
exit;
if Pos('ASC',Query1.Sort) = 0 then
Query1.Sort := column.fieldname + ' ASC'
else
Query1.Sort := column.fieldname + ' DESC';
end;
 
procedure TForm3.DBGrid1TitleClick(Column: TColumn);
var
ss:string;
begin
if query1.recordcount=0 then
exit;
ss:='select * from client order by'+' '+column.FieldName;
query1.SQL.Clear;
query1.SQL.Text:=ss;
query1.close;
query1.Filtered:=false;
Query1.OPEN;
end;
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
679
import
I
后退
顶部