2

MS Access データベース (.accdb ファイル拡張子、SQL データベースのフロント エンドではありません) にレコードを挿入するサードパーティ ソフトウェア (Pro-face Pro-Server EX) を使用しています。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 で探していることを実行する方法はありますか?

4

1 に答える 1

1

あなたが説明した状況では、Before Change データ マクロが機能しないことは間違いありません。ただし、外部プロセスを常にジャーナル テーブルに INSERT し、そのテーブルに After Insert データ マクロを使用して、メイン テーブルの行を INSERT または UPDATE することができます。

AfterInsert.png

もちろん、ジャーナル テーブルは時間の経過とともに拡大し続けるため、スケジュールされたメンテナンス ジョブを作成して、古いジャーナル レコードを定期的に削除することもできます。

于 2016-07-12T15:47:43.213 に答える