Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.02.24;
Скачать: CL | DM;

Вниз

Как сделать сортировку в DBGrid е   Найти похожие ветки 

 
Andrushk   (2003-02-06 15:02) [0]

Надо сортировать по клику на заголовке столбца
Сейчас я это делаю так:

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 поля так нельзя, а их в основном и надо.
Может кто делал подобные вещи - поделитесь опытом, а то все что я не придумываю кажется мне не очень универсальным и громоздким.


 
Reindeer Moss Eater   (2003-02-06 15:08) [1]

1. По клику на заголовке столбца проверять тип поля. И если оно LookUp, ничего не делать.

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


 
Reindeer Moss Eater   (2003-02-06 15:09) [2]

Получать это поле не на клиенте, и сортировать в запросе


 
Andrushk   (2003-02-06 15:37) [3]

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

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

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

но может как-то проще можно?


 
Reindeer Moss Eater   (2003-02-06 15:38) [4]

Что для тебя критерий "простоты"?


 
Andrushk   (2003-02-06 15:50) [5]

мне бы не хотелось лезть в запрос

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

может есть еще какие-то пути

я не могу сказать что проще пока не узнаю еще какие-нибудь методы


 
Соловьев ©   (2003-02-06 15:59) [6]

В обработчике onTitleClic:
ClientDataSet.IndexName := "NameField"
И все.


 
Соловьев ©   (2003-02-06 16:04) [7]

Сорри. Вот так:
procedure TForm.GridTitleClick(Column: TColumn);
begin
ClientDataSet.IndexFieldNames := Column.FieldName;
end;


 
Andrushk   (2003-02-06 16:06) [8]

>>Соловьев ©
для lookup полей это не сработает


 
Соловьев ©   (2003-02-06 16:10) [9]


> Andrushk (06.02.03 15:50)
> мне бы не хотелось лезть в запрос
>
> просто тупо добавлять ORDER BY в конец? а вдруг там какая-нить
> хрень стоит после которой нельзя ORDER BY ставить,

Дествитель делай связку на сервере.
нельзя ORDER BY ставить - ты зачем?



 
Andrushk   (2003-02-06 16:19) [10]

>>Соловьев ©
что за связка на сервере?
и почему нельзя ORDER BY добавлять?


 
Соловьев ©   (2003-02-06 16:23) [11]

Связка на сервере:
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 ставить

Сам себе противоречишь. Можно ставить, только ты зачем - чтобы решать когда ставить. Имхо.


 
Andrushk   (2003-02-06 16:36) [12]

>>Соловьев ©
Я себе не противоречу, просто фразу "нельзя ORDER BY ставить - ты зачем?" - лично я воспринял как предостережение, что в данном случае его лучше не использовать, поэтому и спросил "почему?"

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

запрос на сервере, это в смысле в датасете?

кстати, можно писать вот так:

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

Если бы можно было написать: select t.*, lookUp.name - то нечего было бы измудряться с ORDER BY

может еще какие способы есть????


 
Соловьев ©   (2003-02-06 16:44) [13]


> Andrushk (06.02.03 16:36)
> запрос на сервере, это в смысле в датасете?

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

> может еще какие способы есть????


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



 
Andrushk   (2003-02-06 16:52) [14]

dataset->provider->clientdataset

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


 
Соловьев ©   (2003-02-06 16:58) [15]


> Andrushk (06.02.03 16:52)
> dataset->provider->clientdataset
>
> Но насколько я понимаю, на клиенте нет никакого смысла делать
> запросы, ведь я буду выбирать данные не из всего набора
> данных, а лишь из тех, которыми располагает клиент

Тебе нужно внимательно прочитать про Мидас.
TQuery(TTable)->provider->clientdataset а не то что ты написал.
ClientDataSet.CommandText-шлет запрос провайдеру, тот определяет откуда надо взять и возвращает(удаляет, вставляет, обновляет) данные. Еще есть интересная вещь Delta и ApplyUpdate - обязательно про них читай.



 
Andrushk   (2003-02-06 17:03) [16]

>>Соловьев ©

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

а вот по поводу запроса провайдеру - надо проверить, если это действительно так, то вроде задача упрощается

:-)) интересно, как не зная ApplyUpdate можно вообще работать с ClientDataSet"ом


 
Соловьев ©   (2003-02-06 17:11) [17]


> Andrushk (06.02.03 17:03)
> >>Соловьев ©
>
> зачем мне TQuery, я работаю с oracle через DBExpress, и
> в качестве dataset"а использую TSQLDataSet

Неважно.


 
Andrushk   (2003-02-06 17:26) [18]

>>Соловьев ©

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

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


 
Andrushk   (2003-02-06 17:32) [19]

>>Соловьев ©

вообще бы как бы такой запрос написать, чтобы он включил все поля из датасета + все лукап поля


 
Соловьев ©   (2003-02-06 17:33) [20]

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


 
Соловьев ©   (2003-02-06 17:36) [21]

ftp://nps.vnet.ee/pub/Docs/Delphi/DX/MIDAS.zip
Есть ее перевод у меня, но ссылки я не нашел, очень хорошая статья.


 
Andrushk   (2003-02-06 17:45) [22]

>>Соловьев ©
а где бы можно почитать про OnGetDataSetPoperties ??
Кстати, я тоже скорпион :-)

нет, вот как мне сделать:
есть SQLDataSet1 - в нем какой-то запрос, сложный с кучей условий

через провайдер он связан с ClientDataSet1

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

SELECT * FROM SQLDataSet1

- ну по смылу вот так, а как это реально можно написать?


 
Andrushk   (2003-02-06 17:47) [23]

//Соловьев © (06.02.03 17:36)
// ftp://nps.vnet.ee/pub/Docs/Delphi/DX/MIDAS.zip
//Есть ее перевод у меня, но ссылки я не нашел, очень хорошая статья.

Может скинешь?
[email protected]


 
Соловьев ©   (2003-02-06 17:47) [24]

Нет, так нельзя.


 
Соловьев ©   (2003-02-06 17:51) [25]

Я отправил.



Страницы: 1 вся ветка

Текущий архив: 2003.02.24;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.012 c
1-75855
__Oleg
2003-02-13 17:51
2003.02.24
Удаление файлов


14-76186
MARcoDEN
2003-02-06 10:11
2003.02.24
Delphi 7 vs. Delphi 5


3-75800
LazorenkoX
2003-02-06 13:22
2003.02.24
SQLы


1-76017
ivc_andr
2003-02-13 13:20
2003.02.24
Поиск файла по дате создания


1-75880
Anton
2003-02-12 12:43
2003.02.24
SelectedRows