2016-07-12 21 views
2

Ich habe eine Software von Drittanbietern (Pro-Face Pro-Server EX), die Datensätze in eine MS Access-Datenbank (.accdb Dateierweiterung, nicht ein Frontend für eine SQL-Datenbank). Die Konfiguration des Prozesses auf der Seite der Pro-Server EX-Software sieht vor, dass die Daten nur als Einfügung an die Datenbank gesendet werden (es gibt keine Möglichkeit, sie so zu konfigurieren, dass sie nach einem vorhandenen Datensatz sucht, um eine Aktualisierung durchzuführen). Wir haben einen Kunden mit einer Datenbank mit bereits vorhandenen Daten (mit einem ID-Feld, das der Primärschlüssel ist), wo er nur den vorhandenen Datensatz basierend auf der ID aktualisieren möchte. Ich kenne eine Methode, dies in SQL zu tun, wo ich einen Trigger ähnlich der folgenden konfigurieren würde:Verwenden von MS Access Trigger und/oder Abfragen zum Einfügen oder Aktualisieren eines Datensatzes

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 

Jedoch habe ich nicht so viel Erfahrung mit MS Access querys und/oder die Auslöser haben. Wenn ich versuche, diesen Code in die SQL-Ansicht einer MS Access-Abfrage zu kopieren, erhalte ich mehrere Fehler, daher scheint dies für MS Access keine wirkliche Option zu sein.

Ich habe nie die Auslöser verwendet, die in MS Access verfügbar sind, aber es scheint, dass die nächste, die verwendet werden kann, ist "vor Änderung", die als "Create Logic, die vor dem Speichern eines Datensatzes ausgeführt wird beschrieben Überprüfen Sie die Änderungen und entscheiden Sie dann, ob die neuen Werte zugelassen, die Werte geändert oder ein Fehler angezeigt werden sollen, um die Änderungen zu stoppen. Verwenden Sie die [IsInsert] -Eigenschaft, um zu ermitteln, ob es sich bei dem Ereignis um eine Einfügung oder Aktualisierung handelt. " Diese Beschreibung sagt mir, dass dieser Auslöser nur dann ausgelöst wird, wenn die Daten bereits in die Datenbank geschrieben, aber nicht gespeichert wurden, sodass nicht wirklich ermittelt werden kann, ob eine übereinstimmende ID für die Aktualisierung bereits vorhanden ist. Führen Sie dann eine Einfügung durch. Interpretiere ich das richtig?

Gibt es eine Möglichkeit zu tun, was ich in MS Access suche?

+0

Zugriff hat keine Trigger wie MSSQL. Access verwendet Ereignisse, normalerweise auf einem Formular oder einem Bericht, mit denen Sie Daten manipulieren können. Verknüpft die Software die Access-Tabellen direkt, um den Insert zu erstellen oder wie genau wird das durchgeführt? –

+0

@random_answer_guy - Access 2010 und höher haben ereignisgesteuerte [Datenmakros] (https://support.office.com/en-us/article/Create-a-data-macro-b1b94bca-4f17-47ad-a66d- f296ef834200), die auf Tabellenebene arbeiten und sich ähnlich wie Trigger verhalten. –

+0

@GordThompson - Richtig, ich benutze MS Access 2010. In Bezug auf die Einfügung hat die Software (Pro-Server EX) eine Aktion, die konfiguriert ist, um eine Zeigerdatei (in diesem Fall eine andere .accdb-Datei) zu verwenden Datenbank, Tabelle und Feld, in das die Daten geschrieben werden sollen. Die Software erzeugt dann die INSERT-Anweisung und führt sie im Hintergrund aus, so dass es keine Möglichkeit gibt, sie zu ändern, ohne die Software zu ändern. Das wird einige Zeit dauern, aber wir haben einen Kunden, der gerade nach einer Lösung sucht. –

Antwort

1

Sie haben Recht, dass ein Makro vor der Änderung für die von Ihnen beschriebene Situation nicht funktioniert. Sie jedoch der externe Prozess immer in einem Journal-Tabelle einfügen haben könnte, dann haben Sie eine After Insert Daten Makro auf die Tabelle entweder INSERT oder eine Zeile in der Haupttabelle UPDATE wie folgt:

AfterInsert.png

Natürlich Die Journaltabelle würde im Laufe der Zeit weiter wachsen, sodass ein geplanter Wartungsjob erstellt werden könnte, um alte Journaldatensätze regelmäßig zu löschen.

+0

Danke für die Information, das hat perfekt funktioniert. Ich fügte zwei zusätzliche Datenmakros in der Main-Tabelle hinzu (eine nach dem Einfügen und eine nach dem Update), die den übereinstimmenden Datensatz aus der Journal-Tabelle löschten. Das sollte (hoffentlich) die Größe der Journal-Tabelle in Schach halten. Außerdem kann der Kunde die Journal-Tabelle als eine Art Transaktionsprotokoll verwenden, wenn irgendwelche Daten fehlen. Ich habe noch nie die Datenmakros in MS Access (oder Access so viel) verwendet, so dass Ihre Beschreibung und Screenshot geholfen haben. Danke noch einmal. –

Verwandte Themen