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

Вниз

как проще всего отсортировать dbgrid по щелчку на колонке?   Найти похожие ветки 

 
ironwit ©   (2002-12-26 10:18) [0]

глупо но интересно :-)


 
Reindeer Moss Eater   (2002-12-26 10:20) [1]

dbGrid отсортировать нельзя


 
ironwit ©   (2002-12-26 10:21) [2]

точнее данные в нем(там лежит сложный sql запрос).


 
Lady D ©   (2002-12-26 10:26) [3]


> точнее данные в нем(там лежит сложный sql запрос).

Усложнить запрос добавлением Order By


 
Reindeer Moss Eater   (2002-12-26 10:26) [4]

Определи имя поля таблицы колонки по которой произошел клик.
Сформируй новый запрос и выполни его


 
Anatoly Podgoretsky ©   (2002-12-26 10:33) [5]

Данные в нем тоже не лежат, "сортировать" надо набор данных


 
ironwit ©   (2002-12-26 10:35) [6]

ясно. :-(
усложнить запрос не получиться там уже хватает и Order By
и group by :-(

Ладно, будем думать. А так хотел юзерам приятное сделать ....


 
Кулюкин Олег ©   (2002-12-26 10:36) [7]

2 ironwit © (26.12.02 10:18)
> Reindeer Moss Eater (26.12.02 10:20)
> dbGrid отсортировать нельзя
Верно замечено.

> точнее данные в нем(там лежит сложный sql запрос).
В Гриде ничего не лежит, данные лежат в ДатаСете.
Можно:
1. Подключить к Вашей квере TClientDataSet, он умеет строить индексы, как Asc, так и Desc.
2. Использовать не дельфийный грид, а что-то более хитрое. ВРоде EhDBGrid умеет сортироваться.


 
Lady D ©   (2002-12-26 10:37) [8]


> ясно. :-(
> усложнить запрос не получиться там уже хватает и Order By
> и group by :-(

А на каком движке все это работает?


 
Reindeer Moss Eater   (2002-12-26 10:39) [9]

Убери dbgrid.
Отображай данные например в TStringGrid.
Используй метод CustomSort в классе TStringList.


 
ironwit ©   (2002-12-26 10:40) [10]

Кулюкин Олег © (26.12.02 10:36)
2 ironwit © (26.12.02 10:18)
>> Reindeer Moss Eater (26.12.02 10:20)
>> dbGrid отсортировать нельзя
>Верно замечено.

>> точнее данные в нем(там лежит сложный sql запрос).
>В Гриде ничего не лежит, данные лежат в ДатаСете.
>Можно:
>1. Подключить к Вашей квере TClientDataSet, он умеет строить >индексы, как Asc, так и Desc.
>2. Использовать не дельфийный грид, а что-то более хитрое. ВРоде EhDBGrid умеет сортироваться.

а где его можно было бы найти?

Lady D © (26.12.02 10:37)

> ясно. :-(
> усложнить запрос не получиться там уже хватает и Order By
> и group by :-(

А на каком движке все это работает?


mysql


 
Anatoly Podgoretsky ©   (2002-12-26 10:40) [11]

ironwit © (26.12.02 10:35)
Усложнять ничего не надо, надо изменить фразу ORDER BY


 
sniknik ©   (2002-12-26 10:47) [12]

Надо менять компоненты для доступа (у тебя какие?), возьми ADO любой запрос любой сложности неважно, по клику узнаеш имя поля (не проблема), и меняеш свойство Sort (сортирует сам датасет).
пример
ADODataSet1.Sort:= "LastName ASC, DateDue DESC"; //по одному еще проще


 
Weare ©   (2002-12-26 10:57) [13]

Можно просто используя TQuery и TDbGridEh сортировать по каждой колонке, да хоть по обеим сразу. У EhhLib есть демка на этот счет. Если хочеш, могу на мыло скинуть - там разберешься (если конечно у тебя Eh- есть)


 
ironwit ©   (2002-12-26 11:06) [14]

а где EhDBGrid можно найти?

Weare © (26.12.02 10:57)
Можно просто используя TQuery и TDbGridEh сортировать по каждой колонке, да хоть по обеим сразу. У EhhLib есть демка на этот счет. Если хочеш, могу на мыло скинуть - там разберешься (если конечно у тебя Eh- есть)


хорошо бы, но когда EhDBGrid найду.


 
Val ©   (2002-12-26 11:08) [15]

явный пример - вместо того чтобы подумать - ставим новый компонент. :(


 
Lady D ©   (2002-12-26 11:09) [16]


procedure TForm1.DBGrid1TitleClick(Column: TColumn);
begin
DBGrid1.DataSource.DataSet.Active := false;
With TQuery(DBGrid1.DataSource.DataSet).SQL do
begin
Clear;
Add("SELECT ......");
Add("ORDER BY " + Column.FieldName);
end;
DBGrid1.DataSource.DataSet.Active := true;
end;


 
ironwit ©   (2002-12-26 11:14) [17]


> Lady D © (26.12.02 11:09)
>
> procedure TForm1.DBGrid1TitleClick(Column: TColumn);
> begin
> DBGrid1.DataSource.DataSet.Active := false;
> With TQuery(DBGrid1.DataSource.DataSet).SQL do
> begin
> Clear;
> Add("SELECT ......");
> Add("ORDER BY " + Column.FieldName);
> end;
> DBGrid1.DataSource.DataSet.Active := true;
> end;

там запросы хранятся разные, но ладно. Идея понятна :-)
Спасибо


 
ironwit ©   (2002-12-26 11:15) [18]

я вот подумал, а если нужно по нескольким одновременно? :-)


 
Reindeer Moss Eater   (2002-12-26 11:18) [19]

А щелкнуть по двум колонкам одновременно успеешь?
:)


 
ironwit ©   (2002-12-26 11:27) [20]


>
> Reindeer Moss Eater (26.12.02 11:18)
> А щелкнуть по двум колонкам одновременно успеешь?
> :)

вряд-ли :-)


 
Roma ©   (2002-12-26 11:42) [21]

Здравствуйте... Опять я опоздал, наверно...

Насчет сортирвоки по клику - был простой и гениальный совет от Кулюкина Олега (Кулюкин Олег © (26.12.02 10:36)) - использовать TClientDataSet, т.е. не Query -> DataSource -> DBGrid, а Query -> DataSetProvider -> ClientDataSet -> DataSource -> DBGrid. По клику на колонке:

procedure TForm1.DBGrid1TitleClick(Column: TColumn);
begin
ClientDataSet1.IndexFieldNames := Column.Field.FieldName;
end;

Все... Никаких переделок запроса в Query.

Другой вопрос - а это действительно тебе надо? А то пользователей разбалуешь... ;)


 
ironwit ©   (2002-12-26 11:51) [22]


> Roma © (26.12.02 11:42)
> Здравствуйте... Опять я опоздал, наверно...
>
> Насчет сортирвоки по клику - был простой и гениальный
> совет от Кулюкина Олега (Кулюкин Олег © (26.12.02 10:36))
> - использовать TClientDataSet, т.е. не Query -> DataSource
> -> DBGrid, а Query -> DataSetProvider -> ClientDataSet ->
> DataSource -> DBGrid. По клику на колонке:
>
> procedure TForm1.DBGrid1TitleClick(Column: TColumn);
> begin
> ClientDataSet1.IndexFieldNames := Column.Field.FieldName;
> end;
>
> Все... Никаких переделок запроса в Query.
>
> Другой вопрос - а это действительно тебе надо? А то пользователей
> разбалуешь... ;)


