Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.77/30: Рейтинг темы: голосов - 30, средняя оценка - 4.77
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891

Сортировка в DBGrid

29.04.2013, 01:54. Показов 6454. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собственно вот такой код:

Delphi
1
2
3
4
5
procedure TForm1.DBGrid1TitleClick(Column: TColumn);
begin
   TADODataSet(Column.Field.DataSet).Sort := '['+Column.Field.FieldName +'] ASC';
end;
end.
И вот такая ошибка:
Cannot perform this operation on a closed dataset.
- почему?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.04.2013, 01:54
Ответы с готовыми решениями:

Сортировка в dbgrid
Подскажите как можно отсортировать записи в DBGrid по алфавиту, сделал выборку из базы , в DBGrid отображаются только записи ...

Сортировка DBGrid
Привет. Собираюсь сделать пару разных сортировок для DBGrid. Буду писать вопросы в этой теме. Сразу вопрос: я хочу сделать, чтобы при...

Сортировка DBGrid
Доброго времени суток! Надо сделать так что при нажатии кнопки в DBGrid происходила сортировка записей по алфавиту. Использую TTable. База...

33
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
29.04.2013, 20:22  [ТС]
Студворк — интернет-сервис помощи студентам
Друзья, взгляните, пожалуйста. Я ничего не попутал?

Вот структура двух таблиц (ADOTable1 и ADOTable2 соответственно):




А вот создание Lookup'а для ADOTable1:



, где "tbl2" - MyTable2.
0
1085 / 571 / 79
Регистрация: 07.04.2011
Сообщений: 971
Записей в блоге: 2
29.04.2013, 22:46

1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
30.04.2013, 03:45  [ТС]
antikiler_, эм... Относительно Вашего представления структуры БД - какое-то неклассическое представление связи "1 ко многим" (которая изначально и планировалась), не находите?
0
1085 / 571 / 79
Регистрация: 07.04.2011
Сообщений: 971
Записей в блоге: 2
30.04.2013, 04:21
Цитата Сообщение от The_Immortal Посмотреть сообщение
какое-то неклассическое представление связи "1 ко многим"
Вообще, Я это хотел сказать про вашу схему, но насколько Я знаю это стандартное представление. Да... и вашей схеме ошибок Я не заметил.
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
30.04.2013, 04:34  [ТС]
antikiler_,
Цитата Сообщение от antikiler_ Посмотреть сообщение
это стандартное представление
В таком случае давайте приведем пример какой-нибудь простенькой предметной области, дабы разобраться в "классическом представлении" связи "1 ко многим"

Скажем, возьмем сущности "Пациент - Посещение", при этом не особо вдаваясь в детали.
Условие: у одного и того же Пациента может быть несколько Посещений.


Для подобной предметной области вижу следующую структуру:

Таблица Пациент (MyTable1)

ID ФИО
1 Петров Петр Петрович
2 Иванов Иван Иванович



Таблица Посещение (MyTable2)

ID ПациентID Жалобы
1 1 Обратился с головной болью
2 1 Обратился с кишечными коликами
3 2 Просто симулирует



В итоге:

1. Петров Петр Петрович: обратился два раза. Первый раз - "с головной болью". Второй раз - "с кишечными коликами".
2. Иванов Иван Иванович: обратился один раз: жалоба зафиксирована как "просто симулирует".

Интересно, как видите это Вы?

P.S. Я не беру на понт, я просто хочу понабраться опыта. Быть может, я до сих пор жил в неведении...
0
1085 / 571 / 79
Регистрация: 07.04.2011
Сообщений: 971
Записей в блоге: 2
30.04.2013, 04:59
Вот все и решилось...Обычно lookup поле делают основной(master) таблице в данном случае это "посещения".
А у вас подстановочное поле для "пациентов"(details), только не могу понять для чего.
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
30.04.2013, 13:19  [ТС]
antikiler_,
Цитата Сообщение от antikiler_ Посмотреть сообщение
только не могу понять для чего
Немного переделаю вышеобозначенную структуру и далее сообщу, что мне нужно в итоге получить.


Таблица Пациент (MyTable1 - ADOTable1)

ID ФИО
1 Петров Петр Петрович
2 Иванов Иван Иванович



Таблица Посещение (MyTable2 - ADOTable2)

ID ПациентID Дата Жалоба
1 1 25.04.2013Обратился с головной болью
2 1 27.04.2013Обратился с кишечными коликами
3 2 29.04.2013Просто симулирует




А вот что в итоге надо получить:

ADOTable1

ФИО Последняя дата
Петров Петр Петрович 27.04.2013
Иванов Иван Иванович 29.04.2013
0
1085 / 571 / 79
Регистрация: 07.04.2011
Сообщений: 971
Записей в блоге: 2
30.04.2013, 14:49
Цитата Сообщение от The_Immortal Посмотреть сообщение
А вот что в итоге надо получить:
Без sql запросов, будет трудновато такое сделать. А учитывая, что тебе надо работать только через ADOTable, на мой взгляд самые простой вариант, сделать такой запрос в Access и сохранить его там. И вызывать его просто - в ADOTable указываешь имя запроса(оно должно там появится). Вот приблизительная структура запроса
T-SQL
1
2
3
SELECT Пациент.ФИО, MAX(Посещение.Дата) AS [Последняя дата]
FROM Пациент INNER JOIN Посещение ON Пациент.ID = Посещение.ПациентID
GROUP BY Пациент.ФИО;
Если будут проблемы с составление запроса, выложи свою базу.
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
30.04.2013, 15:19  [ТС]
antikiler_,
Цитата Сообщение от antikiler_ Посмотреть сообщение
Без sql запросов, будет трудновато такое сделать.
Т.е. невозможно?

