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.refreshrecord;
Запустите приложение, нажмите кнопку, чтобы открыть набор данных, и данные отобразятся в сетке.
Нажмите кнопку «Обновить запись», и вы получите ошибку SQL «недопустимое имя столбца» для объединенного поля.
Закройте приложение, откройте журнал SQLMonitor и в операторе SQL записи обновления, сгенерированном Delphi, вы увидите, что он не включил оператор соединения таблицы.
====
Я был бы очень признателен за любые идеи, как это исправить.