-
Имеется 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 Почему это происходит?
-
А если просто настроить индексов и просто их активными делать?
-
> А если просто настроить индексов и просто их активными делать?
А для чего же тогда нужен метод AddIndex ?
И зачем для того чтобы сортировать данные всего лишь по одному полю нужно строить индексы ASC И DESC сортировки для каждого поля датасета. Это не очень оптимальный подход.
-
> Это не очень оптимальный подход. ну, с MSSQL использовать ClientDataset тоже, но тебя же это не останавливает.
-
> sniknik © (15.09.12 12:57) [3] > > > Это не очень оптимальный подход. > ну, с MSSQL использовать ClientDataset тоже, но тебя же > это не останавливает. >
См. начало
> Имеется ClientDataset (cds) используемый как локальная таблица > без привязки к БД.
-
> См. начало см. еще раз, в цикле до понимания >> Это не очень оптимальный подход. > ну, с MSSQL использовать ClientDataset тоже, но тебя же это не останавливает.
-
> Делаю так: ошибки, в "так" 1 нет begin 2 проверяется indx, удаляется IndexName 3 desc не определено 4 нет назначения значения indx, создается неопределенный (возможно дефаултный по названию) индекс
-
Нашел способ: Нужно использовать 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;
Всем спасибо за участие
-
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;
|