Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / ClientDataSet / 7 сообщений из 7, страница 1 из 1
26.03.2018, 09:29
    #39620328
TsYekaterina
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ClientDataSet
Подскажите, как сделать пользовательскую сортировку в ClientDataSet? если можно, пример какой-нибудь.
...
Рейтинг: 0 / 0
26.03.2018, 09:37
    #39620338
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ClientDataSet
TsYekaterina,

для начала стоит погуглить: clientdataset сортировка на клиенте
...
Рейтинг: 0 / 0
26.03.2018, 10:49
    #39620383
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ClientDataSet
"If you want to do custom sorting on anything else than existing fields, then you have to add a Calculated Field, perform a kind of order calculation in the OnCalcFields event, then add that field to the IndexDefs."

https://stackoverflow.com/questions/17921635/how-to-override-sort-mechanism-of-tclientdataset
...
Рейтинг: 0 / 0
26.03.2018, 10:52
    #39620386
vavan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ClientDataSet
schiyou have to add a Calculated Fieldтолько internal а не обычные
...
Рейтинг: 0 / 0
26.03.2018, 14:44
    #39620531
TsYekaterina
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ClientDataSet
набросала процедуру с созданием временных индексов. целые числа сортирует как надо, т. е. 8<10. но вот если попадаются числа с разделителем, например,
текст 187
текст 2,85, то сортировка не числовая, а строковая... подскажете, может?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
procedure TMainForm.SortField ;
type
     TSortItem = record
      Key: String;
      Values: Array of Variant;
     end;
     TSortItems = Array of TSortItem;

var
     I,J: Integer;
     DataSet: TClientDataSet;
     List: TStringList;
     TmpStr,ProductName: String;
     FCount: Integer;
     FItems: TSortItems;
     FMaxParamCount: Integer;
     IndexFields: String;
     IsFloat: Boolean;
     F: Double;
     Sort: string;
     BookMark: integer;

     function GetItemPos(Key: String): Integer;
     begin
          DataSet.First;
          For Result:= 0 to DataSet.RecordCount-1 do begin
           If DataSet.FieldByName('Key').AsString=Key
            then Exit;
           DataSet.Next;
          end;
          Inc(Result);
     end;
begin
     try
     StandDS.IndexFieldNames:= '';
      StandDS.IndexFieldNames:= 'ТипДетали;КострукторскоеОбозначение;Наименование;ГОСТ';
      //Создать объекты
      DataSet:= TClientDataSet.Create(Application);
      List:= TStringList.Create;
      FItems:= nil;
      FCount:= 0;
      FMaxParamCount:= 0;

      StandDS.First;
      While not StandDS.Eof do begin
      BookMark:= StandDS.FieldByName('ID').AsInteger;

      //Параметры сортировки
       TmpStr:= StandDS.FieldByName('ГОСТ').AsString;
      ProductName:= StandDS.FieldByName('Наименование').AsString;

       // Очистить хранилище: индексы,данные,наборы полей
       DataSet.IndexFieldNames:= '';
       If DataSet.Active then begin
        DataSet.EmptyDataSet;
        DataSet.FieldDefs.Clear;
        DataSet.Fields.Clear;
        DataSet.Close;
       end;
       FItems:= nil;
       FCount:= 0;
       FMaxParamCount:= 0;

       // Ищем изделия в пределах одного документа
       While (StandDS.FieldByName('ГОСТ').AsString=TmpStr) and (StandDS.FieldByName('Наименование').AsString=ProductName)
       and (not StandDS.Eof)
      do begin
       SetLength(FItems, FCount+1);
       //Поле "sName" в массив сортировки
        FItems[FCount].Key:= StandDS.FieldByName('sName').AsString;
        Sort:=StandDS.FieldByName('ГОСТ').AsString;
        List.Text:= StandDS.FieldByName('ДляСортировки').AsString;
        begin
        If List.Count>0 then begin
        //параметры для сортировки
         If List.Count>FMaxParamCount
          then FMaxParamCount:= List.Count;
         SetLength(FItems[FCount].Values, List.Count);
         For I:= 0 to List.Count-1 do
          FItems[FCount].Values[I]:= List.Strings[I];
        end;
        end;
        Inc(FCount);
        StandDS.Next;
       end;
       // Сортируем объекты
       DataSet.FieldDefs.Add('Key', ftString, 100);
       IndexFields:= '';
       IsFloat:= False;
       For I:= 0 to FMaxParamCount-1 do begin
        For J:= 0 to FCount-1 do
         If FItems[J].Values<>nil then
         //определеяем, числовое поле или нет
          If Length(FItems[J].Values)>=I then begin
           try
            IsFloat:= TryStrToFloat(FItems[J].Values[I], F);
           except
            IsFloat:= False;
           end;
           If not IsFloat
            then Break;
          end;
        If IsFloat
         then DataSet.FieldDefs.Add('Field'+IntToStr(I), ftFloat)
         else DataSet.FieldDefs.Add('Field'+IntToStr(I), ftString, 20);
        IndexFields:= IndexFields+'Field'+IntToStr(I)+';';
       end;
       // Заносим данные в датасет
       DataSet.CreateDataSet;
       DataSet.IndexFieldNames:= '';
       DataSet.Active:= True;
       For I:= 0 to FCount-1 do begin
        DataSet.Append;
        DataSet.FieldByName('Key').AsString:= FItems[I].Key;
        For J:= 0 to FMaxParamCount-1 do
         If J<=Length(FItems[I].Values)-1
          then DataSet.FieldByName('Field'+IntToStr(J)).Value:= FItems[I].Values[J]
          else DataSet.FieldByName('Field'+IntToStr(J)).Value:= MaxDouble;
        DataSet.Post;
       end;
       //собственно, сортировка
      DataSet.IndexFieldNames:= IndexFields+'Key';
      StandDS.Locate('ID',BookMark,[]);
       For I:= 0 to DataSet.RecordCount-1 do begin
        StandDS.Edit;
        StandDS.FieldByName('ПорядокПоПараметрам').AsInteger:= GetItemPos(StandDS.FieldByName('sName').AsString);
        StandDS.Post;
        StandDS.Next;
       end;
      end;
     finally
      DataSet.Free;
      List.Free;
      FItems:= nil;
     end;
     // Включаем индексацию
     StandDS.IndexFieldNames:= 'ТипДетали;КострукторскоеОбозначение;PozName;Наименование;ГОСТ;ПорядокПоПараметрам';
end;
...
Рейтинг: 0 / 0
26.03.2018, 17:55
    #39620678
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ClientDataSet
...
Рейтинг: 0 / 0
27.03.2018, 08:10
    #39620883
TsYekaterina
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ClientDataSet
schi,
помогает в создании проекта. Видимо, тоже решил здесь спросить.... Не была в курсе.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / ClientDataSet / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]