Як зробити сортування в 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
- ну по змило ось так, а як це реально можна написати?