2008-10-07 12 views
5

Początkowo pomyślałem, aby zapytać, czy istnieje łatwy sposób na zapewnienie automatycznie zarządzanego pola ostatniej aktualizacji z MS Access.Jak utworzyć automatycznie zarządzaną "ostatnią aktualizację" z Microsoft Access

Po pewnym googling znalazłem następujące podejście:

Private Sub Form_Dirty(Cancel As Integer) 

    Me.Last_Update = Date() 

End Sub 

co wydaje się wykonać zadanie. Pomyślałem, że podzielę się nim także z innymi (i jeśli ktoś ma kilka dobrych punktów, które należy wziąć pod uwagę, prosimy o podzielenie się nimi)

Odpowiedz

3

Można również umieścić ten sam kod w BeforeUpdate.

Różnica polega na tym, że OnDirty oznaczy rekord podczas jego edycji; podczas gdy BeforeUpdate będzie tagować rekord tuż przed zatwierdzeniem do bazy danych.

Te ostatnie mogą być lepsze, jeśli masz użytkownika, który rozpoczyna edycję rekordu, idzie na spotkanie, a kończy godzinę później.

+1

BeforeUpdate jest z pewnością poprawnym wydarzeniem do użycia, a nie OnDirty. –

2

To może być twój najlepszy wybór w bazie danych dostępu z dostępem od końca, ale jeśli masz backend MS-SQL, umieść wyzwalacz aktualizacji na stole, aby móc przechwytywać zmiany bez względu na to, skąd pochodzą.

CREATE TRIGGER [Table_stampUpdates] ON [dbo].[Table] 
FOR Update 
AS 
BEGIN 
UPDATE Table 
SET 
modified_by = right(system_user, len(system_user) - charindex('\', system_user)), modified_on = getdate() 
FROM Table inner join inserted on Table.PrimaryKey = Inserted.PrimaryKey 
END 
3

Dodatkowo dodać regułę kolumna Validation (lub CHECK ograniczenia) w celu zapewnienia „” timestamp kolumna jest aktualizowany, gdy stół jest aktualizowany inny niż za pośrednictwem formularza. SQL DLL (składnia trybie zapytania ANSI-92) będzie wyglądać mniej więcej tak:

CREATE TABLE MyTable 
(
    key_col INTEGER NOT NULL UNIQUE, 
    data_col INTEGER NOT NULL 
) 
; 
ALTER TABLE MyTable ADD 
    my_timestamp_col DATETIME 
     DEFAULT NOW() 
    NOT NULL 
; 
ALTER TABLE MyTable ADD 
    CONSTRAINT my_timestamp_col__must_be_current_timestamp 
     CHECK (my_timestamp_col = NOW()) 
; 

Innym podejściem przy użyciu Jet 4.0 (pre-Access 2007 czyli przed zabezpieczenia na poziomie użytkownika została usunięta z silnika) jest stworzenie 'helper' Jet SQL PROCEDURE (Termin dostępu: zapisany obiekt zapytań zdefiniowany za pomocą instrukcji SQL 'Action', w odróżnieniu od zapytania SQL SELECT), który automatycznie aktualizuje kolumnę 'timestamp', a następnie usuwa z tabeli 'update' i przyznaje im zamiast tego na PROC np SQL DDL/DCL coś takiego:

CREATE PROCEDURE MyProc 
(
    arg_key INTEGER, 
    arg_new_data INTEGER 
) 
AS 
UPDATE MyTable 
    SET data_col = arg_new_data, 
     my_timestamp_col = NOW() 
WHERE key_col = arg_key 
; 
REVOKE UPDATE ON MyTable FROM PUBLIC 
; 
GRANT UPDATE ON MyProc TO PUBLIC 
; 

Zaletą jest tu wszystkie aktualizacje muszą przejść przez PROC i dlatego jest pod kontrolą programisty; wadą jest Access/Jet SQL, że twój formularz będzie musiał również użyć PROC, co oznacza zmianę paradygmatu z dala od standardowego podejścia "formularzy związanych z danymi", dla którego Access jest znany.

+0

Jestem bardzo zdezorientowany tą odpowiedzią. Czy odpowiadasz na back-end odrzutowy lub na serwer SQL? Jeśli Jet, to nie ma wyzwalaczy ani procedur przechowywanych, a do stemplowania rekordów należy używać zdarzeń na poziomie formularza (w rzeczywistości działa to bardzo dobrze). –

+1

Moja odpowiedź brzmi: czysto Access/Jet/ACE, a cały kod jest składnią 4.0 w trybie zapytań 4.0 w Query Mode, spróbuj ;-) Jet ma rzeczywiście składnię PROCEDURY. Chodzi mi o to, że właściwie nie potrzebujesz * używania formularza Access, aby uzyskać znacznik czasu w ACE/Jet. – onedaywhen

+0

To jest bardzo interesujące .... link do dokumentacji na ten temat? – tbone