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

Вниз

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

 
Gawk ©   (2003-10-10 12:10) [0]

Здравствуй уважаемый ALL
Подскажите как в DBGRid сделать сортировку по клику на названию колонки


 
Reindeer Moss Eater ©   (2003-10-10 12:15) [1]

Получить имя поля кликнутой колонки.
Перестроить текст запроса (ORDER BY) | Изменить имя активного индекса
Переоткрыть запрос.


 
Vlad ©   (2003-10-10 12:21) [2]

Комментарий к [1]
Получить имя не колонки, а поля, соотв. данной колонке, затем подставить его в ORDER BY
Т.е. "select * from table where .... order by " + Column.FieldName
Будет работать, если FieldName не является алиасом.


 
Reindeer Moss Eater ©   (2003-10-10 12:27) [3]

Комментарий к [2]

Было написано

Получить имя поля кликнутой колонки.


 
Reindeer Moss Eater ©   (2003-10-10 12:29) [4]

Будет работать, если FieldName не является алиасом.

Будет работать даже если имя поля является алиасом.
Не будет работать - если поле не физическое.


 
Arm79 ©   (2003-10-10 15:28) [5]

Как вариант - использовать ClientDataSet, у которого индексы могут строится после открытия. Там указываешь в IndexFields поля и он сам их сортит.


 
Gawk ©   (2003-10-10 15:57) [6]

Ниже приведдённый код выдаёт ошибку на строке (o) не понимаю почему. Column.FieldName выдаёт имя поля правильно.

procedure TForm20.DBGrid1TitleClick(Column: TColumn);
begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add("select CPU.inventar,VIDEO.place,MB.mol");
ADOQuery1.SQL.Add(" from MB,CPU,VIDEO ");
ADOQuery1.SQL.Add("where MB.ID=CPU.ID and VIDEO.ID=CPU.ID");
(о)ADOQuery1.SQL.Add("order by CPU."+Column.FieldName);
ADOQuery1.Open;
end;


 
Плохиш_   (2003-10-10 16:02) [7]

>Gawk © (10.10.03 15:57) [6]

т.е. так и пишешь:

order by CPU.mol

? ;-)


 
Reindeer Moss Eater ©   (2003-10-10 16:04) [8]

Какую ошибку?


 
dmtr ©   (2003-10-10 16:06) [9]


> Gawk © (10.10.03 15:57) [6]


ADOQuery1.SQL.Add(" order by CPU."+Column.FieldName);


 
Reindeer Moss Eater ©   (2003-10-10 16:07) [10]

order by CPU."+Column.FieldName

А если торкнули по колонке с полем не из таблицы CPU????


 
Gawk ©   (2003-10-10 16:14) [11]

Текст ошибки
Access violation at address .... in module ...
при клике на соответствующее таблице CPU поле


 
Reindeer Moss Eater ©   (2003-10-10 16:17) [12]

Эта ошибка никак не связано с кодом из [6].
Если конечно существует ADOQuery1


 
Reindeer Moss Eater ©   (2003-10-10 16:21) [13]

ADOQuery1.Close;

Если в DesignTime не были созданы экземпляры полей, то после этих строчек в гриде Colums уничтожаются


 
Arm79 ©   (2003-10-10 16:27) [14]


> ADOQuery1.SQL.Add("where MB.ID=CPU.ID and VIDEO.ID=CPU.I D");
> (о)ADOQuery1.SQL.Add("order by CPU."+Column.FieldName);

А пробел?


 
Reindeer Moss Eater ©   (2003-10-10 16:29) [15]

Причем здесь пробел-то?


 
dmtr ©   (2003-10-10 16:32) [16]


> Arm79 © (10.10.03 16:27) [14]

Я тоже так думал, но при этом возникла бы SQL-ошибка, а не AV


 
Arm79 ©   (2003-10-10 16:32) [17]

where MB.ID=CPU.ID and VIDEO.ID=CPU. IDorder by CPU.

