Как создать вычисляемое поле в базе данных Access с помощью SQL во время выполнения в Delphi

Я создаю таблицу во время выполнения. Вот как я это делаю:

AdoCommand1.Connection:=AdoConnection1;
cs:='CREATE TABLE '+edname.text+' (' +
'ID Integer IDENTITY(1,1) NOT NULL UNIQUE PRIMARY KEY,' +
'[Date Added] DATETIME,'+
'[Name] TEXT(255))';
ADOCommand1.CommandText:=cs;
ADOCommand1.Execute;

Мне нужно добавить поле «возраст», которое должно автоматически рассчитываться следующим образом:

age = DateDiff ('y',[Date Added], Now()) , который просто указывает количество дней, в течение которых хранится элемент. Как это сделать во время выполнения? Есть ли способ добавить динамически вычисляемые поля в базу данных Access?

Примечание. Я использую компоненты Delphi 7, ADO и Microsoft Jet 4.0 для подключения к базе данных MDB.


person Tofig Hasanov    schedule 04.12.2009    source источник


Ответы (2)


JET не поддерживает вычисляемые поля в таблицах. Создайте параллельный запрос с вычисляемым полем — запрос должен быть обновляемым, как и исходная таблица.

[Обновление в ответ на комментарий OP]

«Запрос» - это язык JET для представления, и JET через ADO примет более или менее стандартный оператор SQL CREATE VIEW. Поэтому вы должны уметь:

ADOCommand1.CommandText := 
  'CREATE VIEW TableNameVw AS SELECT *, (DateDiff (''y'',[Date Added], Now())) AS [Age] FROM TableName';
ADOCommand1.Execute;

Это создаст новое представление (запрос AKA) в базе данных. Поскольку это неагрегированное представление с одной таблицей, вы должны иметь возможность ОБНОВИТЬ его, как если бы это была таблица.

(Все это предполагает, что функция DATEDIFF поддерживается на уровне JET, что я считаю, вероятно, правдой).

person Larry Lustig    schedule 04.12.2009
comment
Можете ли вы помочь мне в этом? Я использую компоненты TAdoQuery, и их подключение тоже через JET. Как создать параллельный запрос? - person Tofig Hasanov; 04.12.2009
comment
Спасибо, это очень полезно. Я попробую это. И последний вопрос: есть ли способ отобразить это поле в DBGrid позже? - person Tofig Hasanov; 04.12.2009
comment
Да, в качестве источника сетки используйте ADODataset из запроса (TableNameVW), а не из таблицы. - person Larry Lustig; 04.12.2009

Создайте представление (в Access это называется запросом), которое возвращает рассчитанные данные. Синтаксис SQL такой же, как и для SQL Server.

CREATE VIEW TABLEVIEW AS
  SELECT TABLE.*, DATE() - TABLE.[DATE ADDED] AS AGE
  FROM [Table];

Вы также можете создать это в GUI ACCESS, создав новый запрос, который дает вам возможность играть/тестировать с sql, пока он не вернет правильные данные, которые вы ожидаете.

Выбирая эти данные, вы делаете это так же, как и для обычной таблицы:

SELECT * FROM TABLEVIEW WHERE AGE > 30
person skamradt    schedule 04.12.2009