W wykładzie 10 rozpoczyna się nauka programowania aplikacji
bazodanowych. Zostają
wprowadzone podstawowe pojęcia takie jak procedura, moduł, moduł
klasy, zdarzenie i
obsługa
błędów. Obiekty graficznego interfejsu użytkownika stają się obiektami języka
programowania, które mają swoje właściwości w tym metody. Pokazane jest użycie
edytora kodu i nawigatorów po dostępnych klasach obiektów. Pokazane
jest jak synchronizować ze sobą wyświetlane formularze. Przedstawiona
jest lista najważniejszych zdarzeń, które są oprogramowywane przy tworzeniu
aplikacji bazodanowej.
Na przykład, na formularzu można umieścić zbiór przycisków, po których naciśnięciu użytkownik uzyskuje:
wyświetlenie tekstu pomocy;
wyświetlenie innego formularza;
zamknięcie danego formularza;
wydrukowanie zawartości formularza;
Visual Basic for
Applications (w skrócie VBA) jest językiem programowania dla aplikacji systemu Microsoft
Office będący podzbiorem języka
Visual Basic. Oto jego cechy:
Moduł jest zbiorem deklaracji i definicji procedur języka VBA przechowywanych razem jako całość.
Access | Visual Basic | Wartość domyślna |
Text | String | "" |
Number | Integer, Long, Double, Single | 0 |
Currency | Currency | 0 |
Yes/No | Boolean | False |
Date/Time | Date | 30.12.1899 |
Specjalny typ danych Visual Basic - Variant - oznacza dowolny typ wartości.
Domyślnie wszystkie argumenty przy wywoływaniu procedury są przekazywane metodą
przez referencję. Dzięki temu w kodzie procedury operujemy na rzeczywistej zmiennej, którą przekazujemy jako parametr.
Alternatywnie można przekazywać argument przy wywoływaniu procedury metodą przez wartość – poprzedzając w deklaracji procedury nazwę parametru słowem kluczowym
ByVal. Przy wywołaniu oblicza się wartość argumentu i przekazuje do kodu procedury właśnie tę wartość. Jeśli argumentem jest zmienna, wartość tej zmiennej nie ulega zmianie przy wykonywaniu kodu.
Naukę programowania aplikacji bazodanowej będziemy prowadzić na przykładach.
Przykład 1
Typowym zadaniem programistycznym jest obliczanie pierwiastka kwadratowego z liczby nieujemnej. Oto jego zapis w postaci funkcji Visual Basic.
Function SquareRoot (X As Double) As Double
|
W przypadku wywołania funkcji, gdy nie nastąpi przypisanie wartości do nazwy funkcji SquareRoot, system przypisze wartość 0.
Teraz zadanie do rozwiązania dla czytelnika:
Napisz procedurę rozwiązującą równanie kwadratowe o współczynnikach rzeczywistych. Uruchom tę procedurę w MS Access. |
Przykład 2
Pokażemy na tym przykładzie deklaracje i definicje modułu. Opcje:
są zwykle domyślnie przyjmowane przez system.
Option Compare Database
|
W MS Access jest dostęny edytor kodu Visual Basic (Visual
Basic Editor) – zawierający środowisko uruchamiania kodu
VBA.
Okno analizy programu (Immediate Window) – uruchamiane przez sekwencję klawiszy CTRL-G lub z menu Widok "View -> Immediate Window" - daje możliwość wykonywania kodu (instrukcji, metod, funkcji i procedur) oraz sprawdzania wartości wyrażeń, pól i właściwości – pisząc w pojedynczym wierszu np.
? licznik |
gdzie licznik jest zmienną, której wartość chcemy wypisać.
Na ogół jednej klasie odpowiada dokładnie jeden obiekt tej klasy (obiekt klasy – class object).
Przykład 3
Sprawdzanie, czy dany formularz jest otwarty w widoku Formularz - rozwiązanie używające standardowej funkcji SysCmd.
Function Otwarty(ByVal Mój As String) As Integer
|
Zwróćmy uwagę na to, że odróżniamy klasę danego formularza łącznie z arkuszem jego właściwości od konkretnych jego wcieleń widocznych na ekranie, na których możemy wykonywać operacje w kodzie VBA. Wcielenie to nazywamy obiektem danego formularza lub w skrócie po prostu formularzem. Możemy więc powiedzieć, że otwarte formularze są obiektami klas swoich formularzy. Do obiektu formularza o nazwie Pracownicy można się odwoływać w następujący sposób:
Forms![Pracownicy]
Forms("Pracownicy")
Forms(numer)
gdzie numer jest numerem przyporządkowanym danemu formularzowi w
sesji.Używając dostępu kropkowego możemy odwoływać się do właściwości obiektu formularza a także do jego metod np.
Forms![Pracownicy].Caption
zwraca tytuł
formularza,Forms![Pracownicy].SetFocus
jest metodą,
której wykonanie przenosi fokus do tego formularza.Wykrzyknik ! oznacza wybór elementu z kolekcji. Np.
Forms![Pracownicy]
- wybór formularza z kolekcji
wszystkich formularzy,Forms![Pracownicy]![Nazwisko]
- wybór
pola Nazwisko z kolekcji wszystkich obiektów związanych z formularzem
Pracownicy.Reasumując:
Zapis Forms![Pracownicy]![Nazwisko]
oznacza
także domyślnie wartość pola tekstowego Nazwisko czyli konkretne nazwisko –
alternatywnie można używać pełnej notacji:
Forms![Pracownicy]![Nazwisko].Value |
Przy wpisywaniu do pola tekstowego lub listowego, bieżącą wartość – jeszcze nie zapisaną do bazy danych – uzyskuje się przy użyciu:
Forms![Pracownicy]![Nazwisko].Text |
Przy odczytywaniu wartości atrybutu Text fokus (bieżący kursor) musi znajdować się na danym polu:
[Nazwisko].SetFocus |
Sprawdzenie czy formularz jest otwarty (w widoku Projekt lub Formularz) można zrealizować jeszcze w inny sposób – przeglądając kolekcję wszystkich otwartych formularzy i sprawdzając ich nazwy.
Function Otwarty1 (ByVal Mój As String) As Integer |
Jest możliwość tworzenia instancji klasy formularza w kodzie VBA:
Dim Kopia As New Form_Osoby
i wykonywanie na niej operacji jak na obiekcie. Instancja ta nie jest widoczna na ekranie.
Przykład 4
Kolejna procedura specyfikuje reakcję na zdarzenie naciśnięcia lewego przycisku myszy (obiekt: przycisk Witaj, zdarzenie: Przy kliknięciu).
Private Sub Witaj_Click()
|
Przykład 5
Zwróćmy uwagę na procedurę, jaką tworzy kreator przycisków w celu zrealizowania zadania otwarcia formularza o nazwie Osoby:
|
DoCmd.OpenForm "Osoby"
zawierająca wywołanie metody OpenForm
wbudowanego obiektu o nazwie DoCmd, powoduje otwarcie formularza Osoby.W powyższej procedurze można byłoby standardowy tekst błędu Err.Description zastąpić własnym tekstem skierowanym do użytkownika aplikacji:
MsgBox "Błąd aplikacji. Skontaktuj
się z administratorem aplikacji" |
Teraz zadanie do rozwiązania dla czytelnika:
Korzystając z obsługi błędów napisz funkcję spawdzającą czy formularz o nazwie będącej argumentem procedury jest otwarty (w widoku Projekt lub Formularz). |
Przykład 6
Otwarcie formularza może być bardziej skomplikowane, aby mogło wystarczyć użycie samego kreatora przycisków np. procedura otwierająca formularz Uczestnictwo w projektach w oparciu o wartość znajdującą się w polu Numer będącym częścią podformularza przy czym sam przycisk Projekty znajduje się w głównym formularzu Departament.
Procedura otwiera formularz Uczestnictwo w projektach w celu pokazania uczestnictwa w projektach wybranej aktualnie osoby (w podformularzu):
Private Sub Projekty_Click() |
Przykład 7
Formularz Uczestnictwo w projektach powinien pokazywać dane o aktualnie rozpatrywanym pracowniku z podformularza w formularzu Departament. Uaktualnienie wartości następuje przy pojawieniu się nowego rekordu w podformularzu czyli jako reakcja na zdarzenie Przy bieżącym. Przy czym to uaktualnienie ma sens, tylko wtedy gdy użytkownik wcześniej otworzył formularz Uczestnictwo w projektach naciskając przycisk Projekty. Z kolei naciśnięcie przycisku Projekty ma sens tylko wtedy, gdy pole Numer w podformularzu jest niepuste.
W poniższej procedurze występują dwie nowe właściwości, których wartościami są obiekty:
Private Sub Form_Current()
|
Uaktualnienie formularza Uczestnictwo w projektach jest konieczne nie tylko wtedy, gdy fokus w podformularzu przejdzie do nowego rekordu, ale również gdy w bieżącym rekordzie zmieni się wartość pola Numer. Realizuje to procedura zdarzenia Po aktualizacji dla pola Numer - jej kod jest analogiczny do procedury zdarzenia Przy bieżącym.
Teraz zadanie do rozwiązania dla czytelnika:
Utwórz dwie tabele Instytucje i Pracownicy połączone związkiem jeden do wiele. Każda instytucja zatrudnia wielu pracowników; każdy pracownik jest zatrudniony w jednej instytucji. Utwórz dwa formularze: „Instytucja”, na którym są wyświetlane dane o instytucjach, oraz „Pracownicy” na którym są wyświetlane dane o pracownikach. Chcemy, aby na życzenie użytkownika poprzez naciśnięcie przycisku „Pracownicy instytucji” na formularzu „Instytucja” otwierał się formularz wyświetlający pracowników danej instytucji. Chcemy aby przy chodzeniu po rekordach formularza „Instytucja” aktualizowały się dane o pracownikach zatrudnionych w danej instytucji – oczywiście o ile wcześniej użytkownik otworzył stowarzyszony formularz „Pracownicy”. Jakie zdarzenia należy oprogramować i jaka jest ich treść? |
I jeszcze jedno zadanie do rozwiązania dla czytelnika:
Czy Twoje rozwiązanie umożliwia wprowadzanie pracowników do otwieranego z formularza Instytucje formularza Pracownicy? Jakie zdarzenia dla formularza Pracownicy należy oprogramować i jaka jest ich treść? |
Rozważymy kolejno zdarzenia dla obiektów interfejsu użytkownika (formularzy, raportów, elementów dialogowych) - które najczęściej są oprogramowywane przy pomocy procedur zdarzeń.
Private Sub Form_Open(Cancel As Integer)
hasło " |
Private Sub Form_Load() |
Private Sub Form_Current() |
Private Sub Form_Delete(Cancel As Integer) |
Przy kliknięciu - Click (formularza, elementu dialogowego) - przy naciśnięciu i zwolnieniu lewego przycisku myszy. Np. naciśnięcie przycisku.
Private Sub cmdClickMe_Click() |
Private Sub Nazwisko_GotFocus() |
Private Sub txtPass_Exit(Cancel As Integer) |
- bez wstrzymywania wyjścia:
Private Sub txtPass_LostFocus() |
Teraz zadanie do rozwiązania dla czytelnika:
W tym ćwiczeniu przetestujesz działanie procedur zdarzeń. Zdefiniuj tabelę o dwóch kolumnach: id typu Autonumber (klucz główny) oraz liczba typu Integer. Zbuduj formularz oparty na tej tabeli. Oprogramuj wszystkie zdarzenia tego formularza wpisując jako treść procedury zdarzenia instrukcję MsgBox z argumentem będącym nazwą zdarzenia. Przetestuj korzystanie z formularza (otwieranie, wprowadzanie danych, aktualizację danych, usuwanie danych, przechodzenie po rekordach, zamykanie). Rozpocznij od zdarzeń omówionych na wykładzie. Przetestuj działanie formularza. Potem wprowadzaj procedurę zdarzenia kolejnego zdarzenia testując jego zachowanie. Czy pojawiające się na ekranie napisy o zachodzących zdarzeniach są zgodne z Twoimi oczekiwaniami? |
Funkcja DLookUp umożliwia sprowadzenie z bazy danych pojedynczej wartości. Np.
=DLookUp("[Nazwa]";"[Departament]";"[Id]=Forms![Osoba]![Id]")
Ten sam efekt można byłoby uzyskać opierając formularz na kwerendzie złączającej zamiast na tabeli.
Za pomocą funkcji DLookUp można do pola formularza wprowadzać wartości obliczane przez kwerendę wybierającą - wystarczy najpierw zdefiniować taką kwerendę np. Zap_max jako
SELECT IIf(IsNull(Max([Numer])),1,Max([Numer])+1) AS Maks
FROM Osoba;
a następnie użyć kwerendy jako źródła dla pola na formularzu:
=DLookUp("[Maks]";
"Zap_max")
Metodę tę można zastosować więc do generowania jednoznacznych
numerów dla kluczy.
W wykładzie zostały wprowadzone
podstawowe pojęcia programowania aplikacji bazodanowych takie jak procedura,
moduł, zdarzenie i obsługa
błędów. Obiekty graficznego interfejsu użytkownika to obiekty języka
programowania, które mają swoje właściwości w tym metody. Czytelnik nauczył się posługiwać
edytorem kodu VBA i programować procedury zdarzeń.
procedura - podstawowa jednostka kodu języka programowania Visual
Basic for Applications (VBA). Są dwa rodzaje procedur: podprogramy
(Sub) i funkcje (Function).
moduł - zbiór deklaracji i definicji procedur języka VBA
przechowywanych razem jako całość. Są dwa rodzaje modułów: moduły
klas obiektów i moduły ogólne.
zdarzenie - sytuacja jaka może wystąpić w trakcie
realizacji aplikacji, dla której programista może przygotować specjalną obsługę
np. w postaci procedury zdarzenia.
DLookUp - funkcja DLookUp umożliwia sprowadzenie
z bazy danych pojedynczej wartości lub wykonanie zapytania zwracającego
pojedynczą wartość.
Strona przygotowana przez Lecha Banachowskiego - 10/25/03 .