2012-08-31 28 views
4

我想在MS Access上创建VIEW定义。我已经使用以下CREATE VIEW声明:如何使用Delphi应用程序在MS Access数据库中创建VIEW,而无需在PC上安装MSAccess?

SELECT 
    MFP.FollowUpPlan_Id, 
    MFP.FollowUpPlan_Name AS PlanName, 
    DFP.Sequence_No AS SequenceNo, 
    MFS.FollowUpSchedule_Name AS ScheduleName  
FROM 
    MAS_FollowUp_Plan AS MFP, 
    DET_FollowUp_Plan AS DFP, 
    MAS_FollowUp_Schedule AS MFS 
WHERE 
    (((MFP.FollowUpPlan_Id)=DFP.FollowUpPlan_Id) AND 
    ((DFP.FollowUpSchedule_Id)=MFS.FollowUpSchedule_Id)) AND 
    MFP.is_Deleted = FALSE AND 
    DFP.is_Deleted = false  
ORDER BY 
    MFP.FollowUpPlan_Id, DFP.Sequence_No;  

但它抛出一个错误:

Only Simple Select Queries are allowed in view. 

请帮帮忙,先谢谢了。

+2

尝试从查询中删除ORDER BY部分,并在从该视图中选择时使用它,例如'SELECT * FROM YourView ORDER BY FollowUpPlan_Id,SequenceNo'。 – TLama

+0

查询而不是视图适合吗?它将允许更多的方式的SQL。 – Fionnuala

回答

1

声明变量olevarCatalog,在Delphi在cmd作为OleVariant,用途ComObj

olevarCatalog := CreateOleObject('ADOX.Catalog'); 
olevarCatalog.create(YourConnectionString); //This Will create MDB file. 
// Using ADO Query(CREATE TABLE TABLEName....) add the required Tables. 

// To Insert View Definition on MDB file. 
cmd := CreateOleObject('ADODB.Command'); 
cmd.CommandType := cmdText; 
cmd.CommandText := 'ANY Kind of SELECT Query(JOIN, OrderBy is also allowed)'; 
olevarCatalog.Views.Append('Name of View',cmd); 
cmd := null; 

这是为了创建MS Access文件(.mdb)和用Delphi景色的最佳方式。

4

You cannot mix ORDER BY with JOIN when creating views in Access。它会给你错误"Only simple SELECT queries are allowed in VIEWS."(注意复数VIEWS)

FROM有多个表是JOIN的一种。

  • 或者删除ORDER BY
  • 或在FROM和没有JOIN只有一个表。

我记得从过去(当我做了更多的访问的东西比现在)看到这一个大的查询与单个表选择ORDER BY以及。

The consensus is that you should not have ORDER BY in views anyway,所以这是你最好的做法。

Another reason that you can get the same error message是如果您添加参数或子选择。访问不喜欢视图中的那些,但在您看来,情况并非如此。

6

正如Jeroen解释的,这里的问题是Access'CREATE VIEW声明的限制。对于这种情况,您可以改用CREATE PROCEDURE。它将创建db的QueryDefs集合的新成员---所以从Access用户界面将显示为新的命名查询。

以下语句适用于使用VBScript中的ADO。从以前的德尔福在这里的问题,我的理解是,德尔福也可以使用ADO,所以我相信这也适用于你。

CREATE PROCEDURE ViewSubstitute AS 
SELECT 
    MFP.FollowUpPlan_Id, 
    MFP.FollowUpPlan_Name AS PlanName, 
    DFP.Sequence_No AS SequenceNo, 
    MFS.FollowUpSchedule_Name AS ScheduleName 
FROM 
    (MAS_FollowUp_Plan AS MFP 
    INNER JOIN DET_FollowUp_Plan AS DFP 
    ON MFP.FollowUpPlan_Id = DFP.FollowUpPlan_Id) 
    INNER JOIN MAS_FollowUp_Schedule AS MFS 
    ON DFP.FollowUpSchedule_Id = MFS.FollowUpSchedule_Id 
WHERE 
    MFP.is_Deleted=False AND DFP.is_Deleted=False 
ORDER BY 
    MFP.FollowUpPlan_Id, 
    DFP.Sequence_No; 
+1

+ !;感谢您教会我Access具有“创建过程”,这非常类似于“创建视图”,但没有一些限制。 –

+0

谢谢你的答案.. – Ganesh

相关问题