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

Проблема с фильтрацией в базе данных

11.04.2022, 14:36. Показов 664. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Прошу помощи в настройках фильтрации. Суть проблемы. Имеется база созданная в MS ACCESS 2003. Разработано приложение в Delhpi 10. На главной форме к компоненту DBGrig1 привязана таблица которая имеет 3 подстановочных поля. При попытке настроить фильтр первая запись меняет свои данные остальные фильтруются нормально. Да фильтрация идет по подстановочным полям. Код фильтра
Delphi
1
2
3
4
5
6
7
8
9
procedure TForm1.DBLookupComboBox1CloseUp(Sender: TObject);
begin
DM.CRT.Filtered:= False;
   if     DBLookupComboBox1.KeyValue <> NULL then
     begin
      DM.CRT.Filter:='CRTName='+ IntToStr(DBLookupComboBox1.KeyValue);
      DM.CRT.Filtered:=True;
     end;
end;
На другой форме реализованы SQL-запросы. Там проблем нет. Но я не могу запрос поместить в DBGrid1.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.04.2022, 14:36
Ответы с готовыми решениями:

Проблема с фильтрацией данных в DataGridView
Проблема следующая: Есть класс, в этом классе есть функция которая возвращает список public ArrayList GetInfo() { ...

Проблема с фильтрацией Django
Проблема в следущем. Пытался реализовать на сайте фильтрацию как в разных интернет-магазинах То есть устанавить диапазон цен. Как итог,...

проблема с фильтрацией MAC адресов
Поставил МАС фильтрацию на роутере, чтобы только определенные МАС адреса могли использовать эту сеть, прописал все устройства, все...

14
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,656
Записей в блоге: 21
11.04.2022, 15:48
давайте по азам вдарим
данные - в датасетах
на кой леший вам какой-то там лукап комбобокс?
тем более KeyValue должно по смыслу содержать именно поле датасета


"на другой форме" все уже гораздо правильнее - SQL запросы.
теперь давайте узнаем, что значит поместить запрос в DBGrid и что вам помешало связать Query и DBGrid
а Table и DBGrid - не помешало???
0
0 / 0 / 0
Регистрация: 25.01.2022
Сообщений: 12
11.04.2022, 16:21  [ТС]
В DBLookupComboBox происходит выбор данных по которым надо фильтровать данные в сетке DBGrid.
Когда я связываю Query и DBGrid на главной форме то на форме не заполняется все столбцы. Я предполагаю что из за того что в таблице которая связана с DBGrid имеются подстановочные поля.

Добавлено через 14 минут
Цитата Сообщение от krapotkin Посмотреть сообщение
теперь давайте узнаем, что значит поместить запрос в DBGrid
Это не верное высказывание. Я имел ввиду связать дата сет запроса и сетку. Прошу прощения за не весьма корректные высказывания.
0
0 / 0 / 0
Регистрация: 25.01.2022
Сообщений: 12
11.04.2022, 16:43  [ТС]



Это результат выполнения фильтрации первая строка(запись) меняется в зависимости от выбраной модели. Вторая - выполнение запроса.
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,656
Записей в блоге: 21
11.04.2022, 20:40
Цитата Сообщение от alexm68 Посмотреть сообщение
DBLookupComboBox происходит выбор данных по которым надо фильтровать данные в сетке DBGrid.
вот вовсе не так
в DBLookupCombo происходит замена значения поля в привязанном датасете на код из справочника
при этом пользователь видит не код, а другое поле из справочника
программе абсолютно все равно, что там видит пользователь
и вам как программисту в целом тоже
у вас не показано, на каком датасете сидит DBLC, но подозреваю, что на том же самом
что происходит в результате -
вы меняете значение в привязанном поле текущей записи и плюс еще делаете фильтр по этому же измененному полю
мне кажется какое-то из действий тут лишнее. DBLC ну совсем не для этого.

вот тут Связанные таблицы - в ComboBox и CheckListBox
код по заполнению обычного комбо из справочника. Текст идет на экран, ID - в свойство Object, откуда его при необходимости (при выборе строки в КБ) достаем и ДЕЛАЕМ SQL ЗАПРОС.
Который, хоть верно, хоть неверно высказывайся, дает точно такой же датасет, как ваш Table-компонент.
Соответственно абсолютно так же привязывается к гриду.

Перестаньте уже беспокоить призраки 90-х с однопользовательскими базами и таблицами, которые надо сначала полностью сказать в память, а потом делать по ним фильтр. Сейчас за такой подход можно больно получить по голове.
0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
11.04.2022, 22:40
Можно использовать в качестве фильтра DBLookupComboBox настроив только свойства List, но при условии, что его датасетом будет запрос вида:
SQL
1
2
SELECT -1,'<Все>' FROM TableName UNION
SELECT ID,FieldName FROM TableName
Без добавления первой строчки в запросе, вы не сможете вернуться к полной выборке.
0
0 / 0 / 0
Регистрация: 25.01.2022
Сообщений: 12
11.04.2022, 23:05  [ТС]
Цитата Сообщение от krapotkin Посмотреть сообщение
что происходит в результате -
вы меняете значение в привязанном поле текущей записи и плюс еще делаете фильтр по этому же измененному полю
мне кажется какое-то из действий тут лишнее. DBLC ну совсем не для этого.
В общем я согласен с вами. Только не знаю как разрешить эту ситуацию. Теперь почему я не использую запрос. На главной форме на сетке DBGrid1 сделана процедура которая по щелчку на записи(строке) открывает форму для редактирования товара. Причем открывает карточку именно этого товара. Его уникальный номер. Если я использую запрос для заполнения DBGrid1 то процедура по щелчку открывает карточку первого в базе товара. Я так понял мне придется чем-то пожертвовать, либо процедурой редактирования либо фильтром.
Цитата Сообщение от krapotkin Посмотреть сообщение
Перестаньте уже беспокоить призраки 90-х с однопользовательскими базами и таблицами, которые надо сначала полностью сказать в память, а потом делать по ним фильтр. Сейчас за такой подход можно больно получить по голове.
Опять вы правы, но в 55 тяжело перестраиваться, но я стараюсь.

Добавлено через 3 минуты
Цитата Сообщение от Пытливый Посмотреть сообщение
Можно использовать в качестве фильтра DBLookupComboBox настроив только свойства List, но при условии, что его датасетом будет запрос вида:
SQLВыделить код
SELECT -1,'<Все>' FROM TableName UNION
SELECT ID,FieldName FROM TableName
Без добавления первой строчки в запросе, вы не сможете вернуться к полной выборке.
Спасибо. Идея интересная. Попытаюсь.
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,609
12.04.2022, 02:19
Цитата Сообщение от alexm68 Посмотреть сообщение
Теперь почему я не использую запрос. На главной форме на сетке DBGrid1 сделана процедура которая по щелчку на записи(строке) открывает форму для редактирования товара. Причем открывает карточку именно этого товара. Его уникальный номер. Если я использую запрос для заполнения DBGrid1 то процедура по щелчку открывает карточку первого в базе товара. Я так понял мне придется чем-то пожертвовать
Не надо ничем жертвовать. Надо просто правильно написать код.
0
Модератор
 Аватар для D1973
9908 / 6445 / 2455
Регистрация: 21.01.2014
Сообщений: 27,354
Записей в блоге: 3
12.04.2022, 02:32
Цитата Сообщение от alexm68 Посмотреть сообщение
Если я использую запрос для заполнения DBGrid1 то процедура по щелчку открывает карточку первого в базе товара.
alexm68, чушь! Свяжите свой DBGrid с правильным набором данных: не с ADOTable, а с ADOQuery - и всего делов...
Цитата Сообщение от alexm68 Посмотреть сообщение
но в 55 тяжело перестраиваться
Это не вы, часом, методички для учебных заведений делаете? Они там тоже перестроиться не могут, все во временах перестройки сидят...
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,609
12.04.2022, 02:39
Цитата Сообщение от alexm68 Посмотреть сообщение
Опять вы правы, но в 55 тяжело перестраиваться, но я стараюсь.
Если не поленитесь, то через 10 лет станет легче. Сам знаю по личному опыту.
Мудрость она накапливается! Если знания есть.
0
0 / 0 / 0
Регистрация: 25.01.2022
Сообщений: 12
12.04.2022, 06:38  [ТС]
Цитата Сообщение от northener Посмотреть сообщение
Не надо ничем жертвовать. Надо просто правильно написать код.
Вот в этом и проблема. Не могу правильно написать код поэтому и прошу помощи.
Цитата Сообщение от D1973 Посмотреть сообщение
alexm68, чушь! Свяжите свой DBGrid с правильным набором данных: не с ADOTable, а с ADOQuery - и всего делов...
Почему вы мне не верите. Если посмотрите на изображения то там есть кнопка отчеты которая открывает форму на которой все сделано запросами. Но там я не могу реализовать процедуру редактирования. Можете помочь помогите.
Цитата Сообщение от D1973 Посмотреть сообщение
Это не вы, часом, методички для учебных заведений делаете? Они там тоже перестроиться не могут, все во временах перестройки сидят...
Нет. Я по них учусь. Я работаю все время на производстве. А это для развития ума.

Добавлено через 2 минуты
Цитата Сообщение от northener Посмотреть сообщение
Если не поленитесь, то через 10 лет станет легче. Сам знаю по личному опыту.
Мудрость она накапливается! Если знания есть.
Согласен. Я думал что поделятся знаниями. Возможно в очередной раз ошибся.
0
Модератор
 Аватар для D1973
9908 / 6445 / 2455
Регистрация: 21.01.2014
Сообщений: 27,354
Записей в блоге: 3
12.04.2022, 06:48
Цитата Сообщение от alexm68 Посмотреть сообщение
Почему вы мне не верите.
Потому, что у меня - работает, у других - работает, у Вас - не работает. Значит, чушь порете Вы, а не мы все, правда?
А вообще, разговор без проекта и БД - просто беспредметен и скатывается в обыкновенные препирательства.

Добавлено через 3 минуты
Цитата Сообщение от alexm68 Посмотреть сообщение
Я по них учусь.
Зря Вы это делаете. Учиться по материалам 30-тилетней давности, это... Если Вы работаете на производстве, то сами подберете кучу аналогий...
0
0 / 0 / 0
Регистрация: 25.01.2022
Сообщений: 12
12.04.2022, 08:28  [ТС]
Цитата Сообщение от D1973 Посмотреть сообщение
Значит, чушь порете Вы, а не мы все, правда?
Это значит что я ошибся где-то и прошу помощи разобраться где. В принципе даже понял где. Форма редактирования связана с датасет таблицы, поэтому с DBGrid который также связан с таблицей работает. Если форму редактирования связать с запросом то все должно заработать. Но у меня остался вопрос. Можно ли сделать фильтр без запроса? Просто интересно.
Цитата Сообщение от D1973 Посмотреть сообщение
А вообще, разговор без проекта и БД - просто беспредметен и скатывается в обыкновенные препирательства.
Опять таки согласен. Поэтому предлагаю закрыть тему.
0
Модератор
 Аватар для D1973
9908 / 6445 / 2455
Регистрация: 21.01.2014
Сообщений: 27,354
Записей в блоге: 3
12.04.2022, 09:44
Цитата Сообщение от alexm68 Посмотреть сообщение
Если форму редактирования связать с запросом то все должно заработать.
Бинго!
Цитата Сообщение от alexm68 Посмотреть сообщение
Можно ли сделать фильтр без запроса?
Как по мне, фильтр нужен только при наборе данных, который формируется в ADOTable - т.е. все записи таблицы. Другого способа уменьшить объем визуальной информации, кроме как фильтр, для такого НД нет.
Совсем другое дело SQL-запрос: в нем Вы сами задаете критерии отбора, что именно Вы хотите увидеть. В итоге - Вы получаете минимальный набор данных, но данные в нем только те, которые Вам нужны в текущий момент. Поэтому идея фильтра при таком подходе к формированию НД просто теряет смысл...
Цитата Сообщение от alexm68 Посмотреть сообщение
Поэтому предлагаю закрыть тему.
Эва как... А я-то думал, Вы проект выложите с базой своей, чтобы предметно можно было о чем-то говорить...
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,656
Записей в блоге: 21
12.04.2022, 09:59
не нужно делать фильтр
нужно понять концепцию
1)
Датасет- это набор данных, полученный в результате запроса. Не таблица в базе.
Чтобы изменить что-то в базе, нужно сделать другой запрос - на изменение, вставку, удаление и т.д.
2)
Никакой волшебной связи между таблицей БД и датасетом нет. Если тихонько просто удалить всю базу - датасету все равно.
3)
Одни и те же данные могут быть запрошены в несколько датасетов. При этом они никак не будут связаны между собой и сами не обновятся при изменениях (см п.2)
4)
Несколько DB-компонентов могут быть привязаны к одному датасету. При этом в них синхронно обновляются данные, в том числе, когда мы меняем текущую запись датасета, перемещаясь по нему вперед-назад, или вносим изменения в данные в каком-либо поле.
5)
У каждой записи обычно есть идентификатор, ключ, позволяющий однозначно найти эту запись в таблице
Если у нас есть датасет, в котором мы стоим на какой-то записи, то достаточно запомнить ее ключ, обычно это поле с названием ID и чтобы работать именно с этой записью, мы просто указываем ее ID
6)
из пункта 4 и 5 вытекает следствие
если вы кликаете по гриду - откройте форму, заполните ее данными из ЭТОЙ ЖЕ ЗАПИСИ ЭТОГО ЖЕ ДАТАСЕТА
измените данные в полях формы. В 2022 рекомендую формы делать из обычных - не-DB-компонентов.
После того как форма закрылась, формируем ДРУГОЙ запрос - UPDATE. Желательно с параметрами, это в 100 раз удобнее.
Выполняем запрос.
После этого как сказано выше, данные в БД уже изменились, а в гриде - нет
Поэтому нужно запомнить ID текущей записи датасета, к которому привязан грид, закрыть и заново открыть этот датасет, чтобы новые данные из БД пришли. После чего командой Locate перейти к той записи, на которой вы стояли раньше, используя поиск по ранее сохраненному ID.

про DB-компоненты
про формы
про запросы






Концепция обновления данных
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.04.2022, 09:59
Помогаю со студенческими работами здесь

Проблема с подключением к базе данных
При отладке выдаёт такую ошибку, я только начал учить базы данных, поэтому не уверен правильно ли написал 24-ю строку Помогите...

Проблема с подключение к базе данных
Осваиваю EF, не получается подключиться к базе данных, подскажите что делать с такой ошибкой

Проблема с изображениями в базе данных
Мне нужно добавить в таблицу Coins базы данных (в столбец Image) изображение. Столбцы: Тип данных: Count int Rubl ...

Проблема с кириллицей в базе данных
Добрый день, друзья! Подскажите пожалуйста, где у меня может быть ошибка, окторая не отображает кириллицу на сайте? Во вложении...

Проблема с датой в базе данных
Ребят, подскажите, пожалуйста. Записываю в базу данных SQL Server сегодняшнюю дату. Делаю несколько записей. Почему-то записи 3 - 4 дата...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru