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.
Bardzo przydatne! Dzięki.
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ż.
Instrukcja wg. MS: Resetowanie wartości pola Autonumerowanie w programie Access”, generalnie kompaktowanie resetuje seed-a na pustej tabeli, mozna tez przy pomocy VBA zresetować:Pole typu Autonumerowanie nie jest resetowane po skompaktowaniu bazy danych programu Access
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’.