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

для начала стоит погуглить: clientdataset сортировка на клиенте
...
Рейтинг: 0 / 0
ClientDataSet
    #39620383
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"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
ClientDataSet
    #39620386
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schiyou have to add a Calculated Fieldтолько internal а не обычные
...
Рейтинг: 0 / 0
ClientDataSet
    #39620531
TsYekaterina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
набросала процедуру с созданием временных индексов. целые числа сортирует как надо, т. е. 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
ClientDataSet
    #39620678
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
ClientDataSet
    #39620883
TsYekaterina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
schi,
помогает в создании проекта. Видимо, тоже решил здесь спросить.... Не была в курсе.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / ClientDataSet
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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