громадное спасибо, попробую.

Ниче страшного, их балую - сам росту над собой. :-)


 
Weare ©   (2002-12-26 11:54) [23]


>to ironwit ©


Могу и EhLib выслать, занимает где-то 1.2М. Вообще класная вещь, там можно очень интересные вещи вытворять.


 
ironwit ©   (2002-12-26 11:59) [24]


> Weare © (26.12.02 11:54)
>
> >to ironwit ©
>
>
> Могу и EhLib выслать, занимает где-то 1.2М. Вообще класная
> вещь, там можно очень интересные вещи вытворять.

плс, на pteh01@pteh.sm.energy.gov.ua
нарезка по 800кб


 
vopros ©   (2002-12-26 12:04) [25]

procedure TForm1.DBGridEh10TitleBtnClick(Sender: TObject; ACol: Integer;
Column: TColumnEh);
begin
dm.Q_oborud.close;
dm.q_oborud.SQL.delete(dm.q_oborud.sql.count-1);
dm.q_oborud.SQL.add("order by "+column.fieldname);
dm.Q_oborud.open;
end;


 
ironwit ©   (2002-12-26 12:05) [26]

хотите прикол. Если пользоваться сцепкой посоветованной Roma, а query от Zeos то где теряются данные, то есть в dbgrid ничего не отображается


 
ironwit ©   (2002-12-26 12:09) [27]


