2009-12-04 10 views
0

Je crée une table pendant l'exécution. Voici comment je le fais:Comment créer un champ calculé dans la base de données Access en utilisant SQL pendant l'exécution dans 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; 

Je dois ajouter un champ « âge » qui devrait être calculé automatiquement comme ceci:

age = DateDiff ('y',[Date Added], Now()) , ce qui donne simplement montant jours cet élément est stocké. Comment est-ce que je fais ceci à l'exécution? Existe-t-il un moyen d'ajouter des champs calculés dynamiquement à Access Database?

Remarque: J'utilise Delphi 7, les composants ADO et Microsoft Jet 4.0 pour se connecter à la base de données MDB. JET ne gère pas les champs calculés dans les tables.

Répondre

0

Créez une requête parallèle avec le champ calculé ici - la requête devrait être mise à jour comme la table d'origine.

[Mise à jour en réponse au commentaire de l'OP]

"Requête" est le langage JET pour une vue, et JET via ADO acceptera une SQL plus ou moins standard CREATE VIEW. Par conséquent, vous devriez être en mesure de faire:

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

Cela créera une nouvelle vue (requête AKA) dans la base de données. Comme il s'agit d'une vue non agrégée à table unique, vous devriez pouvoir la METTRE À JOUR comme s'il s'agissait d'une table. (Tout cela suppose que la fonction DATEDIFF est supportée au niveau du JET, ce qui est probablement vrai, je crois).

+0

Pouvez-vous me aider à ce sujet? J'utilise des composants TAdoQuery, et leur connexion est également via JET. Comment puis-je créer une requête parallèle? –

+1

J'ai mis à jour ma réponse originale. . . –

+0

Merci, c'est très utile. Je vais essayer ça. Une dernière question, est-il possible d'afficher ce champ dans DBGrid plus tard? –

1

Créez un view (dans Access, ce que l'on appelle une requête) qui renvoie les données calculées. La syntaxe SQL est la même que pour SQL Server.

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

Vous pouvez également créer cela dans l'interface d'accès en créant une nouvelle requête, ce qui vous donne la possibilité de jouer/test avec le sql jusqu'à ce qu'il retourne les données correctes que vous attendez.

Lors de la sélection de ces données, vous le faites comme vous le feriez d'une table normale:

SELECT * FROM TABLEVIEW WHERE AGE > 30