Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.02.24;
Скачать: [xml.tar.bz2];

Вниз

Как сделать сортировку в 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
//Есть ее перевод у меня, но ссылки я не нашел, очень хорошая статья.

Может скинешь?
Andrushk@front.ru


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

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


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

Я отправил.



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

Форум: "Базы";
Текущий архив: 2003.02.24;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.009 c
14-76107
Marser
2003-02-02 21:20
2003.02.24
Народ! С 60-й вас годовщиной


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


1-75997
Bob2
2003-02-11 20:17
2003.02.24
ListBox с многострочным вводом


3-75779
Casperr
2003-02-05 12:26
2003.02.24
InterBase, DLL


8-76048
Jackson
2002-11-06 23:24
2003.02.24
Анимация





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский