2015-05-20 2 views
3

Я работаю с базами данных Delphi 7 и Firebird. Я использую TIBDatabase, TIBTransaction, TIBQuery, TIBDataSet и DBGrid для установления соединения и предоставления пользовательского интерфейса для работы с таблицей. В моей базе данных у меня есть две таблицы:Обновление Delphi 7 с объединенными таблицами

Ships 
fields 
Id integer 
Name varchar(20) 
Type_Id(Fk) integer 
Longth integer 

Ship_types 
fields 
Id(Pk) integer 
Ship_type varchar(10) 

Так в результате набор данных, который я получаю через «присоединиться» запрос имеет такие поля

Name 
Type 
Longth 

Тип является Ship_type поле из Ship_types таблицы соединены с помощью запроса по внешнему ключу TYPE_ID к этой таблице из таблицы Ships.

Данные отображаются правильно.

Затем мне нужно отредактировать свои данные непосредственно через DBGrid. Для этого я использую компонент TIBUpdateSQL. Для отображения поля Type (lookup) я выбрал свойство DBGrid.Columns.PickList.

Так что мой вопрос в том, как я могу заставить TIBUpdateSQL работать с таким типом поля? Причина. Я знаю, что если бы это была отдельная таблица без внешних ключей, я должен написать инструкцию update в свойство ModifySQL компонента обновления. Но что я делаю с полями fk? Могу ли я написать заявление о соединении обновлений в компоненте UpdateSQL или, если нет, что еще я могу сделать?

Мне не нужно обновлять две таблицы, мне просто нужно обновить только таблицу Ships, но в отображении набора данных есть поле varchar (word), а при обновлении набора данных оно должно быть целочисленным (соответствующий id) в соответствии с таблицей состав.

Редактор в TIBUpdateSQL не является решением для меня, потому что я назначаю запрос TIBQuery во время выполнения.

+1

Ну, на самом деле это не Firebird вопрос, но дизайн CRUD. Но ответ заключается в использовании DBLookupFields (а не PickList) непосредственно в DBGrid для выбора типа корабля. – rstrelba

ответ

3

Вы не можете обновлять таблицы, используя select с помощью JOIN, только с подзапросами.

Sub-выберите пример:

SELECT TABLE_NAME.* 
    , (SELECT TABLE_NAME2.NAME FROM TABLE_NAME2 WHERE TABLE_NAME2.ID = TABLE_NAME.ID) 
FROM TABLE_NAME