Zapisanie kto/kiedy modyfikował/dodawał rekord

W tym poście chce przedstawić nową funkcjonalność, jaką otrzymaliśmy w Access 2010, mianowicie Makra Danych. Swoim działaniem przypominają działanie wyzwalaczy (triggerów) z SQL Servera. Upraszczając dla osób nie obeznanych z tematem: Makro Danych jest uruchamiane w momencie operacji na tabelach np dodania rekordu, przed dodaniem/usnięciem rekordu. Pozwalają na kontrolowanie danych na ich “najniższym poziomie” czyli tabelach.

Opis problemu

Aplikacja wymaga od nas, abyśmy pamiętali kto i kiedy założył rekord, oraz kto i kiedy ostatnio modyfikował. We wcześniejszych wersjach musielibyśmy na formularzu gdzie pokazujemy dane z tabeli dodawać zdarzenie przed wstawieniem, gdzie posługując się VBA dodawalibyśmy dane do odpowiednich pól. W nowej wersji możemy użyć makra danych co zaoszczędzi nam pracy przy tworzeniu formularza.

Rozwiązanie

Będę się posługiwał tabelą tab, która hipotetycznie wymaga modyfikacji.
Na początku dodajmy do niej 4 pola odpowiedzialne za przechowywanie danych:

Nazwa Pola

Typ Danych

Opis

zalozony_kiedy

Data/Godzina

Data i godzina założenia
zalozony_kto

Tekst

Użytkownik (systemowy) dokonujący dodania
zmodyfikowany_kiedy

Data/Godzina

Data i godzina założenia
zmodyfikowany_kto

Tekst

Użytkownik (systemowy) dokonujący zmiany

Teraz dodajmy makro danych poprzez klikniecie w widoku projektu następującej opcji na wstążce:

I dodajmy takie makro:

Makro powyżej sprawdza, czy jest wypełniony klucz w tabeli, jeśli nie to uzupełnia pola o dodaniu, jeśli tak, to uzupełniania pole o modyfikacji. Wynika to z prostej zależności: tylko nowy rekord może nie mieć wypełnionego klucza.

Pozostaje tylko jeszcze wyjaśnienie dlaczego do uzupełniania informacji o użytkowniku wykorzystuje funkcje VBA GetUserName:

Public Function GetUserName() As String
GetUserName = Environ$("username")
End Function

Przyczyna jest bardzo prozaiczna, zawsze trzeba mieć na względzie zmiany jakie mogą nas spotkać podczas rozrostu aplikacji, jedną z nich może być to, ze będziemy zmuszeni dorobić się własnego logowania i obsługi użytkowników, wtedy wystarczy zmiana jednej funkcji VBA, zamiast szukanie w tabelach gdzie tego użyliśmy.

Podsumowanie

Dla chętnych: link do przykładowej bazy. Dodatkowo ze swojej strony chcę zaznaczyć, że rozwiązanie ma jeden mankament: czas zapisywany przez wyzwalacz jest czasem systemowym komputera użytkownika, także w przypadku jego zmiany mogą pojawiać się trefne dane. Próbowałem znaleźć informacje jak pobrać czas “serwera” (w przypadku linkowania tabel), ale nic sensownego nie znalazłem.

  1. Bardzo przydatne! Dzięki.

  2. A skoro tabele, to powiedz mi czy można w ACC usunąć wpisy rekordów tak aby indeks realizował wpisy od nowa?
    Gdy czyszczę tabele niestety następny wpis otrzymuje w kluczu głównym następny numer. Wiem ze nie ma to zbytnio znaczenia, ale z pobudek estetycznych i doświadczeniach na innych bazach .. może tutaj też.

  3. Wpis bardzo ciekawy i przydatny. Problem mam tylko, gdy skompilowałem do ACCDE. Wprowadzanie danych do tabeli na podstawie formularza, a tabela z danymi w drugim pliku jako przyłączona. Podczas przejścia do następnego rekordu (zapis) mam komunikat: ‘Funkcja “getusername” nie jest prawidłowa w przypadku wyrażeń używanych w makrach danych’.

Leave a Comment

NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Trackbacks and Pingbacks:

WordPress SEO fine-tune by Meta SEO Pack from Poradnik Webmastera
Skip to toolbar