Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 16.03.2018
Сообщений: 51

Сортировка при нажатии на DBgrid

14.04.2019, 15:37. Показов 2308. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
При клике на заголовок выполняется сортировка вроде бы нашел как это сделать но в составных таблицах это не работает. И выдается ошибка.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    sortFlag: Boolean;
procedure TForm4.dbgrd1TitleClick(Column: TColumn);
var
  s: string;
begin
  s:=Column.FieldName;
 DataModule2.QPoc.Close;
 
  if sortFlag then
    datamodule2.QPoc.SQL.Text := 'select  p.id, pp.name, p.data,p.name from poctuplenia p , postavshik pp  ORDER BY ' + s + ' DESC'
  else
    DataModule2.QPoc.SQL.Text := 'select  p.id, pp.name, p.data,p.name from poctuplenia p , postavshik pp ORDER BY ' + s + ' ASC';
 
  sortFlag := not sortFlag;
 
  DataModule2.QPoc.Open;
end;
Миниатюры
Сортировка при нажатии на DBgrid  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.04.2019, 15:37
Ответы с готовыми решениями:

Отсортировать DBGrid при нажатии RadioButton
надо чтоб при нажатии на radioBatton происходила сортировка в DBgrid

При нажатии на кнопку полностью очистить DBGrid
в компоненте DBGrid1 подключенном через ADOTable1 убрать все строки и все значения....попросту очистить!! как это сделать?? если можно код??

