2009-12-04 1 views
0

Я создаю таблицу во время выполнения. Вот как я это делаю:Как создать вычисляемое поле в базе данных 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 Database?

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

ответ

0

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, который, я считаю, вероятно правдив).

+0

Можете ли вы помочь мне в этом? Я использую компоненты TAdoQuery, и их соединение осуществляется через JET. Как создать параллельный запрос? –

+1

Я обновил свой первоначальный ответ. , , –

+0

Спасибо, это очень полезно. Я попробую это. Последний вопрос, есть ли способ отобразить это поле в DBGrid позже? –

1

Создать view (в 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 

 Смежные вопросы

  • Нет связанных вопросов^_^