You've already forked lazarus-ccr
RxDBGrid - fix sort engine for SQLDB. Thx dmitry03 from freepascal.ru
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@2726 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@ -44,6 +44,7 @@ type
|
|||||||
TSQLQuerySortEngine = class(TRxDBGridSortEngine)
|
TSQLQuerySortEngine = class(TRxDBGridSortEngine)
|
||||||
public
|
public
|
||||||
procedure Sort(Field:TField; ADataSet:TDataSet; Asc:boolean; SortOptions:TRxSortEngineOptions);override;
|
procedure Sort(Field:TField; ADataSet:TDataSet; Asc:boolean; SortOptions:TRxSortEngineOptions);override;
|
||||||
|
procedure SortList(ListField: string; ADataSet: TDataSet; Asc: array of boolean; SortOptions: TRxSortEngineOptions); override;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
@ -52,13 +53,48 @@ uses SQLDB, synRegExpr, strUtils;
|
|||||||
|
|
||||||
procedure TSQLQuerySortEngine.Sort(Field: TField; ADataSet: TDataSet;
|
procedure TSQLQuerySortEngine.Sort(Field: TField; ADataSet: TDataSet;
|
||||||
Asc: boolean; SortOptions: TRxSortEngineOptions);
|
Asc: boolean; SortOptions: TRxSortEngineOptions);
|
||||||
var cmd:string;
|
begin
|
||||||
|
SortList(Field.FieldName,ADataSet,Asc,SortOptions);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TSQLQuerySortEngine.SortList(ListField: string; ADataSet: TDataSet;
|
||||||
|
Asc: array of boolean; SortOptions: TRxSortEngineOptions);
|
||||||
|
var
|
||||||
|
S:string;
|
||||||
|
i, C:integer;
|
||||||
|
cmd:string;
|
||||||
strLen:Integer;
|
strLen:Integer;
|
||||||
RegExpr: TRegExpr;
|
RegExpr: TRegExpr;
|
||||||
Mask:String;
|
Mask:String;
|
||||||
s:String;
|
OldParams:TParams;
|
||||||
begin
|
begin
|
||||||
if Assigned(ADataSet) and ADataset.Active then begin
|
if not (Assigned(ADataSet) and ADataset.Active) then exit;
|
||||||
|
|
||||||
|
S:='';
|
||||||
|
C:=Pos(';', ListField);
|
||||||
|
i:=0;
|
||||||
|
while C>0 do
|
||||||
|
begin
|
||||||
|
if S<>'' then S:=S+',';
|
||||||
|
S:=S + Copy(ListField, 1, C-1);
|
||||||
|
Delete(ListField, 1, C);
|
||||||
|
|
||||||
|
if (i<=High(Asc)) and (not Asc[i]) then
|
||||||
|
S:=S + ' DESC';
|
||||||
|
C:=Pos(';', ListField);
|
||||||
|
inc(i);
|
||||||
|
end;
|
||||||
|
|
||||||
|
if ListField<>'' then
|
||||||
|
begin
|
||||||
|
if S<>'' then S:=S+',';
|
||||||
|
S:=S + ListField;
|
||||||
|
if (i<=High(Asc)) and (not Asc[i]) then
|
||||||
|
S:=S + ' DESC';
|
||||||
|
end;
|
||||||
|
|
||||||
|
OldParams:=TParams.Create;
|
||||||
|
OldParams.Assign((ADataSet as TSQLQuery).Params);
|
||||||
cmd:=(ADataSet as TSQLQuery).SQL.Text;
|
cmd:=(ADataSet as TSQLQuery).SQL.Text;
|
||||||
strlen:=length(cmd);
|
strlen:=length(cmd);
|
||||||
//Регулярное выражение позволяет найти уже имеющуюся конструкцию ORDER BY,
|
//Регулярное выражение позволяет найти уже имеющуюся конструкцию ORDER BY,
|
||||||
@ -77,27 +113,20 @@ begin
|
|||||||
if Exec(cmd) then begin
|
if Exec(cmd) then begin
|
||||||
s:=LeftStr(cmd,MatchPos[0]-1)
|
s:=LeftStr(cmd,MatchPos[0]-1)
|
||||||
+slinebreak+'order by '
|
+slinebreak+'order by '
|
||||||
+Field.FieldName
|
+s+slineBreak
|
||||||
+' ';
|
|
||||||
if not asc then s:=s+'DESC';
|
|
||||||
s:=s+slineBreak
|
|
||||||
+RightStr(cmd, strlen-MatchPos[0]-MatchLen[0]+1);
|
+RightStr(cmd, strlen-MatchPos[0]-MatchLen[0]+1);
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
begin
|
s:=cmd+slinebreak+'order by '+s+slineBreak;
|
||||||
s:=cmd+slinebreak+'order by '
|
|
||||||
+Field.FieldName
|
|
||||||
+' ';
|
|
||||||
if not asc then s:=s+'DESC';
|
|
||||||
s:=s+slineBreak
|
|
||||||
end;
|
|
||||||
ADataSet.Active:=False;
|
ADataSet.Active:=False;
|
||||||
(ADataSet as TSQLQuery).SQL.Text:=s;
|
(ADataSet as TSQLQuery).SQL.Text:=s;
|
||||||
|
(ADataSet as TSQLQuery).Params.Assign(OldParams);
|
||||||
|
OldParams.Free;
|
||||||
ADataSet.Active:=True;
|
ADataSet.Active:=True;
|
||||||
|
|
||||||
Free;
|
Free;
|
||||||
end;
|
end;
|
||||||
end;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
initialization
|
initialization
|
||||||
|
Reference in New Issue
Block a user