> vopros © (26.12.02 12:04)
> procedure TForm1.DBGridEh10TitleBtnClick(Sender: TObject;
> ACol: Integer;
> Column: TColumnEh);
> begin
> dm.Q_oborud.close;
> dm.q_oborud.SQL.delete(dm.q_oborud.sql.count-1);
> dm.q_oborud.SQL.add("order by "+column.fieldname);
> dm.Q_oborud.open;
> end;

в этом гриде может отображаться много разнах запросов, не обязательно в конце стоит order by


 
Roma ©   (2002-12-26 12:25) [28]

> ironwit © (26.12.02 12:05)
хотите прикол. Если пользоваться сцепкой посоветованной Roma, а query от Zeos то где теряются данные, то есть в dbgrid ничего не отображается

Если использовать нормальный стандартный TQuery - все работает... Проверь все свойства связывания - DataSetProvider.DataSet, ClientDataSet.ProviderName, DataSource.DataSet, Grid.DataSource...


 
ironwit ©   (2002-12-26 12:33) [29]

все проверил еще раз, все нормально.

DataSetProvider.DataSet=query
ClientDataSet.ProviderName=DataSetProvider1
DataSource.DataSet=ClientDataSet1
Grid.DataSource=DataSource1


 
Roma ©   (2002-12-26 12:36) [30]

А если поменять Query от Zeos на стандартный дельфийский, тогда все нормально?...


 
Weare ©   (2002-12-26 12:46) [31]


> Roma ©


Вот это да, а я в свое время c SQL"ем игрался. Твоя сцепка прекрасно работает - это просто здорово.


 
Weare ©   (2002-12-26 12:48) [32]


> ironwit ©

Ты где-то ошибся, сделай так как Roma говорит и все нормательно.


 
ironwit ©   (2002-12-26 12:51) [33]


> Roma © (26.12.02 12:36)
> А если поменять Query от Zeos на стандартный дельфийский,
> тогда все нормально?...

а стандартный работает с mуsql?


 
Кулюкин Олег ©   (2002-12-26 12:54) [34]

2 ironwit © (26.12.02 10:40)
>2. Использовать не дельфийный грид, а что-то более хитрое. ВРоде EhDBGrid умеет сортироваться.
> а где его можно было бы найти?
А яндексом поискать?
На торри посмотреть?

EhDBGrid - часть EhLib

2 Roma © (26.12.02 11:42)
ClientDataSet умеет и по убыванию сортировать.
А RxDBGrid умеет рисовать стрелочки на кепшене.
Эту связку я и использую.


 
Кулюкин Олег ©   (2002-12-26 12:57) [35]

2 sniknik © (26.12.02 10:47)
> ADODataSet1.Sort:= "LastName ASC, DateDue DESC";
Надо же!
Я и не знал о такой фиче.
Спасибо.


 
ironwit ©   (2002-12-26 13:04) [36]


> Weare © (26.12.02 11:54)
>
> >to ironwit ©
>
>
> Могу и EhLib выслать, занимает где-то 1.2М. Вообще класная
> вещь, там можно очень интересные вещи вытворять

спасибо




 
Roma ©   (2002-12-26 13:07) [37]

> ironwit © (26.12.02 12:51)
а стандартный работает с mуsql?

Ты немного путаешь. Query не работает напрямую с БД, ни с какой.


 
ironwit ©   (2002-12-26 13:21) [38]


> Roma © (26.12.02 13:07)
> > ironwit © (26.12.02 12:51)
> а стандартный работает с mуsql?
>
> Ты немного путаешь. Query не работает напрямую с БД, ни
> с какой.

в том то весь и прикол что в zeos свой query для работы с базами, там у него много поддержки и ibsql,mysql,pgsql.


 
jee ©   (2002-12-26 13:35) [39]

Использую весьма часто в своих проектах. Просто всавляешь в OnTitleClick грида. Единственно, если используешь не ADO, то просто приводи к TTаble.

procedure TXForm.DBGrid2TitleClick(Column: TColumn);
begin
TADOTable(Column.Grid.DataSource.DataSet).IndexFieldNames := Column.FieldName;
end;
Кстати бывает нужно убрать сортировку, тогда я так делаю, щелкаю на самый левый прямоугольник в гриде (который перед первой колонкой), если он конечно отображается. А обработчик вот

procedure TRepForm.DBGridMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if (X < 10)and(Y < 15) then
TADOTable(DBGrid.DataSource.DataSet).IndexFieldNames := "";
end;


 
Anatoly Podgoretsky ©   (2002-12-26 13:40) [40]

ironwit © (26.12.02 13:21)
И ты думаешь они напрямую работают, тогда у них суперклассные программисты.


 
passm ©   (2002-12-26 14:14) [41]

Пользуюсь компонентами Rx - там достаточно средств для реализации сортировки как того желает автор вопроса.
RxDBGrid позволяет рисовать треугольник сортировки на заголовке столбца. RxDBGrid.DataSource.DataSet is TRxQuery в котором SQL.Text =
...
ORDER BY %ORD_COL
Далее при клике на заголовок Grida оцениваю Column.FieldName и RxQuery.MacroByName("ORD_COL").AsString...
OnTitleClick:
if Column.FieldName + " ASC" = RxQuery.MacroByName("ORD_COL").AsString then
RxQuery.MacroByName("ORD_COL").AsString:= Column.FieldName + "DESC"
else
RxQuery.MacroByName("ORD_COL").AsString:= Column.FieldName + " ASC"


 
Jeka   (2002-12-26 16:16) [42]

В OnTitleClick пиши
Table1.IndexFieldNames :=Column.FieldName;
самому недавно помогли, работает


 
Vint ©   (2002-12-26 17:15) [43]

Roma © (26.12.02 11:42)

спасибо за совет, щас попробовал, без индексов, а все просто летает!!!
а не подскажишь, как в ClientDataSet определить способ сортировки (по возрастанию и как по убыванию)?


 
kombat ©   (2002-12-27 18:04) [44]

Для DBGridEh
Возможна множественная сортировка с зажатой клавишей Ctrl
sAscFieldsList, sDescFieldsList, sAllFieldsList, sIndexName: string;


procedure TfBaseGridForm.dbgMainSortMarkingChanged(Sender: TObject);
var
i: integer;
begin
// установка маркеров сортировки на колонках грида и определение
// наименования индекса (sIndexName), наименований и порядка сортировки полей
// MultiIndex - в случае множества полей
// установка активным контролом Грида dbgMain, если не активен другой грид
Screen.Cursor := crSQLWait;
try
if (ActiveControl is TDBGridEh) then
ActiveGrid := (ActiveControl as TDBGridEh)
else
ActiveGrid := dbgMain;
sAllFieldsList := "";
sAscFieldsList := "";
sDescFieldsList := "";
sIndexName := "";
for i := 0 to (ActiveGrid as TDBGridEh).SortMarkedColumns.Count - 1 do begin
if (ActiveGrid as TDBGridEh).SortMarkedColumns[i].Title.SortMarker = smUpEh then begin
if Trim(sAscFieldsList) <> "" then
sAscFieldsList := sAscFieldsList + "; " + (ActiveGrid as
TDBGridEh).SortMarkedColumns[i].FieldName
else
sAscFieldsList := (ActiveGrid as
TDBGridEh).SortMarkedColumns[i].FieldName;
if (ActiveGrid as TDBGridEh).SortMarkedColumns.Count = 1 then
sIndexName := (ActiveGrid as
TDBGridEh).SortMarkedColumns[i].FieldName + "_A"
else
sIndexName := "MultiIndex";
end
else begin
if Trim(sDescFieldsList) <> "" then
sDescFieldsList := sDescFieldsList + "; " + (ActiveGrid as
TDBGridEh).SortMarkedColumns[i].FieldName
else
sDescFieldsList := (ActiveGrid as
TDBGridEh).SortMarkedColumns[i].FieldName;
if (ActiveGrid as TDBGridEh).SortMarkedColumns.Count = 1 then
sIndexName := (ActiveGrid as
TDBGridEh).SortMarkedColumns[i].FieldName + "_D"
else
sIndexName := "MultiIndex";
end;
if Trim(sAllFieldsList) <> "" then
sAllFieldsList := sAllFieldsList + "; " + (ActiveGrid as
TDBGridEh).SortMarkedColumns[i].FieldName
else
sAllFieldsList := (ActiveGrid as
TDBGridEh).SortMarkedColumns[i].FieldName;
end;
finally
Screen.Cursor := crDefault;
end;
end;

procedure TfBaseGridForm.dbgMainTitleClick(Column: TColumnEh);
var
i: integer;
bIndexExist: boolean;
begin
// установка сортировки данных в датасете
// установка активным контролом Грида dbgMain, если не активен другой грид
Screen.Cursor := crSQLWait;
try
if (ActiveControl is TDBGridEh) then
ActiveGrid := (ActiveControl as TDBGridEh)
else
ActiveGrid := dbgMain;
dbgMainSortMarkingChanged(nil);
if Trim(sIndexName) <> "" then begin
if ((ActiveGrid as TDBGridEh).DataSource.DataSet as
TClientDataSet).Active = true then begin
bIndexExist := false;
((ActiveGrid as TDBGridEh).DataSource.DataSet as
TClientDataSet).IndexDefs.Update;
for i := 0 to ((ActiveGrid as TDBGridEh).DataSource.DataSet as
TClientDataSet).IndexDefs.Count - 1 do
if ((ActiveGrid as TDBGridEh).DataSource.DataSet as
TClientDataSet).IndexDefs.Items[i].Name = sIndexName then begin
bIndexExist := true;
Break;
end
else
bIndexExist := false;
if not (bIndexExist) then begin
((ActiveGrid as TDBGridEh).DataSource.DataSet as
TClientDataSet).AddIndex(sIndexName, sAllFieldsList, [],
sDescFieldsList, "", 0)
end
else begin
if sIndexName = "MultiIndex" then begin
((ActiveGrid as TDBGridEh).DataSource.DataSet as
TClientDataSet).DeleteIndex(sIndexName);
((ActiveGrid as TDBGridEh).DataSource.DataSet as
TClientDataSet).AddIndex(sIndexName, sAllFieldsList, [],
sDescFieldsList, "", 0);
end;
end;
((ActiveGrid as TDBGridEh).DataSource.DataSet as
TClientDataSet).IndexDefs.Update;
((ActiveGrid as TDBGridEh).DataSource.DataSet as
TClientDataSet).IndexName := sIndexName;
end;
end;
finally
Screen.Cursor := crDefault;
end;
end;



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

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

Наверх




Память: 0.6 MB
Время: 0.014 c
14-72474
deniall
2003-01-02 11:56
2003.01.23
Голосовая связь


3-72155
Dolton
2003-01-04 09:48
2003.01.23
Обращение к базе данных по сети нескольких пользователей


4-72602
Domkrat
2002-12-05 15:48
2003.01.23
Перехват нажатия клавиатуры


3-72069
salvo
2003-01-06 13:55
2003.01.23
доступ к таблицам


7-72570
DiHLoS
2002-11-12 16:57
2003.01.23
Как узнать номер BIOS компа?