Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access 使用MS Access触发器和/或查询插入或更新记录_Ms Access_Ms Access Data Macro - Fatal编程技术网

Ms access 使用MS Access触发器和/或查询插入或更新记录

Ms access 使用MS Access触发器和/或查询插入或更新记录,ms-access,ms-access-data-macro,Ms Access,Ms Access Data Macro,我有一个第三方软件(Pro face Pro Server EX),可以将记录插入MS Access数据库(.accdb文件扩展名,而不是SQL数据库的前端)。在Pro Server EX软件端配置进程的方式是,它只将数据作为插入发送到数据库(无法将其配置为搜索现有记录以执行更新)。我们有一个客户,他有一个数据库,其中包含预先存在的数据(带有一个ID字段,该字段是主键),他只想根据ID更新现有记录。我知道有一种方法可以在SQL中实现这一点,我将配置一个类似于以下内容的触发器: SET ANSI_

我有一个第三方软件(Pro face Pro Server EX),可以将记录插入MS Access数据库(.accdb文件扩展名,而不是SQL数据库的前端)。在Pro Server EX软件端配置进程的方式是,它只将数据作为插入发送到数据库(无法将其配置为搜索现有记录以执行更新)。我们有一个客户,他有一个数据库,其中包含预先存在的数据(带有一个ID字段,该字段是主键),他只想根据ID更新现有记录。我知道有一种方法可以在SQL中实现这一点,我将配置一个类似于以下内容的触发器:

SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO

CREATE TRIGGER [dbo].[update_table]
 ON  [dbo].[Table1]
 INSTEAD OF INSERT
AS

DECLARE @seqno int
DECLARE @Data1 int

BEGIN
SET @seqno = (Select seqno from INSERTED)
SET @Data1 = (Select Data1 from INSERTED)

IF EXISTS (SELECT seqno FROM [dbo].[Table1] WHERE seqno = @seqno)
 BEGIN
  UPDATE [dbo].[Table1] SET seqno=@seqno,Data1=@Data1 WHERE seqno=@seqno
 END
ELSE
 BEGIN
  INSERT INTO [dbo].[Table1] (seqno, Data1) VALUES (@seqno, @Data1)
 END
END
但是,我对MS Access查询和/或触发器没有太多经验。当我试图将这段代码复制到MS Access查询的SQL视图中时,我得到了几个错误,因此这似乎不是MS Access的真正选项

我从未使用MS Access中可用的触发器,但似乎可以使用的最接近的触发器是“更改前”,它被描述为“创建在保存记录之前运行的逻辑以验证更改,然后决定允许新值、更改值或显示错误以停止更改。使用[IsInsert]属性来确定事件是插入还是更新。“此描述告诉我,只有当数据已写入数据库但未保存时,才会触发此触发器,因此它确实无法用于确定是否已存在匹配的ID以执行更新,如果不存在,则执行插入。我的解释正确吗


有什么方法可以实现我在MS Access中寻找的功能吗?

您认为更改前数据宏不适用于您描述的情况,这是正确的。但是,您可以让外部进程始终插入到日记账表中,然后在该表上有一个插入后数据宏,在主表中插入或更新行,如下所示:


当然,日志表会随着时间的推移不断增长,因此可以创建一个定期维护作业来定期删除旧日志记录。

Access不像MSSQL那样有触发器。Access使用事件,通常在表单或报表上,您可以进行数据操作。软件是否直接在为了完成插入,或者具体是如何完成的?@random\u answer\u guy-Access 2010和更高版本确实有事件驱动,在表级别运行,行为有点像触发器。@GordThompson-正确,我使用的是MS Access 2010。关于插入,软件(Pro Server EX)具有配置为使用指针文件(在本例中为另一个.accdb文件)的操作要将数据写入哪个数据库、表和字段,软件将在后台生成并执行INSERT语句,因此在不更改软件的情况下无法对其进行修改。这需要一些时间,但我们有一位客户正在寻找解决方案。感谢您提供的信息,这非常有效y、 我在主表上添加了两个额外的数据宏(一个在插入之后,一个在更新之后),用于从日志表中删除匹配的记录检查日记账表的大小。此外,如果有任何数据丢失,客户可以将日记账表用作一种事务日志。我以前从未在MS Access中使用过数据宏(或访问过那么多),因此您的描述和屏幕截图帮助很大。再次感谢。