2016-07-12 84 views
2

我有一個第三方軟件(Pro-face的親服務器EX)被插入記錄到MS Access數據庫(.accdb文件擴展名,不SQL數據庫的前端)。該過程是在臨服務器EX軟件方面的配置方式是,它僅作爲插入(有沒有辦法來配置它來搜索現有的記錄執行更新)到數據庫中發送數據。我們有一個客戶擁有一個數據庫,其中包含預先存在的數據(帶有主鍵的ID字段),他想要做的就是根據ID更新現有記錄。我知道在SQL做到這一點的方法,我將配置類似以下的觸發:使用的MS Access觸發和/或querys來插入或更新記錄

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 [email protected],[email protected] WHERE [email protected] 
END 
ELSE 
BEGIN 
    INSERT INTO [dbo].[Table1] (seqno, Data1) VALUES (@seqno, @Data1) 
END 
END 

但是我沒有用的MS Access querys和/或觸發儘可能多的經驗。當我試圖將這段代碼複製到MS Access查詢的SQL視圖中時,我得到了一些錯誤,所以看起來這不會成爲MS Access的一個選項。

我從來沒有使用MS Access中可用的觸發器,但看起來最接近的可以使用的是「更改前」,它被描述爲「創建保存記錄之前運行的邏輯驗證更改,然後決定允許新值,更改值或顯示錯誤以停止更改。使用[IsInsert]屬性確定事件是插入還是更新。「這說明告訴我,一旦數據已經寫入到數據庫觸發器將只被絆倒,但不能保存,所以真的不能被用來確定是否匹配的ID已經存在執行更新,如果沒有,然後執行插入。我解釋正確嗎?

有沒有辦法做什麼,我在MS Access找?

+0

Access沒有觸發器像MSSQL一樣。 Access通常使用表單或報表中的事件來處理數據操作。軟件是否直接鏈接Access表以執行插入操作或完成的具體內容? –

+0

@random_answer_guy - Access 2010及更高版本確實具有事件驅動的[數據宏](https://support.office.com/zh-cn/article/Create-a-data-macro-b1b94bca-4f17-47ad-a66d- f296ef834200),它們在表級別上運行並且有點像觸發器。 –

+0

@GordThompson - 正確的,我正在使用MS Access 2010.關於插入,軟件(Pro-Server EX)有一個配置爲使用指針文件(在本例中是另一個.accdb文件)的動作數據庫,表和字段寫入數據。然後軟件在後臺生成並執行INSERT語句,因此如果不更改軟件,則無法對其進行修改。這需要一些時間,但我們有一位客戶現在正在尋找解決方案。 –

回答

1

你是正確的,一前更改數據的宏不會爲您所描述的情況下工作。但是,你可以有外部進程總是插入到一個日誌表,然後有一個後該表上的任何插入插入數據宏或在主表更新一行,像這樣:

AfterInsert.png

當然,日記表將隨着時間的推移而不斷增長,因此可以創建計劃維護作業以定期刪除舊日記記錄。

+0

感謝您的信息,這完美的工作。我在主表上添加了兩個額外的數據宏(一個在插入後和一個在更新後),從日誌表中刪除匹配的記錄。這應該(希望)保持日記表的大小。另外,如果缺少任何數據,客戶可以使用日記表作爲一種事務日誌。我以前從未在MS Access(或Access中使用過)中使用過數據宏,因此您的描述和屏幕截圖幫助了很多。再次感謝。 –