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:
alexs75
2013-04-17 12:41:59 +00:00
parent 9f5228dd9f
commit 5020d5a53f

View File

@ -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