2015-01-21 3 views
0

Я изучал ClientDataSet в delphi и как он может помочь сортировать мою базу данных SQL. Данные отображаются в моем TDBGrid, и я включил сортировку, нажав на заголовок, изменив IndexField для ClientDataset. Я хочу, чтобы это происходило по убыванию, иногда, хотя они пытались использовать 2 IndexNames, описанные здесь. https://stackoverflow.com/a/13130816/4075632Delphi ClientDataSet Сортировка путем изменения IndexName

Однако, когда я меняю IndexName с DEFAULT_ORDER на CHANGEINDEX, все данные в моем DBGrid исчезают. Я довольно новичок в этом, и я знаю, что это будет зависеть от моей ситуации, но каковы некоторые из этих способов, и я попытаюсь устранить их.

У меня есть 1 TSQLConnection, подключенный к TSQLQuery и подключенный к TDataSetProvider и связанный с моим ClientDataSet, который приводит к TDataSource в TDBGrid. Почему ClientDataSet, который обычно вызывает проблемы при изменении имени? Пожалуйста, имейте в виду, что большинство настроек по умолчанию, потому что я не слишком уверен в этих компонентах. Спасибо, я надеюсь, что вы можете оказать некоторую полезную помощь, и я сожалею, что это может быть трудно решить мою ситуацию.

Toby

ответ

3

Я использую следующий код для построения индексов для ClientDataSet:

Procedure BuildIndices (cds: TClientDataSet); 
var 
i, j: integer; 
alist: tstrings; 

begin 
with cds do 
    begin 
    open; 
    logchanges:= false; 
    for i:= 0 to FieldCount - 1 do 
    if fields[i].fieldkind <> fkCalculated then 
    begin 
     j:= i * 2; 
     addindex ('idx' + inttostr (j), fieldlist.strings[i], [], '', '', 0); 
     addindex ('idx' + inttostr (j+1), fieldlist.strings[i], [ixDescending], '', '', 0); 
    end; 
    alist:= tstringlist.create; 
    getindexnames (alist); 
    alist.free; 
    close; 
    end; 
end; 

В результате, существует индекс «idx0» для сортировки столбца 0 восходящих и «idx1» для сортировки по убыванию столбца 0; «Idx2» и «idx3» для столбца 1 и т.д.

Затем в OnTitleClick случае сетки, я бы следующее

procedure Txxx.DBGrid1TitleClick(Column: TColumn); 
var 
n, ex: word; 

begin 
n:= column.Index; 
try 
    dbgrid1.columns[prevcol].title.font.color:= clNavy 
except 
end; 

dbgrid1.columns[n].title.font.color:= clRed; 
prevcol:= n; 
directions[n]:= not directions[n]; 
ex:= n * 2; 
if directions[n] then inc (ex); 
with clientdataset do 
    try 
    disablecontrols; 
    indexname:= 'idx' + inttostr (ex); 
    finally 
    first; 
    enablecontrols 
    end; 
end; 

В каждой форме, я определяю массив булевых («направление»), один элемент на столбец сетки. Эти элементы отслеживают, следует ли сортировать столбец по возрастанию или по убыванию.

+0

Спасибо! Почти там, но что такое prevcoI? Im получает необъявленные переменные ошибки. Спасибо –

+0

@TobyFox: prevcol - целочисленная переменная, принадлежащая к форме (забыли об этом). Он сохраняет значение предыдущего выбранного столбца. –

+0

Привет, спасибо. Я уверен, что это сработает, потому что это кажется правильным, но моя таблица базы данных все еще не отображается, и каждый раз, когда я нажимаю на заголовок, я получаю сообщение об ошибке «не может выполнять действие в закрытом наборе данных». Поэтому я полагаю, что моя оригинальная проблема все еще стоит. Данные не отображаются в DBGrid, когда имя CDS - это нечто иное, чем значение по умолчанию. Что я должен проверить? Большое спасибо, Toby –

1

ClientDataSet поставляется с двумя предварительно установленными показателями: DEFAULT_ORDER и CHANGEINDEX, которые никакого реального использования для вашей задачи, потому что вы не можете изменить их к вашим потребностям. Поэтому вам нужно создать свои собственные индексы. Полное описание Кэри Дженсена можно найти в this article, а также в его высоко рекомендуется book about ClientDataSets.

Смежные вопросы