Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.03.2018, 11:15   #1
Pahan90
Новичок
Джуниор
 
Регистрация: 19.03.2018
Сообщений: 5
По умолчанию TClientDataSet - Сортировка

доброго времени суток!не знаю с чего мне начать: нужно отсортировать некоторый набор данных в TClientDataSet типа:
название 5а25
название 8а10
название 10а17
название 15т18
чтобы например 2>10. можно сказать, как в проводнике.
Pahan90 вне форума Ответить с цитированием
Старый 19.03.2018, 11:30   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Только тогда, если будет так:
название 05а25
название 08а10
название 10а17
название 15т18
Иначе индексом клиентдатасета нельзя
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 19.03.2018, 12:21   #3
Pahan90
Новичок
Джуниор
 
Регистрация: 19.03.2018
Сообщений: 5
По умолчанию

тогда как мне добавить эти индексы?
Pahan90 вне форума Ответить с цитированием
Старый 19.03.2018, 12:31   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Ни как. Или в таблице базы должно быть соответствующее поле, или запросом сформировано вычисляемое. Или разбросано по нескольким полям в нужном формате. А клиентдатасет не имеет возможностей пользовательской сортировки при создании индекса, только по значению полей
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 19.03.2018 в 12:36.
Аватар вне форума Ответить с цитированием
Старый 19.03.2018, 12:42   #5
Pahan90
Новичок
Джуниор
 
Регистрация: 19.03.2018
Сообщений: 5
По умолчанию

то есть у меня не получится загрузить данные в stringlist, скажем, и там отсортировать их?
Pahan90 вне форума Ответить с цитированием
Старый 19.03.2018, 12:47   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Получится, там есть пользовательская сортировка, но при чем тогда клиентдатасет? Но и там не так все просто, особенно если названия разнотипные, включающие наряду с 5а25 и 123-ррр-15 и тому подобное. Недавно была похожая тема, если найду кину ссылку

http://www.programmersforum.ru/showthread.php?t=317029
http://www.programmersforum.ru/showthread.php?t=317766
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 19.03.2018 в 12:51.
Аватар вне форума Ответить с цитированием
Старый 19.03.2018, 12:54   #7
Pahan90
Новичок
Джуниор
 
Регистрация: 19.03.2018
Сообщений: 5
По умолчанию

спасибо, смотрел как раз последнюю тему, но, мне кажется, что так не пойдет для клиентдатасет...
Pahan90 вне форума Ответить с цитированием
Старый 19.03.2018, 13:39   #8
Pahan90
Новичок
Джуниор
 
Регистрация: 19.03.2018
Сообщений: 5
По умолчанию

попробовал вот так, но сортирует не в той немного последовательности: сортировка происходит строковая (2<10).
Код:
/////сортировка по индексам
procedure TMainForm.MySort;
type
     TSortItem = record
      Key: String;
      Values: Array of Variant;
     end;
     TSortItems = Array of TSortItem;
 var
     I,J: Integer;
     DataSet: TClientDataSet;
     TmpStr, IndexFields: String;
     FCount, FMaxParamCount: Integer;
     SortItems: TSortItems;
     IsFloat: Boolean;
     F: Double;
begin
      try
      //Временная сортировка
      StandDS.IndexFieldNames:= 'Document';
      //Создать объекты
      DataSet:= TClientDataSet.Create(Application);
       // По каким параметрам будет отбор для сортировки
       TmpStr:= STandDS.FieldByName('Document').AsString;
       // Очистить хранилище: индексы,данные,наборы полей
       DataSet.IndexFieldNames:= '';
       If DataSet.Active then begin
        DataSet.EmptyDataSet;
        DataSet.FieldDefs.Clear;
        DataSet.Fields.Clear;
        DataSet.Close;
       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 SortItems[J].Values<>nil then
          If Length(SortItems[J].Values)>=I then begin
           try
            IsFloat:= TryStrToFloat(SortItems[J].Values[I], F);
           except
            IsFloat:= False;
           end;
           If not IsFloat
            then Break;
          end;
       end;
       // Датасет с нужной структурой создан, заносим данные
       DataSet.CreateDataSet;
       DataSet.IndexFieldNames:= '';
       DataSet.Active:= True;
       For I:= 0 to FCount-1 do begin
        DataSet.Append;
        For J:= 0 to FMaxParamCount-1 do
         If J<=Length(SortItems[I].Values)-1
          then DataSet.FieldByName('Field'+IntToStr(J)).Value:= SortItems[I].Values[J]
          else DataSet.FieldByName('Field'+IntToStr(J)).Value:= MaxDouble;
       end;
     finally
     DataSet.Free;
     end;
end;
может, подскажете, что не так?
Pahan90 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TClientdataset MIKE11IPME БД в Delphi 9 07.08.2012 13:22
[C++ Builder] Вопросы по TClientDataSet ndr_ C/C++ Базы данных 2 19.07.2012 09:52
Проблема с TClientDataSet BaiAs БД в Delphi 1 21.05.2010 13:53
Шифрование TClientDataSet (xml) JOHNKZ1 БД в Delphi 0 22.09.2009 13:08
TTable или TClientDataSet? Dux БД в Delphi 0 23.04.2008 01:32