根据我的阅读,如果被修改的数据仅代表一个表并且数据中包含唯一标识符字段,则应该可以编辑视图描述的数据。
根据微软的说法
任何修改都必须仅引用一个基表中的列
当基础记录集基于合并来自两个表的数据的视图或存储过程时,有没有人有幸创建可编辑的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
答案 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