Formularze Accessa służą o odczytu, edycji, wprowadzania i usuwania danych. Użytkownik aplikacji zbudowanej w Accessie nie powinien w zasadzie robić tego bezpośrednio w tabelach, a właśnie w formularzach. Tym bardziej, że pozwalają one nie tylko na znacznie przyjaźniejszą formę graficzną, ale przede wszystkim – umożliwiają wprowadzanie danych jednocześnie do kilku różnych, powiązanych z sobą tabel. Formularze można także oprogramować (czy to makrami czy procedurami VBA), dzięki czemu otwiera się cały szereg możliwości ułatwiających pracę w aplikacji.
Podstawowe typy formularzy:
formularz pojedynczy – na ekranie widoczny jest jeden rekord
formularz ciągły – na ekranie widocznych jest wiele rekordów
formularz dzielony – w jednej części formularza widoczne są pola jednego rekordu, w drugiej części – wszystkie rekordy
Tworząc formularze – z reguły nigdy nie opieram ich bezpośrednio o tabelę. Nigdy nie wiadomo, czy nie pojawi się potrzeba rozbudowy, więc zdecydowanie lepszym rozwiązaniem jest wykorzystanie tu kwerend.
Formularz może być też niezwiązany czyli bez źródła danych. Taką formę stosuję bardzo często do wprowadzania nowych danych. Przed zapisaniem ich potem do tabel – mam możliwość dokładnego ich sprawdzenia i przy stwierdzeniu błędów, wyświetlenia komunikatu i przerwania procedury. Sprawdza się się w praktyce.
To podstawowy podział, choć w każdym typie kwerendy możliwe są różnego rodzaju podtypy np. kwerendy parametryczne.
Generalnie kwerendy są tworzone w oknie siatki kwerendy, choć można podejrzeć je w widoku SQL.
Podstawą każdej aplikacji Accessa jest zawsze tabela. Może być jedna, może być ich wiele. W tabelach zapisywane są wszystkie wprowadzone dane. Warto pamiętać, że zmieniając, usuwając czy dodając dane do tabel, robimy to od razu na dysku – nie da się edytować danych i wyjść “bez zapisywania”.
Jak zbudować tabelę? Z karty Tworzenie wybieramy Projekt tabeli:
W projekcie każdej nowej tabeli domyślnie pojawia się jedno nowe pole o nazwie Identyfikator i typie danych – Autonumerowanie. Można to od razu zmienić czy to nadając własną nazwę czy też ustawiając inny typ danych.
Typy danych pól w tabeli
Tekst – wartości typu tekstowego (String)
Nota– wartości typu tekstowego o znacznej długości. W niektórych wersjach Accessa pole to występuje pod nazwą Memo.
Liczba– wartości typu liczbowego.
Data – wartości typu data/czas
Waluta – wartości typu walutowego
Autonumerowanie – pole typu liczba całkowita długa (Long) . Wartości tego typu danych są wstawiane automatycznie dla każdego nowego rekordu, jako kolejna wartość porządkowa. Istotne tu jest to, że numeracja jest zapisana na stałe. Jeżeli usuniemy np.ostatni rekord, a potem dodamy nowy – będzie on miał wartość pola i tak zwiększoną o 1. Nawet usunięcie wszystkich rekordów spowoduje, że numeracja będzie prowadzana jako kontynuacja, a nie od 1. Chcąc zresetować pole typu autonumerowanie w tabeli jedynym wyjściem jest stworzenie kopii tabeli (tylko struktura, bez danych), ewentualne dołączenie rekordów ze starej tabeli do nowej, a następnie usunięcie starej tabeli i zmiana nazwy tabeli skopiowanej
Tak/Nie – wartość typu logicznego (Boolean)
Obiekt OLE – wartość typu połączony obiekt
Hiperłącze – wartość hiperłącza
Załącznik– wartość typu załącznik
Obliczeniowy – wartość wyznaczona w wyniku obliczeń
Kreator odnośników – wartość typu lista stworzona na podstawie odwołań do innych tabel/kwerend
Właściwości pola tabeli
W zależności od typu danych pola poszczególne właściwości mogą się nieco różnić. Dla pola typu Tekst występuje np. rozmiar pola, dla liczb – rodzaj liczby, ilość miejsc dziesiętnych itp.
Rozmiar Pola– dla pól typu tekst można wstawić maksymalną ilość znaków. Domyślna wartość to 255, ale warto ją zmniejszyć, jeżeli wiemy, że wystarczy mniejsza.
Format– tu również są różne możliwości w zależności od typu danych. Ma to znaczenie głównie dla liczb – w jakim formacie ma być wprowadzona wartość
Maska– różne maski wprowadzania, w zależności od typu danych. Dla tekstu może być to np. odpowiednio sformatowany numer kodu, może być to hasło itp.
Tytuł– tekst, który ma być widoczny w nagłówku tabeli (a także w etykietach opartych o nie formantów w formularzach czy raportach). Dla kolumny o nazwie np. NrKsiaz, wpisanie tytułu np.Numer książki spowoduje, że prosta (bez spacji i polskich znaków diakrytycznych) nazwa będzie widoczna wszędzie w wersji przyjaznej dla użytkownika. Brak Tytułu powoduje, że tytuł jest tożsamy z nazwą pola.
Wartość domyślna – wartość wstawiana domyślnie dla nowych rekordów
Reguła sprawdzania poprawności – ograniczenie wartości wprowadzanych danych. Np. dla pola typu liczba całkowita tylko wartości ujemne
Tekst reguły sprawdzania poprawności – treść komunikatu pojawiającego się przy wprowadzeniu wartości nie spełniającej reguły
Wymagane – do wyboru 2 opcje: Tak lub Nie. Przy zaznaczeniu Tak, pole to nie może zostać puste, musi mieć wprowadzoną wartość.
Indeksowane – indeksowanie przyspiesza wyszukiwanie, sortowanie i filtrowanie rekordów, ale nieco dłużej trwa zapisywanie rekordów (moim zdaniem – niezauważalnie). Przy wybraniu opcji Tak (Bez duplikatów) wprowadzane wartości muszą być unikalne.
Tryb IME – stosowany jest tylko przy współpracy z językami azjatyckimi
Tagi – pole do wpisania tagu
Odnośnik – właściwość w drugiej zakładce.
Domyślnie jest to pole tekstowe, ale może być to pole listy lub kombi.
Po wybraniu Pola listy lub Pola Kombi konieczne jest ustalenie źródła wierszy. Może być być to lista wartości oddzielonych średnikami (np.tak; nie), a może być to lista pobrana z innej tabeli lub kwerendy.
Klikając na 3 kropki na końcu wiersza uruchamiany okienko siatki kwerendy, gdzie można zdefiniować źródło wierszy.
Może być to 1, ale może być to więcej kolumn. Ja najczęściej stosuję 2 kolumny: identyfikator oraz pole. Wówczas trzeba tylko pamiętać o zmianie liczby kolumn. A ponieważ nie zawsze zależy nam na tym, aby obie kolumny były widoczne – wystarczy ustawić szerokość kolumny do ukrycia na 0cm.
Efekt końcowy w tabeli wygląda tak:
Zamiast wpisywać ręcznie wartość do pola – wybieramy z listy.
Konieczne jest tu jednak zwrócenie uwagi na numer kolumny związanej. Na screenie powyżej jest to kolumna 1 i mimo, że jest niewidoczna, to faktycznie wartość z tej kolumny jest zapisana w tabeli.
Jak szybko skopiować dowolny plik? Sposobów jest kilka, jednym z nich jest wykorzystanie obiektu FileSystem.Object.
Służy do tego metoda FileSystem.Object.Copy Ma ona kilka parametrów wejściowych:
Object – nazwa obiektu zdefiniowanego jako obiekt FSO. Argument obowiązkowy.
Source – nazwa pliku do skopiowania. Argument obowiązkowy, ale dozwolone są znaki zastępcze w nazwie.
Destination – nazwa pliku po skopiowaniu. Argument obowiązkowy.
Overwrite – opcjonalny argument typu Boolean. Jeżeli kopiowany plik ma być zapisany pod nazwą już istniejącego pliku, wartość False nie skopiuje pliku. Domyślna wartość True, zastąpi plik plikiem kopiowany.
Przykładowy kod kopiujący plik może wyglądać tak:
Public Sub KopiujPlik() Dim FSO As Object Dim KopiowanyPlik As String
Dim NowyPlik As String
KopiowanyPlik= “C:\Wprawki\PrzykladowaBaza.accdb”
NowyPlik= “C:\NaBlogi\PrzykladowaBaza.accdb” Set FSO=CreateObject(“Scripting.FileSystemObject”)
FSO.Copy KopiowanyPlik, NowyPlik, True
Set FSO=Nothing End Sub
Scripting.FileSystemObject to obiekt służący do zarządzania plikami i folderami. Wprawdzie w kodzie VBA są dostępne proste i przyjemne funkcje Dir, MkDir itp., ale przy odwołaniach do folderów sieciowych niestety często zawodzą. Wówczas pozostaje wykorzystanie właśnie obiektu FileSystemObject, popularnie nazywanym FSO.
Tabele
miejsce, gdzie zapisywane są wszystkie dane.
Kwerendy
obiekty związane z filtrowaniem i sortowaniem danych, realizowane przez wysyłanie zapytań do tabel (kodem SQL). Są też kwerendy funkcjonalne automatycznie modyfikujące/usuwające/dodające dane tabel
Formularze
obiekty prezentujące dane na ekranie w przyjaznej formie graficznej. Oprócz danych można wstawiać różnego rodzaju obiekty typu przyciski, obrazy itp.
Raporty
podobnie jak formularze pozwalają prezentację danych, ale w formie przystosowanej do wydruku
Jak z poziomu aplikacji otworzyć określony folder na dysku? Sposobów jest kilka, jeden z nich to wykorzystanie funkcji Shell.
Public Sub OtworzFolder() Dim a Dim JSciezka As String
JSciezka = “C:\CWICZENIAFORA”
a = Shell(“explorer.exe ” & JSciezka, vbNormalFocus) End Sub
Po uruchomieniu kodu w aplikacji Access – w oddzielnym oknie Windows otwiera się folder zdefiniowany w zmiennej JSciezka, a kod VBA przechodzi do kolejnego kroku.
Funkcja VBA Shell to funkcja uruchamiająca inny program wykonywalny.
Ma 2 argumenty wejściowe:
PathName – argument obowiązkowy. Wartość typu String określająca nazwę programu do otwarcia;
WindowStyle – argument opcjonalny. Wartość typu Integer określająca widok okna uruchomionego programu.
Dostępne są tu następujące wartości:
0 (vbHide) – okno uruchomionego programu jest ukryte
1 (vbNormalFocus) – okno uruchomionego programu jest widoczne i ma fokus
2 (vbMinimizedFocus) – okno uruchomionego programu jest widoczne jako ikona i ma fokus
3 (vbMaximizedFocus) – okno uruchomionego programu jest maksymalnie powiększone i ma fokus
4 (vbNormalNoFocus) – okno uruchomionego programu jest widoczne, ale nie ma fokusu
6 (vbMinimizedNoFocus) – okno uruchomionego programu jest widoczne jako ikona i nie ma fokusu
Wartością domyślną jest tu 1 (vbNormalFocus)
W wyniku działania funkcji VBA otrzymujemy wartość typu Variant będącą identyfikatorem numeru zadania uruchomionego programu. Jeżeli uruchomienie programu się nie powiedzie – zwracana jest wartość 0.
Każdy tworzący aplikacje w Accessie ma swoje własne przyzwyczajenia i zasady tworzenia. Moim zdaniem nie ma jedynie słusznych rozwiązań, różne drogi prowadzą do tego samego celu. Owszem, są metody mniej lub bardziej optymalne, działające szybciej lub wolniej, ale najczęściej nawet nie widać różnicy, szczególnie przy prostych aplikacjach.
Ja też mam swoje przyzwyczajenia i sposoby tworzenia aplikacji – takie własne dobre praktyki. Może komuś się przyda?
nazwy tabel, kwerend i formularzy nie powinny mieć takich samych nazw. Wprawdzie od wersji chyba Access 2007 jest to możliwe, ale jeśli odwołujemy się do jakiegoś obiektu, lepiej wiedzieć czy chodzi tu o tabelę czy kwerendę. Jeśli mamy np. tabelę Spis – warto zapisać ją pod nazwą np.TbSpis, związaną z nią kwerendę – KwSpis, a formularz – FrSpis.
W podobny sposób – wszystkie inne obiekty. W ten sposób na pewno się nie zgubimy, nawet gdy obiektów jest dużo;
żadnych polskich literek w nazwach obiektów i nazwach pól. Teoretycznie tu też nie ma zakazu, ale wszystkie te ogonki mogą być źródłem problemów. Polskie znaki diaktryczne można za to wpisywać w tytułach kolumn, pól itp. Efekt końcowy np. na formularzu będzie taki sam, a unikamy w ten sposób ewentualnych błędów przy uruchomieniu aplikacji na komputerze w innej wersji językowej;
nazwy obiektów, pól itd. lepiej gdy są jednowyrazowe. Czyli zamiast np. Marka samochodu można wykorzystać nazwę MarkaSamochodu – to metoda zapisu „na wielbłąda”. Moim zdaniem dobrze się sprawdza;
wszystkie nieprzypisane formanty na formularzu (przyciski poleceń, pola kombi itp.) powinny mieć swoje własne nazwy mniej więcej opisujące ich zawartość. Zamiast Polecenie1, Polecenie2 … lepiej stosować nazwy typu PolecenieWyjscie, PolecenieWydruk itp. Przy większej ilości formantów na pewno w ten sposób się nie pogubimy;
nie jest to regułą, ale przy wprowadzaniu danych bardzo często stosuję pusty, niezwiązany formularz. Przy wypełnianiu poszczególnych pól stosuję kontrolę poprawności danych, a dopiero później wprowadzam dane do tabeli/tabel kodem VBA.
To takie podstawy. Ja wykorzystuję na co dzień i się sprawdzają.