使用SQL View和两个表在MS-Access表单上编辑数据的任何方法

时间:2018-04-23 18:36:51

标签: sql-server tsql ms-access stored-procedures sql-view

根据我的阅读,如果被修改的数据仅代表一个表并且数据中包含唯一标识符字段,则应该可以编辑视图描述的数据。

根据微软的说法

  

任何修改都必须仅引用一个基表中的列

当基础记录集基于合并来自两个表的数据的视图或存储过程时,有没有人有幸创建可编辑的MS-Access表单?

我的表单只使用辅助表来加入代码表以获取基于文本的描述 - 但这样做会使表单不可编辑。

我是否需要将其解决并为表单创建其他查找代码?或者是否有人可以指出一个适合他们的例子?

这就是我现在对我试图用来编辑PreliminaryInvoices

的表单的看法
SELECT        t1.*, t2.JobTypeGroup AS Grouping
FROM          dbo.PreliminaryInvoices AS t1 
INNER JOIN    dbo.tblJobTypes AS t2 
ON t1.JobTypeID = t2.JobTypeID

编辑 - 更新以显示当前的工作解决方案 - 没有第二个表

我能够让它工作的唯一方法是拆分第二个表并添加查找以显示JobTypeID中的文本

当前可编辑视图:

SELECT        t1.*
FROM          dbo.PreliminaryInvoices AS t1 

查找程序:

CREATE PROCEDURE [dbo].[spJobTypeGrouping]
    -- Add the parameters for the stored procedure here
    @TypeID int
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    SELECT  dbo.tblJobTypes.[Grouping] 
    FROM    dbo.tblJobTypes 
    WHERE   dbo.tblJobTypes.JobTypeiD = @TypeID
END

2 个答案:

答案 0 :(得分:1)

您应该在视图上创建instead of触发器,以便更新基础表。您不必更新触发器中的所有字段。如果您创建适当的触发器,Access会将其视为表格。

对于触发器未涵盖的字段。如果用户尝试更新表,则UI将显示为修改字段,但如果您重新打开视图,则原始值将返回。

这是一个处理插入,更新或删除的触发器。请注意,如果发生更新,则会填充插入和删除结果集。这不是处理事情的最有效方法,但是您在Access中更新链接视图...

CREATE TRIGGER vwInvoices_Modify ON vwInvoices
  INSTEAD OF INSERT, UPDATE, DELETE
AS 

  SET NOCOUNT ON;

  -- delete non-updates
  DELETE FROM PreliminaryInvoices WHERE Id IN (
    SELECT Id FROM deleted EXCEPT SELECT Id FROM inserted
  );

  -- insert non-updates
  INSERT INTO PreliminaryInvoices (Id, colA, colB)
    SELECT Id, colA, colB FROM inserted WHERE Id NOT IN (SELECT Id FROM deleted)

  -- updates
  UPDATE PreliminaryInvoices SET
    colA = ins.colA
    colB = ins.colB
  FROM inserted ins
  WHERE ins.Id IN (SELECT Id FROM deleted)
    AND PreliminaryInvoices.Id = ins.Id

END

答案 1 :(得分:0)

如果要更新Microsoft Access中无法完全更新的视图,我建议您使用SQL Server中的触发器来执行更新。

您可以定义INSTEAD OF UPDATE触发器来覆盖默认的更新行为。

您可以在MSDN上阅读有关INSTEAD OF触发器的信息。这些允许您准确指定更新字段时发生的情况,甚至允许您更新计算列(例如,更改计算年龄列更改时某人的生日日期)。

要使用T-SQL查询和可更新视图,需要将表单绑定到ADO记录集。您可以使用类似于以下代码的代码:

Private Sub Form_Load()
    Dim conn As ADODB.Connection
    'Open a valid connection here. I recommend a reusable function or class for opening connections
    Dim rs As ADODB.Recordset
    Set rs = conn.Open("SELECT * FROM dbo.MyView")
    Set Me.Recorset = rs
End Sub