Из текста получается так


 
dmtr ©   (2003-10-10 16:34) [18]


> Reindeer Moss Eater © (10.10.03 16:21) [13]

Да, но строка ошибки другая


 
Arm79 ©   (2003-10-10 16:35) [19]

По-моему та самая.


 
Reindeer Moss Eater ©   (2003-10-10 16:37) [20]

До выполнения SQL дело не доходит вообще.

procedure TForm20.DBGrid1TitleClick( Column: TColumn);
begin
ADOQuery1.Close;
После этого Column указывает в космос, а не на экземпляр TColumn.

Это если нет статических TField. А их нет по всей видимости.

И Column.FieldName приводит к AV


 
dmtr ©   (2003-10-10 16:38) [21]


> Arm79 © (10.10.03 16:35) [19]

Поясни, ты отстаиваешь свое мнение или Reindeer Moss Eater © (10.10.03 16:21) [13]?


 
dmtr ©   (2003-10-10 16:39) [22]


> Reindeer Moss Eater © (10.10.03 16:37) [20]

Согласен.


 
Gawk_   (2003-10-10 16:40) [23]

Я знаю что с кодом [6] не связано там вроде всё правильно
Но когда убираю эту строчку всё работает


 
Arm79 ©   (2003-10-10 16:40) [24]

Но тогда ошибка выдавалась бы не в 6 строке, а во второй. Тем более, что раз Query закрыт, то никакой работы с колумн не производится. Может быть, в гриде вручную выделены 3(?) столбца с конкретными именами полей, которые пропадают?


 
Reindeer Moss Eater ©   (2003-10-10 16:41) [25]

Но тогда ошибка выдавалась бы не в 6 строке, а во второй.

С какой радости?


 
sniknik ©   (2003-10-10 16:42) [26]

если используется ADO то зачем делать перезапрос? используй свойство Sort.


 
Reindeer Moss Eater ©   (2003-10-10 16:42) [27]

Gawk_ смотри [20]


 
Плохиш_   (2003-10-10 16:43) [28]

>Gawk_ (10.10.03 16:40) [23]
>Arm79 © (10.10.03 16:40) [24]

Моя твоя не понимайт? :-)

Reindeer Moss Eater © всё уже разжевал, осталось только проглотить


 
Arm79 ©   (2003-10-10 16:44) [29]


> Но тогда ошибка выдавалась бы не в 6 строке, а во второй.
>
> С какой радости?

А с какой радости в 6?

А если попробовать в предыдущей order-у строке в конце поставить ";"


 
Reindeer Moss Eater ©   (2003-10-10 16:46) [30]

А с какой радости в 6?

С такой, что там попытка обращения к свойству уже убитого экземпляра колонки грида


 
dmtr ©   (2003-10-10 16:47) [31]


> Arm79 © (10.10.03 16:44) [29]

Смотри Reindeer Moss Eater © (10.10.03 16:37) [20]
Только в 6-й строчке происходит обращение к на тот момент уже несуществующему Column


 
Arm79 ©   (2003-10-10 16:48) [32]

Точно. Не обратил внимание. Каюсь :(


 
Gawk ©   (2003-10-10 16:51) [33]

Reindeer Moss Eater © [20]
Действительно так
Попробомал через промежуточную переменную - работает
Спасибо.



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

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

Наверх




Память: 0.54 MB
Время: 0.016 c
3-98467
DECL
2003-10-10 01:47
2003.10.30
Построение DBCharta


3-98477
suharew
2003-10-07 23:01
2003.10.30
Ошибки


14-98828
PHPAsker
2003-10-11 20:08
2003.10.30
Dialup Server. Посоветуйте программку


1-98668
VladDD
2003-10-20 15:03
2003.10.30
Инициализация объекта объектом такого-же класса в массиве


8-98749
nuflin
2003-06-30 22:28
2003.10.30
TRichEdit