Browse Source

* Allow specifying DESC indexes in IndexFieldNames. Patch by Lutz Mändle (bug ID 30479)

git-svn-id: trunk@34468 -
michael 9 years ago
parent
commit
fc7d4a36f4
1 changed files with 56 additions and 10 deletions
  1. 56 10
      packages/fcl-db/src/base/bufdataset.pas

+ 56 - 10
packages/fcl-db/src/base/bufdataset.pas

@@ -652,7 +652,7 @@ procedure RegisterDatapacketReader(ADatapacketReaderClass : TDatapacketReaderCla
 
 
 implementation
 implementation
 
 
-uses variants, dbconst, FmtBCD;
+uses variants, dbconst, FmtBCD, strutils;
 
 
 Type TDatapacketReaderRegistration = record
 Type TDatapacketReaderRegistration = record
                                        ReaderClass : TDatapacketReaderClass;
                                        ReaderClass : TDatapacketReaderClass;
@@ -2035,23 +2035,56 @@ begin
   FIndexDefs.Updated:=false;
   FIndexDefs.Updated:=false;
 end;
 end;
 
 
+const
+  Desc=' DESC';     //leading space is important
+  LenDesc:integer=Length(Desc);
+  Limiter=';';
+
 procedure TCustomBufDataset.SetIndexFieldNames(const AValue: String);
 procedure TCustomBufDataset.SetIndexFieldNames(const AValue: String);
+var
+  i, p: integer;
+  s: string;
+  SortFields, DescFields: string;
+
 begin
 begin
   if AValue<>'' then
   if AValue<>'' then
-    begin
+  begin
     if FIndexesCount=0 then
     if FIndexesCount=0 then
       InitDefaultIndexes;
       InitDefaultIndexes;
-    FIndexes[1].FieldsName:=AValue;
-    FCurrentIndex:=FIndexes[1];
+
+    SortFields := '';
+    DescFields := '';
+    for i := 1 to WordCount(AValue, [Limiter]) do
+    begin
+      s := ExtractDelimited(i, AValue, [Limiter]);
+      p := Pos(Desc, s);
+      if p>0 then
+      begin
+        system.Delete(s, p, LenDesc);
+        DescFields := DescFields + Limiter + s;
+      end;
+      SortFields := SortFields + Limiter + s;
+    end;
+
+    if (Length(SortFields)>0) and (SortFields[1]=Limiter) then
+      system.Delete(SortFields,1,1);
+    if (Length(DescFields)>0) and (DescFields[1]=Limiter) then
+      system.Delete(DescFields,1,1);
+
+    FIndexes[1].FieldsName := SortFields;
+    FIndexes[1].Options := [];
+    FIndexes[1].DescFields := DescFields;
+
+    FCurrentIndex := FIndexes[1];
     if Active then
     if Active then
       begin
       begin
       FetchAll;
       FetchAll;
       BuildIndex(FIndexes[1]);
       BuildIndex(FIndexes[1]);
       Resync([rmCenter]);
       Resync([rmCenter]);
       end;
       end;
-    FPacketRecords:=-1;
-    FIndexDefs.Updated:=false;
-    end
+    FPacketRecords := -1;
+    FIndexDefs.Updated := false;
+  end
   else
   else
     SetIndexName('');
     SetIndexName('');
 end;
 end;
@@ -2744,11 +2777,24 @@ begin
 end;
 end;
 
 
 function TCustomBufDataset.GetIndexFieldNames: String;
 function TCustomBufDataset.GetIndexFieldNames: String;
+var
+  i, p: integer;
+  s: string;
+
 begin
 begin
+  Result := '';
   if (FIndexesCount=0) or (FCurrentIndex<>FIndexes[1]) then
   if (FIndexesCount=0) or (FCurrentIndex<>FIndexes[1]) then
-    result := ''
-  else
-    result := FCurrentIndex.FieldsName;
+    Exit;
+  for i := 1 to WordCount(FCurrentIndex.FieldsName, [Limiter]) do
+  begin
+    s := ExtractDelimited(i, FCurrentIndex.FieldsName, [Limiter]);
+    p := Pos(s, FCurrentIndex.DescFields);
+    if p>0 then
+      s := s + Desc;
+    Result := Result + Limiter + s;
+  end;
+  if (Length(Result)>0) and (Result[1]=Limiter) then
+    system.Delete(Result, 1, 1);
 end;
 end;
 
 
 function TCustomBufDataset.GetIndexName: String;
 function TCustomBufDataset.GetIndexName: String;