Обновление значения поля поиска после изменения значения ключа

#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 семьи были созданы для реализации этой модели в Delphi

4. Здесь та же проблема, без участия DBGRID. У меня есть TFDQuery с полем поиска, и когда я меняю значение ключа, поле поиска остается. Нет системы ISAM, базы данных Postgres, и она отлично работает во многих других TFDQueries. Я попробовал TFIELD. Обновить список поиска без улучшения. Не выдает никакой ошибки, он восстанавливает одно значение для поля поиска, но не значение, соответствующее ключевому полю.

5. Проблема, с которой я столкнулся, заключалась в том, что при вставке в TFDQuery (FDQ_Detail) и информировании поля ключа поле поиска не будет следовать этому ключу. Я сделал FDQ_Detail. Post и поле поиска обновились правильно. Чтобы продолжить редактирование записи, я сделал FDQ_Detail. Отредактируйте правильно, и это сработало. Я не ставлю это как ответ, поскольку, безусловно, выглядит как странный способ сделать это. НО ЭТО СРАБОТАЛО.

Ответ №1:

Если вы можете сделать СОТРУДНИКОВ.Post поле поиска должно обновляться правильно. Чтобы продолжить редактирование записи, вы можете использовать EMPLOYEES.Отредактируйте еще раз. Вероятно, это неправильный способ сделать это, но у меня это сработало.

Вы можете попробовать CalcField.RefreshLookupList это выглядит как точный способ сделать это, но у меня это не сработало на Delphi XE6 с firedac против базы данных Postgres с кэшированными обновлениями.