Как создать вычисляемое поле в базе данных Access с использованием SQL во время выполнения в Delphi - PullRequest
0 голосов
/ 04 декабря 2009

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

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.

Ответы [ 2 ]

1 голос
/ 04 декабря 2009

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

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

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

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

SELECT * FROM TABLEVIEW WHERE AGE > 30
0 голосов
/ 04 декабря 2009

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

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

«Запрос» является термином 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, что, как я полагаю, вероятно, верно).

...