При нажатии на поле в DBGrid показана картинка
Ребят как сделать так чтобы при выборе разных полей в таблице DBGrid отображались разные фото (например при выборе сотрудника слева...

21
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
14.04.2019, 16:44
Неоднозначность имен полей в двух таблицах мешает серверу СУБД понять по полю какой таблицы сортировать.
В тексте запроса поля с именем NAME указаны с алиасами таблиц: pp.name, p.name, а в предложении ORDER BY, подставляется переменная, которой, скорее всего, присвоено имя 'NAME' без указания таблицы. Отсюда ошибка.

Решение может быть в двух вариантах:
- добавить имя (алиас) таблицы к имени поля в переменной s;
- указать в предложении ORDER BY номер поля (номер поля в списке полей в запросе), а не его имя.
0
0 / 0 / 0
Регистрация: 16.03.2018
Сообщений: 51
14.04.2019, 19:29  [ТС]
Что-то немного не понимаю, а как указать номер поля?
0
5971 / 4547 / 1094
Регистрация: 29.08.2013
Сообщений: 28,168
Записей в блоге: 3
14.04.2019, 19:39
Цитата Сообщение от slene Посмотреть сообщение
s:=Column.FieldName;
добавить
Delphi
1
s:='p.'+s
или pp - не знаю по какому полю сортируете

ЗЫ зачем вы в DataModule2.QPoc.SQL.Text 2 раза пишите запрос?
почему бы не сделать так:

Delphi
1
2
3
DataModule2.QPoc.SQL.Text:='select  p.id, pp.name, p.data,p.name from poctuplenia p , postavshik pp  ORDER BY ' + s;
if sortFlag then DataModule2.QPoc.SQL.Text:=DataModule2.QPoc.SQL.Text+' DESC'
else DataModule2.QPoc.SQL.Text:=DataModule2.QPoc.SQL.Text+' ASC'
0
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
14.04.2019, 19:43
Цитата Сообщение от slene Посмотреть сообщение
Что-то немного не понимаю, а как указать номер поля?
Номера полей по порядку как они объявлены в тексте запроса:
select p.id<1-е поле>, pp.name<2-е>, p.data<3-е>, p.name<4-е>
0
5971 / 4547 / 1094
Регистрация: 29.08.2013
Сообщений: 28,168
Записей в блоге: 3
14.04.2019, 20:30
Цитата Сообщение от Скандербег Посмотреть сообщение
Номера полей по порядку как они объявлены в тексте запроса:
это необязательно в сортировке

в ошибке написано - Неоднозначное имя, это значит что в обоих таблицах есть одинаковые колонки
0
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
14.04.2019, 20:57
Цитата Сообщение от qwertehok Посмотреть сообщение
Неоднозначное имя, это значит что в обоих таблицах есть одинаковые колонки
Об этом же (немного другими словами) и сказано в посте #2
0
0 / 0 / 0
Регистрация: 16.03.2018
Сообщений: 51
14.04.2019, 22:01  [ТС]
Ну я переделал но, теперь таблица копирует все значения. И если s:='p.'+s, то фильтрует только по тем столбцам которые начинаются на p. , но тут понятно почему. А как добавить 2 таблицу?
0
5971 / 4547 / 1094
Регистрация: 29.08.2013
Сообщений: 28,168
Записей в блоге: 3
14.04.2019, 22:06
Цитата Сообщение от slene Посмотреть сообщение
теперь таблица копирует все значения
не понятно

Цитата Сообщение от slene Посмотреть сообщение
А как добавить 2 таблицу?
куда добавить?

Цитата Сообщение от slene Посмотреть сообщение
Ну я переделал
а что переделал нужно узнать телепатически?
0
0 / 0 / 0
Регистрация: 16.03.2018
Сообщений: 51
14.04.2019, 22:39  [ТС]
Delphi
1
2
3
4
5
var
  s: string;
begin
  s:=Column.FieldName;
  s:='p. ' +s;
Да что принципе написали, то и сделал. Вот как теперь добавить pp. ,и при сортировки корректно сортируется только поле ID а дальше как-то в разброс. На скриншоте сортировка выполнена по Name
Миниатюры
Сортировка при нажатии на DBgrid  
0
231 / 163 / 54
Регистрация: 26.10.2014
Сообщений: 928
14.04.2019, 22:41
Цитата Сообщение от slene Посмотреть сообщение
сортировка выполнена по Name
а как будто по name1
0
0 / 0 / 0
Регистрация: 16.03.2018
Сообщений: 51
14.04.2019, 22:43  [ТС]
Да вот тоже что-то смотрю,но до 22 ID идет сортировка нормально
0
231 / 163 / 54
Регистрация: 26.10.2014
Сообщений: 928
14.04.2019, 22:55
как то больно сложно у вас выполняется сортировка

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//процедура сортировки в гриде
procedure SortGrid(ColumnEh: TColumnEh; Query: TADOQuery; DBGridEh: TDBGridEh);
var
  sTmp: string;
begin
  if Query.RecordCount>0 then
    begin
      sTmp:=Query.Sort;
      if pos('DESC', sTmp)=0 then
        Query.Sort:=DBGridEh.Columns[ColumnEh.Index].FieldName + ' DESC'
      else
        Query.Sort:=DBGridEh.Columns[ColumnEh.Index].FieldName + ' ASC';
    end;
end;
проверено годами, вещать на событие OnTitleClick
0
0 / 0 / 0
Регистрация: 16.03.2018
Сообщений: 51
14.04.2019, 22:59  [ТС]
Delphi
1
2
3
DataModule2.QPoc.SQL.Text:='select  p.id, pp.name, p.data,p.name from poctuplenia p , postavshik pp where p.id_postav=pp.id ORDER BY ' + s;
if sortFlag then DataModule2.QPoc.SQL.Text:=DataModule2.QPoc.SQL.Text+' DESC'
else DataModule2.QPoc.SQL.Text:=DataModule2.QPoc.SQL.Text+' ASC' ;
Добавил where и теперь при сортировки по name1 выводит ошибку. И понять не могу почему он странно сортирует
Миниатюры
Сортировка при нажатии на DBgrid  
0
0 / 0 / 0
Регистрация: 16.03.2018
Сообщений: 51
14.04.2019, 23:15  [ТС]
Цитата Сообщение от mac1eod Посмотреть сообщение
sTmp:=Query.Sort;
* * * if pos('DESC', sTmp)=0 then
* * * * Query.Sort:=DBGridEh.Columns[ColumnEh.Index].FieldName + ' DESC'
* * * else
* * * * Query.Sort:=DBGridEh.Columns[ColumnEh.Index].FieldName + ' ASC';
* * end;
end;
А как вот эту часть переделать под IBquery т.е. под Qpoc
0
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
14.04.2019, 23:21
Могу предложить "дурацкий", но 100% работающий прием. Для объединенных таблиц с небольшим колич. полей годится.
1. дать второму полю с тем же самым именем псевдоним (алиас):
select p.id, pp.name, p.data, p.name namep from poctuplenia p, postavshik pp
2. если в гриде есть список колонок, поменять в гриде имя поля (свойство FieldName) с name на его алиас (namep).

А в процедуре проверять какая колонка нажата (с наличием алиаса - определяется просто) и присваивать номера полей переменной:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var 
  s, q : string;
begin
  if Column.FieldName = 'name' then S := '2';
  if Column.FieldName = 'data' then S := '3';
  if Column.FieldName = 'namep' then S := '4';
 
  q := 'select p.id, pp.name, p.data, p.name namep from poctuplenia p, postavshik pp ORDER BY '; 
  if sortFlag then
    datamodule2.QPoc.SQL.Text := q + s +' DESC'
  else
    DataModule2.QPoc.SQL.Text := q + s;
  sortFlag := not sortFlag;
  DataModule2.QPoc.Open;
end;
Номера полей здесь приходится использовать потому что по алиасам не сортируется.

Добавлено через 6 минут
Цитата Сообщение от mac1eod Посмотреть сообщение
проверено годами
Не получится. Дело в том, что колонки штатного грида Дельфи не знают какой у них индекс.
Грид используемый ТС не из библиотеки компонентов EhLib.
0
231 / 163 / 54
Регистрация: 26.10.2014
Сообщений: 928
14.04.2019, 23:23
slene, если честно, думал у вас ADOQuery в качестве датасета...
Если у IBquery нет метода Sort, тогда боюсь никак, извиняйте
0
0 / 0 / 0
Регистрация: 16.03.2018
Сообщений: 51
14.04.2019, 23:40  [ТС]
Цитата Сообщение от Скандербег Посмотреть сообщение
q := 'select p.id, pp.name, p.data, p.name namep from poctuplenia p, postavshik pp ORDER BY ';
* if sortFlag then
* * datamodule2.QPoc.SQL.Text := q + s +' DESC'
Пытался через этот способ не получается
0
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
14.04.2019, 23:42
Цитата Сообщение от slene Посмотреть сообщение
Пытался через этот способ не получается
У меня получается (никогда не даю советов без предварительной их проверки). Надо разыскать "зарытую собаку".
Если бы был проект с базой, то можно было попытаться найти "собаку".
0
0 / 0 / 0
Регистрация: 16.03.2018
Сообщений: 51
14.04.2019, 23:44  [ТС]
Это вообще возможно реализовать?
Для простых таблиц использовал вот это работает нормально. Но опять же не знаю как реализовать для составных таблиц
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure TForm3.dbgrd1TitleClick(Column: TColumn);
begin
  with DataModule2.QPost do
  begin
DisableControls;
Close;
SQL.Clear;
SQL.Add('select *');
SQL.Add('from postavshik');
SQL.Add('order by ' + Column.FieldName);
Open;
DataModule2.QPost.EnableControls;
end;
end;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.04.2019, 23:44
Помогаю со студенческими работами здесь

Вывод списка детей при нажатии на строку в dbgrid
Ребят, помогите!!! Создаю программу учета детей в детском саду в делфи, а база данных аксес. На форме есть два dbgrid-a, в одном таблица...

При нажатии кнопки отсортировать поля из DBGrid в ListBox
кароче надо чтобы при нажатии на кнопку пункты ид DBGrid отсортировались по цене и расходу топлива, в ListBox.

При нажатии кнопки добавить новую строку в DbGrid
есть dbrid и button,нужно чтоб при нажатии кнопки,добавлялась новая строка

Сохранение данных в DBGrid только при нажатии кнопки
Можно ли сделать так чтобы введенные в DBedit данные не сохранялись в DBgrid до тех пор, пока не будет нажата соответствующая кнопка?

DBGrid: При нажатии на сотрудника, вывести его посещаемость за год
Привет всем. Тренируюсь над созданием базы данных. Дело вот в чем: Мне нужно чтобы при нажатии на сотрудника, выскакивала его посещаемость...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru