ClientDataset.RefreshRecord больше не работает в Delphi XE для объединенных таблиц - никаких обходных решений?

TClientDataset.RefreshRecord больше не генерирует часть соединения таблицы SQL при попытке обновить запись на ClientDataset, подключенном к набору данных, с объединенной таблицей в инструкции SQL.

В результате вызов этого метода приводит к ошибке SQL "недопустимые имена столбцов" для каждого поля, не входящего в основную таблицу.

Это не было проблемой в Delphi 2010 и более ранних версиях.

Ошибка возникает как с компонентами DBX4, так и с BDE, подключенными к TClientDataset и, таким образом, , весьма вероятно, что проблема связана с изменениями кода TClientDataset.

Чтобы воспроизвести эту проблему:

Создайте новое приложение в Delphi XE только с одной формой и отбросьте на него необходимые компоненты базы данных (TSQLMonitor, TSQLConnection, TSQLQuery, TDatasetProvider, TClientDataset, TDatasource и TDBGrid) и привяжите их друг к другу.

Создал простой оператор SQL с объединением таблицы и поместил его в свойство TSQLDataset.SQL.

Оператор SQL содержит только два поля - поле ключа основной таблицы и поле из объединенной таблицы - например, в псевдокоде:

Select 
  MainTable.IntegerKeyField
  , JoinedTable.JoinField
FROM MainTable
LEFT OUTER JOIN JoinedTable ON MainTable.LookupFieldID = JoinedTable.JoinKeyField

Добавьте оба этих поля в качестве постоянных полей как в TSQLQuery, так и в TClientDataset с флажком поставщика для ключевого поля, включая pfInKey (RefreshRecord не будет работать, если он не знает, какое поле является ключевым, поэтому постоянные поля являются обязательными).

Добавить две кнопки в форме - один только открывает Clientdataset, а вторая кнопка вызывает clientdataset.refreshrecord;

Запустите приложение, нажмите кнопку, чтобы открыть набор данных и отобразить данные в сетке.

Нажмите кнопку "Обновить запись", и вы получите ошибку SQL "недопустимое имя столбца" для объединенного поля.

Закройте приложение, откройте журнал SQLMonitor и в операторе SQL записи обновления, который был сгенерирован Delphi, вы увидите, что он не включил инструкцию объединения в таблицу.

====

Я бы очень признателен за любые идеи о том, как исправить это.

Ответы

Ответ 1

Попробуйте использовать view в базе данных для реализации необходимого соединения. Затем компонент delphi может просто выбрать из view_name, а не обрабатывать само соединение.