Конференция "Базы" » Сортировка в ClientDataset [D7, MSSQL]
 
  • Amir (13.09.12 16:10) [0]
    Имеется 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;
 
Конференция "Базы" » Сортировка в ClientDataset [D7, MSSQL]
Есть новые Нет новых   [134427   +26][b:0][p:0.002]