Як зробити сортування в dbgrid е

Як зробити сортування в DBGrid е

Треба сортувати по кліку на заголовку стовпчика
Зараз я це роблю так:

with (dbgView.DataSource.DataSet as TClientDataSet) do if Active then Close;
if Column.Field.FieldKind = fkData then
with (dbgView.DataSource.DataSet as TClientDataSet) do
begin
IndexDefs.Clear;
IndexDefs.Add ( "SortIndex", AnsiUpperCase (Column.FieldName), []);
IndexName: = "SortIndex";
end;
(DbgView.DataSource.DataSet as TClientDataSet) .Open;

Проблема в тому, що сортувати LookUp поля так не можна, а їх в основному і треба.
Може хто робив подібні речі - поділіться досвідом, а то все що я не вигадую здається мені не дуже універсальним і громіздким.

1. По кліку на заголовку стовпчика перевіряти тип поля. І якщо воно LookUp, нічого не робити.

2. Сортувати по полю - ключу для lookup поля.

Отримувати це полі не на клієнті, і сортувати в запиті

>> Reindeer Moss Eater
я зараз так і роблю, просто else із запиту викинув коли його вставляв в питання, але це не вихід, поле NAME таблички зовсім необов'язково зав'язано з ID, яким я можу скористатися

>> Reindeer Moss Eater
Я думав над цим, але мені треба написати універсальну форму, на якій лежить грід, а вже які там будуть дані, з якого датасета - це заздалегідь невідомо

можна звичайно передавати формі крім кліентдатасета ще й датасета і список полів відповідності lookup-полів і реальних в базі, а потім динамічно підставляти в запит ORDER BY по потрібним полях

але може якось простіше можна?

Що для тебе критерій "простоти"?

мені б не хотілося лізти в запит

просто тупо додавати ORDER BY в кінець? а раптом там якась нитка хрень варто після якої не можна ORDER BY ставити,
та й взагалі, якби я міг з clientdataset дістатися до clientdataset "а - це ще одне, а так передавати їх обидва.

може є ще якісь шляхи

я не можу сказати що простіше поки не дізнаюся ще якісь методи

У обробнику onTitleClic:
ClientDataSet.IndexName: = "NameField"
І все.

Соррі. Ось так:
procedure TForm.GridTitleClick (Column: TColumn);
begin
ClientDataSet.IndexFieldNames: = Column.FieldName;
end;


> Andrushk (06.02.03 15:50)
> Мені б не хотілося лізти в запит
>
> Просто тупо додавати ORDER BY в кінець? а раптом там якась нитка
> Хрень варто після якої не можна ORDER BY ставити,

Дествітель роби зв'язку на сервері.
не можна ORDER BY ставити - ти навіщо?

Зв'язка на сервері:
select t. *, lookUp.name
from t, lookUp
where t.id = lookUp.id
order by lookUp.name

> Andrushk (06.02.03 15:50)
> Мені б не хотілося лізти в запит
>
> Просто тупо додавати ORDER BY в кінець? а раптом там якась нитка
> Хрень варто після якої не можна ORDER BY ставити

Сам собі суперечиш. Можна ставити, тільки ти навіщо - щоб вирішувати коли ставити. Имхо.

я ось подумав, будь-якого чи запиту можна в кінець впендюріть ORDER BY. зразок будь-якого

запит на сервері, це в сенсі в датасета?

до речі, можна писати ось так:

select t. *
from t, lookUp
where t.id = lookUp.id
order by lookUp.name

Якби можна було написати: select t. *, LookUp.name - то нічого було б ізмудряться з ORDER BY

може ще якісь способи є.


> Andrushk (06.02.03 16:36)
> Запит на сервері, це в сенсі в датасета?

провайдер у тебе з чим пов'язаний?

> Може ще якісь способи є.

Можна через ClientDataSet.CommandText.

Але наскільки я розумію, на клієнті немає ніякого сенсу робити запити, адже я буду вибирати дані не з усього набору даних, а лише з тих, якими володіє клієнт


> Andrushk (06.02.03 16:52)
> Dataset-> provider-> clientdataset
>
> Але наскільки я розумію, на клієнті немає ніякого сенсу робити
> Запити, адже я буду вибирати дані не з усього набору
> Даних, а лише з тих, якими володіє клієнт

Тобі потрібно уважно прочитати про Мідас.
TQuery (TTable) -> provider-> clientdataset а не те що ти написав.
ClientDataSet.CommandText-шле запит провайдеру, той визначає звідки треба взяти і повертає (видаляє, вставляє, оновлює) дані. Ще є цікава річ Delta і ApplyUpdate - обов'язково про них читай.

навіщо мені TQuery, я працюю з oracle через DBExpress, і в якості dataset "а використовую TSQLDataSet

а ось з приводу запиту провайдеру - треба перевірити, якщо це дійсно так, то на кшталт завдання спрощується

-)) Цікаво, як не знаючи ApplyUpdate можна взагалі працювати з ClientDataSet "ом

а як мені в clientdataset "е в SELECT-е, в Клаузе FROM вказати що я хочу вибирати з усього того, що є в dataset-е?

тобто чи можна зробити так, що dataset буде як табличка, і я його вкажу в запиті clientdataset "а

взагалі б як би такий запит написати, щоб він включив все поля з датасета + все Лукапа поля

Провайдер сам дивиться що йому потрібно змінити.
OnGetDataSetPoperties - подивися там можна вказати кого ти хочеш міняти.

немає, ось як мені зробити:
є SQLDataSet1 - в ньому якийсь запит, складний з купою умов

через провайдер він пов'язаний з ClientDataSet1

Так ось можна в ClientDataSet1.CommandText написати:

SELECT * FROM SQLDataSet1

- ну по змило ось так, а як це реально можна написати?

Схожі статті