Access/ makra.
Makra i akcje.
Makra to namiastka programowania ...
Makra to proste procedury składające się z sekwencyjnie (ale warunkowo)
wykonywanych akcji.
Obiekt klasy "makro" może zawierać kilka makr o różnych nazwach (makra
nazwane):
Nazwa makra |
Warunek |
Akcja |
Komentarz |
Moje makro A |
<warunek1> |
<akcja1> |
|
|
<warunek2> |
<akcja2> |
|
|
|
|
|
Moje makro B |
<warunek3> |
<akcja3> |
|
|
<warunek4> |
<akcja4> |
|
|
<warunek5> |
<akcja5> |
|
|
|
|
|
|
|
|
a teraz konkretne przykłady ... |
Sprawdź dane |
[imie i nazwisko] is null |
OknoKomunikatu |
wyświetla komunikat ostrzegawczy |
|
... |
AnulujZdarzenie |
anuluje zdarzenie |
|
... |
PrzejdźDoFormantu |
uaktywnia pole [imie i nazwisko] |
|
... |
ZatrzymajMakro |
|
|
[nr telefonu] is null |
OknoKomunikatu |
wyświetla komunikat ostrzegawczy |
|
... |
AnulujZdarzenie |
anuluje zdarzenie |
|
... |
PrzejdźDoFormantu |
uaktywnia pole [nr telefonu] |
|
... |
ZatrzymajMakro |
|
|
|
|
|
Uwaga: Napis "..." w kolumnie Warunek oznacza "ten sam warunek co
wyżej".
Dla każdej akcji można określić szczegółowe argumenty akcji
w dolnej części okna
(klawisz F6).
W makrach są dostępne m.in. następujące akcje:
Nazwa angielska |
Nazwa polska |
Argumenty |
|
OpenForm |
OtwórzFormularz |
Nazwa formularza,
Widok,
Nazwa filtru,
Warunek Where,
Tryb danych |
otwiera formularz podany w "argumentach" |
Requery |
PonówKwerendę |
Nazwa formantu |
odświeża listę pola kombi czerpiącą dane z tabeli/kwerendy |
... oraz cała masa innych ... |
W pomocy można szukać opisu akcji posługując się angielską nazwą;
oto spis nazw wszystkich akcji wyciągnięty z pomocy programu Access 2.0 :
![](pwsb_b23.gif)
Zdarzenia.
Makra są często używane jako reakcja na zdarzenie związane z
pewnym obiektem (kontrolką, formularzem itp).
Typ obiektu |
Zdarzenia |
kiedy się pojawia |
kontrolka kombi |
Przy wejściu |
przy wejściu do kontrolki (np klawiszem TAB) |
Przy zmianie |
po zmianie zawartości kontrolki |
Przy aktualizacji |
po zmianie wartości pola z którym kontrolka jest związana
(czyli przy próbie wyjścia z kontrolki po modyfikacji jej zawartości) |
formularz |
Przed aktualizacją
(ang. BeforeUpdate) |
przed aktualizacją rekordu; można anulować tę aktualizacje
przy pomocy akcji AnulujZdarzenie |
kontrolka przycisk polecenia |
Przy kliknięciu |
po kliknięciu myszą na guzik (lub naciśnięciu "z
klawiatury" klawiszem spacja) |
Obsługę zdarzeń definiuje się w okienku Właściwości (zakładka
"Zdarzenia") danego obiektu.
Uwaga: krótkie opisy zdarzeń widać w linii statusu gdy postawimy kursor na
danym zdarzeniu w okienku Właściwości !.
Makro "Sprawdź dane" nadaje się do kontroli
poprawności danych wprowadzonych do formularza (sprawdza się czy pole [imie i
nazwisko] oraz [nr telefonu] mają niepustą wartość, jeśli nie to nie da się
zmodyfikować rekordu). Makro to powinno obsługiwać zdarzenie "Przed
aktualizacją" formularza.
.......................................................................
Podsumowanie pojęć związanych z makrami:
- obiekt klasy "makro"; makra nazwane
- akcja; argumenty akcji
- zdarzenia
|
Zadanie 13
Utwórz pusty formularz niezwiązany (z żadną tabelą) i dodaj do niego guzik
którego naciśnięcie powoduje wyświetlenie komunikatu "A ku ku !" (poza tym guzik
ten niczego sensownego nie robi); użyj akcji OknoKomunikatu.
Zadanie 13a
Do formularza "Klienci" magazynowej bazy danych dodaj kontrolę poprawności
wprowadzonych danych przy pomocy makra "Sprawdź dane".
- ma to być obsługa zdarzenia "Przed aktualizacją" [ang. BeforeUpdate] formularza Klienci, tak
więc makro będzie wyzwalane dopiero gdy nastąpi próba aktualizacji rekordu
- sprawdzaj czy [imię i nazwisko] oraz [adres] są prawidłowo wypełnione
(np. czy są niepuste)
Nazwa makra |
Warunek |
Akcja |
Komentarz |
Sprawdź dane |
[imie i nazwisko] is null |
OknoKomunikatu |
wyświetla komunikat ostrzegawczy |
|
... |
AnulujZdarzenie |
anuluje zdarzenie |
|
... |
PrzejdźDoFormantu |
uaktywnia pole [imie i nazwisko] |
|
... |
ZatrzymajMakro |
|
|
[adres] is null |
OknoKomunikatu |
wyświetla komunikat ostrzegawczy |
|
... |
AnulujZdarzenie |
anuluje zdarzenie |
|
... |
PrzejdźDoFormantu |
uaktywnia pole [adres] |
|
... |
ZatrzymajMakro |
|
|
|
|
|
Wprowadzanie danych poprzez kwerendę.
Zadanie 14
Do magazynowej bazy danych dodaj:
- zbiór encji "Kategorie"
- związek "TowaryKategorii"
Uwaga: zakładamy że do każdej kategorii należy kilka towarów ale i
jeden towar może należeć równocześnie do kilku kategorii (czyli związek
TowaryKategorii jest typu "wiele do wielu").
Następnie utwórz kwerendę TK1 zawierającą następujące pola:
[nazwa towaru], [id towaru], [nazwa kategorii], [id kategorii]
Uwaga: [id towaru] i [id kategorii] MUSZĄ pochodzić z tabeli
TowaryKategorii !.
Następnie otwórz Towary, Kategorie, TowaryKategorii, TK1 (tak jak to pokazano
na poniższym obrazku) i spróbuj wprowadzić poprzez kwerendę TK1
następujące dane:
- nowy związek miedzy towarem i kategorią (istniejący w tabeli towar i
istniejąca kategoria); innymi słowy stwierdzamy że dany towar należy do pewnej
kategorii
- nowy towar i nic więcej (po wpisaniu nowej nazwy towaru odśwież TK1 -
Shift+F9)
- nową kategorie oraz związek między tą nową kategorią i istniejącym towarem
- nowy towar, nową kategorię oraz związek między nimi (tj stwierdzamy że
nowy towar należy do nowej kategorii)
Każdorazowo po wprowadzeniu danych do kwerendy TK1 sprawdź co się zmieniło w
tabelkach ! (odświeżanie - Shift+F9).
![](pwsb_b61.gif)
(Koniec zadania 14)
Access/ złożone formularze.
Okazuje się że "model formularz/podformularz" nie zawsze jest wystarczający
...
Przykładowo, po dodaniu do magazynowej bazy danych "kategorii" (jak w zadaniu
14) można w prosty sposób wprowadzać kategorie i towary bieżącej kategorii (w
podformularzu), ale jak wprowadzić informacje że dany towar należy także do
innych kategorii ???
[na to pytanie odpowiadamy w poniższych zadaniach]
Zadanie 15
W magazynowej bazie danych z kategoriami:
- Utwórz formularz do wprowadzania towarów "wg kategorii"
(czyli najpierw wprowadzamy kategorię, a potem
towary należące do tej kategorii - wprowadzamy je tabelce).
- Ponadto powinna istnieć możliwość dołączania dodatkowych kategorii do
bieżącego towaru.
Całość powinna wyglądać mniej więcej tak:
![](pwsb_b27.gif)
Wskazówki do zadania 15:
- podformularz z towarami na formularzu Kategorie powinien mieć postać tabelaryczną;
zauważmy że w tabeli Towary nie ma pola [id kategorii] tak więc podformularz z
towarami powinien(?) być oparty na kwerendzie TK1 złączającej tabele Towary, TowaryKategorii i Kategorie;
Uwaga: kwerenda TK1 powinno zawierać pola:
[nazwa towaru]
[id towaru] (z tabeli TowaryKategorii
!)
[nazwa kategorii]
[id kategorii] (z tabeli
TowaryKategorii !)
- na formularzu Kategorie powinien być guzik którego uruchomienie powoduje
otwarcie nowego formularza, na którym jest lista kategorii bieżącego towaru;
formularz otwieramy makrem z akcją OtwórzFormularz, z argumentem WHERE
wybierającym tylko kategorie bieżącego towaru; do tego argumentu wpisz:
[id towaru]=Forms!Kategorie!TK1.Form![id
towaru]
gdzie TK1 to (także) nazwa podformularza z towarami
- wypróbuj działanie wyrażenia z Forms w okienku Immediate
(uaktywnianym przez Ctrl+G); można w nim obliczać wartości wyrażeń przy pomocy
komendy "?", np:
? Forms!Kategorie!TK1.Form![id towaru]
- formularz DodatkoweKategorie nie powinien pozwalać na "bieganie" po tabeli
Towary !
w tym celu wyłącz mu guziki nawigacyjne, selektor rekordu oraz możliwość
dodawania/ usuwania rekordów, trzeba zostawić włączoną możliwość modyfikowania
Zadanie 15a
(To jest ulepszona wersja zadania 15 !)
W magazynowej bazie danych z kategoriami:
- Utwórz formularz do wprowadzania towarów "wg kategorii" o nazwie
"Kategorie".
Jego działanie polega na tym że najpierw określamy kategorię a potem wprowadzamy
towary tej kategorii.
- Powinna także istnieć możliwość dołączania dodatkowych kategorii do danego towaru.
- Towary bieżącej kategorii można wprowadzać na dwa sposoby:
- w kolumnie "nowy towar" (wpisujemy
nową nazwę towaru, jest modyfikowana tabela Towary)
- w kolumnie "towar z listy"
(wybieramy istniejący towar z tabeli Towary)
W formularzu "Dodatkowe kategorie" także istnieją dwa analogiczne sposoby
przyporządkowywania kategorii do towaru.
Całość powinna to wyglądać tak:
![](pwsb_b34.gif)
Wskazówki do zadania 15a:
- Poeksperymentuj z formularzem "Kategorie <--" w bazie
bd04_2002.mde. (plik .mde różni się od .mdb tym że
nie można wejść do formularza w trybie projektowania).
- Podformularz z towarami na formularzu Kategorie (o nazwie "Kategorie
podformularz") powinien mieć postać tabelaryczną;
należy oprzeć ten podformularz na
kwerendzie TK1 złączającej tabele Towary, TowaryKategorii
i Kategorie;
TK1 powinno mieć pola:
nazwa towaru, id towaru, nazwa
kategorii, id kategorii
przy czym pola id* pochodzą z tabeli TowaryKategorii (dzięki czemu można
poprzez TK1 dodawać istniejące towary);
istnieje możliwość wprowadzania nowego
towaru oraz wybierania towaru z listy;
wprowadzanie nowego towaru uzyskujemy przez zwykłą kontrolkę tekstową związaną
z polem [nazwa towaru];
wybieranie towaru z listy uzyskujemy przy pomocy pola kombi czerpiącego
dane z tabeli Towary i związanego z polem [id towaru].
- Na formularzu Kategorie powinien być guzik "Dodatkowe kategorie" którego uruchomienie powoduje
otwarcie nowego formularza na którym jest lista kategorii bieżącego towaru;
formularz otwieramy makrem z jedną akcją OtwórzFormularz, z argumentem WHERE
wybierającym tylko kategorie bieżącego towaru; do tego argumentu wpisz:
[id towaru]=Forms!Kategorie![Kategorie podformularz].Form![id
towaru]
(ścieżka Forms... jest to sposób na
odwołanie się do wartości kontrolki na podformularzu!).
- Wypróbuj działanie wyrażenia z Forms w okienku Immediate
(uaktywnianym przez Ctrl+G); można w nim obliczać wartości wyrażeń przy pomocy
komendy "?", np:
? Forms!Kategorie![Kategorie podformularz].Form![id
towaru]
- Formularz "Dodatkowe kategorie" nie powinien pozwalać na "bieganie" po tabeli
Towary !;
w tym celu wyłącz mu guziki nawigacyjne, selektor rekordu oraz możliwość
dodawania/ usuwania rekordów, trzeba zostawić włączoną możliwość modyfikowania
rekordu aczkolwiek można wyłączyć tę możliwość w kontrolkach;
- W formularzy "Dodatkowe kategorie"
można wprowadzać dodatkowe kategorie bieżącego towaru na dwa sposoby (nowa
kategoria lub kategoria z listy), analogicznie jak na formularzy Kategorie
- Dodaj możliwość wybierania bieżącej kategorii z listy (okienko "znajdź
kategorię");
w tym celu do niezwiązanej kontrolki kombi dodaj obsługę zdarzenia "Po
aktualizacji" przy pomocy następujących makr:
PrzejdźDoFormantu
'''
przechodzi do kontrolki [id kategorii]
ZnajdźRekord
''' działa
jak wyszukiwanie przy pomocy menu Edycja | Znajdź
PrzejdźDoFormantu
''' wraca do
kontrolki kombi
Zadanie 16
Do formularza Klienci (służącego do wprowadzania klientów i ich zamówień)
dodaj nową możliwość:
- Podczas wybierania towaru na zamówieniu bieżącego klienta, najpierw wybiera się jego kategorie, a potem spośród
towarów tej kategorii wybiera się konkretny towar.
Powinno to wyglądać tak:
![](pwsb_b35.gif)
Można zobaczyć jak to powinno działać w bazie bd04_2002.mde
na formularzu "Klienci 2 <--".
Wskazówki do zadania 16:
- Źródło wierszy kontrolki kombi "Towar wybranej kategorii" może być poleceniem SELECT SQL-a;
we frazie WHERE tego polecenia można porównywać zawartość pewnej kontrolki niezwiązanej
formularza z polem tabeli;
Uwaga: jako źródła wierszy kontrolki kombi można także użyć kwerendy z
parametrem (nazwa parametru = nazwa kontrolki niezwiązanej na formularzu)
przykład:
polecenie SQL zwracające tabelę zawierającą towary na które złożył
zamówienie klient,
którego "id klienta" znajduje się w kontrolce o nazwie [kontrolka
z id klienta]
SELECT Towary.*
FROM Towary INNER JOIN Zamowienia ON Towary.[id towaru] =
Zamowienia.[id towaru]
WHERE (((Zamowienia.[id klienta])=[kontrolka
z id klienta]));
Uwaga 2: gdy przechodzimy (klawiszem TAB) do kontrolki kombi czerpiącej
dane z kwerendy, to dane te NIE SĄ uaktualniane (kwerenda nie jest
uruchamiana); dlatego należy zdefiniować obsługę zdarzenia "Przy wejściu"
makrem zawierającym akcję PonówKwerendę dla kontrolki kombi ...
- Gdy wybrana kategoria jest pusta to kontrolka "Towar wybranej kategorii"
powinna pokazywać wszystkie towary (uwzględnij to w poleceniu SQL z którego ta
kontrolka kombi czerpie dane)
Obliczenia na formularzu.
Na formularzu można przeprowadzać obliczenia ...
- w tym celu używamy kontrolek niezwiązanych (niezwiązanych z
polem tabeli na której formularz jest oparty)
- w polu źródło formantu można wstawić dowolne wyrażenie, np:
=[cena]*1,1
- można używać funkcji agregujących, np:
=Suma([ilosc])
grupa rekordów na której działa funkcja agregująca zależy od:
- sekcji w której kontrolka z funkcją jest umieszczona:
- nagłówek/stopka formularza: agreguje się wszystkie rekordy tabeli na
której formularz jest oparty
- nagłówek/stopka strony: obliczenia prowadzi się tylko dla rekordów na
bieżącej stronie
- szczegóły: obliczenia dotyczą tylko bieżącego rekordu
- jeśli kontrolka jest na podformularzu to obliczenia dotyczą tylko
rekordów które są dostępne w tym podformularzu (znajdującym się wewnątrz
formularza głównego)
- można używać funkcji agregujących domenowych, np:
=DSum("cena"; "Towary"; "[id towaru]=1 or [id towaru]=2")
=DLookUp("wartosc";"[na uzytek DSum]";"[id klienta]=Forms!Klienci![id
klienta]")")
''' funkcja DLookUp wyciąga wartość
pola z rekordu wybranego przez 3 parametr
ogólna postać funkcji agregującej domenowej:
=Funkcja(pole, tabela/kwerenda, warunek)
Zadanie 17
Spróbuj ulepszyć formularz Klienci, tak aby w czasie wprowadzania danych
pokazywał:
- cenę jednostki towaru (zamówienie na który wprowadzamy)
- łączną ilość zamówionych towarów
- łączną wartość zamówionych towarów
Sprawdź czy wszystko się poprawnie oblicza !.
Formularz powinien wyglądać tak:
![](pwsb_b29.gif)
Wskazówki do zadania 17:
Jak odczytać cenę towaru skoro nie ma jej w tabeli Zamówienia na której jest
oparty podformularz Zamówienia ?
Odp: =DLookUp("cena";"Towary";"[id towaru]=Forms!Klienci!PodformZam.Form![id
towaru]")
Jak obliczyć łączną wartość zamówień bieżącego klienta ?
Odp: trzeba będzie użyć pomocniczej kwerendy która dla każdego klienta oblicza
łączną wartość jego zamówień i następnie wyciągać odpowiednią wartość z tej
kwerendy przy pomocy funkcji DLookUp()