怎么用Table实现对同一字段正反排序的切换?(100分)

  • 主题发起人 主题发起人 DreamTiger
  • 开始时间 开始时间
D

DreamTiger

Unregistered / Unconfirmed
GUEST, unregistred user!
不能用Query哦。
要求在程序中能够很方便的切换。
 
啊哦,没人帮帮忙么?
 
改变索引,一个正序,一个相反,然后刷新。
 
物理纪录也要排序吗?如果不的话就可以改变索引
 
怎么改变索引?
写出具体的改变索引的代码就可以了。
 
建2个索引,一个升序 i1 一个降序 i2,

运行时

table.IndexName:='i1';
或者
table.IndexName:='i2';
 
Diamond的MasterDetailTable没有IndexName属性怎么办?
 
笨办法,用两个table ,顺序相反
 
初始:
sql:=sql+'order by field1 asc';

切换:
str:=sql;
if ...then
begin
del(str,length(str)-4,3);
str:=str+'desc';
end
else
begin
del(str,length(str)-5,4);
str:=str+'asc';
end;
 
LawrenceZhang:都说没有IndexName了,呵呵。他只能指定IndexFieldName,不能
指定IndexName。

liuchuanbo:前提就是不能用Query

 
没看清题目
 
OK???
如果索引是数值型的:
再加一个隐藏字段,field2
原索引field1
field2:=-field1;
IndexFieldName:=field2/field1;
Table1.Exclusive := False;
Table1.Active := True;


 
哪用这么麻烦,用DevExpress就可以啦,有一个TdxDBgrid表格组件,只要用鼠标点
一下表头,就是正序,再点一下就反序。下载地址:
http://heguohua.topcool.net/
http://home.online.tj.cn/~kw/
 
指定IndexFieldName也是可以的。
那就按在表里加两个字段用来索引就行了,我以前用Paradox时就是在Desktop里
建的secondary Index。

你的数据库估计也行的。
 
看来只有动 Diamond的MasterDetailTable
indexFieldName
或再增加一个属性照反序
看 _recordset.sort deascend

请参考 :
procedure TDAOMasterDetailTable.OpenRecordset;
begin
inherited OpenRecordset;
_Recordset := Database._Database.OpenRecordset (FOpenSource, OpenTypeValues [FOpenType], GetOpenParameter (Parameters), LockTypeValues [LockType]);
if Filtered then _Recordset.Filter := Filter;
if FIndexFieldNames <> '' then
begin
FSort := StringReplace (FIndexFieldNames, ';', ',', True);
_Recordset.Sort := FSort;
end;
if Filtered or (FIndexFieldNames <> '') then
_Recordset := _Recordset.OpenRecordset (OpenTypeValues [FOpenType], GetOpenParameter (Parameters));
end;


function StringReplace (const S, OldPattern, NewPattern: string; const IgnoreCase: Boolean): string;
var
SearchStr, Patt, NewStr: string;
Offset: Integer;
begin
if IgnoreCase then
begin
SearchStr := AnsiUpperCase (S);
Patt := AnsiUpperCase (OldPattern);
end
else
begin
SearchStr := S;
Patt := OldPattern;
end;
NewStr := S;
Result := '';
while SearchStr <> '' do
begin
Offset := AnsiPos (Patt, SearchStr);
if Offset = 0 then
begin
Result := Result + NewStr;
break;
end;
Result := Result + Copy (NewStr, 1, Offset - 1) + NewPattern;
NewStr := Copy (NewStr, Offset + Length (OldPattern), MaxInt);
SearchStr := Copy (SearchStr, Offset + Length (Patt), MaxInt);
end;
end;
 
多人接受答案了。
 
后退
顶部