TClientDataset.RefreshRecord больше не генерирует часть SQL таблицы соединения при попытке обновить запись в ClientDataset, подключенном к набору данных с объединенной таблицей в операторе SQL.
AsВ результате при вызове этого метода ошибка SQL "недопустимые имена столбцов" для каждого поля, отсутствующего в основной таблице.
Это не было проблемой в Delphi 2010 и более ранних версиях.
Ошибка возникает с обоими компонентами DBX4 или BDE, подключенными к TClientDataset, и, таким образом, весьма вероятно, что проблема связана с изменениями в коде TClientDataset.
Чтобы воспроизвести эту проблему:
Создайте новое приложение в Delphi XE только с одной формой и поместите в нее необходимые компоненты базы данных (TSQLMonitor, TSQLConnection, TSQLQuery, TDatasetProvider, TClientDataset, TDatasourceи TDBGrid) и связать их друг с другом.
Создал простой оператор SQL с объединением таблиц и поместил его в TSСвойство QLDataset.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, вы увидите его.не включил оператор соединения таблицы.
====
Я был бы очень признателену идеи о том, как это исправить.