С запросами-то проблем никаких нет.
0
1085 / 571 / 79
Регистрация: 07.04.2011
Сообщений: 971
Записей в блоге: 2
30.04.2013, 16:07
Цитата Сообщение от The_Immortal Посмотреть сообщение
Т.е. невозможно?
Я ведь не сказал что это невозможно. Но это будет "костылеобразно". Ну предложу такой план:
1.Отключаемся от набора данных - для ускорения
2. Средствами ADOtable фильтруем таблицу по ПациентуID
3. Делаем цикл на поиск максимальной даты
4. Передаем ее другой таблице
5. Пункт 2-4 для каждого пациента
6. Сбрасываем Фильтр
7. Подключаемя к набору данных.
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
30.04.2013, 16:10  [ТС]
antikiler_, кошмарики

И даже после этого, полагаю, сортировка по полю "Последняя дата" работать не будет, так?
0
1085 / 571 / 79
Регистрация: 07.04.2011
Сообщений: 971
Записей в блоге: 2
30.04.2013, 16:50
Цитата Сообщение от The_Immortal Посмотреть сообщение
полагаю, сортировка по полю "Последняя дата" работать не будет, так?
По идее должна. Но мне тут пришла мысль, сделать поле не подстановочным а вычисляемым. Тогда можно все упростить до одной строки кода в событии отCalcFields

UPD
По полю, сортировка работать не будет. Там нужен совсем другой костыль. Сразу скажу без использования sql, это "геморройное" дело.
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
30.04.2013, 17:22  [ТС]
antikiler_,

Цитата Сообщение от antikiler_ Посмотреть сообщение
Но мне тут пришла мысль, сделать поле не подстановочным а вычисляемым.
Интересная мысль, надо сказать!

Цитата Сообщение от antikiler_ Посмотреть сообщение
Тогда можно все упростить до одной строки кода в событии отCalcFields
Что-то не могу сообразить, что там прописать Не поможете?
0
1085 / 571 / 79
Регистрация: 07.04.2011
Сообщений: 971
Записей в блоге: 2
01.05.2013, 17:31
В "одну строчку" Я конечно перегнул, кое о чем не продумал, но так должно у тебя работать
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
procedure TForm1.ADOTable1CalcFields(DataSet: TDataSet);
begin
  if ADOTable2.IsEmpty then ADOTable2.Open;
 
  if not ADOTable2.IsEmpty then
    begin
      ADOTable2.First;
      while not ADOTable2.eof do
        begin
           if (DataSet.FieldByName('ID').AsInteger = ADOTable2.FieldByName('ПациентID').AsInteger) and
            (DataSet.FieldByName('ИМЯ_Вычисляемого_Поля ').AsDateTime < ADOTable2.FieldByName('Дата').AsDateTime) then
            DataSet.FieldByName('ИМЯ_Вычисляемого_Поля').AsDateTime := ADOTable2.FieldByName('Дата').AsDateTime;
            ADOTable2.Next
        end;
 
    end;
Ну естественно поля "Дата" и "ИМЯ_Вычисляемого_Поля" как TDataTime. Чуть поже посмотрю, как еще можно все оптимизировать.

Добавлено через 22 часа 26 минут
Цитата Сообщение от The_Immortal Посмотреть сообщение

Таблица Пациент (MyTable1 - ADOTable1)

ID ФИО
1 Петров Петр Петрович
2 Иванов Иван Иванович



Таблица Посещение (MyTable2 - ADOTable2)

ID ПациентID Дата Жалоба
1 1 25.04.2013Обратился с головной болью
2 1 27.04.2013Обратился с кишечными коликами
3 2 29.04.2013Просто симулирует



А вот что в итоге надо получить:

ADOTable1

ФИО Последняя дата
Петров Петр Петрович 27.04.2013
Иванов Иван Иванович 29.04.2013
Во общем так.
1. Делаешь как раньше Lookup поле. В его свойствах устанавливаешь LookupCache в true
2. На форме кнопка(в целях теста ) в ней следующий код
Delphi
1
2
3
4
5
6
procedure TForm1.Button1Click(Sender: TObject);
begin
 ADOTable2.Sort := '[ПациентID] ,[Дата] DESC';
 ADOTable1.FieldByName('Последняя дата').RefreshLookupList;
 ADOTable1.Refresh;
end;
3. Если надо, восстанавливаешь сортировку в ADOTable2.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.05.2013, 17:31

Сортировка DBGrid
Имеется DBGrid, подключенная к базе данных. Можно ли как то сортировать ее , не трогая сами базы данных? Просто при сортировке по дням...

DBGrid сортировка
помогите в таком вопросе по клику в столбец, предположим, &quot;номер&quot; столбец сортировался в соответствии с номерами клик - сортировка...

Сортировка в DBGRID
Добрый день! Есть на форме DBgrid с 2 полями: 1.Локация 2. Дата Как сделать сортировку по полю дата, что бы при клике на поле дата в...

Сортировка в DBGrid
Вот код: procedure TForm1.N8Click(Sender: TObject); begin ClientDataSet1.IndexFieldNames:='Фамилия'; end; Подскажите как...

Сортировка в DBGrid
Здравствуйте. Возникла проблема: ОЧЕНЬ нужно чтобы при нажатии на кнопку, в компоненте DBGrid происходила сортировка содержимого по...


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

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru