powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Конфликт 'order by' в запросе, при использовании встроенной сортировки DBGridEh
12 сообщений из 12, страница 1 из 1
Конфликт 'order by' в запросе, при использовании встроенной сортировки DBGridEh
    #39661505
Sergey-2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброе время суток форумчане.

При открытии программы я как всегда открываю dataset запросом.
Код: pascal
1.
2.
3.
4.
5.
ADataSet.Close;
        IBDataSet.SelectSQL.Clear;
        IBDataSet.SelectSQL.Add(ARequire);
        IBDataSet.DisableControls;
        IBDataSet.Open;



В запросе « ARequire », содержится « order by ».
Захотел восспользоваться сортировкой DBGridEh, - сортировка работает, если в запросе «SelectSQL» предварительно нет предложения «order by».

Т.е. это получается, мне при нажатии на колонку (в «DBGridEh1TitleBtnClick»), нужно редактировать запрос в «SelectSQL», т.е. убирать из него «order by»?

Спасибо за ответ
...
Рейтинг: 0 / 0
Конфликт 'order by' в запросе, при использовании встроенной сортировки DBGridEh
    #39661506
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
насколько я помню, там оно само вставляет order by в запрос и перевыполняет его

Чем довольно часто доставляет пользователям "радостей",
когда запрос довольно долго работает
...
Рейтинг: 0 / 0
Конфликт 'order by' в запросе, при использовании встроенной сортировки DBGridEh
    #39661508
Sergey-2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
defecator,

Да, так оно и работает.

Только у меня не получается перед нажатием, отредактировать запрос, т.е. убрать из него "order by"
...
Рейтинг: 0 / 0
Конфликт 'order by' в запросе, при использовании встроенной сортировки DBGridEh
    #39661509
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Sergey-2008defecator,

Да, так оно и работает.

Только у меня не получается перед нажатием, отредактировать запрос, т.е. убрать из него "order by"
вообще не вставляй order by, пусть пользователь нажимает колонки
...
Рейтинг: 0 / 0
Конфликт 'order by' в запросе, при использовании встроенной сортировки DBGridEh
    #39661511
Sergey-2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я бы с радостью, но лучше бы сразу открывать dataset отсортированным
...
Рейтинг: 0 / 0
Конфликт 'order by' в запросе, при использовании встроенной сортировки DBGridEh
    #39661512
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Sergey-2008Я бы с радостью, но лучше бы сразу открывать dataset отсортированным

нет, это ошибка, потому что пользователю будет непонятно,
по какому столбцу сортированы данные

Убирай order by, в гриде в нужной колонке указывай, что сортировано по ней,
грид сам вставит нужный order by и откроет датасет

тогда и усеру будет сразу ясно, и проблем с order by не будет
...
Рейтинг: 0 / 0
Конфликт 'order by' в запросе, при использовании встроенной сортировки DBGridEh
    #39661514
Sergey-2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ваше предложение интересное... рассмотрю... (я подсвечиваю отсортированный сстолбик)

А на будущее, для информации, можно каким нибудь образом, перед выполнением "DBGridEh1TitleBtnClick", убирать из запроса "order by"? Так чтоб запрос не переоткрывать? для корректной отработки "DBGridEh1TitleBtnClick".
...
Рейтинг: 0 / 0
Конфликт 'order by' в запросе, при использовании встроенной сортировки DBGridEh
    #39661516
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Sergey-2008ваше предложение интересное... рассмотрю... (я подсвечиваю отсортированный сстолбик)

А на будущее, для информации, можно каким нибудь образом, перед выполнением "DBGridEh1TitleBtnClick", убирать из запроса "order by"? Так чтоб запрос не переоткрывать? для корректной отработки "DBGridEh1TitleBtnClick".
ты снова скатился к костылям ?
делай сразу правильно, как я тебе сказал,
и не надо ничего убирать
...
Рейтинг: 0 / 0
Конфликт 'order by' в запросе, при использовании встроенной сортировки DBGridEh
    #39661587
Sergey-2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
defecatorты снова скатился к костылям ?
делай сразу правильно, как я тебе сказал,
и не надо ничего убирать

Ничего не утверждаю...
но вот такая конструкция, (с работой order by в предыдущем запросе)

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
procedure TFMain.DBGridEhTitleBtnClick(Sender: TObject; ACol: Integer;
  Column: TColumnEh);
var
  LPos, i: integer;
  s: string;
begin
  LPos := Pos('order by', AnsiLowerCase(IBDBDataSet.SelectSQL.Text));
  i := length(IBDBDataSet.SelectSQL.Text);
  s := IBDBDataSet.SelectSQL.Text;
  Delete(s, LPos, i-LPos);
  IBDBDataSet.SelectSQL.Clear;
  IBDBDataSet.SelectSQL.Add(s);
  IBDBDataSet.SelectSQL.Add('order by '+ Column.FieldName);
  IBDBDataSet.Active := true;
end;



Посмотрим, как понравится преподу, или с предварительной сортировкой или без... (можно сделать отдельной процедурой и все 6 датасетов, через нее гнать)
...
Рейтинг: 0 / 0
Конфликт 'order by' в запросе, при использовании встроенной сортировки DBGridEh
    #39661588
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Sergey-2008defecatorты снова скатился к костылям ?
делай сразу правильно, как я тебе сказал,
и не надо ничего убирать

Ничего не утверждаю...
но вот такая конструкция, (с работой order by в предыдущем запросе)

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
procedure TFMain.DBGridEhTitleBtnClick(Sender: TObject; ACol: Integer;
  Column: TColumnEh);
var
  LPos, i: integer;
  s: string;
begin
  LPos := Pos('order by', AnsiLowerCase(IBDBDataSet.SelectSQL.Text));
  i := length(IBDBDataSet.SelectSQL.Text);
  s := IBDBDataSet.SelectSQL.Text;
  Delete(s, LPos, i-LPos);
  IBDBDataSet.SelectSQL.Clear;
  IBDBDataSet.SelectSQL.Add(s);
  IBDBDataSet.SelectSQL.Add('order by '+ Column.FieldName);
  IBDBDataSet.Active := true;
end;




Посмотрим, как понравится преподу, или с предварительной сортировкой или без... (можно сделать отдельной процедурой и все 6 датасетов, через нее гнать)

если твой препод знает, как работает Eh, он тебя ссаными тряпками в армию отправит
вместо того, чтобы использовать готовые средства, ты изобретаешь костыль на костыле.
...
Рейтинг: 0 / 0
Конфликт 'order by' в запросе, при использовании встроенной сортировки DBGridEh
    #39661831
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а можно обмануть Eh? ))
Например, твой запрос обернуть, чтобы order by был за скобками?
Код: sql
1.
2.
3.
select * from(
  select * from table1
  order by field1)



в итоге, после сортировки Eh будет

Код: sql
1.
2.
3.
4.
select * from(
  select * from table1
  order by field1)
order by field2
...
Рейтинг: 0 / 0
Конфликт 'order by' в запросе, при использовании встроенной сортировки DBGridEh
    #39661858
чччД__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergey-2008Доброе время суток форумчане.

При открытии программы я как всегда открываю dataset запросом.
Код: pascal
1.
2.
3.
4.
5.
ADataSet.Close;
        IBDataSet.SelectSQL.Clear;
        IBDataSet.SelectSQL.Add(ARequire);
        IBDataSet.DisableControls;
        IBDataSet.Open;



В запросе « ARequire », содержится « order by ».
Захотел восспользоваться сортировкой DBGridEh, - сортировка работает, если в запросе «SelectSQL» предварительно нет предложения «order by».

Т.е. это получается, мне при нажатии на колонку (в «DBGridEh1TitleBtnClick»), нужно редактировать запрос в «SelectSQL», т.е. убирать из него «order by»?

Спасибо за ответ
1. Что такое ADataSet и что такое ARequire ?
2. Сортировка с помощью TDbGridEh бывает "серверной", бывает "клиентской". О чем баишь, конкретно?
3. Документация:

Использование DBGridEh для сортировки и фильтрации данных в DataSetDBGridEh не может сортировать или фильтровать данные самостоятельно. Но он может послать команду для сортировки или фильтрации специальному объекту, который сделает это в DataSet'е. Вы можете выбрать 2 типа сортировки (локальная и серверная) используя свойство SortLocal и два типа фильтрации (также локальная и серверная), но реальная возможность применения каждого типа операции зависит от типа DataSet'а. Например TBDEDataSet - не поддерживает локальную сортировку (внутри DataSet'а), так что вы не сможете сортировать данные локально, когда grid присоединен к TQuery или TTable. Библиотека имеет набор специальные объекты для сортировки/фильтрации стандартных типов DataSet'ов постовляемых вместе с Delphi.
Ниже вы можете видеть таблицу специальных объектов и DataSet'ов в которых объекты могут сортировать или фильтровать данные.

UnitDataSetLocal sortingServer sortingLocal filteringServer filteringEhLibBDETQuery/TTableNYYYEhLibADOTADOQuery/TADODataSetYYYYEhLibCDSTClientDataSetYYYYEhLibDBXTSQLQuery/TSQLDataSet NYNYEhLibIBXTIBQuery/TIBDataSetNYYYEhLibMTETMemTableEhYY*YY*
* Когда Grid настроен на серверную сортировку или фильтрацию (SortLocal=False, STFilter.Local=False), то выполнение сортировки передается объекту TMemTableEh.DataDriver.

Когда grid настроен для сортировки на Сервере, специальный объект строит SQL-выражение ORDER BY и заменяет строку ORDER BY в свойстве Command или SQL DataSet'а и переоткрывает его.
Когда grid настроен для локальной сортировки специальный объект производит сортировку учитывая специфику конкретного типа DataSet'а.
Когда grid настроен для Локальной фильтрации, специальный объект строит выражение и присваивает его свойству Filter DataSet'а. Перед этим нужно заранее выставить значение TDataSet.Filtered в True.
Когда Grid настроен для фильтрации на сервере, специальный объект строит выражение для предложения 'WHERE' SQL-строки DataSet'а. Он пытается найти строку, начинющуюся с ключевого выражения '/*Filter*/' (Вы можете изменять это ключевое выражение используя глобальную переменную SQLFilterMarker) в SQL-выражении и добавляет выражение для фильтрации после ключа в той же строке. Так что, SQL-запрос должен содержать строку, начинающуюся с '/*Filter*/' . Например:
Код: sql
1.
2.
3.
4.
' select * 
from table1
where
/*Filter*/ 1=1 '

Для автоматической фильтрации/сортировки данных в dataset'е требуется добавить один из модулей EhLibXXX (EhLibADO, EhLibBDE, EhLibCDS ... в зависимости от dataset'а, подключенного к grid') в раздел 'uses' любого модуля вашего проекта. Эти EhLibXXX модули содержат код для регистрации класса который наследуется от TDatasetFeaturesEh (специальный объект) и осуществляет фильтрацию/сортировку в DataSet'е. Для DataSet'ов сторонних разработчиков можно написать и зарегестрировать свой собственный класс или написать обработчики событий OnApplyFilter и/или OnSortMarkingChanged для каждого требуемого grid'а. Кроме того можно написать OnApplyFilter и/или OnSortMarkingChanged для глобальной переменной DBGridEhDataService. Эти события имеют тип TNotifyEvent, где в качестве Sender'а выступает TCustomDBGridEh.

Настройка сетки для сортировки данных:TDBGridEh позволяет отображать специальные sortmarking bitmaps (маленькие треугольники) в правой части заголовков столбцов. Для отображения sortmarking bitmaps добавьте dghAutoSortMarking в свойство OptionsEh. Добавьте также dghMultiSortMarking в OptionsEh для обеспечения одновременной пометки сортировки по нескольким столбцам. Установите Column.Title.TitleButton в True для заголовков, у которых вы хотите изменять sortmarkers в run-time. Вы можете установить свойство сетки ColumnDefValues.Title.TitleButton чтобы позволить метки сортировки для всех столбцов, у которых не менялось свойство Column.Title.TitleButton. В run-time клик на заголовке изменяет порядок сортировки. При нажатом Ctrl можно отметить насколько столбцов одновременно. После клика на заголовке, если событие OnSortMarkingChanged не пусто то оно вызывается, иначе дейсвие передается на выполнение специальному объекту, если тот зарегистрирован. Специальный объект использует свойство Grid.SortLocal для определения типа сортировки данных: локально либо на сервере. Если вы пишете обработчик события OnSortMarkingChanged вы можете использовать свойство TDBGrid.SortMarkedColumns для доступа к сортируемым столбцам и свойство TColumnEh.Title.SortMarker для получения состояния маркера сортировки.


- чытав?
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Конфликт 'order by' в запросе, при использовании встроенной сортировки DBGridEh
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]