Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник
Коллекция курьезных вопросов из форумов
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Сортировка в ClientDataset [D7, MSSQL]


Amir   (13.09.12 16:10

Имеется ClientDataset (cds) используемый как локальная таблица без привязки к БД.
Поля cds формируются динамически

Необходимо по клику на заголовке колонки DBGrid отсортировать данные текущего поля
ClientDataset по возрастанию или по убыванию

Делаю так:
 
 ....
 var
   indx: string;
   desc: boolean;
   
 if cds.IndexName=indx then
    cds.DeleteIndex(IndexName);
   
 if desc then  
    cds.AddIndex(indx,Field.FieldName,[ixDescending])
 else
    cds.AddIndex(indx,Field.FieldName,[]);
    cds.IndexName := indx;

 
Конструкция почти всегда работает но ногда появляется ошибка:

Name not unique in this context

Почему это происходит?


Виталий Панасенко   (13.09.12 17:24[1]

А если просто настроить индексов и просто их активными делать?


Amir   (15.09.12 12:52[2]


> А если просто настроить индексов и просто их активными делать?


А для чего же тогда нужен метод AddIndex ?

И зачем для того чтобы сортировать данные всего лишь по одному полю нужно строить индексы ASC И DESC сортировки для каждого поля датасета. Это  не очень оптимальный подход.


sniknik ©   (15.09.12 12:57[3]

> Это  не очень оптимальный подход.
ну, с MSSQL использовать ClientDataset тоже, но тебя же это не останавливает.


Amir   (15.09.12 13:08[4]


> sniknik ©   (15.09.12 12:57) [3]
>
> > Это  не очень оптимальный подход.
> ну, с MSSQL использовать ClientDataset тоже, но тебя же
> это не останавливает.
>


См. начало


> Имеется ClientDataset (cds) используемый как локальная таблица
> без привязки к БД.


sniknik ©   (15.09.12 13:14[5]

> См. начало
см. еще раз, в цикле до понимания
>> Это  не очень оптимальный подход.
> ну, с MSSQL использовать ClientDataset тоже, но тебя же это не останавливает.


sniknik ©   (15.09.12 13:17[6]

> Делаю так:
ошибки, в "так"
1 нет begin
2 проверяется indx, удаляется IndexName
3 desc не определено
4 нет назначения значения indx, создается неопределенный (возможно дефаултный по названию) индекс


Amir   (17.09.12 13:51[7]

Нашел способ:
Нужно использовать GetIndexNames для определения всех доступных индексов :

procedure SortField (cds: TClientDataset; fld: TField; dsc: boolean);
var
slInds :TStrings;
ndx: string;
i: integer;

begin
 try
   slInds := TStrinList.Create;
   ndx := 'is_'+fld.FieldName;

   cds.GetIndexNames(slInds);
   for i := 0 to slInds.Count-1 do
     if Copy(slInds.Strings[i],1,3) = 'is_' then
        DeleteIndex(slInds.Strings[i]);

   if dsc then
      cds.AddIndex(ndx,Field.FieldName,[ixDescending])
   else
      cds.AddIndex(ndx,Field.FieldName,[]);

   cds.IndexName := ndx;

 finally
   slInds.Free;    
 end;


Всем спасибо за участие


GarfieldX   (07.02.19 19:15[8]

procedure SortDataSet(cds: TClientDataset; aField: TField; aDescending: Boolean);
var
 sl: TStringList;
 ndx: string;
 i: Integer;
begin
 sl := TStringList.Create;
 try
   ndx := 'is_' + aField.FieldName;

   cds.GetIndexNames(sl);
   for i := 0 to sl.Count-1 do
     if (Copy(sl.Strings[i], 1, 3) = 'is_') then
       cds.DeleteIndex(sl.Strings[i]);

   if aDescending
     then cds.AddIndex(ndx, aField.FieldName, [ixDescending])
     else cds.AddIndex(ndx, aField.FieldName, []);

   cds.IndexName := ndx;
 finally
   sl.Free;
 end;
end;


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо