2009-12-04 1 views
0

런타임 중에 테이블을 생성 중입니다.Delphi에서 런타임 중에 SQL을 사용하여 Access Database에서 계산 된 필드를 생성하는 방법

age = DateDiff ('y',[Date Added], Now()) , 단순히 해당 항목이 저장되는 일에 양을 제공합니다 :이처럼 자동으로 계산되어야 할 분야 "나이"를 추가 할 필요가

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; 

: 이것은 내가 그것을 할 방법이다. 런타임에는 어떻게해야합니까? 동적으로 계산 된 필드를 Access 데이터베이스에 추가하는 방법이 있습니까?

참고 : Delphi 7, ADO 구성 요소 및 Microsoft Jet 4.0을 사용하여 MDB 데이터베이스에 연결합니다.

답변

0

JET는 테이블의 계산 된 필드를 지원하지 않습니다. 계산 된 필드가있는 병렬 쿼리를 만듭니다. 쿼리는 원래 테이블과 같이 업데이트 가능해야합니다.

[OP의 의견에 응답 업데이트]

"쿼리"뷰에 대한 JET 말투, 그리고 ADO를 통해 JET이 더 - 또는 - 덜 표준 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 (쿼리에서는 액세스)을 만듭니다. SQL 구문은 SQL Server와 같습니다.

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

당신은 또한 당신에게 당신이 기대하고 정확한 데이터를 반환 할 때까지 SQL로/테스트를 재생할 수있는 기능을 제공하는 새로운 쿼리를 작성하여 ACCESS의 GUI이를 만들 수 있습니다.

이 데이터를 선택할 때, 당신은 당신처럼 그것을 할 것 일반 테이블 :

SELECT * FROM TABLEVIEW WHERE AGE > 30