#delphi #firebird #firedac #lookupfield
#delphi #firebird #firedac #поле поиска
Вопрос:
У меня есть две таблицы :
DEPARTMENTS
(Индекс, имя)EMPLOYEES
(Индекс, имя, DEPID, DepName)
DepName
это значение поиска, которое извлекается DEPARTMENTS.Name
с использованием DEPID
каких ссылок DEPARTMENT.Index
.
При использовании DBGrid, отображающей EMPLOYEES
таблицу, и после изменения DEPID
значения запись DepName
не обновляется и не отражает изменения, пока я не повторю запрос!
Есть ли способ сделать это и получить значение поиска, отражающее изменение в реальном времени?
- Rad Studio XE Токио,
- Firebird 3.0,
- Компоненты FireDAC (TFDQuery),
Комментарии:
1. Где изменяется DEPID — в наборе данных или в таблице БД? Если вы извлекаете данные от СОТРУДНИКОВ с помощью SELECT with JOINs — самый простой способ — повторить запрос.
2. Мне никогда не нравилось, как работает DBGrid. Вот почему я всегда использую вместо этого StringGrid и выполняю все связанные с базой данных вещи в методах DataModule. Это отдельное представление данных (пользовательский интерфейс, сетка) и модель данных (модуль данных), что делает программу намного более понятной, понятной и поддерживаемой. Я использую события в сетке, чтобы обновлять ее в соответствии с действиями пользователя. Конечно, мне удается не повторять запрос, который заполняет всю таблицу, а только небольшой запрос для извлечения данных для измененной ячейки.
3.
When using a DBGrid displaying the EMPLOYEES table, and after changing DEPID value
это сделано для табличных хранилищ данных типа «ISAM». Например, Excel и т. Д. Без транзакций, без языков запросов и т. Д. Это действительно отличается от модели клиент-сервер. Возможно, вам нужен подход «портфеля», вы делаете небольшую копию соответствующей информации базы данных, редактируете ее, а затем пытаетесь загрузить ВСЕ изменения в базу данных. Конечно, это увеличивает вероятность коллизий «устаревших данных».TClientDataSet
и его друзья изDataSnap/MIDAS
семьи были созданы для реализации этой модели в Delphi4. Здесь та же проблема, без участия DBGRID. У меня есть TFDQuery с полем поиска, и когда я меняю значение ключа, поле поиска остается. Нет системы ISAM, базы данных Postgres, и она отлично работает во многих других TFDQueries. Я попробовал TFIELD. Обновить список поиска без улучшения. Не выдает никакой ошибки, он восстанавливает одно значение для поля поиска, но не значение, соответствующее ключевому полю.
5. Проблема, с которой я столкнулся, заключалась в том, что при вставке в TFDQuery (FDQ_Detail) и информировании поля ключа поле поиска не будет следовать этому ключу. Я сделал FDQ_Detail. Post и поле поиска обновились правильно. Чтобы продолжить редактирование записи, я сделал FDQ_Detail. Отредактируйте правильно, и это сработало. Я не ставлю это как ответ, поскольку, безусловно, выглядит как странный способ сделать это. НО ЭТО СРАБОТАЛО.
Ответ №1:
Если вы можете сделать СОТРУДНИКОВ.Post поле поиска должно обновляться правильно. Чтобы продолжить редактирование записи, вы можете использовать EMPLOYEES.Отредактируйте еще раз. Вероятно, это неправильный способ сделать это, но у меня это сработало.
Вы можете попробовать CalcField.RefreshLookupList это выглядит как точный способ сделать это, но у меня это не сработало на Delphi XE6 с firedac против базы данных Postgres с кэшированными обновлениями.