Ответ 1
Попробуйте использовать view
в базе данных для реализации необходимого соединения. Затем компонент delphi может просто выбрать из view_name, а не обрабатывать само соединение.
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, вы увидите, что он не включил инструкцию объединения в таблицу.
====
Я бы очень признателен за любые идеи о том, как исправить это.
Попробуйте использовать view
в базе данных для реализации необходимого соединения. Затем компонент delphi может просто выбрать из view_name, а не обрабатывать само соединение.