JULITTA KOROL
PROGRAMOWANIE
w ACCESS
Do książki/czasopisma zayłączony jest
CDROM
DYSKIETKA
KASETA
.
9
1
860259 C1J
J>2>
^003
Projekt okładki: Grzegorz Ławniczak
Redakcja. Renata Kajewska Skład komputerowy: Dariusz Różański
Książkę rozpoczyna szybkie wprowadzenie do programowania w języku Visual Basic for Applications (Rozdział 1). Dalej omówiono zasady tworzenia i manipulowania bazami danych przy użyciu obiektów DAO oraz korzystanie
z obiektów ADO.
W kolejnych rozdziałach autorka omawia posługiwanie się językiem
SQL/DDL, programowanie zdarzeń w formularzach i raportach oraz
kierowanie bazą danych Access z poziomu przeglądarki internetowej.
Doświadczenie autorki z językiem VBA i zastosowaniami baz danych
gwarantują przejrzysty wykład oraz praktyczne przykłady
wzięte z życia:
Dołączona do książki płyta CD zawiera przykładowe procedury i pliki pomocnicze wymagane podczas wykonywania ćwiczeń i przykładów
zawartych w książce.
Zastrzeżonych nazw firm i produktów użyto w książce wyłącznie w celu identyfikacji.
Copyright © Wydawnictwo MIKOM 2003
Wszystkie prawa zastrzeżone. Reprodukcja bez zezwolenia zabroniona.
Wydawca nie ponosi odpowiedzialności za ewentualne szkody powstałe przy
Wydawca
ISBN 83-7279-288-7 Warszawa, luty 2003
BUW-EO- 03/5^1
wykorzystaniu za#«rtyctrw-książce informacji.
Spis treści
.
Wstęp 17
Organizacja i układ książki 17
Rozdział 1 - Wstęp do programowania VBA w Microsoft Access 2000 17
Rozdział 2 - Tworzenie i manipulowanie bazami danych przy użyciu DAO 18
Rozdział 3 - Tworzenie i manipulowanie bazami danych za pomocą ADO 19
Rozdział 4 - Programowanie przy użyciu języka DDL 19
Rozdział 5 - Programowanie zdarzeń w formularzach i raportach 20
Rozdział 6 - Microsoft Access w przeglądarce internetowej 20
Jak korzystać z tej książki? 21
Rozdział 1 23
Wstęp do programowania VBA w Microsoft Accesie 2000 23
Procedury i moduły . 23
Typy procedur 24
Typy modułów 24
Zdarzenia, właściwości zdarzeń oraz procedury zdarzeń 25
Procedura zdarzenia krok po htoku ...;.. 28
Podsumowanie -••■•'.*;■- 31
Okno edytora Visual Basic (VBE) '.S-.■'-,-. 33
Okno eksploratora projektów ... 33
Okno właściwości.. i 35
Okno Kod programu 36
Inne okna na ekranie edytora Visual Basic 38
Pomoc w sporządzaniu kodu procedur 39
Polecenie Wyświetl właściwości/metody 39
Polecenie Informacje o parametrze 41
Polecę
nie wyświetl stałe
Polecenie Szybkie informacj
Polecenie Dokończ wyraz. Polecenia Zwiększ/zmniei
Polecer
wcięcie.
Oznaca
Korzystanie
z biblioteki obiektów
VBA
Korzystanie
z okna Instrukcje bezpośrednie..
Podsumowanie
Zmienne,
typy danych oraz stałe
Czym są zmienne
Typy danych
Tworzenie zmiennych
Deklarowanie zmiennych
Określanie typu zmiennej
zmiennym
Przypisywanie wartos'ci
Wymuszone deklarowanie zmiennych
Zasięg zmiennych
Trwał,
°sc zmiennych.
Użycie
statycznych.
Zmienne obiektów,
Zmienne
na poziomie procedury (zmienne lokalni;)...
Zmienne
na poziomie modułu
Stałe
Wyszukiwanie definicji zmiennej.... Jaki typ danych zawiera zmienna.... Użycie starych w procedurach VBA.
Podsu Przekazywanie
wewnętrzne.
m owanie
tnie argumentów do procedur oraz funkcji. Sporządzanie funkcji.
S pis treści 5
P rzekazywanie argumentów 86
Użycie argumentów opcjonalnych 88
Wbudowane funkcje 90
Użycie funkcji MsgBox 91
Zwracanie wartości przez funkcję MsgBox 100
Użycie funkcji InputBox 101
Zamiana typu danych uzyskanych w wyniku funkcji InputBox 104
Użycie procedur głównych oraz procedur podrzędnych 106
Podsumowanie 110
Podejmowanie decyzji w VBA 111
Struktura If...Then 112
Decyzje oparte na więcej niż jednym warunku 115
Formatowanie instrukcji blokowych If 117
Struktura If...Then...Else 118
Struktura If...Then...Elself 120
Zagnieżdżanie struktur If...Then 122
Struktura Select Case 123
Użycie słowa kluczowego Is z klauzulą Case 126
Określenie przedziału wartości w klauzuli Case 127
Kilka warunków w klauzuli Case 128
Podsumowanie 129
Powtarzanie czynności w Visual Basicu 131
Pętle Typu Do-Do... While oraz Do...Until 131
Pętla For...Next 136
Pętla For Each...Next 138
Wczesne opuszczanie pętli 140
Zagnieżdżanie pętli 141
Podsumowanie 142
Praca z tablicami 143
Deklarowanie tablicy 146
6 Programowanie w Access i
D eklaracja zmiennych tablicowych
Górna i dolna granica tablicy
Użycie tablic w procedurach VBA
Tablice i pętle
Użycie tablic dwuwymiarowych
Tablice statyczne i dynamiczne ]
Funkcje typu Array 1
Funkcja Array 1
Funkcja IsArray 1
Funkcja Erase 1
Funkcje LBound i UBound 1
Błędy w tablicach 1:
Użycie ParamArray z tablicami 1(
Podsumowanie 1(
Kolekcje obiektów i klasy 16
Terminologia 16
Praca z kolekcjami obiektów 16
Deklarowanie własnej kolekcji 16
Dodawanie elementów do kolekcji 16!
Usuwanie elementów z kolekcji 16<
Wstaw moduł czy moduł klasy 17C
Tworzenie własnych obiektów 170
Praca w module klasy 171
Deklaracje zmiennych 171
Pobieranie i ustawianie właściwości obiektu .-... j 172
Tworzenie procedur Property Get 173
Tworzenie procedur Property Let 174
Tworzenie metod obiektu 175
Tworzenie instancji klasy , 176
Procedury zdarzeń w klasie modułu 177
Spis treści 7
T worzenie interfejsu użytkownika 178
Śledzenie toku procedur VBA 190
Podsumowanie 193
Śledzenie toku procedur VBA i pułapkowanie błędów 195
Testowanie procedur VBA 196
Zatrzymywanie procedury 197
Ustawianie punktów przerwania 198
Użycie okna Instrukcje bezpośrednie w trybie przerwania 204
Praca w oknie Kod programu w trybie przerwania :.'. 205
Użycie instrukcji Stop 206
Sprawdzanie wartości zmiennych (dodawanie czujek) 206
Zastosowanie okna dialogu Szybka czujka i 211
Korzystanie z okien dialogowych: Zmienne lokalne i Stos wywołań 212
Śledzenie wykonywania kodu programu ■ „.214
Śledzenie procedury w trybie krokowym 215
Śledzenie programu Krokowo z pomijaniem 216
Ustawianie następnej instrukcji 218
Wskazywanie następnej instrukcji 218
Zatrzymywanie wykonywania programu 218
Zastosowanie kompilacji warunkowej 219
Posługiwanie się zakładkami 222
Pułapkowanie błędów 223
Celowe wywoływanie błędów ...227
Podsumowanie : 227
Rozdział 2 u. i .........229
Manipulowanie bazami danych przy użyciu DAO ....:.. 229
Praca z bazą danych przy użyciu DAO .......1......... ......232
Tworzenie bazy danych :.„...... 232
Kopiowanie bazy danych 234
Otwieranie i przeglądanie istniejącej bazy danych 235
.
8
5
■
Programowanie w Access
Dodawanie do bazy danych właściwości zdefiniowanych przez użytkownika
Usuwanie bazy danych
Tworzenie i łączenie tabel przy użyciu DAO
Tworzenie tabeli i ustawianie właściwości pól
Dodawanie nowych pól do tabeli
Usuwanie pola z tabeli
Modyfikowanie tabeli i właściwości pól
Pobieranie właściwości tabeli
Przyłączanie tabel do bazy danych
Sporządzanie wykazu tabel i pól
Tworzenie indeksów oraz relacji między tabelami przy użyciu DAO
Tworzenie klucza podstawowego oraz ustawianie jego właściwości
Tworzenie indeksu kombinowanego
Wyszczególnianie indeksów w tabeli
Deklarowanie powiązań między tabelami
Tworzenie i uruchamianie kwerend przy użyciu DAO
Tworzenie kwerendy wybierającej przy użyciu DAO
Tworzenie i uruchamianie kwerend z parametrem przy użyciu DAO
Tworzenie i uruchamianie kwerendy aktualizującej przy użyciu DAO
Uruchamianie kwerendy usuwającej przy użyciu DAO
Tworzenie i uruchamianie kwerendy tworzącej tabelę przy użyciu DAO
Tworzenie i uruchamianie kwerendy dołączającej przy użyciu DAO :
Tworzenie i uruchamianie kwerendy przekazującej przy użyciu DAO '.
Wykonywanie innych czynności za pomocą kwerend '.
Pobieranie właściwości kwerendy \
Sporządzanie wykazu kwerend w bazie danych ',
Sortowanie danych w kwerendzie \
Usuwanie kwerendy z bazy danych 1
Aktualizowanie kwerend 1
Wyszukiwanie i pobieranie rekordów 2
mm
Spis treści 9
O twieranie i zamykanie różnych typów obiektu Recordset 289
Otwieranie zestawu rekordów typu Snapshot oraz liczenie rekordów 291
Czytanie zawartości określonego pola w tabeli 292
Poruszanie się między rekordami tabeli 293
Liczenie rekordów w zestawie Recordset 294
Wyszukiwanie rekordów w obiekcie Recordset typu Table 294
Wyszukiwanie rekordów w obiektach Recordset typu Dynaset oraz Snapshot 296
Wyszukiwanie n-tego rekordu w Dynaset lub Snapshot 298
Praca z rekordami 299
Dodawanie nowych rekordów 299
Modyfikacja rekordów 302
Usuwanie rekordów 304
Zachowywanie wartości pól w zmiennych 305
Zachowywanie rekordów w tablicy 306
Kopiowanie rekordów do komórek arkusza kalkulacyjnego 308
Filtrowanie rekordów 310
Tworzenie obiektu Recordset w oparciu o formularz 312
Bezpieczeństwo danych oraz obsługa transakcji 315
Co to są obszary robocze 315
Tworzenie nowego konta użytkownika 319
Przygotowanie wykazu wszystkich użytkowników bazy danych 325
Tworzenie nowego konta grupy 326
Dodawanie użytkownika do grupy 327
Sporządzanie wykazu użytkowników w poszczególnych grupach 328
Usuwanie użytkowników z grup 330
Hasła użytkowników 331
Uprawnienia indywidualne i grupowe 332
Zmiana właściciela obiektu 335
Sprawdzanie uprawnień do obiektów 336
Sprawdzanie uprawnień do konkretnego obiektu bazy danych 338
10 Programowanie w Access ',
P rzyznawanie określonych uprawnień kontorr grupowym
Obsługa transakcji
Podsumowanie
Rozdział 3
Tworzenie i manipulowanie bazami danych za pomocą ADO
Dostęp do danych przy użyciu ADO
Otwieranie bazy danych Microsoft Jet w trybie do odczytu-zapisu
Otwieranie bazy danych Microsoft Jet w trybie tylko do odczytu
Otwieranie bazy danych Microsoft Jet zabezpieczonej hasłem :
Otwieranie bazy danych Microsoft Jet Database zabiezpieczonej
na poziomie użytkownika
Otwieranie arkusza Microsoft Excel przy użyć u ADO
Otwieranie pliku dBASE przy użyciu dostawcy MSDASQL
Otwieranie pliku tekstowego przy użyciu ADO 2
Łączenie się z bieżącą bazą danych Microsoft Access :
Tworzenie nowej bazy danych Microsoft Access 2
Kopiowanie bazy danych 3
Łączenie się z serwerem SQL Server 3
Błędy w bazach danych 3
Tworzenie tabel oraz pól przy użyciu ADO 3
Tworzenie nowej tabeli w bazie danych Microsoft Access 3
Kopiowanie tabeli : 3
Wymazywanie tabeli bazy danych 3
Dodawanie nowych pól do istniejącej tabeli 3'
Wymazywanie pola z tabeli 3'
Wyszczególnianie właściwości tabeli 3'
Wyszczególnianie właściwości pól 3'
Łączenie tabel w aplikacji Microsoft Access 38
Przyłączanie arkusza Microsoft Excel 38
Tworzenie wykazu tabel 38
Spis treści 11
Zmiana autonumeracj i 384
Sporządzanie wykazu tabel oraz pól tabeli 385
Wyszczególnianie typów danych 388
Umieszczanie tabeli Microsoft Access w dokumencie Microsoft Word 389
Tworzenie indeksów oraz relacji między tabelami przy użyciu ADO 390
Tworzenie klucza podstawowego 391
Tworzenie indeksu złożonego z jednego pola 392
Dodawanie indeksu złożonego do tabeli 395
Wyszczególnianie indeksów w tabeli 396
Wymazywanie indeksów z tabeli 396
Tworzenie relacji między tabelami 397
Tworzenie i uruchamianie kwerend 399
Tworzenie kwerendy wybierającej (Select Query) 401
Tworzenie kwerendy z parametrem 403
Tworzenie kwerendy przekazującej 406
Uruchamianie kwerendy wybierającej 408
Uruchamianie kwerendy z parametrem 411
Uruchamianie kwerendy aktualizującej 413
Modyfikowanie kwerendy 414
Wyszczególnianie nazw kwerend w bazie danych 416
Usuwanie kwerendy 417
Wyszukiwanie i czytanie rekordów 418
Otwieranie obiektu Recordset 419
Otwieranie zestawu rekordów na podstawie tabeli lub kwerendy 422
Otwieranie zestawu rekordów na podstawie polecenia SQL 424
Otwieranie zestawu rekordów na podstawie kryteriów 425
Bezpośrednie otwieranie zestawu rekordów 426
Poruszanie się w zestawie rekordów 426
Określanie pozycji rekordu 428
Odczytywanie danych z pola rekordu 429
12
Programowanie w Acces:
Pobieranie zawartości rekordów
Wyszukiwanie rekordów przy użyciu metody Find
Wyszukiwanie rekordów przy użyciu metody Seek
Wyszukiwanie rekordów w oparciu o kilka warunków
Obliczanie liczby rekordów
Praca z rekordami
Dodawanie nowego rekordu
Modyfikowanie rekordu
Usuwanie rekordu
Kopiowanie rekordów do arkusza Microsoft Excel
Kopiowanie rekordów do dokumentu Microsoft Word
Kopiowanie rekordów do pliku tekstowego
Filtrowanie rekordów za pomocą klauzuli SQL Where
Filtrowanie rekordów przy użyciu właściwości Filter
Sortowanie rekordów
Zaawansowane możliwości obiektu Recordsei
Fabrykowanie zestawu rekordów
Użycie zestawu rekordów zachowanego w pliku
Bezpieczeństwo danych przy użyciu ADOX >
Tworzenie konta grupy <
Tworzenie konta użytkownika <
Umieszczanie użytkowników w grupach *
Usuwanie kont indywidualnych ^
Usuwanie konta grupy 4
Wyszczególnianie kont grupowych 4
Sporządzanie wykazu kont indywidualnych 4
Sporządzanie wykazu użytkowników należących do danej grupy 4
Ustawianie i pobieranie uprawnień użytkowników oraz grup 4
Prawa właściciela 4i
Ustawianie uprawnień użytkownika do obiektu 4(
U stawianie uprawnień użytkownika do bazy danych 472
Ustawianie uprawnień użytkownika do zbioru Containers 473
Sprawdzanie uprawnień do obiektów 475
Zabezpieczanie bazy danych hasłem 477
Zmiana hasła bazy danych 477
Zmiana hasła użytkownika 479
Transakcje 480
Kompaktowanie bazy danych 482
Zabezpieczanie bazy danych szyfrem 484
Replikacja bazy danych 485
Tworzenie repliki głównej (Wzorzec projektowania) 487
Tworzenie repliki całkowitej 489
Tworzenie repliki częściowej 490
Replikacja obiektów 493
Obiekty lokalne 495
Synchronizacja replik 496
Właściwości repliki 498
Konflikty synchronizacji replik 500
Podsumowanie 506
Rozdział 4 509
Programowanie przy użyciu języka DDL 509
Tworzenie i usuwanie tabel 510
Zapewnianie integralności danych 516
Definiowanie relacji między tabelami 521
Modyfikowanie tabel przy użyciu DDL 526
Dodawanie nowych pól do tabeli 527
Zmiana typu danych kolumny (pola) tabeli 528
Modyfikacja rozmiaru pola tekstowego 529
Usuwanie kolumny (pola) z tabeli 529
Dodawanie klucza podstawowego do tabeli 530
14
Programowanie w Access'.
D odawanie indeksu złożonego do tabeli
Usuwanie kolumny wchodzącej w skład indeksu
Usuwanie indeksu
Ustawianie wartości wyjściowej dla określonego pola w tabeli
Modyfikacja
wartości
początkowej oraz wielkości przyrostu dla pola
identyfikacyjnego
Definiowanie indeksów oraz kluczy podstawowych
Tworzenie tabel z indeksami
Tworzenie indeksów z restrykcjami
Usuwanie indeksów
Bezpieczeństwo danych: hasła oraz konta użytkowników i grup
Ustawianie hasła bazy danych
Usuwanie hasła bazy danych
Zakładanie konta użytkownika
Zmiana hasła użytkownika
Zakładanie konta grupy
Dodawanie użytkowników do grup
Usuwanie użytkownika z konta grupy
Usuwanie konta użytkownika
Przyznawanie uprawnień do obiektów bazy danych
Odbieranie uprawnień
Usuwanie konta grupy
Widoki i procedury przechowywane
Tworzenie widoków
Sporządzanie wykazu widoków
Usuwanie widoku
Tworzenie procedury przechowywanej z parametrem
Uruchamianie procedury przechowywanej z parametrem
Usuwanie procedury przechowywanej
Podsumowanie
S pis treści 15
R ozdział 5 563
Programowanie zdarzeń w formularzach i raportach 563
Zdarzenia zachodzące w formularzu 565
Zdarzenia dotyczące danych (Data Events) 565
Zdarzenia związane z oknami (Window Events) 572
Zdarzenia związane z uzyskaniem lub utratą fokusu (Focus Events) 576
Zdarzenia związane z posługiwaniem się myszą (Mouse Events) 578
Zdarzenia związane z użyciem klawiatury (Keyboard Events) 580
Zdarzenia występujące przy błędzie (Error Events) 583
Zdarzenia zachodzące przy stosowaniu filtrów (Filter Events) 585
Zdarzenia zachodzące w sekcjach formularza 588
Zdarzenia zachodzące w raportach 590
Zdarzenia zachodzące w sekcjach raportu 595
Zdarzenia rozpoznawane przez formanty 600
Procedura obsługi zdarzenia: Przed aktualizacją (BeforeUpdate) 601
Procedura obsługi zdarzenia: Po aktualizacji (AfterUpdate) 602
Procedura obsługi zdarzenia: Przy wartości spoza listy (NotlnList) 603
Procedura obsługi zdarzenia: Przy wejściu (Enter) 604
Procedura obsługi zdarzenia: Przy kliknięciu (Click) 605
Procedura obsługi zdarzenia: Przy kliknięciu dwukrotnym (DblClick) 609
Zdarzenia zachodzące w formularzu głównym aplikacji 611
Podsumowanie 615
Rozdziało 617
Microsoft Access w przeglądarce intemetowej 617
Publikacja „żywych danych" czyli - Active Server Pages 619
Instalacja Microsoft Information Services (IIS 5) lub Personal Web Server.... 623
Tworzenie wirtualnego katalogu 624
Nawiązywanie łączności z bazą danych Microsoft Access za pomocą DSN.... 628 Nawiązywanie łączności z bazą danych Microsoft Access bez źródła danych . 633
16 Programowanie w Access 2i
N awiązywanie łączności z bazą danych Microsoft Access przy użyciu
dostawcy OLE DB (
Pobieranie rekordów i
Podział zestawu rekordów i
Ograniczenie liczby zwróconych rekordów i
Pobieranie rekordów przy użyciu metody GetRows i
Użycie pól kombi
Użycie pola listy
Dodawanie danych do tabeli
Modyfikowanie rekordów
Usuwanie rekordów
Tworzenie interfejsu użytkownika
Podsumowanie
Skorowidz
Wstęp
Od kilkunastu już lat Microsoft Access pozwala użytkownikom na całym świecie projektować i tworzyć aplikacje baz danych działające w środowisku Windows. Książka ta przeznaczona jest dla osób, które potrafią już korzystać z interfejsu użytkownika w aplikacji Microsoft Access i chcą teraz dowiedzieć się jak efektywnie korzystać z Accessa poprzez programowanie. Każda osoba pragnąca opanować tajniki programowania w języku VBA w Accessie znajdzie w tej książce niezliczoną ilość łatwych i praktycznych przykładów.
Aby skorzystać z tej książki nie trzeba wykazać się jakąkolwiek znajomością programowania. Jedynym wymogiem jest umiejętność tworzenia baz danych Access przy użyciu interfejsu użytkownika i zdolność tworzenia oraz uruchamiania różnych typów kwerend. Książka ta zakłada również, że potrafisz projektować bardziej złożone formularze z osadzonymi w nich podformularzami, i wiesz jak używać pola kombi i inne wbudowane formanty. Jeżeli nie posiadasz tych umiejętności, a chciałbyś je nabyć, na rynku książek komputerowych znajduje się sporo dobrych podręczników, które nauczacie krok po kroku jak budować proste bazy danych lub korzystać z przykładowej bazy danych Northwind wchodzącej w skład Accessa. Jeżeli natomiast legitymujesz się wymienioną powyżej wiedzą, to w książce tej znajdziesz wprowadzenie do programowania w środowisku VBA wewnątrz aplikacji Access w dość przystępnej i łatwej do zrozumienia formie.
Organizacja i układ książki
Książka ta została podzielona na sześć rozdziałów, które stopniowo prezentują użycie języka Visual Basic dla Aplikacji (VBA) w celu wykonywania rozmaitych zadań w bazie danych Microsoft Access bez korzystania z interfejsu użytkownika.
Rozdział 1 - Wstęp do programowania VBA w Microsoft Access 2000
Rozdział ten dokładnie opisuje minimum, które należy wiedzieć, aby móć programować w aplikacji Microsoft Access. W dziewięciu zagadnieniach tego rozdziału poznasz:
18
Programowanie w Access'.
T
ypy
procedur, które
możesz programować w Accessie oraz gdzie i w jaki
sób
sieje sporządza.
Okno edytora Visual Basic oraz dostępne w n;m narzędzia programowania.
Zasady przechowywania danych w celu późniejszego ich użycia.
Przekazywanie
dodatkowych informacji do procedur oraz funkcji przed
ich
chomieniem.
Kontrolowanie toku wykonania programu za pomocą struktur warunkowych.
Powtarzanie
czynności
przy użyciu struktur programowych określanych tei
nem
pętli.
Przechowywanie wartości w tablicach statycznych oraz dynamicznych.
Tworzenie własnych obiektów oraz kolekcji obiektów.
Wykorzystanie
narzędzi
służących do testowania procedur i wyszukiwania I
dów.
Umiejętności nabyte w tym rozdziale są przenośne. Oznacza to, że możesz je stosować w programowaniu innych aplikacji wchodzących w skład pakietu Micro: Office takich jak Excel, Word, PowerPoint, lub Outlook.
Rozdział 2 - Tworzenie i manipulowanie bazami danych przy użyciu DAO
Rozdział ten omawia jeden z dwóch modeli obiektów, z których możesz skór stać w programowaniu aplikacji Microsoft Access. Obiekty DAO (Data Access ( jects) umożliwiają programatyczne tworzenie i manipulowanie tabelami oraz kwer dami bazy danych, jak również zarządzanie sprawami bezpieczeństwa danych. D; oferuje rodzimy model dostępu do danych dla silnika bazy danych Microsoft Jet En ne. W wersji Accessa 2000, DAO jest uważany za starszy model danych, który w c gu następnych kilku lat zostanie całkowicie zastąpiony nowszym i bogatszym moi lem obiektów ADO (zobacz Rozdział 3), będącym częścią inicjatywy Microsoft zm rzającej do rozpowszechnienia uniwersalnego dostępu do danych. Rozdział ten < monstruje programowy sposób tworzenia bazy danych Access przy użyciu obiekti DAO. Sporządzisz w nim kod programowy tworzący i łączący tabele, budujący indf sy, oraz tworzący relacje między tabelami. Sporządzisz i uruchomisz różne rodź; kwerend za pomocą procedur VBA. Zobaczysz, w jaki sposób korzysta się z obieku DAO w celu wyszukiwania oraz pobierania danych z rekordów bazy danych. Wre: cie nauczysz się pisać kod umożliwiający zarządzanie bezpieczeństwem bazy dany oraz stosować transakcje w swoich aplikacjach.
■i
Wstęp
19
Umiejętności nabyte w tym rozdziale napewno ci się przydadzą w wykonaniu projektów, których celem będzie konwersja DAO na ADO. W miarę ulepszania aplikacji Accessa przez Microsoft, osoby potrafiące pracować ze starszymi modelami obiektów będą cieszyły się większym powodzeniem na rynku pracy.
Rozdział 3 - Tworzenie i manipulowanie bazami danych za pomocą ADO
Rozdział ten demonstruje dodatkowy sposób wykonywania rozmaitych zadań w bazie danych Access (pierwszy sposób prezentował rozdział 2). Uwaga w tym rozdziale skupia się na najnowszym i najbardziej polecanym przez Microsoft modelu obiektów noszącym nazwę ActiveX Data Objects (ADO). Po raz pierwszy wprowadzony w Access 2000 model obiektów ADO umożliwia dostęp do danych przechowywanych zarówno w relacyjnych bazach danych, jak i nie relacyjnych źródłach danych takich jak magazyny danych, usługi katalogowe, dane tekstowe i graficzne dla sieci Web, oraz dane przechowywane przez duże systemy komputerowe (mainframe). Swoje spotkanie z obiektami ADO rozpoczniesz od poznania wielu sposobów dostępu do różnych źródeł danych (Microsoft Access, Excel, dBase, oraz pliki tekstowe). Następnie zobaczysz jak korzysta się z obiektów ADO do tworzenia nowej bazy danych w aplikacji Access. Nauczysz się wykonywać te same czynności związane z zarządzaniem oraz manipulacją bazami danych, które programowałeś w rozdziale drugim przy użyciu obiektów DAO. Ten rozdział wyjaśnia również, w jaki sposób korzystając z ADO można sporządzić procedury kompaktujące bazę danych oraz zabezpieczające ją hasłem. Zapoznasz się tu również z procesem replikacji danych, który umożliwia udostępnienie bazy danych użytkownikom znajdującym się w różnych strefach geograficznych.
Umiejętności nabyte w tym rozdziale umożliwią ci programowanie szeregu zadań, których nie można zaprogramować przy użyciu starszego modelu obiektów DA-0. W aplikacji Microsoft Access 2000, ADO jest preferowaną metodą dostępu do danych silnika Microsoft Jet oraz danych znajdujących się na serwerze SQL. Im wcześniej zapoznasz się z obiektami ADO, tym szybciej będziesz mógł docenić zalety wynikające z uniwersalnego dostępu do danych (Universal Data Access (UDA)). Po wcieleniu w życie UDA, będzie tylko jedna metoda dostępu do danych i tylko jeden model obiektów do opanowania dla programisty.
Rozdział 4 - Programowanie przy użyciu języka DDL
Ten rozdział prezentuje trzeci sposób za pomocą którego możesz tworzyć obiekty bazy danych oraz manipulować nimi drogą programowania (pierwsze dwa sposoby omówione są odpowiednio w rozdziałach drugim i trzecim). W rozdziale tym
.^6icuiiuwaine w Acce
znowu dowiesz się jak można programowo sporządzić bazę danych, utworzyć oraz indeksy, ustawić relacje między tabelami oraz zarządzać bezpieczeństwa nych. Tym razem jednak w operacjach tych wykorzystasz język definicji danych Definition Language (DDL)), który jest istotnym komponentem języka SQL (Si red Query Language). W rozdziale tym również zapoznasz się z nowymi obie określanymi termiem widoków oraz procedur przechowywanych, które nie są d ne z okna bazy danych w interfejsie użytkownika w aplikacji Microsoft Access. Umiejętność posługiwania się językiem SQL/DDL, którą przyswoisz w tym rozdziale pozwoli ci na tworzenie poszczególnych komponentów bazy da Liczne polecenia języków SQL oraz DDL przedstawione w tym rozdziale dad umiejętność, którą będziesz mógł wykorzystać, jeżeli postanowisz zmienić platf z Microsoft Accessa na Serwer SQL.
Rozdział 5 - Programowanie zdarzeń w formularzach i raportach
Ten rozdział zademonstruje, w jaki sposób możesz zmienić wbudowane za
wanie aplikacji Microsoft Access sporządzając procedury reagujące na zdarzenia
wołane przez użytkownika lub system operacyjny, Po zapoznaniu się z ważnymi
minami związanymi z programowaniem zdarzeniowym, uzyskasz praktyczne
świadczenie przerabiając samodzielnie i krok po kroku ponad 30 praktycznych c
czeń dotyczących pułapkowania zdarzeń w formularzach oraz raportach. A jeżel
nie wystarczy, to możesz dodatkowo przejrzeć procedury zdarzeń zaimplementow
w formularzu znajdującym się na dołączonej do książki płycie CD. Programowa
zdarzeń umożliwia tworzenie dynamicznych aplikacji bazy danych. Twoje opanc
nie zdarzeń oznacza wielu szczęśliwych użytkowników, korzystających z twojej b;
danych.
Umiejętności nabyte w tym rozdziale pozwolą ci na usprawnienie oraz zmia sposobu, w jaki użytkownicy korzystają z twojej aplikacji.
Rozdział 6 - Microsoft Access w przeglądarce internetowej
Ten rozdział ilustruje na wielu przykładach, w jaki sposób można wykorzyst opracowaną przez Microsoft technologię o nazwie Active Server Pages (ASP) w ce przeglądania, wprowadzania, wymazywania oraz modyfikacji danych przechowyw nych w bazie danych Microsoft Access prosto z przeglądarki internetowej. Chocia każdy teraz może zbudować stronę główną i umieścić ją w sieci Web, tworzenie stroi które są kierowane przez silnik bazy danych wymaga więcej aniżeli podstaw język HTML czy umiejętności posługiwania się narzędziami, które są w stanie automatyc2
W stęp 21
n ie zbudować naszą stronę. Przed wypróbowaniem szeregu przykładów dostępu do danych przytoczonych w tym rozdziale dowiesz się, w jaki sposób należy zainstalować na komputerze Internet Information Services (IIS) albo Personal Web Server. Rozdział ten pokaże ci w zwięzły sposób jak korzystać z Accessa 2000 w Internecie.
Umiejętności nabyte w tym rozdziale umożliwią ci połączenie się z bazą danych z dowolnej przeglądarki internetowej w celu czytania, wyszukiwania, wymazywania oraz modyfikacji rekordów.
Jak korzystać z tej książki?
Na początku polecam przerobienie tej książki rozdział po rozdziale. Potem możesz się do niej odwoływać jak do poradnika. Szczegółowy skorowidz zamieszczony na końcu książki pomoże ci szybko dotrzeć do poszukiwanych informacji. W trakcie przerabiania każdego rozdziału wykonuj czynności, o których czytasz. Bądź aktywnym czytelnikiem i całkowicie zaangażuj się w przerabianie przykładowych procedur tej książki. Tylko w taki sposób możesz szybko i praktycznie opanować w krótkim czasie zasady programowania i równocześnie nie odczuć mozołu studiowania. Nie bierz się do przerabiania nowych zagadnień, jeżeli czujesz, że nie opanowałeś jeszcze całkowicie bieżącego tematu.Pozwól swoim szarym komórkom mózgowym posortować informacje i ustawić je we właściwej perspektywie zanim ruszysz do przodu.
Wiele osób narzeka, że jakaś książka zawiodła ich oczekiwania. Autor być może zorganizował tematykę w inny sposób aniżeli czytelnik był przygotowany do pracy z nowym materiałem. Każdy z nas uczy się inaczej. Koniecznie dowiedz się, jaka jest twoja metoda uczenia się. Książka ta została pomyślana według pewnych słów, które stanowią określoną ideę. Weź na przykład takie słowa jak: „baza danych" albo „tabela". Teraz zadaj sobie pytanie odnośnie czynności, które chciałbyś potrafić dokonać na bazie danych czy tabelach aplikacji Microsoft Access. Z pewnością przyjdą ci na myśl słowa takie jak „tworzenie", „wymazywanie", „dodawanie" oraz „modyfikowanie". Zapisz te słowa na kartce papieru. Czyniąc to sporządzisz tzw. mapę myśli. Mapy myśli™ (Mind Mapping) są wynalazkiem Tony Buzan'a, światowej sławy autorytetu w dziedzinie usprawniania pracy umysłowej. Mapa myśli pozwoli ci szybciej zapamiętać i lepiej zorganizować nowe idee. Na rynku znajdziesz wiele narzędzi, które umożliwią ci sporządzenie mapy swojej wiedzy. Dobra mapa myśli może znacznie zmniejszyć czas wymagany na opanowanie danego zagadnienia. W ciągu paru tygodni możesz nauczyć się czegoś, co normalnie zabrałoby ci kilka lat. Na następnej stronie znajduje się przykład mapy myśli sporządzonej przy użyciu programu MindMapper Professional 3.0 firmy SimTech Systems.Inc, której program-demo możesz uzyskać w Internecie. Temat mapy reprezentowany jest w postaci obrazka lub słowa umieszczonego na środku kartki papieru. Idee dotyczące tego centralnego rysunku/słowa są
22
Programowanie w Access
n astępnie wpisane i połączone z ideą główną za pomocą osobnych linii. Każda reprezentuje osobny aspekt zagadnienia. Mapa myśli pozwala na łączenie p w sposób zbliżony do sposobu pracy naszych komórek mózgowych. Możesz wyrć niektóre idee za pomocą innych kolorów, czcionek, kształtów czy grafiki. Spr skorzystać z technologii mind mappingu, aby opanować material przedstawiony a książce oraz popudzenia procesów myślowych dotyczących innych zagadnień, I cię interesują.
Przykłady procedur w tej książce nie są numerowane po kolei, lecz odnosz; do ponumerowanych rysuków, które je poprzedzają. Przykład oznaczony nums 2.4. A oznacza punkt A na rysunku 2.4.
Poniższa ilustracja mapy myśli została sporządzona za pomocą programu M Mapper Professional 3 firmy SimTech Systems, Inc.
use the TabteDcfs method )".JWhDAO
tłih. ABłBt lecaBa Stjłaj wthADO
Ot, JfciimKjwj Lmuagi
^Relationships with other tables
set Jet OLB38: Create Link,p™p«t¥„/'
Rozdział 1
Wstęp do programowania VBA w Microsoft Accesie 2000
Jeżeli chcesz budować efektywne aplikacje bazy danych przeznaczone dla szerokiego grona odbiorców i potrzebne ci są narzędzia, których brak jest w interfejsie użytkownika, to nadszedł czas, aby zapoznać się ze środowiskiem programistycznym oferowanym przez Microsoft Access 2000. Potęga Accessa związana jest z jego wbudowanym językiem programowania - Visual Basic for Applications (krótko określanym terminem VBA). Programowanie w języku VBA umożliwi ci dodanie kodu użytkownika, który wesprze domyślne zachowanie aplikacji Microsoft Access 2000. Kod programowania w Accessie składa się z poleceń oraz instrukcji wpisywanych na kartach zwanych modułami.
Za pośrednictwem kodu można kontrolować różne obiekty Microsoft Access takie jak tabele bazy danych, formularze, raporty, czy kwerendy. Rozdział ten zapozna cię z podstawami programowania i narzędziami, które ułatwiają ci pisanie kodu. Ponieważ język Visual Basic dla aplikacji stał się wspólnym językiem dla wszystkich aplikacji pakietu Microsoft Office, wiele technik programowania, które omówiono w tym rozdziale ułatwi ci start w programowaniu innych aplikacji tego pakietu, takich jak Excel, Word, PowerPoint czy Outlook.
Procedury i moduły
Programowanie sprowadza się do pisania procedur. Procedurą nazywamy grupę instrukcji, która pozwala na wykonanie specyficznego zadania po uruchomieniu programu. Po umieszczeniu instrukcji (kodu) w procedurze, możesz odwołać się do tej procedury za każdym razem, gdy trzeba wykonać tę specyficzną czynność, która została zaprogramowana. Procedury wpisuje się i przechowuje w modułach. Moduł może zawierać jedną lub więcej procedur. Każda procedura w tym samym module musi posiadać niepowtarzalną nazwę. Procedury w innych modułach mogą mieć tę samą nazwę. Każdy moduł zaczyna się od sekcji deklaracji, która wymienia różne ustawienia i deklaracje odnoszące się do wszystkich procedur w danym module. Po sekcji
24
Programowanie w Access
d eklaracji znajduje się sekcja procedur, w której przechowywane są procedury da modułu.
Typy procedur
Visual Basic wyróżnia trzy podstawowe typy procedur:
Procedury
typu Sub
wykonują
określone zadania, które nie zwracają żad
wartości.
Procedury tego typu zaczynają się słowem kluczowym Sub
i
końc2
słowami
kluczowymi End
Sub. Słowa
kluczowe (ang. keywords)
mają
spec
znaczenie
w Visual
Basicu.
Pomiędzy słowami Sub
oraz
End
Sub należy
w]
instrukcje
VBA,
które
procedura ma wykonać. Procedurom typu Sub
m
przekazać
dane w postaci argumentów. Argumentem jest jedna lub więcej
w
ści,
których procedura potrzebuje w celu wykonania określonej
czynności,
gumenty
oddziela się od siebie przecinkami Procedury tego typu
sporządź
własnoręcznie
w modułach znajdujących się w oknie edytora Visual
Basic.
I
na
również skorzystać z kreatora przycisków poleceń (Command
Button Wi;
dostępnego
w przyborniku formantów w widoku formularza, aby
automatyc
sporządzić
szereg procedur, które automatyzują czynności związane z
otw
niem
i zamykaniem formularzy i raportów, nawigację między rekordami,
w)
kiwanie
rekordów, drukowanie tabel, uruchamianie kwerend, makr oraz
im
aplikacji.
Procedury
typu Function
wykonują
określone zadania i zwracają pewne wart
Procedury
tego typu zaczynają się słowem kluczowym Function
i
kończ?
słowami
kluczowymi End
Function. Ponieważ
funkcje zwracają wartości, mi
je
wykorzystać w wyrażeniach. Podobnie jak procedury typu Sub,
funkcje
n
przyjąć
argumenty. Funkcje można uruchomić z procedury zwykłej typu
Sut
z
okna Instrukcje
bezpośrednie.
Procedury
typu Property
używane
są z obiekiami utworzonymi przez użytko
ka.
Procedury te pozwalają ustawić lub pobrać wartość właściwości
dai
obiektu
albo utworzyć odwołanie do obiektu.
Typy modułów
Jak już wcześniej wspomniano, procedury są sporządzane i przechowyv w modułach. W aplikacji Access 2000 rozróżnia się dwa rodzaje modułów:
• Moduły
klasy (Class
modules) występują
w trzech odmianach, są to: moduły
sy
w formularzach (ang. form
class module?), moduły
klasy w raportach (
report
class modules), oraz
osobne moduły klasy (ang. standalone
class nn
les).
Każdy
formularz i raport Accessa posiada wbudowany moduł klasy. Mi
Wstęp do programowania VBA w Microsoft Accesie 2000
25
k lasy zawiera kod programowania dla danego formularza lub raportu i jest przechowywany wraz z danym formularzem lub raportem.
o Moduły formularza oraz moduły raportu przechowują procedury zdarzeń dla zdarzeń rozpoznawanych przez formularz lub raport oraz ich formanty, jak również funkcje i procedury o charakterze ogólnym. Procedury przechowywane w modułach klasy formularza lub raportu są dostępne tylko w trakcie użycia danego formularza lub raportu. Jeżeli otworzysz formularz lub raport w widoku projektu i następnie wybierzesz Widok => Kod programu (View => Code) lub klikniesz przycisk Kod programu na pasku narzędzi, to czynność ta spowoduje utworzenie modułu formularza lub modułu raportu. Access otworzy okno modułu i przypisze nazwę modułowi. Nazwa ta składa się z trzech części: nazwy obiektu, znaku podkreślenia oraz nazwy formularza lub raportu. Na przykład, moduł formularza w formularzu Klienci nosi nazwę FormKlienci, a moduł raportu w raporcie Mo-iKlienci nazywa się Report_MoiKlienci. Raporty i formularze posiadają specjalną właściwość o nazwie Ma moduł (HasModule) z ustawieniem początkowym posiadającym wartość Nie. Natychmiast po uaktywnieniu okna Kod programu ustawienie właściwości Ma moduł automatycznie zmienia się na Tak.
o Osobne moduły klasy istnieją niezależnie od formularzy i raportów. Są one używane do tworzenia własnych obiektów z ich własnymi właściwościami oraz metodami. Aby utworzyć osobny moduł klasy, należy wybrać opcję Class module z menu Insert (Wstaw) w oknie edytora Visual Basic.
ł Moduły standardowe (ang. standard modules) wymienione są w oknie bazy danych po wybraniu przycisku Moduły. Moduły te używane są do przechowywania procedur oraz funkcji, które nie są związane z określonym formularzem lub raportem, zatem mogą być wywołane z dowolnego miejsca w aplikacji.
Zdarzenia, właściwości zdarzeń oraz procedury zdarzeń
Aby przystosować aplikacje bazy danych do własnych potrzeb lub dostarczyć produkt, który spełnia jak najściślej wymagania użytkowników, trzeba poświęcić sporo czasu na programowanie zdarzeniowe (ang. event-driven programming).
Access 2000 jest aplikacją reagującą na zdarzenia. Oznacza to, że cokolwiek zdarzy się w aplikacji Accessa jest rezultatem rozpoznanego przez ten program zdarzenia. Zdarzenie jest czynnością rozpoznawaną przez dany obiekt. Jest to czynność taka jak kliknięcie przyciskiem myszy, naciśnięcie klawisza, wybór elementu z listy opcji, czy też zmiana elementów dostępnych w polu listy. Zdarzenia mogą być wywołane przez użytkownika danej aplikacji, przez inną aplikację lub przez system operacyjny. Pra-
26
Programowanie w Acce:
c ując jako programista, często będziesz chciał zmodyfikować wbudowaną r aplikacji na dane zdarzenie.
Zanim aplikacja odpowie na kliknięcie myszą czy naciśnięcie klawisza użytkownika w sposób, w jaki zawsze to czyni, możesz polecić aplikacji, aby : gowała na dane zdarzenie zupełnie inaczej. Dla przykładu, jeżeli użytkownik k przycisk Wymaż (Delete) na formularzu, może wyświetlić specjalny komunika magający potwierdzenia czynności wymazania danego rekordu.
Każde zdarzenie zdefiniowane dla formularza, raportu lub umieszczonych w formantów posiada odpowiednią procedurę obsługi zdarzeń. Jeżeli otworzysz dc ny formularz Microsoft Accessa w widoku projektu i wybierzesz Widok => Wl wości, a następnie klikniesz zakładkę Zdarzenie w oknie Właściwości, to uzys dostęp do 32 zdarzeń, na które dany formularz jest w stanie zareagować (zob. 1.1). Natomiast po wybraniu określonego elmentu na formularzu i wybraniu k Zdarzenie w oknie Właściwości, zobaczysz te zdarzenia, na które wybrany elen formularza może odpowiedzieć w trakcie uruchomienia formularza (zob. rys. 1.2).
Formularze, raporty oraz umieszczone w nich formanty posiadają rozmaite \ ściwości, z których można skorzystać, aby spowodować określone zachowanie, przykład, można otworzyć lub zamknąć formularz w odpowiedzi na kliknię umieszczonego na nim przycisku lub uniemożliwić dostęp do pewnych element formularza w trakcie jego ładowania.
Aby określić sposób, w jaki formularz, raport lub umieszczony na nim form; powinien reagować na zdarzenia, sporządza się tzw. procedury obsługi zdarzenia (ar event procedures). W kodzie programowania należy opisać, co ma się wydarz w momencie zajścia określonej sytuacji. Na przykład, jeżeli użytkownik kliknie jak przycisk lub wybierze opcję w polu kombi, to należy przewidzieć i zaprogramow; zdarzenia, które mogą zajść w trakcie wykonania programu (gdy dany formularz z< stanie załadowany).
Najpopularniejsze zdarzenie nosi nazwę Click. Przy każdorazowym klinięci przycisku zostanie uruchomiona związana z nim procedura obsługi zdarzenia o nazwii Click. Przypisanie swojej własnej procedury którejkolwiek właściwości wymienione na zakładce Zdarzenie okna Właściwości jest równoznaczne z zastawieniem pułapki na dane zdarzenie. Pułpkowanie zdarzeń daje bardzo dużą kontrolę nad sposobem, w jaki program zareaguje na zdarzenia. Gdy zastawisz pułapkę na dane zdarzenie, Access przestanie po prostu reagować na nie według wbudowanych przepisów. Dla przykładu, jeżeli użytkownik kliknie przycisk, aby zachować formularz, to zostanie wykonany kod programowania wpisany wewnątrz procedury obsługi zdarzenia Click dla tego przycisku. Kodu wpisanego w procedurze zdarzenia nie można osobno użyć, Kod dotyczący programowania zdarzeń zachowany jest wraz z formularzem, raportem
Wstęp do programowania VBA w Microsoft Accesie 2000
27
lub przyciskiem i jest uruchamiany tylko wówczas, gdy czynności użytkownika w danym formularzu lub raporcie spowodują konkretne zdarzenie.
F ormat j Dane Zdarzenie ]
Przy bieżącym
Przed wstawieniem .,,....,..
Po wstawieniu
Przed aktualizacją...,.,,....
Po aktualizacji
Przy buforowaniu
Pr2y usunięciu , , , , , . ,
Przed usunięciem
Po usunięciu .
Przy otwarciu
Przy załadowaniu...........
Przy zmianie rozmiaru
Przy zwolnieniu
Przy zamknięciu ,
Przy aktywowaniu
Przy dezaktywowaniu
Przy uzyskaniu fokusu
Przy utracie fokusu
Przy kliknięciu
Przy kliknięciu dwukrotnym
Przy naciśniętej myszy
Przy ruchu myszy , . ,
Przy zwolnionej myszy , ,
Przy naciśnięciu klawisza......
Przy zwolnieniu klawisza
Przy naciśniętym klawiszu
Podgląd klawisza Nie
Przy błędzie ,
Przy filtrowaniu
Przy zastosowaniu filtru
Przy cyklu czasomierza .......
Otoes czasomierza ..,.,.,,.. 0
Inne j Wszystkie
R ysunek 1.1. Zdarzenia zachodzące w formularzach
if Pole tekstowe: Tekst 1
Format j Dane Zdarzenie j
Przed aktualizacją |
Po aktualizacji
Przy zmianie
Przy wejściu
Przy zakończeniu
Przy uzyskaniu f okjjsu ........
Przy utracie Fokusu
Przy kliknięciu
Przy kliknięciu dwukrotnym .....
Przy naciśniętej myszy
Przy ruchu myszy
Przy zwolnionej myszy
Przy naciśnięciu klawisza,..,..:
Przy zwolnieniu klawisza
Przy naciśniętym klawiszu
zystkie
Rysunek 1.2. Zdarzenia zachodzące w polu tekstowym
^ixuwanie W ACCe!
Użycie zdarzeń pozwala na tworzenie dynamicznych i interaktywnych apl Aby określić sposób reakcji na konkretne zdarzenie, należy wybrać odpowiedni, ściwość zdarzenia w oknie Właściwości i sporządzić procedurę obsługi zdar Jeżeli nie ma znaczenia, jak program zareaguje na dane zdarzenie, nie trzeba żadnego kodu. Access zareaguje we wbudowany sposób na każde zdarzenie, dl; rego nie została sporządzona procedura zdarzenia. Procedur zdarzeń nie można rządzić dla tabel, kwerend oraz stron dostępu do danych (ang. data access pages)
Procedura zdarzenia krok po kroku
1.
2.
3.
4.
5.
Jeżeli
jeszcze nie sporządzałeś procedury obsługi zdarzenia,
następujące ćw nie pokaże ci, od czego zacząć. Twoim zadaniem
jest zmiana koloru tła pola tel wego umieszczonego w formularzu,
gdy zostanie ono uruchomione przez użytko ka, oraz przywrócenie
wyjściowego koloru tła, gdy zostanie ono opuszczone p użytkownika
za pomocą klawisza Tab
lub
kliknięcia myszą poza obrębem pola. 1.
Otwórz bazę danych Northwind.
Otwórz formularz Kłienci w widoku projektu.
Kliknij prawym przyciskiem myszy znajdujące się w tym formularzu pole t
stowe Przedstawiciel i wybierz pozycję Właściwości z podręcznego menu.
Kliknij zakładkę Zdarzenie w oknie Właściwości.
Kliknij przycisk Buduj (...) po prawej stronie nazwy właściwości Przy uzysl
niu fokusu (On Got Focus), tak jak pokazano na rysunku 1.3. Pojawi się ok
dialogowe Wybieranie konstruktora (Chooss Builder), pokazane na rysun
Format f Dane Zdarzenie | Przed aktualizacją...........
Po aktualizacji
Przy zmianie .
Przy wejściu
Przy zakończeniu
Przy uzyskaniu fokusu f
Przy utracie fokusu
Przy kicnięciu
Przy Wiknięciu dwukrotnym
Przy naciśniętej myszy
Przy ruchu myszy
Przy zwolnionej myszy
Przy naciśnięciu klawisza
Przy zwolnieniu klawisza.......
Przy naciśniętym klawiszu......
Inne
1.4.
Wstęp do programowania VBA w Microsoft Accesie 2000
29
W ybieranie konstrukl or*i
Konstruktor wyrażeń Konstruktor makr
Rysunek 1.4. Aby sporządzić kod VBA dla procedury obsługi zdarzenia, zaznacz Konstruktor kodu
6. Wybierz Konstruktor kodu (Code Builder) w oknie dialogowym Wybieranie konstruktora i kliknij przycisk OK (zob. rys. 1.4). Pojawi się okno Kod programu (zob. rys. 1.5). Okno to szczegółowo omówione jest dalej w tym rozdziale. Nazwa procedury obsługi zdarzenia składa się z trzech części: nazwy obiektu (Przedstawiciel), znaku podkreślenia ( _) oraz nazwy zdarzenia (GotFo-cus), na które obiekt reaguje. Słowo kluczowe „Private" wskazuje, że zdarzenie spoza danego formularza nie może wywołać danej procedury zdarzenia. Słowo kluczowe Sub w pierwszej linii kodu oznacza początek procedury obsługi zdarzenia. Słowa kluczowe End Sub w ostatniej linii kodu oznaczają koniec procedury obsługi zdarzenia. Polecenia, które mają być wykonane, gdy zajdzie dane zdarzenie, należy wpisać pomiędzy tymi dwoma liniami. Nazwa procedury w tym przykładzie kończy się parą pustych nawiasów.
m Northwind - Form Klienci (
Przedstawiciel
„Ofi!ion Compare Database
Private Sub Przedstawiciel_GotFocus() End Sub
Rysunek 1.5. Okno Kod programu z pustym szkieletem procedury obsługi zdarzenia dla wybranego obiektu. Tutaj można wpisać kod, który Access wykona, gdy zajdzie określone zdarzenie GotFocus
•
30
Programowanie w Access
Chociaż Visual Basic wyświetla wszystkie słowa kluczowe w kolorze ni< skim, można zmienić ich kolor na zakładce Format (Editor Format) w oknie dial wym Opcje (Options) (wybierz Narzędzia => Opcje w oknie Visual Basic Edi W oknie Kod programu wszystkie słowa kluczowe VBA automatycznie poja\ się pisane dużymi literami (zob. rys. 1.5 powyżej). W oknie tym znajdują się i rozwijane listy poniżej paska tytułu. Pole listy po lewej stronie nosi nazwę Ot (ang. object box). Pole to wyświetla wybrany w danej chwili element. Pole po pr stronie zwane jest polem procedury (ang. procedure box). Po kliknięciu w polu pi dury przycisku ze strzałką w dół pojawi się spis wszystkich procedur związai z obiektem wybranym w polu obiekt. Na liście ro2,wijanej pola procedur nazwa bi cej procedury obsługi zdarzenia oznaczona jest czcionką półgrubą. Rozwijaną procedur można zamknąć, klikając poza polem w pustym obszarze okna Kod gramu.
7. Wpisz następujące polecenie pomiędzy wstawionymi przez edytor Visual E słowami kluczowymi, oznaczającymi początek i koniec procedury:
Me.Przedstawiciel.BackColor = 65280
Zauważ, że po wpisaniu kropki Visual Basic wyświetla listę możliwych do boru elementów. Ta cecha programu jest częścią pomocy na żądanie, oferow przez edytor Visual Basic (zostanie ona omówiona dalej w tym rozdziale). Pierv procedura obsługi zdarzenia, którą właśnie utworzyłeś, wygląda następująco:
Private Sub Przedstawiciel_GotFocus()
Me.Przedstawiciel.BackColor = 65280 End Sub
Polecenie, które wpisałeś w szkielecie procedury, poleca Visual Basicowi zmi koloru tła pola tekstowego Przedstawiciel na jasno zielony, gdy kursor przesunie si^ niego.
W
oknie edytora Visual
Basic
wybierz Plik
=> Zamknij i wróć
do Micro;
Access.
Zwróć
uwagę na to, że słowa [Procedura
zdarzenia] znajdują
się t<
obok
nazwy właściwości Przy
uzyskaniu fokusu w
oknie Właściwości.
Uaktywnij teraz formularz Klienci i wybierz Widok => Widok formularz.
Kliknij
w polu Przedstawiciel,
po
tym zdarzeniu nastąpi
zmiana koloru tła.
raz
kliknij inne pole, zwróć uwagę, że kolor tła pola
Przedstawiciel
nie
ul
zmianie.
Dzieje się tak, ponieważ Visual
Basic
otrzymał informację, co nal
zrobić,
gdy określony element formularza zostanie wybrany. Jeżeli chcesz,
;
Wstęp do programowania VBA w Microsoft Accesie 2000
31
kolor tła zmienił się, gdy inny element formularza zostanie wybrany, powinieneś sporządzić jeszcze dodatkową procedurę - Przy utracie fokusu (On Lost Focus). Kod tej procedury pokazany jest poniżej. Aby sporządzić tę procedurę, wróć do trybu edycji formularza, kliknij pole tekstowe Przedstawiciel i uruchom okno właściwości dla wybranego elementu. Kliknij przycisk Buduj po prawej stronie właściwości Przy utracie fokusu na zakładce Zdarzenie, wybierz pozycję Konstruktor kodu i przystąp do wpisywania instrukcji, które zmienią kolor tła na oryginalny kolor (według wzoru poniżej).
Private Sub Przedstawiciel_LostFocus()
Me. Przedstawiciel.BackColor = 13434879 End Sub
11. Uruchom formularz Klienci i wybierz Widok zdarzenia według punktu 10 powyżej.
Widok formularza. Przetestuj
Ponieważ obiekty rozpoznają tzw. sekwencję zdarzeń, trzeba zrozumieć, kiedy dane zdarzenie zachodzi oraz znać kolejność, w jakiej następują poszczególne zdarzenia. Z dalszych rozdziałów dowiesz się, jakie zdarzenia może dana czynność spowodować. Znajomość zdarzeń umożliwia programowanie bardziej skomplikowanych aplikacji.
Podsumowanie
Z tego podrozdziału dowiedziałeś się, że procedury w Microsoft Accesie 2000 można sporządzać w standardowych modułach lub w modułach klasy. Ponadto dowiedziałeś się, że VBA posiada trzy typy procedur (Sub, funkcje oraz Property) i może reagować na różne zdarzenia wywołane przez użytkownika programu lub przez system operacyjny. Nauczyłeś się modyfikować wbudowane zachowanie aplikacji na dane zdarzenie, sporządzając prostą procedurę zdarzenia.
O kno edytora Visual Basic (VBE)
Teraz gdy potrafisz już sporządzać procedury obsługi zdarzeń w modułach klasy formularza lub raportu, poświęć trochę czasu na zapoznanie się z oknem edytora Visual Basic i dostępnymi w nim narzędziami.
Korzystając z narzędzi w oknie edytora Visual Basic, możesz:
Pisać procedury VBA;
Projektować formularze;
Przeglądać i modyfikować właściwości obiektów;
Testować procedury i wyszukiwać błędy;
Do tej pory okno edytora Visual Basic uruchamiałeś z okna Właściwości formularza lub raportu w trybie projektu. Okno VBE możesz uruchomić dodatkowo trzema innymi sposobami:
Z okna bazy danych - wybierz Narzędzia => Makro => Edytor Visual Basic.
W
oknie bazy danych - kliknij przycisk Moduły
a
następnie kliknij przycisk
Nowy
na pasku narzędzi, aby utworzyć nowy standardowy moduł, lub
kliknij
dwukrotnie
istniejący już moduł.
Z klawiatury - naciśnij kombinację klawiszy ALT+F11.
Okno eksploratora projektów
Folder Microsoft Access Class Objects (zob. rys. 1.6) w oknie eksploratora projektów umożliwia dostęp do modułów zawierających kod programowania formularzy oraz raportów. Folder Modules (Moduły) mieści tylko te moduły, które nie są związane z formularzami lub raportami.
Oprócz folderów Microsoft Access Class Objects oraz Modules projekt VBA może zawierać moduły klasy (ang. Class Modules), które służą do definiowania własnych obiektów. Korzystając z eksploratora projektów, możesz łatwo poruszać się pomiędzy modułami, które w danej chwili znajdują się w pamięci komputera.
Programowanie w Acc
•
UMUKU
ess Class Objects
J:
ł Microsoft Ac
| j
| jEU Form_Analiza sprzedaiy
i i H Form_Dialog raportów sprzedały
i j O Form_Dialog sprzedaiy wg lat
I i §| Formjtostawcy
i j f^j| Form_Panel g3ówny
I j-@ Form_Pracownicy
j f EH FormJYacownicy (z podzia!em strony)
i | El Form_Produkty
i j j-D Form_Zamówienia
| i O Form^amówienia - podformularz
i j |f Form_Zamówienia klientów - podformularz 1
| I- 9 Report_Sprzedai wg lat
i ; 8 Report_Sprzedai wg pracowników i krajów ń-iS Modules
i A Autostart
)■ ~«d{ Funkcja Pomoc Northwind
■; «źj Funkcje pomocnicze
Rysunek 1.6. Okno eksploratora projektów zapewnia dostęp do kodu procedur VBA Okno eksploratora projektów możesz uruchomić trzema sposobami:
Z menu Widok - wybierz polecenie Project Explorer (Eksplorator projektu)
Z klawiatury - naciśnij kombinację klawiszy Ctrl+R.
Z paska narzędzi - kliknij przycisk Project Explorer (Eksplorator projektu).
Uwaga: Jeżeli okno Eksplorator projektów jest widoczne na ekranie, ale nie jt w danej chwili aktywne, uaktywnij je, klikając na pasku tytułu tego okna.
Przyciski znajdujące się na standardowym pasku narzędzi (zob. rysunek lj umożliwiają szybki dostęp do szeregu narzędzi dostępnych w ekranie edytora Visua Basic.
File
Edit View Insert Bebug Run Tools Add-Ins Window
Help
^-y EgM ►
u mid
-sliSLf
roject
Explore (ari+R)[
Rysunek
1.7. Skorzystaj z przycisków
na pasku narzędzi, aby szybko uruchomić najczęściej używane
narzędzia znajdujące się w oknie Visual
Basic
Edytor (VBE)
H
Okno edytora Visual Basic (VBE)
35
W oknie Eksplorator projektów znajdują się trzy przyciski:
Pierwszy
przycisk z lewej - Pokaż
Kod programu (View
Code) -
wyświetla
okno
Kod
programu dla
wybranego modułu.
Środkowy
przycisk - Pokaż
obiekt (View
Object) -
wyświetla okno Obiekt
dla
wybranego
formularza lub raportu w
folderze Microsoft
Access Class
Ob
jects.
Ten
przycisk nie jest dostępny, gdy dany obiekt w folderze Moduły
lub
Moduły
klasy jest
już wybrany.
Przycisk
Przełącz
foldery (Toggle
Folders) umieszczony
po prawej stronie okna
Eksplorator
projektów ukrywa
lub pokazuje foldery obiektów.
Okno właściwości
Okno właściwości pozwala na przeglądanie i ustawianie właściwości wybranej w danej chwili klasy lub wybranego modułu. Nazwa wybranego obiektu pojawia się w polu Obiekt poniżej paska tytułu okna właściwości. Właściwości można przeglądać alfabetycznie lub według kategorii przez uruchomienie odpowiedniej karty. Okno właściwości wyświetla bieżące ustawienia dla wybranego obiektu.
Na karcie Alphabetic (Alfabetycznie) są wymienione w porządku alfabetycznym wszystkie właściwości zaznaczonego obiektu, które można zmieniać w czasie projektowania, wraz z ich bieżącymi ustawieniami. Zmian ustawień właściwości można dokonywać przez zaznaczenie nazwy właściwości oraz wpisanie lub wybór nowego ustawienia.
Properties - Przedstawiciel
{Przedstawiciel Textbox
Alphabetic |
Categorized J |
|
|
|
| Przedstawiciel |
|
|
fłterUpdate |
|
|
|
ftjiowAutoCorrec |
[True |
|
|
ftutoTab |
False |
|
|
BackCdor |
13434879 |
Ęm |
|
BackStyle |
ij'."."...I ! ! i |
■ |
|
BeforeUpdate |
|
|
|
BorderCotor |
8121504 |
|
|
BorderStyie |
1 |
|
|
3otderWidth |
;3 |
|
|
BottwrMargin |
0 |
|
|
CanGrow |
False |
|
|
CanShrhk |
False |
|
|
CokiwHidden |
'"'False ^ ' ''"I. |
|
|
CdurmOrder |
jo 7 '.". ........... |
|
|
CokjmnWidth |
1410 |
|
|
ControlSource |
Przedstawiciel |
|
|
ControlTlpText |
|
|
|
CortrolType |
109 |
|
|
iecimalPiaces |
'255 21 Zł |
|
|
DefauitValue |
. .,. |
|
Rysunek 1.8. Właściwości obiektu można zmodyfkować w oknie właściwości, gdy dany formularz lub raport znajduje się w widoku projektu
-
36
Programowanie w Access'.
N a karcie Categorized (Według kategorii) wymieniane są wszystkie właśc ści zaznaczonego obiektu, uszeregowane według kategorii. Listę właściwości m< zwinąć, co spowoduje pokazanie jedynie kategorii. Można też rozwinąć każdą kat rię, aby zobaczyć właściwości. Ikona ze znakiem plus (+) lub minus (-) umieszc; na lewo od kategorii pokazuje, czy spis jest rozwinięty, czy zwinięty.
Okno Właściwości możesz uruchomić trzema sposobami:
Z
menu Widok
(View)
-
wybierz polecenie Okno
właściwości (Properties
A
do
w).
Z klawiatury — naciśnij klawisz F4.
Z
paska narzędzi - kliknij przycisk Okno
właściwości (Properties
Windi
znajdujący
się po prawej stronie przycisku Eksplorator
projektów (Prc
Explorer)
(zob. rysunek
1.7).
Okno Kod programu
Okno Kod programu służy do wpisywania kodu programu w języku Visual sic oraz do przeglądania programu i poddawania go edycji. Każdy moduł VBA mc otworzyć w osobnym takim oknie. Okno Kod programu możesz uruchomić m pującymi sposobami:
• Z
okna Ekplorator
projektów (Project
Explorer) -
zaznacz odpowiedni for
larz
lub moduł, a następnie wybierz przycisk Pokaż
Kod programu ("V
Code).
Z menu w oknie edytora Visual Basic (View => Code).
Z klawiatury - naciśnij klawisz F7.
wybierz Widok => Kod progrs
U samej góry okna Kod programu znajdują sie dwa rozwijane pola listy, k umożliwiają szybkie poruszanie się w obrębie kodu procedur VBA. W polu Obi (Object) po lewej stronie okna Kod programu możesz wybrać obiekt, którego chcesz zobaczyć. Pole listy po prawej stronie okna Kod porgramu umożliwia wyl nie odpowiedniej procedury lub procedury zdarzeń w celu ich obejrzenia. Kliknii strzałki w dół po prawej stronie tego pola wyświetla posortowaną listę nazw wsz kich procedur znajdujących się w danym module. Jeżeli wybierzesz jakąś procec w polu listy Procedura/Zdarzenie (Procedure), to kursor przemieści się do pierw: go wiersza tej procedury.
Okno edytora Visual Basic (VBE)
37
MNorthwind - Form }' .■",'
pDklieirta
j KodPotztowy
Kraj | Miasto
Hag'owekFoi mularza
GotFocusQ Color = 652BQ
Region
Stanowisk 0P1zetlst .1 wiciel .i
StopkaFor mularza
Szczegół
Telefon
LostFocusQ Color =13434879
Rysunek 1.9. Pole listy rozwijanej Obiekt (Object) wyświetla obiekty, które są dostępne w module zaznaczonym w oknie Eksplorator projektów (Project Explorer)
Przeciągając linię podziału do wybranej pozycji w oknie Kod programu lub wybierając opcję Okno => Podziel (Window => Split), można podzielić okno na dwa okienka i każde z nich osobno przewijać (zob. rysunek 1.11). Umożliwia to jednoczesne przeglądanie różnych fragmentów długiej procedury lub równoczesnych dwóch procedur. Podział okna Kod programu na dwie części stosuje się również często przy kopiowaniu sekcji kodu między procedurami tego samego modułu. Linia podziału znajduje się nad górną strzałką, powyżej pionowego paska przewijania po prawej stronie okna Kod programu. Aby powrócić do trybu pracy w jednym oknie, należy przeciągnąć linię podziału do samej góry lub do dołu okna albo kliknąć ją dwukrotnie.
>>i.rlhwinft FormJOicnci (
"Tj
Przedstawicie!
KeyDown KeyPress [KeyUp LostFoeus
MouseDown MouseMove VlouseUp
Click
DblCiick
Enter
Exit
Private
Sub Przedstawiciel^
Me.Przedstawiciel.BackC End
Sub
Private Sub Przedstawiciel.
Me. Przedstawiciel.BackC End Sub
IjlJJ
Rysunek 1.10. Pole listy rozwijanej Procedura/Zdarzenie (Procedure) podaje spis zdarzeń, na które może zareagować obiekt wybrany w danej chwili w polu Obiekt. Jeżeli zaznaczony moduł zawiera procedury obsługi zdarzeń dla danego obiektu, to nazwy tych zdarzeń są pogrubione
I .
38
Programowanie w Acc
U dołu, po lewej stronie okna Kod programu znajdują się dwa przycisk
nazwie
Widok
procedury (Procedure
Viev/) wyświetla
wybraną procedui
wyświetlić
inną procedurę, otwórz pole listy Procedury,
znajdujące
się po
stronie
u góry okna Kod
programu. W
oknie Kod
programu można
w dane
wyświetlić
tylko jedną procedurę. Ikona o nazwie Pełny
widok modułu (]
View)
wyświetla
wszystkie procedury wybranego modułu. Skorzystaj zpioi
suwaka
przewijania, aby obejrzeć kod całej procedury. Obszar marginesu
\
Kod
programu służy
do wyświetlania specjalnych oznakowań w czasie mod;
testowania procedur (zob. dalej w tym rozdziale).
I
1 Opsion
Compare Database '
Użycw
kolejności bzay
danych
w po"j
I
Oomb f-1 ■ t i
i i _
fti
i; Jiciuf-
wskaźnik marqinesu
I Private Sub DodajProdukiy^ClickQ Tet ii 20 iv i ilwrjoi | On Error GoTo Erj^DadąjPreduktyJ
fm steOocName As String = "Produkty"
Sub Fofiti_8afcrsUpdaSe(Cafics! As Integer)
Jeśli Bezłsa tfft »prfiW!iti^(iis« >iv piiiy UHllfowyni Ki:
^ j. t [ i \ i -i , H ^ ' i r i <-l i --n I
Setec!
widok procedury
|
Exit Si*
Case "Francja*, "Wiochy", "Hiszpania" If LirfP»«e!|KodPoc2tDwyj) <> 5 Tbsn
widok modułu
Rysunek 1.11. Dzieląc okno Kod programu na dwie części, można przeglądać różne fragmenty długiej procedury lub dwie różne procedury
Inne okna na ekranie edytora Visual Basic
Oprócz okna Kod programu, w środowisku Visual Basica znajdują się je inne często używane okna. Karta Dokowanie (Docking) w oknie dialogowym C (Options), dostępna po wybraniu Narzędzia => Opcje (Tools => Options) z el
1
ni,
Okno
edytora Visual
Basic (VBE)
39
e dytora Visual Basic, wyświetla listę dostępnych okien i pozwala wybrać okna, które chcesz zakotwiczyć w oknie edytora Visual Basic.
Pomoc w sporządzaniu kodu procedur
Sporządzanie procedur w języku Visual Basic wymaga użycia setek wbudowanych instrukcji oraz funkcji tego języka. Ponieważ większość osób nie jest w stanie przyswoić sobie prawidłowej składni wszystkich instrukcji tego języka, w trakcie wprowadzania instrukcji w oknie Kod programu pojawiają się pomocnicze okienka z podpowiedziami. Korzystając z tych podpowiedzi, łatwo jest wpisać prawidłowy kod. Pasek narzędzi Edycja (Edit) w oknie edytora Visual Basic zawiera kilka przycisków, które przyśpieszają czynność wpisywania i formatowania instrukcji w oknie Kod programu. Jeżeli pasek ten nie jest włączony, można go wprowadzić na ekran, wybierając z menu Widok (View) polecenie Paski narzędzi (Toolbars).
Editor Editor Format j General Docking
r Dockable —
V Immediate Window • (7 Locals Window i |7 Watch Window I 17 Project Explorer i |7 Properties Window I f~ Object Browser
O K
Cancel
Help
R ysunek 1.12. Możesz skorzystać z karty Dokowanie w oknie dialogowym Opcje, aby wybrać okna, które mają być widoczne na ekranie edytora Visual Basic
Polecenie Wyświetl właściwości /metody
Jak wiadomo, każdy obiekt może posiadać dziesiątki właściwości i metod. Po wpisaniu nazwy obiektu w oknie Kod programu oraz kropki (.) oddzielającej nazwę obiektu od właściwości lub metody może pojawić się okno z rozwijaną listą, która zawiera wszystkie właściwości i metody danego obiektu. Aby lista ta otwierała się
40
Programowanie w Acce
automatycznie podczas pisania instrukcji procedury, należy upewnić się, że v dialogowym Opcje (wybierz Narzędzia => Opcje) na karcie Edytor (Editor) ■ znaczone pole wyboru Automatyczne wyświetlanie składowych (Auto List bers).
Jak korzystać z rozwijanej listy właściwości i metod?
Rozpocznij wpisywanie właściwości lub metody, którą chcesz użyć. W wpisywania kolejnych liter, zostanie podświetlony odpowiedni element na liść wijanej. Naciśnij Enter, aby wstawić wybrany element listy i przesunąć się ( wiersz w dół, lub naciśnij Tab, aby wstawić ten element i kontynuować wpis} dalszych instrukcji w tym samym wierszu.
Właściwość lub metodę możesz również wstawić do bieżącej instrukcji dwukrotne kliknięcie danego elementu listy. Naciśnij Esc, jeżeli chcesz zamkm rozwijaną bez wstawienia któregokolwiek jej elementu.
Zmniejsz wcięcie
Zwiększ wcięcie
Usuń oznaczenie komenta
W yświetl właściwości /metody
Wyświetl stałe Szybkie informacje
Informacje o parametrze
Dokończ wyraz
Oznacz blok jako komentarz
Rysunek 1.13. Pasek narzędzi Edycja zawiera szereg przycisków, które oszczędzają czas przy wpisywaniu instrukcji VBA
Jeżeli naciśniesz Esc, aby usunąć listę rozwijaną, Visual Basic nie wyświe ponownie dla tego samego obiektu. Aby znowu wyświetlić listę rozwijaną Właś ści/Metody, możesz:
nacisnąć kombinację klawiszy Ctrl+J,
nacisnąć klawisz cofania, aby usunąć kropkę, a następnie ponownie ją wpise
)00 Okno edytora Visual Basic (VBE)
41
• kliknąć prawym przyciskiem myszy w oknie Kod programu i wybrać z menu podręcznego polecenie Wyświetl właściwości/metody (List Properties/Methods),
» wybrać z menu Edycja polecenie Wyświetl właściwości/metody (List Properties/Methods).
Northwind - Mo<! ■; > ■
(General)
t| iOtwórzFormulaiz
S ub OtwórzFormularzO DoCmd.
End .,» AppiyFilter ■=» Beep ■3» CancelEvent ■2» Close «* CopyObject i» DeleteObject
R ysunek 1.14. Podczas wpisywania instrukcji programu Visual Basic sugeruje właściwości oraz metody, które mogą być użyte z danym obiektem
Polecenie Informacje o parametrze
Niektóre funkcje i metody VBA mogą przyjąć jeden lub więcej argumentów (lub parametrów). Jeżeli dana funkcja lub metoda Visual Basica wymaga argumentu, to możesz zobaczyć nazwy koniecznych i opcjonalnych argumentów w polu podpowiedzi, które pojawia się poniżej kursora po wpisaniu lewego nawiasu. Polecenie Parameter Info (Informacje o parametrze) (zob. rys. 1.15) ułatwia wpisanie prawidłowych argumentów w trakcie pisania funkcji lub metody VBA. Oprócz tego przypomina o innych dwóch sprawach, które są niezmiernie ważne przy tworzeniu prawidłowych funkcji i metod - porządku argumentów oraz typie danych każdego argumentu. Aby zobaczyć, jak działa polecenie Wyświetl stale, wpisz następującą instrukcję w oknie Kod programu:
DoCmd.OpenForm
Po wpisaniu odstępu po metodzie openForm pod kursorem pojawi się okno podpowiedzi. Bieżący argument wyświetlony jest pogrubioną czcionką. Po podaniu
42
Programowanie w Acces:
p ierwszego argumentu i wpisaniu przecinka Visual Basic wyświetli następny ment wytłuszczonym drukiem. Opcjonalne argumenty znajdują się w nawiasach dratowych [ ]. Aby zamknąć okno Wyświetl stałe, należy nacisnąć klawisz Esc otworzyć okno Informacje o parametrze klawiatury, trzeba wpisać dane pole lub funkcję, wstawić lewy nawias i nacisnąć Cl;rl+Shift+I. Można również kl przycisk Parameter Info (Informacje o parametrze) na pasku narzędzi Edycja ( lub wybrać Edycja => Informacje o parametrze (Edit => Parameter Info).
<• Northwind - ModuleZ (Code)
(General)
-I |l ltiNOIZFOIIIllll.il 7
S ub OtworzFormularzQ
DoCmd. OpenForm
6penForm(FomjMa/ne,
[IAewMsAcFomiView= acNormal], [FilteiNamĄ,
[WtiereConcMioĄ, [DataMocteAs
End
SutAcFormOpenDataMode=acFormPropertySettings],
[Wnrfov<*Wotfe/l3AcWindowMode= acWindowNormal],
;
[OpenA/gs])
Rysunek 1.15. Okno podpowiedzi podaje wykaz agumentów wykorzystywanych przez daną funkcję lub metodę VBA
Polecenie wyświetl stałe
Jeżeli w oknie dialogowym Opcje (Options) na karcie Edytor jest zaznać; pole wyboru Automatyczne wyświetlanie składowych (Auto List Members), t< wpisaniu znaku równości w oknie Kod programu pojawi się lista rozwijana, k zawiera stałe określone dla wpisanej właściwości. Pod pojęciem stałej rozumiem) taj konkretną wartość, która określa stan właściwości lub rezultat czynności. Ao i inne aplikacje należące do rodziny Microsoft Office posiadają własne zestawy v dowanych stałych.
Załóżmy, że chcesz otworzyć formularz w Widoku projektu. W aplik Microsoft Access formularz można otworzyć jednym z czterech sposobów: Wii formularza (Form view), Widok arkusza (Datasheet view), Podgląd podziału st (Print Layout view) oraz Widok projektu (Design view). Każdą z tych opcji rej zentuje wbudowana stała. Stałe programu Microsoft Access poprzedzone są liter; „ac". Po wpisaniu przecinka i odstępu po instrukcji w oknie Kod programu poj się okienko sugerujące nazwy stałych, które można użyć z metodą openForm:
DoCmd.OpenForm "Produkty",
Okno edytora Visual Basic (VBE)
43
• 'i iotwóizFoimulMZ
Sub OtwórzFormularzO
DoCmd.OpenForm "Produkty", |
OpenForm(FomiWa, Qg iacDesTgn JinView = acNoniMl], [FilterNamei, {WhereCondUioĄ, [DataMode As
End Suk AcFormOpenDataMi gj 'a'CFormDS tySettings], {WindovMode As AcWindowMode = acWindowNormal]
Ci) acNormal
acPreview
R ysunek 1.16. Okno Wyświetl stałe podaje listę stałych, które można użyć dla wpisanej właściwości lub metody
Okno Wyświetl stale (List Constants) można uaktywnić, naciskając klawisze Ctrl+Shift+J lub klikając przycisk o takiej samej nazwie na pasku narzędzi Edycja.
Polecenie Szybkie informacje
J eżeli w oknie Kod programu zaznaczysz nazwę instrukcji, funkcji, metody, procedury lub zmiennej i klikniesz przycisk Szybkie informacje (Quick Info) lub na-ciśniesz Ctr+I, Visual Basic wyświetli składnię zaznaczonego elementu i zaznaczy aktualny parametr. Aby szybkie informacje pojawiły się automatycznie podczas wpisywania instrukcji programu, należy upewnić się, że w oknie dialogowym Opcje na karcie Edytor jest zaznaczone pole wyboru Automatyczne szybkie informacje (Auto Quick Info).
(General)
Northwind
- ModuleZ (Code)
jTj 1 Ot wórzFormulai z
Sub OtwórzFormularzO
[JBBBBl.QrjenForm "Produkty", acDesign DoCmcl As DoCmd I
End Sub
i
R ysunek 1.17. Szybkie informacje podają składnię, parametry lub stałe
44
Programowanie w Acce;
P olecenie Dokończ wyraz
Jeszcze innym sposobem przyśpieszenia wpisywania instrukcji procedur w Kod programu jest automatyczne dokończank; wyrazów. Jeżeli użytkownik i liczbę znaków wystarczającą do zidentyfikowania danej instrukcji przez Visual to po kliknęciu przycisku Dokończ wyraz (Complete Word) na pasku narzędz cja lub naciśnięciu klawiszy Ctrl+spacja Visual Basic dokończy wyraz.
Na przykład, wpisz teraz w oknie Kod programu pierwsze trzy litery kluczowego Docmd i kliknij przycisk Dokończ wyraz (Complete Word) na pasł zędzi Edycja:
DoC
Visual Basic dokończy wyraz i w miejscu DoC pojawi się cała instrukcj Cmd. Jeżeli kilka słów kluczowych Visual Basica zaczyna się od takich samycl to po naciśnięciu kombinacji Ctrl+spacja pojawi się lista rozwijana, z której i samemu wybrać właściwe słowo. Wpisz teraz tylko trzy początkowe litery w Application, naciśnij Ctrl+ spacja i dokończ słowo, wybierając je z listy rozwij
Polecenia Zwiększ/zmniejsz wcięcie
Na karcie Edytor w oknie dialogowym Opcje znajduje się kilka ustawie tyczących kodu programu, które można włączyć automatycznie.
Zaznaczenie pola wyboru Automatyczne wcięcie (Auto Indent) urno; wcięcie zaznaczonych wierszy kodu programu w prawo o liczbę spacji wj w polu Tabulacja (Tab Width). Ustawienie wyjściowe w tym polu wynosi < spacje. Szerokość tabulatora można zmienić w każdej chwili, wpisując nową wi w polu Tabulacja.
Stosowanie wcięć w kodzie programu zwiększa jego czytelność i jest szczep pożądane przy wpisywaniu instrukcji, które podejmują decyzje lub powtarzają ności. Zobaczmy, jak tworzyć oraz usuwać woięcia poszczególnych wierszy rzystając z formularza Zamówienia w bazie danych Northwind.
1. W
oknie Eksplorator
projektów
(Project
Explorer) kliknij
dwukrotnie n
obiekt
Form_Zamówienia
w
folderze Microsoft
Access Class
Objects.
Kod programu powinno pokazać procedury obsługi zdarzeń sporządzon tego formularza.
2. W
oknie Kod
programu zaznacz
blok kodu rozpoczynający
się od słowa
czowego
If
i
zakończony słowami kluczowymi End
If.
imm
Okno edytora Visual Basic (VBE)
45
K
liknij
przycisk Zwiększ
wcięcie (Indent)
na
pasku narzędzi Edycja
lub
naciśnij
klawisz
Tab.
Wybrany
blok instrukcji przesunie się
o cztery spacje w prawo, jeżeli korzystasz
z
wyjściowego ustawienia w polu Tabulacja
(Tab
Width) w
oknie dialogu
Opcje
(Options)
na
zakładce Edytor.
Kiknij
przycisk Zmniejsz
wcięcie
(Outdent)
na pasku narzędzi Edycja
lub
naci
śnij
klawisze Shift+Tab,
aby
cofnąć wybrane wiersze kodu do poprzedniej po
zycji
w oknie Kod
programu.
Opcje Zwiększ/Zmniejsz wcięcie są również dostępne z menu głównego na ekranie edytora Visual Basic.
Polecenia Oznacz blok jako komentarz i Usuń oznaczenie komentarza
Apostrof umieszczony na początku wiersza kodu oznacza komentarz. Oprócz objaśniania procedur lub konkretnych instrukcji komentowanie instrukcji programu jest bardzo pożyteczne przy testowaniu procedur VBA. Na przykład, jeżeli odtwarzana procedura nie przebiega zgodnie z oczekiwaniami, zamiast usuwać wiersze kodu, które mogą być powodem problemów, można na razie je pominąć i wrócić do nich później. Wystarczy umieścić apostrof na początku tych instrukcji, a Visual Basic je pominie. W ten sposób można kontynuować sprawdzanie pozostałych instrukcji danej procedury.
Editor I Editor Format) General | O
r Code Settings
■| P Auto Syntax Check
\ X" Require Variable Declaration
j p Auto Ust Members
I p Auto Quick Info
I p Auto Data Tips
P Auto Indent Tab Width: |T~
rWindow Settings
; p Drag-and-Drop Text Editing I? Default to Full Module View P Procedure Separator
Cancel
Help
Rysunek 1.18. Okno dialogowe Opcje zawiera polecenia, które można włączyć lub wyłączyć, aby dopasować środowisko programowe Visual Basic do swoich potrzeb
46
Programowanie w Aci
Innym razem może zajść potrzeba oznaczenia całego bloku instruk komentarza. Zamiast wstawiać apostrof na początku każdego wiersza in o wiele łatwiej jest zaznaczyć cały blok instrukcji i kliknąć przycisk Oznacz ko komentarz (Comment Block) na pasku narzędzi Edycja. Visual Bas matycznie doda znak komentarza w każdym wierszu zaznaczonego tekstu. Ko można tak samo błyskawicznie usunąć, korzystając z przycisku Usuń ozn komentarza (Uncomment Block).
Jeżeli nie zaznaczysz tekstu i klikniesz przycisk Oznacz blok jako kor (Comment Block), apostrof zostanie dodany na początku wiersza kodu, w w danej chwili znajduje się kursor.
Korzystanie z okna Przeglądarka obiektów
Poruszanie się w skomplikowanym zespole elementów Visual Basica ji twione dzięki specjalnemu narzędziu pracy o nazwie Object Browser (Przeg obiektów). Narzędzie to jest dostępne na ekranie edytora Visual Basic.
Przeglądarkę obiektów możesz uruchomić następującymi sposobami:
Z klawiatury - naciśnij klawisz F2.
Z
menu - wybierz Widok
=> Przeglądarka obiektów (View
=> Object
ser).
Z
paska narzędzi - kliknij przycisk Przeglądarka
obiektów t*
na pasku
dzi.
Przeglądarka obiektów pokazuje zarówno obiekty, z których mogą koi procedury, jak i właściwości, metody i zdarzenia. Przeglądarka obiektów służ nież do szybkiego poruszania się między procedurami, do poszukiwania ob i metod mieszczących się w różnych bibliotekach obiektów oraz do wklejania cowych instrukcji kodu na kartki modułu.
U góry okna znajduje się lista rozwijana z wyszczególnionymi nazwami w kich bibliotek i projektów, do których aktualnie odwołuje się aktywny projeki lioteką nazywamy specjalny plik, zawierający informacje na temat obiektów aplikacji. Biblioteki dodaje się w oknie dialogowym Odwołania (References), wienie Wszystkie biblioteki (All Libraries) pozwala na wyświetlenie obi wszystkich bibliotek zainstalowanych w danym komputerze. Biblioteka o nazwi cess zawiera nazwy obiektów, które występują tylko w aplikacji Microsoft A W odróżnieniu od biblioteki Access, biblioteka VBA wymienia nazwy obiektov rakterystycznych dla tego języka.
:
Okno edytora Visual Basic (VBE)
47
P oniżej listy bibliotek znajduje się pole Poszukiwany tekst (Search box), które ułatwia wyszukiwanie informacji w wybranej bibliotece. Pole to pamięta cztery ostatnio wprowadzone ciągi znaków aż do chwili zamknięcia projektu. Aby wyszukiwać tylko całe wyrazy, należy kliknąć prawym przyciskiem myszy w oknie Przeglądarka obiektów i wybrać z menu podręcznego polecenie Znajdź tylko całe wyrazy (Find Whole Word Only).
Lista Wyniki wyszukiwania (Search Results) wyświetla bibliotekę, klasę i składową elementów, które zawierają poszukiwany ciąg znaków. Okno Wyniki wyszukiwania zmienia się stosownie do bieżącego zaznaczenia w polu Projekt/Biblioteka. Okno Wyniki wyszukiwania można włączyć lub wyłączyć, klikając przycisk znajdujący się po prawej stronie przycisku z rysunkiem lornetki.
W dolnej części okna Przeglądarka obiektów lista Klasy wyświetla wszystkie dostępne klasy w zaznaczonej bibliotece. Po wybraniu nazwy obecnie otwartej bazy danych (np. Northwind) w polu listy Projekt/Biblioteka lista Klasy wyświetla obiekty wymienione w oknie Eksplorator projektów. Na rysunku 1.19 wybrana jest klasa obiektu Form_Pracownicy. Po zaznaczeniu klasy lista po prawej stronie (Members) podaje właściwości, metody i zdarzenia, których dana klasa może używać. Chociaż składowe (elementy) klasy są uszeregowane alfabetycznie, można je również uporządkować według typu grup (właściwości, metody, zdarzenia) za pomocą polecenia Grupuj składowe z menu podręcznego Przeglądarki obiektów.
Jeżeli zaznaczysz w polu Projekt/Biblioteka projekt o nazwie Northwind, to lista Members wyszczególni procedury znajdujące się w tym projekcie. Aby przestudiować kod dowolnej procedury, kliknij dwukrotnie myszą na jej nazwę. Jeżeli wybierzesz bibliotekę VBA w polu listy Projekt/Biblioteka, to zobaczysz wykaz wbudowanych funkcji i stałych Visual Basic. Jeżeli potrzebujesz więcej informacji na temat wybranej klasy lub jej składowej, kliknij znak zapytania umieszczony u góry okna Przeglądarka obiektów.
W dolnej części okna Przeglądarka obiektów znajduje się okno Szczegóły, które pokazuje definicję zaznaczonej składowej. Klikając myszą w oknie Szczegóły, możesz przemieścić się do klasy lub biblioteki, do której należy dany element. Tekst zawarty w oknie Szczegóły można skopiować do Schowka, aby go następnie wkleić do arkusza modułu. Przy odpowiednim ustawieniu ekranu można przeciągnąć zaznaczoną w dolnej części okna Przeglądarka obiektów składnię bezpośrednio do okna Kod programu.
Wielkość poszczególnych części okna Przeglądarka obiektów można dopasować do własnych potrzeb. Paski podziału okien znajdują się między polem Klasy a polem Składowe, listą Wyniki wyszukiwania a polami Klasy i Składowe, polami Klasy i Składowe a oknem Szczegóły. Paski te można przesunąć w lewo i w prawo, poziomo lub pionowo.
48
Programowanie w Acce
" < - ■ • >
Pole listy Projekt/Biblioteka HUH
Poszukiwany tekst —
f
Search Results
L ibrary
Member
T utaj pojawiają się rezultaty wyszukiwania.
F«nn_Pracownicy {z podzia Form_Pr<Hhikty
J
Members of **gfobals>' -* cios^Foi in * FixAltOataAccessPages i* FixPageCoiaiection
F orm Zamówienia klientów "H
IsftARepiica
S zczegóły
Project NoitliwRKl C:'sA fiLCSBOmfR02OIVJt1ihwind.mdb
Rysunek 1.19. Okno Przeglądarka obiektów umożliwia przeglądanie wszystkich obiektó\ właściwości oraz metod dostępnych w bieżącym projekcie VBA
Teraz gdy zapoznałeś się z Przeglądarką obiektów, na pewno zastanawias: w jaki sposób można ją wykorzystać w programowaniu procedur VBA. Załóżm chcesz napisać procedurę VBA, która będzie kontrolowała pole wyboru umieszc na formularzu i zamierzasz przestudiować listę właściwości i metod charakterys nych dla obiektu pola wyboru.
W
polu listy
Projekt/Biblioteka
(zob.
rysunek 1.19) kliknij strzałkę
v
i
wybierz bibliotekę Access.
Wpisz
checkbox
w
polu Poszukiwany
teksi: i
kliknij przycisk Szukaj
(Sea
Upewnij
się,
że wpisany tekst nie zawiera spacji.
Visual Basic przeszukuje bibliotekę Access i wyświetla rezultaty. Po przeai zowaniu wyników poszukiwania w oknie Przeglądarka obiektów możesz odna odpowiednie instrukcje przydatne w pisaniu procedur VBA. Porównując eletrn składowe, zapewne szybko wywnioskujesz, że pole wyboru można włączyć lub w czyć, korzystając z właściwości Enabled. Aby otrzymać szczegółowe inform;
Okno edytora Visual Basic (VBE)
49
o składowej odnalezionej w oknie Przeglądarka obiektów, zaznacz daną składową inaciśnij Fl. Uruchomisz w ten sposób wbudowaną pomoc.
Korzystanie z biblioteki obiektów VBA
Podczas gdy biblioteka Access zawiera obiekty specyficzne w użyciu aplikacji Microsoft Access, biblioteka obiektów VBA daje dostęp do wielu wbudowanych funkcji VBA. Funkcje te mają charakter ogólny. Pozwalają na zarządzanie plikami, ustawianie daty i godziny, pobieranie informacji od użytkowników, zmianę typu danych, przetwarzanie łańcuchów tekstu lub wykonywanie obliczeń matematycznych. Oto ćwiczenie prezentujące użycie wbudowanych funkcji VBA w celu utworzenia na dysku nowego folderu prosto z aplikacji Accessa.
W
oknie bazy danych kliknij przycisk Moduły,
następnie
wybierz Nowy, aby
utworzyć
nowy standardowy moduł.
W oknie Kod programu wpisz nazwę procedury sub NowaTeczka ().
Naciśnij Enter. Visual Basic wpisze końcowe słowa kluczowe procedury End
Sub.
Naciśnij F2, aby otworzyć okno Przeglądarka obiektów.
Kliknij
strzałkę
w dół obok pola listy Projekt/Biblioteka
i
wybierz bibliotekę
VBA.
W polu Poszukiwany tekst wpisz file i naciśnij Enter.
Odszukaj i zaznacz w spisie składowych metodę MkDir.
Kliknij
przycisk Kopiuj
w oknie
Przeglądarka
obiektów, aby
skopiować wy
braną
metodę do Schowka aplikacji Windows.
Zamknij
okno Przeglądarka
obiektów i
wróć do okna Kod
programu. Wklej
skopiowaną
instrukcję wewnątrz procedury NowaTeczka.
Wpisz
spację
oraz nazwę foderu „C:\Nauka"
w cudzysłowie. Procedura Nowa
Teczka
podana jest poniżej:
Sub NowaTeczka()
MkDir "C:\Nauka" End Sub
1 1. Wybierz Uruchom => Uruchom Sub/UserForm (Run aby uruchomić procedurę NowaTeczka.
Run Sub/UserForm),
50
Programowanie w Access
W trakcie wykonania kodu procedury NowaTeczka Visual Basic zakłada na ku C komputera nowy folder. Aby zobaczyć ten folder, uaktywnij Eksplorator 1 dows. Po założeniu nowego folderu często okazuje się, że nie jest on potrzebny, ciąż z łatwością mógłbyś usunąć ten folder przy użyciu Eksploratora Windows baczmy, jak to zrobić za pomocą VBA. Przeglądarka obiektów wyświetla wiele tod, które są przydatne w pracy z plikami i folderami. Metoda RmDir jest tak s prosta w użyciu jak metoda MkDir, zastosowana w procedurze NowaTeczka. Z; aby usunąć folder z dysku, po prostu zastąp metodę MkDir metodą RmDir i uruc ponownie procedurę NowaTeczka. Możesz też sporządzić nową procedurę o na; UsuńTeczkę, według wzoru podanego poniżej:
Sub UsuńTeczkę()
RmDir "C:\Nauka" End Sub
Przy pisaniu własnych procedur VBA dobrze jest skonsultować z Przeglądarką obiektów co do nazw wbudowanych funkcji VBA.
Korzystanie z okna Instrukcje bezpośrednie
Okno Instrukcje bezpośrednie (Immediate window) pełni funkcję brudnop programisty, w którym można wypróbować polecenia VBA przed użyciem w procedurach. Jest to wspaniałe narzędzie do przeprowadzania eksperymentów ję; kowych. Instrukcje wpisane w tym oknie natychmiast pokazują wynik. Aby uaktywi to okno, uruchom ekran edytora Visual Basic i wybierz Widok => Okno Instrukf bezpośrednie (View => Immediate Window).
Okno Instrukcje bepośrednie można przesunąć w dowolne miejsce na ekrai edytora Visual Basic lub zadokować, tak aby zawsze pojawiało się w tym sam] miejscu. Opcja dokowania ustawiana jest w oknie dialogowym Opcje (wybierz f rzędzia => Opcje). Aby szybko uruchomić to okno, naciśnij klawisze Ctrl+G ekranie edytora Visual Basic. Aby zamknąć okno Instrukcje bezpośrednie, klik przycisk Zamknij (Close) w prawym górnym rogu okna. Okno Instrukcje be pośrednie umożliwia wpisywanie poleceń VBA i wypróbowywanie ich wyników b potrzeby pisania osobnej procedury. Używaj go do testowania swojego kodu. Ja polecenie daje poprawny wynik, możesz skopiować je z okna Instrukcje bezpośre nie do swojej procedury (lub przeciągnąć instrukcję do okna Kod programu, jeż okno to jest w danej chwili widoczne). Krótkie ćwiczenie, podane poniżej, demo struje sposób sprawdzania instrukcji oraz uzyskiwania wyników w oknie Instrukc bezpośrednie.
Okno edytora Visual Basic (VBE)
51
U ruchom ekran edytora Visual Basic, naciskając klawisze Alt+Fll.
Naciśnij klawisze Ctrl+G, aby uaktywnić okno Instrukcje bezpośrednie.
Wpisz następującą instrukcję w oknie Instrukcje bezpośrednie i naciśnij Enter:
DoCmd.OpenForm "Dostawcy"
Jeżeli poprawnie wpisałeś powyższe polecenie, to Visual Basic otworzy teraz formularz Dostawcy, pod warunkiem że baza danych Northwind jest w tej chwili otwarta.
4. Wpisz następujące polecenie w oknie Instrukcje bezpośrednie:
Debug. Print Forms!Zamówienia.RecordSource
(Po wpisaniu powyższej instrukcji należy nacisnąć Enter).
Po wciśnięciu klawisza Enter Visual Basic informuje, że kwerenda Zamówienia jest źródłem rekordów (RecordSource) dla formularza Zamówienia. Za każdym razem, gdy wpiszesz instrukcję w oknie Instrukcje bezpośrednie i naciśniesz Enter, Visual Basic wykona polecenie w wierszu, w którym znajduje się w danej chwili kur-sor. Jeśli zechcesz ponownie sprawdzić wpisaną poprzednio instrukcję, wystarczy kliknąć myszą w wierszu tej instrukcji i nacisnąć Enter. Aby zdobyć więcej praktyki, wykonaj ponownie polecenia podane na rysunku 1.20. Zacznij od instrukcji w pierwszym wierszu okna. Wywołaj każdą instrukcję po kolei, klikając w odpowiednim wierszu okna i naciskając Enter.
Immediate
I
D oCmd.OpenForm "Dostawcy"
Debug.Print ForrnslZamówienia. RecordSource
jlLJ
Rysunek 1.20. Używaj okna Instrukcje bezpośrednie do ewaluacji i sprawdzania instrukcji języka Visual Basic, których zamierzasz użyć w swoich procedurach VBA
Dotychczas korzystaliśmy z okna Instrukcje bezpośrednie w celu sprawdzenia poprawności działania wpisanych poleceń. Okno Instrukcje bezpośrednie pozwala również na zadawanie pytań. Załóżmy, że chcesz dowiedzieć się „Ile formantów znajduje się w formularzu Dostawcy?" albo „Jak nazywa się bieżąca aplikacja?". Pracując w oknie Instrukcje bezpośrednie, łatwo uzyskasz odpowiedzi na te i inne pytania.
52
Programowanie w Acc
W poprzednim przykładzie wpisałeś dwie instrukcje. Wróćmy do okna I cje bezpośrednie, aby zadać teraz parę pytań. Access pamięta instrukcje w oknie Instrukcje bezpośrednie nawet po zamknięciu tego okna. Zawarte okna jest automatycznie usuwana w momencie zakończenia pracy z aplikacją^
1. Kliknij
w nowym wierszu okna Instrukcje
bezpośrednie
i
wpisz podane
polecenie,
aby dowiedzieć się, ile formamów znajduje się w formularzu I
cy:
?Forms!Dostawcy.Controls.Count
Po naciśnięciu klawisza Enter Visual Bade podaje w nowym wierszu o] powiedź na zadane pytanie.
2. Kliknij
w nowym wierszu okna Instrukcje
bezpośrednie
i
wpisz nasti
pytanie:
?Application.Name
Po naciśnięciu klawisza Enter Visual Basic podaje w nowym wierszu ol zwę aktywnej aplikacji.
3. W nowym wierszu okna Instrukcje bezpośrednie wpisz następujące pytar
?12/3
Po naciśnęciu klawisza Enter Visual Basic podaje w nowym wierszu wynik dzielenia. Załóżmy jednak, że od razu chcesz wiedzieć, ile jest 3+2 i ile v 12*8. Zamiast wpisywać instrukcje w oddzielnych wierszach, można to w jednym wierszu, zaznaczając podział linii dwukropkiem według wzoru poniżę
?3+2:?12*8
Zwróć uwagę na znak dwukropka odzielająey dwa bloki instrukcji. Po wciś klawisza Enter Visual Basic poda odpowiednio wyniki 5 oraz 96, wpisu w oddzielnych wierszach. Wypróbuj jeszcze następującą instrukcję w oknie Ins cje bezpośrednie:
?Application.GetOption("Default Database Directory")
53
tce
na-
ikna nosi obić
okno edytora VisualBasic_(VBE)_
D eQyiDla » .cv.*..
Zamiast używać znaku zapytania, możesz poprzedzić instrukcje wpisywane w oknie Instrukcje bezpośrednie poleceniem Print, według wzoru podanego poniżej: Print Application. GetOption( "Show System Objects")
Visual Basic zwraca wartość -1, jeżeli polecenie jest prawdziwe (True), lub zero (0), jeżeli jest fałszywe (False). W kolejnych rozdziałach dowiesz się, w jaki sposób można uruchomić procedury oraz funkcje z okna Instrukcje bezpośrednie. Aby usunąć instrukcje z tego okna, zaznacz wiersze, które chcesz usunąć i naciśnij klawisz Delete.
Podsumowanie
W poprzednim rozdziale poznałeś kilka metod zdobywania wiedzy na temat języka Visual Basic dla Aplikacji. Teraz dowiedziałeś się, kiedy należy używać określonych narzędzi:
• Jeżeli nie znasz znaczenia zastosowanych w danej procedurze nazw obiektów, właściwości lub metod, uruchom wbudowaną pomoc, naciskając klawisz Fl. Jeżeli potrzebujesz szybkiego wykazu właściwości i metod każdego istniejącego obiektu lub masz kłopot w odnalezieniu jakieś procedury, skorzystaj z Przeglądarki obiektów.
Jeżeli chcesz eksperymentować z instrukcjami VBA i od razu zamierzasz sprawdzić wyniki poleceń VBA, uruchom okno Instrukcje bezpośrednie.
ięciu
*P Je truk-
Z mienne, typy danych oraz stałe
Wcześniej w tym rozdziale podczas pracy w oknie Instrukcje bezpośrednie
wypróbowałeś kilka poleceń języka Visual Basic, które zwróciły jakąś informację. Na przykład po wpisaniu instrukcji:
?Forms ! Dostawcy. Controls . Count
dowiedziałeś się, ile formantów znajduje się w formularzu Dostawcy. Jednakże poza oknem Instrukcje bezpośrednie, pisząc własne procedury VBA, nie można używać znaku zapytania. Jeżeli pominiesz znak zapytania i wpiszesz instrukcję Forms [Dostawcy, controls .Count w swojej procedurze, Visual Basic nie zatrzyma się, aby oznajmić rezultat tego polecenia. Jeśli chcesz wiedzieć, jaki był wynik po wykonaniu danego polecenia, to należy polecić Visual Basicowi, aby go zapamiętał. W programowaniu zapamiętywanie wyników instrukcji należy do zmiennych.
Czym są zmienne
Zmienna jest po prostu nazwą, którą możesz samodzielnie nadać obszarowi pamięci komputera, gdzie są przechowywane dane. Za każdym razem, gdy zechcesz zapamiętać wynik którejkolwiek instrukcji Visual Basica, wymyśl nazwę, mającą ten wynik reprezentować. Na przykład, jeżeli chcesz śledzić liczbę formantów w określonym formularzu, możesz wymyślić nazwę taką, jak liczbaFormant, liczFor-manty albo ilośćPól.
Nazwy zmiennych składają się z liter, cyfr i niektórych znaków przestankowych, z wyjątkiem:
, # $ % & @ !
Nazwa zmiennej nie może zaczynać się od cyfry i nie może być w niej spacji. Jeśli chcesz nazwać swoją zmienną więcej niż jednym wyrazem, to używaj w miejscu spacji znaku podkreślenia ( _). Najlepiej jest wymyślać proste i krótkie nazwy zmiennych, dzięki temu unikniesz niepotrzebnego wpisywania znaków, kiedy w danej procedurze nieraz trzeba będzie się odwołać do jakiejś zmiennej (nazwa zmiennej może
56
Programowanie w Acce
s kładać się z 254 znaków!). Visual Basic nie rozróżnia wielkich i małych lit< ułatwić czytanie nazw zmiennych i wykluczyć mylenie ich z nazwami obiektó' ściwości i metod, nazwę zmiennej pisze się małą literą, a gdy składa się ona z wyrazów, często używa się wielkich liter m początku drugiego (np. lies
imię_Nazwisko).
Zarezerwowanych słów nie można używać jako nazw zmiennych
Nazwą zmiennej może być dowolne słowo, z wyjątkiem pewnych zarezei nych w języku angielskim, które stanowią instrukcje VBA. Na przykład słów; jak Name, Len, Empty, Local, Currency albo Exit, użyte jako nazwy zmienny i wodują wyświetlenie komunikatu o błędzie.
Nazwy zmiennych powinny się kojarzyć z ich rolą
Wybieraj takie nazwy dla zmiennych, które będą jednoznacznie sugerow rolę. Większość programistów korzysta zpreJiksu określającego typ zmieni przykład, odnajdując w kodzie procedury nazwę zmiennej z prefiksem „str" zwa), od razu można się zorientować, że zmienna ta przechowuje łańcuch 5 (tekst).
Typy danych
Pisanie procedur w języku VBA ma umażliwiać manipulowanie danyr nieważ procedura będzie operowała różnymi rodzajami informacji, należy dow się, w jaki sposób Visual Basic przechowuje dajie. Termin typ danych określa przechowywania danych w pamięci komputera. Na przykład dane mo£ przechowywane w postaci cyfr, napisów, dat, obiektów itp. Jeżeli zapomnisz p mować Visual Basic o typie swoich danych, Visual Basic przypisze tym dan o nazwie Variant. Variant potrafi sam ocenić rodzaj przetwarzanych danych i ich typ. Typy danych w Visual Basicu zostały podane w tabeli 1.1. Oprócz wbi nych typów danych możesz definiować własne typy danych. Ponieważ typy mają różne wymagania co do pamięci komputera, niektóre z nich są „droższe" nych. Z tego względu, aby zaoszczędzić pamięć i nie obciążać procedur, pow używać takiego typu danych, który potrzebuje jak najmniej bajtów i jednocześ w stanie poradzić sobie z rodzajem danych, którymi przygotowana przez ciebie dura musi manipulować.
ess 2000 Zmienne, typy danych oraz stałe
T abela 1.1. Typy danych w VB A
Typ Danych |
Wielkość (w bajtach) |
Charakterystyka (zakres) |
Boolean |
2 |
Wartość logiczna Tak i Nie True albo False |
Byte |
1 |
Mała liczba całkowita od 0 do 255 |
Integer |
2 |
Liczba całkowita Od -32 768 do 32 767 |
Long |
4 |
Liczba całkowita długa (miliardy) od -2 147 483 648 do -2 147 483 648 |
Single |
4 |
Liczba rzeczywista (może mieć część ułamkową) od -3.402823E38 do 1.401298E45 |
Double |
8 |
Liczba rzeczywista dwukrotnie większa od liczby Single od -1.79769313486232E308 do -4,94065645841247E-324 liczby ujemne; od 4,94065645841247E-324 do 1,79769313486232E308 liczby dodatnie |
Currency- |
8 ■ |
Liczba całkowita z kropką dziesiętną między czwartą a piątą kropką od prawej strony od -922.337.203.685.477.5808 do 922.337.203.685.477.5807 |
Decimal |
14 |
Dla skali 0 (bez miejsc po przecinku) największą możliwą wartościąjest +/-79 228 162 514 264 337 593 543 950 335. Dla 28 miejsc po przecinku największą wartościąjest +/-7,9228162514264337593543950335, najmniejszą niezerową wartościąjest +/-0,0000000000000000000000000001. |
Date |
8 |
Data w przedziale od 1/1/100 do 31/12/9999 |
58
Programowanie w Acce
Typ Danych
Wielkość (w bajtach)
Charakterystyka (zakres)
S tring
(ustalonej
długości)
długość ciągu znaków
Łańcuch znaków
od 0 do 65535 znaków (64K)
S tring
(zmiennej
długości)
10 +długość ciągu
Od 0 do około 2 mil; ardów
O bject
Umożliwia dostęp do któregokolwiek obiektu, rozpozm wanego przez Access
A rray
zależy od
wielkości
tablicy
V ariant (z liczbami)
16
Wartość numeryczna w zakresie typu Double
V ariant (ze znakami)
22 + długość ciągu
Zakres jest taki sam jak string zmiennej długości
Tworzenie zmiennych
Możesz utworzyć zmienną, deklarując ją za pomocą specjalnej instrukcji li prostu stosując jej nazwę w instrukcji. Deklarowanie zmiennych oznacza pow mienie Visual Basica o nazwie zmiennej, której zamierzasz używać, oraz o typi nych, które zmienna ta będzie przechowywać. Jest to wymuszona deklaracja zr nych, określana angielskim terminem explicit variable declaration.
Korzyści wynikające z zadeklarowania zmiennych przed ich użyciem
Deklaracja
zmiennej przed jej użyciem przyśpiesza wykonanie proce
i
oszczędza pamięć. Ponieważ Visual
Basic
zna z góry typ danych, rezer
tylko
tyle pamięci, ile konieczne jest do przechowywania danych.
Deklaracja
zmiennej przed jej użyciem ułatwia czytanie i zrozumienie
proce
ponieważ
wszystkie zmienne są wymienione la początku danej procedury.
Zmienne, typy danych oraz stałe
59
• Deklaracja zmiennej przed jej użyciem zapobiega błędom, które mogą wyniknąć z nieprawidłowego wpisania nazwy zmiennej. Visual Basic automatycznie poprawia nazwę zmiennej, kierując się pisownią użytą w jej deklaracji.
Jeżeli z góry nie powiadomisz Visual Basica o zmiennej, to w momencie, gdy odwołasz się do niej w procedurze, Visual Basic automatycznie utworzy tę zmienną i przypisze jej typ danych o nazwie Variant (zob. tab. 1.1). Chociaż niedeklarowanie zmiennych (ang. implicit variable declaration) jest dość wygodne, gdyż nie trzeba pisać dodatkowych instrukcji deklaracji, to jednak takie postępowanie może spowodować wiele problemów.
Konsekwencje pominięcia deklaracji zmiennych
• Jeżeli zrobisz błąd w nazwie zmiennej, Visual Basic wyświetli komunikat o błędzie w trakcie odtwarzania procedury lub utworzy nową zmienną. Z pewnością stracisz sporo czasu, zanim zorientujesz się, dlaczego procedura nie działa tak, jak powinna. Unikniesz takich błędów, jeżeli zadeklarujesz każdą zmienną przed użyciem.
« Ponieważ Visual Basic nie wie, jaki typ danych dana zmienna ma przechowywać, zostanie jej przypisany typ danych variant. Chociaż variant może przechowywać dowolny typ danych, wymaga on większej ilości pamięci niż inne typy danych. W związku z tym procedura może być wolniejsza, gdyż Visual Basic musi sprawdzać typ danych za każdym razem, gdy napotka zmienną niezadekla-rowaną u góry procedury.
Deklarowanie zmiennych
Deklaracja zmienej polega na wpisaniu specjalnej instrukcji Dim (skrót ang. terminu dimension, poi. wymiar), po której następuje nazwa zmiennej oraz jej typ. Przypuśćmy, że chcesz, aby procedura wyświetliła wiek pracownika. Aby móc obliczyć wiek, należy najpierw podać procedurze datę urodzenia pracownika. Aby to zrobić, zadeklaruj zmienną o nazwie DataUrodzenia w następujący sposób".
Dim DataUrodzenia As Date
Zwróć uwagę, że słowo kluczowe Dim poprzedza nazwę zmiennej (DataUrodzenia). Jeżeli nie podoba ci się ta nazwa, to możesz ją zastąpić innym wyrazem lub wyrazami (grunt by wybrana nazwa nie była jednym z zarezerwowanych słów kluczowych Visual Basica). Typ danych, które dana zmienna ma przechowywać, określa się za pomocą słowa kluczowego as oraz jednego z typów danych z tabeli 1.1. Typ danych Date oznajmia Visual Basicowi, że zmienna DataUrodzenia ma przechowywać datę.
60
Programowanie w Access
A by zachować wiek pracownika, zadeklaruj zmienną o nazwie wiek:
Dim wiek As Integer
Zmienna wiek będzie przechowywać liczbę lat między dzisiejszą datą i datą dzenia danego pracownika. Ponieważ wiek podaje się w postaci liczby całkoi zmiennej ten przypisaliśmy typ danych o nazwie integer.
Ponieważ procedura może obliczać wiek wielu pracowników, zadeklaruj d kową zmienną, która będzie przechowywać imię i nazwisko osoby:
Dim imięNazwisko As String
Zmienna imięNazwisko będzie przechowywać tekst, zatem posiada ona ty nych o nazwie string.
Deklarowanie zmiennych stanowi dobry zwyczaj w sztuce programowania nieważ ułatwia analizę kodu programu i zapobiega pewnym typom błędów.
Niezadeklarowane zmienne
Zmiennym, które nie zostały zadeklarowane poleceniem Dim automaty przypisany jest typ danych o nazwie variant. Zmienne typu variant mogą prz wywać liczby, łańcuchy znaków i inne informacje. Możesz utworzyć taką zmi przypisując po prostu wartość do wybranej nazwy zmiennej w dowolnym mi w kodzie pracedury VBA. Na przykład możesz nieformalnie zadeklarować zm w sposób następujący:
ResztaDni = 100
Teraz, gdy wiesz już, w jaki sposób należ;/ deklarować zmienne, przyjrz procedurze, która z nich korzysta:
Sub ObliczWiek ( )
'deklaracja zmiennych Dim imięNazwisko As String Dim DataUrodzenia As Date Dim wiek As Integer
'przypisz zmiennym wartości imięNazwisko = "Jan Kowalski"
Zmienne, typy danych oraz stale
61
DataUrodzenia = #01/03/1967#
'oblicz wiek
wiek = Year(Now())-Year(DataUrodzenia)
'wydrukuj wynik w oknie Instrukcje bezpośrednie
Debug. Print imięNazwisko & " ma " & wiek & " lat. End Sub
U waga: Aby wypróbować przykładowe procedury podane w tym podrozdziale, klik-nij przycisk Moduły w oknie bazy danych, a następnie przycisk Nowy, aby utworzyć nowy moduł. Wpisz w tym module kod podanych procedur. Aby uruchomić procedurę, kliknij w dowolnym miejscu w procedurze i naciśnij klawisz F5.
Zmienne są zadeklarowane na początku procedury, w której będą używane. W procedurze powyżej zadeklarowano zmienne w osobnych wierszach. Możesz również zadeklarować kilka zmiennych w jednym wierszu, oddzielając poszczególne deklaracje zmiennych przecinkiem, tak jak w przykładzie poniżej:
Dim imięNazwisko As String, DataUrodzenia As Date, wiek As Integer
Zwróć uwagę, że przy deklarowaniu zmiennych w tym samym wierszu słowo kluczowe Dim występuje tylko raz (na początku wiersza).
Typ zmiennych
Możesz szybko sprawdzić typ danych, jaki dana zmienna posiada w procedurze, w następujący sposób: kliknij prawym przyciskiem myszy nazwę zmiennej i wybierz z menu podręcznego opcję Szybkie informacje (Quick Info).
Podczas odtwarzania procedury Visual Basic sprawdza deklaracje i tworzy zmienne o wskazanych nazwach, rezerwując jednocześnie odpowiedni obszar w pamięci komputera w celu przechowywania ich danych. Następnie nazwom zmiennych zostają przypisane odpowiednie wartości. Aby przypisać daną wartość zmiennej, wpisz nazwę zmiennej oraz znak równości. Wartość wpisana po prawej stronie znaku równania stanowi dane, które chcesz zachować w zmiennej. Dane wpisane w tym miejscu muszą być tego samego typu, co zadeklarowany typ zmiennej. Tekst należy wpisać w cudzysłowie, a datę otoczyć znakami #.
62
Programowanie w Acc
K orzystając z danych dostarczonych przez zmienną Dataurodzenia, Vi: sic oblicza wiek danego pracownika i przechowuje wynik kalkulacji w z o nazwie wiek. Następnie imię i nazwisko pracownika oraz jego wiek zostaną kowane w oknie Instrukcje bezpośrednie za pomocą instrukcji Debug. Pr odtworzeniu tej procedury otwórz okno Instrukcje bezpośrednie, aby zoba zultat obliczeń.
Łączenie łańcuchów tekstu
Możesz powiązać dwa lub więcej łańcuchy znaków, aby utworzyć jed Operacja łączenia łańcuchów znaków określana jest angielskim terminem cor tion. Z łączeniem łańcuchów tekstu zetknąłeś się już w procedurze obliczwi ileKoinórek. Łańcuchy znaków łączy się za pomocą znaku &. Na przykład żywa się" & imięNazwisko da następujący ciąg znaków „On nazywa się Jan ski". Imię i nazwisko osoby pobrane jest ze zmiennej imięNazwisko. Zwróć u dodatkowy odstęp po wyrazie „się". Ciągi znarów można również łączyć prz^ operatora plus (+). Większość programistów woli jednak ograniczyć znak plus racji na liczbach, aby nie było wątpliwości, o jaką operację chodzi.
•
Określanie typu zmiennej
Jeżeli nie podasz typu danych dla zmiennej deklarowanej poleceniem uzyskasz zmienną typu variant. Lepiej jest zadeklarować typ danych dla zmiennej, gdyż wtedy Visual Basic nie traci czasu przy odtwarzaniu proce analizowanie zmiennej w celu określenia jej właściwego typu danych. Visu; potrafi pracować z wieloma typami zmiennych. Zmienne typu integer przet liczby całkowite od -32 768 do 32 767. Zmienne typu Long mogą przechowyv by całkowite od -2 147 483 648 do 2 147 483 647. W odróżnieniu od zmiennj integer oraz zmiennych typu Long, zmienne typu single oraz Double moj chowywać liczby dziesiętne. Zmiennych typu string używa się w celu prze wania tekstu. Przy deklarowaniu zmiennych typu string można sprecyzować łańcucha znaków. Na przykład:
Dim sufiks As String * 3
deklaruje zmienną o nazwie sufiks o typis danych string, która może f wywać nie więcej niż trzy litery.
Jeżeli długość łańcucha tekstu nie zostanie określona, to zmienna typu będzie dynamiczna. Oznacza to, że Visual Basic zarezerwuje tyle pamięci kon by poradzić sobie z długim tekstem.
2000 I Zmienne, typy danych oraz stałe
P o zadeklarowaniu zmiennej można w niej przechowywać tylko ten typ informacji, który został określony w deklaracji. Próba przypisania zmiennej wartości o innym typie spowoduje wyświetlenie komunikatu o błędzie (błąd wykonania 13 - „Niezgodność typów", ang. Type Mismatch) lub skłoni Visual Basic do modyfikacji wartości. Na przykład, jeżeli zadeklarowałeś zmienną typu integer, a dane wymagają postaci dziesiętnej, Visual Basic odrzuci cyfry dziesiętne i użyje tylko części całkowitej określonej liczby. Wypróbuj procedurę MójNumer, aby zobaczyć, w jaki sposób Visual Basic modyfikuje dane:
Sub MójNumer ( )
Dim mójNum As Integer
mójNum = 23,11
MsgBox mójNum End Sub
Podczas odtwarzania powyższej procedury Visual Basic wyświetla zawartość zmiennej jako 23, a nie 23,11, ponieważ zmienna mójNum została zadeklarowana jako typ danych Integer.
Typ zmiennej możesz określić również za pomocą specjalnego znaku dodanego do nazwy zmiennej. Aby określić zmienną imięNazwisko jako string, dołącz do nazwy zmiennej znak dolara, tak jak w przykładzie poniżej:
Dim imięNazwisko$
Powyższa instrukcja jest jednoznaczna z instrukcją Dim imięNazwisko As string. Visual Basic posiada kilka specjalych znaków, które określają typ zmiennej. Znaki te podano w tabeli 1.2.
Tabela 1.2. Popularne znaki deklaracji typu danych
Typ danych |
Znak deklaracji |
Integer |
% |
Long |
& |
Single |
i |
Double |
# |
Currency |
@ |
String |
$ |
64
Programowanie w Access
N ależy zwrócić uwagę, że specjalny znak deklaracji można zastosować tylk sześciu typów danych. Aby skorzystać z danego znaku deklaracji, trzeba ten umieścić na końcu nazwy zmiennej:
Sub ObliczWiek2()
1 deklaracja zmiennych Dim imięNazwisko$ Dim DataUrodzenia As Date Dim wiek%
' przypisz wartości zmiennym imięNazwisko$ - " Jan Kowalski" DataUrodzenia = #l/3/1967#
1 oblicz wiek wiek% = Year(Now()) - Year(DataUrodzenia)
1 wydrukuj rezultat w oknie Instrukcje bezpośrednie Debug.Print imięNazwisko$ & " ma " u wiek% & " lat (a) . End Sub
Deklarowanie typu zmiennych
Typ zmiennej można określić za pomocą słowa kluczowego as i nazwy typ nych albo dopisując na końcu nazwy zmiennej specjalny znak deklaracji typu tabela 1.2). Jeżeli nie zastosujesz jednej z tych metod, to utworzysz zmienną typi
riant.
Przypisywanie wartości zmiennym
Teraz, gdy wiesz już, w jaki sposób należy poprawnie nazywać i deklar zmienne, nadszedł czas, byś pomyślał o zastosowaniu tej wiedzy w praktyce.
W oknie bazy danych kliknij przycisk Moduły.
Kliknij przycisk Nowy, aby utworzyć nowy moduł.
W
oknie Kod
programu wpisz
podaną
poniżej procedurę KosztKal,
która
cza
koszt zakupu kalkulatora, uwzględniając następujące dane: cena
kalkula
35
dolarów, podatek od zakupu - 8,5%.
Wypróbuj
tę procedurę, ustawiając kursor w dowolnym miejscu jej kodu,
ni
nie
wybierz Uruchom
=> Uruchom Sub/UserForm (Run
=> Sub/UserForn
mm*
Zmienne, typy danych oraz stałe
65
S ub KosztKal ()
cena =35
podatek = 0.085
koszt = cena + (cena * podatek)
strMsg = "Koszt kalkulatora wynosi
MsgBox strMsg End Sub
& "$" & koszt &
Procedura KosztKal korzysta z czterech zmiennych, są to: cena, podatek, koszt oraz strMsg. Ponieważ żadna z tych zmiennych nie została oficjalnie zadeklarowana, wszystkie posiadają ten sam typ danych - variant. Zmienne cena oraz podatek zostały utworzone przez przypisanie wartości ich nazwom na początku procedury. Zmiennej koszt przypisano wartość, która jest rezultatem wzoru cena + (cena * podatek). Zmienna strMsg składa komunikat dla użytkownika o koszcie zakupu kalkulatora.
Przypisując wartości zmiennych, wpisujesz najpierw znak równości po nazwie zmiennej, następnie zaś wartość, którą dana zmienna ma przechowywać. Wartość ta może być liczbą, wzorem lub tekstem objętym cudzysłowem. Podczas gdy wartości przypisane zmiennym cena, podatek i koszt są od razu oczywiste, wartość przypisana zmiennej strMsg wymaga wyjaśnienia:
s trMsg = "Koszt kalkulatora wynosi
"$" & koszt &
• łańcuch tekstu „Koszt zakupu kalkulatora wynosi"
Tekst musi być ujęty w cudzysłów. Zwróć uwagę, że przed końcowym cudzysłowem po słowie „wynosi" znajduje się dodatkowa spacja;
znak & - służy on do łączenia poszczególnych części wyrażenia;
znak
dolara „$" - znak ten ujęty w cudzysłów spełnia w tym
przypadku funkcję
czysto
informacyjną. Jeśli nie chcesz zwracać uwagi na typ waluty,
możesz po
minąć
tę część wyrażenia. Ponieważ znak dolara jest literą,
został ujęty
w
cudzysłów;
znak
& - za każdym razem, gdy chcesz dołączyć do tworzonego
łańcucha tekstu
nową
informację, należy ją poprzedzić tym znakiem;
zmienna
koszt - w czasie odtwarzania procedury zamiast zmiennej Koszt
pojawi
się
w tym miejscu jej wartość, określająca koszt kalkulatora;
t znak & (zob. wyjaśnienie wyżej)
66
Programowanie w Access i
• kropka ujęta w cudzysłów - wymagana jest na końcu zdania i musi być dołąi na oddzielnie.
Inicjalizowanie zmiennych
Kiedy Visual Basic tworzy nową zmienną, nadaje jej początkową (wyjścio wartość. Zmienne numeryczne otrzymują początkową wartość równą zeru zmienne logiczne są inicjowane wartością fałsz (ang. False), zmiennym typu str przypisany jest pusty łańcuch znaków wyrażony za pomocą cudzysłowów ( a zmiene typu Date posiadają początkową datę Grudzień 30, 1899.
Zauważ, że koszt, wyświetlony w polu komunikatu w trakcie odtwarzania prt dury KosztKal zawiera trzy cyfry dziesiętne. Aby wyświetlić koszt kalkulai z dwiema cyframi dziesiętnymi, należy skorzystać z funkcji. VBA posiada specj< funkcje, które umożliwiają zmianę formatu danych. Aby zmienić format zmier koszt, skorzystamy teraz z funkcji Format. Funkcja ta ma następującą składnię:
Format (wyrażenie, typ formatu)
gdzie wyrażenie jest wartością lub zmienną, którą chcesz sformatować, zaś formatu to instrukcje, według których dane wyrażenie należy sformatować. Typ: matu należy podać w cudzysłowie.
W procedurze KosztKal zmodyfikuj równanie obliczające koszt w następuj
1.
sposób:
koszt = Format(cena + (cena * podatek), "C.00")
2. Odtwórz zmodyfikownąprocedurę KosztKal.
Po wypróbowaniu procedury KosztKal zapewnię zapytasz: „Po co deklaro\ zmienne, jeżeli Visual Basic świetnie sobie radzi ze zmiennymi, których formalnie zadeklarowaliśmy?".
Procedura KosztKal nie zużyje tyle pamięci, żeby „martwić się", ile bajtów bierze użyty za każdym razem typ variant. W procedurach krótkich w wielu pr padkach decydują nie wymagania pamięci, lecz dokładność. Każdy robi błędy, cl większość z nas do tego się nie przyznaje. Co się stanie, gdy się pomylisz i deklaru wartość zmiennej koszt zamiast nazwy Koszt wpiszesz kost:
strMsg = "Koszt kalkulatora wynosi " & "$" & kost & "."
Co się stanie, gdy zamiast zmiennej podatek wpiszesz we wzorze cena * poda przez pomyłkę podatek?
mmnmm
Zmienne, typy danych oraz stałe
67
k oszt = Format((cena * potadek), "0.00").
Po uruchomieniu procedury z takimi błędami Visual Basic nie pokaże kosztu kalkulatora, ponieważ nie znajdzie instrukcji przypisującej wartość zmiennej kost. To zaś spowoduje, że Visual Basic, nie znając kosztu podatku, poda cenę kalkulatora jako całkowity koszt. Visual Basic nie zgaduje - wykonuje dokładnie to, co zostało mu polecone. Dlatego z następnego podrozdziału dowiemy się, jak unikać takich błędów. Pamiętajmy, by przed przejściem do tego podrozdziału przywrócić w procedurze KosztKal prawidłowe nazwy zmiennych koszt i podatek.
Wymuszone deklarowanie zmiennych
Visual Basic posiada specjalną instrukcję Option Explicit która czuwa nad tym, by każda nowa zmienna użyta w procedurze została zadeklarowana. Instrukcję tę wpisuje się na początku każdego modułu. Powoduje ona pojawienie się komunikatu obłędzie przy pierwszej próbie użycia zmiennej, która jeszcze nie została zadeklarowana.
Wróć do okna Kod programu, w którym wpisałeś procedurę KosztKal.
Wpisz
u samej góry
modułu (w pierwszym wierszu) polecenie Option
Explicit
i
naciśnij Enter.
Visual Basic wyświetli to polecenie w kolorze niebieskim.
3. Odtwórz procedurę KosztKal.
Visual Basic wyświetli komunikat o błędzie: „Błąd kompilacji: zmienna nie została zadeklarowana" (Compile error: Variable not defined).
4. Kliknij OK, aby zamknąć okno komunikatu.
Visual Basic zaznacza nazwę zmiennej cena i podświetla w kolorze żółtym wiersz kodu z nazwą procedury. Pasek tytułu wyświetla informację „Microsoft Visual Basic - RozOl [break] - [ZmienneOl (Code)]". Tryb przerwania (ang. Break Mode) umożliwia poprawienie błędu przed kontynuowaniem odtwarzania procedury. Teraz należy formalnie zadeklarować zmienną cena i pozostałe zmienne użyte w procedurze. Aby to zrobić, należy wpisać w nowym wierszu poniżej nazwy procedury KoszKal następującą deklarację zmiennej:
Dim cena As Currency
Naciśnij F5, aby kontynuować procedurę. Jeżeli zadeklarujesz tylko zmienną cena i ponownie odtworzysz procedurę KosztKal, to Visual Basic poda ten sam ko-
68
Programowanie w Access 20
m unikat o błędzie, gdy napotka następną niezadeklarowaną nazwę zmiennej. Al rozwiązać pozostałe problemy związane z deklaracją zmiennych w procedurze, w bierz Uruchom => Zresetuj (Run => Reset), co umożliwi opuszczenie trybu przerw
ma.
5. Wpisz na początku procedury KosztKai następujące deklaracje zmiennych:
'deklaracje zmiennych Dim cena As Currency Dim podatek As Single Dim koszt As Currency Dim strMsg As String
6.
Naciśnij F5, aby uruchomić poprawioną procedurę, która powinna teraz mi taką postać:
Option Explicit
Sub KosztKai()
' deklaracja zmiennych
Dim cena As Currency
Dim podatek As Single
Dim koszt As Currency
Dim strMsg As String
cena = 35
podatek = 0.085
koszt = Format(cena + (cena * podatek), "0.00")
strMsg = "Koszt kalkulatora wynosi "&"$"& koszt &
MsgBox strMsg End Sub
Instrukcja option Explicit, wpisana u góry modułu, spowodowała, że musiał oficjalnie zadeklarować wszystkie zmienne wswojsj procedurze. Aby zaoszczędź czas i uniknąć własnoręcznego wpisywania instrukcji option Explicit na począt! każdego nowego modułu, najlepiej jest powierzyć tę funkcję Visual Basicowi. Al automatycznie umieścić polecenie option Explicit w każdym nowym module, w konaj następujące czynności:
W oknie edytora Visual Basic wybierz Narzędzia => Opcje (Tools => Options)!
Upewnij
się,
że pole wyboru Wymagaj
deklaracji zmiennych (Require
VariJ
ble
Declaration)
na
zakładce Edytor
jest
zaznaczone.
Zmienne, typy danych oraz stałe
69
3 . Kliknij OK, aby zamknąć okno dialogowe Opcje.
Od tej pory wszystkie nowe moduły będą automatycznie wstawiane z instrukcją Option Explicit. W istniejących już modułach instrukcję tę należy wpisać samodzielnie.
Zalety instrukcji Option Explicit
Instrukcja Option Explicit zmusza do formalnej deklaracji wszystkich zmiennych w danym module. Jedną z największych korzyści wynikających ze stosowania instrukcji option Explicit jest automatyczne wychwycenie błędów w pisowni nazw zmiennych w chwili kompilacji programu (gdy Visual Basic przystępuje do tłumaczenia kodu programu na kod wykonawczy). Instrukcję Option Explicit należy umieścić u samej góry modułu, przed jakimikolwiek procedurami.
Zasięg zmiennych
Zmienne mogą różnić się zasięgiem. Termin zasięg zmiennej (ang. Variable scope) określa możliwość użycia danej zmiennej przez tę samą procedurę oraz przez inne procedury VBA. Zmienna może posiadać zasięg na poziomie procedury lub modułu.
Zmienne na poziomie procedury (zmienne lokalne)
Z poprzednich podrozdziałów dowiedziałeś się już, w jaki sposób zadeklarować zmienną za pomocą instrukcji Dim. Pozycja instrukcji Dim w module decyduje o zasięgu zmiennej. Zmienne zadeklarowane w procedurze za pomocą instrukcji Dim noszą nazwę zmiennych na poziomie procedury lub zmiennych lokalnych. Zmienne lokalne mogą być użyte tylko w procedurze, w której zostały zadeklarowane. Zmienne, które nie zostały wcześniej zadeklarowane, mają zawsze zasięg lokalny. Jeżeli zmienna ma zasięg lokalny, to inne procedury w tym samym module mogą wykorzystywać zmienną o takiej samej nazwie. Innymi słowy, procedura KosztKai w kartce modułu o nazwie zmienneoi może mieć zmienną podatek, a także procedura wydatki na tej samej karcie modułu może mieć zmienną o takiej samej nazwie. Obie zmienne są od siebie niezależne.
Zmienne na poziomie modułu
Zmienne zadeklarowane na poziomie procedury są przyjazne dla pamięci komputera. Po odtworzeniu danej procedury Visual Basic zwalnia pamięć, którą dana zmienna wykorzystuje. W programowaniu często jednak istnieją sytuacje, w których chcesz, aby po skończeniu danej procedury zadeklarowana zmienna była dostępna dla
70
Programowanie w Access
innych procedur wpisanych w tym samym module. Ta sytuacja wymaga zmianj sięgu zmiennej. Zamiast zmiennej lokalnej należy zadeklarować zmienną na pozk modułu. Aby zadeklarować daną zmienną na poziomie modułu, należy umieścił strukcję Dim u samej góry kartki modułu powyżej wpisanych procedur, a pod insl cją option Explicit. Na przykład, aby udostępnić zmienną o nazwie podatek ka procedurze wpisanej na karcie modułu o nazwie zmienneoi, zadeklarujesz tę zmi( według wzoru poniżej:
Option Explicit
Dim podatek As Single
Sub KosztKal( )
[wpisz tutaj instrukcje procedury] End Sub
W powyższym przykładzie instrukcja Dim znajduje się u góry modułu zara; instrukcji option Explicit. Zanim wypróbujemy to rozwiązanie w przykładzie, trzebna nam będzie dodatkowa procedura, która skorzysta ze zmiennej o nazwie
datek.
1.
2. 3.
W oknie Kod programu wytnij instrukcję deklaracji zmiennej Dim podatel Currency z procedury KosztKal i wklej ją u samej góry karty modułu (pon instrukcji Option Explicit).
Wpisz procedurę wydatkiRep pokazaną poniżej w tym samym module, w któi znajduje się procedura KosztKal.
Kliknij w dowolnym miejscu w kodzie procedury KosztKal i naciśnij F5, odtworzyć tę procedurę. Gdy procedura dobiegnie końca, uruchom procec
WydatkiRep.
Sub WydatkiRep()
Dim cena As Currency Dim koszt As Currency
cena = 55.99
koszt = cena + (cena *
MsgBox podatek MsgBox koszt End Sub
podatek)
Zmienne, typy danych oraz stałe
71
P rocedura wydatkiRep deklaruje dwie zmienne na poziomie procedury - zmienną cena oraz zmienną koszt. Cena wynosi 55,99. Cena jest niezależna od ceny użytej w procedurze KosztKal. Następnie procedura wydatki oblicza koszt zakupu. W koszcie zakupu jest uwzględniony podatek. Ponieważ wartość podatku jest taka sama jak w procedurze KosztKal, zmienną podatek zadeklarowano na poziomie modułu. Po wykonaniu procedury KosztKal wartość zmiennej podatek będzie nadal wynosić 8,5% (gdyby podatek był zmienną lokalną, wartość podatku po zakończeniu procedury KosztKal równałaby się zero). Po wykonaniu kodu procedury KosztKal Visual Basic usuwa zawartość wszystkich zmiennych z wyjątkiem zmiennej podatek, która została zadeklarowana na poziomie modułu. Przy próbie kalkulacji kosztu przez procedurę WydatkiRep Visual Basic pobiera wartość zmiennej podatek i stosuje ją w obliczeniach.
Zmienne prywatne
Deklarując zmienne na poziomie modułu, zamiast słowa kluczowego Dim możesz użyć słowa kluczowego Private. Na przykład:
Private podatek As Single
Zmienne prywatne są dostępne tylko dla procedur w tym module, w którym zostały zadeklarowane. Zmienne prywatne zawsze deklaruje się na samej górze modułu, zaraz po instrukcj i op t i on Exp licit.
Zmienne na pozimie modułu, które są zadeklarowane za pomocą słowa kluczowego Public, mają zasięg publiczny. Oznacza to, że mogą być użyte w dowolnym module VBA. Jeżeli chcesz pracować z daną zmienną we wszystkich procedurach aplikacji, zadeklaruj ją za pomocą słowa kluczowego Public, tak jak w przykładzie
poniżej:
Option Explicit
Public podatek As Single
Sub KosztKal ( )
[wpisz tutaj instrukcje procedury]
End Sub
Zauważ, że zmienna podatek została zadeklarowana u góry karty modułu za pomocą słowa kluczowego Public. Zmienna ta będzie teraz mogła być wykorzystana przez dowolną procedurę VBA w aplikacji, z której korzystasz.
72
Programowanie w
T rwałość zmiennych
Oprócz zasięgu zmienne posiadają coś w rodzaju terminu ważności. Ti określa, jak długo dana zmienna zachowuje swoją wartość. Zmienne na pozi dułu lub projektu zachowują swoje wartości tak długo, jak otwarty jest dan1 Visual Basic może jednak,reinicjować daną zmieną, jeżeli będzie tego wynu ka programu. Zmienne lokalne, zadeklarowane za pomocą słowa kluczow gubią swoje wartości w chwili zakończenia danej procedury. Zmienne lokalr dopóki trwa dana procedura. Zmienne te są inicjowane za każdym razem, procedura jest odtwarzana. Visual Basic umożliwia przedłużenie życia zmi kalnej przez zmianę sposobu jej deklaracji.
Użycie zmiennych statycznych
Specjalnym typem zmiennej lokalnej jest zmienna zadeklarowana za słowa kluczowego static. Zmienne statyczne deklaruje się na poziomie pi W odróżnieniu od zmiennych deklarowanych na poziomie procedury za pon wa Dim, zmienne statyczne nie tracą swojej wartości po zakończeniu wyko instrukcji procedury, w której zostały zadeklarowane. Po powrocie do danej p zmienne statyczne nadal utrzymują wartość, którą miały w momencie zak< procedury. Procedura Kosztzakupu podana poniżej demonstruje użycie zmie tycznej całyZakup:
Sub Kosztzakupu()
1 zadeklaruj zmienne Static całyZakup Dim nowyZakup As String Dim kosztzakupu As Single
nowyZakup = InputBox("Podaj koszt zakupu:", "Wpisz Dane" kosztzakupu = CSng(nowyZakup) całyZakup = całyZakup + KosztZakupa
MsgBox "Koszt nowego zakupu wynosi: " & nowyZakup MsgBox "Dotychczasowy koszt = " & całyZakup End Sub
Procedura ta rozpoczyna się od deklaracji zmiennej statycznej o nazwie c kup oraz dwóch zmiennych lokalnych (na poziomie procedury). Zmienna nou zadeklarowana jest jako string, zmienna kosztzakupu jako zmienna typu :
Zmienne, typy danych oraz stałe
73
Z miennej nowyzakup przypisana jest wartość uzyskana w wyniku funkcji inputBox. Funkcja inputBox służy do pobrania danych od użytkownika. Wyświetla ona okno dialogowe z poleceniem „Podaj koszt zakupu:". Na pasku tytułu tego okna znajduje się tekst „Wpisz dane". Funkcja inputBox zostanie dokładnie omówiona dalej w tym rozdziale. Ponieważ rezultat funkcji inputBox jest zawsze łańcuchem znaków, zmienna nowyzakup została zadeklarowana jako zmienna typu string. Po pojawieniu się okna dialogowego użytkownik ma wpisać koszt zakupu. Koszt zakupu w postaci tekstu nie przyda się jednak do obliczeń, zatem następna instrukcja ma za zadanie przełożyć rezultat funkcji inputBox na wartość liczbową (inny typ danych). Przekładu dokonuje funkcja konwersji typu o nazwie csng. Argumentem tej funkcji jest zmienna nowyzakup. Liczba uzyskana jako rezultat funkcji csng zapamiętana zostaje w zmiennej o nazwie kosztzakupu.
Następna instrukcja - całyzakup = całyzakup + Kosztzakupu - dodaje do obecnej wartości całego zakupu (zmienna całyzakup) uzyskany od użytkownika koszt nowego zakupu. Przy pierwszym odtworzeniu procedury cały zakup jest taki sam, jak koszt nowego zakupu. Dlatego też funkcje MsgBox w ostatnich dwóch wierszach procedury wyświetlą tę samą liczbę. Jeżeli procedura zostanie odtworzona drugi raz, to wartość uzyskana w wyniku pierwszego jej odtworzenia zostanie powiększona o nową wartość wpisaną przez użytkownika.
Aby wypróbować tę procedurę, musisz wykonać następujące zadania:
Umieść kursor w obrębie procedury Kosztzakupu i naciśnij F5.
Gdy
pojawi się
okno dialogowe, wpisz dowolną liczbę. Na przykład 100
i
naciśnij Enter.
Visual Basic wyświetli komunikat: „Koszt nowego zakupu wynosi: 100".
3. Kliknij OK w oknie komunikatu.
Visual Basic wyświetla drugi komunikat: „Dotychczasowy koszt = 100".
4. Odtwórz
ponownie tę procedurę. Gdy pojawi się okno dialogowe, wpisz
inną
liczbę,
na przykład 50. Naciśnij Enter.
Visual Basic wyświetli komunikat: „Koszt nowego zakupu wynosi: 50".
5. Kliknij OK w oknie komunikatu.
Visual Basic wyświetli drugą wiadomość: „Dotychczasowy koszt = 150".
6. Uruchom
tę
procedurę jeszcze kilka razy, wpisując dowolne liczby i
obserwując
wyniki.
74
Programowanie w Accesi
F unkcje konwersji typu
Aby poznać szczegóły użycia funkcji CSng oraz innych funkcji konwerąj danych, umieść kursor w obrębie słowa kluczowego CSng i naciśnij Fl.
Zmienne obiektowe
Zmienne, które zostały omówione, służą do przechowywania danych. Pn wywanie danych jest głównym powodem korzystania z „normalnych" zmie w procedurach VBA. Oprócz zmiennych, które przechowują dane, istnieją j< specjalne zmienne odnoszące się do obiektów Visual Basica. Zmienne te okres terminem zmiennych obiektowych. Zmienne obiektowe nie przechowują danyc formują natomiast, gdzie dane się znajdują. Można ich używać przy odwoływar do bazy danych, formularzy, formantów umieszczonych w formularzach oraz tów utworzonych w innych aplikacjach. Zmienne obiektowe ułatwiają lokalizac nych. Zmienne te deklaruje się w podobny sposób jak zmienne, z którymi już wałeś, z tą jednak różnicą, że po słowie kluczowym as należy wpisać typ o w celu określenia typu danych. Na przykład:
Dim formant As Control
Powyższa instrukcja deklaruje zmienną obiektową o nazwie formant ora; danych control.
Dim frm As Form
Powyższa instrukcja deklaruje zmienną obiektową o nazwie frm oraz typ nych Form.
Można deklarować zmienne obiektowe o typie Application, control, For Report lub też o typie zgodnym z typem określonego formantu formulan
raportu: TextBox, ToggleButton, CheckBox, CommandButton, ListBox, Optic ton, Subform albo Subreport, Label, BoundObrectFrame albo UnboundObject itp.
Po zadeklarowaniu zminnej obiektowej należy przypisać jej wartość, ab posługiwać się tą zmienną w procedurze. Wartość zmiennej obiektowej przypis za pomocą słowa kluczowego set. Po słowie tym należy podać nazwę zmienn stawić znak równości i wpisać wartość, którą zmienna ta będzie reprezentowi przykład:
Set formant = MeINazwaFirmy
Zmienne, typy danych oraz stałe
75
P owyższa instrukcja przypisuje wartość zmiennej obiektowej o nazwie formant. Zmienna ta będzie się teraz odwoływała do pola NazwaFirmy znajdującego się na bieżącym formularzu. Jeżeli pominiesz słowo Set, Visual Basic wyświetli komunikat o błędzie: „Run-time error 91: Object variable or With block variable not set."
Teoria teorią, najważniejsza jest jednak praktyka, dlatego wykonamy teraz podany niżej przykład. Procedura ukryj Formant demonstruje zastosowanie zmiennych
obiektowych f rm oraz formant.
P rzykład 3.6. Odwoływanie się do obiektu za pomocą zmiennej obiektowej
Sub Ukryj Formant ()
' procedura ta działa odwołując się do formularza Klienci
1 w bazie danych Northwind
Dim frm As Form
Dim formant As Control
If Not CurrentProject.AllForms("Klienci").IsLoaded Then
DoCmd.OpenForm "Klienci" End If
Set frm = Forms !Klienci Set formant = frm.NazwaFirmy formant .Visible = False End Sub
Procedura rozpoczyna się od deklaracji dwóch zmiennych obiektowych o nazwach frm oraz formant. Zmienna frm ma się odwoływać do formularza Klienci. Aby procedura ta mogła działać, formularz Klienci musi być wdanej chwili otwarty. Instrukcja warunkowa:
If Not CurrentProject.AllForms("Klienci").IsLoaded Then DoCmd.OpenForra "Klienci"
End If
spowoduje otwarcie formularza Klienci, jeżeli nie jest on załadowany.
Zmienna obiektowa formant reprezentuje pole tekstowe NazwaFirmy umieszczone na formularzu Klienci. Polecenie:
76
S et formant = frm.NazwaFirmy jest równoznaczne z poleceniem:
Set formant = Forms[Klienci.NazwaFirmy
Programowanie w Aco
Zamiast używać pełnego adresu danego obiektu, można skorzystać ze sk wersji - nazwy zmiennej obiektowej, która ten adres przechowuje. Celem tej p ryjest ukrycie formantu formularza reprezentowanego przez zmienną obiektov mant. Po uruchomieniu procedury ukryj Formant na formularzu powinno br pola o nazwie NazwaFirmy. Aby uwidocznić to pole, zmodyfikuj ostatni wiers; dury, ustawiając właściwość Visible obiektu formant na True, i ponownie u procedurę.
Zalety stosowania zmiennych obiektów} ch
Zmiennych obiektowych można używać zamiast obiektu.
Zmienne
obiektowe są krótsze i łatwiejsze do zapamiętania i użycia
aniżi
tości,
które wskazują.
Znaczenie
zmiennych obiektowych można zmieniać w czasie wykonywał
cedury.
Jeżeli zmienna obiektowa jest już niepotrzebna, należy przypisać jej < Nothing. Nastąpi wtedy zwolnienie pamięci zarezerwowanej dla tej zmiennej:
Set frm = Nothing Set formant = Nothing
Wyszukiwanie definicji zmiennej
W czasie przeglądania programu VBA, gdy napotkasz instrukcję przyp zmiennej pewną wartość, możesz szybko odnaleźć definicję tej zmiennej, zazn ją i naciskając kombinację klawiszy Shift+F2. Możesz również wybrać Wi< Definicja (View => Definition). Następnie naciśnij kombinację Ctrl+Shift+ wybierz Widok => Ostatnie położenie (View ;=> Last Position), aby powrócić przedniego miejsca w programie. Teraz wypróbuj tę procedurę:
Odnaj dź kod procedury ukryj Formant.
OdnąjdŹ instrukcję formant.Visible = False.
Kliknij
prawym przyciskiem myszy nazwij zmiennej i wybierz
Definicja
nition)
z menu podręcznego.
ss 2000
Zmienne, typy danych oraz stałe
77
o conej ocedu-
ąfor-kować proce-uchom
li war-
4. Wróć do poprzedniego miejsca w procedurze, naciskając Ctrl+Shift+F2.
Jaki typ danych zawiera zmienna
Visual
Basic
posiada wbudowaną
funkcję o nazwie varType,
która
zwraca war
tość
typu integer
wskazującą
na typ zmiennej. Prześledźmy teraz, jak posługiwać się
tą
funkcją w oknie Instrukcje
bezpośrednie: m
1. Otwórz
okno Instrukcje
bezpośrednie i
wpisz następujące wyrażenia przypisu
jące
wartości zmiennym:
wiek =28
DataUrodzenia = #1/1/1981
imię = "Janek"
2, Teraz
„zapytaj"
Visual
Basic,
jakiego typu dane każda z powyższych zmiennych
przechowuje:
la pro-
'artość
sującą czając ok => tt lub io po-
?varType(wiek)
Po naciśnięciu klawisza Enter Visual Basic zwraca liczbę 2. Liczba ta reprezentuje wartość typu Integer.
?varType (DataUrodzenia)
Visual Basic zwraca liczbę 7, oznaczającą datę. Jeżeli pomylisz się w nazwie zmiennej, Visual Basic zwróci zero (0).
?varType(imię)
Visual Basic informuje, że wartość przechowywana w zmiennej imię jest łańcuchem znaków (8).
(Defi-
•■••••
78
Programowanie w Aci
Tabela 1.3. Wartości zwracane prze funkcję VarTvpe |
|||
Stalą |
Wartość |
|
Znaczenie |
vbEmpty |
0 |
Pusta warto |
ć (zmienna niezainicjowana) |
vblnteger |
2 |
Liczba całki |
>wita |
vbNull |
1 |
Null |
|
vbLong |
3 |
Długa liczba całkowita |
|
vbSingle |
4 |
Liczba całkowita o pojedynczej precyzji |
|
vbDouble |
5 |
Liczba całkowita o podwójnej precyzji |
|
vbCurrency |
6 |
Waluta |
|
vbDate |
7 |
Data |
|
vbstring |
8 |
Tekst |
|
vbObject |
9 |
Obiekt |
|
vbError |
10 |
Wartość błędu |
|
vbBoolean |
11 |
Wartość logiczna (Boolean) |
|
vbVariant |
12 |
Variant (używany jedynie z tablicami) |
|
vbDataObj ect |
13 |
Obiekt dostępu do danych |
|
vbDecimal |
14 |
Wartość dziesiętna |
|
vbByte |
17 |
Bajt |
|
vbUserDefinedType |
36 |
Typ zdefiniowany przez użytkownika |
|
vbArray |
8192 |
Tablica |
Z mienne, typy danych oraz stałe
U życie stałych w procedurach VBA
Chociaż wartość zmiennej może się zmieniać w czasie wykonywania instrukcji procedury, są takie sytuacje, kiedy należy odwołać się do wartości, nie ulegających zmianie w czasie trwania całej procedury. Takie sytuacje wymagają posługiwania się stałymi. Stała jest nazwą o określonym znaczeniu, która zastępuje niezmienną w kodzie programu wartość. Visual Basic wymaga zadeklarowania stałej przed jej użyciem. Stałe deklaruje się przy użyciu słowa kluczowego const. Poniżej są podane przykłady deklaracji stałych:
Const NazwaDialogu = Const Podatek =8.5 Const Rabat =0.5 Const Kolorldx = 3
"Wpisz dane" As String
P odobnie jak zmienne, stałe posiadają zasięg. Aby korzystać ze stałej tylko w jednej procedurze, należy ją zadeklarować na poziomie procedury (w wierszu poniżej nazwy procedury). Na przykład:
Sub Rocznica ( )
Const Wiek As Integer = 25 [wpisz tu instrukcje procedury]
End Sub
Jeżeli chcesz korzystać ze stałej we wszystkich procedurach danego modułu, to użyj słowa kluczowego Private przed słowem const i umieść deklarację danej stałej na początku modułu (przed nazwą pierwszej procedury):
Private Const Dsk = "D: " As String
J eżeli wszystkie moduły w danej aplikacji mają korzystać ze stałej, użyj słowa kluczowego Public przed słowem const i umieść deklarację stałej na początku modułu (przed nazwą pierwszej procedury). Na przykład:
Public Const LiczbaZnaków = 255 As Integer
Deklarując stałą, można użyć jednego z następujących typów danych: Boolean, Byte, Integer, Long, Currency, Single, Double, Date, String lub Variant. W jednym wierszu można zadeklarować kilka stałych w taki oto sposób:
80
Programowanie w Ac
C onst Wiek As Integer = 25, Miasto As String = "Opole", Wypłata Currency = 3 50
Użycie stałych w procedurach ułatwia modyfikację instrukcji programi my, że utworzona procedura odwołuje się do stacji dysków D. Okazuje w innym komputerze, na którym chcesz wypróbować procedurę, stacja dyskć działa. Procedura odwołuje się do stacji dysków parę razy. Jeżeli posłużysz wystarczy zmienić jej definicję i program napisany przez ciebie będzie pc działał na innym komputerze. Programy stosujące stałe są bardziej czytelne. \ łatwiej jest zrozumieć program, w którym programista zadeklarował stałą ok wartość podatku, niż taki, który wymusza v/yszukiwanie w instrukcjach pi funkcji, które używają określonej liczby.
Stałe wewnętrzne
Zarówno Microsoft Access, jak i Visual Basic mają długą listę stałych w< nych, które nie wymagają deklaracji. Do wewnętrznych stałych można szybko za pomocą znanego nam już okna Przeglądarka obiektów.
O twórz okno Przeglądarka obiektów i przyjrzyj się stałym Accessa: W oknie edytora Basic Editor wybierz Widok => Przeglądarka obiektów
Obok pola listy rozwijanej Biblioteki/Projekty kliknij strzałkę w dół i bibliotekę Access.
Wpisz słowo Constants w polu poszukiwań i naciśnij Enter lub kliknij \ Szukaj.
Visual Basic pokazuje rezultat poszukiwań w oknie Przeglądarka obiek prawej stronie okna znajduje się wykaz wbudowanych stałych aplikacji M Access. 7wxót uwagę, że w nazwach stałych występuje przedrostek „ac."
4. Aby odszukać wbudowane stałe VBA, wybierz VBA w polu B ki/Projekty.
Zwróć uwagę, że nazwy wbudowanych stałych VBA poprzedza prze „vb".
Następująca procedura obsługi zdarzeń lustruje użycie dwóch wbudo stałych acFiiterByForm oraz acFiiterAdvanced w celu włączenia/wyłączen liwości filtrowania formularza.
1.
2.
3.
Zmienne, typy danych oraz stałe
81
j Object Browser |
. ...;■-..-.....,_■; |
--lDlx( |
Atcess |
:J . lid MJŚ 1 i |
|
1 constant* |
|
|
|
|
|
Library ■ ■'■ 1 |
Class | Member |
1 |
liKAccess .... | |
53 Constants |
|
lift Access i |
si OldConstants |
|
|\ Access £# AcCommand £3 acCmdListConstants |
||
|
|
|
Classes |
Members of Constants' |
|
$ SubReport ^J |
S3 acAltMask |
|
$ TabControl |
IS acApplyFilter |
|
43 TextBox |
it) acApplyServerFilter |
|
gSToggleButton |
S3 acCloseFilterWindow |
|
jfl WebOptions |
3 acCloseServerFilterWindow |
|
»! Constants J |
E) acCopy |
|
,{{OldConstants jrj |
[il acCtrlMask |
d |
Module Constants |
|
|
Member of A«S4Ł |
|
|
Predefined constants |
|
|
iunek 1.21. Używaj Przeglądarki obiektów w celu odnalezienia nazw wbudowanych stałych
Otwórz dowolny formularz w Widoku projektu.
Wybierz Edycja => Zaznacz formularz lub naciśnij Ctrl+R.
Wybierz Widok => Właściwości.
Kliknij zakładkę Zdarzenie w oknie Właściwości formularza.
Kliknij
przycisk (...) po prawej stronie właściwości
Przy
filtrowaniu (On
Fil
ter)
i
wybierz opcję Konstruktor
kodu.
W
oknie Kod
programu wpisz
kod procedury obsługi
zdarzenia Form_Fiiter,
tak
jak podano poniżej:
Private Sub Form_Filter(Cancel As Integer, _FilterType As Integer) If FilterType = acFilterByForm Or _
FilterType = acFilterAdvanced Then MsgBox "Nie jesteś upoważniony do " & _
"filtrowania rekordów." Cancel = True End If End Sub
82
Programowanie w Access f
7 . Uruchom w trybie Widoku formularz, w którym wpisałeś procedurę obsługi j rżenia Przy filtrowaniu. Wybierz Rekordy =» Filtr => Filtruj według fon larza. Access wyświetli komunikat, „Nie jesteś upoważniowny do filtrowi rekordów." Ten sam komunikat pojawi się po wybraniu Rekordy => Filtr Zaawansowany filtr/sortowanie.
Podsumowanie
W tym podrozdziale wprowadziliśmy kilka nowych pojęć VBA. Zdobyłeś 1 dzy innymi informacje na temat typów danych, zmiennych i stałych. Nauczyłeś! deklarować różne typy zmiennych. Dowiedziałeś się również, na czym polega różi między zmienną i stałą. W następnym podrozdziale będziemy korzystać z procef i funkcji, które wymagają argumentów. Oprócz tego zapoznamy się z funkcjami, ] umożliwiają procedurom VBA współpracę z użytkownikiem.
Przekazywanie argumentów do procedur oraz funkcji
Nauczyliśmy się już sporządzać proste procedury VBA, które wykonują określone czynności. Procedury te nie wymagają podawania dodatkowych informacji lub danych przed uruchomieniem. Jednakże w praktyce zarówno procedury zwykłe, jak i funkcje często wymagają podania argumentów. Argumentami nazywamy jedną lub więcej wartości koniecznych do tego, aby dana procedura mogła działać. Argumenty wpisuje się w nawiasie i oddziela od siebie przecinkami.
Sporządzanie funkcji
Procedury VBA określane funkcjami mogą zwrócić wynik obliczeń na podstawie danych podanych w postaci argumentów. Przy deklarowaniu funkcji oczekiwane przez nią argumenty wpisuje się w nawiasie po nazwie funkcji. Na przykład:
unction PołączTekst (k,
PołączTekst = k + ,nd Function
o)
+ o
Funkcję można uruchomić z okna Instrukcje bezpośrednie lub też można napisać procedurę zwykłą, która wezwie daną funkcję.
Uruchamianie funkcji z okna Instrukcje bezpośrednie
W
oknie bazy danych kliknij przycisk Moduły.
Wybierz
Nowy, aby utworzyć
nowy
moduł.
W
oknie Kod
programu wpisz
funkcję
PołączTekst podaną powyżej.
Uruchom
okno Instrukcje
bezpośrednie i
wpisz w nim następującą instrukcję:
PołączTekst ("procedura", "zwykła"
Zwróć uwagę, że natychmiast po otworzeniu nawiasu Visual Basic wyświetla ykaz argumentów, których dana funkcja wymaga. Wpisz wartość pierwszego argu-lentu, następnie przecinek i podaj wartość drugiego argumentu. Zamknij nawias.
m
84
Programowanie w A<
4 . Naciśnij Enter, aby uruchomić powyższą instrukcję z okna Instrukcj średnie.
Po naciśnięciu klawisza Enter łańcuch znaków „procedura", „zwykła' się w oknie Instrukcje bezpośrednie.
Uruchamianie funkcji z procedury zwykłej:
1. W tym samym module, w którym wpisałeś funkcję PołączTekst, wpis poniżej procedurę wpiszTekst:
Sub WpiszTekst ( )
Dim i As String, n As String, r As String
i = InputBox ("Wpisz imię: ") n = InputBox("Wpisz nazwisko: r = PołączTekst(i, n) MsgBox r End Sub
11 )
2. Umieść kursor w dowolnym miejscu w kodzie procedury WpiszTekst, naciśnij F5, aby ją uruchomić.
W procedurze WpiszTekst są zadeklarowane trzy zmienne (i, n oraj string (ciąg znaków). Tym razem zadaniem procedur jest uzyskanie od użył imienia i nazwiska oraz wyświetlenie imienia i nazwiska w jednym komunii odróżnieniu od poprzedniego przykładu występuje tu dodatkowa zmienna „t celem jest przechowywanie ciągu liter znajdujących się we wpisanym i nazwisku oraz znajdującej się między nimi spacji.
Podczas wykonywania poleceń procedury wpiszTekst Visual Basic po formacje od użytkownika i przechowuje podane imię oraz nazwisko w zn i oraz n. Następnie wartości te zostają przekazane do funkcji PołączTekst Basic używa wartości tych zmiennych jako argumentów funkcji Połą i przypisuje rezultat nazwie funkcji (PołączTekst). Po powrocie do procedur) Tekst Visual Basic przechowuje wartość funkcji w zmiennej o nazwie r. N funkcja MsgBox wyświetla dane użytkownika (imię i nazwisko oddzielone Nazwy argumentów podobne są do zmiennych. Każda nazwa argumentu odno wartości, którą podano w momencie wezwania danej funkcji. Aby wezwać należy sporządzić procedurę zwykłą. Kiedy procedura zwykła woła funkcję, żuje jej wymagane argumenty w postaci zmiennych. Rezultat funkcji przypis do nazwy funkcji. Twrót uwagę, że nazwy funkcji używa się tak, jakby była z Podobnie jak zmienne, funkcje mogą być różnego typu. Rezultatem funkcji m
*
Przekazywanie argumentów do procedur oraz funkcji
85
ł ańcuch znaków (String), liczba całkowita (Integer) itp. Aby określić typ danych, który ma posiadać rezultat danej funkcji, dodaj słowo kluczowe as oraz nazwę typu danych na końcu wyrażenia określającego funkcję. Na przykład:
Function Iloczyn(numl, num2) As Integer
Jeżeli nie podasz typu danych, Visual Basic przypisze domyślny typ danych (Variant) rezultatowi funkcji. Określenie typu danych dla rezultatu funkcji ma te same zalety, co określenie typu danych dla zmiennych - procedury lepiej zarządzają pamięcią i są szybsze.
Przyjrzyj się teraz przykładowi funkcji, która zwraca liczbę całkowitą, chociaż przekazane jej argumenty posiadają typ danych single w procedurze wołającej tę funkcję.
1 Wpisz
procedurę
HeRazem w oknie Kod
programu. Możesz
ją wpisać w tym
samym
module, w którym poprzednio wpisałeś procedurę wpiszTekst.
Sub HeRazem ()
Dim liczl As Single Dim Iicz2 As Single Dim wynik As Single
liczl = 45,33 Iicz2 = 19,24
wynik = Iloczyn(liczl, Iicz2) MsgBox wynik End Sub
2 Wpisz funkcję iloczyn poniżej procedury HeRazem:
Function Iloczyn(liczl, Iicz2) As Integer
Iloczyn = liczl * Iicz2 End Function
3. Uruchom procedurę HeRazem.
Ponieważ wartości przechowywane w zmiennych liczl oraz iicz2 nie są liczbami całkowitymi, aby wynik otrzymany z mnożenia tych liczb był liczbą całkowitą, rezultatowi funkcji przypisano typ danych integer. Jeżeli nie podasz typu danych dla rezultatu funkcji iloczyn, to procedura HeRazem wyświetli go, używając typu danych określonego dla zmiennej wynik. Zamiast 872 rezultatem mnożenia będzie
.... . -.
86
Programowanie w Ac
8 72,1492. Aby funkcja iieRazem była bardziej uniwersalna, zamiast wpisyw ści, które mają być zastosowane w operacji mnożenia, możesz skorzystać inputBox, by poprosić użytkownika o podanie odpowiednich liczb w chwi rzania funkcji. Samodzielnie zmodyfikuj funkcję iieRazem, wzorując się n; towanej wcześniej w tym rozdziale procedurze Podaj Tekst.
Aby przekazać określoną wartość z funkcji do procedury, daną warto: przypisać nazwie funkcji. Na przykład poniższa funkcja przekazuje liczbę 7
rze LiczbaDniWTyg.
Function LiczbaDni(
LiczbaDni = 7 End Function
Sub LiczbaDniWTyg ( )
MsgBox "W tygodniu jest End Sub
& LiczbaDni &
dni .
Procedury zwykłe i funkcje: kiedy co używać
Sporządź procedurę zwykłą, gdy... |
Pomyśl o sporządzeniu funkcj |
• chcesz wykonać pewne czynności, |
• musisz dokonać prostej ka |
• chcesz pobrać informacje od użytkownika, |
więcej niż dwa razy, |
• chcesz wyświetlić informacje na ekranie, |
• musisz dokonać skomplik |
• chcesz zwrócić kilka wartości do procedu- |
obliczeń, |
ry wołającej, |
• odwołujesz się do tej s |
• chcesz zmodyfikować wartości w argu- |
strukcji lub bloku instruk |
mentach przekazanych przez adres |
razy, |
(zob. następny podrozdział). |
• chcesz przekształcić kill |
|
mentów w jeden wynik, |
|
• chcesz przekształcić jedną |
|
w inną, |
|
• chcesz zbadać wyrażenie |
|
i zwrócić wynik Prawda (r |
|
Fałsz (False). |
Przekazywanie argumentów |
|
nagle zmienić wartość zmiennych. Aby upewnić się, że wołana procedura i
Przekazywanie argumentów do procedur oraz funkcji
87
n ie zmieni wartości przekazywanego argumentu, należy poprzedzić nazwę zmiennej w definicji funkcji słowem kluczowym BYvai. Oto przykład:
1 W oknie Kod programu w module, w którym wpisałeś poprzednią procedurę i funkcję, wpisz podaną poniżej procedurę TrzyLiczby oraz funkcję średnia:
Sub TrzyLiczby O
Dim liczl As Integer Dim Iicz2 As Integer Dim Iicz3 As Integer liczl = 10 Iicz2 = 20 Iicz3 = 30
MsgBox Średnia(liczl, Iicz2, Iicz3) MsgBox liczl MsgBox Iicz2 MsgBox Iicz3 End Sub
Function Średnia(ByVal liczl, ByVal Iicz2, ByVal Iicz3)
liczl = liczl + 1
Średnia = {liczl + Iicz2 + Iicz3) / 3 End Function
Procedura TrzyLiczby przypisuje wartości trzem zmiennym i woła funkcję n nazwie średnia w celu obliczenia średniej trzech liczb. Argumentami funkcji są Lwy zmiennych liczl, iicz2 oraz ii«3. Zwróć uwagę, że wszystkie nazwy ar-Lentów są poprzedzone słowem kluczowym ByVal. Przed obliczeniem wyniku funkcja najpierw zmienia wartość argumentu liczl (liczl - liczl +l>. Na początku zmienna liczl posiadała wartość 10. Teraz wartość zmiennej wynos, 11 (10+1). Ta właśnie zmienna zostanie użyta we wzorze obliczającym średnią:
Ś rednia =
+ 20 + 30) /3
Zastanówmy się teraz, co się stanie, jeżeli opuścisz słowo kluczowe ByVal przed nazwą argumentu liczl w deklaracji funkcji średnia. Rezultat funkcji nadal będzie taki sam jednakże zawartość zmiennej liczl wyniesie teraz 11. Funkcja średnia wyświetliła nieoczekiwany wynik (20,3333333333333 zamiast spodziewanego 20) irównocześnie zmodyfikowała oryginalne dane przechowywane w zmiennej liczl.
P rogramowanie w
Aby zapobiec zmianie wartości przekazywanych do funkcji, zastosuj słow<
ByVal.
Stosuj słowa kluczowe ByRcf lub ByVal
Ponieważ zmienne przekazywane do funkcji lub procedury mogą zos fikowane przez procedurę, która je otrzymaje, trzeba wiedzieć, w jaki spc pieczyć oryginalną wartość zmiennej przed nieoczekiwaną modyfikacją. V posiada dwa słowa kluczowe ByRef oraz ByVal, które zezwalają lub zal zmianę zawartości zmiennej.
Ustawienie wyjściowe powoduje, że Visual Basic przekazuje info funkcji lub procedury według odwołania (ang. by reference - ByRef), odv do oryginalnych danych przekazanych w argumencie funkcji lub w momencie, gdy dana procedura lub funkcja jest wołana. Zatem jeżeli f procedura zmieni wartość argumentu, oryginalna wartość również ulegnie Rezultat ten uzyskasz, jeżeli opuścisz słowc kluczowe ByVal przed nazwą, liczi w deklaracji podanej powyżej funkcji średnia. Jeżeli chcesz, aby zmieniła oryginalną wartość, to nie musisz poprzedzać nazwy zmiennej słc czowym ByRef, ponieważ wszystkie zmienne przekazywane są w ten sposób
Jeżeli użyjesz słowa kluczowego ByVaj przed nazwą argumentu, to Vi przekaże ten argument według wartości (By Value). Oznacza to, że Visual E kopię oryginalnych danych i następnie przekaże ją do wołanej funkcji lub { Jeżeli funkcja lub procedura zmieni wartość argumentu przekazanego we tości, to zmieni się tylko kopia, a nie oryginalna wartość. Dlatego też gd średnia zmieniła wartość argumentu liczi, oryginalna wartość zmiennej uległa modyfikacji.
Użycie argumentów opcjonalnych
Czasami chciałbyś przekazać dodatkową wartość do procedury. Załóżn siadasz już funkcję, która oblicza koszt posiłku na osobę i chciałbyś, aby wyl ona obliczenie dla dwóch lub więcej osób (l:czby osób nie znasz z góry). A zać, że dany argument funkcji nie zawsze jest wymagany, należy go popra wem kluczowym optional. Argumenty opcjonalne należy umieścić na kc argumentów po nazwach argumentów, które są obowiązkowe. Opcjonalne ai zawsze posiadają typ danych o nazwie variant. Oznacza to, że nie można typu danych dla argumentu opcjonalnego za pomocą słowa kluczowego as.
W poprzednim podrozdziale utworzyłeś funkcję, która oblicza średn liczb. Załóżmy teraz, że chcesz użyć jej do obliczenia średniej dwóch liczb, zadeklarować trzeci argument funkcji średnia jako opcjonalny. Aby zachow;
ia, sporządź funkcję o nazwie Avg, aby obliczyć średnią
nalną wersję funkcji średnia :ZOWe | dwóch lub trzech liczb.
1. Wpisz następującą funkcję w oknie Kod programu:
Function Avgdiczl, Iicz2. Optional Iicz3) Dim ileLiczb As Integer ileLiczb = 3 If isMissing(licz3) Then
Iicz3 = 0
ileLiczb = ileLiczb - 1
End If . ,
Avg = (liczl + Iicz2 + Iicz3) / ileL.czb
End Function
2. Uruchom tę funkcję z okna Instrukcje bezpośrednie:
?Avg(2, 3)
isza Enter Visual Basic wyświetla rezultat funkcji: 2,5.
Po naciśnięciu klawisza
?Avg(2, 3, 5)
Tym razem podany wynik wynosi 3,33333333333333.
Funkcja Avg pozwala zatem na obliczenie średniej dwóch lub trzech liczb. Okazuje się, że to ty decydujesz, jakie oraz ile (dwie czy trzy) wartości chcesz użyć do obliczenia średniej. Gdy zaczniesz wpisywać wartości argumentów funkcji w oknie Instrukcje bezpośrednie, Visual Basic wyświetli nazwę argumentu opcjonalnego w nawiasach kwadratowych.
Poświęć parę minut na analizę funkcji Avg. Funkcja ta może przyjąć nie więcej niż trzy argumenty. Argumenty liczl i iicz2 są obowiązkowe. Argument iicz3 jest opcjonalny. Zwróć uwagę, że nazwa tego argumentu poprzedzona jest słowem kluczowym optional. Argument ten znajduje się na końcu listy argumentów. Ponieważ typ argumentów liczl, iicz2 oraz iicz3 nie został zadeklarowany, Visual Basic traktuje je jako varianty. Wewnątrz procedury funkcji zmienna ileLiczb jest zadeklarowana jako zmienna typu integer. Zmiennej tej przypisana jest początkowa wartość równa 3. Ponieważ funkcja ta musi obliczyć raz średnią dwóch, a innym razem średnią trzech liczb, wbudowana funkcja VBA o nazwie isMissing sprawdza liczbę przekazanych argumentów. Jeżeli trzeci (opcjonalny) argument nie został poda-
90
Programowanie w A(
n y, funkcja isMissing podstawia w jego miejsce wartość zero (0) i rówi odejmuje jeden od wartości przechowywanej w zmiennej ileLiczb. St; opcjonalny argument nie został podany, zmienna ileLiczb posiada warto; stępne polecenie oblicza średnią na podstawie podanych wartości lic i rezultat przypisany jest nazwie funkcji.
Funkcja isMissing umożliwia sprawdzenie, czy wartość opcjonalne mentu została podana. Funkcja ta zwraca wartość logiczną Prawda (True), j< jest opcjonalnego argumentu, lub wartość logiczną Fałsz (False), jeżeli o] argument został podany. Funkcja isMissing użyta jest tutaj ze strukturą wć if...Then (zob. dalej w tym rozdziale). Jeżeli argument o nazwie iiczba3 j( nięty (IsMissing), wówczas (Then) Visual Basic podstawia zero jako wartoś go argumentu (Iiczba3 = 0) i zmniejsza wartość przechowywaną w zmień Liczb o jeden (ileLiczb = ileLiczb - 1).
Testowanie funkcji
Aby sprawdzić nową funkcję, napisz procedurę zwykłą, która zawoła di cję i wyświetli jej wynik. Procedura zwykła powinna wyświetlić rezultat a następnie podać również wartości argumentów początkowych. W ten sposć będzie sprawdzić, czy argumenty początkowe funkcji nie zostały przy zmienione. Jeżeli funkcja wymaga argumentów opcjonalnych, musisz równie dzić za pomocą funkcji isMissing sytuacje, w których argument opcjon; podany lub pominięty.
Wbudowane funkcje
VBA posiada wiele wbudowanych funkcji. Funkcje te można odnaleźć \ wbudowanej pomocy Visual Basica. Aby uzyskać alfabetyczny spis wszystki cji VBA, wybierz Pomoc => Microsoft Visual Basic - Pomoc w oknie edytor Basic. Kliknij zakładkę Spis Treści (Contents), otwórz folder o nazwie Visu Language Reference i wybierz Functions. Niektóre z wbudowanych funkcj dzo często używane, inne natomiast dość rzadko.
Weźmy na przykład funkcje, takie jak MsgBox lub InputBox. Jedną z < brego programu jest współpraca z użytkownikiem. W trakcie pracy z aplikacji soft Access współdziałasz z programem, korz3'stając z wielu okien dialogowy dy się pomylisz, pojawia się komunikat informujący o błędzie. W czasie pisa snych procedur możesz również poinformować użytkownika o nieoczekiwan dzie lub podać wynik uzyskany w wyniku jakichś obliczeń. Możesz to zrobii mocą wbudowanej funkcji VBA o nazwie M:=gBox. Dotychczas zetknąłeś s z prostymi zastosowaniami tej funkcji. Z następnego podrozdziału dowiesz
Przekazywanie argumentów do procedur oraz funkcji
91
k ontrolować wygląd komunikatu. Nauczysz się również uzyskiwać informacje od użytkownika za pomocą funkcji inputBox.
Użycie funkcji MsgBox
Funkcja MsgBox, z którą zetknęliśmy się w dotychczas omawianych procedurach, ograniczyła się do wyświetlenia wiadomości dla użytkownika w prostym polu komunikatu, które miało tylko jeden przycisk OK. Kliknięcie tego przycisku lub naciśnięcie klawisza Enter powodowało usunięcie pola komunikatu z ekranu. Proste pole komunikatu tworzy się za pomocą słowa kluczowego MsgBox oraz tekstu ujętego w cudzysłów. Innymi słowy, aby wyświetlić komunikat o treści „Koniec procedury", należy wpisać instrukcję:
MsgBox "Koniec procedury. "
Aby szybko wypróbować podaną powyżej instrukcję, wpisz ją w oknie Instrukcje bezpośrednie. Po wpisaniu instrukcji i naciśnięciu klawisza Enter Visual Basic wyświetla komunikat przedstawiony na rysunku 1.22.
Koniec procedury,
O K
R ysunek 1.22. Aby wyświetlić komunikat, umieść tekst jako argument funkcji MsgBox
Składnia funkcji MsgBox dopuszcza użycie innych argumentów, za pomocą których możesz umieścić w oknie dialogowym więcej przycisków, zmienić jego tytuł czy też dodać własne instrukcje pomocy. Poniżej jest podana pełna składnia funkcji MsgBox oraz znaczenie jej poszczególnych argumentów:
MsgBox (prompt [, buttons] [, title], [, helpfile, context])
Zwróć uwagę, że pierwszy argument funkcji MsgBox jest obowiązkowy, natomiast pozostałe (podane w nawiasach kwadratowych) są opcjonalne. Argument „prompt" może posiadać do 1024 znaków, zależnie od szerokości znaków. W miejscu tego argumentu podaje się treść komunikatu w cudzysłowie.
Jeżeli wpiszesz długi tekst komunikatu w miejscu argumentu prompt, Visual Basic zdecyduje, w jaki sposób należy podzielić tekst, tak aby zmieścił się w oknie dia-
92
Programowanie w Access 2
logowym. Wykonaj kilka ćwiczeń w oknie Instrukcje bezpośrednie, aby poznać i ne sposoby formatowania tekstu w polu komunikatu.
1. Wpisz następującą instrukcję w oknie Instrukcje bezpośrednie. Całą instrul musisz wpisać w jednym wierszu. Następnie należy nacisnąć Enter.
MsgBox "Koniec procedury. Otwórz teraz plik o nazwie ""Test.doc"" i w; czysty dysk do stacji dysków. Dalsza procedura skopiuje ten plik na dysk".
Po naciśnięciu Enter Visual Basic wyświetli okno dialogowe zkomunik; Jeżeli uzyskasz komunikat „Błąd kompilacji" (Compile error), kliknij OK. Nasti upewnij się, że nazwa pliku ujęta jest w dwie par/ cudzysłowów - ,,"Test.doc"".
Microsoft Access
Koniec procedury. Otwórz teraz plik o nazwie "Test. doc" i wlóz czysty d /sk do stacji dysków. Dalsza procedura wkopiuje I na dysk.
OK
R ysunek 1.23. Ten długi komunikat sprawi lepsze wrażenie na użytkowniku, jeżeli prze formatowanie tekstu w swoje ręce
Kiedy tekst komunikatu jest długi, możesz podzielić go na kilka wierszy, stając z wbudowanej funkcji VBA o nazwie chr. Funkcja ta wymaga jednegc mentu w postaci liczby z zakresu od Ó do 259 i zwraca znak reprezentowany daną liczbę. Na przykład:
chr (13) oznacza naciśnięcie klawisza Enter. Zamiast tej funkcji możesz stać z wbudowanej stałej Visual Basica o nazwie vbcr.
chr (10) wprowadza nowy wiersz (funkcja ta przydaje się przy dodawa stępów między wierszami tekstu). Funkcję tę możesz zastąpić wbudowaną sta al Basica o nazwie vberLf.
2. Zmodyfikuj instrukcję wprowadzoną w poprzednim punkcie w następuj; sób:
MsgBox "Koniec procedury." & Chr(13) & "Otwórz teraz plik o nazwi ""Test.doc"" i włóż" & Chr(13) & "czysty dysk do stacji dysków." & Chr(13) & "Dalsza procedura skopiuje ten plik na dysk."
Korzystając ze stałych Visual Basica, możesz zapisać tę instrukcję w nas sposób:
P rzekazywanie argumentów do procedur oraz funkcji
M sgBox "Koniec procedury." & vbCr & "otwórz teraz plik o nazwie ""Test.doc"" i włóż" & vbCr & "czysty dysk do stacji dysków." & vbCr & "Dalsza procedura skopiuje ten plik na dysk."
Microsoft Access
Koniec procedury.
Otwórz teraz plik o nazwie "Test.doc" i wlóz
czysty dysk do stacji dysków,
Dalsza procedura wkopiuje ten plik na dysk,
O K
R ysunek 1.24. Możesz podzielić długi tekst na kilka wierszy, korzystając z funkcji Chr(13) lub stałej VBA o nazwie vbCr
Zwróć uwagę, że każdy fragment tekstu znajduje się w cudzysłowie. Tekst cytowany, który znajduje się wewnątrz innego łańcucha znaków, wymaga dodatkowej pary cudzysłowów (zob. „"Test.doc""" w przykładzie powyżej). Funkcja chr(i3) lub stała vbcr wskazuje, w którym miejscu chcesz rozpocząć nowy wiersz. Znaku & używa się w celu dodania znaku karetki do łańcucha znaków.
Przy wpisywaniu długich komunikatów w jednym wierszu łatwo o pomyłkę. Jak wiesz, Visual Basic ma specjalny znak kontynuacji wiersza (spacja + znak podkreślenia), który umożliwia rozbicie tekstu na krótsze fragmenty podane w kilku wierszach. Niestety, znaku kontynuacji wiersza ( _ ) nie można używać w oknie Instrukcje bezpośrednie.
3. W oknie Kod programu wpisz procedurę Komunikat podaną poniżej. Nie zapomnij poprzedzić znaku kontynuacji wiersza spacją.
Sub Komunikat ( )
MsgBox "Koniec procedury. " & vbCr _
& "Otwórz teraz plik o nazwie ""Test.doc"" i włóż" & vbCr _ & "czysty dysk do stacji dysków. " & vbCr _ & "Dalsza procedura skopiuje ten plik na dysk. "
End Sub
Kiedy odtworzysz powyższą procedurę, Visual Basic przedstawi ten sam komunikat (zob. rysunek 1.24). Tekst funkcji MsgBox, podzielony na fragmenty za pomocą znaku kontynuacji wiersza ( _ ), łatwiej jest wpisać i analizować niż tekst wpisany
w punkcie 2.
94
Programowanie w Access!
D la zwiększenia czytelności komunikatu możesz powiększyć odstęp mi wierszami tekstu. W tym celu dodaj drugą stałą vbcr (lub funkcję chr(i3)) albi stosuj dwie funkcje chr(lO). Następny punkt tego ćwiczenia prezentuje sp wprowadzania dodatkowych odstępów między wierszami wyświetlanego komunii
4. Wpisz następującą procedurę Komunikat2:
Sub Komunikat2( )
MsgBox "Koniec procedury. " & Chr(lO) & Chr(lO) _
& "Otwórz teraz plik o nazwie ""Test.doc™" i włóż" & Chr(13)
& "czysty dysk do stacji dysków. " & Chr(13)& Chr(13) _
& "Dalsza procedura skopiuje ten plik na dysk. "
End Sub
Microsoft Access
Koniec procedury.
Otwórz teraz plik o nazwie "Test.doc" i wlóz czysty dysk do stacji dysków,
Dalsza procedura wkopiuje ten plik na dysk.
OK
R ysunek 1.25. Przejrzystość wyświetlanego komunikatu można zwiększyć, wprowadzaj puste wiersze
Teraz, gdy opanowaliśmy już techniki formatowania tekstu pojawiające w polu komunikatu, zajmiemy się następnym argumentem funkcji MsgBox. C argument buttons nie jest obowiązkowy, jest on dość często używany.
Argument buttons oznacza, ile przycisków oraz jakiego typu chcesz wyś w polu komunikatu. Argument ten może być stałą lub liczbą (zob. tabela 1.4). go pominiesz, zostanie wyświetlone proste pole komunikatu, zawierające tyłki cisk OK (zob. kod 0 w tabeli 1.4). Zastanawiasz się zapewne, po co stosować kowe przyciski w polu komunikatu. Takie przyciski pozwalają użytkownikowi wiadać na proste pytania lub decydować o toku wykonania danej procedury.
Przekazywanie argumentów do procedur oraz funkcji
95
Tabela 1.4. Ustawienia argumentu buttons w funkcji MsgBox
Stalą |
Wartość |
Znaczenie |
Ustawienia przycisków |
||
vbOKOnly |
0 |
Wyświetla tylko przycisk OK. Jest to ustawienie wyjściowe |
vbOKCancel |
1 |
Przyciski OK i Anuluj (Cancel) |
vbAbortRetrylgnore |
2 |
Przyciski Przerwij (Abort), Ponów próbę (Retry) i Ignoruj (Ignore) |
vbYesNoCancel |
3 |
Przyciski Tak, Nowy (New) i Anuluj |
vbYesNo |
4 |
Przyciski Tak i Nie |
vbRetryCancel |
5 |
Przyciski Ponów próbf i Anuluj |
Ustawienia ikon |
||
vbCritical |
16 |
Komunikat alarmujący |
vb Question |
32 |
Pytanie ostrzegawcze |
vbExclamation |
48 |
Komunikat ostrzegawczy |
vblnformation |
64 |
Komunikat informujący |
Ustawienia domyślne |
||
vbDefaultButtonl |
0 |
Domyślnym przyciskiem jest przycisk pierwszy |
vbDe£aultButton2 |
256 |
Domyślnym przyciskiem jest przycisk drugi |
vbDefaultButton3 |
. 512 |
Domyślnym przyciskiem jest przycisk trzeci |
vbDefaultButton4 |
768 |
Domyślnym przyciskiem jest przycisk czwarty |
96
Programowanie w Access
|
||
Stalą |
Wartość |
Znaczenie |
Ustawienia modalnych pól dialogu |
||
vbApplicationModal |
0 |
Użytkownik musi odpowiedzieć na wyś« lony komunikat, zanim będzie mógł dalej pracować w bieżącej aplikacji |
vbSystemModal |
4096 |
Działanie wszystkich aplikacji zostanie wstrzymane, aż użytkownik odpowie nai świetl any komunikat |
Inne ustawienia funkcji MsgBox |
||
vbMsgBoxHelpButton |
16384 |
Dodaje przycisk Pomoc do pola komunii |
vbMsgBoxSetForeground |
65536 |
Pole komunikatu wyświetlone jest na piei szym planie |
vbMsgBoxRight |
524288 |
Tekst komunikatu jest wyrównany wedtu prawe go marginesu |
vbMsgBoxRtlReading |
1048576 |
Tekst sformatowany do łatwego odczytu w języku arabskim lub hebrajskim |
Teraz warto wyjaśnić, kiedy powinieneś używać argumentu buttons. Przy] my, że użytkownik przygotowanej przez ciebie procedury ma odpowiedzieć na nie. Odpowiedź ma być w stylu Tak lub Nie. Pole komunikatu wymaga zatem d przycisków. Jeżeli pole komunikatu zawiera więcej niż jeden przycisk, to jeden; jest przyciskiem domyślnym. Gdy użytkownik naciśnie klawisz Enter, to am tycznie zostanie wybrany przycisk domyślny. Ponieważ komunikaty mogą byi nego typu (ostrzegawcze, alarmujące i informujące), możesz również określić tj munikatu, dodając do argumentu buttons kod odpowiedniej ikony.
Oprócz określenia typu komunikatu argumentu buttons może zawierać usi nie wskazujące na to, czy pole komunikatu musi zostać zamknięte, zanim użytk będzie mógł przejść do innego programu. Jest ciałkiem prawdopodobne, że uży nik będzie chciał uruchomić inny program lub też wykonać inną czynność w c programie przed odpowiedzią na pytanie postawione w polu komunikatu. Jeżel komunikatu jest modalne (vbApplication Modal), to użytkownik będzie musi mknąć okno komunikatu, nim zacznie korzystać z aplikacji. Jeśli natomiast i
Przekazywanie argumentów do procedur oraz funkcji
97
z awiesić wszystkie programy, dopóki użytkownik nie zamknie pola komunikatu, to powinieneś uwzględnić ustawienie vbsystemModai w argumencie buttons.
Ustawienia argumentu buttons są podzielone na pięć grup: ustawień przycisków, ikon, domyślne, modalnych okien dialogowych i inne ustawienia (zob. tabela 1.4). W argumencie buttons możesz użyć tylko jednego ustawienia z każdej grupy.
Aby utworzyć argument buttons możesz dodać wartości każdego ustawienia, które chcesz uwzględnić w tym argumencie. Na przykład, aby wyświetlić pole komunikatu z dwoma przyciskami (Tak i Nie), ikoną zapytania i z ustawieniem domyślnym na przycisku Nie, odszukaj odpowiadające tym ustawieniom wartości w tabeli 1.4 i dodaj je do siebie. Powinieneś otrzymać 292 (4+32+256 ). Aby szybko wyświetlić pole komunikatu z użyciem otrzymanego tym sposobem argumentu buttons, wpisz w oknie Instrukcje bezpośrednie:
MsgBox "Czy chcesz kontynuować? ", 292
Posługiwanie się liczbami dla określenia wartości argumentu buttons rzadko stosowane jest w praktyce. O wiele łatwiej jest zrozumieć program, kiedy opiera się na stałych symbolicznych. Na przykład wpisz w oknie Instrukcje bezpośrednie:
MsgBox "Czy chcesz kontynuować? tion+vbDefaultButton2
vbYesNo + vbQues-
P owyższa instrukcja wywołuje takie samo pole komunikatu, jak te przedstawione na rysunku 1.26.
R ysunek 1.26. Możesz podać liczbę przycisków w polu komunikatu za pomocą argumentu buttons
W następującym przykładzie nauczysz się używać argumentu buttons w procedurze VB A.
1. W oknie Kod programu wpisz procedurę MsgTakNie podaną poniżej:
98
Programowanie w Acce
S ub MsgTakNie()
Dim pytanie As String
Dim przyciski As Integer
pytanie = "Czy chcesz otworzyć nowy raport?"
przyciski = vbYesNo + vbQuestion + vbDefaultButton2
MsgBox pytanie, przyciski End Sub
W powyższej procedurze zmienna pytanie przechowuje tekst komu Ustawienia argumentu buttons przechowywane są w zmiennej o nazwie przy Zamiast nazw stałych możesz użyć ich wartości, na przykład:
przyciski = 4+32+256
Jednakże procedura będzie łatwiejsza do zrozumienia i dla ciebie, i dla osób, które będą z niej korzystały, jeżeli będziesz się posługiwał nazwami < symbolicznych.
Zmienne pytanie i przyciski zostały użyte jako argumenty funkcji MsgB uruchomieniu tej procedury uzyskasz pole komunikatu, podobne do pola przeds nego na rysunku 1.26. Zauważ, że przycisk Nie jest teraz wybrany. Jeśli nac Enter, będzie to równoznaczne z odpowiedzią przeczącą. Przycisk Nie jest c przyciskiem w oknie dialogowym. Jest on również przyciskiem domyślnym, chwili nic się nie stanie, gdyż procedura nie posiada żadnych innych ins z wyjątkiem tych, które wyświetlają pole komunikatu. Jeżeli chcesz zmienić pr domyślny, to zmień ustawienie na vbDefaultButtoni.
Trzecim argumentem funkcji MsgBox jest title, czyli tytuł pola komui Chociaż jest to również argument opcjonalny, jest on bardzo przydatny, poniew zwala tworzyć procedury, które wizualnie nie wskazują na to, że program zosta sany w aplikacji Microsoft Access. Korzystając z tego argumentu, możesz zi napis na pasku tytułu w oknie dialogowym. Załóżmy, że procedura MsgTakNi wyświetlić na pasku tytułu napis „Nowy raport'. Procedura MsgTakNie2 demoi użycie argumentu title:
Sub MsgTakNie2()
Dim pytanie As String
Dim przyciski As Integer
Dim tytuł As String
pytanie = "Czy chcesz otworzyć nowy raport?"
przyciski = vbYesNo + vbQuestion + vbDefaultButton2
t ytuł = "Nowy raport" MsgBox pytanie, przyciski, tytuł End Sub
Tekst argumentu title przechowywany jest w tej procedurze w zmiennej o nazwie tytuł. Jeżeli pominiesz ten argument, to Visual Basic wyświetli napis „Microsoft Access".
Zwróć uwagę, że argumenty są wpisane w kolejności wymaganej przez zapis syntaktyczny funkcji MsgBox. Aby podać argumenty w dowolnej kolejności, należy poprzedzić wartość danego argumentu jego nazwą, tak jak w przykładzie poniżej:
ox title:=tytuł, prompt:=pytanie, buttons:=przyciski
Ostatnie dwa argumenty funkcji MsgBox, helpFile oraz context, stosowane są zazwyczaj na etapie zaawansowanym przez osoby mające doświadczenie w posługiwaniu się plikami pomocy, używanymi w środowisku Windows. Argument helpFile zawiera nazwę pliku z dodatkowym zagadnieniem pomocy. Kiedy podasz ten argument, w oknie dialogowym zostanie automatycznie umieszczony przycisk Pomoc. Użycie argumentu helpFile wymaga również zastosowania argumentu context, który oznacza numer zagadnienia pomocy w pliku określonym przez argument helpFile. Zakładając, że PomocX.hlp jest plikiem pomocy, a liczba 55 jest numerem zagadnienia pomocy w tym pliku, należałoby przygotować następującą instrukcję:
MsgBox title :=tytuł, _ promp t: =py t an i e, _ buttons:=przyciski, _ helpFile: = "PomocX.hlp", _ context: =5 5
Zwróć uwagę na to, że powyższa instrukcja jest podzielona na kilka wierszy przy użyciu znaku kontynuacji wiersza ( _ ) . Po wpisaniu takiej instrukcji w oknie dialogowym pojawi się dodatkowy przycisk o nazwie Pomoc. Kliknięcie tego przycisku spowoduje wyświetlenie specjalnego zagadnienia pomocy - jeżeli zagadnienie takie istnieje w pliku pomocy pod wskazaną nazwą. Tworzenie zagadnień pomocy wymaga dodatkowego narzędzia pracy o nazwie Microsoft Help Compiler. Narzędzie to jest dostępne między innymi w pakiecie oprogramowania Microsoft Visual Basic Professional Edition.
100
Programowanie w Acces;
Z wracanie wartości przez funkcję MsgBox
Przy wyświetlaniu prostych komunikatów użytkownik albo naciska Enter klika przycisk OK. Powoduje to usunięcie okna dialogowego z ekranu. Gdy dialogowe ma więcej przycisków, procedura powinna stwierdzić, który przycisk wybrany. Aby to zrobić, należy umieścić w zmiennej wartość zwracaną przez fu MsgBox. W tabeli 1.5 zostały podane wartości zwracane przez funkcję MsgBo> odpowiadające im stałe.
Tabela 1.5. Wartości zwracane przez funkcję MsgBox
Wybrany przycisk |
Stała |
Wartość (Kod) |
|
OK |
vbOK |
1 |
|
Anuluj (Cancel) |
vbCancel |
2 |
|
Przerwij (Abort) |
vbAbort |
3 |
|
Ponów próbę (Retry) |
vbRetry |
|
4 |
Ignoruj (Ignore) |
vblgnore |
|
5 |
Tak (Yes) |
vbYes |
|
6 |
Nie (No) |
vbNo |
|
7 |
Procedura MsgTakNie3 jest zmodyfikowaną wersją procedury MsgTakNie2 monstruje ona, w jaki sposób można dowiedzieć się, który przycisk został wy przez użytkownika.
Sub MsgTakNie3()
Dim pytanie As String Dim przyciski As Integer
Dim tytuł As String Dim wybór As Integer
pytanie = "Czy chcesz otworzyć nowy raport?" przyciski = vbYesNo + vbQuestion + vbDefaultButton2 tytuł = "Nowy raport"
wybór = MsgBox(pytanie, przyciski, tytuł) MsgBox wybór End Sub
P rzekazywanie argumentów do procedur oraz funkcji
W powyższej procedurze zapisano rezultat funkcji MsgBox w zmiennej wybór. uwagę, że argumenty funkcji MsgBox zostały tym razem wymienione
w nawiasie.
wybór = MsgBox(pytanie, przyciski, tytuł)
Funkcja MsgBox z nawiasem czy bez
Funkcja MsgBox wymaga argumentów podanych w nawiasie tylko wtedy, kiedy będziemy korzystać z wartości zwracanej przez tę funkcję. Podając argumenty funkcji bez nawiasu, informujesz Visual Basic o tym, żeby zignorował rezultat funkcji. Najczęściej będziesz chciał korzystać z rezultatu funkcji MsgBox, gdy okno komunikatu zawiera więcej niż jeden przycisk.
Gdy odtworzysz procedurę MsgTakNie3, pojawi się okno komunikatu z dwoma przyciskami. Jeśli klikniesz przycisk „Tak", polecenie MsgBox wybPrzycisk wyświetli liczbę 6. Kiedy klikniesz przycisk „Nie", zostanie wyświetlona liczba 7. Dalej z tego rozdziału dowiesz się, w jaki sposób procedura VBA może wykonywać inne zadania w zależności od wybranego przycisku.
Użycie funkcji InputBox
Funkcja InputBox wyświetla okno dialogowe z komunikatem zachęcającym użytkownika do wpisania danych w polu edycji tekstu. Okno dialogowe posiada dwa przyciski - OK i Anuluj. Gdy użytkownik kliknie przycisk OK, funkcja InputBox zwróci informację wpisaną w polu edycji. Jeśli użytkownik wybierze przycisk Anuluj, funkcja zwróci pusty ciąg znaków („"). Składnia funkcji InputBox jest następująca:
I nputBox (prompt [, context])
title] [, default] [, xpos] [, ypos]
helpfile,
P ierwszy argument funkcji InputBox - prompt - jest tekstem, który zamierzasz wyświetlić w oknie dialogowym. Podobnie jak w funkcji MsgBox, tekst może składać się z 1024 znaków, zależnie od ich szerokości. Długie komunikaty można wpisać w oddzielnych wierszach za pomocą funkcji chr (13) lub chr (10) lub stałych symbolicznych vbcr oraz vbCrLf (zob. przykłady użycia funkcji MsgBox wcześniej w tym rozdziale).
Drugi argument funkcji - title - pozwala na zmianę tytułu okna dialogowego. Jeśli pominiesz ten argument, to tytułem będzie „Microsoft Access".
«.*wjc insgiSOX
Przy wyświetlaniu prostych komunikatów użytkownik albo naciska Ente klika przycisk OK. Powoduje to usunięcie okna dialogowego z ekranu. Gdj dialogowe ma więcej przycisków, procedura powinna stwierdzić, który przycisk wybrany. Aby to zrobić, należy umieścić w zmiennej wartość zwracaną przez fi MsgBox. W tabeli 1.5 zostały podane wartości zwracane przez funkcję odpowiadające im stałe.
Tabela 1.5. Wartości zwracane przez funkcję MsgBox
Wartość (Kod) j
Wybrany przycisk Stała
vbOK
I OK
Anuluj (Cancel) Przerwij (Abort) Ponów próbę (Retry) Ignoruj (Ignore) Tak (Yes)
Nie (No) ' vbNo
i I
Procedura MsgTakNie3 jest zmodyfikowaną wersją procedury MsgTakNie2.j monstruje ona, w jaki sposób można dowiedzieć się, który przycisk został wyW przez użytkownika.
Sub MsgTakNie3()
Dim pytanie As String
Dim przyciski As Integer
Dim tytuł As String
Dim wybór As Integer
a
pytanie = "Czy chcesz otworzyć nowy rapcrt?"
przyciski = vbYesNo + vbQuestion + vbDefaultButton2
tytuł = "Nowy raport"
wybór = MsgBox(pytanie, przyciski, tytuł) MsgBox wybór End Sub
Przekazywanie argumentów do procedur oraz funkcji
101
W powyższej procedurze zapisano rezultat funkcji MsgBox w zmiennej wybór. Zwróć uwagę, że argumenty funkcji MsgBox zostały tym razem wymienione
w nawiasie.
wybór = MsgBox(pytanie, przyciski, tytuł)
Funkcja MsgBox z nawiasem czy bez
Funkcja MsgBox wymaga argumentów podanych w nawiasie tylko wtedy, kiedy będziemy korzystać z wartości zwracanej przez tę funkcję. Podając argumenty funkcji bez nawiasu, informujesz Visual Basic o tym, żeby zignorował rezultat funkcji. Najczęściej będziesz chciał korzystać z rezultatu funkcji MsgBox, gdy okno komunikatu zawiera więcej niż jeden przycisk.
Gdy odtworzysz procedurę MsgTakNie3, pojawi się okno komunikatu z dwoma przyciskami. Jeśli klikniesz przycisk „Tak", polecenie MsgBox wybPrzycisk wyświetli liczbę 6. Kiedy klikniesz przycisk „Nie", zostanie wyświetlona liczba 7. Dalej z tego rozdziału dowiesz się, w jaki sposób procedura VBA może wykonywać inne zadania w zależności od wybranego przycisku.
Użycie funkcji InputBox
Funkcja mputBox wyświetla okno dialogowe z komunikatem zachęcającym użytkownika do wpisania danych w polu edycji tekstu. Okno dialogowe posiada dwa przyciski - OK i Anuluj. Gdy użytkownik kliknie przycisk OK, funkcja InputBox zwróci informację wpisaną w polu edycji. Jeśli użytkownik wybierze przycisk Anuluj, funkcja zwróci pusty ciąg znaków („"). Składnia funkcji InputBox jest następująca:
InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile,
context] )
Pierwszy argument funkcji InputBox - prompt - jest tekstem, który zamierzasz wyświetlić w oknie dialogowym. Podobnie jak w funkcji MsgBox, tekst może składać się z 1024 znaków, zależnie od ich szerokości. Długie komunikaty można wpisać w oddzielnych wierszach za pomocą funkcji chr (13) lub chr (10) lub stałych symbolicznych vbcr oraz vbCrLf (zob. przykłady użycia funkcji MsgBox wcześniej w tym rozdziale).
Drugi argument funkcji - title - pozwala na zmianę tytułu okna dialogowego. Jeśli pominiesz ten argument, to tytułem będzie „Microsoft Access".
102
Programowanie w Access
.
Trzeci argument funkcji inputBox - default - umożliwia wyświetlenie do nego tekstu w polu edycji tekstu. Jeżeli opuścisz ten argument, to wyświetlone i dialogowe będzie zawierało puste pole edycji.
Następne dwa argumenty funkcji inputBox - xpos i ypos - pozwalają oku pozycję okna dialogowego na ekranie. Jeśli pominiesz te argumenty, to okno dial we zostanie wyświetlone pośrodku ekranu. Argument xpos określa odległość 1 krawędzi okna dialogowego od lewej krawędzi eKranu (na osi poziomej X). Jeśl miniesz ten argument, to okno dialogowe będzie wyśrodkowane poziomo. ArgiT ypos określa odległość górnej krawędzi okna dialogowego od górnej krawędzi efa Jeśli pominiesz ten argument, to okno dialogowe będzie wyświetlone w pionie i więcej w odległości 1/3 od górnej krawędzi ekranu. Odległości mierzonj w specjalnych jednostkach zwanych twips. Jeden twip równa się mniej więcej i cala.
Ostatnie dwa opcjonalne argumenty funkcji inputBox - helpFile oraz co* - umożliwiają wyświetlanie utworzonych zagadnień pomocy. Tak jak wprzypl funkcji MsgBox, tworzenie plików pomocy wymaga specjalnego kompilatora pon
Teraz, gdy znasz już znaczenie argumentów funkcji inputBox, przeanaliz kilka przykładów użycia tej funkcji:
Sub Informator()
InputBox prompt:="Wpisz swoje miejsce urodzenia:" & Chr(13)
& " (np. Katowice, Lublin, itd.) " End Sub
1
Powyższa
procedura wyświetla okno dialogowe z dwoma przyciskami. Ko: kat
ten jest podany w dwóch wierszach, (zob. rysunek 1.27).
Microsoft Access
Wpisz swoje miejsce urodzenia: (np, Katowicej Lublin, itd,)
OK
Cancel
f
Rysunek 1.27. Okno dialogowe przygotowane przez procedurę Informator
Podobnie jak w przypadku funkcji MsgBox, jeżeli zamierzasz użyć danych wJ nych przez użytkownika w oknie dialogowym input, powinieneś zachować w
Przekazywanie argumentów do procedur oraz funkcji
103
f unkcji inputBox w zmiennej. Procedura informator2, podana poniżej, przypisuje rezultat funkcji inputBox zmiennej o nazwie miasto:
Sub Informator2 ()
Dim polecenie As String
Dim miasto As String
Const tytuł = "Wpisz Dane"
polecenie = "Wpisz swoje miejsce urodzenia:" & Chr(13) _
& "(np. Katowice, Lublin, itd.)" miasto = InputBox(polecenie, tytuł) MsgBox "Wpisano: " & miasto
End Sub
Zwróć uwagę, że tym razem argumenty funkcji inputBox znajdują się w nawiasie. Nawiasy są konieczne, jeżeli zamierzasz wykorzystać rezultat funkcji. Funkcja MsgBox łączy komunikat „Wpisano:" z wartością zwróconą przez funkcję inputBox. Wartość ta została zapisana w zmiennej miasto. Drugi argument funkcji inputBox jest określony za pomocą stałej o nazwie tytuł. Stała ta zawiera łańcuch znaków, który ma być wyświetlony w tytule okna dialogowego. Zamiast stałej możesz zastosować zmienną.
Okno dialogowe, będące rezultatem funkcji inputBox, zawsze pojawia się na ekranie w tym samym miejscu. Aby zmienić jego położenie na ekranie, należy podać wartości argumentów xpos oraz ypos (zob. wcześniej w tym podrozdziale).
Aby wyświetlić okno dialogowe w górnym lewym rogu ekranu, zmodyfikuj procedurę mformator2 według wzoru poniżej:
miasto = InputBox(polecenie, tytuł,
1, 200)
Z wróć uwagę na nowe argumenty ujęte w nawias. Po argumencie tytuł znajduje się dodatkowy przecinek, który rezerwuje miejsce pominiętego argumentu default. Następne dwa argumenty określają nową pozycję okna dialogowego. Jeśli opuścisz przecinek znajdujący się przed liczbą 1, to Visual Basic uzna tę liczbę jako wartość argumentu default, a nie za wartość poziomej pozycji okna dialogowego. Jeśli wpiszesz wartości argumentów, poprzedzając je nazwami (np.: prompt :=poiecenie, ti-tie:=tytuł, xpos: =1, ypos:=200), to nie będziesz musiał pamiętać o dodatkowych przecinkach rezerwujących miejsce na pominięte argumenty opcjonalne.
Zastanówmy się teraz, co się stanie, jeżeli zamiast nazwy miasta wpiszesz dowolną liczbę. Ponieważ użytkownicy często wpisują niepoprawne dane w oknie dialo-
104
Programowanie w Access!
gowym input, procedura musi sprawdzić, czy podane dane mogą być użyte.! funkcja inputBox nie posiada wbudowanego mechanizmu sprawdzającego pod ność wpisanych danych. Aby zweryfikować podane dane, należy skorzystać z ii instrukcji VBA. Są one omówione dalej w tym rozdziale.
Zamiana typu danych uzyskanych w wyniku funkcji InputJ
Rezultatem funkcji inputBox jest zawsze łańcuch znaków. Jeżeli użytkoi wpisze liczbę, zanim procedura będzie mogła jej użyć w działaniu matematyczi wpisany łańcuch znaków musi zostać zamieniony na wartość numeryczną. Visual sic potrafi automatycznie zmienić typ danych na inny.
1. Wpisz w oknie Kod programu procedurę o nazwie sumaLiczb podaną pon
Sub SumaLiczb()
Dim polecenie As String Dim wartl As String Const tytuł = "Wpisz Dane" Dim suma As Single
polecenie = "Wpisz dowolną liczbę:"
wartl = InputBox(polecenie, tytuł, 0) suma = wartl + 2
MsgBox suma & " (" & wartl & " +2)" End Sub
Powyższa procedura wyświetla okno dialogowe pokazane na rysunku Zwróć uwagę, że tytuł okna dialogowego został zmieniony z wyjściowego „Micro Access" na napis przypisany stałej o nazwie tytuł. Zero w polu tekstowym sug typ danych oczekiwanych od użytkownika. Jak użytkownik wpisze dane i klikniej to zostaną one zapisane w zmiennej o nazwie wartl:
wartl = InputBox(polecenie, tytuł, 0)
A ccess 2000
iżyte. Sama go popraw-ać z innych
putBox
użytkownik natycznym, Visual Ba-
\ poniżej:
105
Przekazywanie argumentów do procedur oraz funkcji
Wpisz Dane |
> |
i |
|
|
|
Wpisz dowolna liczbę: |
OK |
|
|
: Cancel |
|
|
|
|
|
|
|
Rysunek 1.28. Możesz zasugerować, aby użytkownik wpisał dane określonego typu, wyświetlając w polu tekstowym wartość domyślną
Zdefiniuj stałą
Aby wszystkie paski tytułu w oknach dialogowych, wywoływanych przez daną procedurę VBA, wyświetlały ten sam napis, zachowaj tytuł w stałej. Jeżeli skorzystasz z tej wskazówki, będziesz musiał tylko raz napisać tytuł okna dialogowego w kodzie procedury.
Zmienna warti posiada typ danych string. Możesz łatwo sprawdzić typ danych przechowywanych w zmiennej w następujący sposób:
MsgBox varType (wartl)
Kiedy Visual Basic napotka powyższą instrukcję, wyświetli okno komunikatu z liczbą 8. Liczba ta reprezentuje dane tekstowe.
Następny wiersz procedury:
J
inku 1.28. „Microsoft n sugeruje liknie OK,
suma = wartl + 2
dodaje dwa (2) do liczby wpisanej przez użytkownika i przypisuje rezultat obliczenia zmiennej o nazwie suma. Ponieważ typem danych zmiennej wartl jest łańcuch znaków (String), przed użyciem danych przechowywanych przez tą zmienną Visual Basic zmienia typ danych. Niekompatybilne typy danych (tekst + liczba) spowodowałyby błąd: „Niezgodność typów" (Type Mismatch).
Jak uniknąć błędu „Niezgodność typów"
Jeżeli spróbujesz odtworzyć procedurę sumaLiczb w poprzednich wersjach Microsoft Accessa (wersje sprzed 2000 r.), otrzymasz błąd „Niezgodność typów", gdy Visual Basic będzie próbował wykonać następującą instrukcję:
suma - wartl + 2
I
Programowanie w Accessrzekazyv
Aby
uniknąć
tego błędu, skorzystaj z wbudowanej funkcji csng. Umożliwił
Proc
konwersję
łańcucha znaków przechowywanego w zmiennej warti na liczbę
typuia dopro
gie: tępne
w;
imię. Z
suma = CSng(wartl) +2
»okazują( kupić uv
Użycie procedur głównych oraz procedur podrzędnych Dod
Dim Dim Dim
Call imię nazw Call
Im dłuższa procedura, tym trudniej ją zrozumieć i zmodyfikować. Aby taki'' gram można było szybciej zrozumieć i zmienić, należy przebudować jego strut W tym przypadku trzeba wyodrębnić w nim kilka problemów do pojedyńczego?ub Głów wiązywania, następnie zaś utworzyć procedurę główną, która będzie zawierać pt dury podrzędne. Ponieważ zarówno procedury główne, jak i podrzędne są proca mi zwykłymi, deklaruje się je za pomocą słowa kluczowego sub. Procedura gli może wywoływać procedury podrzędne i przekazywać im odpowiednie argunJ Może ona również uruchamiać funkcje.
Proa powiędnie laracji zim
Osobiste
o nazwie j nymi słów wywoływ* procedur t tów należ}
3. Wpis:
Sub Pobie imięN End Sub
Następujący przykład przedstawia procedurę Daneosobiste. Procedura taj użytkownika o podanie imienia i nazwiska, następnie zaś dzieli podany łańcuch! ków na imię i nazwisko. Ostatnie polecenie wyświetla nazwisko użytkownika, pn nek oraz jego imię. W kolejnych zagadnieniach tego rozdziału procedurę tę poii my na kilka zadań, aby zademonstrować użycie procedur złożonych, procedur « nych oraz podrzędnych:
Sub DaneOsobisteO
Dim imięNazwisko As String Dim imię As String Dim nazwisko As String Dim spacja As Integer
'pobierz dane od użytkownika
imięNazwisko = InputBox("Wpisz swoje imię i ne.zwisko:") 'zapisz imię i nazwisko w zmiennych spacja = InStr(imięNazwisko, " ") imię = Left(imięNazwisko, spacja - 1)
nazwisko = Right(imięNazwisko, Len(imięNazwisko) - spacja) 'pokaż rezultat w stylu nazwisko, imię MsgBox nazwisko S ", " & imię End Sub
access 2000 I Przekazywanie argumentów do procedur oraz funkcji
107
ż liwia ona
typu Sin-
iy taki pro-> strukturę. iczego roz-erać proce-procedura-ura główna argumenty.
ira ta prosi ińcuch zna-ika, przeci-tę podzieli-;edur głów-
Procedurę DaneOsobiste można podzielić na mniejsze zadania. Pierwsze z nich ma doprowadzić do uzyskania imienia i nazwiska osoby w jednym ciągu znaków. Następne wymaga podziału uzyskanego łańcucha znaków na dwa odrębne - nazwisko i imię. Zadania te można powierzyć oddzielnym funkcjom (na przykład funkcji znajdźNazwisko i Znajdź imię). Ostatnie zadanie polega na wyświetleniu komunikatu
kazującego wynik operacji. Teraz, gdy wiesz już na jakich zadaniach powinieneś
upić uwagę, spróbujemy wykonać każde z nich.
1. Dodaj nowy moduł do aplikacji i zachowaj go pod nazwą procedury_Master.
2, Wpisz procedurę GłówneDaneOsobiste W module Procedury_Master.
Sub GłówneDaneOsobiste () Dim imię As String Dim nazwisko As String Dim imięNazwisko As String
Call PobierzDaneOsobiste(imięNazwisko) imię = Znajdźlmię(imięNazwisko) nazwisko = ZnajdźNazwisko(imięNazwisko) Cali PokażNazwiskoImię(nazwisko, imię) End Sub
Procedura główna podana powyżej kontroluje tok programu, wywołując odpowiednie procedury podrzędne i funkcje. Procedura główna rozpoczyna się od deklaracji zmiennych. Pierwsze polecenie przywołuje procedurę o nazwie PobierzDane-sobiste (zob. punkt 3 poniżej) i przekazuje do niej argument w postaci zmiennej nazwie imięNazwisko. Zmienna ta posiada w tej chwili pusty łańcuch znaków (innymi słowy, nie posiada ona żadnej wartości). Zwróć uwagę, że nazwę procedury orywanej poprzedza słowo kluczowe cali. Słowo to wymagane jest przy wołaniu irocedur tylko wówczas, gdy trzeba im przekazać jakieś argumenty. Listę argumentów należy podać w nawiasie.
• ■
3. Wpisz następującą procedurę o nazwie PobierzDaneOsobiste:
Sub PobierzDaneOsobiste (imięNazwisko As String)
imięNazwisko = InputBox("Wpisz imię i nazwisko:") End Sub
108
Programowanie w Access!
Procedura PobierzDaneOsobiste demonstruje dwie ważne idee programs w języku Visual Basic - jak przekazywać argumenty do procedury i w jaki i przekazywać wartości z powrotem z procedury podrzędnej do procedury, ktj wywołała.
W procedurze głównej (zob. punkt 2), wywcłałeś procedurę PobierzDaneM biste i przekazałeś jej jeden argument - zmienną imięNazwisko. Zawa zmiennej została przekazana parametrowi imięNa2wisko w deklaracji procedur! bierzDane. Ponieważ w tym czasie, gdy Visual Basic wywołał procedurę PobieJ neOsobiste, zawartość zmiennej imięNazwisko była pusta, parametr imięNazij
otrzymał pusty łańcuch znaków („"). Gdy Visual Basic wyświetli okno dialoj i otrzyma dane od użytkownika, zostaną one zachowane w parametrze imięNazw: Wartość przypisana parametrowi przekazana zostanie z powrotem odpowiadają! mu argumentowi. W ten sposób, gdy Visual Basic wróci do procedury glóJ zmienna imięNazwisko będzie zawierać łańcuch znaków z imieniem i nazwisf użytkownika.
Argumenty przekazywane do procedury są przyjmowane przez parametry.; uwagę, że po nazwie parametru (imięNazwisko) znajduje się deklaracja jego i string). Chociaż typ danych parametru musi się zgadzać z typem danych! powiadającego mu argumentu, można użyć innych słów na określenie nfl parametru i odpowiadającego mu argumentu.
Różnice między argumentami i parametrami
Argument jest zmienną, stałą lub wyrażeniem przekazywanym do procedury, sp
Parametr jest zmienną, która otrzymuje wartość; przekazaną do danej procedur ^
4. Wpisz procedurę funkcji znajdźimię podaną poniżej:
6.
Function Znajdźimię(imięNazwisko As String) Dim spacja As Integer spacja = InStr(imięNazwisko, " ") Znajdźimię = Left(imięNazwisko, spacja - 1)
End Function
Su
En
Drugie polecenie w procedurze głównej (zob. punkt 2) - imię =
Imię (imięNazwisko) - przekazuje zawartość zmiennej imięNazwisko do ^
o nazwie znajdźimię. Aby wyodrębnić imię z prze mazanego do tej funkcji łańcul znaków, należy najpierw odnaleźć położenie spacji, która oddziela imię od nazwiH Stąd też funkcja rozpoczyna się od deklaracji zmiennej lokalnej o nazwie spaM Potem instrukcja korzysta z wbudowanej funkcji VBA o nazwie instr, która zwfl pozycję znaku spacji („ ") w łańcuchu znaków imięNazwisko. Otrzymana liczbal następnie zachowana w zmiennej spacja. W końcu inna wbudowana fi
1
A ccess 2000
ramowania aki sposób i, która ją
zDaneOso-j
vartosc tej ;edury po-obierzDa-
ęNazwisko dialogowe
-Nazwisko.
adającemu y głównej, azwiskiem
itry. Zwróć ;o typu (as anych od-lie nazwy
edury. •ocedury.
= Znajdź-
io funkcji i łańcucha nazwiska.
e spacja.
ira zwraca liczba jest a funkcja
109
Przekazywanie argumentów do procedur oraz funkcji
o nazwie Left wyodrębnia określoną liczbę znaków (spacja - ł), rozpoczynając zlewej strony łańcucha znaków imięNazwisko. Długość łańcucha znaków, przechowującego imię, jest o jeden znak krótsza od wartości przechowywanej w zmiennej spacja. Rezultat funkcji (imię użytkownika) jest następnie przypisany do nazwy funkcji. Kiedy Visual Basic wraca do procedury głównej, rezultat funkcji Znajdźimię zostanie zachowany w zmiennej imię.
5 . Wpisz podaną poniżej procedurę funkcji o nazwie znajdźNazwisko:
Function ZnajdźNazwisko(imięNazwisko As String)
Dim spacja As Integer
spacja = InStr(imięNazwisko, " ")
ZnajdźNazwisko = Right(imięNazwisko, Len(imięNazwisko) - spacja) End Function
Trzecia instrukcja w procedurze głównej (zob. punkt 2) - nazwisko = ZnajdźNazwisko (imięNazwisko) - przekazuje wartość zmiennej imięNazwisko do funkcji znajdźNazwisko. Celem tej funkcji jest wyodrębnienie nazwiska użytkownika z przekazanego łańcucha znaków przechowywanego w zmiennej imięNazwisko. Funkcja znajdźNazwisko korzysta z wbudowanej funkcji o nazwie Len w celu obliczenia liczby znaków w łańcuchu znaków o nazwie imięNazwisko. Inna wbudowana funkcja o nazwie Right wyodrębnia określoną liczbę znaków (Len (imięNazwisko) -spacja), rozpoczynając z prawej strony łańcucha znaków imięNazwisko. Otrzymany łańcuch znaków jest potem przypisany do nazwy funkcji i po powrocie do procedury głównej zachowany w zmiennej o nazwie nazwisko.
6. Wpisz podaną poniżej procedurę o nazwie PokażNazwiskoimię:
Sub PokażNazwiskoimię(nazwisko As String, imię As String)
MsgBox nazwisko & ", " & imię End Sub
Czwarta instrukcja w procedurze głównej (zob. punkt 2) - Cali PokażNazwiskoimię (nazwisko, imię) - woła procedurę o nazwie PokażNazwiskoimię i przekazuje jej dwa argumenty - nazwisko i imię. W celu przyjęcia tych argumentów procedura PokażNazwiskoimię zadeklarowana została z dwoma parametrami - nazwisko i imię. Pamiętamy, że inne słowa mogą być użyte jako nazwy argumentów i odpowiadające im parametry. Procedura PokażNazwiskoimię wyświetla następnie komunikat pokazujący nazwisko i imię użytkownika sformatowane w stylu Nazwisko, Imię.
Zalety stosowania procedur podrzędnych
• Łatwiej jest zmodyfikować kilka mniejszych procedur niż jedną długą.
110
Programowanie w Access
Z
adanie
wykonywane przez procedurę może być wykorzystane przez k
cedury.
Każdą
procedurę można przetestować indywidualnie przed jej
uźj
w
procedurze głównej.
Kilka
osób może pracować nad poszczególnymi procedurami, które
składa
na
procedurę główną.
Podsumowanie
W poprzednich podrozdziałach opisaliśmy, na czym polega różnica międzj cedurami, które wykonują zadania, i procedurami typu funkcji, które zwracają tośći. Dowiedziałeś się, wjaki sposób przywołuje się funkcję z okna Instrukcji pośrednie lub z procedury zwykłej. Nauczyłeś się też przekazywać argument funkcji oraz sprawdzać typ danych. Poznałeś także trzy nowe słowa kluczowe w Byval, ByRef oraz Optional. Dowiedziałeś się również, wjaki sposób wykorz parametry do przekazywania wartości z powrotem do procedury wołającej. Pd nowaniu tej partii materiału powinieneś umieć tworzyć własne funkcje wykon określone zadania. Powinieneś też z łatwością wyświetlać dane i pobierać infort od użytkownika za pomocą wbudowanych funkcji VBA - MsgBox oraz inputBox
P odejmowanie decyzji w VBA
Podejmowanie decyzji w procedurze VBA polega na użyciu wyrażeń warunkowych wewnątrz specjalnych struktur kontrolnych tego języka. Wyrażenie warunkowe jest wyrażeniem, w którym znajduje się operator porównania (zob. tabela 1.6), operator logiczny (zob. tabela 1.7) lub ich kombinacja. Kiedy Visual Basic napotka wyrażenie warunkowe, sprawdza, czy jest ono prawdziwe czy fałszywe.
Tabela 1.6. Operatory porównania w VBA
Operator |
Znaczenie |
= |
Równe |
o |
Nierówne |
> |
Większe |
< |
Mniejsze |
>— |
Większe lub równe |
<= |
Mniejsze lub równe |
Is |
Identyczne (tylko dla obiektów) |
Like |
Równe (zgodne ze wzorcem) |
Tabela 1.7. Operatory logiczne w VB A
Operator |
Description |
AND |
Wszystkie warunki muszą być spełnione, zanim dana czynność będzie mogła być wykonana |
OR |
Przynajmniej jeden z podanych warunków musi być spełniony, aby czynność mogła być wykonana |
NOT |
Użyty w celu negacji warunku. Jeżeli warunek jest prawdziwy, not spowoduje, że stanie się on fałszywy. Jeżeli warunek jest fałszywy, not spowoduje, że stanie się on prawdziwy |
112
Programowanie w Access!
Wyrażenia boolowskie
Wyrażenia warunkowe są często określane mianem boolowskich, od nazJ angielskiego matematyka z XIX w. George'a Boob'a. Wyrażenia boolowskie 1 przyjmować wartość prawda (True) lub fałsz (False) Na przykład:
Jeden
metr jest równy
10 cali. Fałsz (False)
Dwa
jest mniejsze niż trzy. Prawda
(Tnie)
Struktura If...Then
Najprostszą strukturą w podejmowaniu decyzji w Visual Basicu jest struli if. . .Then. Załóżmy, że chcesz wykonać zadanie oparte na jakimś warunku. Mol skorzystać z następującej stuktury:
If warunek Then instrukcja
Na przykład procedura, której treścią jest zgaduj-zgadula, może poprosić J kownika o podanie liczby tygodni w roku. Jeżeli użytkownik wpisze liczbę nieról 52, procedura powinna wyświetlić komunikat „Spróbuj jeszcze raz."
Sub ProsteifThen()
Dim tyg As String
tyg = InputBox("Ile tygodni jest w roku:", "Zgaduj Zgadula"
If tyg o 52 Then MsgBox "Spróbuj jeszcze raz."
End Sub
W nowym module wpisz podaną powyżej procedurę ProsteifThen.
Zachowaj moduł pod nazwą PodejmowanieDecyz j i.
Procedura ProsteifThen przechowuje odpowiedź użytkownika w zmiennej Wartość zmiennej jest następnie porównana z liczbą 52. Jeżeli rezultat porówm jest fałszywy (tj. wartość zmiennej tyg nie jest równa 52), Visual Basic wyśw komunikat „Spróbuj jeszcze raz."
Uruchom procedurę ProsteifThen i wpisz liczbę inną niż 52.
Ponownie
uruchom procedurę
ProsteifThen, wpisując teraz prawidłową oj
wiedź
52.
Podejmowanie decyzji w VBA
113
Po wpisaniu prawidłowej odpowiedzi Visual Basic nic nie robi. Procedura kończy się bez podania wyniku. Przydałoby się jednak poinformować użytkownika, że
zgadł.
5. Wpisz następującą instrukcję w oddzielnym wierszu przed słowami kluczowymi
End Sub:
If tyg = 52 Then MsgBox "Gratulacje! "
6. Ponownie uruchom procedurę ProsteifThen i wpisz liczbę 52.
Po wpisaniu prawidłowej odpowiedzi Visual Basic nie wykonuje instrukcji MsgBox „Spróbuj jeszcze raz". Polecenie po prawej stronie słowa kluczowego Then zostanie zignorowane, jeżeli postawiony warunek nie jest prawdziwy.
Użytkownik, który nie zgadł za pierwszym razem, chciałby spróbować jeszcze raz. Zastanówmy się, jak za pomocą programu dać mu drugą, trzecią... i n-tą szansę w zgaduj-zgaduli. W programowaniu służą do tego tzw. pętle (zob. dalej w tym rozdziale). Aby nie wybiegać naprzód, możesz zaradzić temu ograniczeniu, czerpiąc ze swojej dotychczasowej wiedzy. Jak wiesz, dana procedura może wywołać inną procedurę. Przekonajmy się teraz, czy może ona również wywołać samą siebie.
7. Zmodyfikuj
pierwszą
instrukcję if
w
procedurze ProsteifThen według wzoru
podanego
poniżej:
If tyg <> 52 Then MsgBox "Spróbuj jeszcze raz" : ProsteifThen
Na końcu tego wiersza został dopisany dwukropek i nazwa procedury. Jeśli użytkownik wpisze niepoprawną odpowiedź, to po wyświetleniu komunikatu ukaże się ponownie okno dialogowe wywołane za pomocą funkcji inputBox. Użytkownik nie będzie mógł wyjść z tej procedury, dopóki nie wpisze prawidłowej odpowiedzi. Jeśli kliknie przycisk Anuluj, to na ekranie pojawi się dość nieprzyjazny komunikat obłędzie „Niezgodność typów". W tej chwili procedura „nie wie", co robić w takim przypadku. Na razie zmodyfikuj procedurę ProsteifThen w następujący sposób:
Sub ProsteIfThen2 () Dim tyg As String On Error GoTo koniec tyg = InputBox(prompt:="Ile tygodni jest w roku?: ",
Title:="Zagadka")
If tyg <> 52 Then MsgBox "Spróbuj jeszcze raz.": ProsteIfThen2 If tyg = 52 Then MsgBox "Gratulacje!"
114
k oniec: End Sub
Programowanie w AccessPodej:
Kiedy Visual Basic napotka błąd, przejdzie do etykietki o nazwie umieszczonej na końcu procedury. Polecenia umieszczone pomiędzy polecenieitwaru: Error GoTo koniec oraz etykietką koniec zostaną zignorowane. W ostatnim ] dziale tego rozdziału poznasz szczegółowo sposoby zastawiania pułapki na | w procedurach VBA.
jedne 8. Otwórz procedurę Prosteif Then2, kilka razy wpisując różne liczby.
Pułapka błędu, którą dodałeś do procedury, pozwala na jej zakończenie bez| skania komunikatu o błędzie, gdy użytkownik ma już dość zgadywania.
Czasem będziesz chciał wykonać nie jedną, lecz kilka czynności, kiedy w; jest spełniony. Chociaż można dodać dodatkowe instrukcje w tym samym oddzielając je dwukropkami, procedura stanie się bardziej przejrzysta, jeżeli stasz z blokowej wersji instrukcji if.. .Then, tak jak w przykładzie poniżej:
If warunek Then
instrukcjal instrukcja2 instrukcjaN
End If
Na przykład możesz zmodyfikować procedurę ProsteifThen, dodając dodatkowe instrukcje:
ProsteIfThen3()
Dim tyg As String
Dim rezultat As String
tyg = InputBox("Ile tygodni jest w roku:', "Zgaduj Zgadula"
If tyg <> 52 Then
MsgBox "Prawidłowa odpowiedź wynosi !>2." rezultat = MsgBox("Czy chcesz spróbować jeszcze raz?", vbYesNo + vblnformation + vbDefaultButtonl, _ "Kontynuuj ?") If rezultat = vbYes Then
Call ProsteIfThen2 End If End If End Sub
Dec
sprai przy toró-\ jest i
if *
P odejmowanie decyzji w VBA 115
W powyższym przykładzie polecenia między słowami kluczowymi Then oraz End if nie zostaną wykonane, jeżeli wartość zmiennej tyg jest równa 52. Zwróć uwagę na to, że blokowa instrukcja if ...Then musi się kończyć słowami kluczowymi End if. W jaki sposób Visual Basic podejmuje decyzję - krótko mówiąc, sprawdza warunek wpisany między słowami if... Then.
Dwie postacie zapisu instrukcji warunkowej If.. .Then
Instrukcję warunkową if ...Then można zapisać w dwojaki sposób - w postaci jedno- lub wielowierszowej. Krótki format tej instrukcji zapisywany jest w jednym wierszu:
If hasło <> 01W01
MsgBox
ęp zabroniony.
lub
If
hasło = 01W01 Then
ilpha=True : beta = False
W powyższych przykładach hasła alpha, beta są nazwami zmiennych. W pierwszym przykładzie Visual Basic wyświetli komunikat „Dostęp zabroniony.", jeżeli wartość zmiennej hasło nie równa się 01W01. W drugim przypisze wartość True zmiennej alpha i wartość False zmiennej beta, jeżeli wartość zmiennej hasło wyniesie 01W01. Zwróć uwagę, że w tym przykładzie druga instrukcja jest oddzielona od pierwszej dwukropkiem.
Wielowierszowa struktura i f ...Then staje się bardziej przejrzysta, kiedy kilka instrukcji trzeba wykonać wówczas, gdy warunek jest prawdziwy, lub gdy instrukcja, która ma być wykonana, jest dosyć długa.
Decyzje oparte na więcej niż jednym warunku
Procedura ProsteifTnen, z którą pracowałeś wcześniej w tym rozdziale, sprawdzała tylko jeden warunek w instrukcji if.. .Then. Instrukcja ta jednak może przyjąć więcej niż jeden warunek. Aby podać kilka warunków, należy użyć operatorów logicznych and lub or (zob. tabela 1.6). Zapis syntaktyczny z operatorem and jest następujący:
If warunekl AND warunek2 Then instrukcja
I
116
Programowanie w Access!
W powyższym zapisie zarówno waruneki, jak i warunek2 muszą być prawdj (True), aby Visual Basic mógł wykonać instrukcje po prawej stronie słowa ij
OWegO Then.
Na przykład:
If utarg = 10000 AND pensja < 4500 Then premia = utarg * 0.07
W tym przykładzie:
Waruneki Warunek2
utarg = 10000 pensja < 4500
Jeżeli operator and jest użyty w wyrażeniu warunkowym, to oba warunki i być spełnione, zanim Visual Basic będzie mógł obliczyć premię. Jeżeli którykohj z podanych warunków będzie fałszywy lub oba będą fałszywe, Visual Basic zignoj instrukcję po słowie Then.
Kiedy wystarczy, aby tylko jeden warunek był spełniony, należy skore z operatora or:
If waruneki OR warunek2 Then instrukcja
Jeżeli skorzystasz z operatora logicznego or, to tylko jeden warunek będzie J siał być spełniony, aby Visual Basic mógł wykonać instrukcję znajdującą siej słowie kluczowym Then. Przeanalizujemy następujący przykład:
If dept = "S" OR dept = "M" Then nagroda = 500
W powyższym przykładzie, jeżeli przynajmniej jeden warunek jest prawdzi Visual Basic zachowa w zmiennej nagroda wartość 500. Jeżeli oba warunki fałszywe, Visual Basic zignoruje pozostałą część wiersza tej instrukcji.
Teraz czas na pełny przykład w postaci procedury. Załóżmy, że możesz doi zniżkę 10%, gdy kupisz przynajmniej 50 sztuk danego towaru po cenie 120 złotyclj sztuki. Procedura strukifAnd ilustruje użycie struktury if. . .Then z operatorem| gicznym and.
1. Wpisz następującą procedurę w module PodejmowanieDecyzji:
Sub StrukifAnd()
Podejmowanie decyzji w VBA
117
D im cena As Single
Dim sztuki As Integer
Dim rabat As Single
Const korni = "Aby uzyskać rabat, musisz kupić jeszcze
Const kom2 = "Cena musi wynosić 120 zł."
sztuki =50
cena =120
If cena = 120 And sztuki >= 50 Then
rabat = (cena * sztuki) * 0.1
MsgBox "Rabat wynosi: " & rabat & " zł."
End If
If cena = 120 And sztuki < 50 Then
MsgBox korni & 50 - sztuki & " sztuk(i)."
End If
If cena <> 120 And sztuki >= 50 Then MsgBox kom2
End If
If cena <> 120 And sztuki < 50 Then
MsgBox "Oba warunki nie zostały spełnione."
End If End Sub
Powyższa procedura strukif And zawiera cztery instrukcje warunkowe if ...Then, które służą do sprawdzenia zawartości dwóch zmiennych - cena i sztuki. Operator 1 pomiędzy słowami kluczowymi if...Then pozwala na sprawdzenie kriku warunków. Wszystkie muszą być spełnione, aby Visual Basic mógł wykonać instrukcje pomiędzy słowami Then.. .End if.
Formatowanie instrukcji blokowych If
Aby bloki instrukcji if były bardziej czytelne, stosuj wcięcia. Porównaj następujące instrukcje blokowe:
If warunek Then |
If warunek Then |
zadaniel |
zadaniel |
End If |
End If |
Programowanie w Access
ccessfl
nożnal
118
Przyglądając się instrukcji blokowej if.. .Then po prawej stronie, możni łatwo zorientować, w którym miejscu blok if się zaczyna i gdzie się kończy.
S truktura If...Then...Else
E
neU
MM
Potrafisz
już
wyświetlać odpowiedni komunikat, jeżeli jeden lub \\M
warunków
jest prawdziwy lub fałszywy. Teraz zastanówmy się, co zrobić wt™
kiedy
procedura musi wykonać jedną instrukcję lub blok instrukcji, gdy
warunek; prawdziwy,
i jedną instrukcję lub blok instrukcji, gdy warunek jest fałszywy.
Di do
prostej struktury if...Then klauzulę Else,
można
skierować proceduręB właściwej
instrukcji lub bloku instrukcji w zależności od rezultatu testu.
PodobnieB struktura
if..
.Then,
struktura
if..
.Then..
.Else występuje
w postaci wierszoB i
blokowej. Poniżej jest przedstawiona postać jednowierszowa:
If warunek Then poleceniel Else polecenie2
fa
je
Instrukcja znajdująca się po słowie kluczowyn Then zostanie wykonana, ^ warunek będzie prawdziwy, natomiast instrukcja po klauzuli Else zostanie wykon* jeśli warunek okaże się fałszywy.
1.
Na przykład:
If utarg > 5000 Then premia = utarg * 0.05 Else MsgBox "Nie ma premii."
Jeżeli wartość zmiennej utarg jest większa aniżeli 5000, Visual Basic ob premię, korzystając z następującego wzoru: utarg * 0.05. Gdy natomiast utarg nie jest większa od 5000, Visual Basic wyświetli komunikat: „Nie ma pren
Instrukcji if...Then...Else należy użyć, gdy trzeba zdecydować, które zdw zadań należy wykonać.
Jeżeli trzeba wykonać więcej instrukcji, gdy warunek jest prawdziwy lub i wy, lepiej jest skorzystać z wielowierszowej formy zapisu struktury if...Then...Els
If warunek Then
instrukcje do wykonania gdy Prawda Else
instrukcje do wykonania gdy Fałsz End If
P odejmowanie decyzji w VBA
w przykładzie poniżej.
d If W nrzykładzie powyżej, jeżeli warunek (Me. Dirty) jest prawdziwy, Visual Basic
one jeszcze na inny przykład podany poniżej:
L Wpisz W module PodejmowanieDecyzj i procedurę TypDnia:
Sub TypDnia O
Dim wpis As String Dim polecenie As String Dim strmsgl As String Dim strmsg2 As String nim mojaData As Date
lecenie = "Wpisz dowoln, dat, w formacie mm/dd/yyyy: _
Ł Chr(13) & " (np. 08/22/1999)" strmsgl = "Dzień powszedni" strmsg2 = "Weekend"
If Me.Dirty Then
Me ibtnundo. Enabled = True
Else
Me!btnUndo. Enabled = False
End If
„pis = InputBox(polecenie) mojaData = Weekday(CDate(wpis))
If mojaData >= 2 And mojaData <= 6 Then MsgBox strmsgl
Else
MsgBox
strmsg2
End If
End Sub
120
Programowanie
B
Powyższa procedura prosi użytkownika o wpisar ie dowolnej daty w podfl formacie. Podany łańcuch znaków zostanie następnie zmieniony w datę za pj[' wbudowanej funkcji CDate. Inna funkcja - weekday - przekształca podaąB w liczbę całkowitą, która oznacza dzień tygodnia (zob. tabela 1.8). Kod dniatygB zostaje przypisany zmiennej o nazwie mojaData. Następnie instrukcja warunB sprawdza, czy wartość zmiennej mojaData jest większa lub równa 2 (>=2) i mnie niż lub równa 6 (<=6). Jeżeli postawiony warunek będzie prawdziwy, użytkoS otrzyma komunikat informujący, że podana data jest dniem powszednim. W pn wnym wypadku program zakomunikuje, że data przypada w weekend.
Tabela 1.8. Wartości zwracane przez funkcję Weekday
End
2.
Stała |
Wartość |
Znaczenie |
vbSunday |
1 |
Niedziela |
vbMonday |
2 |
Poniedziałek |
vbTuesday |
3 |
Wtorek |
vbWednesday |
4 |
Środa |
vbThursday |
5 |
Cztwartek |
vbFriday |
6 |
Piątek |
vbSaturday |
7 |
Sobota |
Uruchom procedurę TypDnia kilkakrotnie, za każdym razem podając inną Sprawdź, czy odpowiedź Visual Basica zgadza się z kalendarzem.
zne
Els
wyl
if
MS< El Ms El Ms Er
Struktura If.. .Then.. .Elself
P1
Często będziesz musiał sprawdzić rezultat kilku postawionych warunków, połączyć ze sobą zestaw instrukcji warunkowych if, można użyć klauzuli Else] Korzystając ze struktury warunkowej if...Theni.Els'ei£, można podać wij warunków do sprawdzenia, niż jest to możliwe przy użyciu struktury warunl if...Then...Eise, omówionej w poprzednim podrozdziale. Zapis struł if ...Then...Elseif jest następujący:
Access 2000
n podanym za pomocą odaną datę ia tygodnia warunkowa ) i mniejsza użytkownik . W przeci-
inną datę.
runków. Aby
EUli Elself .
odać więcej
warunkowej
5 struktury
If warunekl Then
instrukcje, gdy warunekl jest prawdziwy
Elself warunek2 Then
instrukcje, gdy warunek2 jest prawdziwy
Elself warunek3 Then
instrukcje, gdy warunek3 jest prawdziwy
Elself warunekN Then
instrukcje, gdy warunekN jest prawdziwy
Else
instrukcje, gdy wszystkie warunki są fałszywe
End If
Klauzula Else nie jest obowiązkowa. Można ją pominąć, jeżeli nie jest konieczne wykonywanie żadnych czynności, gdy wszystkie warunki są fałszywe.
Klauzula Elself
Procedura może zawierać dowolną liczbę poleceń Elself i warunków. Klauzula Eiseif zawsze poprzedza klauzulę Else. Polecenia wewnątrz klauzuli Eiseif zostaną wykonane, jedynie gdy warunek w tej klauzuli jest prawdziwy.
Przeanalizujmy następujący przykład:
If mójNumer = 0 Then
MsgBox "Wpisałeś zero. "
Elself mójNumer >0 Then
MsgBox "Wpisałeś liczbę dodatnią. "
Elself mójNumer <0 Then
MsgBox "Wpisałeś liczbę ujemną. "
End if
w
Przykład ten sprawdza rodzaj liczby podanej przez użytkownika i zachowanej w zmiennej mójNumer. W zależności od podanej liczby wyświetlany jest komunikat podający jako odpowiedź zero, liczbę dodatnią lub liczbę ujemną. Zwróć uwagę, że w przykładzie tym nie ma klauzuli Else. Jeżeli rezultat pierwszego warunku jest fałszywy (mójNumer <> o), Visual Basic przemieści się do następnej klauzuli Eiseif i sprawdzi jej warunek (mó jNumer>o). Jeżeli się okaże, że wartość nie jest większa od zera, Visual Basic przemieści się do następnej klauzuli Eiseif i sprawdzi warunek mójNumer<0.
iccesslH
122
Programowanie w Access
Z agnieżdżanie struktur If...Then...
Możesz podjąć bardziej złożone dezycje w swoich procedurach VBA, umiej ając jedną strukturę if...Then. . lub if...Then...Ełse wewnątrz innej struktury u lub if...Then...Else. O strukturach, w których jedna struktura if znajduje się wew innego bloku instrukcji if, mówi się, że są zagnieżdżone.
Aby zrozumieć, w jaki sposób działają struktury zagnieżdżane if...Then, | śledźmy następującą procedurę:
Private Sub SprawdźWarunki() Dim strHasło As String Dim strNazwaU As String strHasło = InputBox("Podaj hasło:") strNazwaU = InputBox("Wpisz imię:") If strHasło = "LIS" Then
MsgBox "Dostęp do raportu wzbroaiony!" Else
If strHasło = "PIES" Then If strNazwaU = "Jan" Then
MsgBox "Nie masz uprawn:.eń." Elself strNazwaU = "Marek" r.:hen
MsgBox "Skontaktuj się ;: administratorem. Elself strNazwaU = "Ania" Then
MsgBox "Idź do domu." End If Else
MsgBox "Przedstaw się."
End If
End If End Sub
Aby procedura SprawdźWarunki stała się bardziej czytelna, każda instr if. .Then.. została inaczej sformatowana. Można oc razu zauważyć, że procedu wykorzystuje trzy blokowe instrukcje if. . . Then.
Pierwszy blok if (druk pogrubiony) sprawdza, czy zndenna o nazwie struł przechowuje ciąg znaków „LIS". Jeżeli tak jest, pojawia się komunikat i Visual H pomija część Else, aż znajdzie instrukcję End if (druk pogrubiony). Instrukcji znajduje się tuż przed słowami kluczowymi End sub.
Jeżeli zmienna strHasło nie zawiera ciągu znaków „LIS", wówczas warunek jest fałszywy i Visual Basic wykonuje podkreślony blok instrukcji if, znajdujący się po słowie Else sformatowanym tłustym drukiem. O tej podkreślonej instrukcji if...Then...Else mówi się, że jest zagnieżdżona wewnątrz pierwszego bloku if (zaznaczonego tłustym drukiem).
Zagnieżdżona instrukcja sprawdza, czy zmienna strHasło przechowuje łańcuch znaków „PIES". Jeżeli wartość tej zmiennej jest inna niż „PIES", warunek będzie fałszywy, Visual Basic przejdzie wówczas do instrukcji znajdującej się po podkreślonej klauzuli Else, co spowoduje wyświetlenie komunikatu proszącego użytkownika
0 podanie
nazwy. Jednakże
jeżeli zmienna strHasło zawiera łańcuch znaków „PIES",
Visual
Basic
odtworzy podkreślony podwójną linią blok instrukcji If,
sprawdzając
każdy
warunek i podejmując odpowiednią decyzję.
Pierwszy blok if (tłusty druk) jest nazwany zewnętrzną instrukcją If. Ta zewnętrzna instrukcja zawiera dwie wewnętrzne instrukcje if (pojedynczo
1 podwójnie podkreślone).
Struktury zagnieżdżone
Zagnieżdżanie polega na umieszczeniu jednego typu struktury kontrolnej wewnątrz innej struktury kontrolnej. Więcej przykładów, w których zostały zastosowane struktury zagnieżdżone, podajemy dalej w tym rozdziale przy omawianiu pętli.
Struktura Select Case
Aby uniknąć zbyt wielu skomplikowanych i zagnieżdżonych instrukcji if, które z reguły są trudne do zrozumienia, możesz skorzystać ze struktury select case. Składnia tej struktury jest następująca:
Select Case wyrażenie Case wartość!
Instrukcje, gdy wartości równa się wyrażeniu Case wartość2
Instrukcje, gdy wartość2 równa się wyrażeniu Case wartośćN
Instrukcje, gdy wartośćN równa się wyrażeniu Case Else
Instrukcje, gdy żadna wartość nie równa jest wyrażeniu End Select
124
Programowanie w Access 2(1
Możesz umieścić dowolną liczbę przypadków do sprawdzenia pomiędzy słonj mi kluczowymi Select Case oraz End select. Klauzula case Else jest opcjonal Powinieneś z niej skorzystać, jeżeli spodziewasz się, że jakieś wyrażenie może I fałszywe. W strukturze warunkowej select case Visual Basic porównuje wartość z wartością podanego wyrażenia.
Kiedy Visual Basic napotka w procedurze klauzulę select case, zapamic wartość tego wyrażenia. Następnie sprawdza wartość pierwszego przypadku. Jeśli c powiada ona wartości wyrażenia, to zostają wykonane instrukcje w wierszach niżej i do następnego przypadku (Case). Jeśli wartość pierwszego przypadku nie odpowiai wartości wyrażenia, Visual Basic sprawdza wartości kolejnych przypadków (Case), (j czasu gdy znajdzie taką, która zgadza się z wyrażeniem. Jeżeli Visual Basic znajdzie takiej wartości, przeskakuje za wiersz End Select i wykonuje pozostałej strukcje danej procedury.
Przeanalizujmy teraz procedurę, która wykorzystuje strukturę select Case. Ji wiemy, funkcja MsgBox pozwala wyświetlić komunikat z kilkoma przyciskami, rezultat można przypisać zmiennej. Korzystając ze .struktury select case, moż zdecydować, które zadanie należy wykonać w zależności od wybranego przez użj kownika przycisku w polu komunikatu.
St£
1.
2.
*
W oknie edytora Visual Basic dodaj nowy moduł o nazwie Podejmowanie!
Decyzji2.
W utworzonym module PodejmowanieDecyzjiz wpisz następującą proceduf
SprawdźPrzyciski:
Sub SprawdzPrzyciski()
Dim pytanie As String Dim przyciski As Integer Dim tytul As String Dim wybPrzycisk As Integer
pytanie = "Czy chcesz otworzyć nowy rapor;?"
przyciski = vbYesNoCancel + vbQuestion + vbDefaultButtonl
tytul = "Nowy raport"
Se
En<
wybPrzycisk = MsgBox(prompt:=pytanie, buttons:=przyciski, _ title:=tytul)
Se:
Select Case wybPrzycisk Case 6
DoCmd.OpenReport "Klienci_Raport", acPreview
Podejmowanie decyzji w VBA
125
C ase 7
MsgBox "Dlaczego nie?" Case Else
MsgBox "Nacisnąłeś Anuluj. End Select
End Sub
Pierwsza część procedury Sprawdźprzyciski wyświetla na ekranie komunikat: „Czy chcesz otworzyć nowy raport?". Użytkownik ma do wyboru trzy przyciski: Tak (Yes), Nie (No) i Anuluj (Cancel). Odpowiedź użytkownika jest zapisana w zmiennej
wybPrzycisk.
Jeżeli użytkownik kliknie przycisk Tak, zmiennej wybPrzycisk zostanie przypisana stała vbYes lub odpowiadająca jej wartość liczbowa 6. Jeżeli użytkownik wybierze Nie, zmiennej tej zostanie przypisana stała vbNo lub odpowiadająca jej wartość liczbowa 7. W końcu kliknięcie przycisku Anuluj spowoduje, że zmienna wybPrzycisk będzie posiadać wartość vbcancel albo 2.
Struktura select case sprawdza wartości podane po klauzuli Case i porównuje je zwartością przechowywaną w zmiennej wybPrzycisk. Gdy wartości się zgadzają, odpowiednia instrukcja case zostanie wykonana. Procedura sprawdźprzyciski będzie tak samo działać, jeżeli w miejscu wartości liczbowej argumentu Buttons podstawimy nazwę stałej:
Select Case wybPrzycisk Case vbYes
DoCmd.OpenReport "Klienci_Raport", acPreview Case vbNo
MsgBox "Dlaczego nie? " Case Else
MsgBox "Nacisnąłeś Anuluj. " End Select
J
Możesz pominąć klauzulę Else, zmieniając strukturę select case następująco:
Select Case wybPrzycisk Case vbYes
DoCmd.OpenReport "Klienci_Raport", acPreview Case vbNo
MsgBox "Dlaczego nie? " Case vbCancel
126
Programowanie w Access!
MsgBox "Nacisnąłeś Anuluj. End Select
3. Uruchom procedurę SprawdźPrzyciski trzykrotnie, za każdym razem jąc inny przycisk.
Pułapkowanie błędów za pomocą Case Else
Chociaż klauzula case Else w strukturze warunkowej select case nie^H obowiązkowa, jest ona niezmiernie pożyteczna, gdy żaden z testowanych przyj] ch
ków nie zawiera wartości podanej przez użytkownika. W klauzuli case umieszcza się komunikat o błędzie.
Se
Użycie słowa kluczowego Is z klauzulą Case
Czasami decyzję należy podjąć, gdy wyrażenie jest większe niż, mniejsze niżf równe podanej wartości (zob. tabela 1.6). Słowo kluczowe is umożliwia użycie rażenia warunkowego w klauzuli case. Zapis syntaktyczny Select case ze sfoJ kluczowym is podany jest poniżej:
Select Case wyrażenie Case Is warunekl
instrukcje, gdy warunekl jest prawdziwy Case Is warunek2
instrukcje, gdy warunek2 jest prawdziwy Case Is warunekN
instrukcje, gdy warunekN jest prawdziwy End Select
Na przykład porównaj kilka liczb:
Select Case mojaLiczba Case Is < 10
MsgBox "Liczba jest mniejsza niż 10." Case 11
MsgBox "Wpisałeś jedenaście." Case Is >=100
MsgBox "Liczba jest większa lub równa 100." Case Else
MsgBox "Liczba jest w przedziale od 12 do 99. End Select
End
neS;
Z \V>
struj
pomi
w pi<
przyj
wpn
pliwc
o.i :
napot
już oc
może
jej w 1 rezulte wyświ od U2 przysh
'Access 2000 I podejmowanie decyzji w VBA
127
2 m wybiera-
ase nie jest ch przypad-Else często
:jsze niż lub użycie wyże słowem
Zakładając, że zmienna mojaLiczba posiada wartość 120, trzecia klauzula case będzie prawdziwa, wobec czego Visual Basic wykona tylko polecenie znajdujące się
między Case Is >=100 oraz klauzulą Case Else.
Określenie przedziału wartości w klauzuli Case
W poprzednim przykładzie zobaczyłeś prostą strukturę Select case, która zawiera tylko jedno wyrażenie w każdej klauzuli case. Wiele razy jednak będziesz chciał podać przedział wartości. Możesz to zrobić, korzystając ze słowa kluczowego To, które należy podać między wartościami wyrażeń, tak jak w przykładzie poniżej:
Select Case sprzedaneSztuki Case I To 100
Rabat =0.05 Case Is <= 500
Rabat = 0.1 Case 501 To 1000
Rabat =0.15 Case Is >1000
Rabat =0.2 End Select
Przeanalizuj powyższy blok select case, zakładając że zmienna sprzeda-nesztuki posiada wartość 99. Visual Basic porównuje wartość tej zmiennej z wyrażeniem warunkowym w klauzuli case. Pierwsza i trzecia klauzula case demonstruje, w jaki sposób można podać przedział wartości w wyrażeniu warunkowym za pomocą słowa kluczowego to. Ponieważ zmienna sprzedaneSztuki = 99, wyrażenie w pierwszej klauzuli Case zwróci wartość True (Prawda), wobec czego Visual Basic
pisze wartość 0.05 zmiennej Rabat. Teraz zastanówmy się, co się stanie w przypadku drugiej klauzuli case, która też jest prawdziwa. Chociaż nie ulega wątpliwości, że 99 jest mniejsze niż 500, Visual Basic nie wykona instrukcji Rabat = o.l znajdującej się w tej klauzuli. Powód jest następujący - kiedy Visual Basic napotka klauzulę, w której warunek jest równy wyrażeniu, inne klauzule case nie są już odczytywane. Visual Basic przeskakuje przez nie i wykonuje instrukcje, które być może znajdują się po słowach End Select.
Aby zdobyć więcej praktyki w stosowaniu struktury select case, teraz użyjemy jej w funkcji. Pamiętamy z poprzednich podrozdziałów, że funkcje pozwalają zwrócić rezultat określonej czynności do procedury zwykłej. Załóżmy, że procedura musi wyświetlić rabat zależnie od sprzedanych sztuk towaru. Możesz pobrać liczbę sztuk od użytkownika i wywołać funkcję, która zdecyduje, jaki w tym przypadku przysługuje rabat.
IB
jjj
128
Programowanie w
AccessB
1 . Wpisz w module następującą procedurę:
Sub PokażRabat()
Dim sprzedaneSztuki As Integer
Dim mójRabat As Single
sprzedaneSztuki = InputBox("Wpisz ilość sztuk:'
mójRabat = GetRabat(sprzedaneSztuki)
MsgBox mójRabat End Sub
2. W tym samym module wpisz następująca funkcję:
zn
W£
P(
wieli
Function
GetRabat(sprzedaneSztuki
As
Integer) Select
Case sprzedaneSztuki
Case
1
To
200
GetRabat =0.05 Case Is <= 500
GetRabat =0.1 Case 501 To 1000
cec dui zg stri
■r
sp: #
k
'«
GetRabat =0.15 Case Is > 1000
GetRabat = 0.2 End Select End Function
3. Ustaw kursor w dowolnym miejscu procedury ?okażRabat i naciśnij F5,
uruchomić.
Procedura PokażRabat przekazuje wartość przechowywaną w zmiennej daneSztuki do funkcji o nazwie GetRabat. Kiedy Visual Basic napotka struktui lect case sprawdzi, czy wartość wyrażenia w pierwszej klauzuli case zgadd z wartością parametru sprzedaneSztuki. Jeżeli wartości te się zgadzają, Visual przypisze pięcioprocentowy rabat (0.05) do nazwy funkcji i przejdzie do słów] czowych End select. Ponieważ nie ma już więcej poleceń do wykonania we tej funkcji, Visual Basic powróci do wołającej procedury - PokażRabat. Tutaj rej funkcji zostanie przypisany zmiennej o nazwie mójRabat. Ostatnia instnj wyświetla wartość rabatu w oknie komunikatu.
Kilka warunków w klauzuli Case
W pojedynczej klauzuli case można podać kilka warunków, jeżeli oddzielił od siebie przecinkami, tak jak w przykładzie poniżej:
Podejmowanie decyzji w VBA
129
S elect Case mójMiesiąc
Case "Styczeń", "Luty", "Marzec"
Debug.Print mójMiesiąc & ": 1 kwartał' Case "Kwiecień", "Maj", "Czerwiec"
Debug.Print mójMiesiąc & " 2 kwartał" Case "Lipiec", "Sierpień", "Wrzesień"
Debug.Print mójMiesiąc & ": 3 kwartał1 Case "Październik", "Listopad", "Grudzień"
Debug.Print mójMiesiąc & ": 4 kwartał1 End Select
Kilka warunków w klauzuli Case
Przecinki, które oddzielają poszczególne warunki w klauzuli case, mają to sarno znaczenie, co operator or w wyrażeniu warunkowym if. Klauzula case jest prawdziwa, jeżeli przynajmniej jeden z warunków jest prawdziwy.
Podsumowanie
Zaprezentowane struktury warunkowe umożliwiają sterowanie wykonaniem procedury w zależności od sytuacji. Decyzje włączone do procedury czynią daną procedurę bardziej elastyczną od procedury, która zawsze wykonuje wszystkie instrukcje z góry na dół, wiersz po wierszu. Jeśli zastanawiasz się teraz, które z poznanych struktur warunkowych powinieneś zastosować w programie, weź pod uwagę następujące wskazówki:
jeśli chcesz podać tylko jeden warunek, wybierz prostą strukturę i f. . . Then;
jeśli
musisz zdecydować, który z dwóch warunków trzeba wykonać,
wybierz
strukturę
if..
.Then..
.Else;
jeśli program wymaga dwóch i więcej warunków, skorzystaj ze struktury
If. . .Then. . .Elself lub ze Struktury Select Case;
• jeśli
zamierzasz włączyć wiele warunków do programu, zastosuj
strukturę Se
lect
case. Jest
ona bardziej przejrzysta niż struktura if.
. .Then.
.
.Eleseif,
zwłaszcza
gdy masz do czynienia z wartościami, które trudno jest objąć
jednym
przedziałem.
Niektóre decyzje wymagają repetycji. W kolejnym podrozdziale nauczysz się wielokrotnie wykonywać te same czynności.
J
P owtarzanie czynności w Visual Basicu
Teraz, gdy już wiemy, jak podejmować decyzje w procedurach VBA przy użyciu wyrażeń warunkowych, na pewno dojdziemy do wniosku, że w programowaniu, tak samo zresztą jak w życiu, nie wszystkie decyzje są łatwe. Często trzeba powtórzyć te same instrukcje kilka razy, zanim będzie można podjąć decyzję. W innych sytuacjach, po podjęciu decyzji trzeba wykonywać te same zadania dopóty, dopóki postawiony warunek jest prawdziwy, lub tak długo, aż będzie prawdziwy. W programowaniu wykonywanie powtarzających się czynności umożliwiają struktury określane nazwą pętli (ang. loops). VBA posiada wiele struktur, które pozwalają na wielokrotne powtarzanie bloków instrukcji. Z tego podrozdziału dowiesz się, jak pisać takie struktury i ich używać.
Pętle Typu Do - Do...While oraz Do...Until
Visual Basic dysponuje dwoma typami struktur typu do, które powtarzają sekwencję instrukcji, dopóki dany warunek jest prawdziwy lub tak długo, aż dany warunek zostanie spełniony.
Pętla Dc.while umożliwia powtarzanie czynności, dopóki dany warunek jest prawdziwy. Pętla ta ma następującą postać:
Do While warunek instrukcjal instrukcja2 instrukcjaN
Loop
Kiedy Visual Basic napotka tę pętlę, sprawdzi najpierw, czy warunek jest prawdziwy. Jeżeli warunek jest fałszywy, instrukcje wewnątrz pętli nie będą wykonane. Visual Basic przejdzie wtedy do pierwszego polecenia po słowie kluczowym Loop. Jeżeli warunek jest prawdziwy, zostaną wykonane instrukcje wewnątrz pętli, aż do słowa kluczowego Loop. Słowo to zleci kontynuowanie całego procesu wykonywania czynności, dopóki warunek zwróci wartość True (Prawda).
Programowanie
w Access." poWtf
Teraz
zobaczymy, jak można
stosować pętlę Do...whiie w aplikacji MicrosofiB Access.
Przekonamy się, w jaki sposób wyświetlać na ekranie okno
dialogów; sprav
tomentu
wpisania przez uzvtkownikn
nrwiAi,
Do
ioop
zostai
,
j^v.
jyyjoKJu
wyawiciuic
na eKranie okno dialogów
do
momentu wpisania przez użytkownika
prawidłowego hasła. Oto procedura VI
która
to robi: ™
Sub PodajHasloO
Dim hasło As String
hasło = ""
Do While hasło o "DADA"
hasło = InputBox("Wpisz hasło dostępu do raportu?") Loop
MsgBox "Wpisałeś prawidłowe hasło." End Sub
E
r.
W powyższej procedurze polecenie wewnątrz pętli do while będzie wykonji Sub ne, dopóki zawartość zmiennej hasło nie stanie się równa łańcuchowi znaków J DA". Jeżeli użytkownik poda prawidłowe hasło (DADA), Visual Basic opuści w i wykona polecenie MsgBox, znajdujące się po słowe kluczowym Loop. Aby użytkp nik mógł opuścić procedurę w przypadku, gdy nie zni prawidłowego hasła, naB dodać w pustym wierszu przed słowem kluczowym Loop następującą instrukcję: I
End S If hasło = "" Then Exit Do
Instrukcja ta zleca Visual Basicowi opuszczenie pętli do Loop, jeżeli wait S zmiennej hasło jest pustym łańcuchem znaków. Zatem, gdy pojawi się okno diaifl we proszące o wpisanie hasła, użytkownik może wybrać przycisk OK lub Anuluj,! s zatrzymać procedurę. Bez powyższej instrukcji procedura będzie tak długo „prosB użytkownika o podanie hasła, aż wpisze on prawidłowe słowo.
Ponieważ po opuszczeniu pętli znajduje się jeszcze jedna instrukcja do wykę infiniti nia, użytkownik uzyska komunikat o wpisaniu prawidłowego hasła, chociaż nie wpfl żadnej wartości. Aby temu zapobiec, zamiast Exit do wpisz Exit Sub, jak poniżej: pętlę,
Sub P< Do
MsgBo: Loop ' End Si
If hasło = "" Then Exit Sub
Czym jest pętla
Pętla jest strukturą programową, umożliwiająca wie okrotne powtarzanie danj fragmentu programu. VBA posiada kilka struktur typu pętli, które możesz stosoj
W SWOich procedurach: Do...While, Do...Until, For...Next oraz For...Each.
/ Access 2000
Powtarzanie czynności w Visual Basicu
133
P ętla Do...while posiada jeszcze inny zapis syntaktyczny, który umożliwia sprawdzenie warunku na jej końcu:
instrukcjal instrukcja2 instrukcjaN Loop While warunek
Zanim Visual Basic spawdzi warunek na końcu pętli, instrukcje w niej zawarte zostaną wykonane przynajmniej raz.
Przeanalizujmy teraz następującą procedurę:
Sub Login()
Dim szyfr As String
Do
szyfr = InputBox("Wpisz szyfr:") If szyfr = "splO45" Then Exit Do Loop While szyfr o "splO45"
End Sub
Zwróć uwagę, że przed sprawdzeniem warunku Visual Basic wykonał już raz instrukcje znajdujące się w pętli. Powyższa procedura pokazuje również, w jaki sposób można opuścić pętlę, gdy warunek jest spełniony. Po napotkaniu Exit do Visual Basic natychmiast wychodzi z pętli.
Unikaj pętli powtarzających czynności w nieskończoność
Niepoprawnie zaprogramowane pętle działają na zasadzie błędnego koła (ang. infinite loop). Dana czynność jest wtedy powtarzana w nieskończoność. Procedury nie da się zatrzymać za pomocą klawisza ucieczki (ESC). Następująca procedura zawiera pętlę, która nigdy się nie skończy, gdyż brak jest w niej warunku:
Sub PowiedzCześć ()
Do
MsgBox "Cześć." :
Loop • End Sub
134
Programowanie w A
Aby zatrzymać działanie takiej nie kończącej się procedury, naciśnij korni Ctrl+Break. Kiedy Visual Basic wyświetli komunikat: wykonanie kodu proc zostało wstrzymane (Code execution has been interrupted), kliknij przycisk K aby zakończyć procedurę.
Inną, nie mniej pożyteczną pętlą, jest struktura Do...untii, która pozwala wtarzanie jednej lub więcej instrukcji, aż postawiony warunek okaże się praw Innmi słowy, Do...until powtarza blok instrukcji, dopóki warunekjest fałszywyj
Do Until warunek instrukcjal instrukcja2 instrukcjaN
Loop
Korzystając z powyższego przykładu, można teraz sporządzić inną wersję j dury PodajHasło w następujący sposób:
Sub PodajHasło2()
Dim hasło As String
hasło = ""
Do Until hasło = "DADA"
hasło = InputBox("Wpisz hasło dcstępu do raportu:") If hasło = "" Then Exit Sub Loop
MsgBox "Wpisałeś prawidłowe hasło". End Sub
Pierwszy wiersz w powyższej procedurze oznacza: „Wykonuj następującej cenią, aż wartość zmiennej hasło będzie łańcuchem znaków „DADA"". W rea Visual Basic będzie wykonywał instrukcję wewnątrz pętli, aż użytkownik po widłowe hasło lub kliknie przycisk OK lub Anuluj, aby opuścić okno dialogowej
Zmienne oraz pętle
Wszystkim zmiennym, które są używane w pętli, należy przypisać odpo wartości przed rozpoczęciem pętli.
Podobnie jak pętla Dc.while, pętla Do...until posiada drugą składnię, któ| zwala na sprawdzenie warunku na końcu pętli:
Access 2000
Powtarzanie czynności w Visual Basicu
135
yersję proce-
Do
instrukcjal
instrukcja2 instrukcjaN Loop Until warunek
Jeżeli chcesz, aby instrukcje wewnątrz pętli zostały przynajmniej raz wykonane bez względu na wartość warunku, umieść warunek w tym samym wierszu, co instrukcja Loop.
Teraz wypróbuj następującą procedurę, która drukuje 27 liczb w oknie Instrukcje bezpośrednie.
Sub Drukuj Liczby ()
Dim num As Integer liczba = 0
Do
liczba = liczba + 1 Debug.Print liczba Loop Until liczba = 27 End Sub
Zmienna liczba jest zainicjowana na początku powyższej procedury i wynosi zero (0). Gdy Visual Basic napotka pętlę, wartość zmiennej liczba zostanie powiększona o jeden i wpisana w oknie Instrukcje bezpośrednie za pomocą instrukcji Debug. Print.
Następnie postawiony warunek zleca Visual Basicowi wykonywanie instrukcji w pętli, aż wartość zmiennej liczby wyniesie 27.
Liczniki
Licznik jest zmienną liczbową, która przechowuje liczbę wykonanych zadań. Procedura Drukuj Liczby, pokazana powyżej, korzysta ze zmiennej liczba w celu przechowywania ilości liczb, które mają być wydrukowane w oknie Instrukcje bezpośrednie. Zmienną pełniącą funkcję licznika należy zainicjować (tj. przypisać jej wartość) na początku procedury. W ten sposób zawsze będzie wiadomo, jaka jest dokładna wartość licznika, zanim procedura zacznie z niego korzystać. Licznik można powiększyć lub zmniejszyć, dodając do niego lub odejmując odpowiednią wartość.
136
Pętla For...Next
Programowanie
wAccd
Pętle For...Next stosuje się, gdy wiadomo, ile razy powtórzyć dany strukcji. Zapis tej struktury jest następujący:
For licznik = start To end [Step liczba]
instrukcjal
instrukcja2
instrukcjaN Next [licznik]
Kod podany w nawiasie kwadratowym mcżna pominąć. Licznik jest doi nazwą zmiennej, która ma zostać użyta do przecnowywania liczby powtórzeń. \ określa początkową wartość licznika, end - maksymalną liczbę powtórzeń. Jr! przykład zamierzasz wykonać czynności wpisane w pętli 5 razy, sko z następującego schematu instrukcji:
For licznik = 1 To 5
Wpisz tutaj instrukcje do wykonania Next
Kiedy Visual Basic napotka słowo kluczowe Next, wróci ponownie na pod
pętli i wykona znajdujące się w niej instrukcje. Będzie się to powtarzać, dopóki]
tość zmiennej licznik nie stanie się równa podanej końcowej wartości powtór:
Kiedy tylko wartość licznika stanie się większa niż wartość podana po słowie|
czowym To, Visual Basic opuści pętlę. Ponieważ wartość zmiennej licznik zrniera
automatycznie po każdym wykonaniu pętli, wcześniej czy później
przechowywana w tej zmiennej przekroczy maksymalną wartość powtórzeń, p
przez argument end. Ustawienie wyściowe powoduje, że za każdym razem gdy V
Basic wykona instrukcje wewnątrz pętli, wartość imiennej pełniącej funkcję lici
jest zwiększana o jeden (1). Można zmienić to początkowe ustawienie, kórz
z klauzuli step. Na przykład, aby powiększyć zmienną licznik o trzy (3), skorz
z następującej strukury:
For licznik = 1 To 5 Step 3
Kiedy Visual Basic napotka powyższą instrukcję, wykona polecenia w pętli j dwa razy. W ciągu pierwszego pobytu w pętli licznik równa się 1. W ciągu dr
Wpisz tutaj instrukcje do wykonania Next licznik
Access 2000
Powtarzanie czynności w Visual Basicu
137
n y blok in-
3St dowolną
irzeń. start
:eń. Jeśli na
skorzystaj
na początek dopóki war-tvtórzeń (5). słowie klu-zmienia się ej wartość zeń, podaną gdy Visual cję licznika korzystając korzystamy
v pętli tylko »u drugiego
pobytu licznik równa się 4 (3+1). Po drugim pobycie licznik równa się 7 (4+3), zatem Visual Basic opuści pętlę.
Zwróć uwagę, że słowo kluczowe step i występująca po nim liczba, która wskazuje, o jaką wartość należy powiększyć lub zmniejszyć licznik, są opcjonalne. Opcjonalne części instrukcji są zawsze podane w nawiasie kwadratowym w zapisie syn-taktycznym (zob. listing tej pętli na początku tego podrozdziału). Wartość step podaje się wówczas gdy jest ona inna niż wyjściowa wartość jeden (1). Po słowie kluczowym step można wpisać liczbę ujemną. Visual Basic odejmie tę wartość od wartości licznika, za każdym razem gdy napotka polecenie Next.
Również opcjonalna jest nazwa zmiennej (licznik) po słowie kluczowym Next. Jednakże polecenie Next będzie bardziej zrozumiałe, gdy użyjesz po nim nazwę zmiennej pełniącej funkcję licznika w tej pętli.
Zastanówmy się teraz, w jaki sposób można wykorzystać pętlę For...Next w aplikacji Microsoft Access. Załóżmy, że chcesz sporządzić wykaz pól tekstowych znajdujących się w aktywnym formularzu. Poniższa procedura demonstruje, w jaki sposób można się dowiedzieć, czy dany element formularza jest polem tekstowym, i w jaki sposób wyświetlić jego nazwę, gdy pole tekstowe zostanie odnalezione.
1. Wpisz następującą procedurę w dowolnym module:
Sub WykazPólTekstowych()
Dim frm As Form
Dim Ctrl As Control
Dim licznik As Integer
Set frm = Screen.ActiveForm
Set Ctrl = Screen.ActiveControl
For licznik = 0 To frm.Count - 1
If TypeOf frm(licznik) Is TextBox Then
MsgBox frm(licznik).Name
End If
Next licznik
End Sub
Polecenie warunkowe (if...Then) zagnieżdżone wewnątrz pętli For...Next, poleca wyświetlić nazwę tylko wówczas, gdy elementem formularza jest pole tekstowe.
Przed
uruchomieniem powyższej
procedury otwórz dowolny formularz w trybie
Widoku.
Wróć
do modułu, ustaw kursor w dowolnym miejscu procedury
wykazPólTek-
stowych
i naciśnij F5.
138
Programowanie w Access^H
Instrukcje występujące parami
Słowa kluczowe For oraz Next występują w parze. Jeżeli pominiesz jedno zl Visual Basic wyświetli następujący komunikat o błędzie: ,.For without Next",
Pętla For Each...Next
Gdy procedura musi wykonywać powtarzające się czynności związane z koi obiektów lub tablicą(zob. następny podrozdział), stosuje się pętlę For Each...J W pętli tej nie potrzeba wprowadzać licznika. Visual Basic sam wie, ile razy | ona być wykonana. Weźmy na przykład tabelę bazy danych. Każda zach w bazie danych tabela reprezentowana jest przez obiekt TableDef w bibliotece o tów DAO (obiekty DAO omówione są w rozdziale 2.). Zbiór o nazwie Tab wiera wszystkie obiekty TableDef danej bazy danych. Możesz zbadać kolekcję! w bazie danych, korzystając z pętli For Each...NextL która ma następującą postać:!
For Each element In Grupa
instrukcjal
instrukcja2
instrukcjaN Next [element]
Element jest nazwą zmiennej, która przechowuje nazwę każdego ele. w kolekcji lub tablicy. Zmienna ta posiada typ danych variant dla tablicy 1J danych object dla kolekcji. Grupa jest nazwą kolekcji lub tablicy.
Teraz dowiemy się, w jaki sposób można skorzystać z pętli For...Each...Nextl pobrać nazwy tabel w aktualnie otwartej bazie danych:
1. Wpisz w module następującą procedurę:
Sub WykazTabel()
Dim baza As DAO.Database
Dim tbl As DAO.TableDef
Set baza = CurrentDb
For Each tbl In baza.TableDefs Debug.Print tbl.Name
Next End Sub
;ess 2000 j powtarzanie czynności w Visual Basicu 2. Uruchom procedurę wykazTabel.
139
W procedurze WykazTabel zadeklarowane są dwie zmienne. Zmienna baza reprezentuje bazę danych, a zmienna tbi - tabelę. Ponieważ Microsoft Access 2000 może korzystać z obiektów DAO lub ADO do manipulacji bazami danych, należy określić, z jakiej biblioteki pochodzi obiekt, z którym będziemy pracować. W tym przykładzie skorzystamy z biblioteki obiektów DAO (Data Access Objects), która szczegółowo jest omówiona w rozdziale 2. Ponieważ ustawieniem wyjściowym Ac-cessa jest biblioteka ADO (ActiveX Data Objects), omówiona w rozdziale 3, aby móc korzystać z obiektów DAO, należy ustawić odwołanie do biblioteki Microsoft Data Access Objects. W tym celu w oknie edytora Visual Basic wybierz Narzędzia => Ustawienia i zaznacz na liście dostępnych bibliotek tę o nazwie Microsoft DAO 3.6 Object Library, następnie zamknij okno dialogowe odwołania.
Polecenie set baza = CurrentDb przypisuje zmiennej obiektowej o nazwie baza funkcję CurrentDb, która zwraca odwołanie do bieżącej bazy danych. Gdy Visual Basic napotka pętlę For...Each...Next, wpisze nazwy wszystkich tabel (włączając tabele ukryte oraz systemowe) w oknie Instrukcje bezpośrednie. Aby Visual Basic zignorował nazwy tabel ukrytych oraz tabel systemowych, zmodyfikuj powyższą procedurę tak, jak poniżej:
Sub WykazTabel 2 ()
Dim baza As DAO.Database
Dim tbl As DAO.TableDef
Set baza = CurrentDb
For Each tbl In baza.TableDefs
If tbl.Attributes And dbSystemObject Or _
tbl.Attributes And dbHiddenObject Then ' nic nie rób Else
Debug.Print tbl.Name End If Next End Sub
W powyższej procedurze instrukcja warunkowa lf...Then...Else w pętli For...Each...Next poleca Visual Basicowi wydrukowanie tylko nazw tych tabel, które nie są tabelami ukrytymi lub systemowymi. Zwróć uwagę, że w pierwszej części instrukcji warunkowej znajduje się tylko wiersz komentarza.
Visual Basic wychodzi automatyczne 2 pętli, kiedy wykona wszystkie dziane czynności. Czasami jednak może się zdarzyć, że chcesz wcześniej pętlę, kiedy użytkownik wprowadzi złe dane lub gdy procedura napotka niej ziany błąd. Visual Basic posiada dwa rodzaje nstrukcji Exit:
instrukcja
Exit
For
może być użyta w celu wcześniejszego zakończer
For...Next
albo For...Each...Next.
instrukcja Exit do natychmiast kończy pętle typu do.
Następująca procedura demonstruje sytuację, w której wskazane jest wc2 sze opuszczenie pętli For...Each...Next.
1. Wpisz w module poniższą procedurę:
Sub WczesnyExit()
Dim baza As DAO.Database Dim tbl As DAO.TableDef Set baza = CurrentDb
For Each tbl In baza.TableDefs
If tbl.Attributes And dbSystemObject Or _ tbl.Attributes And dbHicdenObject Then ' nic nie rób Else
Debug.Print tbl.Name
If tbl.Name = "Klienci" Then
Exit For End If End If Next End Sub
Procedura WczesnyExit sprawdza nazwy tabel w bieżącej bazie danych. Jj Visual Basic napotka tabelę Klienci, to natychmiast opuści pętlę i procedural gnie końca.
Wczesne zakończenie procedur
Jeżeli chcesz opuścić daną procedurę wcześriiej, możesz skorzystać z inst Exit sub. Jeżeli procedura ta jest funkcją, to zam ast Exit Sub zastosuj Exit
tion.
141
;cess 2000
e przewi-jj opuścić eprzewid-
senia pętli
Powtarani^czyn^
Zagnieżdżanie pętli
puentowała użycie
U
5i5
określa sie terminem
ozpodie sie następny cykl instrukcji
wykonanie
danego
:
„Next
W innej pętH For...Next.
wczesniej-
For
SubPodajTabeleOrazPolaO
Dim baza As DAO.Database
Dim tbl As DAO.TableDef
Dim fid AS DAO.Field
Set baza = CurrentDb
v r Each tbl In baza.TableDefs
' X tbl-Attributes And dbSyste.Object Or
tbl.Attributes And dbHiddenObject Then ■ nic nie rób
Else
Debug.Print tbl.Name
For Each fid in tbl.Fields
Debug.Print Chr(9) & fid.Name
Next
End If
Next End Sub
mych. Jeżeli edura dobie-
o
i korzvsta
z
dwóch
pętli For...Each.
. .Next
Procedura
PodajTabeieora*pola
torzys instrukc.e
bezpośrednie.
sposób nazwy pól wydruko-a do nazwy t^Uak^K
ć z instrukcji
i Exit Func-
w przykładzie poniżej:
Klienci
IDklienta
Programowanie w Access!
NazwaFirmy Przedstawiciel
StanowiskoPrzedstawiciela
Adres
Miasto
Region
KodPocztowy
Kraj
Telefon
kor:
zkt
się I
zast
wać
próg
tabe
było
zwa_
progi
dział
cąsp
Faks
Podsumowanie
W tym podrozdziale nauczyłeś się, w jaki sposób można powtarzać pewnej
instrukcji w procedurach za pomocą struktur programowych, określanych tend
pętli. Pracując z kilkoma rodzajami pętli, przekonałeś się, że każda pętla spełni
dobną funkcję, tylko nieco innym sposobem. Instrukcje wpisane w pętli są powtaij
albo określoną liczbę razy, albo do momentu, kiedy zostanie spełniony postawi
warunek. Pętle do oraz while umożliwiają podanie warunku. Pętle For wymagaj
dania liczby określającej, ile razy dane instrukcje będą wykonywane. W kolejt
podrozdziałach zostały podane dodatkowe przykłady użycia pętli. Z następnegof
rozdziału dowiesz się, jak postępować z dużymi partiami informacji, które wymj
Zmie;
(Stri
Visua niejsz tabele
X
sta. Pj firmy, wartoś składaj
deklaracji wielu zmiennych, oraz jak pisać bardziej kompleksowe procedury wyj
stujące tablice i zagnieżdżone pętle.
ccess 2000
Praca z tablicami
W poprzednich podrozdziałach pracowałeś z wieloma procedurami VBA, które korzystały ze zmiennych w celu przechowywania informacji. Dla każdej wartości, z której korzystała procedura, należało zadeklarować osobną zmienną. Zastanówmy się teraz, co zrobić, gdy będzie trzeba zachować całą serię wartości. Jeżeli zechciałbyś zastosować lub zmienić w swoim programie więcej danych, to musiałbyś zadeklarować znacznie więcej zmiennych. Wyobraź sobie, jak koszmarne byłoby sporządzenie programu, który miałby przechować kursy walutowe całego świata. Aby sporządzić tabelę służącą do przechowywania niezbędnych w takiej aplikacji danych, trzeba by było zadeklarować dla każdego kraju przynajmniej trzy zmienne - nazwa_kraju, na-zwa_waluty oraz kurs_waluty. Na szczęście, Visual Basic, podobnie jak inne języki programowania, rozwiązuje ten problem w nieco inny sposób. Z kolejnych podrozdziałów dowiesz się, w jaki sposób można manipulować dużą liczbą danych za pomocą specjalnych struktur określanych terminem tablic.
W Visual Basicu tablica (ang. array) jest specjalnym rodzajem zmiennej. Zmienna ta reprezentuje zbiór wartości mających określony typ danych (np. Tekst (string), liczba całkowita (integer), waluta (currency), data (Date) itp.). Chociaż Visual Basic pozwala tworzyć tablice posiadające aż 60 wymiarów, do najpopularniejszych należą tablice jednowymiarowe (tzw. listy) i tablice dwuwymiarowe (tzw.
tabele).
W języku potocznym tablica jednowymiarowa często jest określana terminem lista. Przykładem takiej tablicy może być lista zakupów i lista pracowników danej firmy. Tablica jednowymiarowa jest po prostu ponumerowaną listą wartości. Każda wartość na liście ma swój własny indeks (numer). Poniżej znajduje się schemat listy składającej się z sześciu elementów:
J
element |
(1) |
|
element |
(2) |
|
element |
(3) |
|
element |
(4) |
|
element |
(5) |
|
element |
(6) |
|
144 Programowanie w Acct
Zwróćmy uwagę, że kolumna reprezentująca jednowymiarową tablicę jest Aby wypełnić tę tablicę danymi, zamiast sześciu pojedynczych zmiennych,] użyć jednej zmiennej z kolejną liczbą w nawiasie. W powyższej ilustracji elenia nazwą zmiennej, a liczby w nawiasach - (1), (2), (3), (4), (5), i (6) - idenj poszczególne elementy tablicy.
Poniżej zostały podane dwie tablice jednowymiarowe - tablica o nazwie! i typie danych string zawiera nazwy miejscowości, natomiast tablica onazwi merki i typie danych integer zawiera wytypowane numery Lotka.
Jendowymiarowa
tablica o nazwie miasta Jednowymiarowa tablica o nazwie
(typ
danych String
-
$) Numerki
(typ danych Integer
-
%)
Miasta$(1) Miasta$(2) Miasta$(3) Miasta$(4) Miasta$(5) Miasta$(6)
Warszawa
K raków
K atowice
G dańsk
P oznań
O pole
Numerki%(1) Numerki%(2) Numerki%(3) Nunerki%(4) Numerki%(5) Numerki%(6)
25
3 1
2 2
1 1
J ak widać, zawartość każdego elementu tablicy zgadza się z zadeklarowany! pem danych. Jeżeli chcesz przechowywać różne typy wartości w danej tablicy (■ liczby itp.), to powinieneś zadeklarować tę tablicę jako variant. Znak dolara ($) jący obok nazwy zmiennej, reprezentującej tablicę, oznacza, że zmienna ta pr wuje typ danych string (dane tekstowe), natomiast znak procentu (%) na końc zwy zmiennej identyfikuje zmiennąjako typu integer (liczby całkowite).
W odróżnieniu od list wartości, tablice dwuwymiarowe są tabelami wartoś dawanymi w rzędach i kolumnach. Pozycję wartości w tabeli określa numer i numer kolumny. Poniżej znajduje się schemat tablicy dwuwymiarowej.
ccess 2000
jest pusta. ;h, należy ement jest entyfikują
'ie Miasta azwie Nude
Praca z tablicami
Wiersze *J/ |
1 |
2 |
3 |
1 |
(1,1) |
(1,2) |
(1,3) |
2 |
(2,1) |
(2,2) |
(2,3) |
3 |
(3,1) |
(3,2) |
(3,3) |
4 |
(4,1) |
(4,2) |
(4,3) |
5 |
(5,1) |
(5,2) |
(5,3) |
<-kolumny
145
Zwróćmy uwagę, że elementy tablicy dwuwymiarowej są identyfikowane za pomocą numeru wiersza i kolumny. W tym schemacie pierwszy element tablicy znajduje się w pierwszym wierszu i w pierwszej kolumnie (1,1). Ostatni element tablicy umieszczony jest w piątym wierszu i trzeciej kolumnie (5, 3). Wypełnijmy teraz tę tablicę danymi. Dwuwymiarowa tablica podana poniżej przechowuje nazwę państwa, jego walutę oraz cenę w złotówkach.
Dwuwymiarowa tablica o nazwie Wymiana (typ danych Variant)
w anym ty-licy (tekst, ira ($) sto-a przecho-końcu na-
artości po-er wiersza
Czechy (1,1) |
CZK (1,2) |
0.1158 (1,3) |
Norwegia (2,1) |
NOK (2,2) |
0.4675 (2,3) |
Kanada (3,1) |
CAD (3,2) |
2.5937 (3,3) |
Australia (4,1) |
AUD (4,2) |
2.1761 (4,3) |
USA (5,1) |
USD (5,2) |
4.1159 (5,3) |
146
Programowanie w Access!
C hociaż tablice VBA mogą posiadać aż 60 wymiarów, my i tak z trudem \ my sobie wyobrazić takie, które mają więcej niż trzy wymiary. Tablica trówyn jest zbiorem tabel, w którym każda tabela zawiera jednakową liczbę wierszy i koi Każdy element w tabeli trójwymiarowej identyfikowany jest za pomocą trzech i - wiersza, kolumny i tabeli.
Zmienne typu Array
Tablica jest grupą zmiennych posiadających tę samą nazwę. Podczas gdy t zmienna może przechowywać tylko jedną wartość, zmienna typu Array! przechowywać wiele pojedynczych wartości. Specyficzną wartość tablicy identj się za pomocą nazwy tablicy oraz indeksu.
Deklarowanie tablicy
Ponieważ tablica jest rodzajem zmiennej, działa podobnie jak zmienna i i jak zmienna wymaga deklaracji. Zadeklarowanie tablicy rezerwuje miejsce wpa komputera na przechowywanie wartości znajdujących się w tablicy. Tablice, I proste zmienne, z którymi dotychczas się zetknęliśmy, deklaruje się za pomoi strukcji Dim.
Oto kilka przykładów deklaracji tablic:
Dim miasta(6) As String Dim dniTyg(7) As String Dim numerki(6) As Integer Dim wymiana(5,3) As Variant
Zwróćmy uwagę, że po nazwie zmiennej tablicowej znajduje się w nawiasie. Tablica jednowymiarowa wymaga jednej liczby w nawiasie. Lic: określa maksymalną ilość elementów, które nożna przechowywać w danej I Dwuwymiarowa tablica wymaga dwóch liczb w nawiasie - pierwsza liczba jest rem wiersza, druga - numerem kolumny. W przykładzie powyżej dwuwym tablica o nazwie wymiana może przechowywać nie więcej niż 15 wartości (5*3=
Ostatnią częścią deklaracji tablicy jest definicja typu danych, które dana będzie przechowywać. Tablica może zawierać dane następujących typów: u
Long, Single, Double, Variant, Currency, String, Boolean, Byte, Date.
Po zadeklarowaniu tablicy Visual Basic rezerwuje odpowiednią ilość ] potrzebnej do przechowywania danych. Ilość pamięci zależy od typu i wymiaru tablicy. Deklarując jednowymiarową tablicę o nazwie numerki, k wiera 6 elementów, Visual Basic rezerwuje 12 bajtów pamięci, po 2 bajty dla 1
Praca z tablicami
147
e lementu tablicy (rozmiar typu danych integer wynosi 2 bajty, stąd 2 * 6 = 12). Im większa tablica, tym więcej pamięci potrzeba na przechowywanie danych. Aby dobrze gospodarować pamięcią komputera, starajmy się deklarować tylko tyle elementów w tablicy, ile naprawdę jest koniecznych.
Deklaracja zmiennych tablicowych
Aby zadeklarować zmienną typu Array, podaj:
• nazwę, która ma reprezentować tablicę, na przykład:
Dim Miasta Dim Waluta
i ujętą w nawiasie maksymalną liczbę elementów, która ma być przechowywana w tablicy, na przykład:
Dim Miasta(6) Dim Waluta (5, 3)
t typ danych, które zamierzasz przechowywać w tablicy, na przykład:
Dim Miasta(6) As String
Dim Waluta (5, 3) As Currency
Górna i dolna granica tablicy
Ustawienie początkowe w Visual Basicu powoduje, że pierwszy element tablicy ma numer 0 (zero), drugi element tablicy - numer 1, trzeci - 2 itd. Przy tym ustawieniu jednowymiarowa tablica o nazwie Miasta$(6) ma nie sześć, lecz siedem elementów o numerach od 0 do 6. Jeśli wolisz liczyć elementy tablicy, począwszy od numeru 1, możesz zmienić dolną jej granicę za pomocą instrukcji option Base i. Instrukcję tę należy wpisać u samej góry kartki modułu powyżej którejkolwiek instrukcji Dim (przed instrukcją Sub). Jeżeli procedura nie zawiera instrukcji option Base l, to Visual Basic przyjmuje, że aktualną instrukcją jest option Base o, i liczy elementy tablicy od zera.
Jeśli chcesz rozpocząć numerację elementów tablicy od innej liczby niż 0 lub 1, to deklarując tablicę, podaj jej dolny i górny zakres, tak jak w przykładzie poniżej:
1
D im Miasta(3 To 6) As Integer
Powyższa instrukcja deklaruje tablicę jednowymiarową o czterech elementach. Liczby w nawiasie oznaczają dolną(3) i górną(6) granicę tablicy. Pierwszy element tej
148
Programowanie w Acci
tablicy ma numer 3, drugi 4, trzeci 5, a czwarty 6. Zwróć uwagę na obecność] kluczowego To między dolnym i górnym indeksem.
Zakres tablicy
Indeksy połączone słowem kluczowym To w deklaracji zmiennej t wyznaczają zakres danej tablicy. Na przykład Din. mktgKody( 5 to 15).
Użycie tablic w procedurach VBA
Po zadeklarowaniu tablicy należy przystąpić do przypisywania wartości I czególnym jej elementom. Przypisywanie wartości elementom tablicy częstj reślanejest terminem wypełniania tablicy (ang. filling an array lub populating ray). Sprawdźmy teraz, w jaki sposób można sporządzić jednowymiarową | zawierającą nazwy sześciu miast.
1. Wstaw nowy moduł w bieżącej bazie danych i wpisz w nim kod procedury i nej poniżej:
Option Explicit 1 licz od 1 Option Base I
Sub UlubioneMiasta()
1 zadeklaruj tablicę Dim Miasta(6) As String
' przypisz wartości elementom tablicy
Miasta(1) = "Warszawa"
Miasta(2) = "Kraków"
Miasta(3) = "Katowice"
Miasta (4) = "Gdańsk"
Miasta (5) = "Poznań"
Miasta(6) = "Opole"
'pokaż co zostało wpisane
MsgBox Miasta(l) & Chr(13) & Miasta(2) S. Chr(13) _
& Miasta(3) & Chr(13) & Miasta(4) & Chr(13) & Miasta(5) & Chr(13) & Miasta(6) End Sub
Zwróć uwagę na pozycję instrukcji option Bass l u samej góry modułup poleceniem Sub rozpoczynającym procedurę. Polecenie option Base i zlecam
W
St
Fc
ta ur
tal
na
w Access 2000
Praca z tablicami
149
r ację elementów tablicy od 1, a nie od 0, które jest ustawieniem wyściowym. Procedura ulubioneMiasta rozpoczyna się od zadeklarowania tablicy o nazwie Miasta i typie danych string. Tablica ta ma sześć elementów. Po deklaracji tablicy poszczególnym elementom tablicy przypisane są wartości. Zwróć uwagę, że każdy z elementów tablicy posiada tę samą nazwę oraz indywidualny indeks. Po przypisaniu wartości wskazanym elementom tablicy ostatnia instrukcja procedury wyświetla wszystkie wpisane nazwy miast w tej samej kolejności w oddzielnych liniach (zob. rysunek 1.29). Kolejność wyświetlonych danych można łatwo zmienić, przestawiając wartości poszczególnych indeksów.
Odtwórz procedurę uiubioneMiasta i sprawdź jej rezultat.
Zmodyfikuj
procedurę
uiubioneMiasta, tak by wyświetlała nazwy miast
w
odwrotnej kolejności (od 6 do 1).
Warszawa
Kraków
Katowice
Gdansk
Poznań
Opole
OK
R ysunek 1.29. Elementy tablicy jednowymiarowej można wyświetlić przy użyciu funkcji MsgBox
Początkowa wartość elementu tablicy
Dopóki elementowi tablicy nie przypiszesz jakiejś wartości, to ma on wartość wyjściową. Zmienne liczbowe mają wyjściową wartość zero (0), a zmienne typu string otrzymują pusty łańcuch znaków ("").
Tablice i pętle
Pętle, które poznałeś w poprzednich podrozdziałach (For...Next oraz For...Each...Next), przydadzą się teraz przy wykonywaniu zadań takich jak wypełnianie tablicy wartościami czy też wyświetlanie elementów tablicy. Połączmy zatem nabyte umiejętności i zastanówmy się, jak można zmodyfikować procedurę uiubioneMiasta, tak by wyświetlała nazwę każdego miasta w osobnym oknie komunikatu.
Procedura uiubioneMiasta2 podana poniżej zastępuje ostatnią instrukcję oryginalnej procedury pętlą For...Each...Next:
Sub UlubioneMiasta2(}
'zadeklaruj tablicę Dim Miasta(6) As String Dim miasto As Variant
.
'przypisz wartości elementom tablicy Miasta(1) = "Warszawa" Miasta(2) = "Kraków" Miasta(3) = "Katowice" Miasta (4) = "Gdańsk" Miasta (5) = "Poznań" Miasta(6) = "Opole" 'kolejno pokaż, co zostało wpisane For Each miasto In Miasta
MsgBox miasto Next End Sub
Programowanie
Zauważ, że pętla For...Each...Next korzysta ze zmiennej miasto zadeklaroj jako variant. Z poprzedniego podrozdziału wiesz już, że pętla For...Each... pozwala dotrzeć po kolei do wszystkich obiektów wdanej kolekcji lub wszys elemenów w danej tablicy i wykonać tę samą czynność na każdym obielccij elemencie. W trakcie odtwarzania procedury uiubioneMiasta2 instrukcja znąjdj się w pętli zostanie wykonana tyle razy, ile jest elementów w tablicy Miasta. Niżej została podana procedura centrala, która jest jeszcze innym wana
procedury uiubioneMiasta. Procedura centrala demonstruje przekazywanie!
mentów tablicy do procedury o nazwie Halo. Przekazywanie elementów d
z procedury do procedury (lub funkcji) pozwala na kilkukrotne wykorzystanie i
tablicy bez konieczności przepisywania procedury.
1. W bieżącym module wpisz kod dwóch procedur podanych poniżej:
Sub Centrala()
'zadeklaruj tablicę Dim Miasta(6) As String
'przypisz wartości elementom tablicy Miasta(1) = "Warszawa" Miasta(2) = "Kraków" Miasta(3) = "Katowice" Miasta (4) = "Gdańsk"
w Access 2000
Praca z tablicami
151
s klarowanej
lach... Next
wszystkich
biekcie lub
znajdująca
wariantem wanie ele-ów tablicy tanie danej
Miasta(5) = "Poznań" Miasta(6) = "Opole"
'zawołaj procedurę Halo i przekaż tablicę jako argument Halo Miasta () End Sub
Sub Halo (Miasta () As String)
Dim licznik As Integer
For licznik = 1 To 6
MsgBox "Halo ■ & Miasta(licznik)
Next End Sub
W deklaracji procedury Halo znajduje się zmienna tablicowa o nazwie Miasta ().
2. Uruchom procedurę centrala, korzystając z przycisku na pasku narzędzi lub opcji menu Uruchom.
Przekazywanie tablic z procedury do procedury
Tablica zadeklarowana w danej procedurze jest lokalna i niewidoczna dla innych procedur. Można jednak przekazać lokalną tablicę do innej procedury. W tym celu przekaż do procedury wołającej nazwę tablicy z parą pustych nawiasów jako argumentem. Na przykład polecenie Halo Miasta o woła procedurę o nazwie Halo i przekazuje jej tablicę o nazwie Miasta ().
Teraz spróbujmy w praktyce zastosować nowo nabytą wiedzę na temat tablic i pętli. Jeżeli namiętnie grasz w lotka, ale jesteś już znużony wybieraniem własnych szczęśliwych numerków, Visual Basic może to zrobić za ciebie. Procedura Lotek podana poniżej wypełnia tablicę sześcioma liczbami w zakresie od 1 do 51:
Sub Lotek ()
Const typy = 6
Const minNum = 1
Const maxNum = 51
D im t As Integer Dim i As Integer Dim mojeNumerki As String
Dim lucky(typy) As String
'licznik w zewnętrznej pętli 'licznik w wewnętrznej pętli 'zmienna przechowująca wytypowane 'numerki w postaci łańcucha znaków 'tablica z wytypowanymi numerami
152
Programowanie w Access Prac<
r
= Wału
Wału
Wału
Wału Wału Wału
Wału walu
wału
MsgB
&
w & w & w
End
lumn
mojeNumerki
= ""
For t = 1 To typy Randomize
lucky (t) = Int ( (maxNum - minNum + 1) * Rnd) + minNum I 'zobacz, czy ten numer był juz w/brany For i = 1 To (t - 1)
If lucky(t) = lucky(i) Then
lucky (t) = Int ( (maxNum - minNum +1) * Rnd) + mini i = 0 End If Next i
MsgBox "Szczęśliwy numer: " & lucky(t) mojeNumerki = mojeNumerki & " -" & lucky(t) Next t
MsgBox "Szczęśliwe numerki: " & mojeNumerki End Sub
Polecenie Randomize inicjuje generator dczb losowych. Instni
Int ( (maxNum-minNum+l) * Rnd + minNum) korzysta Z wbudowanej funkcji Rnd,! ra zwraca liczbę losową znajdującą się w przedziale pomiędzy minNum oraz maj Funkcja int zamienia otrzymaną liczbę losową, na liczbę całkowitą. Zamiast pj sywać wartości stałym minNum oraz maxNum, możesz skorzystać z funkcji inpuj aby pobrać przedział liczb od użytkownika. Ponieważ typowane numery nie mój powtarzać, wewnętrzna pętla For.. .Next sprawdza, czy wytypowany numerniel duplikatem.
Kr;
Au US Ka
Użycie tablic dwuwymiarowych
Teraz, gdy wiemy już, jak napisać program, który potrafi sporządzić listę» nowymiarową tablicę), prześledźmy, na czym polega praca z tabelami daj Następująca procedura tworzy tablicę dwuwymiarową, która przechowuje raj państwa, nazwę waluty oraz kurs wymiany dla trzech wybranych krajów.
Sub Wymiana()
Dim t As String
Dim r As String
Dim Waluta(3, 3) As Variant
t = Chr(9) 'kod tabulatora
Rysur
Tab
o okri
ją za
klaruj
ment(
dokła
podst
może
Praca z tablicami
153
r = Chr(13) 'kod klawisza Enter Waluta (1, 1) = "Australia"
Waluta (1, |
2) |
= "AUD" |
|
|
|
|
Waluta (1, |
3) |
= "2.1761 |
|
|
|
|
Waluta (2, |
1) |
= "USA" |
|
|
|
|
Waluta (2, |
2) |
= "USD" |
|
|
|
|
Waluta (2, |
3) |
= "4.1159 |
» |
|
|
|
Waluta (3, |
1) |
= "Kanada |
|
|
|
|
Waluta (3, |
2) |
= "CAD" |
|
|
|
|
Waluta (3, |
3) |
= "2.5937 |
■ |
|
|
|
MsgBox "Kraj |
11 & t & t |
|
& ' |
■Waluta" & |
t & |
|
& Waluta |
(1, |
1) & t & |
t |
& |
Waluta(1, |
2) |
5, Waluta (2 , |
1) & t & |
t |
& |
Waluta(2, |
2) |
|
& Waluta(3, |
1) & t & |
t |
& |
Waluta(3, |
2) |
|
End Sub |
|
|
|
|
|
|
"Cena" & r & r _ & t & Waluta(1, 3) & r _ & t & Waluta(2, 3) & r _ & t & Waluta(3, 3), , "Wymiana"
Po uruchomieniu procedury wymiana zobaczysz komunikat podany w trzech kolumnach (zob. rysunek 1.30).
|
|
Kraj Australia U5A Kanada |
Waluta Cena AUD 2.1761 U5D 4.1159 CAD 2.5937 |
|
i OK lj |
|
|
Rysunek 1.30. Tekst w oknie komunikatu można odpowiednio sformatować
Tablice statyczne i dynamiczne
Do tej pory pracowaliśmy z tablicami statycznymi. Tablica statyczna jest tablicą o określonej wielkości. Wielkość tablicy statycznej trzeba znać z góry i zadeklarować ją za pomocą instrukcji Dim. Na przykład instrukcja Dim Owoce (10) as string deklaruje tablicę statyczną o nazwie owoce, która może zawierać nie więcej niż 11 elementów (przy liczeniu od zera). Teraz zastanówmy się, co zrobić, jeśli nie wiadomo dokładnie, ile dana tablica będzie zawierać elementów. Gdy program tworzy tablicę na podstawie informacji pobranych od użytkownika, liczba wprowadzonych danych może być różna przy każdym wykonaniu programu. Powstaje zatem problem, w jaki
riogramowanie w Acces
sposób zarezerwować odpowiednią wielkość pamięci na wprowadzone dane, ustalisz tablicę o większej liczbie elementów, niż potrzebujesz, to zarezerwuj dużo pamięci komputera. Instrukcja Dim rezerwuje pamięć dla całej tablicy względu na to, czy jest ona w całości wypełniona. Ponieważ chodzi o uzyshi blicy o zmieniającej się liczbie elementów, mamy tu do czynnienia z pojęciertl namiczności. Deklarując tablicę dynamiczną w Visual Basicu, nie musisz old z góry jej wielkości. Wielkość tablicy dynamicznej może się zmieniać w toku u nywania programu. Ustawienie wyjściowe Visual Basica powoduje, że tablii statyczne.
Tablice statyczne
Tablica statyczna zawiera z góry określoną liczbę elementów. Liczba elemj w tablicy statycznej nie zmieni się po zadeklarowaniu tej tablicy.
Jeśli chcesz zadeklarować tablicę dynamiczną, nie wpisuj żadnej |jJ w nawiasie po nazwie tablicy:
Dim Owoce( ) As String ■
Powyższa instrukcja deklaruje tablicę dynamiczną o nazwie owoce. Wielko*
blicy jest nie znana (zob. - pusty nawias). Zanim skorzysta się z tablicy dynamij
wdanej procedurze, trzeba użyć instrukcji ReDim, która informuje Visual H
o liczbie elementów w tablicy. Instrukcja ReDim może być stosowana w prom
dowolną liczbę razy. ReDim w języku polskim oznacza - „Zmień rozmiar tablicy1!
pomocą instrukcji ReDim można zmienić rozmiar tablicy tyle razy, ile wymagał
program. Teraz przekonamy się, jak korzystać z tablic dynamicznych w procedj
1.
Dodaj nowy moduł i wpisz w nim następującą procedurę:
Sub DynArray()
Dim licznik As Integer Dim mój zbiór() As Integer 'zadeklaruj tablicę dynamiczną ReDim mój zbiór(5) ' wyznacz początkowy rozmiar tablicy Dim dane As String 1 dodaj dane do tablicy For licznik = 1 To 5
mójzbiór(licznik) = licznik + 1
dane = dane & mójzbiór(licznik) & Cni(13) Next
' zmień wymiary tablicy i zachowaj poprzednie dane
d
K
Sti
Re
VBA.
v Access 2000
dane. Jeżeli serwujesz za tablicy, bez izyskanie ta->ojęciem dy-isz określać toku wyko-i tablice są
elementów Inej liczby
'ielkość ta-'namicznej iual Basic programie iblicy". Za maga tego ocedurach
155
Praca z tablicami
' tablica zmieści teraz 10 elementów
ReDim Preserve mój zbiór(10)
'podaj dane dla nowych elementów tablicy
For licznik = 6 To 10
mój zbiór(licznik) = licznik * licznik
dane = dane & mój zbiór(licznik) & Chr(13) Next licznik MsgBox dane For licznik = 1 To 10
MsgBox mój zbiór(licznik) Next licznik End Sub
W procedurze DynArray polecenie Dim mój zbiór o as integer deklaruje dynamiczną tablicę o nazwie mój zbiór. Polecenie Dim deklaruje tablicę, ale nie przypisuje jej jeszcze pamięci. Pierwsze polecenie ReDim określa początkową wielkość tablicy i rezerwuje 10 bajtów pamięci na przechowanie jej pięciu elementów. Jak pamiętamy, każda liczba całkowita (typ danych integer) wymaga 2 bajtów, zatem 5 elementów * 2 bajty = 10 bajtów. Pętla For...Next wypełnia tablicę mój zbiór danymi i wpisuje elementy tej tablicy do zmiennej dane. Gdy Visual Basic uruchamia pętlę, wartość licznika równa się 1. Pierwsza instrukcja w pętli:
itiójzbiór (licznik) = licznik +1
przypisuje wartość 2 pierwszemu elementowi tablicy - mój zbiór (l) = 2 (licznik + i). Druga instrukcja w pętli:
dane = dane & mój zbiór(licznik) & Chr(13)
zapisuje wartość bieżącego elementu tablicy mój zbiór oraz naciśnięcie klawisza Enter (chr (13)) w zmiennej dane. Instrukcje w pętli są wykonywane pięć razy.
Visual Basic umieszcza każdą nową wartość w zmiennej dane i wykonuje następne polecenie:
Redim Preserve mój zbiór(10)
Polecenie ReDim zmienia rozmiar tablicy. Tablica może przechowywać teraz nie pięć, lecz dziesięć elementów. Zwróć uwagę na słowo kluczowe Preserve. Gwaran-
156
Programowanie w
Access pra
tuje ono, że po zmianie wielkości tablicy nie stracisz wpisanych uprzednio dar l?i Jeśli pominiesz słowo Preserve, to nowa tablica będzie pusta. Druga pętla foJ przypisuje wartości szóstemu, siódmemu, ósmemu, dziewiątemu i dziesiątenfl mentowi tablicy mój zbiór. Tym razem wartości nowych elementów są otrgB z iloczynu (licznik * licznik).
Deklaracja tablic
Tablice muszą być zadeklarowane przez instrukcję Dim lub ReDim, ^ mogły być wykorzystane przez procedurę. Oznacza to, że nie można przypisaćB tości elementowi tablicy, dopóki nie zostanie zadeklarowana tablica.
Funkcje typu Array
Tablicami można manipulować za pomocą specjalnych funkcji Visual M takich jak: Array, isArray, Erase, LBound oraz tBound. Chociaż funkcje teM zbyt często używane przez początkujących programistów, warto poznać kilka kro* przykładów ich zastosowania.
Funkcja Array
Funkcja Array umożliwia utworzenie tablicy w trakcie wykonywania kodul cedury bez konieczności zadeklarowania tablicy. Funkcja ta zawsze zwraca tal danych typu variant. Korzystając z tej funkcji, można szybko umieścić serię wan na liście danych. Procedura Autoinfo, podana poniżej, tworzy jednowymiarową■ cę o nazwie auto, która zawiera trzy elementy.
1. Wpisz w dowolnym module podaną poniżej procedurę Autoinfo:
Option Base I
Sub Autoinfo()
Dim auto As Variant
auto = Array("Ford", "Czarny",
MsgBox auto(2) & " " & auto(l) auto(2) = "4-drzwiowy"
MsgBox auto(2) & " " & auto(l) End Sub
'1999")
& auto(3)
& auto(3)
Access 2000 Praca z tablicami
157
Funkcja
IsArray
Ta wbudowana funkcja Visual Basica umożliwia sprawdzenie, czy dana zmienna jest tablicą Funkcja isArray zwraca wartość Prawda (True), jeśli zmienna jest tablicą, i wartość Fałsz (False), jeżeli zmienna nią nie jest. Sprawdź tę funkcję według przykładu podanego poniżej. 1 Wpisz w module kod procedury CzyToisArray podany poniżej:
Sub CzyToisArray ()
'zadeklaruj tablicę dynamiczną Dim NazwyTabel() As String Dim liczbaTabel As Integer Dim licznik As Integer Dim baza As DAO.Database
Set baza = CurrentDb
'policz, ile tabel znajduje się w otwartej bazie danych
liczbaTabel = baza.TableDefs .Count
'określ dokładny rozmiar tablicy
ReDim NazwyTabel(0 To liczbaTabel)
'wpisz i pokaż nazwy tabel
For licznik = 0 To liczbaTabel - 1
NazwyTabel(licznik) = baza.TableDefs(licznik).Name
Debug.Print NazwyTabel(licznik) Next licznik
'sprawdź, czy to naprawdę jest tablica If IsArray(NazwyTabel()) Then
MsgBox "Zmienna NazwyTabel () jest tablicą."
End If End Sub
J
■
Funkcja Erase
Jeśli chcesz usunąć dane z tablicy, to możesz skorzystać z funkcji Erase. Funkcja
ta wymazuje wszystkie dane z tablic statycznych i dynamicznych. Przy usuwaniu da-
ych z tablicy dynamicznej zwalniana jest również pamięć przeznaczona na przecho-
wvwanie tych elementów tablicy. Jeśli program ma ponownie odwołać się do tablicy
lynamicznej, to należy użyć instrukcji ReDim i określić rozmiar tablicy. Poniższy
158
Programowanie w Acci
przykład ilustruje sposób, w jaki można usunąć dane w przygotowanej wcześniej procedurze uiubioneMiasta.
1. Wpisz kod procedury UlubioneMiasta3 pocany poniżej:
tablicy
1 zacznij numerację tablicy od 1 Option Base I
Sub UlubioneMiasta3()
'zadeklaruj tablicę
Dim Miasta(1 To 5) As String
'przypisz wartości elementom tablicy
Miasta(1) = "Warszawa"
Miasta(2) = "Kraków"
Miasta(3) = "Katowice"
Miasta (4) = "Gdańsk"
Miasta(5) = "Poznań"
'pokaż wszystko, co zostało wpisane
MsgBox Miasta(1) & Chr(13) & Miasta(2) & Chr(13) _
& Miasta(3) & Chr(13) & Miasta(4) & Chr(13) _
& Miasta(5) Erase Miasta 'pokaż zawartość tablicy MsgBox Miasta(1) & Chr(13) & Miasta(2) & Chr(13) _
& Miasta(3) & Chr(13) & Miasta(4) & Chr(13) _
& Miasta(5) End Sub
Po usunięciu elementów tablicy przez funkcję Erase okno komunikatu
puste.
V
,
w
I
Funkcje LBound i UBound
Funkcje LBound oraz UBound zwracają liczby całkowite odpowiadające i górnemu zakresowi tablicy. Poniżej podano jeszcze jedną modyfikację pr< ulubioneMiasta4. Znajdziesz w niej przykład użycia obu tych funkcji.
1. Wpisz kod procedury uiubioneMiasta4 podany poniżej:
Sub UlubioneMiasta4()
'zadeklaruj tablicę
—^^m w Access 2000 |
Praca z tablicami 159 |
|
|
|
)licy Miasta |
Dim Miasta(1 To 5) As String |
|
||
|
'przypisz wartości elementom tablicy |
|
||
|
Miasta (1) = "Warszawa" |
|
||
|
Miasta(2) = "Kraków" |
|
|
|
|
Miasta(3) = "Katowice" |
|
|
|
|
Miasta(4) = "Gdańsk" |
|
|
|
|
Miasta(5) = "Poznań" |
|
|
|
|
'pokaż wszystko, co zostało wpisane |
|
|
|
|
MsgBox Miasta(1) & Chr(13) & Miasta(2) & Chr(13) _ |
|
|
|
|
& Miasta(3) & Chr(13) & Miasta(4) & Chr(13) _ |
|
|
|
|
& Miasta(5) |
|
|
|
|
'poka granicę tablicy |
|
|
|
|
MsgBox "Dolny zakres tablicy wynosi " & LBound(Miasta) & "." |
|
|
|
|
MsgBox "Górny zakres tablicy wynosi " & UBound(Miasta) & "." |
|
|
|
|
End Sub |
|
|
|
|
Przy sprawdzaniu dolnego i górnego zakresu tablicy dwuwymiarowej |
|
|
|
|
w funkcjach LBound i UBound należy podać numer wymiaru - 1 dla pierwszego wymi- |
|
|
|
|
aru, 2 dla drugiego. Aby sprawdzić dolny i górny zakres tablicy dwuwymiarowej, dopisz podane poniżej instrukcje na końcu przygotowanej w tym rozdziale procedury Wymiana |
|
|
|
|
|
|
||
|
|
):■ |
||
|
(w wierszach poprzedzających słowa End sub). |
|
|
|
|
MsgBox "Dolny zakres (pierwszy wymiar) tablicy wynosi " |
|
|
|
|
& LBound(Waluta, 1) & "." |
|
|
|
|
MsgBox "Górny zakres (pierwszy wymiar) tablicy wynosi " |
|
|
|
nikatu będzie |
& UBound(Waluta, 1) & "." |
|
|
|
|
MsgBox "Dolny zakres (drugi wymiar) tablicy wynosi " |
|
|
|
& LBound(Waluta, 2) & "." |
|
|
|
|
|
MsgBox "Górny zakres (drugi wymiar) tablicy wynosi " |
|
|
|
|
& UBound(Waluta, 2) & "." |
|
|
|
jące dolnemu |
|
|
|
|
ję procedury |
|
|
|
|
|
Błędy w tablicach |
|
|
|
|
Pracując z tablicami, nietrudno się pomylić. Najczęściej spotykany błąd „Indeks |
|
|
|
|
poza zakresem" (Subscript out of range) jest przedstawiony na rysunku 1.31. |
|
|
|
jjr w^'
160
Programowanie w Access
Mii it:» (rfl Vi-.ua! Ii )*ii
Run-b'me error '9": Subscript out of range
Rysunek 1.31. Ten błąd został spowodowany próbą przypisania wartości do nieistniejącego elementu tablicy
Komunikat ten pojawia się przy próbie odwołania się do elementu, który j duje się poza zadeklarowanym wymiarem tablicy. Na przykład, gdy zadeklarujesz! blicę jednowymiarową o sześciu elementach i próbujesz przypisać wartość ósir elementowi tablicy, Visual Basic wyświetla komunikat o błędzie informujący o użjj indeksu spoza zakresu tablicy. Gdy otrzymasz taki komunikat, najlepiej kliknij [ cisk Analizuj program (Debug) wówczas Visual Basic zaznaczy wprocedi wiersz, w której zaistniał błąd (zob. rysunek 1.32). Sprawdź deklarację tabl i odpowiednio zmień numer indeksu w nawiasie w zaznaczonym wierszu proceduJ
Błąd: „Indeks poza zakresem" bardzo często występuje w różnego rodzaju| tlach. Podana poniżej procedura zoo ilustruje właśnie taką sytuację. Instrukcja wp ma być wykonywana do momentu anulowania przez użytkownika okna dialogowej W czasie wykonywania tej procedury, gdy licznik wyniesie 4, Visual Basic nie 1 mógł znaleźć czwartego elementu w trzyelementowej tablicy i na ekranie pojawi] komunikat o błędzie. Zmodyfikowana procedura zco2 pokazuje, jak za pomocąonj wionych wcześniej funkcji Visual Basica - LBound i ubound - możesz uniknąć t dów wynikających z odwołania się do nie istniejącego elementu tablicy.
1. Wpisz w module procedury zooi oraz zoo2 podane poniżej:
Sub Zool()
' ta procedura wywołuje komunikat "Indeks poza zakresem" Dim zoo (3) As String Dim i As Integer Dim wpis As String i = 0 Do
i = i + 1
wpis = InputBox("Wpisz nazwę zwierzęcia:"!
zoo (i) = wpis
w Access 2000
Praca z tablicami
161
i tniejącego
, który znaj-:klarujesz ta-ość ósmemu ący o użyciu kliknij przy-i procedurze ację tablicy >rocedury.
rodzaju pę-kcja w pętli ialogowego. z nie będzie : pojawi się mocą omó-niknąć błę-
Loop Until wpis = " " End Sub
Sub Zoo2 ()
■ ta procedura unika komunikatu o błędzie "Indeks poza zakresem' Dim zoo(3) As String Dim i As Integer Dim wpis As String i = 1 Do While i >= LBound(zoo) And i <= UBound(zoo)
wpis = InputBox("Wpisz nazwę zwierzęcia:")
If wpis = "" Then Exit Sub
zoo(i) = wpis
i = i + 1
Loop
For i = LBound(zoo) To UBound(zoo)
MsgBox zoo(i) Next End Sub
'■RozOl-Taiihrr (Code}
(General)
H Zoo1
SubZoo10
'la procedura wywołuje komunikat "Indeks poza zakresem"
Dim zoo(3) As String
Dim i As Integer
Dim wpis As String
i = 0
Do i = i + 1
wpis = InputBoxfWpisz nazwę zwierzęcia:11) zoo(i) = wpis Loop Until wpis = "" End Sub
R ysunek 1.32. Jeśli klikniesz przycisk Debug w odpowiedzi na komunikat o błędzie, Visual Basic zaznaczy wiersz, w którym pojawił się błąd
Innym częstym błędem, występującym podczas pracy z tablicami jest: „Niezgodność typów" (ang. Type mismatch). Aby uniknąć go należy zapamiętać, że każdy element w tablicy musi być zgodny z typem zadeklarowanej tablicy. Jeśli spróbujesz
162
Programowanie w Access^B
przypisać do tablicy zmienną lub wartość, która jest innego typu niż typ ;M zadeklarowany instrukcją Dim, to otrzymasz ten błąd. Aby przechowywać wtifl dane różnych typów, zadeklaruj tablicę jako variant.
Użycie ParamArray z tablicami
P<
EO
\
!
Wcześniej
z tego rozdziału dowiedzieliśmy się, że procedurom i funkcjonj
na
przekazywać pewne wartości w postaci argumentów obowiązkowych
lub opcji nych.
Jeżeli przekazywany argument procedury (lub funkcji) jest
niekoniecaH jego
nazwę należy poprzedzić słowem kluczowym optional.
Powstaje
jednaki blem,
co zrobić, jeżeli z góry nie wiadomo, ile argumentów będzie
przekazywał Stosując słowo kuczowe ParamArray, można przekazać
do procedur lub funkcji blicę
składającą się z dowolnej liczby argumentów. Klasycznym
przykładem jefl dawanie
liczb. Raz chcemy dodać dwie liczby, trzy, a jeszcze innym razem
piętml Następująca
funkcja oblicza sumę dowolnej liczby cyfr. Funkcja ta rozpoczynasl
deklaracji
tablicy parametrów o nazwie MojeLiczby. Zwróćmy uwagę, na u|
słowa
kluczowego ParamArray. Tablica musi być zadeklarowana jako tablica)
variant.
Ponieważ
dla parametru typu ParamArray nie określono w poniższym kładzie
typu danych, parametr ten jest domyślnie zadeklarowany jako
variant.
1. Wpisz w module następującą funkcję:
Function DodajLiczby(ParamArray MojeLiczby !)) As Single Dim suma As Single Dim liczba As Variant
For Each liczba In MojeLiczby
suma = suma + liczba Next
DodajLiczby = suma End Function
2. Aby wypróbować wpisaną powyżej funkcję, otwórz okno Instrukcje I średnie i wpisz następujące polecenie:
?DodajLiczby(l, 22, 3, 24, 8, 34)
Po naciśnięciu klawisza Enter Visual Basic dodaje liczby podane wnai i podaje wynik 92. Liczba argumentów w nawiasie jest nieograniczona. Aby d inną liczbę cyfr, wpisz dowolne liczby w nawiasie i naciśnij Enter. Argumentyl
A ccess 2000
t yp tablicy ić w tablicy
:cjom moż-b opcjonal-lieczny, to ednak pro-zywanych. funkcji ta-:m jest do-piętnaście. yna się od na użycie blica typu zym przy-it.
cji oddzielone są od siebie przecinkiem lub średnikiem w zależności od ustawień regionalnych w Panelu sterowania.
Podsumowanie
Z tego podrozdziału dowiedziałeś się, w jaki sposób można pisać procedury VBA, wymagające wielu zmiennych. Pracowałeś tutaj z przykładowymi procedurami, które ilustrowały sposób deklaracji jedno- i dwuwymiarowych tablic. Poznałeś również różnicę pomiędzy tablicą statyczną i dynamiczną. Na końcu tego podrozdziału zapoznałeś się z pięcioma wbudowanymi funkcjami VBA, które są często używane z tablicami. Teraz znasz już wszystkie struktury kontrolne (instrukcje warunkowe, pętle i tablice), które umożliwiają tworzenie inteligentnych procedur. Z następnego podrozdziału dowiesz się, w jaki sposób można wykorzystać kolekcje obiektów do manipulacji dużymi porcjami danych. Korzystając z wiedzy nabytej w tym rozdziale, możesz przystąpić do pisania procedur, umożliwiających zautomatyzowanie tych czynności, co do których przed rozpoczęciem lektury tej książki, być może, byłeś przekonany, że jest to niemożliwe.
' . bezpo-
lawiasie y dodać ty funk-
K olekcje obiektów i klasy
Oprócz korzystania z obiektów wbudowanych w aplikację Microsoft Access, Visual Basic umożliwia tworzenie własnych obiektów i kolekcji obiektów oraz definiowanie dla nich właściwości i metod. W kolejnych podrozdziałach zostały opisane zasady pracy ze zbiorami obiektów. Zajmiemy się także modułem klasy, który jest konieczny w procesie tworzenia własnych obiektów.
Terminologia
Przed lekturą i praktycznymi ćwiczeniami z tego podrozdziału warto zapoznać się z nowymi pojęciami, które pomogą w przyswojeniu prezentowanego dalej materiału.
Termin |
Znaczenie |
Kolekcja |
Obiekt zawierający zestaw powiązanych ze sobą obiektów. |
Klasa |
Definicja obiektu, która obejmuje jego nazwę, właściwości, metody i zdarzenia. Klasa jest szablonem, z którego tworzy się obiekty, tzw. instancje klasy. |
Instancja |
Obiekt utworzony z klasy, która zawiera jego definicję. Tworząc instancję klasy, tworzy się nowy obiekt mający wszystkie cechy zefiniowane przez klasę. |
Moduł klasy |
Zawiera definicję klasy oraz jej właściwości, metody i zdarzenia. Procedury VBA wpisane w module klasy stają się właściwościami i metodami obiektu. |
Moduł standardowy |
Zawiera procedury Sub i Function, które są dostępne dla innych procedur VB A i nie są związane z żadnym innym obiektem. |
Moduł formularza |
Zawiera instrukcje VBA dla wszystkich procedur zdarzeń, które występują w określonym formularzu lub jego formantach. |
Zdarzenie |
Czynność rozpoznawana przez obiekt (np. kliknięcie myszą czy naciśnięcie klawisza), dla której można zdefiniować odpowiedź. |
166
Programowanie w Accel
|
|
Termin |
Znaczenie |
|
Zdarzenia mogą być spowodowane działaniem użytkownika, poi ceniami języka Visual Basic; lub działaniem systemu. |
Procedura zdarzeń |
Procedura wykonywana automatycznie w odpowiedzi na zdarzJ zainicjowane przez użytkownika, instrukcje programu lub systeJ |
Praca z kolekcjami obiektów
Zbiór podobnych obiektów określa się nazwą kolekcji. Na przykład baza ( Microsoft Access zawiera zbiór (kolekcję) tabel, a każda tabela mieści kolekcji oraz indeksów. W programie Microsoft Excel wszystkie otwarte skoroszyty nale kolekcji Workbooks, a wszystkie arkusze kalkulacyjne są składowymi kolekcji \ sheets. W programie Microsoft Word wszystkie otwarte dokumenty są skł; kolekcji Documents, a wszystkie akapity w danym dokumencie tworzą kolekcjęi| graphs. Kolekcje są obiektami zawierającymi inne obiekty.
Bez względu na to, z jaką kolekcją masz do czynienia, możesz:
1. Odwołać się do konkretnego elementu kolekcji poprzez jego indeks Na przykład, aby pobrać nazwę pierwszego pola na formularzu Klienci,] następującą instrukcję w oknie Instrukcje bezpośrednie:
?Forms!Klienci.Controls(1).name
2. Obliczyć liczbę elementów w danej kolekcji za pomocą właściwości cou przykład po wpisaniu w oknie Instrukcje bezpośrednie polecenia:
?Forms!Klienci.Controls.Count
VBA poda liczbę elementów znajdujących się na formularzu Klienci.
3. Dodać nowe elementy do danej kolekcji za pomocą metody Add. Następi przykład tworzy w oknie Instrukcje bezpośrednie nową kolekcję o nazwij jaKolekcja i dodaje do niej dwa elementy:
set mojaKolekcja = New Collection mojaKolekcja.Add "pierwszy element" mojaKolekcja.Add "drugi element"
w Access 2000
Kolekcje obiektów i klasy
Następująca instrukcja zwraca liczbę
lekcja: v
w utworzonej kolekcji
167
mojaKo-
?mojaKolekcja.Count 2
wpisz
następujące
polecenia:
Aby
pobrać
nazwy elementów kolekcji, wpi
baza danych kolekcję pój ty należą do ekcji Work-
składowymi k
PmojaKolekcja. Item(1) ? inojaKolekcja (2)
4. Przeglądać elementy kolekcji za nnm ■■
usunąć
wszystkie elementy z koS? ?f
*"
Each"N-t.
Na przykład, aby
bezpośrednie
następującą
pęt," m°3aKole^
wplsz
w oknie Instrukcje
cji
lub
nazwę.
ici,
wpisz
wpisznastępującą instrukcję w okme Instrukcj
?mojaKolekc ja. Count
Enter zbIór
PUSta'
o unt. Na
typujący
wie mo-
W trakcie pisania procedur lekcji obiektów. Z poprzednich ^aunien wm wac zwieloma danymi za pomocą statycznych oiekcje mają wbudowane właściwości i metody lekcji oraz dodawania elementów do ' ' " " cować z kolekcjami niż z tablicami rrac rówmeż martwić się o zarządzanie pamięcią.
Deklarowanie własnej kolekcji
m°Żemy
Praco"
u eleme"tów
ko-
°biektów' ™ trzeba
czowych Dim oraz New, tak jak podano poniżej:
DimnazWa_kolekcji As New Collection
P°m°Cą dwÓch słów klu"
168
Programowanie w Aci
D odawanie elementów do kolekcji
Po utworzeniu kolekcji składowe dodajemy za pomocą metody Add.: kolekcji nie muszą być tego samego typu danych. Składnia metody Add jest nai ca:
obiekt.Add item, key, before, after
Metoda Add posiada dwa elementy obowiązkowe - obiekt oraz item, jest nazwą własnej kolekcji, tą samą której użyłeś w deklaracji obiektu, itemji rażeniem dowolnego typu, które określa dodawany do kolekcji element. Keyj| kątowym ciągiem znaków, który identifikuje dany element w kolekcji.
Pozostałe dwa argumenty, chociaż nie są obowiązkowe, okazują się | przydatne. Tym argumentom zostają automatycznie przypisane liczby od 1 Zamiast korzystania z automatycznie przypisanych liczb (1,2,3 itp) można i tom tym przypisać ciąg znaków. Przykładowo w kolekcji tabel możesz użyćj tabeli jako nazwy klucza. Jeśli chcesz wybrać odpowiednią osobę z kolekcji; ników, to możesz użyć numer dowodu osobistego pracownika jako kluczj chcesz określić względne położenie danego elementu w kolekcji, to skorzystj z argumentu before, albo after (ale nigdy razem). Argument before określaj przed którym nowy element ma być umieszczony, podczas gdy argument afteĄ obiekt, po którym dodawany element ma zająć miejsce.
Procedura NowiPracownicy podana poniżej deklaruje własną kolekcję oj
kolPracownicy.
Sub NowiPracownicyO
' zadeklaruj kolekcję pracowników
Dim kolPracownicy As New Collection
1 zadeklaruj zmienną, która będzie przechowywać
1 elementy kolekcji
Dim prac As Variant
1 dodaj trzech nowych pracowników do kolekcji
With kolPracownicy
.Add Item:="Jan Kowalski", Key:="128634456"
.Add Item:="Maria Walewska", Key:="223998765"
.Add Item:="Piotr Wilk", Key:="120228876", Before:=2
End With
' podaj listę członków kolekcji
For Each prac In kolPracownicy
w Access 2000
Kolekcje obiektów i klasy
D ebug.Print prac
i d. Składowe ;st następują-
Ltem. Obiekt tem jest wy-Key jest uni-
L się bardzo d 1 wzwyż. ia argumen-użyć nazwy ccji pracow-ucza. Jeżeli rzystaj albo •eśla obiekt, ifter określa
ję o nazwie
Next
MsgBox "W kolekcji znajduje się " &
kolPracownicy.Count & - pracowników."
End Sub
Zmienna użyta w pętli For...Each musi być zadeklarowana jako variant lub
Obiekt.
Po uruchomieniu powyższej procedury niewątpliwie zauważysz, że pracownicy sąwyrmemen, w innej kolejności niż ta, w której zostali dodani do kolekcji w kodzie
Pr°C
7ptierlt0
!POWOd°Wane
UŻyciem
opcjonalnego argumentu before
przy
nazwisku
P.otra Wilka. Argument ten zleca umieszczenie Piotra przed drugim
czło
niem
kolekcji. 6
Usuwanie elementów z kolekcji
Usuwanie elementów z kolekcji jest równie proste jak dodawanie nowych elementów do kolekcji. Aby usunąć dowolny element z własnej kolekcji obiektów należy skorzystać z metody Remove o następującej składni:
obiekt.Remove item
Obiekt jest nazwą własnej kolekcji, tą samą której użyłeś w deklaracji obiektu hm jest wyrażeniem dowolnego typu, które określa usuwany z kolekcji element.
Aby zademonstrować proces usuwania elementu z kolekcji, zmodyfikujemy teraz sporządzoną w poprzednim podrozdziale procedurę NowiPracownicy.
i. Dodaj następujące wiersze kodu przed słowami kluczowymi End sub:
' usuń trzeci element z kolekcji
kolPracownicy. Remove (3)
MsgBox "W kolekcji pozostało " s
kolPracownicy.Count & " pracowników."
2 . Uruchom zmodyfikowną procedurę NowiPracownicy. Zmiana indeksu w kolekcji
Gdy dany element zostanie usunięty z kolekcji, wówczas automatycznie zmienia się numeracja pozostałych elementów. Dlatego też, aby usunąć wszystkie obiekty
170
Programowanie w Acces
z kolekcji, możesz użyć liczby 1 jako argumentu indeksu, tak jak w poniższym j kładzie:
Do While mojaKolekcja.Count > 0
mojaKolekcja.Remove Index:=l Loop ■...., ' ' ' :■:■■*: ' ' ' ' ■ . . ... ■. . • '..
Wstaw moduł czy moduł klasy
W oknie edytora Visual Basic znajdują się dwa polecenia dotyczące wstanj modułu w menu Wstaw. Jedna z opcji tego menu nazywa się Moduł, a druga I klasy. Teraz zastanowimy się, czym jest moduł klasy i kiedy należy z niego koi O ile moduł standardowy zawiera ogólne procedury typu sub oraz Function, n klasy używa się do tworzenia definicji obiektu niestandardowego oraz jego i wości i metod. Innymi słowy, z modułu klasy korzystamy podczas konstruoi własnych obiektów.
Tworzenie własnych obiektów
Aby utworzyć nowy, niestandardowy obiekt VBA, należy najpierw wstaiq wy moduł o nazwie moduł klasy. Jednakże, zanim przystąpisz do budowani! snych obiektów, nie zaszkodzi zapoznać się z pojęciem klasy. Jeżeli zajrzysz i minologii podanej na początku tego podrozdziału, to dowiesz się, że klasa jest d w rodzaju szablonu, według którego tworzy się obiekty. Często klasę obiektu p nuje się do foremki na ciastka. Tak jak foremka (ang. cookie cutter) nadaje J ciastku, tak definicja obiektu jest niczym innym jak formą określającą, jak danyA ma wyglądać i jak się ma zachowywać. Zanim będzie można skorzystać z danejfl obiektu, należy najpierw utworzyć nowe wystąpienie obiektu (ang. new instana^M class). Instancje obiektu są ciasteczkami.
Każde nowe wystąpienie klasy obiektu posiada właściwości i metody zdefl wane przez jego klasę, podobnie jak ciasteczka wycięte tą samą foremką majątaiH| kształt. Po utworzeniu nowego wystąpienia klasy obiektu możesz zmienić jego^B ściwości, niezależnie od innych wystąpień tej samej klasy, podobnie jak możesz^H korować inaczej każde z ciasteczek wyciętych tą samą foremką.
Moduł klasy umożliwia definiowanie właściwości i metod charakteryst; dla własnych obiektów. Właściwość jest atrybutem obiektu, który określa jego charakterystyczne, takie, jak: rozmiar, kształt, położenie na ekranie, kolor, ty Metoda jest czynnością, którą dany obiekt jest w stanie wykonać.
ie w Access 2000 ©niższym przy-
Kolekcje obiektów i klasy
ce wstawiania druga Moduł ?go korzystać. tion, modułu jego właści-onstruowania
s,ę
do utworzenia procedur typu sub
lub
Z' T
T CW°rZenie
metod
sPr°wadza
klasy.
Po skonstruowaniu własnego obZuZ
moTi
T™"^ rÓWnieŻ
W
™d^
tak
jak z innych wbudowanych obiektów M W
m°ŻeSZ
Z
]
obiektu
poza projekt VBA
fcinn^Ł^T
"T* ^^^
dana-
dla
Aplikacji. y
aplikacji, które wykorzystują jezyk
Visual
Praca w module klasy
Ob,* «.,c«lk
»isko
oraz Pa„ja.
Oprócz „ich
będA
rów„ież
S/!:, f "ffikator-
^«. »-
bieżącej
pensji. e
r<»™ie2
miał metodę służącą do modyfikacji
. W oknie ed„„ra Visua, Basic wybierz Wstaw » Mod™, ^
wstawić no-owania wła-'zysz do ter-ajest czymś ektu porów-daje kształt dany obiekt danej klasy 'ance of the
y zdefinio-U'ą ten sam jego wła-ażesz ude-
stycznych
?go cechy
tytuł itp.
Przypisywanie nazwy modułowi klasy
Jedyną właściwością modułu kiedy definiujesz^,
jaką chcesz
Deklaracje zmiennych
. » --, •;- «-». ^zuy rodzaj infiamac^SS J' Zmienn^h' ^re
wtworzonym
obiekcie, powinnien Posldać^n
^ zamierza^
przechowywać
przy
użyciu słowa kluczowego Private
stwo,"
Zmien"ą-
Zmienne
deklaruJe
^
,M
wewnątrz
modułu C^^"fl^lądM*M
obiektu
może manipulować tylko jego udoltonionv
T™ k°rZystaJ^
* danego
tomiast
zmienić samego obiektu Ponieważ! *™
Włascmościa™,
"ie
może na-
wlaściwości,
do które/bedą stodwoC ć inn
^
ZmieMeJ
^^ ^^
naz^
wać
nazw znaczących, u^fi^SScH^^ ^
* ^
ściwości
obiektów każdemu, kto będzie musfał n^ PraWldł0Wą
^entifikacje wła-
nazwy
zmiennych poprzedza sie prefikem
m " Z *
* ***** ^J^e
Wpisz
następującą
deklaracje u góry okna Moduł klasy:
członkiem
klasy (ang. w,m^,
lariabl!) '
^ °ZnaCZa'
Że
da"a
Zmienna
Jest
172
Programowanie w AccessB
Option Explicit 'deklaracje
Private m_Nazwisko As String Private m_Imię As String Private m_Pensja As Currency Private m_Id As String
N
:
u
Zauważ, że nazwa każdej zadeklarowanej zmiennej rozpoczyna się
Pobieranie i ustawianie właściwości obiektu
Po utworzeniu zmiennych za pomocą słowa kluczowego Private pro utworzone poza modułem klasy nie będą w stanie bezpośrednio wpisy odczytywać danych przechowywanych w tych zmiennych. Aby inne moduły ( projektu mogły ustawić lub odczytać prywatne dane pracownika, należy doi modułu klasy cPracownik specjalne procedury Property.
W języku Visual Basic istnieją trzy typy procedur Property:
Property Let -jest to procedura, która ustawia wartość właściwości,
Property Get -jest to procedura, która zwraca wartość właściwości,
Property
Set
- jest to procedura podobna do procedury Let,
z
tą różnim
zamiast
zwykłych wartości (tekst, liczby) ustawia odwołanie do obiektu,
j
Procedury Property są odtwarzane, gdy trzeba pobrać lub ustawić właścij obiektu.
Procedura Property Get może mieć tę samą nazwę, co procedura
Let.
Najłatwiejsza w użyciu jest procedura Property Get. Teraz przekonamy] jaka jest składnia tych procedur. W procedurach Property można wyo następujące części:
• Deklarację, która zawiera nazwę właściwości i typ danych:
Property Get Nazwisko ( ) As String
Nazwisko jest nazwą właściwości, natomiast as string definiuje typ pr; wanych danych.
• Instrukcję przypisania w stylu procedury funkcji:
N azwisko = m_Nazwisko
Nazwisko jest nazwą właściwości, am_Nazwisko jest zmienną przechowującą wartość, którą chcesz pobrać lub ustawić. Zmienną m_Nazwisko należy zadeklarować ugory kartki modułu klasy przy użyciu słowa kluczowego Private.
Jeżeli przekazywana wartość uzyskana jest w wyniku kalkulacji, to wewnątrz procedur Property możesz umieścić polecenia VBA generujące daną wartość:
Property Get Honorarium ()
Honorarium = (Sprzedaż * Procent)-Zaliczka End Property
• Koniec procedur Property sygnalizuje użycie słów kluczowych End Property. Wczesne opuszczanie procedury typu Property
Podobnie jak słowa kluczowe Exit sub and Exit Function pozwalają na wcześniejsze opuszczenie procedur typu sub oraz Function, słowa kluczowe Exit Property umożliwiają szybkie wyjście z procedury Property. Po wyjściu z procedury Property program będzie kontynouwał odtwarzanie instrukcji znajdujących Się po instrukcji wołającej procedurę Property Get, Property Let lub Property Set.
Tworzenie procedur Property Get
Obiekt pracownik (cPracownik) posiada cztery właściwości, które mają być odczytywane przez procedury VBA wpisane w standardowym module o nazwie Praco-peracje. Korzystając z obiektu pracownika, będziemy chcieli odczytać jego numer, nazwisko, imię oraz pensję.
1. Wpisz w module klasy cPracownik, poniżej deklaracji zmiennych, następujące procedury Property Get:
Property Get Nr ( ) As Long
Nr = m_Nr End Property Property Get Nazwisko ( ) As String
Nazwisko = m_Nazwisko End Property
Property Get Imię ( ) As String
174
Programowanie w Ac<
I mię = m_Imię End Property
Property Get Pensja( ) As Currency
Pensja = m_Pensja End Property
Każdy rodzaj przechowywanych informacji posiada osobną procedurę p Get, która zwraca bieżącą wartość danej właściwości. Zwróćmy uwagę, że p Property Get są podobne do funkcji, gdyż tak jak funkcje zawierają ii przypisania. Jak pamiętamy, aby zwrócić pewną wartość z funkcji, należy przj nazwie funkcji.
Tworzenie procedur Property Let
Oprócz pobierania wartości zapisanych w zmiennych prywatnych przj procedur Property Get, należy przygotować procedury Property Let umożl przypisywanie nowych wartości tym zmiennym. Procedury Property Let ni definiować, jeżeli wartość przechowywana w zmiennej prywatnej ma być prze na tylko do odczytu. Obiekt cPracownik będzie posiadał cztery właściwości
zwisko, Imię i Pensja), dla których sporządzimy procedury Property Let, 1. Wpisz następujące procedury Property Let w module klasy cPracownik
Property Let Id(ref As String)
m_Id = ref End Property
Property Let Nazwisko(N As String)
m_Nazwisko = N End Property
Property Let Imię(I As String)
m_Imie = I End Property
Property Let Pensja(ByVal Pzł As Currency)
m_Pensja = Pzł End Property
\ccess 2000
Kolekcje obiektów i klasy
175
: Property procedury instrukcje
rzypisać ją
rzy użyciu )żliwiające nie trzeba rzeznaczo-
:i (id, Na-
lik:
Procedury Property Let wymagają co najmniej jednego argumentu, który określa wartość, jaką zamierzasz ustawić. Argument ten przekazywany jest najczęściej przez wartość, stąd też jego nazwa poprzedzona jest słowem kluczowym Byvai. Typ argumentu musi zgadzać się z typem danych zwracanych przez procedurę Property Get o tej samej nazwie. Procedury Property Let mają taką samą nazwę, jak procedury Property Get. Zwróć uwagę, że pomijając definicję procedury Property Let dla numeru pracownika, zdefiniowaliśmy Nr jako właściwość przeznaczoną tylko do odczytu (Read-only).
Typy procedur Property
Aby określić zasięg danej procedury Property, możesz umieścić słowo kluczowe Public, Private lub static przed nazwą procedury typu property. Na przykład:
Aby metoda była dostępna poza modułem klasy, procedurę należy poprzedzić słowem kluczowym Public. Składnia formatu jest następująca:
Public Property Get Imię ( ) As String
Aby procedura Property Get była dostępna dla innych procedur na poziomie modułu, należy użyć następującego formatu składni:
Private Property Get Imię ( ) As String
Aby zachować zmienne lokalne procedury Property Get pomiędzy procedurami, należy użyć następującego formatu składni:
Static Property Get Imię (
String
Jeżeli procedura Property nie jest poprzedzona słowem kluczowym Public lub private, procedura na ogół jest interpretowana jako Public. Jeżeli pominięto słowo kluczowe static, to wartości zmiennych lokalnych nie są zachowywane między odwołaniami do innych procedur.
Tworzenie metod obiektu
Oprócz właściwości obiekty posiadają zazwyczaj jedną lub więcej metod. Metoda jest czynnością, którą obiekt może wykonać. Metody wykonują operacje na danych przechowywanych w klasie obiektu. Metody tworzy się za pomocą znanych nam już z poprzednich podrozdziałów procedur typu sub lub Function. Tworzony w tym podrozdziale obiekt pracownik (cPracownik) ma jedną metodę, która umożli-
176
Programowanie w AcceB
wia obliczenie nowej pensji pracownika. Zakładamy, że pensję pracownika! powiększyć lub zmniejszyć o określony procent lub wskazaną kwotę.
1.
w mc Wpisz podaną poniżej procedurę typu funkcji w module klasy cPracownim
tego
lubv
Public Function KalkNowaPensja(typ As Integer, _ ObecnaPensja As Currency, kwota As Long) As Currency Select Case typ
Case 1 ' opcja procent
Dim Set
KalkNowaPensja = ObecnaPensja + ((ObecnaPensja + kwota) / J Case 2 ' opcja kwota
KalkNowaPensja = ObecnaPensja + kwota End Select
End Function
Publiczna funkcja KalkNowaPensja zdefiniowana w module klasy stajesij todą obiektu cPracownik. W celu obliczenia nowej pensji procedura VBA zze| modułu klasy musi przekazać trzy argumenty: typ, ObecnaPensja oraz kwota, ment typ określa typ kalkulacji. Typ l oblicza procentową zmianę pensji, zmienia pensję o wskazaną kwotę. Argument ObecnaPensja jest bieżącą pei cownika, natomiast argument kwota wskazuje liczbę, o którą należy zmienić pensję.
Metody klasy
Tylko
metody, które będą dostępne poza modułem danej klasy,
powinny
klarowane
jako Public, wszystkie pozostałe jako Private.
Metody wykonują pewne operacje na danych znajdujących się w danej Id
Jeśli
metoda musi zwrócić jakąś wartość, należy sporządzić
funkcję. W
nym
razie trzeba napisać procedurę typu sub.
zmi
Dii Dii
Tworzenie instancji klasy
ob
Po wpisaniu w module klasy niezbędnych dla aplikacji VBA procedur prJ Get, Property Let, procedur Sub lub Function należy sporządzić nową ins klasy, czyli własny obiekt. Aby utworzyć instancję klasy, należy zadeklaii w module standardowym zmienną obiektową, która będzie zawierała odwołani obiektu. Jeżeli nazwą klasy jest cPracownik, to nową instancję tej klasy możnai rzyć w następujący sposób:
Dim prac As New cPracownik
Z
w Access 2000 iwnika można
cownik:
:a) / 100)
staje się me-SA z zewnątrz kwota. Argu->ensji, typ 2 :ą pensją pra-denić bieżącą
vinny być de-
lej klasie. :. W przeciw-
llir Property
iwą instancję zadeklarować idwołanie do można utwo-
177
Kolekcje obiektów i klasy
Zmienna o nazwie prac będzie zawierała odwołanie do obiektu znajdującego się w module klasy cPracownik. Jeżeli zadeklarujesz zmienną obiektową ze słowem kluczowym New, to VBA utworzy obiekt i zarezerwuje odpowiednią ilość pamięci dla tego obiektu. Jednakże instancja tego obiektu powstanie dopiero, gdy odwołasz się do niego w kodzie procedury, przypisując wartość do jakiejś właściwości tego obiektu lub wywołując jedną z jego metod.
M ożesz również utworzyć instancję obiektu, deklarując zmienną obiektową ztypem danych reprezentującym obiekt klasy. Na przykład:
Dim prac As cPracownik Set prac = New cPracownik
W powyższym przykładzie pominęliśmy słowo kluczowe New w deklaracji zmiennej. Jeżeli nie użyjesz słowa kluczowego New ze słowem kluczowym Dim, to VBA zarezerwuje pamięć dla obiektu dopiero, gdy procedura będzie tego wymagać.
Uruchom teraz okno edytora Visual Basic.
Wybierz
Wstaw
=>
Moduł,
aby
dodać nowy niestandardowy moduł do swojej
aplikacji.
W oknie Właściwości zmień nazwę tego modułu na PracOperacj e.
Wpisz następujące deklaracje zmiennych u samej góry modułu pracoperacje,
poniżej Opcji Option Compare Database oraz Option Explicit:
Dim prac As New cPracownik
Dim CPracownicy As New Collection
Pierwsza instrukcja, podana powyżej, deklaruje zmienną obiektową o nazwie prac jako nową instancję klasy cPracownik. Druga instrukcja deklaruje własny zbiór obiektów o nazwie CPracownicy. W tym zbiorze będziemy przechowywać informacje o pracownikach.
Procedury zdarzeń w klasie modułu
Zdarzenie jest czynnością rozpoznawaną przez dany obiekt. Obiekty utworzone przez użytkownika reagują tylko na dwa zdarzenia - initialize oraz Terminate. Zdarzenia te są generowane przy tworzeniu lub usuwaniu danej instancji klasy.
Zdarzenie initialize występuje, gdy użytkownik tworzy nową instancję klasy, używając słowa kluczowego New (zob. poprzedni podrozdział). Ponieważ instrukcje
J
178
Programowanie w Acc
zawarte w procedurze zdarzenia initialize są wykonywane w pierwszej koi przed przypisaniem właściwości danemu obiektowi lub wywołaniem met obiektu, jest to dobre miejsce na zainicjowanie obiektów utworzonych zdan< Procedura zdarzenia class_initialize korzysta z następującej składni:
Private Sub Class_Initialize() [wpisz tu instrukcje, które mają być wykonane przy tworzeniu obie End Sub
Zdarzenie Terminate występuje, gdy zostaną usunięte z pamięci wszyst wołania do instancji danej klasy. Jest to dobre miejsce na wykonanie niezb czynności porządkowych. Zdarzenie to wpisuje się w module klasy według S2 przedstawionego poniżej:
Private Sub Class_Terminate()
[wpisz tytaj kod wykonujący czynności natury porządkowej] End Sub
Aby zwolnić zmienną obiektową z obiektu, należy użyć następującej instm
Set prac = Nothing
Przypisanie do zmiennej obiektowej Nc thing wywołuje procedurę zd^ o nazwie Terminate. Kod zawarty wewnątrz tej procedury zdarzenia jest wó wykonany.
Tworzenie interfejsu użytkownika
Wdrożenie obiektu cPracownik wymaga formularza, w którym będziemy wprowadzać i zmieniać informacje dotyczące pracownika.
W
oknie bazy danych kliknij przycisk Formularze,
następnie
uruchom
Utwórz
formularz w
widoku Projekt.
Zapisz formularz pod nazwą frmPensje.
Skorzystaj
z przybornika formantów,
aby umieścić w formularzu obiekty
stawione
na rysunku 1.33.
ess 2000
Kolekcje obiektów i klasy
: frmPensje: Formularz
:Lg
I . 2 ■ I • 3 ■ I • 4 ■ i ■ 5 • I ■ 6 ■ i ■ 7 • i ■'8■ i ■ 8 ■ i ■ 10 ■ I ■ 11 ■ i ■ 12 ■ i ■ ^±.
ktu]
I
:cji:
Rysunek 1.33. Formularz demonstrujący użycie własnego obiektu o nazwie cPracownik
. Ustaw według poniższej tabeli właściwości formantów umieszczonych
w formularzu:
Jed-
Obiekt / formant |
Właściwość |
Ustawienie |
Formularz frmPensje |
Tytuł (Caption) |
Pensje pracownicze |
Etykietal {label 1) |
Tytuł (Caption) |
Nazwisko |
Pole tekstu obok etykietki Nazwisko |
Nazwa (Name) |
TxtNazwisko |
Etykieta2 (label2) |
Tytuł (Caption) |
Imię |
Pole tekstu obok etykietki imię |
Nazwa (Name) |
Txtlmie |
180
Programowanie w Aco
O biekt / formant
Właściwość
Ustawienie
E tykieta3 (Iabel3)
Tytuł (Caption)
Pensja
P ole tekstu obok etykietki Pensja
Nazwa (Name)
TxtPensja
R amkal (Framel)
Tytuł (Caption)
Modyfikacja pensji
N iezwiązane pole tekstu w ramce zatytułowanej „Modyfikacja pensji'
Nazwa (Name)
TxtPodwyżka
Przycisk opcjil
Nazwa (Name) Tytuł (Caption)
OptProcent Procent (%)
0]
P rzycisk opcji2
Nazwa (Name) Tytuł (Caption)
OptKwota Kwota (zł)
R amka2 (Frame2)
Tytuł (Caption)
Zmień pensję
P rzycisk opcji3
Nazwa (Name) Tytuł (Caption)
OptWybrany
Wybranego
pracownika
P rzycisk opcji4
Name Tytuł (Caption)
OptWszyscy Wszystkich pracd ników
P ole listy
Nazwa (Name) Wysokość (Height) Szerokość (Width)
LboxOsoby
2,963cm
8,571cm
P rzycisk polecenial
Nazwa (Name) Tytuł (Caption)
CmdDodaj Dodaj
P rzycisk polecenia2
Nazwa (Name) Tytuł (Caption)
CmdZamknij Zamknij
P rzycisk polecenia3
Nazwa (Name) Tytuł (Caption)
CmdUaktualnij Uaktualnij pensijl
P rzycisk polecenia4
Nazwa (Name) Tytuł (Caption)
CmdUsuń
Usuń pracownika]
v Access 2000
Kolekcje obiektów i klasy
181
P o przygotowaniu formularza przedstawionego na rysunku 1.33 oraz przypisaniu formantom formularza właściwości podanych w tabeli powyżej należy sporządzić kilka procedur obsługi zdarzenia, które zareagują na takie czynności, jak kliknięcie my-
przycisku umieszczonego na formularzu lub odpowiednio załadują formularz.
. Uaktywnij okno Kod programu dla formularza pensje, wybierając Widok => Kod (View => Code).
U samej góry okna Kod programu wpisz deklaracje zmiennych:
Option Explicit
■ deklaracje zmiennch lioice As Integer [ Jim amount As Long
, Wpisz następującą procedurę obsługi zdarzenia userForm_initialize, aby unieruchomić niektóre przyciski formularza:
private Sub UserForm_Initialize ()
BtNazwisko.SetFocus
mdOaktualnij .Enabled = False -..Enabled = False
;boxOsoby. Enabled = False
framel.Enabled = False
framel. Value = 0
:raue2. Enabled = False
Frame2. Value = 0
txtPodwyzka. Enabled = False
-xtPodwyzka. Value = ""
End Sub
j, Wywołaj podaną w punkcie 7 procedurę obsługi zdarzenia user-Form_init'iaiize z procedury zdarzenia o nazwie Form_Load, wpisując następujący kod poniżej wpisanej już procedury:
private Sub Form_Load () Call UserForm_Initialize
End Sub
182
Programowanie w Aa
9 . Wpisz procedurę o nazwie cmdDodaj_ciick, aby dodać pracownika pracowników:
Private Sub cmdDodaj_Click() Dim strNazwisko As String Dim strlmię As String Dim curPensja As Currency
' Sprawdź poprawność wpisanych danych
If txtNazwisko.Value = "" Or txtlmie.Value = "" Or
txtPensja.Value = "" Then
MsgBox "Wpisz nazwisko, imię oraz pensję:
txtNazwisko.SetFocus
Exit Sub End If If Not IsNumeric(txtPensja) Then
MsgBox "Należy wpisać wartość pensji."
txtPensja.SetFocus
Exit Sub End If If txtPensja < 0 Then
MsgBox "Pensja nie może być ujemns." End If
En
da
,1 ;
mi
Pr
' przypisz wartości zmiennym strNazwisko = txtNazwisko strlmię = txtlmie curPensja = txtPensja
' uaktywnij przyciski i inne formanty cmdUaktualnij.Enabled = True cmdUsuń.Enabled = True lboxOsoby.Enabled = True Framel.Enabled = True Frame2.Enabled = True txtPodwyzka.Enabled = True txtPodwyzka.Value = "" lboxOsoby.Visible = True
Lt
■:;
1 zapisz dane w zbiorze CPracownicy
PracOperacje.Dodaj Pracownika strNazwisko, strlmię, curPensja
A ccess 2000 do zbioru
183
Kolekcje obiektów i klasy
1 uaktywnij pole listy lboxOsoby.RowSource = GetValues
1 usuń dane z pól tekstowych txtNazwisko = "" txtlmie = "" txtPensja = "" txtNazwisko. SetFocus End Sub
Procedura cmdDodaj_ciick rozpoczyna się od sprawdzenia poprawności danych wpisanych przez użytkownika w polach tekstowych Nazwisko, Imię i Pensja. Jeżeli dane są poprawne, to wartości wpisane w polach teksowych są przypisane zmiennym onazwach strNazwisko, strimię, oraz strPensja. Następne polecenia uruchamiają przyciski i inne formanty formularza, aby użytkownik mógł pracować z wpisanymi danymi. Podana niżej instrukcja woła procedurę Dodaj Pracownika w standardowym module pracoperacje, przesyłając jej wymagane parametry:
PracOperacje. Dodaj Pracownika strNazwisko, strimię, curPensja
Po wpisaniu pracownika do kolekcji dane pracownika zostają umieszczone w polu listy przy użyciu następującej instrukcji:
lboxOsoby.RowSource = GetValues
Getvaiues jest nazwą procedury typu funkcji w module Pracoperacje. Funkcja ta przy goto wywuje ciąg znaków, który ma służyć jako typ źródła wierszy pola listy
lboxOsoby.
Procedura Dodaj_click kończy się usunięciem danych z pól tekstowych oraz ustawieniem fokusu w polu tekstowym Nazwisko, aby użytkownik mógł wpisać dane nowego pracownika.
10. Wpisz teraz procedurę cmdzamkni j_ciick, która zamyka formularz:
private Sub cmdZamkni j_Click()
DoCmd. Close End Sub
184
Programowanie w AcJ
Hl Pensje pracownicze
N
azwisko:
Imię: |
Pensja:
!"-Modyfikacja pensji
*"" Procent C Kwota
Zmień pensją
C" Wybranego pracownika f Wszystkich pracowników
1 0256 Maciejak
16979 Karzycka
48216 Banasik
21148 Adamski
42632 Jaworska
Adam Izl 1234^00
Magdalena zl 1255,00
Aleksander zl 1343,00
Adam zl 1477,00
Ewa zl 1000,00
Rysunek 1.34. Pole listy wyświetla dane pracowników wpisane w zbiorze cPracownJ 11. Wpisz następującą procedurę dla przycisku Uaktualnij pensję:
Private Sub cmdUaktualnij_Click() Dim liczbaPrac As Integer Dim element As Integer
' sprawdź wybór opcji
If Framel.Value = 0 Or Frame2.Valua = 0 Then
MsgBox "Należy zaznaczyć przycisk opcji " & vbCr
& " w grupie Modyfikacje pensji' oraz 'Zmień pensję'.",
vbOKOnly, "Sprawdź wybór opcji'
Exit Sub Elself Not IsNumeric(txtPodwyż.ka) Or txtPodwyzka = "" Then
MsgBox "Należy wpisać liczbę.'
txtPodwyzka.SetFocus
Exit Sub Elself Frame2.Value = 1 And lboxOsoby.Listlndex = -1 Then
MsgBox "Kliknij nazwisko osoby,", , "Sprawdź pole listy"
w Access 2000
Kolekcje obiektów i klasy
185
p ensją
Exit Sub End If
If Frame2 .Value = 1 And lboxOsoby.Listlndex = -1 Then MsgBox "Wpisz dane lub wybierz opcję."
Exit Sub End If
' dokonaj obliczeń
kwota = txtPodwyzka
element = lboxOsoby.Listlndex + 1
If Framel.Value = 1 And Frame2.Value = 1 Then
1 wg procentu, jeden pracownik wybór = 1
liczbaPrac = 1 Elself Framel.Value = 2 And Frame2.Value = 1 Then
' wg kwoty, jeden pracownik
wybór = 2
liczbaPrac = 1 Elself Framel.Value = 1 And Frame2.Value = 2 Then
1 wg procentu, wszyscy pracownicy
wybór = 1
liczbaPrac = 2 Elself Framel.Value = 2 And Frame2.Value = 2 Then
1 wg kwoty, wszyscy pracownicy
wybór = 2
liczbaPrac = 2
End If
Aktualizuj Pensje wybór, kwota, liczbaPrac, element
lboxOsoby. RowSource = GetValues
End Sub
Gdy użytkownik kliknie przycisk Uaktualnij pensję, wówczas procedura sprawdzi, czy wybrał odpowiednie przyciski opcji i wpisał liczbę w polu tekstowym Podwyżka. Pensję można uaktualnić dla wybranego pracownika lub wszystkich pracowników wymienionych w polu listy. Pensję można powiększyć lub zmniejszyć o podany procent lub kwotę. W zależności od wybranych opcji odpowiednie wartości zostaną przypisane zmiennym wybór, kwota, liczbaos oraz element. Zmienne te zostaną przekazane jako parametry do procedury Aktualizuj pensję, znajdującej się w module PracOperacje. Ostatnia instrukcja powyższej procedury przypisuje wynik funkcji Getvaiues właściwości źródło wierszy (Row Source) pola listy. Funkcja Ge-tvalues znajduje się w standardowym module PracOperacje.
186
Programowanie w AcceJ
1 2. Przycisk Usuń pracownika posiada następującą procedurę obsługi zdarz J
Private Sub cmdUsuń_Click()
' upewnij się, że w polu listy ' zaznaczony jest jakiś pracownik If lboxOsoby.Listlndex > -1 Then
UsuńPracownika lboxOsoby.Listlndax + 1 If lboxOsoby.ListCount = 1 Then lboxOsoby.RowSource = GetValaes UserForm_Initialize Else
lboxOsoby.RowSource = GetValues End If Else
MsgBox "Kliknij osobę, którą chcssz wymazać." End If End Sub
Procedura cmdUsuń_ciick umożliwia usunięcie pracownika z kolekcji i
nicy.
61 Pensie pracownicze
Nazwisko;
Imię:
Pensja:
-Modyfikacja pensji
i* Procent f Kwota
- Zmień pensje, ;
<*■ Wybranego pracownika f" Wszystkich pracowników
10256 |
Maciejak |
Adam |
zl 1234,00 |
16979 |
Karzycka |
Magdalena |
zl 1255,00 |
48216 |
i Banasik |
Aleksander |
zl 1343,00 |
21148 |
Adamski |
Adam |
zl 1477,00 |
42632 |
.laworska |
i Ewa |
zl 1010,10 |
Rysunek 1.35. Pensję pracownika można powiększyć lub zmiejszyć o wskazany procen| lub kwotę
Kolekcje obiektów i klasy
187
P o zaznaczeniu elementu w polu listy i klinięciu przycisku Usuń pracownika wywołana zostanie procedura usuńPracownika. Procedura ta wymaga jednego argumentu, który wskazuje na indeks wybranego elementu w polu listy. Po usunięciu pracownika ze zbioru cpracownicy źródło wierszy pola listy zostaje odświeżone. Jeżeli pole listy zawiera tylko jednego pracownika, to po usunięciu ostatniego pracownika ze zbioru cpracownicy, wywołana zostanie procedura userForm_mitiaiize, która unieruchamia niektóre formanty formularza do momentu wpisania przynajmniej jednego pracownika do zbioru CPracownicy.
13. Uaktywnij
utworzony poprzednio standardowy moduł
PracOperacje. U góry
tego
modułu powinny znajdować się następujące deklaracje:
Option Compare Database Option Explicit
Dim prac As New cPracownik
Dim CPracownicy As New Collection
14. W
Standardowym module
EmpOperations wpisz
procedurę
Dodaj Pracownika
podaną
poniżej:
Sub Dodaj Pracownika (pracNazwisko As String, _ praclmię As String, pracPensja As Currency) With prac
.Id = SetEmpid .Nazwisko = pracNazwisko .Imię = praclmie .Pensja = CCur(pracPensja) If .Pensja = 0 Then Exit Sub CPracownicy.Add prac End With End Sub
Procedura Dodaj Pracownika wołana jest z procedury cmdDodaj_ciick dołączonej do przycisku Dodaj na formularzu. Procedura ta wymaga trzech argumentów. Gdy Visual Basic dotrze do instrukcji with prac, wówczas utworzona zostanie nowa instancja klasy CPracownik. Właściwościom Nazwisko, imię oraz Pensja zostaną przypisane wartości przekazane z procedury cmdDodaj_ciick. Właściwości id przypisany jest numer losowy, wygenerowany przez funkcję SetEmpid (zob. następny punkt). Za każdym razem gdy VBA widzi odwołanie do instancji obiektu prac, wywołuje ona
188
Programowanie w Act
o dpowiednią procedurę Property Let, znajdującą się w module klasy. Osi rozdział demonstruje krok po kroku, w jaki sposób procedury typu Property! konywane. Ostatnie polecenie wewnątrz struktury with prac dodaje obiekt j własnej kolekcji cpracownicy.
15. Wpisz następującą funkcję w standardowym module o nazwie Pracoperac
Function SetEmpId() As String
Dim ref As String
Randomize
ref = lnt((99999 - 10000) * Rnd + 10000)
SetEmpId = ref
End Function
Celem powyższej funkcji jest przypisanie nowemu pracownikowi unik numeru identyfikacyjnego złożonego z pięciu cyfr. Aby wygenerować liczbęj witą w zakresie od 10 000 do 99 999, skorzystamy z następującego wzoru:
Int((końcowa_liczba-początkowa_liczba)*Rnd+początkowa_liczba)
Funkcja setEmpid również korzysta z polecenia Randomize, które inicjuj cesor numerów losowych. Więcej informacji na temat użycia i zastosowaniaj Rnd, int oraz polecenia Randomize podano we wbudowanej pomocy.
16. Wpisz funkcję o nazwie Getvaiues podaną poniżej. Funkcja ta wywofyv
Z procedur cmdDodaj_Click, cmdUaktualnij_Click oraz cmdOsuńl
i dostarcza wartości dla źródła wierszy pola listy.
Function GetValues() Dim lista As String lista = ""
For Each prac In CPracownicy lista = lista & prac.Nr & ";" prac.Nazwisko & " ; " & _ prac.Imię & "; zł" & Format(prac.Pensja, "0.00' Next prac GetValues = lista End Function
17. Wpisz kod procedury Aktualizuj Pensje podany poniżej:
i w Access 2000
f . Ostatni pod-operty są Wy-
obiekt prac do
oOperac je:
i unikatowego ; liczbę całko-
"u:
e inicjuje pro-wania funkcji
woływanajest
ndUsuń Click
189
Kolekcje obiektów i klasy
S ub Aktualizuj Pensje(wybór As Integer, wart As Long, _
liczbaOs As Integer, element As Integer) Set prac = New cPracownik
If wybór = 1 And liczbaOs = 1 Then
CPracownicy.Item(element).Pensja = _
prac.KalkNowaPensja(1, CPracownicy.Item(element).Pensja, wart) Elself wybór = 1 And liczbaOs = 2 Then For Each prac In CPracownicy
prac.Pensja = prac.Pensja + ((prac.Pensja * wart) / 100) Next prac
Elself wybór = 2 And liczbaOs = 1 Then CPracownicy.Item(element).Pensja = _
CPracownicy.Item(element).Pensja + wart Elself wybór = 2 And liczbaOs = 2 Then For Each prac In CPracownicy
prac.Pensja = prac.Pensja + wart Next prac Else
MsgBox "Wpisz dane lub wybierz opcję." End If End Sub
Procedura Aktualizuj Pensje wołana jest z procedury obsługi zdarzenia cmdu-aktualinij_click przypisanej do przycisku Aktualizuj pensję. Procedura cmduak-tualinij _click przekazuje procedurze Aktualizuj Pensje cztery parametry niezbędne dla obliczenia nowej pensji. Kiedy pensja dla wybranego pracownika musi być zmodyfikowana według wskazanego procentu lub kwoty, Visual Basic wywołuje metodę KalkNowaPens ja, znajdującą się w module klasy.
Aby zmodyfikować pensje wszystkich pracowników, należy pobrać ze zbioru CPracownicy wartość właściwości Pensja dla każdego obiektu prac oraz wykonać odpowiednie obliczenie, korzystając ze wzoru. Jeżeli wpiszemy liczbę ujemną w polu tekstowym txtPodwyzka, to będziemy mogli zmniejszyć pensję o wskazany procent lub kwotę.
18. Wpisz procedurę usuńPracownika podaną poniżej:
Sub UsuńPracownika(element As Integer)
CPracownicy.Remove element End Sub
190
Programowanie w Aci
P rocedura UsuńPracownika korzysta z metody Remove w celu usunięcia« nego pracownika ze zbioru cpracownicy. Metoda Remove wymaga jednego i tu, którym jest pozycja elementu w kolekcji. Wartość tego argumentu dostarc cedura cmdUsuń Click.
Śledzenie toku procedur VBA
Aby ułatwić zrozumienie tego, co dzieje się w trakcie wykonywania koduj dury VBA oraz działania własnych obiektów, prześledzimy procedurę daj_ciick krok po kroku. To ćwiczenie potraktujmy jako krótkie wprowadzi technik testowania procedur, które zostaną omówione szczegółowo w dalszej i rozdziału.
1.
2. 3.
Otwórz formularz frmPensje w widoku Projekt.
Wybierz Widok => Kod programu (View => Code).
Wybierz obiekt cmdDodaj z listy rozwijanej po lewej stronie okna Kodpj
mu.
4 . Ustaw punkt przerwania, klikając w obszarz wiersza kodu:
e marginesu, obok następuje
If txtNazwisko.Value = "" Or txtlmie.Value = "" Or txtPensja.Value = "" Then
Wróć do widoku Projekt formularza frmPensje.
Wybierz Widok => Formularz (View => Form) aby wyświetlić formularz, i
Wpisz
dowolne dane w polach tekstowych Nazwisko,
Imię
oraz
Pensi
czym
kliknij przycisk Dodaj.
Visual Basic powinien teraz uruchomić okno Kod programu, ponieważ nap punkt przerwania ustawiony w punkcie 4. w pierwszym wierszu procedury i zdarzenia cmdDodaj_ciick.
Access 2000
ęcia wybra-;o argumen-starcza pro-
Kolekcje obiektów i klasy
RozOl - Form_frmPensje (Co
cmdDodaj
▼ Click
191
* :odu proce-
irę cmdDo-/adzenie do lszej części
ad progra-
itępującego
Private Sub cmdDodąj_Click0 Dim strNazwisko As String Dim strlmię As String Dim curPensja As Currency
' Sprawdź poprawność wpisanych danych
If txtNazwisko. Value = Or txtlmie. Value = Or txtPensia.Value = "" The"
MsgBox "Wpisz nazwisko, imię oraz pensję:"
txtNazwisko. SetFocus
Exit Sub End if If Not lsNumeric(txtPensja) Then
MsgBox "Należy wpisać wartość pensji."
txtPensja.SetFocus
Exit Sub End If If txtPensja < 0 Then
MsgBox "Pensja nie może być negatywna." End If
larz. 'ensja, po
ż napotkał ry obsługi
Rysunek 1.36. Czerwona kropka w obszarze marginesu oznacza punkt przerwania. Polecenie, na którym ustawiono punkt przerwania, wyświetlone jest jako biały tekst na czerwonym tle
8. Naciskając teraz klawisz funkcyjny F8, prześledźmy wykonywanie procedury krok po kroku.
Visual Basic wykonuje bieżącą instrukcję procedury i automatycznie przesuwa się do następnej instrukcji. Bieżąca instrukcja zaznaczona jest żółtą strzałką w obszarze marginesu oraz żółtym tłem. Naciskaj klawisz F8, aby wykonać procedurę krok po kroku. Visual Basic po uruchomieniu procedury Dodaj Pracownika w standardowym module PracOperacje i napotkaniu polecenia with prac, wywoła funkcję, która przypisze numer identyfikacyjny nowemu pracownikowi i przystąpi do wykonywania procedur Property Let w module klasy cpracownik.
192
Programowanie w Acci
■MRozOl-FormJrmPeus , I
cmdDodaj
d !click
Private Sub cmdDodaj_Click() Dim strNazwisko As String Dim strlmię As String Dim curPensja As Currency
Sprawdź poprawność wpisanych danych txtNazwisko. Value = "" Or txtlmie.Value = " Or xtPensja.Value = "" Then
MsgBox "Wpisz nazwisko, imię oraz pensję:"
txtNazwisko. SetFocus
Exit Sub End If If Not lsNumeric(txtPensja) Then
MsgBox "Należy wpisać wartość pensji."
txt Pensja. SetFocus
Exit Sub End If IftxtPensja < 0 Then
MsgBox "Pensja nie może być negatywna." End If
i
J
Rysunek 1.37. Kiedy Visual Basic napotka punkt przerwania w trakcie odtwarzania
procedury, uruchamia się automatycznie okno Kod programu i wyświetla] żółtą strzałkę w obszarze marginesu obok polecenia, na którym ustawioi punkt przerwania
M RozOl - cPracowmik (Code)
((General* jj |lmie IPropertyGetJ jj j |
||
|
Property
Get lmie() As String
T] |
|
|
Property Get PensjaQ As Currency Pensja = m_Pensja End Property |
|
|
' przypisz wartości przy użyciu procedur LET Property Let ld(ref As String) mjd = ref End Property |
|
|
Property Let Nazv»isko(N As String) mJMazwisko = N End Property _ _ „„„ |
|
|
Property Let lmie(l As String) mjmię = 1 |
|
|
|
Rysunek 1.38. Właściwości własnego obiektu ustawia się za pomocą procedur typu Property Let
193
kolekcje obiektów i klasy
o Teraz naciskając klawisz F8, prześledźmy wykonanie procedury cmdDo-daj_click aż do końca.
Kiedy VBA napotka koniec procedury (End Sub), wyłączy żółte zaznaczenie woknie Kod programu. W tym momencie, wróć do aktywnego formularza, klikając na jego przycisk w pasku zadań Windows (u dołu ekranu). Wpisz dane nowego pracownika, i ponownie kliknij na przycisk Dodaj. Gdy Visual Basic wyświetli okno Kod programu, wybierz Analiza => Wyczyść punkty przerwania (Debug => Clear All breakpoints), aby usunąć punkt przerwania. Następnie naciśnij klawisz funkcyjny F5 aby wykonać pozostałą część procedury w trybie normalnym bez zatrzymywania się na poszczególnych instrukcjach. Uruchom następnie formularz frmPensje, aby obejrzeć w polu listy dane nowego pracownika. Narzędzia służące do testowania procedur
Visual Basic udostępnia w oknie edytora Visual Basic szerg narzędzi oraz opcji, które pozwalają na testowanie procedur i wyszukiwanie błędów. W ostatnim zagadnieniu tego rozdziału zapoznamy się z działaniem tych narzędzi.
Podsumowanie
W poprzednich zagadnieniach dowiedziałeś się, w jaki sposób możesz utworzyć własne kolekcje oraz własne obiekty w procedurach VBA. Zapoznałeś cię z modułem ta niezbędnym w procesie tworzenia własnych obiektów. W przykładowej klasie cPracownik nauczyłeś się tworzyć właściwości i metody własnego obiektu. Następnie udostępniłeś moduł klasy użytkownikowi za pomocą formularza frmPensje. Na zakończenie dowiedziałeś się, w jaki sposób można analizować daną procedurę krok po
kroku.
1
Ś ledzenie toku procedur VBA ipulapkowanie błędów
Przy wpisywaniu procedur wystarczy chwila nieuwagi, aby popełnić błąd. Na nrzvkład możesz pomylić się przy wpisywaniu jakiejś instrukcji, zapomnieć
lk czy cudzysłowie, pominiąć ważną kropkę lub końcowy nawias. Tego typu oszą nazwę błędów syntaktycznych. Na szczęście, Visual Basic jest dosc ; „yTwyszukrwaJu tego rodzaju błędów. Aby Visual Basic automatycznie
Lzał zapis syntaktyczny naszego kodu programowania w trakcie jego wpisywa-P hiPr7 Narzędzia =* Opcje w ekranie edytora Visual Basic. Zaznacz opcję Au-i: 1 "anie JJL (Auto Syntax Check) na zakładce Edytor. W ten
2 kiedy Visual Basic napotka na błąd, wyświetli komunikat błędu i zmieni kolor ^prawidłowej instrukcji kodu na czerwony lub inny kolor wskazany na zakładce Format w oknie dialogu Opcje.
Eto
| Editor
Format
j General j Docking
j
CodeSettings
fź Auto Syntax Check
p Require Variable Declaration
p Auto List Members
|? Auto Quick Info
p Auto Data Tips
Window Settings \
p
Drag-and-Drop Text Editing |
|?
Default to Full Module View |
p
Procedure Separator |
p Auto Indent Tab Width: |4
R ysunek 1.39. Ustawienie Automatyczne sprawdzanie składni (Auto Syntax Check)
na zakładce Edytor w oknie dialogu Opcje pozwala szybko wykryć w kodzie procedury VBA błędy synktaktyczne
Jeżeli wyjaśnienie błędu w komunikacie błędu nie jest jasne, kliknij przycisk Pomoc, aby uzyskać więcej informacji. Jeżeli Visual Basic nie będzie mógł wskazać
196
Programowanie w
d okładnego miejsca błędu, wróć do swojej procedury i sprawdź wiersza_ Sprawdź, czy nie brakuje w nich liter, cudzysłowów, przecinków, średników, J równości, początkowych i końcowych nawiasów. Odnajdywanie błędów \\M jest często bardzo męczące i czasochłonne. Niektóre błędy syntaktyczne moiJ szukać dopiero w trakcie wykonywania procedury. Visual Basic może wówczl potkać na błędy spowodowane użyciem niewłaściwych argumentów lub przeocJ instrukcji, które muszą być stosowane parami, takich jak instrukcje warunkowej struktury pętli. Na pewno nie raz słyszałeś, że programy komputerowe są I pluskiew (ang. bugs). W programowaniu błędy nazywane są pluskwami, aprocj najdywania oraz eliminacji błędów określa się terminem odpluskwiania (angjj ging). Pierwszym krokiem w procesie odpluskwiania procedury jest popraj wszystkich błędów składni.
Oprócz błędów syntaktycznych istnieją jeszcze błędy wykonania (run-timi błędy logiczne (logie). Błędy wykonania zachodzą w trakcie wykonywania procJ Błędy te często spowodowane sąjakąś nieoczekiwaną sytuacją, której programiJ przewidział w trakcie pisania kodu. Na przykład, kiedy program usiłuje uzyska stęp do stacji dysków lub pliku, który nie istnieje na komputerze użytkownill przy próbie skopiowania pliku na dyskietkę bez uprzedniego sprawdzenia, czvl kownik włożył dysk do stacji.
Trzeci typ błędu, błąd logiczny, często nie powoduje specyficznego komu błędu. Chociaż procedura działa nienagalnie i nie ma w niej błędów syntaktj może ona dać nieprawidłowy wynik. Błędy logiczne zdarzają się, gdy proca prostu nie robi tego, co powinna. Błędy logiczne są zazwyczaj trudne do odnali i głęboko ukryte w procedurze. Częstokroć wymagają one wielu godzin (a nil nawet dni pracy) w celu wykrycia przyczyny błędu.
Testowanie procedur VBA
Przy sprawdzaniu programu kieruj się następującymi wskazówkami:
jeśli chcesz zbadać tok wykonania programu, sprawdź procedurę wiersz poi szu, naciskając klawisz F8 lub wybierając opcję Krokowo (Step Into) z| Analiza (Debug).
jeśli podejrzewasz, że w danym miejscu procedury może wystąpić błąd, i zastosować punkt przerwania (Breakpoint).
jeśli chcesz sprawdzić lub zmodyfikować wartości zmiennych w programie, skorzystaj z tzw. czujek (Watch Expressions)
w Access 2000
'iersze kodu. ków, znaków >w w składni e można od-wówczas na->rzeoczeniem łkowe if lub we są pełne a proces wy-(ang. debug-poprawienie
n-time) ora/ i procedury, gram i sta nie uzyskać do-awnika, lub a, czy użyt-
pmunikatu
iktycznych, ocedura po dnalezienia (a niekiety
197
Śledzenie toku procedur VBA i pułapkowanie błędów
, jeśli masz dość posługiwania się suwakiem przewijania, aby przemieścić się do dalszych fragmentów procedury, sporządź zakładkę (Bookmark), żeby szybko przejść do danego miejsca.
K ażda ze wskazówek podanych powyżej zostanie zademonstrowana
ipraktycznych ćwiczeniach.
Zatrzymywanie procedury
VBA oferuje cztery metody zatrzymywania procedur oraz uruchamiania tzw.
iiybu przerwania:
i naciśnięcie klawiszy Ctrl+Break,
t ustawienie punktów przerwania (breakpoints),
t wpisanie w procedurze instrukcji stop,
i ustawienie czujek (Wach expressions)
Stan przerwania, zwany również stanem oczekiwania, następuje, gdy wykonanie twojej procedury VBA jest tymczasowo zawieszone. Visual Basic pamięta wartości Bzystkich zmiennych oraz instrukcję, od której ma zacząć, gdy użytkownik wyda komendę wznowienia programu, klikając przycisk Uruchom Sub/UserForm w pasku narzędzi (lub opcję o tej samej nazwie w menu Uruchom) lub przycisk Kontynuuj woknie dialogowym. Okno dialogowe pokazane na rysunku 1.40 informuje, że procedura została tymczasowo zatrzymana. W oknie tym znajdują się następujące przyci-
Zakoncz
Zakończenie procedury w miejscu przerwania.
z po wier-o) z menu
, możesz użytych
Kontynuuj iContinuc)
Analizuj program
Pomoc
Kontynuowanie wykonania programu.
Uruchomienie okna Kod programu, w którym zaznaczona jest następna instrukcja do wykonania.
Uruchomienie tematu wbudowanej pomocy, który wyjaśnia znaczenie znajdujących się w tym oknie przycisków.
198
Programowanie w AcctJ
Microsoft Visual Basic
Code execution has been interrupted
;
Continue
End
i Debug
Help
R ysunek 1.40. Ten komunikat pojawia się po naciśnięciu klawiszy Ctrl+Break w trakci odtwarzania procedury
Ustawianie punktów przerwania
Gdy wiesz mniej więcej, w którym miejscu procedury możesz spodziew; błędu, powinieneś wywołać stan przerwania w określonym wierszu progn tawienie punktu przerwania polega po prostu na zaznaczeniu pewnego wiej strukcji. Po dojściu do tej instrukcji Visual Basic przerwie procedurę i wyświe| Kod programu. W oknie tym będzie można krok po kroku (wiersz po sprawdzić program, korzystając z klawisza skrótu F8 lub wybierając opcję YA z menu Analiza. Aby ustawić punkt przerwania, naciśnij F9, gdy kursor zna| we właściwym wierszu.
Aby zobaczyć na czym to polega, przypuśćmy, że w trakcie wykonywani! cji o nazwie ListEndDates następujący wiersz kodu może spowodować błąd:
ListEndDates = Format(((NowO + intoffset) - 35) + 7 * row, "MM/DD/YYYY")
Przygotuj formularz przedstawiony na rysunku 1.41.
Przypisz następujące właściwości formantom formularza:
Nazwa formantu |
Nazwa właściwości |
Ustawieni* |
Pole kombi |
Nazwa (Name) Typ źródła wierszy (Row Source Type) Liczba kolumn (Column Count) |
CboEndDate ListEndDates 1 1 |
w Access 2000
Siedzenie toku procedur VBA i pułapkowanie błędów
199
Nazwa formantu |
Nazwa właściwości |
Ustawienie |
Pola tekstu |
Nazwa (Name) |
txtl |
|
Nazwa (Name) |
txt2 |
|
Nazwa (Name) |
txt2 |
|
Nazwa (Name) |
txt3 |
|
Nazwa (Name) |
txt4 |
|
Nazwa (Name) |
txt5 |
|
Nazwa (Name) |
txt6 |
|
Nazwa (Name) |
txt7 |
trakcie
2 • i • 3 • i ■ 4 ■ i ■ 5 • i ■ 6 ■ i ■ 7
d ziewać się gram u. Us-wiersza in-iwietli okno >o wierszu) ! Krokowo najduje się
Kon iec ty g Ddnia piez wiązany -J
r anią funk-d:
u <
Rysunek 1.41. Pole kombi przedstawione na tym formularzu zostanie wypełnione przez funkcję ListEndDates
3, Zachowaj przygotowany formularz jako frmDniTygodnia.
4 Naciśnij Ctrl+R, aby wybrać formularz.
5, Uruchom okno Właściwości i kliknij zakładkę Zdarzenie.
200
Programowanie w Acd
K
liknij
obok właściwości
Przy
załadowaniu i
kliknij przycisk z trzema]
mi.
Wybierz Konstruktor
kodu i
kliknij OK.
W oknie Kod programu wpisz następującą procedurę obsługi
Form_Load!
Private Sub Form_Load() With Me.cboEndDate .SetFocus .Listlndex = 5 End With End Sub
' wybierz datę końca tygodnia
Wybierz pole kombi na formularzu (cboEndDate) i ukatywnij okno Wlaścii
Kliknij
obok właściwości
Przy
zmianie na
zakładce Zdarzenie
i
kliknij pn
z
trzema kropkami. Wybierz Konstruktor
kodu i
kliknij OK.
Wpisz w oknie Kod programu następującą procedurę obsługi zdarzenia:
Private Sub cboEndDate_Change() Dim endDate As Date endDate = Me.cboEndDate.Value With Me
.txtl = Format(endDate - 6, "mm/dd")
. txt2 = Format(endDate - 5, "mm/dd")
.txt3 = Format(endDate - 4, "mm/dd")
.txt4 = Format(endDate - 3, "mm/dd")
.txt5 = Format(endDate - 2, "mm/dd")
.txt6 = Format(endDate - 1, "mm/dd")
.txt7 = Format(endDate - 0, "mm/dd") End With End Sub
Wybierz
Wstaw
I Moduł,
aby
dodać nowy standardowy moduł. W oknii
ściwości
nowego modułu zmień
nazwę modułu na DniTygodnia.
Kliknij
dwukrotnie myszą
na nazwę moduru
DniTygodnia
w
oknie Eksplo
projektu
i
wpisz następującą procedurę funkcji w oknie Kod
programu:
Function ListEndDates(fId As Control, id As Variant, _ row As Variant, col As Variant, cod<3 As Variant) _
s 2000 siedzenie toku procedur VBA i pułapkowanie błędów
201
ś ciwości.
przycisk
As Variant
Dim intOffset As Integer Select Case code
Case acLBInitialize
ListEndDates = True Case acLBOpen
ListEndDates = Timer Case acLBGetRowCount
ListEndDates = 11 Case acLBGetColumnCount
ListEndDates = 1 Case acLBGetColumnWidth
ListEndDates = -1 Case acLBGetValue
Inicjalizuj.
Otwórz. Unikatowy ID. Pobierz rzędy.
Pobierz kolumny.
' Podaj szerokość kolumny. ' Użyj wyjściową szerokość. ' Pobierz dane. ' liczba dni do końcowej daty intOffset = Abs((8 - Weekday(Now)) Mod 7) ' zacznij 5 tygodni przed bieżącą końcową datą 1 (7 dni * 5 tyg = 35 dni przed następną końcową datą) ' pokaż 11 tygodni ■ ListEndDates = Format(((Now() + intOffset) - 35) _
+ 7 * row, "MM/DD/YYYY") End Select jud Function
13. Kliknij w dowolnym miejscu w wierszu kodu zawierającym następującą instrukcję:
ListEndDates = Format! .MM/DD/YYYY")
(Now() + intOffset) - 35) + 7 * row,
lie Wła-plorator
14. Naciśnij F9, aby ustawić punkt przerwania w wierszu kodu, w którym znajduje się kursor.
Dodatkowym sposobem ustawienia punktu przerwania jest kliknięcie w oknie Kod programu wskaźnika marginesu (jeśli jest on widoczny) obok danej instrukcji VBA. Pasek wskaźników marginesowych znajduje się z lewej strony okna Kod pro-jramu. Visual Basic wyświetla wskaźniki marginesowe w celu uwidocznienia niektórych czynności wykonywanych podczas edycji kodu programu. Jeżeli kilka czynności odbywa się jednocześnie, na marginesie pojawiają się wszystkie stosowne wskaźniki. Po ustawieniu punktu przerwania Visual Basic wyświetla po lewej stronie zaznaczonej instrukcji (na marginesie) czerwoną kropkę. Zaznaczona instrukcja poją-
190
Programowanie w Access 3
P rocedura UsuńPracownika korzysta z metody Remove w celu usunięcia wyli nego pracownika ze zbioru cpracownicy. Metoda Remove wymaga jednego argun tu, którym jest pozycja elementu w kolekcji. Wartość tego argumentu dostarczaj cedura cmdUsuń_Click.
Śledzenie toku procedur VBA
I.
2. 3.
4.
Aby ułatwić zrozumienie tego, co dzieje się w trakcie wykonywania kodu pri dury VBA oraz działania własnych obiektów, prześledzimy procedurę cm daj_ciick krok po kroku. To ćwiczenie potraktujmy jako krótkie wprowadzenie j technik testowania procedur, które zostaną omówione szczegółowo w dalszej ca rozdziału.
Otwórz formularz frmPensje w widoku Projekt.
Wybierz Widok => Kod programu (View => Code).
Wybierz obiekt cmdDodaj z listy rozwijanej po lewej stronie okna Kod pro;
mu.
Ustaw punkt przerwania, klikając w obszarze marginesu, obok następują wiersza kodu:
If txtNazwisko.Value = "" Or txtlmie.Value = "" Or _ txtPensja.Value = "" Then
Wróć do widoku Projekt formularza frmPensje.
Wybierz Widok => Formularz (View => Form) aby wyświetlić formularz.
Wpisz
dowolne dane w polach tekstowych Nazwisko,
Imię
oraz
Pensja,)
czym
kliknij przycisk Dodaj.
Visual Basic powinien teraz uruchomić okno Kod programu, ponieważ napo punkt przerwania ustawiony w punkcie 4. w pierwszym wierszu procedury obs) zdarzenia cmdDodaj_ciick.
;je obiektów i klasy
191
IcmdDodaj
Private Sub cmdDodaj_Click() Dim strNazwisko As String Dim strlmię As String Dim curPensja As Currency
Sprawdź poprawność wpisanych danych
MsgBox "Wpisz nazwisko, imię oraz pensję:"
txtNazwisko.SetFocus
Exit Sub End If If Not lsNumeric(txtPensja) Then
MsgBox "Należy wpisać wartość pensji."
txtPensja.SetFocus
Exit Sub End If IftxtPensja < 0 Then
MsgBox "Pensja nie może być neqatywna " End If
ŁLJ
Kk 1.36. Czerwona kropka w obszarze marginesu oznacza punkt przerwania. Polecenie, na którym ustawiono punkt przerwania, wyświetlone jest jako biały tekst na czerwonym tle
Naciskając teraz klawisz funkcyjny F8, prześledźmy wykonywanie procedury
uok po kroku.
Visual Basic wykonuje bieżącą instrukcję procedury i automatycznie przesuwa następnej instrukcji. Bieżąca instrukcja zaznaczona jest żółtą strzałką arze marginesu oraz żółtym tłem. Naciskaj klawisz F8, aby wykonać procedurę po kroku. Visual Basic po uruchomieniu procedury Dodaj Pracownika irdowym module Pracoperacje i napotkaniu polecenia with prac, wywoła jc, która przypisze numer identyfikacyjny nowemu pracownikowi i przystąpi do mywania procedur Property Let w module klasy cpracownik.
192
Programowanie w A<
vi«Roz01-FormJrmPen„ , « „i. ■
_ r x
jcmdDodaj
jrj | click
Private Sub cmdDodaj_ClickQ Dim strNazwisko As String Dim strlmię As String Dim curPensja As Currency
Wtiu
Or
'
Sprawdź
poprawność wpisanych danych JftxtNazwisko.Value
=
™
Or txtfmie. Value = xtPensja.
Value =
"" Then
MsgBox "Wpisz nazwisko, imię oraz pensję:"
txtNazwisko. SetFocus
Exit Sub End If If Not IsNumericftxtPensja) Then
MsgBox "Należy wpisać wartość pensji."
txtPensja.SetFocus
Exit Sub End If If txtPensja < 0 Then
MsgBox "Pensja nie może być negatywna " End If
J
Rysunek 1.37. Kiedy Visual Basic napotka punkt przerwania w trakcie odtwarzania procedury, uruchamia się automatycznie okno Kod programu i wyświei żółtą strzałkę w obszarze marginesu obok oolecenia, na którym ustawio; punkt przerwania
M RoztM - cPracownik (Cods)
..■-I-. ;: ;
■ja*!
(General)
^tJ [imię [ProperibiłGetJ
|
Property Get ImieO As String Imię = mjmię End Property |
|
|
Property Get PensjaQ As Currency Pensja = m__Pensja End Property |
|
|
' przypisz wartości przy użyciu procedur LET Property Let ld(ref As String) mjd = ref End Property |
|
|
Property Let Nazwisko(N As String) m_l\lazwisko = N |
J |
|
Property
Let lmie(l As String) |
|
|
|
|
Rysunek 1.38. Właściwości własnego obiektu ustawia się za pomocą procedur typu Property Let
100
Kolekcje obiektów i klasy
193
I Teraz naciskając klawisz F8, prześledźmy wykonanie procedury cmdDo-daj_ciick aż do końca.
Kiedy VBA napotka koniec procedury (End Sub), wyłączy żółte zaznaczenie woknie Kod programu. W tym momencie, wróć do aktywnego formularza, klikając [ujego przycisk w pasku zadań Windows (u dołu ekranu). Wpisz dane nowego pracownika, i ponownie kliknij na przycisk Dodaj. Gdy Visual Basic wyświetli okno Kod programu, wybierz Analiza => Wyczyść punkty przerwania (Debug => Clear All breakpoints), aby usunąć punkt przerwania. Następnie naciśnij klawisz funkcyjny fe aby wykonać pozostałą część procedury w trybie normalnym bez zatrzymywania się na poszczególnych instrukcjach. Uruchom następnie formularz frmPensje, aby obejrzeć w polu listy dane nowego pracownika.
Narzędzia służące do testowania procedur
Visual Basic udostępnia w oknie edytora Visual Basic szerg narzędzi oraz opcji, łtóre pozwalają na testowanie procedur i wyszukiwanie błędów. W ostatnim zagad-sieniu tego rozdziału zapoznamy się z działaniem tych narzędzi.
Podsumowanie
W poprzednich zagadnieniach dowiedziałeś się, w jaki sposób możesz utworzyć własne kolekcje oraz własne obiekty w procedurach VBA. Zapoznałeś cię z modułem klasy niezbędnym w procesie tworzenia własnych obiektów. W przykładowej klasie cPracownik nauczyłeś się tworzyć właściwości i metody własnego obiektu. Następnie udostępniłeś moduł klasy użytkownikowi za pomocą formularza frmPensje. Na zakończenie dowiedziałeś się, w jaki sposób można analizować daną procedurę krok po
Sle. i pi
Pi
przykłć o przeć pomyfl pomoc; sprawd nia. w) tomarj sposób niepra\ Forma
Code
Rysune
Pomoi
Biedzenie toku procedur VBA ipułapkowanie błędów
pomS waUTropke. lub końcowy nawias. Tego
tah. Na szczęście, Visual Bas.c jest dose . Aby Visual Basie
dialogu Opcje.
>
at) General 1 Docking J
■ Cafe Settings
|7 Auto Syntax Check
p Require variable Declaration
P Aoto List Members S p Auto Quick Info jp Auto Data Tips
-Vrtidow Settings
r7 otag-and-Drop Text Editing U Default to Full Module View
Ip Procedure Separator
p nuto Indent Tab Width: H
Ustawienie Automatyczne sprawdzanie składni (Auto Syntax Check)
na zatdce Edytor w oknie dialogu Opcje pozwala szybko wykryć w kodz.e
procedury VBA błędy synktaktyczne
enie błędu w komunikacie błędu nie jest jasne, kliknij przycisk więcej .nformacji. Uli Yisuał Basic nie będzie mógł wskazać
196
Programowanie w Accei
dokładnego miejsca błędu, wróć do swojej procedury i sprawdź wiersze Sprawdź, czy nie brakuje w nich liter, cudzysłowów, przecinków, średników, równości, początkowych i końcowych nawiasów. Odnajdywanie błędów w jest często bardzo męczące i czasochłonne. Niektóre błędy syntaktyczne możii szukać dopiero w trakcie wykonywania procedury. Visual Basic może wówczas potkać na błędy spowodowane użyciem niewłaściwych argumentów lub przeoczeni instrukcji, które muszą być stosowane parami, takich jak instrukcje warunkowe i-struktury pętli. Na pewno nie raz słyszałeś, że programy komputerowe sąJ pluskiew (ang. bugs). W programowaniu błędy nazywane są pluskwami, a proces najdywania oraz eliminacji błędów określa się terminem odpluskwiania (ang. ging). Pierwszym krokiem w procesie odpluskwiania procedury jest poprawiJ wszystkich błędów składni.
Oprócz błędów syntaktycznych istniejąjeszcze błędy wykonania (run-time); błędy logiczne (logie). Błędy wykonania zachodzą w trakcie wykonywania proci Błędy te często spowodowane są jakąś nieoczekiwaną sytuacją, której programista! przewidział w trakcie pisania kodu. Na przykład, kiedy program usiłuje uzyskać! stęp do stacji dysków lub pliku, który nie istnieje na komputerze użytkownika,I przy próbie skopiowania pliku na dyskietkę bez uprzedniego sprawdzenia, czył kownik włożył dysk do stacji.
Trzeci typ błędu, błąd logiczny, często nie powoduje specyficznego komunii błędu. Chociaż procedura działa nienagalnie i nie ma w niej błędów syntaktycznJ może ona dać nieprawidłowy wynik. Błędy logiczne zdarzają się, gdy procedura! prostu nie robi tego, co powinna. Błędy logiczne są zasrwyczaj trudne do odnalezij i głęboko ukryte w procedurze. Częstokroć wymagają one wielu godzin (a nieJ nawet dni pracy) w celu wykrycia przyczyny błędu.
Testowanie procedur VBA
Przy sprawdzaniu programu kieruj się następującymi wskazówkami:
jeśli chcesz zbadać tok wykonania programu, sprawdź procedurę wiersz po«; szu, naciskając klawisz F8 lub wybierając opcję Krokowo (Step Into) zj Analiza (Debug).
jeśli podejrzewasz, że w danym miejscu procedur}' może wystąpić błąd, moi! zastosować punkt przerwania (Breakpoint).
jeśli chcesz sprawdzić lub zmodyfikować wartości zmiennych użjj w programie, skorzystaj z tzw. czujek (Watch Expressions)
jedzenie toku procedur VB A i pułapkowanie błędów
197
[ jeśli masz dość posługiwania się suwakiem przewijania, aby przemieścić się do fdalszych fragmentów procedury, sporządź zakładkę (Bookmark), żeby szybko
przejść do danego miejsca.
Każda ze wskazówek podanych powyżej zostanie zademonstrowana
praktycznych ćwiczeniach.
Zatrzymywanie procedury
V BA oferuje cztery metody zatrzymywania procedur oraz uruchamiania tzw. Ui przerwania:
, naciśnięcie klawiszy Ctrl+Break, I ustawienie punktów przerwania (breakpoints), , wpisanie w procedurze instrukcji stop, [ ustawienie czujek (Wach expressions)
Stan przerwania, zwany również stanem oczekiwania, następuje, gdy wykonanie
■ nrocedury VBA jest tymczasowo zawieszone. Visual Basic pamięta wartości
!!tkich zmiennych oraz instrukcję, od której ma zacząć, gdy użytkownik wyda
ide wznowienia programu, klikając przycisk Uruchom Sub/UserForm w pasku
zi (lub opcję o tej samej nazwie w menu Uruchom) lub przycisk Kontynuuj
L dialogowym. Okno dialogowe pokazane na rysunku 1.40 informuje, że pro-
^ a została tymczasowo zatrzymana. W oknie tym znajdują się następujące przyci-
Zakończ
Kontynuuj
(Continue)
Analizuj program
(Degug)
Pomoc
Zakończenie procedury w miejscu przerwania. Kontynuowanie wykonania programu.
Uruchomienie okna Kod programu, w którym zaznaczona jest następna instrukcja do wykonania.
Uruchomienie tematu wbudowanej pomocy, który wyjaśnia znaczenie znajdujących się w tym oknie przycisków.
198
Programowanie w
AcJ
Microsoft Visual Basic
Code execution has been interrupted
Na
C ontinue
End
Debug
Help
R ysunek 1.40. Ten komunikat pojawia się po naciśnięciu klawiszy Ctrl+Break w traki odtwarzania procedury
Ustawianie punktów przerwania
Gdy wiesz mniej więcej, w którym miejscu procedury możesz spodzieJ błędu, powinieneś wywołać stan przerwania w określonym wierszu program! tawienie punktu przerwania polega po prostu na zaznaczeniu pewnego wie™ strukcji. Po dojściu do tej instrukcji Visual Basic przerwie procedurę i wyświeł Kod programu. W oknie tym będzie można kroŁ po kroku (wiersz po wij sprawdzić program, korzystając z klawisza skrótu F8 lub wybierając opcję Kroi z menu Analiza. Aby ustawić punkt przerwania, naciśnij F9, gdy kursor znajjj we właściwym wierszu.
Aby zobaczyć na czym to polega, przypuśćmy, że w trakcie wykonywanial cji o nazwie ListEndDates następujący wiersz kodu noże spowodować błąd:
D
ListEndDates = Format "MM/DD/YYYY")
(Now() + intOffset) - 35) + 7 * row,
Przygotuj formularz przedstawiony na rysunku 1.41.
Przypisz następujące właściwości formantom formularza:
Nazwa formantu |
Nazwa właściwości |
Ustawienie |
Pole kombi |
Nazwa (Name) Typ źródła wierszy (Row Source Type) Liczba kolumn (Column Count) |
CboEndDate ListEndDates 1 |
Rysui
3.
4. 5.
Śledzenie toku procedur VBA i pułapkowanie błędów |
199 |
|
Nazwa formantu |
Nazwa właściwości |
Ustawienie |
Bolą tekstu |
Nazwa (Name) Nazwa (Name) Nazwa (Name) Nazwa (Name) Nazwa (Name) Nazwa (Name) Nazwa (Name) Nazwa (Name) |
txtl txt2 txt2 txt3 txt4 txt5 txt6 txt7 |
|
|
|
|
|
|
1 X |
||||||||||
|
1 ■ i ■ i ■ i • |
i • I • 3 • I ■ 4 ■ 1 ■ 5 ' I ■ 6 ■ 1 ■ 7 ■*■ |
||||||||||||||
|
11 -f Szcsegófy |
|
| lJ i ■ . .. |
|||||||||||||
|
Kor |
iec tyc |
odnia |
|
|
|
J |
|
|
|||||||
|
Niezwiązany * |
|||||||||||||||
|
|
|
|
|
|
|
|
|
||||||||
|
; L |
Dzie |
i Dlata 5j ■•■■*= ~* " |
|
|
|
||||||||||
|
\ Tonit |
działe |
fjjNiezwiązany |
|
|
|
|
|||||||||
|
1 1 1 |
Wtoip |
cśjNiezwiązany -, < ■■ |
|
||||||||||||
|
|
|5rod |
• jWiezwiązany |
|
|
|
|
|||||||||
|
1 C |
warte |
:j|Niezwiązany |
|
||||||||||||
|
|
Plate |
yJNiez wiązany |
|
|
|
|
|||||||||
|
Sobot |
JjNiez wiązany |
|
|||||||||||||
|
fiedziel. |
JjNiezwiązany |
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
||||||||||
. |
■ .:■ ,: |
|
|
|||||||||||||
1! |
' |
|
|
Rysunek 1.41. Pole kombi przedstawione na tym formularzu zostanie wypełnione przez funkcję ListEndDates
! Zachowaj przygotowany formularz jako frmDniTygodnia.
l, Naciśnij Ctrl+R, aby wybrać formularz.
f, Uruchom okno Właściwości i kliknij zakładkę Zdarzenie.
200
Programowanie w Access! ś ledzenie '
K
liknij
obok właściwości
Przy
załadowaniu i
kliknij przycisk z trzema H
mi.
Wybierz Konstruktor
kodu i
kliknij OK.
W oknie Kod programu wpisz następującą procedurę obsługi zdj
Form_Load:
Private Sub Form_Load() With Me.cboEndDate .SetFocus .Listlndex = 5 End With End Sub
' wybierz datę końca tygodnia
Wybierz pole kombi na formularzu (cboEndDate) i ukatywnij okno Właścnfl
Kliknij
obok właściwości
Przy
zmianie na
zakładce Zdarzenie
i
kliknij p J
z
trzema kropkami. Wybierz Konstruktor
kodu i
kliknij OK.
Wpisz w oknie Kod programu następującą procedurę obsługi zdarzenia:
Private Sub cboEndDate_Change()
Dim endDate As Date
endDate = Me.cboEndDate.Value With Me
.txtl = Format(endDate - 6, "mm/dd" .txt2 = Format(endDate - 5, "mm/dd" .txt3 = Format(endDate - 4, "mm/dd" .txt4 = Format(endDate - 3, "mm/dd" .txt5 = Format(endDate - 2, "mm/dd" .txt6 = Format(endDate - 1, "mm/dd" .txt7 = Format(endDate - 0, "mm/dd" End With
End Sub
14.
Wybierz
Wstaw
I Moduł,
aby
dodać nowy standardowy moduł. W oknie f
ściwości
nowego modułu zmień
nazwę modułu na Dni
Tygodnia.
Kliknij
dwukrotnie myszą
na nazwę modułu DniTygodnia
w
oknie Eksploif
projektu
i
wpisz następującą procedurę funkcji w oknie Kod
programu:
Function ListEndDates(fId As Control, id As Variant, _ row As Variant, col As Variant, code As Variant) _
Lnie toku procedurVBAipulapkow^^
201
As Variant
Dim intOffset As Integer Select Case code
Case acLBInitialize
ListEndDates = True Case acLBOpen
ListEndDates = Timer Case acLBGetRowCount
ListEndDates = 11 Case acLBGetColumnCount
ListEndDates = 1 Case acLBGetColumnWidth
ListEndDates = -1 CaSe acLBGetValue
Inicjalizuj .
Otwórz. Unikatowy ID. Pobierz rzędy.
Pobierz kolumny.
1 Podaj szerokość kolumny.
' Użyj wyjściową szerokość.
' Pobierz dane. ' liczba dni do końcowej daty intOffset = Abs((8 - Weekday(Now)) Mod 7) 1 zacznij 5 tygodni przed bieżącą końcową datą ' (7 dni * 5 tyg = 35 dni przed następną końcową datą) 1 pokaż 11 tygodni ■
ListEndDates = Format(((Now() + intOffset) - 35) _ + 7 * row, "MM/DD/YYYY")
End Select jnd Function
fl3, Kliknij w dowolnym miejscu w wierszu kodu zawierającym następującą instrukcję:
jistEndDates = Format (( (Now () + intOffset) - 35) + 7 * row, ■Bi/DD/YYYY")
4, Naciśnij F9, aby ustawić punkt przerwania w wierszu kodu, w którym znajduje
się kursor.
Dodatkowym sposobem ustawienia punktu przerwania jest kliknięcie w oknie Kod programu wskaźnika marginesu (jeśli jest on widoczny) obok danej instrukcji VBA. Pasek wskaźników marginesowych znajduje się z lewej strony okna Kod programu. Visual Basic wyświetla wskaźniki marginesowe w celu uwidocznienia niektórych czynności wykonywanych podczas edycji kodu programu. Jeżeli kilka czynności odbywa się jednocześnie, na marginesie pojawiają się wszystkie stosowne wskaźniki. Po ustawieniu punktu przerwania Visual Basic wyświetla po lewej stronie zaznaczonej instrukcji (na marginesie) czerwoną kropkę. Zaznaczona instrukcja poją-
202
Programowanie w Accessfl
w ia się w kolorze białym na czerwonym tle (zob. rysunek 1.42). Kolor punktu pił wania można zmienić na zakładce Edytor w oknie dialogowym Opcje.
Po otwarciu formularza Visual Basic wywoła funkcję ListEndDates, abywH nić pole kombi datami końca tygodnia i zatrzyma się, gdy napotka na punkt przaH nia. Po zatrzymaniu procedury, na ekranie pojawi się okno Kod programu (zobI sunek 1.43) i Visual Basic wyświetli żółtą strzałkę w obszarze marginesu po \M stronie instrukcji, na której ustawiono punkt przerwania. Kod instrukcji znajdują wewnątrz ramki posiadającej żółte tło. Strzałka i ramka określają bieżącą instra lub instrukcję, która ma być następnie wykonana. Gdy bieżąca instrukcja J nocześnie instrukcją, która zawiera punkt przerwania, na marginesie wiersza zm się oba wskaźniki nałożone na siebie: kropka i strzałka.
RozOl - Dni tygodni,) (Code)
j(General)
JListEndDates
3
Option Compare Database
'
Inicjalizuj.
'
Otwórz.
1
Unikatowy 10.
'
Pobierz rzędy.
'
Pobierz kolumny.
'
Podaj szerokość
kolumny. Użyj wyjściową szerokość. Pobiera
dane.
Function
ListEndDatesffld As Control, id As Variant, _
row
As Variant, col As Variant, code As Variant) _
As
Variant
Dim intOffset As Integer Select Case code Case acLBInitialize
ListEndDates = True Case acLBOpen
ListEndDates = Timer Case acLBGetRowCount
ListEndDates = 11 Case acLBGetColumnCount | ListEndDates = 1 Case acLBGetColumnWidth
ListEndDates = -1 Case acLBGetValue
' liczba dni do końcowej daty
intOffset = Abs((B - Weekday (Now)) Mod 7)
' zacznij 5 tygodni przed bieżącą końcową datą
1 (7 dni * 5 tyg = 35 dni przed następną końcową datą)
' pokaż 11 tygodni
ListEndDates = Fomnat(((NowO + intOffset) + 7 * row. "MMWDD/YYYY
End Select End Function
ZPJJ
Rysunek 1.42. Wiersz kodu, w której ustawiono punkt przerywania, wyświetlony jest w koi określonym na zakładce Format w oknie dialogu Opcje
Pr śc
_ yri" .-■■-
Function ListEndDates(fld As Control, id As Variant, _ tow As Variant, col As Variant, code As Variant) _
As Variant
' Inicjalizuj.
' Otwórz.
' Unikatowy ID.
' Pobierz rzędy
1 Pobierz kolumny.
1 Podaj szerokość kolumny. 'Użyj wyjściową szerokość. Pobierz dans.
Dim intOffset As Integer Select Case code Case acLBInitialize
ListEndDates = True Case acLBOpen
ListEndDates = Timer Case acLBGetRowCount
ListEndDates = 11 Case acLBGetColumnCounl
ListEndDates = 1 Case acLBGetColumnWidth
ListEndDates = -1 Case acLBGetValue
' liczba dni do końcowej daty
intOffset = Abs((8 - Weekday(Now)) Mod 7)
' zacznij 5 tygodni przed bieżącą końcową datą
' (7 dni * 5 tyg = 35 dni przed następną końcową datą)
'pokaż 11 tygodni
indDates = Format(((NowO + intOflset) - 35) m 1+ 7 * row. "MWDD/YY YY") End Select End Function
Rysunek 1.43. Gdy Visual Basic napotka na punkt przerwania, wyświela okno Kod programu
oraz zaznacza bieżącą instrukcję
Możesz dalej odtwarzać procedurę krok po kroku, naciskając F8, lub w trybie normalnym bez zatrzymywania, naciskając F5. Po zakończeniu odtwarzania procedu-Visual Basic nie usuwa punktu przerwania. Usuń punkt przerwania, wybierając aliza => Wyczyść wszystkie punkty przerwania (Debug => Clear All Breakpo-s) lub naciskając kombinację klawiszy Ctrl+Shift+F9. Wszystkie punkty przerwa-zostaną. usunięte. Jeżeli ustawiłeś kilka punktów przerwania w danej procedurze ichctałbyś tylko usunąć jeden z nich, kliknij w wierszu kodu zawierającej punkt przerwania i naciśnij F9 (lub wybierz Debug => Clear Breakpoint). Powinieneś usunąć wszystkie punkty przerwania, jeżeli nie są one już potrzebne. Punkty przerwania zostaną usunięte automatycznie przy zakończeniu pracy z aplikacją Microsoft Access.
Visual Basic umożliwia ustawienie dowolnej liczby punktów przerwania w danej ^edurze. W ten sposób możesz przerwać i kontynuować wykonanie swojej procenty według własnych potrzeb. Możesz analizować kod procedury i sprawdzać wartości zmiennych, gdy procedura znajduje się w trybie przerwania. Możesz również przeprowadzać różne eksperymenty w oknie Instrukcje bezpośrednie, wpisując roz-
204
Programowanie w Access 201
m aite polecenia. Ustaw punkt przerwania, jeżeli podejrzewasz na przykład, że twj procedura nie wykonuje określonego bloku kodu.
Użycie okna Instrukcje bezpośrednie w trybie przerwania
W czasie przerwania programu, gdy pojawi się okno Kod programu, raożes uruchomić okno Instrukcje bezpośrednie i wpisać instrukcję Visual Basica, która ■ przykład poda nazwę otwartego formularza lub wartość jakiegoś formantu. Mojl również skorzystać z okna Instrukcje bezpośrednie, ab}' zmienić zawartość ztniJ nych. Dzięki temu zostaną poprawione wartości, które być może powodują błędy. 1
', RozOl - DniTygodnia(Code)
(General)
Option Compare Database
Function ListEndDatesffld As Control, id As Variant, row As Variant, col As Variant, code As Variant). As Variant Dim intOffset As Integer
? Screen.ActiveControl. value
04-07-2002
?int Offset
1
Case acLBGetValue ' Pobierz dane.
' liczba dni do końcowej daty intOffset = Abs((8 - Weekday(Now)) Mod 7) ' zacznij 5 tygodni przed bieżącą końcową datą ' (7 dni * 5 tyg = 35 dni przed następną kolkową datą) 'pokaż 11 tygodni
łEndDates = Formał(((Now0 + intOffset) - 35) _ ~1+ 7 * row, -MM/DD/YYY Y") End Select End Function
Rysunek 1.44. Gdy wykonanie procedury jest zawieszone, możesz zadać różne pytania, wpisując odpowiednie instrukcje w oknie Instrukcje bezpośrednie
Rysunek 1.44 przedstawia procedurę changecode w zawieszeniu oraz okno luf strukcje bezpośrednie z pytaniami, które wpisano w trybie przerwania. W tym tr/M możesz szybko sprawdzić zawartość zmiennej w pozycji kursora w oknie Kod prJ gramu. Wystarczy zbliżyć wskaźnik myszy do nazwy zmiennej w procedurze, aJ
Śledzenie toku procedur VBA i pułapkowanie błędów 205
Ljwiedzieć się, jaką wartość zmienna ta w danej chwili przechowuje. Na przykład, ■funkcji przedstawionej na rysunku 1.45 ustawiono punkt przerwania na instrukcji noprzedzającej słowa kluczowe End select. Gdy Visual Basic napotka na tą instruk-Kń pojawi się okno Kod programu. Ponieważ Visual Basic wykonał już instrukcję, która przypisuje wartość zmiennej intoffset, możesz szybko dowiedzieć się, jaka fet zawartość tej zmiennej, umieszczając wskaźnik myszy na nazwie zmiennej. Na-L zmiennej i jej bieżąca wartość pojawią się w ramce. Aby od razu poznać wartości «iecej niż jednej zmiennej, powinieneś skorzystać z okna Locals omówionego dalej Hytn rozdziale.
^™ Case acLBGetValue ' Pobierz dane.
' liczba dni do końcowej daty intOffset = Abs((8 - Weekday(Now)) Mod 7) 1 zacznij 5 tygodni przed bieżącą końcową datą ' (7 dni * 5 tyg = 35 dni przed następną końcową datą) ' pokaż 11 tygodni
[ListEndDates = Fomłat(((NowO + irrti&łfeet) - 35) _ ^H+T * row. "MM/DD/YYYYiintQffset = 11 End Select End Function
jk 1.45. W trybie przerwania możesz poznać wartość zmiennej, ustawiając wskaźnik myszy na nazwie zmiennej
i w oknie Kod programu w trybie przerwania
W trybie przerwania możesz zmienić swój kod, dodać nowe instrukcje, wykony-procedurę w trybie krokowym, wykonywać procedurę wiersz po wierszu lub skoczyć pewne wiersze kodu, korzystać z okna Instrukcje bezpośrednie, itp. Visual Basic wejdzie w tryb przerwania, możliwy jest dostęp do wszystkich opcji enu Analiza (Debug). Możesz uruchomić tryb przerwania, naciskając klawisze Ctrl+Break, F8 lub ustawiając punkt przerwania (Breakpoint). Jeżeli pracując w trybie przerwania zmodyfikujesz pewne wiersze kodu, Visual zapyta, czy chcesz uruchomić tryb edycji projektu. Po kliknięciu OK procedura lie zatrzymana i będzie można wykonać te zmiany w kodzie procedury, które nie xbyć wprowadzone w trybie przerwania. Jeśli klikniesz Anuluj na zadane pyta-wprowadzone w procedurze zmiany zostaną usunięte i wykonanie procedury bę-wykonywane dalej Uruchom dowolną procedurę w trybie krokowym i spróbuj zmienić deklarację jednej z zadeklarowanych zmiennych. Następnie nacisnij klawisz k aby kontynuować wykonywanie instrukcji procedury. W tym momencie Visual „zapyta", czy chcesz zresetować swój projekt.
206
Programowanie w Access 21
U życie instrukcji Stop
Nie zawsze uda ci się sprawdzić daną procedurę od razu. Niekiedy śledzenie! prawności procedury należy odłożyć na później, aby zająć się innymi ważniejszl w danej chwili sprawami. Gdy ustawisz punkty przerwania i zamkniesz bazę dani punkty przerwania zostaną usunięte i następnym razem będziesz musiał je pono J ustawić. Masz jednak jeszcze inne wyjście. Możesz zaznaczyć w procedurze m punkty, które nie zostaną usunięte po zakończeniu pracy z aplikacją Microsoft Accl Służy to tego specjalna instrukcja stop. Po prostu wpisz słowo Stop wmiejsci w których chcesz przerwać daną procedurę. Rysunek 1.46 przedstawia polecenie s J przed instrukcją with. . .End with. Visual Basic przerwie wykonywanie procedural napotkaniu instrukcji Stop. Na ekranie pojawi się okno Kod programu w trybie J rwania. Instrukcja stop posiada jedną wadę. Kiedy zatrzymywanie programu niel dzie już potrzebne, musisz sam odszukać i usunąć wszystkie wpisane w nim instrJ
Stop.
M RozOl - Form frmOniTv-i»iliii.i ii
IcboEndDate
-rj Change
Option Compare Database
Private Sub cboEndDate_ChangeQ Dim endDate As Date endDate = Me.cboEndDate.Value Stop With Me
.txt1 = Format(endDate - 6, "rnm/dd") ,txt2 = Format(endDate - 5, "mm/dd") .txt3 = Format(endDate - 4, "mm/dd") .txt4 = Format(endDate - 3, "mm/dd") .txt5 = Format(endDate - 2, "mm/dd") .txt6 = Format(endDate -1, "mm/dd") .txt7 = Format(endDate - 0, "mm/dd") End With End Sub
lid
Rysunek 1.46. W dowolnym wierszu kodu możesz wpisać instrukcję Stop. Procedura zostaj zatrzymana w momencie napotkania instrukcji Stop. Na ekranie pojawi się I okno Kod programu z zaznaczonym wierszem kodu
R
'
Sprawdzanie wartości zmiennych (dodawanie czujek)
Wiele błędów w programach jest wynikiem zmiennych, które przyjmują| oczekiwane wartości. Jeżeli procedura posiada zmienne, których wartości się;
207
i sprawdzić w danym Jak to zrobić? Visual o nazwie „czujka" (Watch expression), które służy
Break When Value Is True r Break When Value Changes
i lvsunek 1.47. W oknie dialogowym Dodaj czujkę można zdefiniować wyrażenie, które ma
być śledzone w oknie Czujka w trakcie odtwarzania procedury W oknie dialogowym Dodaj czujkę znajdują się trzy sekcje. Ich znaczenie wyjaśnione jest poniżej.
wyrażenie
(Expression)
Wyświetla nazwę zmiennej zaznaczonej w procedurze. Jeżeli uruchomione zostało okno dialogu Dodaj czujkę (Add Watch) bez zaznaczenia nazwy zmiennej, to w oknie tym należy wpisać nazwę zmiennej, którą zamierzasz obserwować w toku wykonywania procedury.
Kontekst (Context)
W tej sekcji należy wskazać nazwę procedury, w której znajduje się dana zmienna, oraz nazwę modułu, gdzie wpisana jest procedura stosująca tę zmienną.
208
T yp czujki (Watch Type)
Programowanie w Access:
Określa sposób śledzenia zmiennej. Jeśli zaznaczysz oni Śledź wyrażenie (Watch Expression), to po wprowadzę! procedury w stan przerwania będzie można odczytać wj zmiennej w oknie Czujka. Jeśli wybierzesz opcję PrzeJ gdy wartością wyrażenia jest True (Break When Value! True), to Visual Basic automatycznie przerwie procedura zmienna przybierze wartość inną niż zero. Ostatnia opcji] Przerwij, gdy wartość wyrażenia ulegnie zmianie (Bid When Value Changes) wprowadza procedurę w stanprJ nia za każdym razem, gdy wartość zmiennej ulega żmii
Jeśli chcesz usunąć lub dodać dodatkowe czujki, wystarczy wybrać opcję czujkę (Edit Watch) z menu Analiza (Debug).
Jaka jest różnica między punktem przerwania a ;zujką? Punkt przerwania m zatrzymuje program w danym miejscu. Czujka natomiast zatrzymuje program! wtedy, gdy dany warunek (Przerwij, gdy wartością wyrażenia jest True lub Prl gdy wartość wyrażenia ulegnie zmianie) jest spełniony. O ile punkty przerwania! czą pojedynczych wierszy kodu, czujki odnoszą się do całych procedur. ZobaJ na przykładzie.
1. Przygotuj procedurę JakaData pokazaną na rysunku 1.48.
(General)
- !JakaData
Option
Compare Database
Option
Explicit
Sub JakaDataQ
Dim obecnaData As Date Dim nowaData As Date Dim x As Integer
obecnaData = Date For x = 1 To 365
nowaData = Date + x Next x
End Sub
Breaks JakaData Breaks.JakaData
Rysunek 1.48. Korzystanie z okna Czujka (Watches)
Śledzenie toku procedur VB A i pułapkowanie błędów
209
P rocedura JakaData wykorzystuje pętlę For. . .Next dla obliczenia daty oddalo-Lj od bieżącej daty o wartość sprecyzowaną w zmiennej x. Jeśli wywołasz tę procedurę, to nie otrzymasz żadnego wyniku, chyba że umieścisz w procedurze dodatkową instrukcję typu:
jsgBox "Za " & x
dni będzie " & NowaData
T o już potrafisz robić. Tym razem nie chodzi jednak o wyświetlanie dzień po dniu kolejnych dat. Przypuśćmy, że chcesz zatrzymać program, gdy wartość zmiennej ij wyniesie 211. Innymi słowy, chcesz się szybko dowiedzieć, jaka będzie data wkalendarzu za 211 dni. Jeśli sobie przypominasz zagadnienie tego rozdziału doty-acepodejmowania decyzji w Visual Basicu, to na pewno masz ochotę po prostu do-jićdotej procedury wiersz kodu:
••■ x = 211 Then MsgBox "Za " & x S " dni będzie " & NowaData
j Tym razem jednak chcesz odpowiedzieć na to pytanie (jaka data będzie za 211 itf) bez jakiejkolwiek modyfikacji bieżącego kodu procedury. Jak to zrobić? Gdy i«tawisz w procedurze czujki, to Visual Basic przerwie w odpowiednim momencie wtlę i będzie można sprawdzić wartości odpowiednich zmiennych.
I Wybierz Analiza => Dodaj czujkę (Debug => Add Watch).
I W polu Wyrażenie (Expression) wpisz następujące wyrażenie: x = 211
I, W sekcji Kontekst (Context) wybierz JakaData w polu kombi Procedura (Procedure) oraz Breaks w polu kombi Moduł (Module).
[ W sekcji Typ czujki (Watch Type) wybierz opcję Przerwij, gdy wartością wyrażenia jest True (Break When Value Is True).
i, Kliknij OK, aby zamknąć okno dialogowe Dodaj czujkę (Add Watch). Dodałeś w tej chwili pierwsze wyrażenie czujki.
I W oknie Kod programu ustaw wskaźnik myszy w dowolnym miejscu zmiennej
obecnaData.
I, Wybierz Analiza => Dodaj czujkę (Debug => Add Watch). Następnie kliknij OK, aby ustawić czujkę.
| W oknie Kod programu ustaw wskaźnik myszy w dowolnym miejscu zmiennej
nowaData.
u Wybierz Analiza => Dodaj czujkę (Debug => Add Watch). Następnie kliknij OK, aby ustawić czujkę.
Programowanie w AccesJ
Po wykonaniu powyższych czynności procedura jakaData zawiera trzy < podane poniżej:
x = 211 Przerwij, gdy wartością wyrażenia jest True
obecnaData Śledź wyrażenie
nowaData Śledź wyrażenie _
11. Ustaw kursor w dowolnym miejscu procedury JakaData i naciśnij klawiszFS i Visual Basic zatrzymuje procedurę, gdy x = 211 (patrz rysunek 1.48 wyj Zwróć uwagę, że wartość zmiennej x w oknie dialogowym Czujki zgadza z wartością, którą podałeś' w oknie dialogu Dodaj czujkę. Oprócz tego w oknie znajdują się wartości dwóch pozostałych zmiennych. Procedura znajduje się wstanie przerwania. Jak postępować dalej? Możesz nacisnąć klawisz F5 dokończyć pętlę i zakończyć procedurę lub możesz zadać następne pytanie: Jaka! będzie za 277 dni od daty bieżącej? Jak to zrobić, demonstruje kolejny punld strukcji.
Wybierz
z menu Analiza
opcję
Edytuj
czujkę i
wpisz w polu Wyrażenie:]
277.
Kliknij OK, aby zamknąć okno dialogu Edytuj czujkę.
Zwróć uwagę, że w oknie Czujki zmienia się wartość wyrażenia. WartJ zmiennej x teraz równa jest False.
14. Naciśnij klawisz F5.
Procedura zatrzymuje się ponownie, gdy wartość x = 277. Wartość zmiem obecnaData jest oczywiście taka sama. Zmienna nowaData wyświetla jednak datę] daloną od dzisiejszego dnia o 277 dni. Możesz dalej pytać o inne późniejsze daty zakończyć procedurę.
15. Naciśnij klawisz F5, aby zakończyć procedurę.
W czasie odtwarzania procedury okno Czujki (Watches) wyświetla wartości rażeń oraz zmiennych. Po zakończeniu procedury w oknie Czujki zamiast zmiennych pojawia się komunikat > <poza kontekstem> (<out of contes Oznacza to, że gdy wartość wyrażenia jest poza kontekstem, to wyrażenie (zmienna)! posiada wartości. Aby usunąć czujkę, kliknij w oknie Czujki na wyrażenie, które usunąć, i naciśnij Delete.
16. Usuń wszystkie wyrażenia czujki, które dodałeś w tym ćwiczeniu.
211
Lżenie toku procedur VB A i pulapkowanie błędów
^stosowanie okna dialogu Szybka czujka
I Czasami wartości zmiennych ustawia się w danej procedurze tylko raz. Gdy
Iwrtość zmiennej jest taka sama dla całej procedury, można szybko sprawdzić wartość
lej zmiennej za pomocą okna dialogowego Szybka czujka (zob. rysunek 1.49).
Add |
1 |
Cancel |
|
Help |
|
02-05-04
W oknie dialogowym a^yuKa ^ujivd można sprawdzić wartość zmiennej lub
wyrażenia, dla których nie zdefiniowano wyrażenia czujki Okno dialogowe Szybka czujka można wywołać w następujący sposób: po przerwaniu wykonania programu w oknie Kod programu ustaw kursor w obrębie nazwy zmiennej
wybierz z menu Analiza opcję Szybka czujka (Quick Watch) lub naciśnij klawisze Shift+F9.
I Wy
= 50.
z okna dialogowego Szybka czujka. W procedurze JakaData ustaw kursor na zmiennej x. blerz Ana«iza => Dodaj czujkę (Debug => Add Watch).
wyrażenie: x
Value is True) i naciśnij OK. 5, Uruchom procedurę JakaData.
212
Programowanie w Access Im
Visual Basic zatrzyma procedurę, gdy x = 50. Zwróć uwagę, że w oknie czj nie ma ani zmiennej nowaData, ani obecnaData. Aby sprawdzić wartość tych żmij nych, ustaw mysz na nazwie zmiennej w oknie Kod programu lub włącz okno Szyli ka czujka (Quick Watch).
6. W
oknie Kod programu ustaw mysz wewnątrz
nazwy zmiennej nowaDatl
i
naciśnij Shift+F9.
Okno Szybka czujka (Quick Watch) wyświetla nazwę wyrażenia oraz jej obecną wartość.
Kliknij Anuluj, aby wrócić do okna Kod programu.
W
oknie Kod programu ustaw wskaźnik
myszy wewnątrz zmiennej obecnan
ta
i naciśnij Shift+F9.
9.
Teraz okno Szybka czujka pokazuje wartość zmiennej obecnaData. Kliknij Anuluj, aby wrócić do okna Kod programu.
10. Naciśnij F5, aby kontynuować odtwarzanie procedury.
Korzystanie z okien dialogowych: Zmienne lokalne i Stos wywołań
Jeżeli w trakcie odtwarzania danej procedury VBA chcesz rzucić okiem na lis wszystkich zadeklarowanych zmiennych i sprawdzić ich bieżące wartości, to pd uruchomieniem procedury wybierz Widok => Okno zmiennych lokalnych (View Locals Window). Po przejściu z trybu wykonywania programu do trybu przerwa Visual Basic wypisze listę zmiennych i poda ich bieżące wartości w oknie Zmieu lokalne (zob. rysunek 1.50).
W oknie Zmienne lokalne znajdują się trzy kolumny. W kolumnie przedstawione są nazwy zmiennych zadeklarowanych w bieżącej procedurze. Wpij szym wierszu znajduje się zmienna o nazwie modułu poprzedzona znakiem plus.1 kliknięciu na znak plus można sprawdzić listę zmiennych na poziomie modułu. Moi klasy wyświetli w tym miejscu zmienną systemową o nazwie Me. W oknie ZmieJ lokalne, jak sama nazwa wskazuje, zmienne globalne oraz zmienne innych projekJ nie są wyświetlane.
Druga kolumna podaje spis wartości zmiennych. W tej kolumnie można klikj myszą i zmienić wartość zmiennej na inną. Po zmianie wartości zmiennej możnanJ snąć klawisz Enter, aby zatwierdzić wprowadzoną zmianę. Zmiany można teżj wierdzić za pomocą innych klawiszy: Tab, Shift+Tab, strzałka w dół, strzałka w J lub klikając w dowolnym obszarze ekranu.
i Śledzenie toku procedur VBA i pułapkowanie błędów
213
F cenef'
_J
J] Option Compare
Database
S ubJakaDataQ ^K\atecuaData As Date Dim nowaData As Date Dim x As Integer
obecnaData = Date For x = 1 To 365
nowaData
=
Date
+
x
Nextx
EndSub
jy
obecnaData |
#2002-04-07* |
nowaData |
#2003-01-08* |
|
277 |
Date Date
Integer
HUD
l ysunek 1.50. Okno Zmienne lokalne wyświetla wszystkie zadeklarowane zmienne w bieżącej procedurze i podaje ich wartości
W trzeciej kolumnie znajduje się spis typów zmiennych.
Aby śledzić wartości zmiennych w oknie Zmienne lokalne, wykonaj następujące fctrukcje:
|, Wybierz Widok => Okno zmiennych lokalnych (View => Locals Window). 2, Kliknij w dowolnym miejscu w obrębie kodu procedury JakaData i naciśnij F8.
Po naciśnięciu F8 uruchomiłeś tryb przerwania. Okno Zmienne lokalne wy-
jwietla nazwę bieżącego modułu oraz nazwy zmiennych lokalnych z ich wartościami
oczątkowymi.
Naciśnij F8 kilka razy, obserwując zawartość okna Zmienne lokalne.
i, Naciśnij F5, aby kontynuować odtwarzanie procedury.
W oknie Zmienne lokalne znajduje się również przycisk z trzema kropkami, ttóry otwiera okno dialogowe Stos wywołań (Call Stack) pokazujące rozpoczęte, ale nie zakończone procedury (zob. rysunek 1.51).
214
Programowanie w AccJ
O kno Stos wywołań można uruchomić bezpośred lio z menu Widok, wybił
się P^ opcję Stos wywołań (View => Call Stack). Opcja ta jest dostępna tylko wtfl
przerwania.
[ (General)
t IListEndDates
Option Compare Database
Function ListEndDates(fld As Control, id As Variant, _ row As Variant, col As Variant, code As Variant) _ As Variant
Dim intOffset As Integer Select Case code
Case acLBInitialize ' Inicjalizuj.
ListEndDates
=
True
Case
acLBOpen '
Otwórz.
ListEndDates = Timer ' Unikatowy ID
Case acLBGetRowCount ' Pobierz rzędy.
ListEndDates = 11
; <Non-BasicCode>]
kozdzial 1. FormJ rmDniTygodnia. Form_Load
—' asiampaiwb
-
i uiiiicnmi<iowu'"if"
+ 7 * row, "MM/DD/YYYY") End Select End Function
Rysunek 1.51. Okno Stos wywołań przedstawia listę aktywnych procedur
Okno Stos wywołań jest szczególnie przydatne do śledzenia procedur zaJ dżonych. Procedurą zagnieżdżoną nazywamy procedurę, która jest wołana z innejl cedury. Gdy dana procedura wywołuje inną, to nazwa wywołanej procedury jJ tomatycznie dodawana do listy procedur w oknie Stos wywołań. Gdy Visual ■ wykona polecenia procedury wołanej i wróci do procedury wywołującej, to 1 zakończonej procedury jest usuwana z listy. Możesz skorzystać z przycisku M (Show) w oknie Stos wywołań, aby wyświetlić instrukcję, która przywołuje nas* procedurę wymienioną w oknie Stos wywołań.
Śledzenie wykonywania kodu programu
2.
Aby śledzić wykonanie programu od samego początku, wystarczy ustawić lal w dowolnym wierszu procedury, którą chcemy śledzić, i wybrać z menu AnaliyK lecenie Krokowo (Debug => Step Into) lub nacisnąć F8. W menu Analiza znafl
Mżenie toku procedur VBA i pułapkowanie błędów
215
w polecenia, które umożliwiają wykonywanie programu w trybie krokowym (zob. rvsunek 1.52)
V-
o j Edit View Insert: Debug Run lools Add-lns Window Help
'ffl jt. Q S|i § Compile Rozdziali
BEBBBi 9S step Into Ci Step&ver ^IStepOuJ Form Jjistome ->3 Run To Cursor
Form JrmDnlTy "
Form
JrmPensj feM Watch...
g
Form_Ktenci
'
ft
Cj Modules &f
Quick
Watch...
13
F8
Shift+FB
Ctrl+Shift+FS
Ctrl+F8
- ListEndDates
D atabase
^s Integer
ode
Initialize
)ates = True
Open
)ates = Timer
Dates(fld As Control, id As Variant, _ t, col As Variant, code As Variant) _
ShifW-F9
' Inicjalizuj.
' Otwfii i.
' Unikatowy iD.
' Pobieiz izędy.
' Pobierz kolumny.
(J Conditional •ft Toggle Breakpoint F9
■4J Constants goar All Breakpoints Ctrl+Shift+F9
Set Next Statement Show Ne&t Statement
,JJ DniTygodnla
CM+F9
tygodnia Module flab* j Categorized j Kflygodnia
GetRowCount )ates= 11 tas'B 'aCLHGetColumnCount
'
Podaj szerokość
kolumn;
'
Użyj wyjściową szerokoś;
'
Pobierz
dans. ii
ListEndDates = 1 Case acLBGetColumnWidth
ListEndDates = -1 Case acLBGetValue
' liczba dni do końcowej daty intOffset = Abs((8 - Weekday(Now)) Mod 7) ' zacznij 5 tygodni przed bieżący końcowa^ datą ' (7 dni * 5 tyg - 35 dni przed następny końcową datą) 1 pokaż 11 tygodni ListEndDates"= Format(((Now() + intOffset) - 35) _
+ 7 * row. "MM/DD/YYYY") End Select
t anek 1.52. Menu Analiza w oknie edytora Visual Basic zawiera szereg opcji ułatwiających śledzenie procedur
Przy śledzeniu procedury Krokowo (F8) Visual Basic wykonuje każdy wiersz procedury, aż do napotkania słów kluczowych End Sub. Jeżeli nie chcesz śledzić procedury w trybie krokowym, wystarczy nacisnąć F5.
Śledzenie procedury w trybie krokowym
Ustaw kursor w dowolnym miejscu kodu procedury, którą chcesz śledzić. i Naciśnij klawisz F8 lub wybierz z menu Analiza opcję Krokowo.
Visual Basic odtwarza bieżącą instrukcję i automatycznie przechodzi do następnego wiersza procedury, zatrzymując wykonywanie programu. W trybie przerwania programu można uruchomić z menu Widok okno Instrukcje bezpośrednie, okno Czujki lub okno Zmiennych lokalnych, aby śledzić efekt danej instrukcji na
wartości zmiennych i wyrażeń. Jeżeli śledzony program woła inne procedury włączyć okno Stos wywołań, aby sprawdzić, które procedury są aktywne.
3. Naciśnij ponownie klawisz F8, aby wykonać zaznaczoną instrukcję.
Po wykonaniu tej instrukcji Visual Basic zaznaczy następną ins i ponownie się zatrzyma.
4. Kontynuuj
śledzenie
procedury za pomocą klawisza F8 lub naciśnij klaw
aby
kontynuować wykonanie programu bez zatrzymywania. Możesz też
i
Uruchom
=> Zresetuj (Run
=> Reset),
aby
przerwać wykonywanie prograi
Śledzenie programu Krokowo z pomijaniem
Przy śledzeniu programu Krokowo z pomijaniem (Step Over) (Shift+Fjj ual Basic wykonuje każdą procedurę, tak jak by to była pojedyncza instrukcja. opcji należy skorzystać, gdy dany program woła inne procedury, których nie o odtwarzać krokowo, gdyż zostały już przetestowane.
Załóżmy, że bieżąca instrukcja procedury MojaProcedura woła proc o nazwie Komunikatspecjalny. Jeżeli zamiast opcji Krokowo wybierzesz ( Krokowo z pomijaniem (Shift+F8), Visual Basic błyskawicznie wykona wsj polecenia procedury Komunikatspecjalny i wybierze następne poJei w procedurze wołającej (MojaProcedura). W czasie odtwarzania instrukcji pro Komunikatspecjalny Visual Basic wyświela przez cały czas okno Kod pr z instrukcjami bieżącej procedury.
1.
Wpisz następujące procedury w tym samym module, w którym wpisaii przednio procedurę JakaData:
Sub Moj aProcedura()
Dim strNazwa As String
strNazwa = Forms!frmDniTygodnia.Controls(1).Name ' wybierz opcję Krokowo z pomijaniem ' aby nie śledzić kodu w procedurze wołanej Komunikatspecjalny strNazwa Bnd Sub
Sub Komunikatspecjalny(n As String) If n = "LabelI" Then
MsgBox "Należy zmienić nazwę etykietki." End If End Sub
nie toku procedur VBA i pułapkowanie błędów
217
D odaj punkt przerwania w następującym wierszu kodu w procedurze Moja procedura:
[SpecialMsg myName
K, Umieść kursor w dowolnym miejscu procedury MojaProcedura i naciśnij F5, I aby ją uruchomić.
Visual Basic zatrzyma wykonywanie kodu procedury, gdy napotka punkt prze-
i rwania.
f Naciśnij Shift+F8 lub wybierz Analiza =» Krokowo z pomijaniem (Debug =>
Step Over).
Visual Basic przeskakuje procedurę Komunikatspecjalny i wykonanie procedu-Ctoczy się dalej.
i Naciśnij F5, aby kontynuować wykonywanie procedury w trybie normalnym.
Śledzenie programu Krokowo z pomijaniem stosuje się, gdy nie chcesz analizować poszczególnych instrukcji procedury wołanej (Komunikatspecjalny). Po pro-jdi interesują cię tylko pojedyncze instrukcje w procedurze głównej (MojaProcedura).
Inne polecenie w menu Analiza, Wyjdź z procedury (Step Out)
(Ctrl+Shift+F8), stosuje się, gdy wkroczymy do procedury wołanej i zdecydujemy,
[żenię chcemy śledzić jej instrukcji krok po kroku. Po wybraniu tej opcji Visual Basic
wykona pozostałe instrukcje tej procedury, tak jak by to była pojedyncza instrukcja,
po czym przejdzie do następnej instrukcji w procedurze wywołującej.
W trakcie śledzenia programu można na przemian wybierać opcje Krokowo '(Step Into), Krokowo z pomijaniem (Step Over) lub Wyjdź z procedury (Step Out). lybór opcji zależy od tego, który fragment procedury chcemy w danej chwili analizować.
Polecenie Uruchom do kursora (Run to Cursor) (Ctrl+F8) umożliwia odtwo-uenie programu do miejsca zaznaczenia. To polecenie jest szczególnie przydatne, gdy chcesz pominąć duże pętle w procedurze lub zatrzymać program przed dużą pętlą.
Załóżmy, że chcesz wykonać procedurę MojaProcedura tylko do wiersza kodu,
ttóra woła procedurę Komunikatspecjalny.
Kliknij W wierszu kodu Komunikatspecjalny strNazwa.
[ Wybierz Analiza => Uruchom do kursora (Debug => Run to Cursor).
Visual Basic zatrzyma procedurę, gdy dotrze do wskazanego wiersza. I Naciśnij Shift+F8, aby pominąć procedurę Komunikatspecjalny.
218
Programowanie w Access! ślec
nur
wai
pet
Vai
taw
Za
VE
ten
prc
Co
pe\
rur
prc
lub
poi
\vp
żer
wy
byi
ko'
nui
nal
4.
Naciśnij
F5, aby wykonać pozostałe wiersze procedury w trybie normalnyJ
Ustawianie następnej instrukcji
Czasami będziesz chciał ponownie odtworzyć procedurę od poprzedii wykonanych) wierszy kodu lub będziesz chciał przeskoczyć pewien fragment J który powoduje jakiś błąd. W każdej z tych sytuacji możesz skorzystać zpolJ Ustaw następną instrukcję (Set Next Statement) w menu Analiza (Debug), jl zatrzymasz wykonywanie danej procedury, to możesz wznowić tę proca z dowolnej instrukcji. Visual Basic po prostu pominie wykonywanie program! między nowo wybraną instrukcją a instrukcją, na której tymczasowo zatrz konywanie procedury.
Pomijanie wierszy kodu
Chociaż pomijanie wierszy kodu jest bardzo pomocne przy testowaniu proctB VBA, trzeba mieć się tu na baczności. Gdy wywołasz polecenie Ustaw nastenfl strukcję, Visual Basic przyjmuje, że wskazana instrukcja ma być odcfl w następnej kolejności. Wszystkie wiersze kodu pomiędzy obecną pfl w procedurze i następną instrukcją zostaną zignorowane. Oznacza to, że pewnej ności, które miały się wydarzyć, nie zostaną wykonane, co może spowodowaB przewidziane błędy.
Wskazywanie następnej instrukcji
Jeżeli
nie jesteś pewien, od którego wiersza kodu dana procedura będzie
i
wykonana,
wybierz z menu Analiza opcję Pokaż następną instrukcję
(Showł
Statement).
Visual Basic
umieści kursor w wierszu, który zamierza następnie odH
zyć.
Jest to szczególnie pożyteczne polecenie, gdy przeglądałeś inne
procedury ■
jesteś
pewen, w którym miejscu (lub w której procedurze) nastąpi
kontynuacjanfl
nywania
programu. Polecenie Pokaż następną instrukcję jest dostępne
tylko \\M
przerwania. ,
Zatrzymywanie wykonywania programu
Analizując instrukcje procedur VBA w oknie Kod programu wj krokowym, w każdej chwili można:
• nacisnąć klawisz F5, aby wykonać pozostałe instrukcje procedury bez śledj toku wykonywania programu,
219
:nje toku procedur VBA i pułapkowanie błędów
I wybrać Uruchom ^^^uT^eset), aby zakończyć procedurę bez wykonywania pozostałych instrukcji liu procedury \
S
uwiona
n
na
Nothing.
losowanie kompilacji warunkowej
gramu
S e podany, w z„iązkU Zc,ym n,e
na rozmiar lub efektywność programu.
, musi
»ie
na
[ gracji SB.ych komp,.aej, warunkowej nalety dokonad w sekcj, deklaracj,
kartce modułu, na przykład:
220
Programowanie w /
# Const User = True
Powyższa instrukcja deklaruje stałą kompilacji o nazwie user.
W procedurze podanej poniżej informacje podane są w języku angielski stała kompilacji o nazwie verAng ma wartość True (Prawda). Procedura i wówczas funkcję weekday, która zwraca nazwę dnia tygodnia w języku angielsl podstawie podanej daty. Aby skompilować program w języku polskim, zmienić stałą kompilacji na False (Fałsz), i Visual Basic przejdzie do bloku im który znajduje się po dyrektywie #Eise, wywołując funkcję DzTygodni| wyświetli dzień tygodnia w języku polskim. Gdy wartość stałej kompilacji jes to procedura Dni woła funkcję DzTygodnia, która zwraca dzień tygodnia, kora ze struktury select case.
Wstaw nowy moduł i zmień jego nazwę w oknie Właściwości na Conditi
Wpisz procedurę Dni oraz funkcje Dayofweek oraz DzTygodnia podaner
■
' zadeklaruj stałą kompilacji #Const verAng = True
Sub Dni()
Dim intDz As Integer
#If verAng = True Then
intDz = Weekday(InputBox("Enter date, e.g.: 07/15/2002"
MsgBox DayOfWeek(intDz) #Else
DzTygodnia #End If End Sub
Function DayOfWeek(intDz As Integer) As String
DayOfWeek = Choose(intDz, "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday")
End Function
Function DzTygodnia() As String
Select Case'Weekday (InputBox ("Wpisz c.atę, e.g. 01/01/2000")) Case 1
DzTygodnia = "Niedziela" Case 2
DzTygodnia = "Poniedziałek"
Śledzenie toku procedur VBA i pułapkowanie błędów
221
C ase 3
DzTygodnia = "Wtorek" Case 4
DzTygodnia = "Środa" Case 5
DzTygodnia = "Czwartek" Case 6
DzTygodnia = "Piątek" Case 7
DzTygodnia = "Sobota" End Select MsgBox DzTygodnia fcd Function
3, Uruchom procedurę Dni.
Ponieważ wartość stałej kompilacji u góry kartki modułu jest True (verAng) Visual Basic woła funkcję Dayofweek, która wyświetli nazwę dnia w języku angielskim. Program zapytuje po angielsku o wprowadzenie danych i wyświetla rezultat w tym samym języku. Aby uruchomić polską wersję kodu, zmień wartość stałej verAng na False i ponownie uruchom procedurę Dni.
Zamiast deklaracji stałych warunkowych kompilacji u góry kartki modułu, można wybrać opcję Właściwości z menu Narzędzia (Tools => Debugging Properties). Pojawi się okno Właściwości przedstawione na rysunku 1.53. Przy korzystaniu z okna Właściwości wpisz następujące wyrażenie w polu tekstu Conditional Compilation
Arguments, aby włączyć polską wersję procedury Dni:
tertag = 0
Jeżeli masz więcej niż jedną stałą kompilacji, to stałe te należy oddzielić od sie-bie dwukropkiem.
Skomentuj polecenie #Const verAng u góry kartki modułu i wpisz stałą warunkową kompilacji w oknie Właściwości według wzoru na rysunku 1.53. Następnie uruchom procedurę Dni, aby zobaczyć w jaki sposób fragment kodu znajdujący się po klauzuli warunkowej Else zostanie wykonany dla użytkowników władających językiem polskim.
I
222
Rozdziali - Project Propi-rh'e*
General | Protection Project Name:
Programowanie
Siedzt
podrę (Prev
(Gen
Project Description:
Help File Name:
Project Help Context ID:
Conditional Compilation Arguments:
m
Cancel
Help
E i
Rysunek 1.53. Stałą warunkową kompilacji można zadeklarować albo u góry kartki moJ lub w oknie Właściwości, ale nigdy w obu tych miejscach
Posługiwanie się zakładkami
W procesie analizowania procedur VBA często trzeba poruszać sięJ różnymi fragmentami kodu procedury. Korzystając zwoudowanych zakładek,n szybko zaznaczyć miejsca, między którymi chcesz się poruszać.
Aby ustawić zakładkę:
Rysunei
1.
2.
Kliknij gdziekolwiek w obrębie polecenia, które chcesz zdefiniować jakod kę.
Wybierz Edycja => Zakładki => Włącz zakładkę (Edit => Bookmaii Toggle Bookmark (lub kliknij na przycisk Toggle Bookmark na paskuedyl
Visual Basic umieści niebieski zaokrąglony prostokąt w lewym marginesie! wskazanej instrukcji, (zob. rysunek 1.54).
Po ustawieniu jednej lub kilku zakładek możesz przeskakiwać pomiędzy J czonymi fragmentami kodu, wybierając Edycja => Zakładka => Następna iM (Edit => Bookmark => Next Bookmark) lub klikając przycisk Następna zakladl pasku narzędzi edycji. Możesz również kliknąć prawym klawiszem J w dowolnym miejscu w oknie Kod programu i wybrać Następna zakładka™
Pułap
Pn dziać, i
wystąpił nazwie, wykryw przewid; graniu, 1
)00
223
i pułapkowanie błędów
zakładki, wybierz Poprzednia zakładka
iftevious
Bookmark).
| ((General)
zadeklaruj stałą kompilacji
Const verAng = False
SubOniO
intDz As Integer
S Week/ayTnputBoxCEnter date, e.g.: 07/15^02")) MsgBox DayOfWeek(intDz)
ffilse DzTygodnia
Cnd If
End Sub - —
illl
Case 1 ..-,
DzTygodnia = "Niedziela
iędzy lożna
akład-
Rysunek 1.54. Korzystając z zakładek, możesz szybko przeskakiwać między często
używanymi fragmentami swoich procedur
Zakładki można usunąć w każdej chwili, wybierając Edycja => Zakładki => Wyczyść wszystko (Edit => Bookmarks => Clear All) lub klikając na przycisk Wy-cwśćwszystkie zakładki (Clear All Bookmarks) na pasku edycji. Aby usunąć poje-ilyńczą zakładkę, kliknij w obrębie zaznaczonego zakładką polecenia i wybierz Edy-tja=> Zakładki => Przełącz zakładkę (Edit => Bookmarks => Toggle Bookmark), iij na przycisk Przełącz zakładkę (Toggle Bookmark) na pasku edycji.
Pulapkowanie błędów
rr—
Przy sporządzaniu procedur VBA programista musi zdecydować, co się ma dziać, gdy wystąpi błąd. Niejednokrotnie w czasie wykonywania programu może wstąpić błąd - na przykład,' procedura usiłuje zachować na dysku plik o tej samej nazwie, jaką posiada inny otwarty już w pamięci plik. Błędy wykonania najczęściej dtrywa nie programista, lecz użytkownik, który próbuje wykonać czynność nie przewidzianą przez programistę. Jeżeli błąd zdarzy się w czasie wykonywania pro-mmu, Visual Basic wyświetla komunikat o błędzie i zatrzymuje wykonywanie pro-
224
Programowanie
cedury. W wielu przypadkach wyświetlony przez Visual Basic komunikat iJ jest jasny dla użytkownika. Aby uniknąć wielu spoś'ód możliwych w czasie J nia programu błędów w procedurach VBA, zastawia się pułapki na błędy. WtJ sób, gdy program napotka na błąd, to zamiast wyświetlić lakoniczny komunilł wyświetli bardziej przyjazny dla użytkownika komunikat.
W jaki sposób należy zaimplementować obsługę błędów w procedurze■ Pierwszym krokiem jest umieszczenie w procedurze instrukcji on Error, któj podprogram obsługi błędów i określa jego położenie wewnątrz procedury. Pofl on Error informuje Visual Basic co należy, zrobić gdy program napotkał w trakcie wykonywania instrukcji. Innymi słowy, VBA korzysta zpoleceniaB ror, aby uruchomić procedurę obsług błędu, która 2;astawia pułapkę na błędy 1 dzące w trakcie wykonania programu. W zależności od typu procedury, możeł ścić pułapkę, stosując jedną z następujących instrukcji: Exit sub, Exit FtJ Exit Property, End Sub, End Function, albo End Property. Zaleca się Spoil nie procedury obsługi błędu dla każdej procedury VBA.
Instrukcja on Error może przyjąć jedną z następujących postaci:
O n Error GoTo Etykieta
Włącza program obsługi błędów, począwszy od wiersza pojJ przez argument Etykieta. Podany wiersz musi być w tej samJ cedurze co instrukcja On Errcr.
O n Error Resume Next
Jeżeli wystąpi błąd, to Visual Basic ignoruje wiersz, którysJ dował ten błąd i kieruje wykonywanie programu do
wiersza.
O n Error GoTo 0
Wyłącza obsługę błędów w obiębie procedury. Kiedy VBAl na to polecenia, to wykryte w procedurze błędy nie są pułapfl
ne.
Błąd czy pomyłka
W programowaniu błędy i pomyłki to nie to samo. Pomyłkę - na M nieprawidłowo wpisane lub pominięte polecenie, opuszczony cudzysłów lubi cinek, albo przypisanie wartości do nieprawidłowego typu danych - można ■ z programu przez prawidłowe testowanie. Jednak cnociaż kod programu mfl pozbawiony pomyłek, nie znaczy to, że nie ma w nim błędów. Błąd jest rej zdarzenia lub operacji, która nie działa tak jak należ;/. Na przykład, jeżeli tum cedura VBA korzysta z określonego pliku na dysku i ktoś usunął ten plik lubi sunął go w inne miejsce, to otrzymasz błąd. Błąd uniemożliwia wykoij reślonego zadania.
j Śledzenie toku procedur VBA i pułapkowanie błędów
225
S pójrzmy na procedury. Procedura Przeczytaj Plik pokazana poniżej demonstruje użycie instrukcji Resume Next oraz obiektu Err.
Sub Przeczytaj Plik ()
Dim strPlik As String Dim strLitera As String Dim strTekst As String Dim Pliklstnieje As Boolean
I Pliklstnieje = True
On Error GoTo ObsługaBłędu
strPlik = InputBox("Wpisz nazwę pliku tekstowego, " &
"który chcesz otworzyć:") Open strPlik For Input As #1 If Pliklstnieje Then Do While Not EOF(1)
strLitera = Input(1, #1) ' pobierz jedną literę strTekst = strTekst + strLitera Loop
Debug.Print strTekst
' zamknij plik, po skomentowaniu poniższej instrukcji 1 wywołany jest błąd #52 Close #1 End If Exit Sub
jsługaBłędu: Pliklstnieje = False
Select Case Err.Number Case 71
MsgBox "Stacja dysków jest pusta." Case 53
MsgBox "Tego pliku nie ma na wskazanym dysku." Case Else
MsgBox "Błąd " & Err.Number & " :" & Err.Description Exit Sub End Select |i Resume Next lud Sub
226
Programowanie w Ai
i
Celem
procedury Przeczytaj plik jest przeczytanie zawartości
wskazał przez
użytkownika pliku tekstowego litera po literze. Gdy użytkownik
wpisze J pliku
w oknie dialogu, mogą zajść różne błędy. Na przykład
użytkownik mógtpi lić się w nazwie pliku lub próbował otworzyć
plik z dyskietki, kiedy stacja dysa była pusta, lub usiłował
otworzyć plik, który był już otwarty. Aby przechwycić! dy,
procedura obsługi błędu znajdująca się na końcu procedury
Przeczytajm rzysta
z właściwości Name
obiektu
Err.
Obiekt
Err
zawiera
informacje o błędi konania.
Jeżeli zajdzie błąd w trakcie odtwarzania procedury, polecenie
Err.
zwróci
numer błędu, a polecenie Err.
Description poda
treść błędu.
Jeżeli w czasie wykonywania procedury wystąpią błędy 71 lub 53, wyświetli przyjazny komunikat wewnątrz struktury seiect...case, następJ przejdzie do polecenia Resume Next, które odeśle go do wiersza znajdującego! poleceniu, które spowodowało błąd. Jeżeli nastąpi jakiś inny nieoczekiwany Ul sual Basic zwróci kod błędu (Err.Number) oraz jego treść (Err.Description). W czątku tej procedury zmiennej piikistnieje przypisana jest wartość True (PraJ W ten sposób, jeżeli program nie napotka na błąd, zostaną wykonane wszystka strukcje wewnątrz struktury warunkowej if piikistnieje...Then. NatomiasiJ VBA napotka na błąd, wartość zmiennej piikistnieje będzie ustawionanal (Fałsz). Zwróć uwagę na instrukcję Exit Sub przed procedurą obsługi błędu, (jj polecenie Exit Sub powyżej procedury obsługi błędu, jeżeli nie chcesz, aby w Basic wykonywał instrukcje procedury błędu jeżeli nie ma błędów. Aby przetestJ procedurę Przeczytaj plik, wykonaj następujące ćwiczenie:
Przygotuj
plik tekstowy o nazwie C:\Wakacje.txt
za
pomocą
programu Ni
Windows
i wpisz w nim dowolny tekst.
Uruchom
procedurę
Przeczytaj plik cztery razy w trybie krokowym
następujących
założeń:
Podaj nazwę pliku C:\Wakacje.txt,
Podaj nazwę pliku, którego nie ma na dysku C,
Podaj
nazwę dowolnego pliku na dyskietce A:
(gdy
dysku nie ma wstJ
ków),
Skomentuj
instrukcję close
#1,
i wpisz nazwę pliku C:\Wakacje.txt.
Vm
procedurę
dwa razy, za drugim razem plik C:\Wakacje.txt
będzie
otwarhj
uzyskasz
błąd.
Testowanie procedur
Jesteś odpowiedzialny za swój kod. Oznacza to, że przed oddaniem proceiB testowania innym osobom sam powinieneś daną procedarę przetestować. Tyj najlepiej wiesz jak powinna ona działać. Niektórzy programiści uważają testB
\v
y
e ;ć al ić
ka
; błędów
Siedzenie imu r
Wasnych procedur za czynność wręcz poniżającą, zwłaszcza gdy w firmie, w której [Wuja, znajduje się specjalny zespół ludzi wykonujących tą czynność. Nie popełnij wo błędu. Testowanie procedury przez programistę jest równie ważne jak samo programowanie. Po przetestowaniu procedury powinnieneś przekazać ją do testowania i samvm użytkownikom. Użytkownicy szybko dadzą znać, czy procedura daje oczekiwane wyniki, czy jest prosta i łatwa w użyciu, i co jeszcze w niej brakuje. Również, dobrze jest dać całą aplikację do przetestowania komuś, kto z reguły nie używa tej Mikacji, i polecić tej osobie, aby usiłowała ją zepsuć.
Celowe wywoływanie błędów
| Aby sprawdzić, jak twój program reaguje na błędy w trakcie wykonywania aplikacji, możesz symulować wystąpienie dowolnego błędu:
L Wywołaj dowolny wbudowany błąd, korzystając ze składni: Error numerBłędu. 1 Na przykład, aby wygenerować błąd Dzielenie przez zero, wpisz w oknie Instrukcje bezpośrednie:
Error 11
Po naciśnięciu Enter Visual Basic wyświetli komunikat błędu: Run-time error i Division by zero (Błąd wykonania 11. Dzielenie przez zero). Aby sprawdzić treść wyświetlonego błędu, skorzystaj z następującej składni: Error (numerBłędu) . Na przykład, aby dowiedzieć się, co oznacza błąd numer 7, wpisz następującą instrukcję w oknie Instrukcje bezpośrednie:
or (7)
mało pamięci).
lys-
10m vięc
y do scież 'anie
Podsumowanie
W kilku ostatnich zagadnieniach tego rozdziału dowiedziałeś się, jak testować swoje procedury VBA, aby upewnić się, że działają zgodnie z planem. Nauczyłeś się wychwytywać błędy, śledząc procedurę w trybie krokowym oraz stosując punkty przerwania i czujki. Zobaczyłeś, jak można pracować w oknie Instrukcje bezpośrednie w trybie przerwania. Dowiedziałeś się również, w jaki sposób okno Zmiennych lokalnych może być pomocne w śledzeniu wartości zmiennych i w jaki sposób okno dialogowe Stos zmiennych ułatwia orientację w szczególnie długich
228 Programowanie w AccJ
i kompleksowych procedurach. Nauczyłeś się także, w jaki sposób można oł które części procedury mają być uwzględnione lub wykluczone w trakcie koJ programu. Na zakończenie tego rozdziału dowiedziałeś się, jak debugować btęfl pomocą podprogramu obsługi błędów. Efektywne posługiwanie się tymi narzJ wymaga nie tylko praktyki, ale i umiejętności stawiania właściwych pytań. ■ próby śledzenia procedur i pułapkowania błędów nie powinny ograniczać m przytoczonych przykładów. Dopóki nie zaczniesz samodzielnie myśleć iposJ zakres bieżących programów, to programowanie pozostanie dla ciebie rzeczątł i niezmiernie trudną. A przecież nie po to trzymasz tę książkę w ręku.
Roz<
Mai uży<
Kor
/ kodu p
danymi.
nych M
Field jes
cował z
oraz ust
korzysti
tów DA
ganizov
obiektó
Obiekt
§
w
hiera zawierz
błędów
zentow
który
F Kolekc
Works
w
aplil ny
jest
K
Datab: z rozs; źródłc
1
od int śnie c
R ozdział 2
Manipulowanie bazami danych przy
(życiu DAO
Ikodu
tabelę w bazie da-
Access, obiekt
to DAO pokazanej pnizowane obiektów E Obiekt ten
end*'
rozdziale będzieSz pra-
rzyć^ne obiekty bazy danych manipulował tymi obiektami ^
^ M samej górze hierachii silniki bazy danych (Jet Engine), inne obiekty ! kolekcje
- obiekt DBEnr
listę
generowane
Basic.
raz z obiektami user oraz Group.
MOBMu
ODBC (Open Database Connectivity).
230
Programowanie wAcJ
t ions, oraz containers mieszczą obiekty, które odwołują się do rozmaitychH nentów obiektu Database. Na przykład obiekt TabieDef reprezentuje tabelę pni Microsoft Access 2000 lub tabelę połączoną. Obiekt QueryDef reprezentuje \M w DAO. Jeżeli dana kwerenda przyjmuje parametry, to w DAO są one reprej ne przez obiekt Parameter. Zbiór Parameters zawiera wszystkie obiekty pj zdefiniowane dla danego obiektu QueryDef. Obiekt Relation reprezentuje! pomiędzy polami w tabelach i kwerendach. Obiekt Container umożliwia doj zbiorów uprzednio zachowanych obiektów baz danych, tabel, kwerend oral Zbiór Recordsets zawiera wszystkie otwarte obiekty Recordset. Każdy obij cordset reprezentuje zbiór rekordów w bazie danych. Z obiektu Recordset km korzystali przy pobieraniu danych, dodawaniu, mod>fikowaniu i wyrzucaniu! dów z bazy danych. Obiekt Field reprezentuje pole w tabeli, kwerendzie, irj relacji lub zbiorze rekordów (Recordset). Zbiór Fields jest domyślnym zbioj
Stepujących obiektów: TabieDef, QueryDef, Index, Relation, oraz RecordseJ
dy obiekt DAO, z wyjątkiem obiektu Error i obiektu connection, posiada zbij perties. Zbiór ten zawiera osobny obiekt dla każdej właściwości obiektu dJ której się odwołujesz. Możesz wykorzystać zbiór Properties danego obiektu,* szczególnie nazwy jego właściwości oraz ich aktualne ustawienia. Możeszm zdefiniować własne właściwości dla obiektów DAO.
|
|
1 |
|
|
|
|
|
|
|||
Maszyna DBO | |
|||||||||||
HBtedy H^łąd |
|||||||||||
'—lObszary robocze HObszar roboczy |
J |
||||||||||
|
HBazy danych |
|—|Baza danych |
] |
|
|
|
|||||
|
|
|
—(Pojemniki |
HPojemnik |
] |
|
|
||||
|
|
|
|
I—I Dokumsnty |
MDokument |
|
|
||||
|
|
|
—[TJef. Zapytań |
|—|Def. Zapytanias^ |
|
|
|
||||
|
|
Uda |
|
(-[Pole |
|
|
|||||
|
1—|Parametry |
|
|—(Parametr |
|
|
||||||
- |
|
|
—[Recordsets |
HRecordset |
] |
|
|
R |
|||
|
L-jPola |
|
HPole |
|
|
||||||
|
—^Relations |
|—|Relation |
1 |
|
|
|
|||||
|
|
|
|
MPola |
|
HPole |
|
li |
|||
|
|
|
—(TableDefs |
HTableDef |
] |
|
sl |
||||
|
|
|
HPola |
|
HPole | |
V |
|||||
|
|
|
i—(Indeksy |
|
Hlndeks | |
|
|||||
|
|
|
|
|
L-[p°ia HPoirn |
|
|||||
|
—(Grupy |
MGrupa |
] |
|
|
• |
|||||
|
|
'—[Użytkownicy |
(-(Użytkownik |
1 |
|
|
|||||
|
—[Użytkownicy |
(-(Użytkownik |
] |
|
|
• |
|||||
|
|
|
-(Grupy |
|—jGrupa |
] |
|
|
• |
Rysunek 2.1. Model obiektów DAO
W trakcie pracy z przykładami tego rozdziału odwołuj się do hierarchii obiektów ^ obaczyc » a* sposób obiekty utyte w przykładowych l>«-»»**-Eiazane Aby uzyskać dostęp do obiektów Data Access object, (DAO), fel* odwotanie do biblioteki obiektów DAO. Zrób to
następujący sposób:
,. w oknie edytora Visual Basic wybierz Narzędzia => Odwołania (Tools => Re-
ferences).
W polu listy (zob. rysunek. 2.2) kliknij w polu wyboru obok nazwy biblioteki
Microsoft DAO 3.6 Object Library.
Kliknij OK, aby zamknąć okno dialogowe odwołania.
7
e. COM
Componentl.0
Type
Library
-
SsRADIUSProtocol 1.0 Type
Library
{d..)Vte5oftVSPrir*er7.O ,j
tDistiller ^y... | >f*r . . : ..
lii——— J
-Hoosoft DAO 3.6 Object Library
Location: C:\Program Ffe\Comrr,on FiteS\MicroSoft Shared\DAO\daO36C Language: Standard
Rysunek 2.2. Ustawienie odwołania do biblioteki obiektów DAO
Jeżeli nie możesz odnaleźć biblioteki Microsoft DAO 3.6 Object Library w polu ...^Vnip Hialoeowym Odwołania (References), musisz ponownie uruchomić in-Office 2000 i wybrać w niej opcję Data Access Objects for
Visual Basic. Ten rozdział wyjaśnia, jak:
pracować z bazą danych przy użyciu DAO,
twor
,rzyć tabele i definiować pola tabeli,
I dodawać klucze podstawowe i obce, a także tworzyć relacje, , tworzyć i uruchamiać kwerendy, , manipulować rekordami,
232
Programowanie w Ac<
p
racować
z elementami systemu bezpieczeństwa, takimi jak konta indywij
i
grupowe,
wykorzystywać transakcje.
Praca z bazą danych przy użyciu DAO
W trakcie pracy z aplikacją Microsoft Access niewątpliwie zaprojekto sporo baz danych, korzystając z wbudowanego interfejsu użytkownika. Wiesz] przykład, że aby utworzyć nową bazę danych, wystarczy podać jej nazwę. W' tego samego zadania za pośrednictwem języka programowania jest nieco skomplikowane, zwłaszcza gdy jest się nowicjuszem w tej dziedzinie. Nąjłi sposobem poznania tajników pracy z bazą danych Microsoft Access prograi jest sporządzenie krótkiej procedury VBA, która wykona określone zadanie, i 2.3 przedstawia typowe czynności, które na pewno zechciałbyś wcześniej czy przeprowadzić w odniesieniu do obiektu bazy danych.
S3 frmDAO Przykl : Formularz
j Sporządź nową!
i
D
Sporządź własne właściwości bazy danych]I
B AZA DANYCH
B
Sporządź kopię bazy danych
Wymaż bazę danych
O twórz bazę danycn
i sprawdź jej
zawartość
R ysunek 2.3. Częste operacje na obiektach bazy danych
Tworzenie bazy danych
Aby móc programatycznie utworzyć bazę danych, należy zapoznać sieni z obiektem Workspace oraz jego metodą createDatabase. Każda sesja użytkol w aplikacji Accessa posiada jeden obiekt Workspace. Przy startowaniu Microsofl
r—
program automatycznie tworzy domyślny obszar roboczy (Workspace) o nazwie l)BEngine.Workspaces(O). Obiekt workspace posiada szereg pożytecznych metod, iktórych najczęściej używanymi są createDatabase (przy tworzeniu nowej bazy Liyclizob. przykład 2.3.A) oraz openDatabase (przy otwieraniu istniejącej już bazy danych, zob. przykład 2.3. C).
Tworzenie nowej bazy danych wymaga podania nazwy i ścieżki dostępu do pliku danych oraz wbudowanej stałej, która wskazuje porządek sortowania bazy da-IU. Dla angielskiego, niemieckiego, francuskiego, portugalskiego, włoskiego [hiszpańskiego skorzystaj z wbudowanej stałej dbLangGenerai. Dla języka polskiego 1Ustałej dbLangPolish. Dla innych języków, i innych opcji, które można ustawić przy przeniu nowej bazy danych, skonsultuj się z wbudowaną pomocą dotyczącą metody CreateDatabase.
Procedura w przykładzie 2.3.A „prosi" użytkownika o podanie nazwy bazy danych, po czym zostaje utworzona baza danych. Natychmiast po jej utworzeniu zastosowana jest metoda close obiektu Database w celujej zamknięcia.
pnyklad 2.3.A. Tworzenie nowej bazy danych przy użyciu DAO
private Sub cmdPrzygotuj_Click() Dim db As DAO.Database Dim dbNazwa As String
dbNazwa = InputBox("Wpisz nazwę nowej bazy danych:",
"Nazwa bazy danych") If dbNazwa = "" Then Exit Sub Set db = CreateDatabase(dbNazwa, dbLangPolish)
db.Close End Sub
; Aby programatycznie utworzyć obiekt Database, zadeklaruj najpierw zmienną obiektową typu Database. Dobrze jest dodać do nazwy obiektu nazwę biblioteki obiektów DAO, gdyż domyślną biblioteką obiektów w Accessie 2000 jest ADO (programowanie za pomocą obiektów ADO jest omówione w rozdziale 3.). Dopisując na-;fą biblioteki do nazwy obiektu, będziesz miał gwarancję, że Visual Basic zawsze otworzy prawidłowy obiekt. Po zdefiniowaniu zmiennej obiektowej typu Database przypisz tej zmiennej obiekt zwrócony przez metodę CreateDatabase:
Set db = CreateDatabase(dbNazwa, dbLangPolish)
234
Programowanie w Acces
M etoda createDatabase tworzy pustą bazę danych. Jeżeli baza danych* nieje, to wystąpi błąd. Możesz sprawdzić, czy dana baza danych istnieje, koral z instrukcji warunkowej if w połączeniu z funkcją cir z biblioteki obiektów! i następnie stosując polecenie Kill z tej samej biblioteki. Polecenie to umoi wymazanie bazy danych przed odwołaniem się do metody createDatabasJ przykład 2.3.B w następnym zagadnieniu).
Kopiowanie bazy danych
Czasami zajdzie potrzeba sporządzenia duplikatu bazy danych w sposobi matyczny. Kopiowanie bazy danych za pomocą kodu wymaga zdefiniowania I zmiennych typu string: jedna z nich powinna przechowywać nazwę źródłową! danych (tej, którą zamierzasz skopiować), druga zaś powinna określić nazwel katu. Zmienne te można następnie użyć z metodą CompactDatabase obiektu dm w celu sporządzenia kopii bazy danych. Zanim skorzystasz z metody compactDaj se, upewnij się, że źródłowa baza danych jest zamknięta i sprawdź, czy posiadaj syć wolnego miejsca na twardym dysku komputera na sporządzenie duplikatu,! kład 2.3.B pokazuje, w jaki sposób można skopiować bazę danych.
Przykład 2.3.B. Kopiowanie bazy danych przy użyciu DAO
Private Sub cmdSkopiuj_Click() Dim dbNazwa As String Dim dbNowaNazwa As String
dbNazwa = InputBox("Wpisz nazwę bazy danych, którą chcesz " 5 "skopiować: " & Chr(13)
& "(przykład: C:\mojaBaza.mdb)", "Sporządź kopię") If dbNazwa = "" Then Exit Sub If Dir(dbNazwa) = "" Then
MsgBox "Bazy daych " & dbNazwa & _ " nie znaleziono. " & Chr(13) _ & "Sprawdź nazwę i ścieżkę pliku bazy danych." Exit Sub End If
dbNowaNazwa = InputBox("Wpisz nazwę dla nowej" &_ "bazy danych: " & Chr(13)_
& "(przykład: C:\MojaBazaKopia.mdb)", "Zapisz jako") If dbNowaNazwa = "" Then Exit Sub If Dir(dbNowaNazwa) <> "" Then
pulo
wanie bazami danych przy użyciu DAO
Kill dbNowaNazwa
End If
DBEngine.CompactDatabase dbNazwa, dbNowaNazwa
Procedura w przykładzie 2.3.B „prosi" o podanie nazwy źródłowej bazy danych mwdza, czy użytkownik wpisał poprawną nazwę bazy. Jeżełi użytkownik kliknął „iuluj lub wpisał nieprawidłową nazwę, procedura się kończy. Drugie polecenie m-LtBox „prosi" użytkownika o nazwę dla duplikatu bazy danych. Nazwa nowej bazy tdanych musi być inna niż nazwa istniejącej już na dysku bazy. Jeżeli użytkownik Lnie Anuluj, procedura zostanie zakończona. Jeżeli baza danych już istnieje na fcku, zostanie ona automatycznie usunięta. Zwróć uwagę na użycie funkcji Dir do sprawdzenia egzystencji bazy danych:
Hit Dir (dbNowaNazwa) <> "" Then
\ Kill dbNowaNazwa
Ponieważ bazy danych nie można usunąć programatycznie za pomocą DAO, musisz zastosować polecenie Kill z biblioteki obiektów VBA. Ostatnia instrukcja po-vivzszej procedury korzysta z metody CompactDatabase obiektu DBEngine w celu sporządzenia duplikatu bazy danych. Posługuje się argumentami podanymi przez użytkownika: nazwą źródłową bazy danych (dbNazwa) oraz bazą danych przeznacze-[jia (dbNowaNazwa).
Otwieranie i przeglądanie istniejącej bazy danych
Aby otworzyć istniejącą na dysku bazę danych, skorzystaj z metody openData-j,ase obiektu workspace. Metoda ta wymaga podania przynajmniej jednego parametru -nazwy istniejącej bazy danych. Zanim będziesz mógł sporządzić spis zawartości swojej bazy danych, powinieneś zapoznać się z pojęciami kontenerów (Containers) idokumentów (Documents). Każdy obiekt Database posiada zbiór o nazwie Containers który składa się z wbudowanych obiektów o nazwie container. Microsoft teess używa zbiór Containers do przechowywania swoich własnych obiektów. Silnik bazy danych (Jet Engine) tworzy następujące obiekty Container: Databases, Ta-vjies oraz Relations. Inne obiekty container tworzone są przez Microsoft Access: fornularze (Forms), raporty (Reports), makra (Macros), oraz moduły (Modules). Ta-tóaponiżej przedstawia obiekty Container i rodzaj zawartej w nich informacji.
236
Programowanie w i
T abela 2.1. Obiekty Container oraz ich zawartość
N azwa obiektu Container
Zawartość obiektu
D atabases
Zachowane bazy danych (Saved databases)
T ables
Zachowane tabele oraz kwerendy (Saved tables andqit
R elations
Zachowane relacje (Saved relationships)
F orms
Zachowane formularze (Saved forms)
M odules
Zachowane moduły (Saved modules)
R eports
Zachowane raporty (Saved reports)
S cripts
Zachowane skrypty (Saved scripts)
K ażdy obiekt container zawiera zbiór o nazwie Documents. Każdy w tym zbiorze reprezentuje obiekt, który można odnaleźć w bazie danych; Access. Na przykład kontener formularzy (Forms) przechowuje listę wszystl chowanych formularzy w bazie danych i każdy formularz reprezentowany jest i obiekt Document. Access nie pozwala na tworzenie nowych obiektów contj i Document. Można tylko pobierać informacje o tych obiektach.
Przykład 2.3.C korzysta z pętli For Each...Next w celu pobrania nazw wszys obiektów container w otwartej bazie danych. Jeżeli określony Container; jakieś dokumenty, wewnętrzna pętla For Each... Next wydrukuje nazwę każj obiektu Document do okna Instrukcje bezpośrednie.
Po otwarciu bazy danych za pomocą metocy openDatabase należy ojej zamknięciu za pomocą metody close.
Przykład 2.3.C. Otwieranie bazy danych i czytanie jej zawartości
Private Sub cmdOtwórz_Click() Dim db As DAO.Database Dim dbNazwa As String Dim conType As Container Dim doc As Document
lutowanie bazami danych przy użyciu DAO
237
dbNazwa = InputBox("Wpisz nazwę istniejącej bazy danych:",
"Nazwa bazy danych") If dbNazwa = "" Then Exit Sub If Dir(dbNazwa) = "" Then
MsgBox "Bazy danych " & dbNazwa & " nie znaleziono."
Exit Sub End If Set db = OpenDatabase(dbNazwa)
With db
' wymień nazwy obiektów w zbiorze Containers For Each conType In .Containers
Debug.Print conType.Name & " container: " & _ conType.Documents.count If conType.Documents.count > 0 Then
' wymień nazwy dokumentów w danym obiekcie Container For Each doc In conType.Documents
Debug.Print doc.Name Next doc End If Next conType .Close End With I Bid Sub
Procedura cmdotwórz_click pokazana powyżej korzysta z metody openDataba-j je obiektu DBEngine w celu otwarcia określonej bazy danych w domyślnej przestrze-niroboczej. Baza danych zostanie otwarta w trybie do zapisu i odczytu (Read/Write). Podając dodatkowe argumenty metodzie OpenDatabase, możesz otworzyć daną bazę toch w trybie wyłączności lub tylko do odczytu Read-Only). Zwróć się do wbudo-pomocy po szczegółowe informacje dotyczące użycia tej metody
ifigumentami.
Dodawanie do bazy danych właściwości zdefiniowanych przez użytkownika
Obiekt Database, tak jak inne obiekty DAO w aplikacji Microsoft Access, zawiera zbiór o nazwie Properties. Możesz skorzystać z pętli For...Each w kodzie swojej procedury VBA, aby pobrać ustawienia właściwości związanych z obiektem Databa-L Aby dowiedzieć się, które właściwości dotyczą obecnie otwartej bazy danych,
238
Programowanie w AccesJ
o twórz nowy moduł w bazie danych Microsoft Access i wpisz procedurę baseProperties podaną poniżej:
Sub PodajWłaściwościBazy() Dim db As DAO.Database Dim prp As DAO. Property-
Set db = CurrentDbO
Debug.Print "Właściwości bazy danych:
For Each prp In db.Properties
Debug.Print prp.Name Next prp End Sub
Niektóre z właściwości bazy danych, które zostaną wyszczególnione wola strukcje bezpośrednie po uruchomieniu powyższej procedury, są następujące]
Connect, Transactions, Updateable, CollatincOrder, QueryTimeout, V( RecordsAffected, ReplicalD, DesignMasterlD, Connection, AccessVersii ild.
Oprócz wbudowanych właściwości bazy danych, możesz dodać do bazy swoje własne właściwości (właściwości zdefiniowane przez użytkownika), koi jąc z interfejsu użytkownika, lub możesz napisać procedurę w języku Visual! takąjak w przykładzie 2.3.D w dalszej części tego rozdziału.
Rysunek 2.4 przedstawia okno właściwości bazy danych (Database Pro» w którym możesz dodać własne właściwości do bazy danych przy użyciu ind użytkownika w aplikacji Microsoft Access. Aby uzyskać dostęp do tego okna,otj bazę danych, dla której chcesz zdefiniować własne właściwości, i wybierz P|j Właściwości bazy danych (File => Database Properties). Kliknij na zakładki standardowe (Custom) i wpisz nazwę swojej właściwości w polu Nazwa Kliknij na strzałkę obok pola Typ (Type) i wybierz typ danych dla swojej ści. Następnie wpisz wartość właściwości w polu Wartość (Value). Na za! kliknij przycisk Add, aby dodać nową właściwość do zbioru Properties.
rop
I*
;°:
prz
poi
do;
Procedura
cmdDbNowaPrp_ciick w przykładzie
2.3.D tworzy zdefiniowana użytkownika
właściwość dla bieżącej bazy danych i dodaje ją do zbioru Pi
Następnie wyszczególnione są nazwy właściwości oraz ich
wartości znajd w
bazie danych. Zamiast używać trzy oddzielne instrukcje w celu
utworzenia właściwości,
możesz użyć następującego wiersza kodu:
Set prp = db.CreateProperty(nazwaNowej Prp, dbText, "1'
Lpulowaniebazami danychprzyjiżydu_DAO
jto | Podsumowanie I Statystyka J Zawartość
Nazwa:
Niestandardowe I
B iuro
Cel
Data rejestracji
Data ukończenia
Dyspozycja
Edytor
Nazwa
ReplicatePr...
Tak
Wartość 1
„Iffi
Tak lub nie
R ysunek 2.4. Aby dodać własne właściwości do swojej bazy danych, możesz skorzystać z okna Właściwości bazy danych lub sporządzić procedurę VBA (zob. przykład 2.3.D)
Po utworzeniu nowej właściwości właściwość tę należy dodać do zbioru Pro-«rties obiektu Database, w następujący sposób:
Łproperties.Append prp
Pułapka na błąd (zob. obsługa_Błędu) w tej procedurze wyrzuci własną właściwość ze zbioru Properties, jeżeli właściwość o takiej samej nazwie już istnieje. flten sposób procedurę tę można uruchomić nieskończoną ilość razy. W trakcie meglądania zbioru Properties mogą zaistnieć też inne błędy. Na przykład próba pobrania ustawienia właściwości connection powoduje błąd 3251 („Operacja nie jest dozwolona dla tego typu obiektu"). Jeżeli pracujesz z rodzimą bazą danych Microsoft
240
Programowanie w
A ccess, a nie ze źródłem danych ODBC, to próba odczytania ustawienia wi connection spowoduje błąd. Możesz zignorować ten błąd, korzystając zł Resume Next. Instrukcja ta skieruje Visual Basic do polecenia znajdującego po instrukcji, która spowodowała błąd, dzięki czemu pozostałe nazwy w! i ich wartości mogą być odczytane.
Po uruchomieniu procedury w przykładzie 2.3.D nowa właściwość doczna w oknie Instrukcje bezpośrednie. Ta właściwość nie pojawi się je zakładce Niestandardowe w oknie właściwości bazy danych.
Przykład 2.3.D. Dodawanie własnej właściwości do bazy danych przy użyciu DAO
Sub cmdDBNowaPrp_Click()
Dim db As DAO.Database Dim prp As DAO.Property Dim nazwaNowejPrp As String
nazwaNowejPrp = "WersjaBazyDanych" On Error GoTo ErrorHandler Set db = DBEngine.Workspaces(0)(0) Set prp = db.CreateProperty() prp.Name = nazwaNowejPrp prp.Type = dbText prp.Value = "1" db.Properties.Append prp
MsgBox "Utworzono nową właściwość bazy danych." For Each prp In db.Properties
Debug.Print prp.Name & " : " & prp.Value Next prp Exit Sub ErrorHandler:
' właściwość o takiej nazwie już istnieje If Err.Number = 3367 Then
db.Properties.Delete nazwaNowej Prp Resume 0
' zignoruj właściwość Connection Elself Err.Number = 3251 Then Resume Next Else
MsgBox Err.Number & ": " & En.Description End If End Sub
[CurrentDcj . i *•--*--
ob« DBEngine represje - ^ w chwili otwarcia baza „ rfla teeo obiektu są obszary robocze <.w f nBEMine .workspaces (o).
■ p workspaces (0) (0) .Name
|*r"-»™sp"jeccsExpoznajDi0"ab
bazy danych
Przy1
klad
2.3.E. Usuwanie bazy danych
SubcmdUsuń_Click()
dbNazwa
As String
Programowanie w Act
d bNazwa = InputBox("Wpisz nazwę bazy danych, którą " &
"chcesz wymazać:" & Chr(13) & "(przykład: C:\MojaBazaKopia.mdb)", "Nazwa bazy ze ścieżką :
dostępu do pliku" If dbNazwa = "" Then
Exit Sub Else
On Error GoTo Obsługa_Błędu: Kill dbNazwa
Exit Sub End If Obsługa_Błędu:
MsgBox "Błąd: " & Err.Number & ":' & Err.Description End Sub
Tworzenie i łączenie tabel przy użyciu DAO
Teraz, gdy nauczyłeś się już programatycznie tworzyć bazę danych oraz poi i definiować właściwości bazy danych, musisz wypełnić ją jakimiś pożyteti obiektami. Naturalnie, pierwszym obiektem, który należy utworzyć, jest tabela,] nek 2.5 przedstawia typy czynności, związane z tabelami baz danych oraz: cymi się w nich polami.
Tworzenie tabeli i ustawianie właściwości pól
Każda tabela zapisana w bazie danych Access jest obiektem o nazwie Tabi w bibliotece DAO. Obiekt TableDef posiada szereg właściwości, które go charal
ZUJą- na przykład Name, RecordCount, DateCreated, albo DateUpdated. Obiefi
bieDef posiada również metody, które oddziaływują na ten objekt. Na przykład] da createField tworzy nowe pole dla obiektu TatieDef a metoda openRecon tworzy obiekt o nazwie Recordset używany do mani aulowania danymi w tabeli,
Procedura
w przykładzie
2.5.A ilustruje sposób tworzenia tabeli w bieżącej!
danych.
Wiersz kodu *
Set db = CurrentDb
ustawia odwołanie do bieżącej bazy danych. Instrukcja CurrentDb jestj z funkcji VBA. Nie ma ona nic wspólnego z DAO. Funkcja currentDB umo dostęp do danych w bieżącej bazie danych bez potrzeby wymienienia nazwy bazy nych. Funkcja ta zwraca zmienną obiektową typu Dat abase, która reprezentuje oj
243
a ^hTplikacji Microsoft Access. W DAO można odwołać s* do
danych za pomocą instrukcji DBEngine.Workspaces(0) .Databases (0, (0, (0), lub też korzystając ze wspomnianej funkCJ1 VBA - currentDb.
Sporządź wykaz poi
oraz tabel w bazie
danych
Połącz tabelą z bazą danych
TABELE oraz POLA
B
Dodaj nowe pola do tabeji
S porządź wykaz właściwości tabeli
Zmień
właściwości
pola
Usuń pole z tabeli
R ysunek2.5. Częste operacje przeprowadzane na tabelach i polach bazy danych
Aby utworzyć tabelę programatycznie, skorzystaj z metody createTabieDef obiektu Database. Metoda ta wymaga podania łańcucha znaków lub zmiennej typu String z nazwą nowego obiektu TabieDef. Dla przykładu, następujący wiersz kodu przypisuje zmiennej tbiNowa tabelę o nazwie Agenci.
Set
tblNowa = db.CreateTabieDef("Agenci")
Ponieważ każda tabela musi zawierać przynajmniej jedno pole, następny krok wtworzeniu tabeli polega na zastosowaniu metody createField obiektu TabieDef w celu utworzenia pól tabeli. Na przykład w instrukcji:
: Set £W = tblNowa.CreateField("IdAgenta" , dbText, 6)
i tblNowa jest nazwą zmiennej definiującej tabelę.
.IdAgenta" jest ciągiem znaków określającym nazwę nowego obiektu Field.
244
Programowanie w Ai
dbText jest stałą określającą typ danych zakładanego pola (zob. tabelę 2.2 poi
6
jest liczbą całkowitą podającą maksymalny rozmiar pola tekstu
w
tekstowe
mogą przechowywać od 1 do 255 bitów. Argument ten jest i:
dla
innych typów pól.
Tabela 2.2. Typy danych i odpowiadające im stałe
Typ Danych |
Stała |
Wartość |
Boolean |
dbBoolean |
1 |
Byte |
dbByte |
- 2 |
Integer |
dblnteger |
3 |
Long |
dbLong |
4 |
Currency |
dbCurrency |
5 |
Single |
dbsingle |
6 |
Double |
dbDouble |
7 |
Date/Time |
dbDate |
8 |
Text |
dbText |
10 |
OLE object |
dbLongB inary |
11 |
Memo |
dbMemo |
12 |
GUID |
dbGUID |
15 |
Przy tworzeniu pól w tabeli niejednokrotnie zajdzie potrzeba ustawienia p nych właściwości pól. Procedura w przykładzie 2.5.A demonstruje, wjaki można ustawić następujące wbudowane właściwości pól: Reguła poprawności (]| dation Rule), Komunikat o błędzie (Validation Text), Wartość domyślna Value) oraz właściwość Wymagane (Required). Przy definiowaniu reguł poprauj (Validation Rules) należy ustawić dwie właściwości. Właściwość Validation™ (Reguła poprawności) jest ciągiem znaków, które podają kryterium popraił
Manipulowanie bazami danych przy użyciu DAO
245
wprowadzanych w polu tabeli danych. W przykładzie 2.5.A wymagamy, aby każdy wpis w polu idAgenta zaczynał się na literę „A". Właściwość Validation Text (Komunikat obłędzie) jest ciągiem znaków, który użytkownik zobaczy w komunikacie, leli nie wpisze danych zgodnie z podaną regułą poprawności. Właściwość Default value (Wartość domyślna) ustawia lub zwraca wartość domyślną obiektu Field. W przykładzie 2.5.A ułatwimy użytkownikowi wpisywanie danych, wprowadzając tekst „Polska" w charakterze wartości domyślnej w polu Kraj. Każdy nowy rekord będzie automatycznie zawierał w polu Kraj wpis „Polska". Ponieważ niektóre pola nie mogą pozostać puste, należy ustawić właściwość Required (Wymagane) danego pola [na Yes (Tak). Oprócz wbudowanych właściwości danego obiektu, istniejąjeszcze inne typy właściwości: właściwości zdefiniowane przez aplikację (application-defined properties) oraz właściwości zdefiniowane przez użytkownika (user-defined properties). Właściwość zdefiniowana przez aplikację tworzona jest w rezultacie ustawienia wartości tej właściwości. Klasycznym przykładem takiej właściwości jest właściwość obiektu TabieDef o nazwie Description (Opis). Aby ustawić właściwość Description określonej tabeli w interfejsie użytkownika w aplikacji Microsoft Access, kliknij pra-«u klawiszem myszy na nazwę tabeli i wybierz Właściwości (Properties), po czym wpisz tekst, który chcesz wyświetlić w polu Opis. W tym momencie Access utworzy właściwość Description dla danej tabeli i doda ją automatycznie do zbioru Properties obiektu TabieDef. Jeżeli nie wpiszesz znaczenia w polu Opis, Access nie utworzy właściwości Description. Stąd, przy próbie użycia właściwości Description w kodzie procedury VBA, Access wyświetli błąd. Z tego względu, warto wcześniej sprawdzić, czy właściwość, do której chcemy się odwołać wogóle istnieje. Użytkownik może zdefiniować własne właściwości w celu przechowywania dodatkowych danych dotyczących określonego obiektu. Przykład 2.5.A demonstruje, w jaki sposób można wykorzystać metodę CreateProperty obiektu TabieDef w celu utworzenia właściwości zdefiniowanych przez aplikację lub użytkownika programu. Przy tworzeniu nowej właściwości należy podać jej nazwę, typ właściwości oraz jej wartość. Procedura w przykładzie 2.5.A korzysta z metody createProperty w celu zdefiniowania właściwości Caption (Tytuł) dla pola DataUrodzenia w nowo utworzonej tabeli Agenci:
S et prp = tblNew.Fields("DataUrodzenia") .CreateProperty("Caption") Następnie procedura definiuje typ danych dla nowo utworzonej właściwości:
prp.Type = dbText
Tabela 2.2 przedstawia stałe reprezentujące typy danych w VBA. Następny wiersz kodu przypisuje wartość nowo utworzonej właściwości:
246
Programowanie w AcccsJ
p rp.Value = "Data urodzenia"
Zamiast pisać trzy oddzielne wiersze kodu, można utworzyć nowąwtaśj dla danego obiektu za pomocąjednej instrukcji:
Set prp = tblNowa.Fields ("DataUrodzenia" dbText, "Data urodzenia")
.CreateProperty ("Caption'1
Właściwość zdefiniowaną przez użytkownika należy dodać do zbioru i ties odpowiedniego obiektu. W przykładzie 2.5.A właściwość caption do
zbioru Properties obiektu Field, a właściwość Description do zbioru Pro obiektu TableDef:
fId.Properties.Append prp tblNowa.Properites.Append prp
Po utworzeniu pola w tabeli i ustawieniu jego właściwości, należy skoj z metody Append, aby dodać to pole do zbioru Fields, według wzoru poniżej:
TblNowa.Fields.Append fid
Po utworzeniu wszystkich pól i dodaniu ich do zbioru Fields nie zapomnij! czyć nowej tabeli do zbioru TableDef s, tak jak w przykładzie poniżej:
dbTableDefs.Append tblNowa
Właściwości zdefiniowne przez użytkownika można usunąć ze zbioru pj ties, jednakże nie można usunąć z tego zbioru właściwości wbudowanych,! ustawisz właściwość korzystając z interfejsu użytkownika, to nie musisz już J i dodawać tej właściwości w kodzie procedury, ponieważ właściwość ta autom nie umieszczna jest w zbiorze Properties w momencie jej utworzenia.
Przykład 2.5.A. Tworzenie tabeli i ustawianie właściwości pól
Private Sub cmdUtwórzTabelę_Click() Dim db As DAO.Database Dim tblNowa As DAO.TableDef Dim fid As DAO.Field
247
Dimprp As DAO.Property
On Error
GoTo Obsługa J3łedu CurrentDb
tblNowa.Fields.Append fid
,etfld=tblNowa.CreateField("Kraj", dbText)
■id.DefaultValue = "Polska" a.Fields.Append fid
_ __. = tblNowa.CreateField(»DataUrodzenia", dbDate)
fld.Required = True .blNowa.Fields.Append fid
.Append tblNowa
twórz właściwość Caption i ustaw jej wartość
I)
Type = dbText prp.Value = "Data urodzenia fid Properties.Append prp
wpip , tM»o„,.«e,C.Prop.rtyCDa!,cripti=n-,
b;;=Trylł.,o„ t-x. u»o«o»a p«, -^ «>■■
Exit Sub
i
uga_Błędu:
MsgBox Err.Number & ": " & Err .Description
Sub
248
Programowanie w AccessM Mani]
Po uruchomieniu procedury w przykładzie 2.5.A nowa tabela o nazwie „A pojawi się w oknie bazy danych w aplikacji Microsoft Access. Jeżeli tabela jest doczna, naciśnij F5, aby odświeżyć okno bazy danych. Aby sprawdzić właści' które zostały zdefiniowane i ustawione przez tę procedurę, uaktywnij tabelę A w trybie Projektuj (Design) i kliknij na nazwę pola, dla którego utwoi i ustawiłeś właściwość w kodzie procedury. Następnie sprawdź właściwości tego rys. 2.6 przedstawia obecne ustawienia właściwości Reguła poprawności Rule) oraz komunikat o błędzie (Validation Text) pola idAgenta.
H Agenci: Tabela |
|
||||
|
Nazwa pola |
Typ danych Opis | *. f i |
|||
|
IdAgenta| |
Tekst |
J |
||
|
Kraj |
""'..:Tekst' "i zzrii zizi |
|
||
|
DataUrodzenia |
Data/Godzina ! |
d |
||
i |
Właściwości pola |
|
|||
Ogólne |
Odnośnik |
|
|
||
Rozmiar pola |
6 |
|
|||
Format |
|
|
|||
Maska wprowadzania |
|
|
|||
Tytuł |
|
|
|||
Wartość domyślna |
|
|
|||
Reguła poprawności |
Like 'A*1 |
|
|||
Komunikat o błędzie |
IdAgenta musi zaczynać się na |
|
|||
Wymagane |
Nie |
|
|||
Zerowa długość dozwolon. Nie |
|
||||
Indeksowane |
Nie |
|
|||
Kompresja Unicode |
Nie |
|
|||
|
|
|
; C
U
2:
V
Rysui
Dod
Rysunek 2.6. Taką tabelę można utworzyć za pomocą kodu VB A. Można również programowo ustawić odpowiednie właściwości pól tabeli (zob. przykład 2.5.A)
Aby sprawdzić wartość właściwości opis (Description) tabeli Agenci, ■ ustawiliśmy w przykładowej procedurze 2.5.A, kliknij prawym klawiszem mysJ nazwę tabeli Agenci w oknie bazy danych i wybierz Właściwości (Propei z podręcznego menu.
iatwc otwo saniu część już u rzyst: beli t nowy mnie<
wanie bazami danych przy użyciu DAO
249
tóiwoścfc Agenci
Ogólne
Agenci
Typ:
Tabele
Przykładowa
tabela utworzona przy użyciu
DAO ■,
Lżony:
2002-01-25 18:07:35
Zmodyfikowany: 2002-02-01 17;23'.4O Właściciel: Administrator
Atrybuty
Siedzenie na poziomie wiersza
R ysunek 2.7. Właściwość Description dla obiektu TableDef można ustawić z inerfejsu użytkownika lub z kodu procedury VBA (zob. przykład 2.5.A)
podawanie nowych pól do tabeli
>rą na
es)
SHSSE
ZudZoi dfa nowego pola w pustym wierszu nowe pole staje się
T,
Czasami edn^k będziesz
chciał wstawić dodatkowe pola do istniejącej
ątabeh.
Czasami^jednak * ^
spo§ób
należy
sko.
abeli za pomocą kodu ^^ w P dodama dwóch nowych pól do ta- ^^X.1^wiotIa liczbę pól w tabeli przed i po dodaniu ToprLdni podZdział dotyczący tworzenia tabel, aby przypo- tworzenia tabeli i definiowania jej poi.
250 Programowanie w AcM
Przykład 2.5.B. Dodawanie nowych pól do istniejącej już tabeli
Private Sub cmdDodajPole_Click() Dim db As DAO.Database Dim tdf As DAO.TableDef
On Error GoTo Obsługa_Błędu
1 zmodyfikuj ścieżkę dostępu do pliku DAOEXTE.MDB
Set db = OpenDatabase("C:\DAOEXTE.MDB')
Set tdf = db.TableDefs("tblSpotkaniaZKlientem")
MsgBox "Ilość pól w tabeli: " & _
db.TableDefs ("tblSpotkaniaZKlientem") .Fields.counj With tdf
.Fields.Append .CreateField("LiczbaSpotkań", dblnteger) .Fields.Append .CreateField("Rezultat", dbMemo) End With MsgBox "Ilość pól w tabeli: " & _
db.TableDefs("tblSpotkaniaZKlientem").Fields.count db.Close Exit Sub Obsługa_Błędu:
MsgBox Err.Number & ": " & Err.Description End Sub
Procedura o nazwie cmdDodajPoie_ciick pokaźna powyżej korzystazes ry with...End with, aby szybko dodać dwa nowe pola do istniejącej już tabeli:
With tdf
.Fields.Append .CreateField("LiczbaSpotkań", dblnteger) .Fields.Append .CreateField("Rezul;at", dbMemo) End With
Każde nowe pole dołączone jest do zbioru Fieds określonego obiektu W powyższym przykładzie utworzyliśmy nowe pole, korzystając z metody i metodzie Append należy postawić spację, natomiast przed metodą create] kropkę. Aby dodać dwa nowe pola do istniejącej już tabeli, nie posługując sip rąwith...End With, należałoby napisać dwie instrukcje:
tdf.Fields.Append tdf.CreateField("LiczbaSpotkań ", dblnteger)
Manipulowanie bazami danych przy użyciu DAO
251
t it Fields.Append tdf .CreateField("Rezultat", dbMemo)
Jednakże zastosowanie struktury with...End with ułatwia zrozumienie kodu
i przyśpiesza jego wykonanie.
Usuwanie pola z tabeli
Możesz usunąć jakiekolwiek pole z istniejącej już tabeli bez względu na to, czy Lie to zawiera dane czy jest puste. Jednakże nie możesz usunąć obiektu Field ze Łom Fields obiektu TableDef s po utworzeniu indeksu, który zdefiniowany jest na tym polu Najpierw należy usunąć indeks. Aby usunąć pole za pomocą kodu VBA, skorzystaj z metody Delete. W przykładzie 2.5.C usuniemy dwa pola, które dodaliśmy w rezultacie wykonania kodu procedury cmdDodaj pole cl ick w przykładzie 2.5 .B.
Przykład 2.5.C. Usuwanie pola z tabeli
private Sub cmdUsuńPole_Click () Dim db As DAO.Database Dim tdf As DAO. TableDef
On Error GoTo Obsługa_Błędu
■ zmodyfikuj odpowiednio ścieżkę dostępu do pliku DAOEXTE.MDB
Set db = OpenDatabase("C:\DAOEXTE.MDB")
Set tdf = db.TableDefs("tblSpotkaniaZKlientem")
MsgBox "Liczba pól w tabeli: " & _
db.TableDefs("tblSpotkaniaZKlientem").Fields.count
With tdf
.Fields.Delete "LiczbaSpotkań"
.Fields.Delete "Rezultat" End With
MsgBox "Liczba pól w tabeli: " & _
db.TableDefs("tblSpotkaniaZKlientem").Fields.count
db.Close
Exit Sub
Obsługa_Błędu:
MsgBox Err. Number & ": " & Err .Description
tod Sub
252
Programowanie w Ai
M odyfikowanie tabeli i właściwości pól
Procedura cmdchangePrp_ciick w przykładzie 2.5.D ilustruje, w jaki można zmienić właściwość Description dla danej tabeli:
tdf.Properties("Description").Value = "Zmień właściwości"
Procedura ta również pokazuje, jak należy ustawić właściwość Format dial go pola z kodu VBA. Ponieważ właściwość Format pola Dataurodzenia niebyła! finiowana jeszcze w interfejsie użytkownika, Access „nie wie", że właściwość J nieje, wobec czego kod VBA musi zastosować metodę createProperty, aby« rzyć tę właściwość, zanim będzie można jej przypisać określoną wartość. SporąJ jąc procedury, które ustawiają właściwości zdefiniowane przez Microsoft AcceJ leży dodać do procedury kod obsługi błędu, aby jpewnić się, że właściwość,! zamierzasz ustawić, już istnieje w zbiorze Properties.
Przykład 2.5.D. Modyfikowanie tabeli i właściwości pól
Private Sub cmdZmieńPrp__Click () Dim db As DAO.Database Dim tdf As DAO.TableDef Dim prp As DAO. Property-Dim fid As DAO.Field
On Error GoTo Obsługa_Błędu
Set db = CurrentDb
Set tdf = db.TableDefs("Agenci")
Set fid = tdf.Fields("Dataurodzenia";
tdf.Properties("Description").Value = 'Zmień właściwości"
Set prp = fId.CreateProperty("Format")
prp.Type = dbText
prp.Value = "yyyy/dd/mm"
fid.Properties.Append prp
db.Close
Exit Sub Obsługa_Błędu:
MsgBox Err.Number & ": " & Err.Description End Sub
[ Manipulowanie bazami danych przy użyciu DAO
253
P obieranie właściwości tabeli
Każdy obiekt DAO (z wyjątkiem obiektów DBEngine, Connection, oraz Error) da zbior o nazwie Properties (Właściwości). Properties są obiektami i tak jak W obiekty, zawarte są w kolekcjach (zbiorach). Możesz pobrać nazwy wszystkich rfaściwości danego ob.ektu, korzystając ze struktury pętli For Each...Next Przykład 15.E demonstruje, w jaki sposób można sporządzić wykaz wszystkich właściwości Janej tabeli. Po uruchomieniu procedury cmdTabeiaPrP_ciick nazwy właściwości mzich bieżące wartości (ustawienia) są wyszczególnione w oknie Instrukcje bezpo-jrednie. Zbiór Properties pozwala na tworzenie oraz przechowywanie nowych wła-fewości. Zobacz przykład 2.5.A wcześniej w tym rozdziale, aby przypomnieć sobie zasady tworzenia nowego pola tabeli oraz właściwości tabeli.
?ł Xl
Agenci
U tworzony: 2002-01-2518:07:35 i Zmodyfikowany: 2002-02-01 17:23:40 [Właściciel: Administrator
l~" Śledzenie na poziomie wiersza
R ysunek 2.8. Znaczenie tabeli można samemu ustawić, klikając prawym klawiszem myszy na nazwę tabeli i wybierając opcję Właściwość. Można też uruchomić procedurę VBA (zob. przykład 2.5.D)
254
Programowanie w Access!
M Agenci: Tabela |
|
|
j |
|
|
Nazwa pola |
Typ danych | Opis |_*J |
||
|
IdAgenta |
Tekst ~~J |
||
|
Kraj ___Z |
^ Tekst 1 ZUZ .... |
||
± |
DataUrodzenia |
Data/Godzina |
||
— |
|
|
|
|
|
Właściwości pola |
|
||
Ogólne ] odnośnik | |
|
|
||
Format |
rrrr-dd-mm |
J |
||
Maska wprowadzania |
|
|
||
Tytuł |
Data urodzenia |
|
|
|
Wartość domyślna |
|
|
|
|
Reguła poprawności |
|
|
|
|
Komunikat o błędzie |
|
|
|
|
Wymagane |
Tak |
' |
|
|
Indeksowane |
Nie ; '■ ' :.."\'■■■'-'■ ::.:■:' ■:'■:■■ :■' ": |
|
|
|
|
|
|
Rysunek 2.9. Właściwość Format pola w tabeli można ustawić ręcznie w trybie Projektuj I tabeli albo programowo z kodu procedury VBA (zob. przykład 2.5.D)
Przykład 2.5.E. Pobieranie nazw właściwości tabeli
Private Sub cmdTabelaPrp_Click() Dim prp As DAO.Property Dim tdf As DAO.TableDef Dim db As DAO.Database
Set db = CurrentDb
Set tdf = db.TableDefs("Agenci")
For Each prp In tdf.Properties On Error Resume Next
Debug.Print prp.Name & ": " & prp.Value Next MsgBox "Obejrzyj nazwy waściwości w oknie
Instrukcje bezpośrednie." End Sub
Manipulowanie bazami danych przy użyciu DAO
255
P rzyłączanie tabel do bazy danych
Przyłączanie tabel pozwala na użycie danych z innej bazy danych Access bez potrzeby kopiowania danych z drugiej bazy danych. Można również przyłączać tabele mieszczące się w innych programach lub formatach plików, na przykład Microsoft Excel, Microsoft FoxPro, dBase, albo Paradox. Aby przyłączyć tabelę do bazy danych, skorzystaj z metody createTableDef, która tworzy nową tabelę:
Set
mojaTabela = db.CreateTableDef("TableDBASE")
Następnie ustaw właściwość connect obiektu TableDef. Dla przykładu, następujące polecenie podaje ciąg połączenia:
lOJaTabela. Connect = "dBase 5 . 0 ;Database=C : \ Program Files\" &_ "MicrosoftOffice\Office\1033 "
Następnie ustaw właściwość sourceTableName obiektu TableDef, podając nazwę tabeli w źródłowej bazie danych:
KJaTabela. SourceTableName = "Customer .dbf"
Wreszcie skorzystaj z metody Append, aby dołączyć obiekt TableDef do zbioru
lableDefs:
jb.TableDefs. Append mojaTabela
Procedura w przykładzie 2.5.F demonstruje, w jaki sposób należy przyłączyć do lieżącej bazy danych tabelę pochodzącą z bazy danych aplikacji dBase. Przed uru-doinieniem tej procedury odnajdź plik Customer.dbf na swoim komputerze zmodyfikuj ścieżkę dostępu do danych użytą w tej procedurze w ciągu połączenia.
•rzykiad 2.5.F. Przyłączanie tabeli do bazy danych
rivate Sub cmdLinkTblDbase_Click () Dim db As DAO.Database Dim mojaTabela As DAO.TableDef On Error GoTo err_LinkDbaseTable
256
Programowanie w Aa
S et db = CurrentDb
Set mojaTabela = db.CreateTableDef("TableDBASE")
mojaTabela.Connect = "dBase 5 . 0 ;Database=C : \Program Files\'
"Microsoft Office\Office\1033" mojaTabela.SourceTableName = "Customer.dbf" db.TableDefs.Append mojaTabela
db.TableDefs.Refresh MsgBox "Tabela bazy danych dBase została pomyślnie przyłączij
Exit Sub err_LinkDbaseTable:
MsgBox Err.Number & ": " & Err.Description End Sub
Sporządzanie wykazu tabel i pól
Następująca procedura drukuje nazwę każdej tabeli w bieżącej bazie ( i podaje nazwy wszystkich pól w tych tabelach.
Przykład 2.5.G. Sporządzanie wykazu tabel i pól
Private Sub cmdWykazTabelOrazPól_Click() Dim db As DAO.Database Dim x As Integer Dim y As Integer
Set db = CurrentDb
For x = 0 To db.TableDefs.count - 1
Debug.Print "Tabela: " & db.TableDefs(x).Name For y = 0 To db.TableDefs(x).Fields.count - 1
Debug.Print Chr(9) & db.TableDefs(x) .Fields(y) .Name Next y Next x End Sub
M anipulowanie bazami danych przy użyciu DAO
Tworzenie indeksów oraz relacji miedzy tabelami przy użyciu DAO
spor2ądź indeksy dla pó1 oraz
l>mDA0_Przyk3: Formularz
xl
U twórz relacje między tabelami
INDEKSY
oraz RELACJE
j
Sporządź
klucz
i
podstawowy i
j
ustawjego
I .właściwości
B
S porządź indeks kombinowany
Sporządź wykaz indeksów zdefiniowanych w tabeli
R ysunek 2.10. Programowanie relacji między tabelami oraz indeksów
Tworzenie klucza podstawowego oraz ustawianie jego właściwości
Jak wiesz każda tabela w twojej bazie danych powinna zawierać pole (lub kombinację poi), które jednoznacznie identyfikuje każdy rekord w tabeli. Takie pole (lub kombinacja) określane jest terminem Klucz podstawowy (Primary Key). Przykład 2.10.A przedstaw, w jaki sposób programowo tworzy się klucz podstawowy wTabeli oraz ustawia wybrane właściwości klucza. Klucz podstawowy jest rodzajem indeksu indeksy określają porządek, w którym rekordy pobiera się z bazy danych Ideterminują czy powtarzające się dane będą zaakceptowane. Chociaż indeksy przyczają dostęp do wyszukiwanych rekordów w dużych tabelach, zdefiniowanie zZ tej hczby indeksów może spowodować zwolnienie szybkości, w jakiej przeprawi tae są operacje aktualizacji danych. W DAO indeksy tworzy się za pomocą metody
T»
258
Programowanie w Access; Mai
createindex obiektu TabieDef. Następujące polecanie utworzy indeks o nazwieB
maryKey:
Set idx = tdf.UtwórzIndeks("PrimaryKey" ]
dex
Aby zapewnić utworzenie właściwego indeksu, należy ustawić odpowiedź ściwości indeksu. Na przykład właściwość Primary indeksu wskazuje, że polaij su stanowią klucz podstawowy dla tabeli:
idx.Primary = True
niż*
Aby zmusić użytkownika do wpisania danych we wszystkich polach indeksuM nowanego (tzn. indeksu obejmującego wartości kilku pól), skorzystaj z właściwości! ired (Wymagane) według wzoru poniżej:
Prz
idx.Required = True
Innymi słowy, właściwość Required (Wymagane) wskazuje, czy ind przyjmować wartości Null (Puste). Po ustawieniu tej właściwości na Tak I Null nie będą akceptowane. Skorzystaj z właściwości ignoruj zerowe (Igno aby wskazać, czy rekord z wartością Null w polach indeksu powinnien być i niony w indeksie:
idx.IgnoreNulls = False
Użyj właściwości unique (Unikatowy), aby określić, czy wartości wi muszą być unikatowe (tzn. nie mogą się powtarzać):
idx.Unique = True
Aby sporządzić indeks w tabeli, należy skorzystać najpierw z metody Field obiektu index. Będzie wtedy można utworzyć obiekt Field dla każdej które ma być częścią indeksu:
Enc
Set fld = idx.UtwórzPole("IdAgenta", dbText)
Po utworzeniu obiektu Field należy dodać go do zbioru Fields:
iwanie bazami danych przy użyciu DAO
259
; dx.Fields.Append fid
Ostatnia czynność w procesie tworzenia indeksu polega na dodaniu obiektu m-Lxdo zbioru indexes:
itdf.Indexes.Append idx
Rezultat procedury cmdutwórzindeks_ciick pokazany jest na rysunku 2.11 po-| niżej przykładu 2.10.A.
yklad 2.10. A. Tworzenie klucza podstawowego i ustawianie jego właściwości
private Sub cmdUtwórzIndeks_Click()
Dim db As DAO.Database
Dim tdf As DAO.TableDef | Dim fid As DAO.Field
Dim idx As DAO. Index
Set db = CurrentDb
Set tdf = db.TableDefs ("Agenci ")
1 utwórz klucz podstawowy
Set idx = tdf.Createlndex("PrimaryKey")
idx. Primary = True
idx. Required = True
idx.IgnoreNulls = False
Set fid = idx.CreateField("IdAgenta", dbText)
idx.Fields.Append fid
: ' dodaj indeks do zbioru Indexes w tabeli Agenci tdf. Indexes . Append idx
Sub
260
Programowanie w Acci
f Indeksy: Agenci
Nazwa indeksu
PrimaryKeyl
Nazwa pola
Id Agenta
Porządek sortowania
W łaściwości indeksu
P odstawowy Tak Unikatowy Tak Ignoruj zerowe Nie
|
Nazwa tego indeksu, Każdy
indeks może użyć
i maksymalnie
10 pól,
Rysunek 2.11. Okno Indeksy po wykonaniu procedury w przykładzie 2.10.A
Tworzenie indeksu kombinowanego
Procedura cmdMuitiindeks_ciick w przykładzie 2.10.B (pokazana tworzy indeks złożony z dwóch pól w tabeli Agenci. W tym celu korzystamy i z metody createindex obiektu TabieDef. Następnie stosujemy metodę creatj obiektu index, aby utworzyć pierwsze pole, wchodzące w skład indeksu, dodajemy to pole do zbioru Fields. Powtórz te same czynności dla drugiego poll re chcesz włączyć do indeksu. Warto pamiętać, że kolejność, w której dodamyn indeksu, ma wpływ na porządek indeksu. Jeżeli otworzysz okno Indeksy po niu procedur w przykładach 2.10.A oraz 2.10.B, powinieneś zobaczyć dwa i o nazwach AgentKraj oraz Primary Key (zob. rysunek 2.12 poniżej przykładu 2.l|
Przykład 2.10.B. Tworzenie indeksu kombinowanego
Private Sub cmdMultiIndeks_Click(! Dim db As DAO.Database Dim tdf As DAO.TabieDef Dim fid As DAO.Field Dim idx As DAO.Index
Manipulowanie bazami danych przy użyciu DAO
261
S et db = CurrentDb
Set tdf = db.TableDefs ("Agenci")
Set idx = tdf .Createlndex("AgentKraj")
Set fld = idx.CreateField("IdAgenta", dbText) idx.Fields.Append fid
Set fid = idx.CreateField("Kraj", dbText) idx.Fields.Append fid
tdf. Indexes . Append idx jnd Sub
'> Indeksy: Agenci
Nazwa indeksu
f PrimaryKey
N azwa pola
IdAgenta
Kraj
IdAgenta
Rosnąco Rosnąco Rosnąco
sortowania
2Ś
Właściwości indeksu
Podstawowy Nie Unikatowy Nie Ignoruj zerowe Nie
Nazwa tego indeksu, Każdy indeks może użyć maksymalnie 10 pól,
R ysunek 2.12. Indeksy wyświetlone w tym oknie zostały utworzone przez procedury VBA w przykładach 2.10.A oraz 2.10.B
Wyszczególnianie indeksów w tabeli
Zamiast otwierać okno Indeksy w interfejsie użytkownika, możesz sporządzić wykaz indeksów z procedury VBA, korzystając z pętli For Each...Next oraz zbioru Indexes obiektu TableDef. Aby pobrać nazwy indeksów zdefiniowanych w tabeli Agenci, uruchom procedurę cmdNazwyindeksów_click w przykładzie 2.10.C. Ostat-
^amm
262
Programowanie
w Accesi
nie polecenie w tej procedurze uaktywnia okno Instrukcje bezpośrednio, abyśfl szybko zobaczyć rezultat tej procedury.
Polecenie,
SendKeys "Ag"
jest równoznaczne z naciśnięciem klawiszy Ctrl+g, które uruchamiają om strukcje bezpośrednie.
Przykład 2.10.C. Pobieranie nazw indeksów zdefiniowanych w określonej tabeli
Private Sub cmdNazwyIndeksów_Click() Dim db As DAO.Database Dim tdf As DAO.TableDef Dim idx As DAO.Index
Set db = CurrentDb
Set tdf = db.TableDefs("Agenci")
For Each idx In tdf.Indexes
Debug.Print idx.Name Next
' pokaż okno Instrukcje bezpośrednie SendKeys "Ag" End Sub
Mai
\vt dar
tab lin
Re d?
soi rei ru
Se
/li
Dc
n(
Immediate
Agent Kraj PrimaryKey
Rysunek 2.13. Po uruchomieniu procedury w przykładzie 2.10.C okno Instrukcje
bezpośrednie podaje wykaz indeksów znajdujących się w tabeli Agenci
Deklarowanie powiązań między tabelami
W bazie danych wiele operacji zależy od właściwych relacji pomiędzy t Aby powiązać dane z dwóch i więcej tabel, należy połączyć odpowiadające sobi
inipulowanie bazami danych przy użyciu DAO
263
^ tabelach. Powiązanie między tabelami określane jest relacją. Relacja dopasowywuje dane w polach kluczowych - zazwyczaj są to pola o takiej samej nazwie w obu tabe-m. Aby manualnie zadeklarować relację, otwórz okno Relacje (Relationships).
Dodaj tabele, które chcesz powiązać ze sobą. Kliknij na nazwę pola łączącego ttbeli głównej i upuść go na odpowiadające mu pole tabeli związanej. Rezultatem jest |iałącząca odpowiadające sobie pola.
W DAO relacje między polami w tabelach oraz kwerendach reprezentuje obiekt Relation. Z obiektu tego można skorzystać do przeglądania lub tworzenia relacji między tabelami bazy danych programatycznie. Przykład 2.10.D demonstruje, w jaki spo-sób można powiązać ze sobą trzy tabele przy użyciu DAO. Pierwszy krok w deklaracji relacji między tabelami wymaga zastosowania metody createReiation, według wzo-\n poniżej:
mojaRelacja = db.CreateReiation("JedenDoWielul1
Zauważ, że metoda ta wymaga łańcucha znaków lub zmiennej typu String wskazującej nazwę nowej relacji. W tym przykładzie, relacji tej nadaliśmy nazwę jeden-jowielul. Polecenie mojaRelacja.Table = "tblKraje" , podaje nazwę tabeli głównej (tabela ta zawiera klucz podstawowy tzw. Primary Key).
Polecenie mojaRelac ja. ForeignTable = " tblKrajeRejony" podaje nazwę tabeli związanej (ta tabela zawiera klucz obcy tzw. Foreign Key). Możesz również podać tabelę główną (Key Table) oraz tabelę związaną (Foreign Table), korzystając z jednego polecenia w następującej postaci:
Set mojaRelac ja = db. CreateReiation ("JedenDoWielul' IrajeRejony")
1 tblKraje", "tbl-
Następnie powinieneś ustawić właściwość Atrybuty (Attributes) obiektu Relation, aby umożliwić kaskadową aktualizację pól i kaskadowe usuwanie rekordów. f ten sposób silnik bazy danych Microsoft Jet będzie mógł automatycznie aktualizować lub usunąć rekordy w powiązanych tabelach:
-ojaRelac ja. Attributes = dbRelationUpdateCascade + dbRelationDelete-Kascade
Tabela 2.3 zawiera atrybuty obiektu Relation.
264
Programowanie w Accd
Tabela 2.3. Atrybuty obiektu Relation |
|
Znaczenie |
Stała |
Utwórz relację jeden-do-jeden |
dbRelat:-onUnique |
Nie wymuszaj więzów integralności |
dbRelat:.onDontEnf orce |
Relacja istnieje w innej bazie danej, która zawiera dwie tabele połączone |
dbRelat:_onInherited |
Kaskadowo aktualizuj powiązane pola |
dbRelat:_onUpdateCascade |
Kaskadowo usuwaj powiązane rekordy |
bRelationDeleteCascade |
Po ustawieniu atrybutów obiektu Relation podaj klucz podstawowy wl głównej oraz klucz obcy w tabeli związanej:
Set mojePole = mojaRelacja.CreateField("IdKraju") mojePole.ForeignName = "IdKraju"
Następnie dodaj obiekt Field do zbioru Fields obiektu Relation:
myRelation.Fields.Append mojePole
Ostatni krok w deklarowaniu relacji pomiędzy dwoma tabelami wymagam czenia obiektu Relation W zbiorze Relations:
db.Relations.Append mojaRelacja
Celem procedury cmdReiacje_ciick jest zadeklarowanie relacji jeden-do-j pomiędzy trzema tabelami. Stąd też procedura kontynuuje tworzenie relacji oj jedenDowielu2. Ponieważ niepoprawne lub powtarzające się nazwy relacji spow błąd przy próbie użycia metody Append, procedura zastawia pułapkę na błąd] sposób, jeżeli relacje o podanych nazwach już istnieją, obiekty Relation został nięte ze zbioru Relations. Umożliwi to uruchamianie procedury wprzjl 2.10.D nieskończoną ilość razy. Polecenie Resume o odeśle Visual Basic zpow do wiersza kodu, który spowodował błąd, i procedura będzie wykonywana i
ulowanie bazami danych przy użyciu DAO
265
L |i procedura napotka na inny błąd, użytkownik otrzyma komunikat podający numer znaczenie tego błędu.
Przykład 2.10.D. Deklarowanie powiązań (relacji) między tabelami
private Sub cmdRelacje_Click() Dim db As DAO.Database Dim mojaRelacja As DAO.Relation Dim raojePole As DAO.Field
On Error GoTo Err_Relations
Set db = CurrentDb
Set mojaRelacja = db.CreateRelation("JedenDoWielul")
mojaRelacja.Table = "tblKraje"
mojaRelacja.ForeignTable = "tblKrajeRejony"
, utwórz relację jeden do wiele z kaskadową aktualizacją I i kaskadowym usuwaniem mojaRelacja. Attributes = _
dbRelationUpdateCascade + dbRelationDeleteCascade
Set inojePole = mojaRelacja.CreateField(" IdKraju") mojePole.ForeignName = "IdKraju" mojaRelacja.Fields.Append mojePole
<> ■
" zachowaj relację db.Relations.Append mojaRelacja
1 utwórz nową relację
Set mojaRelacja = db.CreateRelation(»JedenDoWielu2")
mojaRelacja.Table = "tblStany" mojaRelacja.ForeignTable = "tblKrajeRejony"
> utwórz relację jeden do wiele z kaskadową aktualizacją ■ i kaskadowym usuwaniem mojaRelacja. Attributes = _
dbRelationUpdateCascade + dbRelationDeleteCascade
Set mojePole = mojaRelacja.CreateField("IdStanu")
266
Programowanie w Access lim
m ojePole.ForeignName = "IdStanu" mojaRelacja.Fields.Append mojePole
' zachowaj relację db.Relations.Append mojaRelacja Exit Sub Err_Relations:
If Err.Number = 3012 Then
db.Relations . Delete " JedenDoWielu:." db.Relations. Delete "JedenDoWielu;!" Resume 0 Else
MsgBox Err.Number & ": " & Err.Description End If End Sub
Rysunek 2.14 poniżej przedstawia okno Relacja po wykonaniu procedj cmdReiacjeciick w przykładzie 2.10.D. Aby zbadać zmiany wprowadzone w tj oknie, uaktywnij okno bazy danych i wybierz Narzędzia => Relacje (Tools tionships) z menu. Następnie zaznacz Relacje => Pokaż wszystko (Relationships; Show Ali).
• ■; Relacje
I dKraju
NazwaKraju
(NazwaStanu
I dKraju IdStanu
J UJ
lii
R ysunek 2.14. Możesz powiązać dwie tabele, przeciągając kiucz podstawowy z jednej tabel i upuszczając go na odpowiadający mu klucz obcy w drugiej tabeli albo uruchamiając procedurę VBA w przykładzie 2.10.D
Manipulowanie bazami danych przy użyciu DAO
267
[ dytowanie relatji
Tabela/Kwerenda: Pokrewna tabela/kwerenda:
tbIKraje jJtblKrajeRejony J
OK
A nuluj
_ J7 Wymuszaj wiązy integralności -Ł f? Kaskadowo aktualizuj pola pokrewne ?j |7 Kaskadowo usuń rekordy pokrewne
Typ relacji: j Jeden-do-wielu
Rysunek 2.15. Okno dialogu Edytowanie relacji wyświetla opcję Wymuszaj więzy
integralności włączoną przez kod procedury VBA w przykładzie 2.10.D
Tworzenie i uruchamianie kwerend przy użyciu DAO
Microsoft Access umożliwia tworzenie kilku typów kwerend. Najprostsza z nich pozwala wybrać zestaw rekordów z jednej lub kilku tabel. Inne kwerendy wykonują konkretne czynności na aktualnych danych, umożliwiając tworzenie nowych tabel, dodawanie nowych rekordów do tabeli, modyfikowanie wartości w polach tabeli, czy też pozwalają usunąć określone rekordy tabeli. Access dysponuje przyjaznym interfejsem użytkownika, w którym łatwo jest utworzyć kwerendy w sposób manualny. W tym zagadnieniu jednak nauczysz się tworzyć kwerendy, pisząc procedury VBA korzystające z obiektów, właściwości oraz metod DAO.
Tworzenie kwerendy wybierającej przy użyciu DAO
Procedura cmdseiectQuery_ciick w przykładzie 2.16.A ilustruje, w jaki sposób tworzy się prostą kwerendę wybierającą, której celem jest wybranie tylko tych pracowników z tabeli Employees, których tytuł zaczyna się od 'Ms.'. Kwerendy wybierające umożliwiają pobranie zestawu rekordów z jednej lub więcej tabel bazy danych. Kwerendy te łatwo jest rozpoznać, gdyż zawierają one w swoim zapisie syntaktycz-nym słowa kluczowe select oraz from:
SELECT Nazwisko FROM Pracownicy
268
SD frmDA0JPrzyk4: Formularz
Rodzaje kwerend i Więcej na temat kwerend 1
Kwerendy
[ Kwerenda wybierająca!
| .(SELECT) !
D
Kwerenda aktualizująca (UPDATE)
Kwe enda tworząca tabele (Make-Table)
B
Kwerenda z parametrem (Parameter)
Uruchom kwerendę aktualizującą
H
Kwarenda dołączająca (APPEND)
U ruchom kwerendę z parametrem
Kwerenda usuwająca (DELETE)
Kwerenda przekazująca (Pass-Through)
Rysunek 2.16. Tworzenie i uruchamianie kwerend z kodu procedur VBA
Powyższa kwerenda wybierająca wybiera pole Nazwisko z tabeli PracowJ Jeżeli w nazwie pola znajduje się odstęp spacji, należy obiąć nazwę nawiasem!
dratowym, np. [Data urodzenia].
SELECT Imię, Nazwisko, TelefonDomowy FROM Pracownicy
Powyższa kwerenda wybiera pola Imię, Nazwisko, oraz TelefonDomowyZ6 Pracownicy.
SELECT * FROM Pracownicy
Powyższa kwerenda wybiera wszystkie pola wszystkich rekordów z tabeli i cownicy. Znak wieloznaczny (*) reprezentuje wszystkie pola w danej tabeli.
Kwerendę zachowaną w bazie danych aplikacji Microsoft Access repre J obiekt DAO o nazwie Query Def. Wszystkie obiekty Que::yDef wchodzą w skład J ru o nazwie QueryDef s. Definicję SQL danej kwerendy można ustawić lub przecaj przy użyciu właściwości SQL.
lipulowanie bazami danych przy użyciu DAO
269
A by programatycznie utworzyć kwerendę, użyj metody createQueryDef. Na wykład, aby utworzyć kwerendę wybierającą o nazwie mojaKwerenda, należy napi-2Ćnastępujące wyrażenie:
. qdf = db.CreateQueryDef("mojaKwerenda", mojSQL)
Po podaniu nazwy kwerendy nowy obiekt QueryDef podczas jego tworzenia jest Lomatycznie umieszczony w zbiorze QueryDef s. Drugi argument metody cre-tecueryDef jest zmienną typu string, która podaje wyrażenie SQL. Przed użyciem itejzmiennej należy przypisać jej łańcuch znaków:
= "SELECT * FROM Pracownicy WHERE ZwrotGrzecznościowy= 'Ms."
Klauzula where w kwerendach wybierających określa kryteria, decydujące
I m które rekordy zostaną wybrane. Procedura w przykładzie 2.16.A wybiera
iii Pracownicy wszystkie rekordy posiadające tytuł 'Ms.' W polu zwrotGrzecz-
cściowy. Operator równości (=) można zastąpić słowem kluczowym like, według
przykładu poniżej:
.SQL = "SELECT * FROM Pracownicy WHERE ZwrotGrzecznościowy LIKE 'Ms.1'1
Inne przykłady użycia klauzuli where, która ogranicza wybrany zestaw rekor-Uów, podane są poniżej:
jjLECT * FROM Pracownicy WHERE Miasto IN ('Redmond' , 'London' )
Powyższa kwerenda wybiera wszystkie pola z tabeli Pracownicy dla rekordów,
które mają Redmond lub London W polu Miasto.
$m * FROM Pracownicy WHERE Miasto IN ('Redmond', 'London') AND Lf LIKE 'Buchanan, Steven'
Powyższa kwerenda wybiera z tabeli Employees wszystkie pola dla rekordów,
ttóre posiadają W polu Miasto wpis Redmond lub London oraz wartość 'Buchanan, Steven'W polu Szef.
SELECT*
:FR0M
Pracownicy WHERE
(
(Year
( [HireDate] X1993 )
OR
270
Programowanie w AcceJ
(City='Redmond'))
Powyższa kwerenda wybiera z tabeli pracownicy wszystkie pola dlai które posiadają wartość mniejszą niż 1993 w polu Datazatrudnienia oraz!
'Redmond' W polu Miasto.
SELECT DISTINCT City FROM Employees
Powyższa kwerenda wybiera z tabeli Pracownicy nie powtarzające się \ w polu Miasto. Słowo kluczowe distinct eliminuje duplikaty w zwróconym] wie rekordów.
Przy programowaniu kwerend nie zapomnij umieścić w procedurze pul błędy, gdyż kwerenda, którą chcesz utworzyć, może już istnieć, bądź też mo inny, nieprzewidziany błąd.
Przykład 2.16.A. Tworzenie kwerendy wybierającej
Private Sub cmdSelectQuery_Click() Dim db As DAO.Database Dim qdf As DAO.QueryDef Dim mój SQL As String On Error GoTo Obsługa_Błędu
mój SQL = "SELECT * FROM Pracownicy WHERE ZwrotGrzecznościowy = '\ Set db = OpenDatabase("C:\Program Files\Microsoft Officers
"PL\Office\Samples\Northwind.mdb")
Set qdf = db.CreateQueryDef("mojaKwerenda", mój SQL) Exit Sub Obsługa_Błędu:
If Err.Number = 3012 Then
MsgBox "Kwerenda o takiej nazwie już istnieje." Else
MsgBox Err.Description End If End Sub
Po uruchomieniu procedury cmdSelectQuery_c lick w przykładzie 2.16Jl stępnym razem po otwarciu bazy danych Northwind powinieneś zobaczyć™ bazy danych w wykazie zachowanych kwerend kwerendę mojaKwerenda, ul
Manipulowanie bazami danych przy użyciu DAO
271
p z tę procedurę. Zamiast zachowywać kwerendy na stałe w danej bazie danych, można utworzyć kwerendę tymczasową, przypisując właściwości QueryDefName pusty feńcuch znaków (""), tak jak w tym oto przykładzie:
Set qdf = db.CreateQueryDef (" ", mojSQL)
Zaletą tymczasowych kwerend jest to, że nie zaśmiecają one swoją obecnością okna bazy danych.
Jeżeli chcesz sortować rekordy zwrócone przez kwerendę wybierającą, skorzy-d z klauzuli order by z następującymi słowami: asc (od ascending - rosnąco) lub DESC (od descending - malejąco), tak jak w przykładzie poniżej:
SECT * FROM Pracownicy ORDER BY Kraj DESC
Powyższa kwerenda wybiera wszystkie rekordy z tabeli Pracownicy i sortuje je malejąco na podstawie pola Kraj. Access domyślnie sortuje dane rosnąco (ASC), atem użycie słowa asc nie jest konieczne.
Tworzenie i uruchamianie kwerend z parametrem przy użyciu DAO
Specjalnym typem kwerendy wybierającej jest kwerenda z parametrem. Zamiast zwracać te same rekordy, przy każdym uruchomieniu kwerendy, użytkownik może podać kryterium wyszukiwania w polu dialogu podczas uruchomienia kwerendy. W DAO parametry w kwerendzie parametryzowanej są reprezentowane przez obiekt parameter. Obiekt QueryDef posiada zbiór o nazwie Parameters. Obiekty Parameter reprezentują istniejące parametry. Zatem, aby utworzyć kwerendę z parametrem, j ciąg znaków, który zawiera słowo kluczowe parameters:
jSJSQL = "PARAMETERS [Wpisz nazwę kraju] Text; " & _ 'SELECT * FROM Klienci WHERE Kraj = [Wpisz nazwę kraju];"
Przykład 2.16.B pokazuje, w jaki sposób można utworzyć kwerendę z parametrem, która prosi użytkownika o podanie nazwy kraju, przed pobraniem rekordów z tabeli Klienci w bazie danych Northwind.
Przed uruchomieniem tej procedury zmień ścieżkę dostępu do pliku Nor-4wind.mdb, tak aby wskazywała prawidłowy folder na twoim komputerze:
272
Programowanie w Accesł
P rzykład 2.16.B. Tworzenie kwerendy z parametrem
Private Sub cmdParametrQuery_Click() Dim db As DAO.Database Dim qdf As DAO.QueryDef Dim mój SQL As String
On Error GoTo Obsługa_Błędu
mojSQL = "PARAMETERS [Wpisz nazwę krsju] Text; " & "SELECT * FROM Klienci WHERE Kraj = [Wpisz nazwę kraju];
Set db = OpenDatabase("C:\Program Files\Microsoft Office\PL\'
"Office\Samples\Northwind.mdb")
Set qdf = db.CreateQueryDef("mojaKwerendaParam", mojSQL) Exit Sub Obsługa_Błędu:
If Err.Number = 3012 Then
MsgBox "Kwerenda o takiej nazwie już istnieje." Else
MsgBox Err.Description End If End Sub
Przed uruchomieniem gotowej kwerendy % parametrem, przypisz wartość j parametrowi, według wzoru w przykładzie 2.16.C. Po podaniu wartości należy otworzyć zestaw rekordów oparty na kwerendzie (przeczytaj zagadniei tytułowane „Wyszukiwanie i czytanie zestawu rekordów" w dalszej części działu).
Przykład 2.16.C. Uruchamianie kwerendy z parametrem
Private Sub cmdOdtwórzParamQry__Click()
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim rst As DAO.Recordset
Dim fid As DAO.Field Set db = OpenDatabase("C:\Program Files\Microsoft Office\PL\" &_ "Office\Samples\Northwind.mdb")
Set qdf = db.QueryDefs("mojaKwerendaParam")
Manipulowanie bazami danych przy użyciu DAO
273
1 podaj wartość parametru
gdf.Parameters("Wpisz nazwę kraju") = "USA"
1 otwórz zestaw rekordów w oparciu o podaną kwerendę
Set rst = qdf.OpenRecordset(dbOpenDynaset)
rst.MoveLast
MsgBox "Liczba firm w USA: " & rst.RecordCount
1 wydrukuj zawartość drugiego pola do okna Instrukcje bezpośrednie
rst.MoveFirst
Do Until rst .EOF
Debug.Print rst(l)
rst.MoveNext Loop
1 zamknij zestaw rekordów rst.Close
I Sub
Tworzenie i uruchamianie kwerendy aktualizującej przy użyciu DAO
Kwerenda aktualizująca jest typem kwerendy modyfikującej. Kwerendy aktuali-I żujące używa się w celu wprowadzenia zmian w polach danego rekordu lub w wielu I rekordach danej tabeli. Procedura w przykładzie 2.16.D tworzy i uruchamia kwerendę aktualizującą. W rezultacie tej kwerendy ceny wszystkich produktów dostawcy Tokyo Traders ulegają zwiększeniu o dwa złote. Metoda Execute obiektu QueryDef umożliwia uruchomienie dowolnego typu kwerendy modyfikującej.
Polecenie update w kwerendzie aktualizującej składa się z następujących części:
UPDATE |
nazwaTabelilub nazwaKwerendy |
|
SET |
wyrażenie/ czynność do wykonania |
|
|
kryterium/ ograniczenie czynności do |
pożądanych rzędów |
Kryterium w klauzuli where pozwala określić, które rzędy zostaną zaktualizowane. Kwerenda aktualizująca nie zwraca rekordów w postaci tabelarycznej. Aby przypadkowo nie uaktualizować niepożądanych rekordów, sprawdź najpierw, które rekor-
274
Programowanie w Aa
d y będą aktualizowane. W tym celu sporządź i uruchom najpierw kwerendy
Przykład 2.16.D. Tworzenie kwerendy aktualizującej
Private Sub cmdUpdateQuery_Click() Dim db As DAO.Database Dim qdf As DAO.QueryDef Dim mój SQL As String On Error GoTo Obsługa_Błędu mój SQL = "UPDATE Dostawcy INNER JOIN Produkty ON " &
"Dostawcy.IDdostawcy = Produkty.IDdostawcy " & _ "SET Produkty .Cena Jednostkowa ■- [CenaJednostkowa]+2 "WHERE (( (Dostawcy.NazwaFirmy) =='Tokyo Traders'));11 Set db = OpenDatabase("C:\Program Files\Mic:rosoft Office\PL\" &
"Office\Samples\Northwind.mdb")
Set qdf = db.CreateQueryDef("Podwyżka", mojSQL) qdf.Execute Exit Sub Obsługa_Błędu:
If Err.Number = 3012 Then
MsgBox "Kwerenda o takiej nazwie już istnieje." Else
MsgBox Err.Description End If End Sub
Procedura cmdupdateRun_ciick w przykładzie 2.16.E demonstruje, wjal sób można skorzystać z metody Execute, aby uruchomić przygotowaną kwerendę aktualizującą.
Przykład 2.16.E. Uruchamianie kwerendy aktualizującej
Private Sub cmdUpdateRun_Click() Dim db As DAO.Database
Set db = OpenDatabase("C:\Program Files\M:.crosoft Office\PL\" k. "Office\Samples\Northwind.mdb")
db.Execute "Podwyżka" End Sub
Manipulowanie bazami danych przy użyciu DAO
275
U ruchamianie kwerendy usuwającej przy użyciu DAO
z kwerendy usuwającej, można usunąć pojedynczy rekord lub ze- zb-zy danych. Polecenie delete, które stosuje s.e do usuwania rze-tfw i tabeli, składa się z następujących trzech części:
DELETE |
Instrukcja usuwająca |
|
|
|
|
FROM |
Nazwa tabeli |
|
|
|
|
WHERE |
Kryterium / ograniczenie |
czynności |
do |
pożądanych |
rzędów |
Nie można odwołać operacji wykonanej przez polecenie delete. Przed uruchomieniem kwerendy usuwającej zawsze sporządź kopię zapasową tabeli. Warto również przygotować i uruchomić kwerendę wybierającą przed zastosowaniem instrukcji delete, aby dowiedzieć się, które rzędy będą usunięte w przypadku zastąpienia polecenia select poleceniem delete.
Metoda Execute pozwala na uruchomienie kwerend modyfikujących lub wykonanie instrukcji SQL. Metoda ta może przyjąć opcjonalne argumenty. Na przykład,
w poleceniu:
qdf.Execute dbFailOnError
stała o nazwie dbFailOnError spowoduje błąd wykonania i anuluje operację aktualizowania lub usuwania danych, jeżeli wystąpi błąd. Właściwość RecordsAffec-ted obiektu QueryDef pozwala określić liczbę rekordów zmodyfikowanych przez ostatnią metodę Execute. Na przykład, następujące polecenie wyświetla liczbę usuniętych rekordów:
MsgBox qdf .RecordsAf fected & " wymazanych rekordów."
Procedura w przykładzie 2.16.F uruchamia istniejącą już kwerendę usuwającą, jeżeli użytkownik odpowie pozytywnie na komunikat przedstawiony na rysunku 2.17.
Przykład 2.16.F. Uruchamianie kwerendy usuwającej
\
Private Sub CmdDeleteQuery_Click() Dim db As DAO.Database
276
Programowanie w Access!
D im qdf As DAO.QueryDef
On Error GoTo ExitProc Set db = CurrentDb
Set qdf = db.QueryDefs("qryKlienciBezSpotkan")
' Chr(13) & Chr(13) to to samo co dwukrotne naciśnięcie klawisza El If (MsgBox("Czy chcesz wykonać następująca operację: " & Chr(13)j & Chr(13)
& qdf.SQL, vbYesNo + vbDefaultButton2, "Wyrażenie SQL")) = vbYes Then
qdf.Execute dbFailOnError MsgBox "Liczba wymazanych rekordów: Exit Sub Else
Exit Sub End If ExitProc:
MsgBox "Nieprzewidziany błąd." Exit Sub End Sub
& qdf .RecordsAffectJ
Czy chcesz wykonać następującą operację:
DELETE tblKlienci.IdKlienta, tblKlienci.NazwaKlienta, tblKlienci.TypKlienta, tblłlienci.Status, ŁblKlienci.IdKierawnfe I
tblKlienci.KlientOdRoku, tbIKIienaLiczbaSpotkańj tblKlienci.DataWpisu, tblKliend.IdWpisu, tblKlienci,DataModyfita|
rblKlienci IdModvhkacji : :
FROM tbIKIienci : : ■■■■■-■■ , 4 : : :
WHERE (((tblKlienci.LiczbaSpotkań)=0));
Yes
Rysunek 2.17. W polu komunikatu można wyświetlić wyrażenie SQL, na którym oparta jest kwerenda
Tworzenie i uruchamianie kwerendy tworzącej tabelę przy użyciu DAO
Kwerenda tworząca tabele pozwala na utworzenie nowej tabeli z zestawu rej dów pobranych z jednej lub więcej tabel lub kwerend. Kwerendy tego typu sączj stosowane do zachowania danych, tak jak istniały one w określonym momencie cal
i Manipulowanie bazami danych przy użyciu DAO
277
l ib przy sporządzaniu kopii zapasowej tabeli, bez potrzeby kopiowania całej bazy da-tach. Polecenie select into w procedurze cmdMakeATabieQuery_ciick (przykład 2J6.G) umożliwia sporządzenie nowej tabeli o nazwie KiiencizAmerykiPołudnio-vej,wcelu przechowywania nazwisk brazylijskich klientów z tabeli Klienci w bazie danych Northwind. Polecenie to może się składać z następujących części:
select nazwa pola |
Nazwa pola (użyj * dla wszystkich pól) |
insert nowa tabela |
Nazwa nowej tabeli |
from istniejąca Tabela / Kwerenda |
Nazwa istniejącej tabeli lub kwerendy, z której będą pobrane dane. |
HERE warunek |
Kryterium / ograniczenie operacji do pożądanych rzędów. |
order by nazwa pola |
Porządek rekordów w nowej tabeli |
Zwróć uwagę, że procedura w przykładzie 2.16.G tworzy tymczasową kwerendę tworzącą tabelę ( zamiast nazwy kwerendy w argumencie metody createQueryDef podany jest pusty ciąg znaków ("")).
kład 2.16.G. Tworzenie i uruchamianie kwerendy tworzącej tabele
feivate Sub cmdMakeATableQuery_Click() Dim db As DAO.Database Dim qdf As DAO.QueryDef Dim mój SQL As String
On Error GoTo Obsługa_Błędu
nojSQL = "SELECT * INTO KlienciZAmerykiPołudniowej FROM Klienci " &
"WHERE Kraj='Brazylia';" Set db = OpenDatabase("C:\Program Files\Microsoft Office\PL\" & _
"Office\Samples\Northwind.mdb") Set qdf = db.CreateQueryDef("", mojSQL) qdf .Execute Exit Sub ;:;iuga_Błędu:
278
Programowanie w Accd
MsgBox Err.Description End Sub
Tworzenie i uruchamianie kwerendy dołączającej przy użyciu DAO
Kwerendy dołączające umożliwiają dodanie rekordów z jednej lub więcej do innych tabel. Możesz dołączyć rekordy do tabeli znajdującej się w bieżącej danych lub innej bazie danych aplikacji Access, lub jakiejkolwiek zewnętrznej danych. Kwerenda dołączająca jest rodzajem kwerendy uaktualniającej, która i nowe rekordy na końcu istniejącej tabeli lub kwerendy. Kwerendy dołączają! zwracają rekordów. Są one pożyteczne w procesie archiwizacji rekordów. Przed stąpieniem do archiwowania rekordów należy przygotować nową strukturę tabel ra będzie przechowywać nasze archiwum rekordów. Aby dodać jeden lub wiej kordów do tabeli, skorzystaj z polecenia insert into. W poleceniu tyra możs różnić następujące części:
I NSERT INTO nazwaTabeliDocelowej [(Polel, Pole2)]
Nazwa tabeli lub kwerendy, do której mająbyj dołączone rekordy. Można podać nazwy pól, których należy dodać dane.
s elect nazwaPola
Nazwy pól, z których dane zostaną pobrane, j
FROM nazwaTabeli/Kwerendy
Nazwa tabeli lub tabel, z których zostanąpolj dane, lub nazwa kwerendy, lub polecenie 1
SELECT.
WHERE warunek
Kryteria / ograniczenie operacji do pożądańw rzędów.
P rocedura w przykładzie 2.16.H demonstruje, w jaki sposób tworzy się i un mia kwerendę dołączającą przy użyciu DAO.
Przykład 2.16.H. Tworzenie i uruchamianie kwerendy cołączającej
Private Sub cmdAppend_Click() Dim db As DAO.Database Set db = OpenDatabase ("C : \Program Files \Microsoft Office\PL\l
danych przy użyciu DAO
279
"Office\Samples\Northwind.mdb")
db.Execute "INSERT INTO KlienciZAmerykiPołudniowej " & "SELECT * FROM Klienci " & "WHERE Kraj = 'Argentyna'" db.Close
MsgBox "Dodano klientów z Argentyny." End Sub
Laga: Jeżeli uruchomisz powyższą procedurę więcej niż jeden raz, w tabeli Klien-UmerykiPołudniowej powstaną duplikaty rekordów.
Tworzenie i uruchamianie kwerendy przekazującej przy użyciu DAO
Kwerenda przekazująca działa bezpośrednio z zewnętrznym źródłem danych ODBC (Open Database Connectivity). Zamiast dołączać tabelę znajdującą się na serwerze bazy danych, możesz wysłać polecenia bezpośrednio do serwera w celu pobrania potrzebnych ci danych. Aby uruchomić kwerendę przekazującą, skorzystaj zwłaściwości connect. Jeżeli nie podasz ciągu połączenia w właściwości connect, to Access poprosi o podanie informacji dotyczącej połączenia przy każdorazowym od-
I twarzaniu kwerendy przekazującej (a to może być całkiem irytujące). Procedura wprzykładzie 2.16.1 korzysta zwłaściwości MaxRecords, aby zwrócić 15 rekordów ztabeli dbo.entity znajdującej się na serwerze SQL. Zwróć uwagę na to, że właściwość ReturnsRecords jest ustawiona na True. Jeżeli twoja kwerenda nie musi zwró-
I cićrekordów, zmień ustawienie właściwości ReturnsRecords na False.
przykład 2.16.1. Tworzenie kwerendy przekazującej (Przykład 1)
private Sub cmdPassThru_Click() Dim db As DAO.Database Dim qdfPass As DAO.QueryDef
On Error GoTo err_PassThru
Set db = CurrentDb
Set qdfPass = db.CreateQueryDef("PobierzRekordy")
■ wpisz swój własny ciąg połączenia, podając nazwę bazy
« danych na serwerze, swoje Id oraz hasło,
280
Programowanie w Access;
' oraz nazwę źródła danych qdfPass.Connect = "ODBC;Database=myDhName; " _
& "UID=MILL; PWD=year00 ; DSN=myDataS "
' zmień odpowiednio nazwę tabeli w poleceniu poniżej qdfPass.SQL = "Select * From dbo.entity" qdfPass.ReturnsRecords = True qdfPass.MaxRecords = 15 DoCmd.OpenQuery "PobierzRekordy" Exit Sub err_PassThru:
If Err.Number = 3151 Then MsgBox Err.Description Exit Sub End If
db.QueryDefs.Delete "PobierzRekordy" 1 kontynuuj wykonanie procedury od polecenia, ' które spowodowało błąd Resume 0 Exit Sub End Sub
Zamiast wyświetlać rekordy pobrane z bazy danych SQL w widoku arkusza! nych, poniższa procedura odczytuje rekordy do tymczasowej kwerendy i otwij staw rekordów na podstawie tej kwerendy. Następnie zawartość dwóch pól wydrukowana w oknie Instrukcje bezpośrednie. Zauważ, że procedura ta kom z metody OpenRecordset, która jest omówiona w dalszej części tego rozdziału,
Przykład 2.16. J. Tworzenie i uruchamianie kwerendy przekazującej (Przykład 2)
Sub PassThru2()
Dim db As DAO.Database
Dim qdfPass As DAO.QueryDef
Dim rstTemp As DAO.Recordset
On Error GoTo err_PassThru
Set db = CurrentDb
Set qdfPass = db.CreateQueryDef("")
qdfPass.Connect = "ODBC;Database=myDbName;UID=MILL;" _ & "PWD=yearOO;DSN=myDataS"
M anipulowanie bazami danych przy użyciu DAO
q df Pass . SQL = "Select * From dbo.entity" qdfPass.ReturnsRecords = True qdfPass.MaxRecords = 15
Set rstTemp = qdfPass.OpenRecordset()
i ' wydrukuj dane z dwóch pól w oknie Instrukcje bezpośrednie With rstTemp
Do While Not .EOF
Debug.Print , .Fields("entity_id"), .Fields("entity__name")
. MoveNext Loop .Close End With SendKeys ll/sg" i Exit Sub err.PassThru:
MsgBox Err.Number & ":" & Err.Description
Exit Sub End Sub
Wykonywanie innych czynności za pomocą kwerend
Teraz, gdy wiesz już jak można programatycznie utworzyć i uruchomić różne rodzaje kwerend, czas zobaczyć, w jaki sposób używa się Visual Basic do wykonania innych czynności związanych z kwerendami, takich jak uzyskiwanie wykazu kwerend znajdujących się w danej bazie danych, sporządzanie wykazu właściwości, które te kwerendy posiadają, czy też sortowanie danych w kwerendach.
281
Pobieranie właściwości kwerendy
■ Tak jak tabele i inne obiekty bazy danych, kwerendy obdarzone są właściwościami. Aby otrzymać wykaz właściwości dla konkretnej kwerendy, skorzystaj z pętli śjor Each...Next, która pozwala na zbadanie zawartości zbioru Properties obiektu . Demonstruje to procedura w przykładzie 2.18.A.
Przykład 2.18.A. Sporządzanie wykazu właściwości kwerendy
private Sub cmdPodajQueryProperties_Click() Dim db As DAO.Database
282
Programowanie w Access!
Dim prp As DAO.Property
On Error Resume Next
Set db = OpenDatabase("C:\Program FilesXMicrosoft Office\PL\"
"Office\Samples\Northwind.mdb") For Each prp In db.QueryDefs("Faktury").Properties
Debug.Print prp.Name & "= " & prp Value Next prp End Sub
SfrmDAO Przyk4: Formulae
Rodzaje kwerend Więcej na temat kwerend
C zy kweredę można uaktualnić?
Więcej
o kwerendach
Sporządź wykaz i ści kwereridjf!
U suń kwerendę z bazy danych
B
Sporządź wykaz
wszystkich kwerend
w bazie danych
Posortuj dane w kwerendzie
R ysunek 2.18. Programowanie innych czynności odnoszących się do kwerend
Poniżej podane są niektóre z właściwości, które procedura perties_ciick (w przykładzie powyżej) umieściła w oknie Instrukcje bezpośn
Sporządzanie wykazu kwerend w bazie danych
Korzystając ze struktury pętli For...Each możesz uzyskać wykaz wszystkich! rend zachowanych w bazie danych. Procedura w przykładzie 2.18.B wpisuje i wszystkich kwerend w bazie danych Northwind do okna Instrukcje bezpośij Przed uruchomieniem tej procedury zmodyfikuj ścieżkę dostępu do plika
Manipulowanie bazami danych przy użyciu DAO
283
t hwind.mdb, tak aby wskazywała ona poprawne miejsce przechowywania tego pliku na twoim komputerze.
Przykład 2.18.B. Wyszczególnianie nazw kwerend w bazie danych
Private Sub cmdWykazKwerend_Click() Dim db As DAO.Database Dim qdf As DAO.QueryDef
Set db = OpenDatabase("C:\Program Files\Microsoft Office\PL\" & _ "Office\Samples\Northwind.mdb")
For Each qdf In db.QueryDefs
Debug.Print qdf.Name Next qdf End Sub
Otwórz okno Instrukcje bezpośrednie, aby sprawdzić wykaz kwerend sporządzony przez procedurę cmdwykazKwerend_ciick przedstawioną powyżej.
feortowanie danych w kwerendzie
\ Jak wiesz, w widoku Projektuj możesz określić porządek rekordów I ^kwerendzie, korzystając z pola Sortuj w kolumnie zawierającej pole, na podstawie i którego chcesz dokonać operacji sortowania. Procedura w przykładzie 2.18. C demon-1 stroje, w jaki sposób można utworzyć kwerendę wybierającą, która zwraca rekordy ■jtabeli tblKlienci posortowane według nazwiska klienta. Metoda CreateQueryDef Łorzy obiekt QueryDef i przypisuje mu nazwę, pod którą obiekt ten będzie zachowa-1 w na dysku:
fet qdf = db.CreateQueryDef("qryKlienciPosortowani") Następnie ustawiona jest właściwość SQL obiektu QueryDef:
jf.SQL = "SELECT * FROM tblKlienci ORDER BY NazwaKlienta"
Zwróć uwagę, że porządek sortowania określa klauzula order by. Po niej należy dać nazwę pola (lub kilku pól) według którego należy posortować rekordy. Kwerendę należy zamknąć, korzystając z następującej instrukcji:
284
Programowanie w A
qdf.Close
Uruchom procedurę cmdPosortujDane_ciick() w przykładzie 2.18.C. nij okno bazy danych i otwórz kwerendę qryKlieiciPosortowani, aby porządek sortowania. Jeżeli w oknie bazy danych nie ma danej kwerendy w kwerend, naciśnij klawisz F5, aby je odświeżyć.
Przykład 2.18.C. Sortowanie danych w kwerendzie
Private Sub cmdPosortujDane_Click() Dim qdf As DAO.QueryDef
On Error GoTo Obsługa_Błędu
Set qdf = CurrentDb.CreateQueryDef ( "qryKlienciPosortowani'l qdf .SQL = "SELECT * FROM tblKlienci ORDER BY NazwaKlienta1 qdf.Close Exit Sub Obsługa_Błędu:
If Err.Number = 3012 Then
CurrentDb.QueryDefs.Delete "qryKlienciPosortowani" Resume 0 Else
MsgBox Err.Number & ": " & Err.Description End If End Sub
Usuwanie kwerendy z bazy danych
Aby usunąć obiekt QueryDef ze zbioru QueryOefs, skorzystaj z metody i według wzoru w przykładzie 2.18.D. Procedura cmdJsuńKwerende_ciick usuwaj rendę, która została utworzona przez procedurę w przykładzie 2.16.A.
Przykład 2.18.D. Wymazywanie kwerendy z bazy danych
Private Sub cmdUsuńKwerendę_Click() Dim db As DAO.Database Dim qdf As DAO.QueryDef
S et db = OpenDatabase("C:\Program Files\Microsoft Office\PL\" & _
"Office\Samples\Northwind.mdb") (Jb.QueryDefs .Delete "mojaKwerenda" db.Close Exit Sub )bsługa_Błędu:
MsgBox Err.Number & " : " & Err.Description
ind Sub
1 Aktualizowanie kwerend
Jeżeli daną kwerendę można uaktualizować, oznacza to, że możesz zmodyfiko-Itać wartości w otrzymanym zestawie rekordów i twoje zmiany będą automatycznie uwzględnione w tabelach źródłowych. Wbudowana pomoc w Microsoft Access wymienia sytuacje, w których rezultatów kwerendy nie można aktualizować (zob. rysunek 2.19)- Obiekt QueryDef posiada właściwość o nazwie updatabie, która pozwala określić czy daną kwerendę można aktualizować. Procedura w przykładzie 2.18.E sprawdza, czy można zmodyfikować dane w dwóch kwerendach znajdujących się w bazie danych Northwind. Właściwość updatabie zwraca True (Prawda) dla kwe-tfudy o nazwie Faktury, oraz False (Fałsz) dla kwerendy order subtotals. Każda fctych kwerend zostaje otwarta za pomocą metody openRecordset.
Przykład 2.18.E. Sprawdzanie czy kwerendę można zmodyfikować
p rivate Sub cmdUpdatable_Click() Dim db As DAO.Database Dim rst As DAO.Recordset
Set db = OpenDatabase("C:\Program FilesXMicrosoft Office\PL\" &
"Office\Samples\Northwind.mdb") Set rst = db.OpenRecordset("Zamówienia kwartalne wg produktów")
Debug.Print rst.Updatabie
Set rst = db.OpenRecordset("Faktury")
Debug.Print rst .Updatabie
End Sub
286
Programowanie
K iedy można aktualizować dane w kwerendzie?
Aby zmienić dane w tabeli podstawowej, w niektórych przypadkach można edytowaćdan w widoku "Arkusz danych" kwerendy, w innych zas' nie. W poniższej tabeli podano przypadki, w których wyniki kwerendy mogą być aktualizowane, W przypadku, jeślije niemożliwe, w tabeli podano również rozwiązania alternatywne.
Kwerenda lub pole kwerendy Możliwość aktuali; acji Rozwiązanie
Tak
Kwerenda utworzona na podstawie jednej tabeli
Tak
Kwerenda utworzona na podstawie tabel znajdujących się w relacji jeden-do-jednego
Zazwyczaj
Aby uzyskać więcej informacji na ten temat,! należy kliknąć^l,
Mimo, że nie można bezpośrednio aktualizować danych w i kwerendzie, można aktualizować dane w formularzu lub na stroni! dostępu do danych utworzonej na podstattij kwerendy, jeśli jej właściwość Typ zestawi rekordów ma ustawieni! Dynamiczny (Niespójne aktualizacje),
Kwerenda utworzona na podstawie tabel znajdujących się w relacji jeden-do-wielu
Nie
Kwerenda utworzona na podstawie trzech lub więcej tabel znajdujących się w relacji wiele-do-jednego-do wielu,
Kwerenda krzyżowa Kwerenda przekazująca SQL
Kwerenda obliczająca sumy, średnie, podliczenia i
Nie Nie Nie
Za pomocą funkcji aareauiacei domeny w
Rysunek 2.19. Nie wszystkie rekordy zwrócone przez kwerendę można uaktualizować
Wyszukiwanie i pobieranie rekordów
Aby móc pracować z rekordami bazy danych, należy najpierw zapoznać j z obiektem Recordset. W DAO rozróżnia się trzy typy obiektu Recordset: Tai Dynaset oraz Snapshot. Każdy z tych obiektów posiada inną funkcjonalność ( tabela 2.4). Liczne procedury w tym zagadnieniu pokazują, w jaki sposób korzystaj z obiektu Recordset oraz jego metod. Ogólnie mówiąc, obiekt Recordset jesj wany do manipulowania danymi pochodzącymi z jednej lub więcej tabel lub b, Każda kolumna w obiekcie Recordset reprezentuje pole, a każdy wiersz reprezi
Manipu
jowanie
bazami danych przy użyciu
DAO
287
j eden rekord. Obiekt Recordset jest obiektem tymczasowym. Oznacza to, że obiektu jego nie zachowywuje się w bazie danych. Wszystkie obiekty Recordset przestają istnieć po zakończeniu wykonania danej procedury. Wszystkie otwarte obiekty Recordset są przechowywane w zbiorze Recordset. Obiekt Recordset tworzy się za
pomocą metody OpenRecordset.
|
"abela 2.4. Typy obiektu Recordset w DAO |
|
Typ obiektu Recordset |
Zastosowanie obiektu |
|
■ |
Table |
Stosowany do pobierania rekordów przechowywanych w rodzimej w tabeli bazy danych Microsoft Access (plik .mdb). Zestawy rekordów typu Table umożliwiają pobieranie, dodawanie, uaktualnianie i usuwanie danych w tabeli. |
Dynaset |
Stosowany do pobierania rekordów przechowywanych w rodzimej tabeli bazy danych Microsoft Access (plik .mdb), oraz rekordów znajdujących się w tabelach połączonych. Zestawy Dynasets, umożliwiają pobieranie, dodawanie, aktualizację oraz usuwanie rekordów z jednej lub więcej tabel. |
|
Snapshot |
Stosowany do pobierania rekordów w rodzimej tabeli bazy danych Microsoft Access (plik .mdb) oraz z tabeli połączonej albo kwerendy. Zestawy typu snapshot posiadają kopię rekordów w RAM i nie dają bezpośredniego dostępu do danych. Używane są tylko do odczytu danych - nie można ich stosować w celu dodawania, aktualizacji lub usuwania rekordów. Specjalny typ snapshot, określany terminem Forward-Only (tylko do przodu), umożliwia najszybszy dostęp do danych. |
Aby wyszukać i odczytać zawartość rekordów, należy poznać zasady poruszania się w danym zestawie rekordów. Po otwarciu obiektu Recordset, pierwszy rekord staje się rekordem bieżącym. Każdy Recordset posiada bieżący rekord. Aby przesu-nać się do następnych rekordów, należy skorzystać z metody MoveNext. Aby wrócić jo poprzedniego rekordu, skorzystaj z metody MovePrevious. Metody MoveFirst oiazMoveLast przesuną kursor do pierwszego rekordu (MoveFirst) i do ostatniego rekordu (MoveLast). Jeżeli skorzystasz z metody MoveNext, kiedy kursor wskazuje już ostatni rekord, to kursor przesunie się z ostatniego rekordu do obszaru zwanego końcem pliku (EOF - skrót od END OF FILE) i właściwość eof zostanie ustawiona na True (Prawda). Jeżeli użyjesz metody MoveNext, gdy ustawieniem właściwości eof
288
Programowanie w Acci
jest wartość logiczna True, to spowodujesz błąd, gdyż nie można przsunąć się« koniec pliku. Podobnie, korzystając z metody MovePrevious, gdy kursor wskd pierwszy rekord, przesuniesz kursor do obszaru zwanego początkiem pliku (BOfl skrót od Beginning of File). Czynność ta spowoduje ustawienie właściwości bofj True (Prawda). Jeżeli użyjesz metody MovePrevious, gdy ustawieniem właściwa bof jest wartość logiczna True, to spowodujesz błąd, gdyż nie można przesunąć* poza początek pliku. W kolejnych zagadnieniach tego rozdziału znajdziesz im przykładów poruszania się między rekordami.
Poruszając się w danym zestawie rekordów, przyda się niekiedy zaznaczyć okl ślony rekord, aby móc do niego wrócić później. Możesz w tym celu skorzvjj z właściwości Bookmark. W dalszej części tego rozdziału dowiesz się jeszcze, wl sposób korzystać z innych metod nawigacji, aby szybko odnaleźć określony ręki lub zestaw rekordów.
m frmDAO PrzykS: Formularz
OdszuM/Prjec2ytaj rekordy j Manipulowanie rekordami ]
O twórz/zamknij
zestawy rekordów
(Table, Dynaset, Snapshot)
Wyszukiwanie
i
czytanie rekordów
, Poruszaj się między
|D
I rekordami
L—* tabeli
Zwróć liczbę ;|jwszystkich rekordowi w tabeli !
O twórz Snapshot
i zwróć liczbę znajdujących się w nim rekordów
Znajdź rekord w zestawie rekordów typu Table
O dczytaj dane z określonego pola
Znajd;: rekord
w zestawie rekordów Dynaset lub Snapshot
Znajdź >ty rekord
R ysunek 2.20. Wyszukiwanie i odczytywnie zawartości rekordów przy użyciu DAO
izdzifl
Obiekt
Recordset
posiada
szereg właściwości
oraz metod. W tym rozda omówimy
tylko te właściwości i metody obiektu Recordset,
które są
wymagane wykonania
zadań ilustrowanych w przykładowych procedurach.
Malowanie bazami danych przy użyciu DAO
289
i EOF
K„„iec pliku. Pozwaia „a określenie, ezy aktualny rekord znajduje sie poza osta,-nim rekordem zbioru rekordów.
P oczątek pliku. Zwraca wartość True, jeśli aktualny rekord znajduje się przed pierwszym rekordem zbioru.
„granie i zamykanie r6żnyeh typów obiektu Recordset
I
L Na przykład, aby Otworzyć Recordset typu Table, 'korzystaj z następującej instrukcji:
trst _ ^rentDb.OpenRecordsetUtblKlienci", dbOpenTable)
dbOpenTable |
Otwiera Recordset typu Table. |
abOpenDynaset |
Otwiera Recordset typu Dynaset. |
dbOpenSnapshot
|
Otwiera Recordset typu Snapshot. |
Jeżeli nie podasz typu obiektu Recordset, to utworzony zostanie zestaw recor-I dów typu Table, oparty na tabeli tbiKiienci. Recordset typu Table reprezentuje rekordy znajdujące się w jednej tabeli bazy danych.
Metoda openRecordset umożliwia otwarcie nowego zestawu rekordów (Recordset) w celu przeczytania ich zawartości, dodania nowych rekordów, aktualizacji istniejących rekordów lub usunięcia rekordów z bazy danych. Metodę OpenRecordset można również użyć w odniesieniu do kwerendy. Trzeba jednak pamiętać, że kwerendę można tylko otworzyć, korzystając z obiektu Recordset typu Dynaset lub snapshot. Na przykład, aby otworzyć zestaw rekordów oparty na kwerendzie, możesz zastosować następujące instrukcje:
I „im db As DAO.Database Lrst As DAO.Recordset
290
Programowanie w Access*
s et db = CurrentDbO
Set rst = db.OpenRecordsetI
"qryMojaKwerenda", dbOpenSnapshot)
Procedura w przykładzie 2.20.A demonstruje, w jaki sposób można ot\ różne typy obiektu Recordset na podstawie tabeli tblKlienci i zwrócić liczbę! dujących się rekordów. Aby otrzymać prawidłową liczbę rekordów w zestawiei dów typu Dynaset lub snapshot, trzeba najpierw skorzystać z metody MoveLai' ra da nam dostęp do wszysktich rekordów. Liczenie rekordów omówione jest I szczegółowo w następnym zagadnieniu.
Przykład 2.20.A. Otwieranie zestawu rekordów na podstawie obiektów Recordset typu Table-, Dynaset- oraz Snapshot
Private Sub cmd3Rst_Click()
Dim tblRst As DAO.Recordset
Dim dynaRst As DAO.Recordset
Dim snapRst As DAO.Recordset
Set tblRst = CurrentDb.OpenRecordset ("tblKlienci" , dbOpenTable)]
Debug.Print "# rekordów w tabeli: " & tblRst.RecordCount
Set dynaRst = CurrentDb.OpenRecordset("tblKlienci", dbOpenD Debug. Print "# rekordów w zestawie Dynć.set: "
& dynaRst.RecordCount dynaRs t.MoveLas t Debug.Print "# rekordów wzestawie Dynaset: "
& dynaRst.RecordCount
Set snapRst = CurrentDb.OpenRecordset('tblKlienci",
dbOpenSnapshot) Debug.Print "# rekordów w zestawie Snapshot: "
& snapRst.RecordCount snapRst.MoveLast Debug.Print "# rekordów w zestawie Snapshot: "
& snapRst.RecordCount
tblRst.Close dynaRst.Close snapRst.Close SendKeys '""g" End Sub
Manipulowanie bazami danych przy użyciu DAO 291
Otwieranie zestawu rekordów typu Snapshot oraz liczenie rekordów
Jeżeli chcesz przeszukiwać tabele lub kwerendy, to uzyskasz najszybsze rezultaty otwierając obiekt Recordset typu snapshot, snapshot jest zestawem rekordów, którego nie można uaktualizować. Zestaw ten zawiera pola z jednej lub więcej tabel lub | kwerend. Obiekty Recordset typu snapshot mogą być tylko używane do pobierania danych. Użyj metody OpenRecordset, aby utworzyć lub otworzyć Recordset. Na przykład, aby otworzyć Recordset typu snapshot na podstawie tabeli tblKiienci, skorzystaj z następującej instrukcji:
jet rst = CurrentDb.OpenRecordset("tblKiienci", dbOpenSnapshot)
Czasami będziesz chciał wiedzieć, w którym miejscu znajduje się kursor wdanym zestawie rekordów. Istnieją dwie właściwości, których można użyć do określenia pozycji w danym Recordset. Właściwość AbsolutePosition pozwala określić pozycję aktualnego rekordu względem początku pliku. Właściowość ta umożliwia również określenie bieżącego rekordu. Zero (0) odnosi się do pierwszego rekordu wdanym zestawie rekordów. Jeżeli nie ma bieżącego rekordu, to właściwość AbsolutePosition zwraca -1. Ponieważ jednak pozycja rekordu ulega zmianie po usunięciu poprzednich rekordów, trzeba raczej korzystać z zakładek (Bookmarks), aby ustawić bieżący rekord. Właściwość AbsolutePosition można tylko używać z obiektem Recordset typu Dynasets lub snapshot. Ponieważ liczenie zaczyna się od zera, aby wyświetlić numer bieżącego rekordu, należy dodać jeden do wartości zwróconej przez
właściwość AbsolutePosition:
"Bieżący rekord: " & rst.AbsolutePosition + 1
HsgBox
Inna właściwość o nazwie PercentPosition pokazuje bieżącą pozycję rekordu względem liczby rekordów, które jak dotąd zostały pobrane. Właściwości Absolute-Position oraz PercentPosition nie zwrócą poprawnych danych, dopóki nie przesuniemy się najpierw na ostatni rekord w zestawie danych, korzystając z metody Move-Last obiektu Recordset.
Procedura w przykładzie 2.20.B próbuje uzyskać całkowitą liczbę rekordów W obiekcie Recordset typu Snapshot przy użyciu właściwości RecordCount. W obiektach Recordset typu Dynaset- oraz Snapshot właściwość RecordCount zwraca ilość pobranych rekordów. Stąd, aby określić poprawną liczbę rekordów wtych zestawach Recordset, należy użyć metody MoveLast, aby pobrać wszystkie rekordy.
292
Programowanie w Accessll Mar
P rzykład 2.20.B. Otwieranie obiektu Recordset typu Snapshot i zwracanie liczby rekord^H 1*0
Private Sub cmdOtwórzSnapshot__Click() Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset (" tblKlienci" , dbOpenSnapshot) 1 MsgBox "Bieżący rekord: " & rst.AbsolutePosition + 1 MsgBox "Liczba rekordów przed przesunięciem: " & rst .RecordCountl rst.MoveLast
MsgBox "Bieżący rekord: " & rst.AbsolutePosition + 1 MsgBox "Liczba rekordów po przesunięciu: " & rst.RecordCount rst.Close
End Sub
Czytanie zawartości określonego pola w tabeli
Aby przeczytać zawartość jakiegokolwiek pola, utwórz obiekt Recordsetl podstawie żądanej tabeli lub kwerendy. Następnie użyj struktury pętli, aby wydrai wać zawartość danego pola dla każdego rekordu do okna Instrukcje bezpośredni] Procedura w przykładzie 2.20.C generuje wykaz wszystkich klientów w tabeli J Klienci. Nazwy klientów pobrane są, zaczynając od ostatniego rekordu (zobaczim cie metody MoveLast). Właściwość BOF obiektu Reccrdset określa, kiedy dotarliśj do początku obiektu Recordsei. Ostatnia instrukcja w tej procedurze (sen*J "~g") uaktywnia okno Instrukcje bezpośrednie, aby użytkownik mógł spraw rezultat tej procedury.
Przykład 2.20.C. Pobieranie wartości pól
Private Sub cmdPrzeczytajOdKońca_Click()
Dim db As DAO.Database
Dim rst As DAO.Recordset
Set db = CurrentDb
Set rst = db.OpenRecordset("tblKlienci", dbOpenTable)
rst.MoveLast
Do Until rst.BOF
Debug.Print rstINazwaKlienta rst.MovePrevious
Loop
SendKeys "~g" End Sub
Manipulowanie bazami danych przy użyciu DAO
293
p oruszanie się między rekordami tabeli
Wszystkie obiekty Recordset posiadają bieżącą pozycję i bieżący rekord. Bieżą-! cym rekordem jest z reguły rekord znajdujący się w bieżącej pozycji. Jednakże bieżąca pozycja może znajdować się przed pierwszym rekordem lub po ostatnim rekordzie. Aby zmienić bieżącą pozycję, możesz skorzystać z następujących metod:
I UoveFirst
w
UoveLast
Przesunięcie do pierwszego rekordu.
Przesunięcie do ostatniego rekordu.
'
}
HoveNext
Przesunięcie do następnego rekordu.
M ovePrevious
Przesunięcie do poprzedniego rekordu.
H ove n
Przesunięcie do przodu lub do tyłu o określoną liczbę pozycji. Wstaw w miejscu n liczbę dodatnią lub ujemną.
P rzykład 2.20.D. Poruszanie się między rekordami tabeli
Private Sub cmdNawigacja_Click() Dim db As DAO.Database Dim tblRst As DAO.Recordset Dim dynaRst As DAO.Recordset Set db = CurrentDb
Set tblRst = db.OpenRecordset("tblKlienci") tblRst.Index = "NazwaKlienta" tblRst .MoveFirst
Do While Not tblRst.EOF Debug.Print "Klient: tblRst.MoveNext
Loop
& tblRstLNazwaKlienta
Set dynaRst = db.OpenRecordset("tblKlienci", dbOpenDynaset)
dynaRst. MoveFirst
Do While Not tblRst.EOF
Debug.Print "Witaj" & tblRst!NazwaKlienta
tblRst.MoveNext
294
Programowanie w Access]
L oop
tblRst.Close dynaRst.Close SendKeys "~g" End Sub
Liczenie rekordów w zestawie Recordset
Właściwość Recordcount obiektu Recordset: zwraca liczbę pobranych tt dów. Recordcount jest równy zero (0), jeżeli dany Recordset nie zawiera ż rekordów, lub równy jeden (1), jeżeli dany Recoidset zawiera przynajmniej je rekord. Jeżeli otworzysz Recordset typu Table (zobacz procedurę wprzyktai 2.20.E) i sprawdzisz właściwość Recordcount, to uzyskasz całkowitą liczbę rekorfj znajdujących się wdanej tabeli. Jednakże, jeżeli otworzysz Recordset typuDyJ
lub Snapshot, to właściwość Recordcount zwróci jeden (1), wskazując, Że Records zawiera jakieś rekordy. Aby dowiedzieć się ile rekordów znajduje się w danym zel wie Dynaset lub snapshot, należy użyć metody MoveLast przed odczytaniem* ściwości Recordcount. Liczba rekordów będzie prawidłowa dopiero po odwiedzę! wszystkich rekordów w danym zestawie przy użyciu metody MoveLast (zobaczpj cedurę cmd3Rst_ciick w przykładzie 2.20.A wcześniej w tym rozdziale).
Przykład 2.20.E. Pobieranie liczby rekordów w obiekcie Recordset typu Table
Private Sub cmdLiczRekordyWTabeli_Click() Dim db As DAO.Database Dim rst As DAO.Recordset
Set db = CurrentDb Set rst = db.OpenRecordset("tblKlienci', dbOpenTable) MsgBox "Liczba rekordów w tabeli: " & ::st.Recordcount End Sub
Wyszukiwanie rekordów w obiekcie Recordset typu Table
Podczas gdy metody Move są pożyteczne przy poruszaniu się pomiędzy rekoJ mi danego Recordset, aby wyszukać konkretne rekordy w danym zestawie rekoij należy skorzystać z metod seek lub Find. Jeżeli wiesz dokładnie, który rekord chJ odszukać w danym zestawie Recordset typu Table, i przeszukiwane pole jest indj
Manipulowanie bazami danych przy użyciu DAO
295
s owane, to najszybszym sposobem odnalezienia tego rekordu jest zastosowanie metody Seek. Trzeba jednak pamiętać, że możliwość zastosowania metody seek wiąże się z posiadaniem indeksu przez daną tabelę.
Przed użyciem metody seek, należy ustawić właściwość index. Jeżeli spróbujesz użyć metody seek w zestawie Recordset typu Table bez uprzedniego określenia bielącego indeksu, to zajdzie błąd podczas odtwarzania procedury. Metoda seek przeszukuje zestaw rekordów i odnajduje pierwszy rekord, który spełnia dany warunek. Po wyszukaniu rekordu, rekord ten staje się bieżącym rekordem i ustawienie właściwości NoMatch jest zmienione na False (Fałsz). Jeżeli rekordu nie znaleziono, to właściwość NoMatch jest True, i bieżący rekord jest niezdefiniowany.
Z metodą seek można użyć następujących operatorów porównania:
Znajduje pierwszy rekord, którego indeksowane pole równe jest podanej wartości.
Z najduje pierwszy rekord, którego indeksowane pole jest większe lub równe podanej wartości.
Z najduje pierwszy rekord, którego indeksowane pole jest większe od podanej wartości.
, <=
Znajduje pierwszy rekord, którego indeksowane pole jest mniejsze lub równe podanej wartości.
Z najduje pierwszy rekord, którego indeksowane pole jest mniejsze od podanej wartości.
O perator porównania użyty z metodą Seek należy podać w cudzysłowie. Jeżeli kilka rekordów spełnia kryterium poszukiwania, metoda Seek zwraca tylko pierwszy rekord. Metody seek nie można użyć do poszukiwania rekordów w tabeli połączonej. Aby znaleźć określone rekordy w tabelach połączonych lub obiektach Recordset typu Dynaset oraz snapshot, należy skorzystać z metod Find omówionych w następnym zagadnieniu.
Przykład 2.20.F. Wyszukiwanie rekordów w obiekcie Recordest typu Table
I private Sub cmdWyszukajRekord_Click() Dim db As DAO.Database
296
Programowanie w Aci
D im tblRst As DAO.Recordset
Set db = CurrentDb
Set tblRst = db.OpenRecordset("tblKlienci", dbOpenTable) 1 odszukaj pierwszego klienta w tabeli, którego nazwa ' zaczyna się na "Ka" tblRst.Index = "NazwaKlienta" tblRst.Seek ">=", "Ka" If Not tblRst.NoMatch Then
MsgBox "Znaleziono następującego klienta: "
& tblRst!NazwaKlienta Else
MsgBox "Nie ma klienta o takiej nazwie." End If
tblRst.Close db.Close End Sub
Wyszukiwanie rekordów w obiektach Recordset typu Dynaset oraz Snapshot
Skorzystaj z metod Find, aby odszukać dany rekord w zestawie rekordowi set lub snapshot. Metody Find podane są poniżej:
FindFirst |
1 |
FindNext |
Znajduje następny rekord, który spełnia podane kryterium, zaczynał od bieżącego rekordu. |
FindPrevious |
Znajduje poprzedni rekord, który spełnia podane kryterium, zaczynaj™ od beżącego rekordu. |
FindLast |
1 |
Jeżeli rekordu spełniającego podane kryterium nie można odnaleźć, to i niem właściwości NoMatch jest True (Prawda). Przed przystąpieniem do poszu rekordów ustaw zakładkę na bieżącym rekordzie. Jeżeli poszukiwanie się niej dzie, będzie można użyć zakładki po to, aby wrócić do bieżącego
Manipulowanie bazami danych przy użyciu DAO
297
W przeciwnym razie otrzymasz komunikat błędu „No current record." (Nie znaleziono bieżącego rekordu). Każdy rekord w zestawie Recordset posiada unikatową zakładkę (bookmark). Zakładka pozwala zlokalizować dany rekord. Aby zwrócić zakładkę bieżącego rekordu, przesuń kursor do tego rekordu i przypisz wartość właściwości Bookmark obiektu Recordset zmiennej obiektowej, według wzoru poniżej:
Dim mySpot As Variant mySpot = dynaRst .Bookmark
W procedurze pokazanej w przykładzie 2.20.G, ustawiono zakładkę na pierwszym rekordzie w zestawie Dynaset. Procedura następnie przystępuje do poszukiwania firm, których nazwy zawierają ciąg znaków "Sp." Nazwy firm, które spełniają kryterium poszukiwania są umieszczone w oknie Instrukcje bezpośrednie. Następnie, procedura wraca do zaznaczonego rekordu przypisując właściwości Bookmark wartość przechowywaną w zmiennej obiektowej:
dynaRst. Bookmark = mojeMiejsce
Ponieważ nie wszystkie zewnętrzne bazy danych obsługują zakładki, aby dowiedzieć się, czy dany obiekt Recordset posiada właściwość Bookmark, należy sprawdzić właściwość o nazwie Bookmarkabie. Zakładki można stosować, jeżeli właściwość Bookmarkable jest True:
If dynaRst .Bookmarkabie Then mojeMiejsce = dynaRst .Bookmark
End If
Jeżeli dany obiekt Recordset nie obsługuje zakładek, pojawi się błąd. Jeżeli obiekt obsługuje zakładki, to można ustawić ich dowolną ilość. Zakładki można utwo-izyć dla dowolnego rekordu, przesuwając kursor do danego rekordu i przypisując wartość właściwości Bookmark do zmiennej typu string, która identyfikuje ten rekord.
Przykład 2.20.G. Wyszukiwanie rekordów w Dynaset
■ private Sub cmdZnajdźRekordWDynaset_Click () Dim db As DAO.Database Dim dynaRst As DAO.Recordset Dim mojeMiejsce As Variant
298
Programowanie w Access 21
S et db = CurrentDb
Set dynaRst = db.OpenRecordset("tblKlienci", dbOpenDynaset)
MsgBox "Bieżący klient: " & dynaRstINazwaKlienta
mojeMiejsce = dynaRst.Bookmark
1 wyszukaj kientów, których nazwy zaczynają się na litery "Sp,"
dynaRst.FindFirst "NazwaKlienta Like '*Sp.*'"
Do While Not dynaRst.NoMatch
Debug.Print dynaRstINazwaKlienta
dynaRst.FindNext "NazwaKlienta Liks '*Sp.*'
Loop
dynaRst.Bookmark = mojeMiejsce
MsgBox "Zpowrotem do rekordu: " & dyna^stINazwaKlienta dynaRst.Close SendKeys "~g" End Sub
Wyszukiwanie n-tego rekordu w Dynaset lub Snapshot
Procedura w przykładzie 2.20. H demonstruje, w jaki sposób można odnaJ ty rekord w zestawie rekordów typu snapshot. Zauważ, że natychmiast po otwaj obiektu Recordset zastosowana jest metoda MoveLast. Metoda ta gwarantuje,! wszystkie recordy zostały pobrane. Całkowita liczba rekordów jest następnie umiej czona w zmiennej sumaRec. Następnie metoda MoveFirst wraca do pierwszego! kordu, podczas gdy metoda inputBox prosi użytkownika o podanie liczby wskazuj cej o ile pozycji należy przesunąć się do przodu. Jeżeli wartość podana przezuj kownika jest mniejsza niż suma wszystkich rekordów w danym zestawie, to km zostanie przesunięty do podanego rekordu i struktura pętli For...Each wydrukuje! zwy pól oraz ich wartości dla wskazanego rekordu w oknie Instrukcje bezpośredj Ponieważ próba przesunięcia się poza koniec obiektu Recordset spowoduje \m procedura wyświetla komunikat, jeżeli liczba pozycji podana przez użytkownikajl większa aniżeli ilość wszystkich rekordów ogółem.
Przykład 2.20.H. Wyszukiwanie n-tego rekordu w Dynaset lub Snapshot
Private Sub cmdZnajdźNtyRekordWSnapshot_Click() Dim rst As DAO.Recordset
Manipulowanie bazami danych przy użyciu DAO
299
D im fid As DAO.Field Dim sumaRec As Integer Dim nty As String
dbOpenSnapshot)
Set rst = CurrentDb.OpenRecordset("tblKlienci rst.MoveLast
sumaRec = rst.RecordCount rst.MoveFirst
& vbCrLf
nty = InputBox("Wpisz liczbę, o którą chcesz & "przesunąć kursor do przodu:") If sumaRec > nty Then rst.Move nty For Each fid In rst.Fields
& fid.Value
Debug.Print fid.Name & " Next fid Else
MsgBox "Trzeba wpisać wartość mniejszą od
& sumaRec & "." End If rst.Close End Sub
P raca z rekordami
Teraz, gdy poznałeś metody przesuwania się w zestawie rekordów, wyszukiwania rekordów oraz odczytywania ich zawartości, czas poznać metody, które pozwalają na dodawanie i modyfikowanie zestawów rekordów typu Table lub Dynaset. Ponieważ zestawy rekordów typu snapshot są statyczne, nie można do nich dodać nowych rekordów ani zmienić lub usunąć istniejących.
Dodawanie nowych rekordów
W interfejsie użytkownika w aplikacji Microsoft Access, przed dodaniem nowego rekordu do tabeli należy najpierw otworzyć odpowiednią tabelę. Programując tą samą czynność, wystarczy otworzyć obiekt Recordset korzystając z metody openRe-cordset. Na przykład następujące polecenia deklarują i otwierają obiekt Recordset woparciu o tabelę o nazwie tblKiienci2:
Dim tblRst As DAO.Recordset
Set tblRst = db.OpenRecordset ("tblKlienci2")
300
Programowanie w Access
BH frmDAO PrzykS: Formularz
Odszukaj/Przeczyta) rekordy Manipulowanie rekordami i
D odaj nowy rekord
Praca
z rekordami
Filtrowanie rekordów przy użyciu klauzuli SQL WHERE
1771 Filtrowanie rekordów 1 - | przy użyciu właściwości Filter
U suń rekord
Praca z rekordami w formularzu przy uży;iu właściwości RecordSetCIone
Z apisz wartości pól w zmiennych
Z apisywanie rekordów w tablicy
Kopiowanie rekordów do arkusza
1 1185 Plus Sp, z o.o. B
1 I7L57 Reklama Sp ; .. o B
:; '.Vi'S.i Sport r.r : o ■ B
4 Maksel Wytwórnia G ilanterii B
R ysunek 2.21. Manipulowanie rekordami przy użyciu DAC)
Po otwarciu obiektu Recordset skorzystaj z metody AddNew, aby utworzyći rekord. Na przykład:
tblRst.AddNew
Następnie można podać wartości wszystkich lub tylko niektórych pól w noi rekordzie. Podanie wartości w danym polu jest konieczne, gdy właściwość (Required) tego pola jest ustawiona na Tak. Jeżeli wpis w danym polu jest wyn to w interfejsie użytkownika w trybie Pro j ektuj tabelę będzie wpis Tak (Yes)o właściwości wymagane (Required). Oto kilka przykładów przypisujących wartości] pól danego rekordu:
tblRst.Fields("NazwaKlienta").Value = "Gosh, Regina" tblRst.FieldsC'TypKlienta").Value = "I"
Zwróć uwagę na to, że value jest właściwością domyślną obiektu Field, \ tego można ją pominąć co też uczyniono w kodzie przykładowej procedury (d
300
Programowanie w Ac
SU frmDAO PrzykS: Formularz
Odszukaj/Przeczytaj rekordy Manipulowanie rekordami
D odaj nowy rekord
!!J U Qe k o rdj
Praca
z rekordami
Filtrowanie rekordów przy użyciu klauzuli SQLWHEF
F iltrowanie rekordów przy użyciu właściwości Fil
U suń rekord
0
Praca z rekordami w formularzu przy użyciu właściwości RecordSetCI
K opiowanie rekordów do arkusza
Z apisz wartości pól w zmiennych
Zapisywanie rekordów w tablicy
! 1135 Phis Sp zot B
2 1787 Reklama Sp. z o.o. B
i JO/l'Li Sport Sp z o u B
4 Maksel Wytwórnią Galanterii B
R ysunek 2.21. Manipulowanie rekordami przy użyciu DAO
Po otwarciu obiektu Recordset skorzj'staj z metody AddNew, aby urwo rekord. Na przykład:
tblRst.AddNew
Następnie można podać wartości wszystkich lub tylko niektórych pól rekordzie. Podanie wartości w danym polu jest konieczne, gdy właściwość (Required) tego pola jest ustawiona na Tak. Jeżeli wpis w danym polu jest to w interfejsie użytkownika w trybie Projektuj tabelę będzie wpis Tak i właściwości wymagane (Required). Oto kilka przykładów przypisujących w pól danego rekordu:
tblRst.Fields("NazwaKlienta").Value = "Gosh, Regina"
tblRst.Fields("TypKlienta").Value = "I"
i
Zwróć uwagę na to, że value jest właściwością domyślną obiektu Fi tego można ją pominąć co też uczyniono w kodzie przykładowej proc<
M anipulowanie bazami danych przy użyciu DAO
2.21.A). Po przypisaniu wartości polom, należy skorzystać z metody updat
obiektu Recordset, aby zachować w pamięci nowo dodany rekord:
Przykład 2.21.A pokazuje, wjaki sposób można dodać nowy rekord do tabeli tbl-Klienci2 i wypełnić niektóre pola tej tabeli wartościami.
Przykład 2.21.A. Dodawanie nowego rekordu do istniejącej tabeli
Private Sub cmdDodajNowyRekord_Click() Dim db As DAO.Database Dim tblRst As DAO.Recordset
Set db = CurrentDb
Set tblRst = db.OpenRecordset("tblKlienci2")
With tblRst .AddNew
.Fields("NazwaKlienta") = "Gosh, Regina" .Fields("TypKlienta") = "I" .Fields("KlientOdRoku") = "1999" .Fields("DataWpisu") = Now() .Fields("IdWpisu") = "JO" .Fields("DataModyfikacji") = Now() .Fields("IDModyfikacji") = "JO" .Update End With
MsgBox tblRst.Fields(1).Value tblRst.Bookmark = tblRst.LastModified MsgBox tblRst.Fields(1).Value tblRst.Close End Sub
W zestawie rekordów typu Table, nowo dodany rekord jest umieszczony wtabeli w kolejności określonej przez indeks. W zestawie rekordów typu Dynaset nowy rekord dodany jest na końcu danego zestawu rekordów. Przy dodawaniu nowego rekordu do tabeli nowy rekord nie staje się automatycznie bieżącym rekordem. Rekord, który był bieżący przed dodaniem nowego rekordu, jest nadal bieżącym rekordem. Innymi słowy, podczas gdy nowy rekord dodawany jest do tabeli, kursor pozo-
302
Programowanie w Access!
s taje na rekordzie, który był wybrany przed dodaniem nowego rekordu. Aby uczy nowo dodany rekord bieżącym rekordem, należy skorzystać z dwóch właściwi Bookmark oraz LastModif ied:
tblRst.Bookmark = tblRst.LastModified
Aby lepiej to zrozumieć, wykonaj następujące czynności:
1.
Otwórz tabelę tblKiienci2 w interfejsie użytkownika i usuń rekord Gosh, który został dodany przez procedurę w przykładzie 2.21.A.
Zamknij tabelę tbiKiienci2.
Zmodyfikuj
procedurę
cmdDodajNowyRekord_ciick w przykładzie 2.21.A i
sując
następujące polecenia poniżej słów kluczowych End
with:
MsgBox tblRst.Fields(1).Value
tblRst.Bookmark = tblRst.LastModified
MsgBox tblRst.Fields(1).Value
4. Uruchom zmodyfikowaną procedurę cmdDodajNowyRekord _ciick.
Modyfikacja rekordów
Aby zmodyfikować istniejący rekord, skorzystaj z metody openRecordset,ls otwiera obiekt Recordset. Następnie odnajdź rekord, który zamierzasz zmo wać. W zestawie rekordów typu Table możesz skorzystać z metody seekorazin tabeli, aby wyszukać rekord, który spełnia dany warunek. W zestawie rekordówt
Dynaset lub Snapshot możesz skorzystać Z metod Find (FindFirst, Fin
Findprevious, FindLast), aby odnaleźć żądany rekord. Nie zapomnij jednak o|] że można modyfikować dane tylko w zestawach rekordów typu Table lub: (zestawy typu snapshot służą tylko do pobierania rekordów). Po odnalezieniu rei skorzystaj z metody Edit obiektu Recordset i pn^ystąp do zmian wartości dokonaniu zmian w danym rekordzie, użyj metody update obiektu Recordset.
Procedura cmdzmodyfikujRekord_ciick w przykładzie 2.2l.B otwiera rekordów typu Table oparty na tabeli tblKlienci2 i zmienia status wszy: klientów z K na A. Następnie procedura odnajduje rekord określonego klienta.! uwagę na to, że właściwość index należy ustawić przed skorzystaniem z metody a w przeszukiwaniu tabeli. Jeżeli powołasz się na indeks, który nie istnieje, wystąpi! wykonania. Po odnalezieniu żądanego rekordu procedura wyświetla nazwę I ta/firmy w polu komunikatu:
3
03
Hfnip^niebazarni
danych przy użyciu
DAO
_
UsgBox rstlNazwaKlienta
Powyższa instrukcja jest skróconą wersją instrukcji podanej poniżej:
„sgBox rst.Fields("NazwaKlienta") -Value
obiektu od nazwy zbioru, którego dany obiekt jest
o rekordu i cienia wartość w polu
rst'.KlientOdRoku = "1998"
Powyższą intrukcję można również zapisać w następujący sposób:
rst.Fie
ieldS
("KlientOdRoku") .Value
metody u„aat.
tylko do odczytu.
Przykład 2.21.B. Modyfikowanie rekordu w tabeli
private Sub cmdZmodyf ikujRekord_Click() Dim db As DAO.Database Dim rst As DAO.Recordset Dim warunek As String
Do While Not rst.EOF With rst .Edit .Fields("Status") =
.Update .MoveNext
"A"
286
Programowanie w Access a
Kiedy
można
aktualizować dane w kwerendzie?
Aby
zmienić
dane w tabeli podstawowej, w niektórych przypadkach można
edytowaćdaj w
widoku "Arkusz danych" kwerendy, w innych zaś nie, W
poniższej tabeli podano przypadki,
w których wyniki kwerendy mogą być aktualizowane, W przypadku,
jeśli je; niemożliwe,
w tabeli podano również rozwiązania alternatywne,
Kwerenda
lub pole kwerendy Możliwość
aktualizacji Rozwiązanie
Tak
Kwerenda
utworzona na podstawie
jednej tabeli
Kwerenda utworzona na podstawie tabel znajdujących się w relacji jeden-do-jednego
Kwerenda utworzona na podstawie tabel znajdujących się w relacji jeden-do-wielu
Kwerenda utworzona na podstawie trzech lub więcej tabel znajdujących się w relacji wiele-do-jednego-do wielu.
Tak
Zazwyczaj
Nie
Aby uzyskać więcej informacji na ten temat,! należy kliknąćiłl,
Mimo, że nie można bezpośrednio aktualizować danych w : kwerendzie, można aktualizować dane w formularzu lub na stronij dostępu do danych utworzonej na podstawij kwerendy, jeśli jej właściwość Typ zestaw rekordów rna ustawień Dynamiczny (Niespójne aktualizacje),
Kwerenda krzyżowa Kwerenda przekazująca SQL
Kwerenda obliczająca sumy, średnie, podliczenia i
Nie Nie Nie
Za pomocą funkcji aareauiacei domenv
Rysunek 2.19. Nie wszystkie rekordy zwrócone przes; kwerendę można uaktualizować
Wyszukiwanie i pobieranie rekordów
Aby móc pracować z rekordami bazy dartych, należy najpierw zapozna z obiektem Recordset. W DAO rozróżnia się trzy typy obiektu Recordset: t Dynaset oraz Snapshot. Każdy z tych obiektów posiada inną funkcjonalność tabela 2.4). Liczne procedury w tym zagadnieniu pokazują, w jaki sposób korzy: z obiektu Recordset oraz jego metod. Ogólnie mówiąc, obiekt Recordset jes wany do manipulowania danymi pochodzącymi z jednej lub więcej tabel lub kw Każda kolumna w obiekcie Recordset reprezentuje pole, a każdy wiersz repre;
I Manipulowanie bazami danych przy użyciu DAO
287
>den rekord Obiekt Recordset jest obiektem tymczasowym. Oznacza to, ze obiektu
Lnie zachowywuje się w bazie danych. Wszystkie obiekty Recordset przestają
1 po zakończeniu wykonania danej procedury. Wszystkie otwarte obiekty Re-
Irdset są przechowywane w zbiorze Recordset. Obiekt Recordset tworzy się za
pomocą metody OpenRecordset.
Tabela 2.4. Typy obiektu Recordset w DAO
Typ obiektu Recordset |
Zastosowanie obiektu |
Table |
Stosowany do pobierania rekordów przechowywanych w rodzimej w tabeli bazy danych Microsoft Access (plik .mdb). Zestawy rekordów typu Table umożliwiają pobieranie, dodawanie, uaktualnianie i usuwanie danych w tabeli. |
Dynaset |
Stosowany do pobierania rekordów przechowywanych w rodzimej tabeli bazy danych Microsoft Access (plik .mdb), oraz rekordów znajdujących się w tabelach połączonych. Zestawy Dynasets, umożliwiają pobieranie, dodawanie, aktualizację oraz usuwanie rekordów z jednej lub więcej tabel. |
Snapshot |
Stosowany do pobierania rekordów w rodzimej tabeli bazy danych Microsoft Access (plik .mdb) oraz z tabeli połączonej albo kwerendy. Zestawy typu Snapshot posiadają kopię rekordów w RAM i nie dają bezpośredniego dostępu do danych. Używane są tylko do odczytu danych - nie można ich stosować w celu dodawania, aktualizacji lub usuwania rekordów. Specjalny typ snapshot, określany terminem Forward-Only (tylko do przodu), umożliwia najszybszy dostęp do danych. |
I Abv wyszukać i odczytać zawartość rekordów, należy poznać zasady poruszania (ie wdanym zestawie rekordów. Po otwarciu obiektu Recordset pierwszy rekord 1 se kordem bieżącym. Każdy Recordset posiada bieżący rekord. Aby przesu-! do następnych rekordów, należy skorzystać z metody MoveNext. Aby wróci Akordu, skorzystaj z metody MovePrevious. Metody MoveFirst kursor do pierwszego rekordu (MoveFirst i do ostamiego . Jeżeli skorzystasz z metody MoveNext, kredy kursor wskazuje rekord, to kursor przesunie się z ostatniego rekordu do obszaru zwanego Piku (EOF - skrót od END OF FILE) i właściwość eof zostanie ustawiona (Prawda). Jeżeli użyjesz metody MoveNext, gdy ustawieniem właściwości eof
288
Programowanie w Access 2[J
jest wartość logiczna True, to spowodujesz błąd, gdyż nie można przsunąć się p J koniec pliku. Podobnie, korzystając z metody MovePrevious, gdy kursor wskazuj pierwszy rekord, przesuniesz kursor do obszaru zwanego początkiem pliku (BOF-I skrót od Beginning of File). Czynność ta spowoduje ustawienie właściwości bofiJ True (Prawda). Jeżeli użyjesz metody MovePrevious, gdy ustawieniem właściwości bof jest wartość logiczna True, to spowodujesz błąd, gdyż nie można przesunąć sit! poza początek pliku. W kolejnych zagadnieniach tego rozdziału znajdziesz wieli przykładów poruszania się między rekordami.
Poruszając się w danym zestawie rekordów, przyda się niekiedy zaznaczyć okre-j ślony rekord, aby móc do niego wrócić później. Możesz w tym celu skorzystać] z właściwości Bookmark. W dalszej części tego rozdziału dowiesz się jeszcze, wjalij sposób korzystać z innych metod nawigacji, aby szybko odnaleźć określony lub zestaw rekordów.
m frmDA0_Prz¥k5: Formularz
Odszukaj/Przeczytaj rekordy Manipulowanie rekordami
O twórz/zamknij
zestawy rekordów
(Table, Dynaset, Snapshot)
Wyszukiwanie
i
czytanie rekordów
. Poruszaj się między
Di rekordami
^J tabeli
Zwróć liczbę 1 |E|iWszystkich rekordów; w tabeli
O twórz Snapshot
i zwróć liczbę znajdujących się w nim rekordów
Znajdź rekord w zestawie rekordów typu Table
Odczytaj dane z określonego pola
IS)
Znajdź rekord
w zestawie rekcirdóyDynaset lub Snapshot
Znajdź n-ty rekord
R ysunek 2.20. Wyszukiwanie i odczytywnie zawartości rekordów przy użyciu DAO
Obiekt Recordset posiada szereg właściwości oraz metod. W tym rozdział omówimy tylko te właściwości i metody obiektu Recordset, które są wymagane ( wykonania zadań ilustrowanych w przykładowych procedurach.
Manipulowanie bazami danych przy użyciu DAO
289
EOF
Koniec pliku. Pozwala na określenie, czy aktualny rekord znajduje sie poza ostat-nim rekordem zbioru rekordów.
B OF
Początek pliku. Zwraca wartość True, jeśli aktualny rekord znajduje się przed pierwszym rekordem zbioru.
teranie i zamykanie różnych typów obiektu Recordset
, aby skorzystaj z następującej instrukcji:
typu
Set
rst -_ currentDb.OpenRecordsetUtblKlienci", dbOpenTable)
dbOpenTable |
Otwiera Recordset typu Table. |
dbOpenDynaset |
Otwiera Recordset typu Dynaset. |
dbOpenSnapshot |
Otwiera Recordset typu Snapshot. |
Jeżeli nie podasz typu obiektu Recordset, to utworzony zostanie zestaw recor-I iów typu Table-, oparty na tabeli tbiKiienci. Recordset typu Table reprezentuje i rekordy znajdujące się w jednej tabeli bazy danych.
Metoda openRecordset umożliwia otwarcie nowego zestawu rekordów (Recordset) w celu przeczytania ich zawartości, dodania nowych rekordów, aktualizacji istniejących rekordów lub usunięcia rekordów z bazy danych. Metodę openRecordset na również użyć w odniesieniu do kwerendy. Trzeba jednak pamiętać, że kweren-I de można tylko otworzyć, korzystając z obiektu Recordset typu Dynaset lub snaps-I tot. Na przykład, aby otworzyć zestaw rekordów oparty na kwerendzie, możesz za-1 stosować następujące instrukcje:
I Dim db As DAO. Database I tin rst As DAO.Recordset
Programowanie w Access M
set db = CurrentDb()
Set rst = db.OpenRecordset("qryMojaKwerenda", dbOpenSnapshot)
Procedura w przykładzie 2.20.A demonstruje, w jaki sposób można otwotl różne typy obiektu Recordset na podstawie tabeli tbiKlienci i zwrócić liczbę znj dujących się rekordów. Aby otrzymać prawidłową liczbę rekordów w zestawie reM dów typu Dynaset lub snapshot, trzeba najpierw skorzystać z metody MoveLast,k| ra da nam dostęp do wszysktich rekordów. Liczenie rekordów omówione jest bardj szczegółowo w następnym zagadnieniu.
Przykład 2.20.A. Otwieranie zestawu rekordów na podstawie obiektów Recordset typu Table-, Dynaset- oraz Snapshot
Private Sub cmd3Rst_Click()
Dim tblRst As DAO.Recordset Dim dynaRst As DAO.Recordset Dim snapRst As DAO.Recordset
Set tblRst = CurrentDb.OpenRecordset("tolKlienci", dbOpenTable) Debug.Print "# rekordów w tabeli: " & tblRst.RecordCount Set dynaRst = CurrentDb.OpenRecordset (" tbiKlienci" , dbOpenDynasetj Debug.Print "# rekordów w zestawie Dynaset: "
& dynaRst.RecordCount dynaRs t.MoveLas t Debug.Print "# rekordów wzestawie Dynaset: "
& dynaRst.RecordCount Set snapRst = CurrentDb.OpenRecordset("tbiKlienci",
dbOpenSnapshot)
Debug.Print
"#
rekordów
w zestawie Snapshot:
"
&
snapRst
.RecordCount -—*""
snapRst.MoveLast
Debug.Print "# rekordów w zestawie Snapshot: "
& snapRst.RecordCount
tblRst.Close dynaRst.Close snapRst.Close SendKeys ""g" End Sub
i«anT~- przy użyciu DAO 291
Otwieranie zestawu rekordów typu Snapshot oraz liczenie rekordów
Jeżeli chcesz przeszukiwać tabele lub kwerendy, to uzyskasz najszybsze rezultaty i otwierając obiekt Recordset typu snapshot, snapshot jest zestawem rekordów, któ-I regonie można uaktualizować. Zestaw ten zawiera pola z jednej lub więcej tabel lub kwerend. Obiekty Recordset typu snapshot mogą być tylko używane do pobierania danych. Użyj metody openRecordset, aby utworzyć lub otworzyć Recordset. Na przykład, aby otworzyć Recordset typu snapshot na podstawie tabeli tbiKiienci, skorzystaj z następującej instrukcji:
Set
rst = CurrentDb.OpenRecordset("tbiKiienci", dbOpenSnapshot)
Czasami będziesz chciał wiedzieć, w którym miejscu znajduje się kursor wdanym zestawie rekordów. Istnieją dwie właściwości, których można użyć do określenia pozycji w danym Recordset. Właściwość AbsolutePosition pozwala określić pozycję aktualnego rekordu względem początku pliku. Właściowość ta umożliwia również określenie bieżącego rekordu. Zero (0) odnosi się do pierwszego rekordu wdanym zestawie rekordów. Jeżeli nie ma bieżącego rekordu, to właściwość AbsolutePosition zwraca -1. Ponieważ jednak pozycja rekordu ulega zmianie po usunięciu poprzednich rekordów, trzeba raczej korzystać z zakładek (Bookmarks), aby ustawić bieżący rekord. Właściwość AbsolutePosition można tylko używać z obiektem Recordset typu Dynasets lub Snapshot. Ponieważ liczenie zaczyna się od zera, aby wyświetlić numer bieżącego rekordu, należy dodać jeden do wartości zwróconej przez
właściwość AbsolutePosition:
rst.AbsolutePosition
MsgBox "Bieżmy rekord:
box "-—• -
tPosition
pokazuje bieżącą
pozycję rekordu
Inna
właściwość o nazwxe
*««^8£
tałypObrane.
Właściwości Absoiute-
wzgl
em liczby
rekordów,
które jak dotądzosta*p ^
przesu.
^:;=^^w^^anych, korzystając z metody __
-;::::^- -« ^ *** tr z
obiekcie Recordset typu Snapshot przy J właściwość RecordCount
rekordy.
Programowanie w Access 201
P rzykład 2.20.B. Otwieranie obiektu Recordset typu Snapshot i zwracanie liczby rekordów
Private Sub cmdOtwórzSnapshot_Click() Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("tblKlienci", dbOpenSnapshot) MsgBox "Bieżący rekord: " & rst.AbsolutePosition + 1 MsgBox "Liczba rekordów przed przesunięciem: " & rst. RecordCoun'
rst.MoveLast
MsgBox "Bieżący rekord: " & rst.AbsolutePosition + 1 MsgBox "Liczba rekordów po przesunięciu: " & rst.RecordCount rst.Close End Sub
Czytanie zawartości określonego pola w tabeli
Aby przeczytać zawartość jakiegokolwiek pola, utwórz obiekt Recordset i
podstawie żądanej tabeli lub kwerendy. Następnie użyj struktury pętli, aby wydrJ
wać zawartość danego pola dla każdego rekordu do okna Instrukcje bezpośredn
Procedura w przykładzie 2.20.C generuje wykaz wszystkich klientów w tabeli tt
Klienci. Nazwy klientów pobrane są, zaczynając od ostatniego rekordu (zobaczu
cie metody MoveLast). Właściwość BOF obiektu Recordset określa, kiedy dotarli
do początku obiektu Recordset. Ostatnia instrukcja w tej procedurze (sendK
"Ag") uaktywnia okno Instrukcje bezpośrednie, aby użytkownik mógł spraw
Przykład 2.20.C. Pobieranie wartości pól
Private Sub cmdPrzeczytajOdKońca_Click() Dim db As DAO.Database Dim rst As DAO.Recordset Set db = CurrentDb Set rst = db.OpenRecordset("tblKlienci", dbOpenTable)
rst.MoveLast
Do Until rst.BOF
Debug.Print rst'.NazwaKlienta
rst.MovePrevious
Loop SendKeys "Ag"
End Sub
rezultat tej procedury.
lipulowanie bazami danych przy użyciu DAO
293
P oruszanie się między rekordami tabeli
Wszystkie obiekty Recordset posiadają bieżącą pozycję i bieżący rekord. Bieżącym rekordem jest z reguły rekord znajdujący się w bieżącej pozycji. Jednakże bieżąca pozycja może znajdować się przed pierwszym rekordem lub po ostatnim rekordzie. Aby zmienić bieżącą pozycję, możesz skorzystać z następujących metod:
MoveFirst |
Przesunięcie do pierwszego rekordu. |
MoveLast |
Przesunięcie do ostatniego rekordu. |
KoveNext |
Przesunięcie do następnego rekordu. |
MovePrevious |
Przesunięcie do poprzedniego rekordu. |
Hove n |
Przesunięcie do przodu lub do tyłu o określoną liczbę pozycji. Wstaw w miejscu n liczbę dodatnią lub ujemną. |
Przykład 2.20.D. Poruszanie się między rekordami tabeli
I
ivate Sub cmdNawigacja_Click () Dim db As DAO.Database Dim tblRst As DAO.Recordset Dim dynaRst As DAO.Recordset Set db = CurrentDb
Set tblRst = db.OpenRecordset("tblKlienci' tblRst. Index = "NazwaKlienta" tblRst.MoveFirst
Do While Not tblRst.EOF Debug.Print "Klient: tblRs t. MoveNext
Loop
& tblRstLNazwaKlienta
Set dynaRst = db.OpenRecordset("tblKlienci", dbOpenDynaset)
dynaRst. MoveFirst
Do While Not tblRst.EOF
Debug.Print "Witaj" & tblRst!NazwaKlienta
tblRst.MoveNext
294
Programowanie w Access 211
L oop
tblRst.Close dynaRst.Close SendKeys "Ag" End Sub
Liczenie rekordów w zestawie Recordset
Właściwość RecordCount obiektu Recordset zwraca liczbę pobranych ręki dów. RecordCount jest równy zero (0), jeżeli dany Recordset nie zawiera żadnyi rekordów, lub równy jeden (1), jeżeli dany Recordset: zawiera przynajmniej ja rekord. Jeżeli otworzysz Recordset typu Table (zobacz procedurę w przykłai 2.20.E) i sprawdzisz właściwość RecordCount, to uzyskasz całkowitą liczbę rekordowi znajdujących się w danej tabeli. Jednakże, jeżeli otworzysz Recordset typu Dynase: lub Snapshot, to właściwość RecordCount zwróci jeden (1), wskazując, Że Recordse;
zawiera jakieś rekordy. Aby dowiedzieć się ile rekordów znajduje się w danym zestal wie Dynaset lub snapshot, należy użyć metody MoveLast przed odczytaniem wlał ściwości RecordCount. Liczba rekordów będzie prawidłowa dopiero po odwiedzeniu! wszystkich rekordów w danym zestawie przy użyciu metody MoveLast (zobacz proJ cedurę cmd3Rst_ciick w przykładzie 2.20.A wcześniej w tym rozdziale).
Przykład 2.20.E. Pobieranie liczby rekordów w obiekcie Recardset typu Table
Private Sub cmdLiczRekordyWTabeli_Click() Dim db As DAO.Database Dim rst As DAO.Recordset
Set db = CurrentDb
Set rst = db.OpenRecordset("tblKlienci", dbOpenTable)
MsgBox "Liczba rekordów w tabeli: " & rst.RecordCount
End Sub
Wyszukiwanie rekordów w obiekcie Recordset typu Table
Podczas gdy metody Move są pożyteczne przy poruszaniu się pomiędzy rekorł mi danego Recordset, aby wyszukać konkretne rekord}' w danym zestawie rekordów! należy skorzystać z metod seek lub Find. Jeżeli wiesz dokładnie, który rekord chcesz! odszukać w danym zestawie Recordset typu Table, i przeszukiwane pole jest indetl
Manipulowanie bazami danych przy użyciu DAO
295
I sowane, to najszybszym sposobem odnalezienia tego rekordu jest zastosowanie meto-I dv seek. Trzeba jednak pamiętać, że możliwość zastosowania metody seek wiąże się I z posiadaniem indeksu przez daną tabelę.
Przed użyciem metody seek, należy ustawić właściwość index. Jeżeli spróbujesz I użyć metody seek w zestawie Recordset typu Table bez uprzedniego określenia bieżącego indeksu, to zajdzie błąd podczas odtwarzania procedury. Metoda seek przeszukuje zestaw rekordów i odnajduje pierwszy rekord, który spełnia dany warunek. Po wyszukaniu rekordu, rekord ten staje się bieżącym rekordem i ustawienie właściwości Match jest zmienione na False (Fałsz). Jeżeli rekordu nie znaleziono, to właściwość NoMatch jest True, i bieżący rekord jest niezdefiniowany.
Z metodą Seek można użyć następujących operatorów porównania:
Z najduje pierwszy rekord, którego indeksowane pole równe jest podanej wartości.
Znajduje pierwszy rekord, którego indeksowane pole jest większe lub równe podanej wartości.
Z najduje pierwszy rekord, którego indeksowane pole jest większe od podanej wartości.
„ <=
Znajduje pierwszy rekord, którego indeksowane pole jest mniejsze lub równe podanej wartości.
Znajduje pierwszy rekord, którego indeksowane pole jest mniejsze od podanej wartości.
O perator porównania użyty z metodą seek należy podać w cudzysłowie. Jeżeli kilka rekordów spełnia kryterium poszukiwania, metoda seek zwraca tylko pierwszy rekord. Metody seek nie można użyć do poszukiwania rekordów w tabeli połączonej. Aby znaleźć określone rekordy w tabelach połączonych lub obiektach Recordset typu Dynaset oraz Snapshot, należy skorzystać z metod Find omówionych w następnym zagadnieniu.
Przykład 2.20.F. Wyszukiwanie rekordów w obiekcie Recordest typu Table
■ private Sub cmdWyszukajRekord_Click( ] Dim db As DAO.Database
296
Programowanie w Access 1<Ę
Dim tblRst As DAO.Recordset
Set db = CurrentDb Set tblRst = db.OpenRecordset("tblKlienci', dbOpenTable) 1 odszukaj pierwszego klienta w tabeli, którego nazwa ' zaczyna się na "Ka" tblRst.Index = "NazwaKlienta" tblRst.Seek ">=", "Ka" If Not tblRst.NoMatch Then
MsgBox "Znaleziono następującego klienta: "
& tblRstSNazwaKlienta Else
MsgBox "Nie ma klienta o takiej r.azwie." End If tblRst.Close db.Close End Sub
Wyszukiwanie rekordów w obiektach Recordset typu Dynaset oraz Snapshot
Skorzystaj z metod Find, aby odszukać dany rekord w zestawie rekordów i set lub snapshot. Metody Find podane są poniżej:
FindFirst |
Znajduje pierwszy rekord, który spełnia podane kryterium. |
|
FindNext |
Znajduje następny rekord, który spełnia podane kryterium, zaczynając j od bieżącego rekordu. |
|
FindPrevious |
Znajduje poprzedni rekord, który spełnia podane kryterium, zaczynając od beżącego rekordu. |
|
FindLast |
Znajduje ostatni rekord, który spełnia podane kryterium. ! |
|
}
Jeżeli
rekordu spełniającego podane kryterium nie można odnaleźć, to
ustaw niem
właściwości NoMatch jest True
(Prawda).
Przed przystąpieniem do
poszukiw^ rekordów
ustaw zakładkę na bieżącym rekordzie. Jeżeli poszukiwanie się
nie pov|
dzie, będzie można użyć zakładki po to, aby wrócić do bieżącego rekoi
297
nipulowanie bazami danych przy użyciu DAO
P przeciwnym razie otrzymasz komunikat błędu „No current record." (Nie znaleziono żącego rekordu). Każdy rekord w zestawie Recordset posiada unikatową zakładkę lokmark). Zakładka pozwala zlokalizować dany rekord. Aby zwrócić zakładkę bie-cego rekordu, przesuń kursor do tego rekordu i przypisz wartość właściwości Book-irkobiektu Recordset zmiennej obiektowej, według wzoru poniżej:
, mySpot As Variant
pot = dynaRst.Bookmark
W procedurze pokazanej w przykładzie 2.20.G, ustawiono zakładkę na pierw-fm rekordzie w zestawie Dynaset. Procedura następnie przystępuje do poszukiwa-i firm, których nazwy zawierają ciąg znaków "Sp." Nazwy firm, które spełniają terium poszukiwania są umieszczone w oknie Instrukcje bezpośrednie. Następ-, procedura wraca do zaznaczonego rekordu przypisując właściwości Bookmark ość przechowywaną w zmiennej obiektowej:
Rst.Bookmark = mojeMiejsce
Ponieważ nie wszystkie zewnętrzne bazy danych obsługują zakładki, aby dowie-ieć się, czy dany obiekt Recordset posiada właściwość Bookmark, należy sprawdzić aściwość o nazwie Bookmarkable. Zakładki można stosować, jeżeli właściwość lOkmarkable jest True:
: dynaRst .Bookmarkable Then mojeMiejsce = dynaRst .Bookmark
I If
Jeżeli dany obiekt Recordset nie obsługuje zakładek, pojawi się błąd. Jeżeli ibiekt obsługuje zakładki, to można ustawić ich dowolną ilość. Zakładki można utwo-i dla dowolnego rekordu, przesuwając kursor do danego rekordu i przypisując rtość właściwości Bookmark do zmiennej typu string, która identyfikuje ten re-
lyklad 2.20.G. Wyszukiwanie rekordów w Dynaset
-rivate Sub cmdZnajdźRekordWDynaset_Click () Dim db As DAO.Database Dim dynaRst As DAO.Recordset Dim mojeMiejsce As Variant
298
Programowanie w Access
20(i
S et db = CurrentDb
Set dynaRst = db.OpenRecordset("tblKlienci", dbOpenDynaset) MsgBox "Bieżący klient: " & dynaRstINazwaKlienta mojeMiejsce = dynaRst.Bookmark
' wyszukaj kientów, których nazwy zaczynajć, się na litery "Sp." dynaRst.FindFirst "NazwaKlienta Like '*Sp."'"
Do While Not dynaRst.NoMatch
Debug.Print dynaRst!NazwaKlienta
dynaRst.FindNext "NazwaKlienta Like '*Sp.*'"
Loop
dynaRst.Bookmark = mojeMiejsce
MsgBox "Zpowrotem do rekordu: " dynaRst.Close SendKeys "^g" End Sub
& dynaRstINazwaKlienta
Wyszukiwanie n-tego rekordu w Dynaset lub Snapshot
Procedura w przykładzie 2.20. H demonstruje, w jaki sposób można odnaleźć J ty rekord w zestawie rekordów typu snapshot. Zauważ, że natychmiast po otwarł obiektu Recordset zastosowana jest metoda MoveLast. Metoda ta gwarantuje,* wszystkie recordy zostały pobrane. Całkowita liczba rekordów jest następnie urnij czona w zmiennej sumaRec. Następnie metoda MoveFirst wraca do pierwszegom kordu, podczas gdy metoda inputBox prosi użytkownika o podanie liczby wskazufl cej o ile pozycji należy przesunąć się do przodu. Jeżeli wartość podana przez ual kownika jest mniejsza niż suma wszystkich rekordów w danym zestawie, to kursJ zostanie przesunięty do podanego rekordu i struktura pętli For...Each wydrukuje J zwy pól oraz ich wartości dla wskazanego rekordu w oknie Instrukcje bezpośredni! Ponieważ próba przesunięcia się poza koniec obiektu Recordset spowoduje Vm procedura wyświetla komunikat, jeżeli liczba pozycji podana przez użytkownikajl większa aniżeli ilość wszystkich rekordów ogółem.
Przykład 2.20.H. Wyszukiwanie n-tego rekordu w Dynaset lub Snapshot
Private Sub cmdZnajdźNtyRekordWSnapshot_Click ) \ Dim rst As DAO.Recordset
Manipulowanie bazami danych przy użyciu DAO
D im fid AS DAO.Field Dim sumaRec As Integer
C Z !Sc"rtlrtOb.Op.„H,oorcl»etl"tŁlKUenci-, ^Snapshot,
rst.MoveLast
sumaRec = rst .RecordCount
rst.MoveFirst T f
nty . InputBox("Wpisz liczba o którą chcesz * vbCrLf _
s "przesunąć kursor do przodu:") If sumaRec > nty Then rst.Move nty
& fid.Value
For Each fid In rst.Fields Debug.Print fid.Name & Next fid
Else . „
MsgBox "Trzeba wpisać wartość mniszą od _
& sumaRec & "."
End If rst.Close
Sub
End
Praca z rekordami
rekordów ani zmienić lub usunąć istniejących.
Dodawanie nowych rekordów
E P^ad 7J^ Polecenia
woparciu o tabelę o nazwie tblKlienci2:
j, obiekt
As DAO.Recordset
= db.0penRecordSet("tblKlxencx2..)
300
Programowanie w Access 2QB
SD frmDAO PrzykS: Formularz
jJSl xl
Odszukaj/Przeczytaj rekordy Manipulowanie rekordami
D odaj nowy rekord
Praca
z rekordami
Filtrowanie rekordów przy użyciu klauzuli SQL WHERE
Filtrowanie rekordów frzy użyciu właściwości Filter
U suń rekord
Praca :; rekordami w formularzu przy użycii właściwości RecordSetCIone
Z apisz wartości pól w zmiennych
Zapisywanie rekordów w tablicy
F I Kopiowanie rekordów do ar ;usza
1 |
|
0., |
8 |
K |
:■ |
I757 Reklama Sf |
Z 0. 3. |
B |
K |
|
|
0.0. |
B |
K |
|
|
Sal interii |
B |
i' |
Rysunek 2.21. Manipulowanie rekordami przy użyciu DAO
Po otwarciu obiektu Recordset skorzystaj z metody AddNew, aby utworzyć pustyj rekord. Na przykład:
tblRst.AddNew
Następnie można podać wartości wszystkich lub tylko niektórych pól w now™ rekordzie. Podanie wartości w danym polu jest konieczne, gdy właściwość wymaganej (Required) tego pola jest ustawiona na Tak. Jeżeli wpis w danym polu jest wymagany! to w interfejsie użytkownika w trybie Projektuj tabelę będzie wpis Tak (Yes) obokj właściwości wymagane (Required). Oto kilka przykładów przypisujących wartości j pól danego rekordu:
tblRst.Fields("NazwaKlienta").Value = "Gosh, Regina" tblRst.Fields("TypKlienta").Value = "I"
Zwróć uwagę na to, że value jest właściwością domyślną obiektu Field, we tego można ją pominąć co też uczyniono w kodzie przykładowej procedury (z
. Update
*
*-
■»"
2,!.A
pokazuje, w jaki spose*
««
*
^niektóre pola tej tabeli wartościami
1 Dodawanie nowego rekordu do istniejącej tabeli
Przykład 2.21
[private Sub cmdDodajNowyRekord_Click() Dim db As DAO.Database Dim tblRst As DAO.Recordset
Set db = CurrentDb
Set tblRst = db.OpenRecordset("tblKlienci2")
With tblRst
.AddNew
.Fields("NazwaKlienta") = "Gosh, Regina"
.Fields("TypKlienta") = "I" .Fields("KlientOdRoku") = "1999" .Fields("DataWpisu") = Now() .Fields("IdWpisu") = "JO" .Fields("DataModyfikacji") = Now() .Fields("IDModyfikacji") = "JO" .Update
End With
MsgBox tblRst.Fields(1).Value
tblRst.Bookmark = tblRst.LastModified
MsgBox tblRst.Fields(1).Value
tblRst.Close jb
W zestawie rekordów typu Table, nowo dodany rekord jest umieszczony w tabeli w kolejności określonej przez indeks. W zestawie rekordów typu Dynaset nowy rekord dodany jest na końcu danego zestawu rekordów. Przy dodawaniu nowe-eo rekordu do tabeli nowy rekord nie staje się automatycznie bieżącym rekordem. Re-kord, który był bieżący przed dodaniem nowego rekordu, jest nadal bieżącym rekordem. Innymi słowy, podczas gdy nowy rekord dodawany jest do tabeli, kursor pozo-
■
302
Programowanie w Access m
s taje na rekordzie, który był wybrany przed dodaniem r owego rekordu. Aby ucJ nowo dodany rekord bieżącym rekordem, należy skorzystać z dwóch właściwoa
Bookmark oraz LastModif ied:
tblRst.Bookmark = tblRst.LastModified
Aby lepiej to zrozumieć, wykonaj następujące czynności:
Otwórz
tabelę tbiKiienci2 w interfejsie użytkownika i usuń rekord
Gosh,
który został dodany przez procedurę w przykładzie 2.21.A.
Zamknij tabelę tbiKlienci2.
Zmodyfikuj
procedurę
cmdDodajNowyRekord_ciick w przykładzie 2.21.A,ml
sując
następujące polecenia poniżej słów kluczowych End
with:
MsgBox tblRst.Fields(1).Value tblRst.Bookmark = tblRst.LastModified MsgBox tblRst.Fields(1).Value
4. Uruchom zmodyfikowaną procedurę cmdDodajNowyRekord _ciick.
Modyfikacja rekordów
Aby zmodyfikować istniejący rekord, skorzystaj z metody openRecordset, która ■ otwiera obiekt Recordset. Następnie odnajdź rekord, który zamierzasz zmodyfiB wać. W zestawie rekordów typu Table możesz skorzystać z metody Seek oraz indeJ tabeli, aby wyszukać rekord, który spełnia dany warunek. W zestawie rekordów taj
Dynaset lub Snapshot możesz skorzystać Z metod :?ind (FindFirst, FindMexJ FindPrevious, FindLast), aby odnaleźć żądany rekord. Nie zapomnij jednak o tym, że można modyfikować dane tylko w zestawach rekordów typu Table lub Dynaset! (zestawy typu Snapshot służą tylko do pobierania rekordów). Po odnalezieniu rekoi skorzystaj z metody Edit obiektu Recordset i przystąp do zmian wartości pól. fl dokonaniu zmian w danym rekordzie, użyj metody update obiektu Recordset.
Procedura cmdzmodyfikujRekord_ciick w przykładzie 2.21.B otwiera zestaj rekordów typu Table oparty na tabeli tblKlienci2 i zmienia status wszystki klientów z K na A. Następnie procedura odnajduje rekord określonego klienta. Zw uwagę na to, że właściwość index należy ustawić przed skorzystaniem z metody w przeszukiwaniu tabeli. Jeżeli powołasz się na indeks, który nie istnieje, wystąpił wykonania. Po odnalezieniu żądanego rekordu procedura wyświetla nazwę ta/firmy w polu komunikatu:
303
Manipulowanie bazami danych przy użyciu DAO
H sgBox rstINazwaKlienta
Powyższa instrukcja jest skróconą wersją instrukcji podanej poniżej:
LgBox rst.Fields ("NazwaKlienta" ) .Value
Operator (!) oddziela nazwę obiektu od nazwy zbioru, którego dany obiekt jest członkiem. Ponieważ domyślnym zbiorem obiektu Recordset jest zbiór Fields, można pominąć nazwę domyślnego zbioru. Następnie procedura otwiera tryb edycji dla odnalezionego rekordu i zmienia wartość w polu KlientodRoku:
stlKlientOdRoku = "1998"
Powyższą intrukcję można również zapisać w następujący sposób:
Lt.Fields("KlientodRoku") .Value
Procedura następnie korzysta z metody update, aby zapisać na stałe zmiany iwrekordzie. Na zakończenie procedury obiekt Recordset zostaje zamknięty. Równo-ftześnie procedura otwiera zmodyfikowaną tabelę w interfesie użytkownika w trybie ■tylko do odczytu.
[przykład 2.2l.B. Modyfikowanie rekordu w tabeli
private Sub cmdZmodyf ikujRekord_Click() Dim db As DAO.Database Dim rst As DAO.Recordset Dim warunek As String
Set db = CurrentDb
Set rst = db.OpenRecordset("tblKlienci2", dbOpenTable) rst.MoveFirst
' Zmień status wszystkich klientów z K na A (aktywny) Do While Not rst.EOF With rst
.Edit
.Fields("Status") = "A"
.Update
.MoveNext
304
Programowanie w Access 2«
End With Loop
1 wyszukaj rekord Anny Korc - i wpisz dane w polu KlientOdRoku warunek = "Korc, Anna" rst.MoveFirst rst.Index = "NazwaKlienta" rst.Seek "=", warunek MsgBox rst!NazwaKlienta rst.Edit
rst!KlientOdRoku = "1998" rst.Update rst.Close
1 otwórz zmodyfikowaną tabelę w trybie tylko do odczytu DoCmd.OpenTable "tblKlienci2", acViewNorma^, acReadOnly End Sub
Usuwanie rekordów
■
Aby
usunąć
istniejący rekord, otwórz obiekt Recordset
przy
użyciu metodv
openRecordset.
Odszukaj rekord, który chcesz wymazać. W zestawie rekordów t™
Table
możesz
skorzystać z metody seek
oraz
indeksu tabeli, aby wyszukać rekord,! który
spełnia dany warunek. W zestawie rekordów typu Dynaset
lub
snapshot
m
Żesz
skorzystać Z metod Find
(FindFirst, FindNext, FindPrevious, FindLast),
■ odnaleźć
żądany rekord. Nie zapomnij jednak o tym, że można modyfikować
dal tylko
w zestawach rekordów typu Table
lub
Dynaset
(snapshot służą
tylko do pobierania
rekordów). Następnie skorzystaj z metody Delete
obiektu
Recordset,
abypn
prowadzić
operację usuwania. Przed użyciem metody Delete
dobrze
jest sporządzi; dodatkowy
kod proszący użytkownika o potwierdzenie lub anulowanie operacji m
mazywania.
Natychmiast po usunięciu rekordu nie ma bieżącego rekordu. Użyj
dy
MoveNext,
aby
przesunąć kursor do istniejącego rekordu. Procedura w przykłada
2.2l.C
usuwa tych klientów, których rekordy zawierają zero (0) w polu
Liczbaspo-tkań. Polecenie Do
while Not tbiRst.EOF poleca
Vkual
Basicowi wykonanie
poleceń
w pętli aż do napotkania końca pliku (EOF). Polecenie if
wewnątrz
pętli spraw] dza
wartość w polu LiczbaSpotkań i usuwa bieżący rekord, jeżeli
postawiony wai| nek
jest prawdziwy.
Za każdym razem, gdy rekord jest usunięty, wartość zmiei licznik
zostaje zwiększona o jeden. Zmienna licznik przechowuje całkowitą
lii usuniętych
rekordów. Po usunięciu rekordu metoda MoveNext
przesuwa
kursor do stępnego
istniejącego rekordu dopóki nie dotrzemy do końca pliku. Chociaż
moż korzystać
z metody Delete
oraz
pętli while
do usunięcia
rekordów, tak jak to
Manipulowanie bazami danych przy użyciu DAO
305
ż uje procedura w przykładzie 2.21.C, lepszym sposobem usunięcia rekordów jest sporządzenie kwerendy usuwającej.
Przykład 2.21.C. Usuwanie rekordów
Private Sub cmdUsuńRekord_Click ()
' sporządź kopię tabeli tblKlienci pod nazwą Klienci3
Dim db As DAO.Database
Dim tblRst As DAO.Recordset
Dim licznik As Integer
' usuń wszystkich klientów, którzy posiadają zero (0) w polu ' LiczbaSpotkań
Set db = CurrentDb
Set tblRst = db.OpenRecordset("tblKlienci3 ")
tblRst .MoveFirst
Do While Not tblRst.EOF
If tblRst!LiczbaSpotkań = 0 Then tblRst.Delete licznik = licznik + 1
End If
tblRs t.MoveNext Loop
MsgBox "Liczba wymazanych rekordów: " & licznik tblRst. Close
End Sub
Zachowywanie wartości pól w zmiennych
Po odnalezieniu określonego rekordu w zestawie rekordów można zapisać wartości poszczególnych pól rekordu w zmiennych i przekazać te wartości do innych procedur. Zmienna musi posiadać typ odpowiadający danym, które zamierzasz w niej przechowywać. Przykładowa procedura 2.2l.D przesuwa się do pierwszego rekordu w zestawie rekordów typu Table i zachowuje zawartość pól NazwaKlienta oraz LiczbaSpotkań w zmiennych strNazwaKlienta oraz intspotkania. Następnie zmienne te są przekazane jako parametry do procedury Pokaż Dane w przykładzie po-
306
Programowanie w Access 20H
niżej. Głównym zadaniem procedury PokażDane jest wyświetlenie pobranych wartoj pól w oknie komunikatu. Zwróć uwagę na to, że vbcr jest stałą Visual Basica, któl określa naciśnięcie klawisza Enter. Jest ona równoznaczna z poleceniem l Zatem instrukcję,
MsgBox "Klient: " & strNazwaKlienta & vbCr & "Liczba spotkań: Spotkania
Można również zapisać w następującej postaci:
" & int-j
MsgBox "Klient: " & strNazwaKlienta & Chr(13) & "Liczba spotkań: "sj intSpotkania
Przykład 2.21.D. Zachowywanie danych w zmiennych
Private
Sub cmdDaneWZmiennych_Click()
Dim
db As DAO.Database
Dim
tblRst As DAO.Recordset
Dim
strNazwaKlienta As String
Dim
intSpotkania As Integer
Set
db =
CurrentDb ,
I
Set tblRst = db.OpenRecordset("tblKlienci tblRst.MoveFirst
strNazwaKlienta = tblRstINazwaKlienta intSpotkania = tblRst!LiczbaSpotkań PokażDane strNazwaKlienta, intSpotkania tblRst.Close
End Sub
Sub PokażDane(strKlient As String, spotkania As Integer) MsgBox "Klient: " & strKlient & vbCr _ & "LiczbaSpotkań: " & spotkania
End Sub
Zachowywanie rekordów w tablicy
Czasami musimy pobrać zawartość jednego lub więcej rekordów. Posługując s metodą GetRows obiektu Recordset, możesz skopiować blok rekordów z obiektu i
307
e bazami danych przy użyciu DAO
.
^^^^
^
tblKlienci
^
prosi użytkownika
ow ^^
sązwrocone
r^me
y ^^
dwuwymiarową
tokowym,
to będziesz
mógł spraw-
i—inst*e
w oknie In"
i;
iczbę
rzędów,
^otwiera
zestaw rekordów
czą
liczbę znajdujących się w
ime
liczby rekordów,
które
^ przez
użytkow.
jest następnie stosowana jako
U variant
(-^
iczbę
rzędów, które należy umieścić w ^ ^
tblKlienci
strukcje bezpośrednie.
kordów J"^
1187 Re
klama Sp . z o
. o.
pola .
*»«*
aby obl"
c. UBound(mojeRekordy, x) + i powyższych instrukcjach
Ponieważnumeracjawtabhcach-c^^
^e^ bezprddfpodając
Przy
Wad2.21.E.Zachowywame rekordów w tablicy
private sub
Dim db AS DAO.Database Dim rst AS DAO.Recordset
308
Programowanie w Access 2o|
M
D im mojeRekordy As Variant
Dim licznik As Long
Dim ileWierszy As Integer
Dim wiersz As Integer
Dim kolumna As Integer
Dim i As Integer
Dim j As Integer
Set db = CurrentDb
Set rst = db.OpenRecordset("tblKlienci", dbOpenDynaset)
With rst
.MoveLast
licznik = .RecordCount .MoveFirst End With
ileWierszy = CInt(InputBox("Ile rekordów chcesz pobrać?") If ileWierszy <= licznik Then
' zachowaj podaną liczbę rekordów w tablicy mojeRekordy = rst.GetRows(ileWierszy) wiersz = UBound(mojeRekordy, 2) +1 kolumna = UBound(mojeRekordy, 1) +1 'pobierz wartości z tablicy For i = 0 To wiersz - 1
Debug.Print "Rekord ■ & i + 1 & ":' &_
vbTab & mojeRekordy(1, i) For j = 0 To kolumna - 1
Debug.Print vbTab & "Pole " & j 4 1&; ":" &_
vbTab & mojeRekordy(j, 1) Next j
Next i
Else
MsgBox "Można pobrać" & vbCrLf
& licznik &
& "nie więcej niż End If rst.Close db.Close End Sub
rekordów."
K opiowanie rekordów do komórek arkusza kalkulacyjnego
Rekordy można bezpośrednio skopiować do arkusza kalkulacyjnego za porno metody CopyFromRecordset.
Manipulowanie bazami danych przy użyciu DAO
Ahv skopiować wszysiKie icnui^ ^^^ .
gnającego się w komórce Al, zastosuj następującą instrukcje:
Aby skopiować wszystkie rekordy z zestawu Recordset do zakresu komórek
^oo+arMiiara instrukcie:
«orkSheets(D .RangeC'Al") .CopyFromRecordset rst
rst
po
nazwie
metody (CopyFromRecordset) jest zmienną
obiektową, która re
prezentuje
obiekt Recordset. _
_
,
Aby skopiować pięć rekordów do arkusza, skorzystaj z
następującej instrukcji:
Worksheets(l).Range("Al").CopyFromRecordset rst, 5
, Aby skopiować pięć rekordów oraz cztery pola do zakresu komórek w arkuszu, użyj następującej instrukcji:
| «orksheets(l).Range("Al").CopyFromRecordset rst, 5, 4
I , Możesz równie, podać liczbę rekordów (rzędów) oraz pól (kolumn), które zamierzasz skopiować do arkusza przy użyciu zmiennych:
WorksheetS(D .RangerAl") .CopyFromRecordset rst, mojeKolumny
Pioced»ra m od u
l Sprania! procedura urnieszcza za- „^ Excda osadzonym rezuUa,
tej procedury.
PRyklad 2.21.F. Kopiowanie rekorów do zakresu komórek w arkuszu kalkulacyjnym
Private Sub cmdWkopiujDoExcela_Click() Dim db As DAO.Database Dimrst As DAO.Recordset Dim rzędy As Integer Dim nrKol As Integer Dim licznik As Integer Dim objEx As Object
310
Programowanie w Access m
O n Error GoTo ErrorHandler
Set db = CurrentDb
Set rst = db.OpenRecordset("tblKlienci", dbOpenDynaset)
Set objEx = MelOLEExcel.Object
With rst
.MoveLast
licznik = .RecordCount .MoveFirst End With
rzędy = CInt(InputBox("Ile rekordów skopiować?")) If rzędy <= licznik Then
MeSOLEExcel.Verb = acOLEVerbShow MelOLEExcel.Action = acOLEActivate With objEx.Worksheets(1) .Cells.Clear
.Range("Al").CopyFromRecordset rst, rzędy, 4 .Range("Al").Select End With
1 nie zamykaj obiektu Excela, jeżeli chcesz sprawdzić rezultaty 1 MelOLEExcel.Action = acOLEClose End If Koniec:
Set objEx = Nothing rst.Close db.Close Exit Sub ErrorHandler:
MsgBox Err.Number & ":" & Err.Description Resume Koniec End Sub
Filtrowanie rekordów
Aby pracować tylko z określonym zestawem rekos-dów, można odrzucić te rekordy, które nie są potrzebne. Rekordy można filtrować przy użyciu klauzuli SQL; where lub przy użyciu właściwości Filter. Właściwość Filter można zastosować w odniesieniu do obiektu Recordset typu Dynaset lub snapshot. Najszybszym sposobem odrzucenia zbytecznych rekordów jest otwarcie obiektu Recordset przy użyciu instrukcji SQL, która zawiera klauzulę where. Przykład 2.21.G ilustruje sposób użycia
Manipulowanie bazami danych przy użyciu DAO
311
k lauzuli where w poleceniu SQL w celu pobrania klientów, których nazwisko lub nazwa firmy rozpoczyna się od litery „B" i którzy mieli przynajmniej jedno spotkanie.
Przykład 2.21.G. Filtrowanie rekordów przy użyciu klauzuli SQL WHERE
P rivate Sub cmdFilterSQLWhere_Click() Dim db As DAO.Database Dim rst As DAO.Recordset Dim qdf As DAO.QueryDef Dim mój SQL As String
Set db = CurrentDb
B*' AND LiczbaSpotkań >0;"
mój SQL = "SELECT * FROM " _
S "tblKlienci WHERE NazwaKlienta LIKE Set qdf = db.CreateQueryDef("B_Klienci") qdf. SQL = mój SQL
Set rst = db.OpenRecordset("B_Klienci") DoCmd. OpenQuery "B_Klienci" ■ End Sub
Procedura w przykładzie 2.21.H poniżej wykorzystuje właściwość Filter w celu I ograniczenia liczby rekordów do tylko tych klientów, których nazwiska zaczynają się I na literę „B" i wartość w polu LiczbaSpotkań jest większa niż zero (0). Procedura I rozpoczyna się od otwarcia obiektu Recordset typu Dynaset na podstawie tabeli tbi-Łlienci i ustawieniu właściwości Filter obiektu Recordset:
■ rst.Filter = "NazwaKlienta like 'B*1 and LiczbaSpotkań >0"
Aby filter mógł działać, po jego ustawieniu należy otworzyć nowy obiekt Re-Łrdset na podstawie obiektu Recordset, w którym ustawiono filter:
1 Set FilterRst = rst .OpenRecordset ()
Następnie procedura wypisuje w oknie Instrukcje bezpośrednie wartość z pola w każdym rekordzie filtrowanego zestawu.
Programowanie w Accesl
P rzykład 2
.21.H. Filtrowanie rekordów przy użyciu właściwości Filter
Private Sub cmdFilterDane_Click() Dim db As DAO.Database Dim rst As DAO.Recordset Dim FilterRst As DAO.Recordset
Set db = CurrentDb
Set rst = db.OpenRecordset("tblKlienci", dbOpenDynaset)
rst. Filter = "NazwaKlienta like 'B*' ć\nd LiczbaSpotkań >0"
Set FilterRst = rst.OpenRecordset() Do Until FilterRst.EOF
Debug.Print FilterRst.Fields("NazwaKlienta").Value
FilterRst.MoveNext Loop
rst.Close FilterRst.Close
End Sub
Tworzenie obiektu Recordset w oparciu o formularz
Jak dotąd, pracowałeś z obiektami Recordset utworzonymi na podstawie dal znajdujących się w tabelach lub kwerendach. Obiekt Recordset można również t rzyć na podstawie danych wyświetlanych w danej chwili przez formularz. Jak v źródło danych formularza określa się, ustawiając właściwość źródło rekordów cordSource). Źródłem rekordów może być nazwa tabeli, kwerendy lub polecenie Aby odwołać się do obiektu Recordset, który dostarcza danych do formularza,! skorzystać z właściwości Recordsetclone. Właściwość Recordsetcione umoż!
Poruszanie
się w zestawie rekordów oraz manipulowanie rekordami bez ni
nia
rekordów wyświetlonych w danym formularzu.
Synchronizację formularza z rekordem odnalezionym w zestawie Recor
lone.
Dostęp
do właściwości RecordCount obiektu Recordset
w
celu uzyskani
rekordów
wyświelonych w formularzu.
Zwrócenie
wartości określonego pola w bieżącym rekordzie.
Przykład
2.21.1 prezentuje tworzenie i użycie właściwości Recordsetcl
Manipulowanie bazami danych przy użyciu D AO 313
Przykład 2.21.1. Praca z obiektem Recordset formularza
i private Sub cmdOdszukajRekordKlienta_Click() Dim frmRst As DAO.Recordset Dim r As String
DoCmd.OpenForm "frmKlienci", acNormal
MsgBox "Nazwa formularza: " & Screen.ActiveForm.Name
' pobierz formularz oraz jego Recordset
Set frmRst = Screen.ActiveForm.Recordsetclone
1 sprawdź ile rekordów znajduje się w formularzu 1 i zapytaj użytkownika który rekord chce wyświetlić = InputBox("Liczba klientów: " & frmRst.RecordCount & vbCr _ "Którego klienta rekord chcesz wyświetlić?", "Wpisz Id klienta", 1)
I f r = "" Then Exit Sub
frmRst.FindFirst "[IdKlienta] =
If frmRst.NoMatch Then
MsgBox "Klienta " & r & " nie ma w tej tabeli."
Else
' pokaż wartość wpisaną w polu NazwaKlienta ' w bieżącym rekordzie zestawu Recordsetclone MsgBox "Nazwa klienta: " &_
Forms!frmKlienci.Recordsetclone SNazwaKlienta ' pokaż znaleziony rekord w formularzu ' przypisując zakładkę formularza zakładce 1 w zestawie Recordsetclone Forms !frmKlienci.Bookmark = frmRst.Bookmark
End If frmRst.Close
End Sub
& r
B ezpieczeństwo danych oraz obsługa transakcji
Jeżeli twoja baza danych zawiera poufne informacje lub nie życzysz sobie, aby inne osoby mogły zmienić kod lub dokonać modyfikacji obiektów bazy danych, to powinnieś zastanowić się nad sposobem zabezpieczenia aplikacji przed osobami nieupoważnionymi. Oprócz możliwości zarządzania bezpieczeństwem danych prosto interfejsu użytkownika w aplikacji Microsoft Access przy użyciu opcji dostępnych z menu Narzędzia I Zabezpieczenia możesz również sporządzić własne procedury VBA zabezpieczające daną aplikację. Procedury w kolejnych sekcjach tego rozdziału demonstrują, w jaki sposób używa się obiektów DAO do zabezpieczania danych. Na końcu tych zagadnień dowiesz się również, w jaki sposób można wykorzystać trasak-cie przy dokonywaniu zmian w dużej ilości danych.
:
obsługiwać transakcje, należy zapoznać się z obiektem workspace. Jak wiesz, winterfesie użytkownika Microsoft Access można otworzyć wdanej chwili jedną baz? danych. Po uruchomieniu Accessa silnik bazy danych (Jet Database Engine) automatycznie loguje danego użytkownika w domyślnym obszarze roboczym (DBEngine.workspaces (0)) w charakterze użytkownika o nazwie Admin i nie wymaga podania hasła. Następujące komendy wpisane w oknie Instrukcje bezpośrednie zwracają informacje dotyczące obecnej sesji użytkownika w aplikacji Microsoft Access:
to są obszary robocze
^DBEngine.Workspaces (0) .Count 1 |
Ile obszarów roboczych jest w tej chwili otwartych? |
?DBEngine. Workspaces (0) .Name tDefault Workspacet |
Jak nazywa się obecnie otwarty obszar roboczy? |
?DBEngine.Workspaces (0) . UserName admin |
Kto jest właścicielem obszaru roboczego? |
316
Programowanie w Access 201
B H frmDAO PrżykB: Formularz
Bezpieczeństwo danych / obsługa transakcj
Obszary Robocze | Użytkownicy i grupy | Uprawnienia użytkowników/grup \ Transakcje ]
I Sporządź obszar roboczy i
R ysunek 2.22. Użycie obiektu Workspace
Za pomocą kodu VB A możesz:
Utworzyć dowolną liczbę obiektów Workspace.
Załogować się w charakterze innego użytkownika.
Wymagać załogowania się za pomocąokreśloiego ID.
Otworzyć
drugą bazę danych (Po otwarciu kilku obszarów roboczych
możes
otworzyć
inną bazę danych w każdym obszarze roboczym i manipulować
danyij
znajdującymi
się w tych bazach danych).
Procedura w przykładzie 2.22.A demonstruje, w jaki sposób tworzy się obia workspace przy użyciu DAO i jak można pobrać właściwości tego obiektu. Procedui najpierw zwraca liczbę aktualnie otwartych obszarów roboczych. Następnie pa For...Each.. .Next umożliwia odczytanie właściwości domyślnego obszaru roboczej Nazwy właściwości obiektu workspace są wyszczególnione w oknie Instrukcje bt pośrednie (zobacz poniżej):
Name = #Default Workspace* UserName = admin IsolateODBCTrans = O LoginTimeout =
ipulowanie bazami danych za pomocą ADO
317
D efaultCursorDriver = = 2
Zwróć uwagę, że niektóre spośród właściwości obiektu workspace nie posiadają wypisanych im wartości. Aby uniknąć błędu przy próbie pobrania wartości tych właściwości, procedura zastawia pułapkę na błąd o nazwie QuickFix. Następnie procedu-takorzysta z metody createworkspace, aby utworzyć nowy obszar roboczy o nazwie ^owyObszar" będąc załogowanym jako Admin.
Set mój Obszar = DBEngine.CreateWorkspace(Name: = "NowyObszar", User-Kame: = "Admin", Password: = "")
W powyższej instrukcji mójobszar jest zmienną obiektową, która reprezentuje obiekt workspace, który zamierzasz utworzyć. Metoda createworkspace wymaga następujących argumentów: i Name jest łańcuchem znaków, który określa nazwę nowego obiektu workspace.
• userName jest łańcuchem znaków, który określa właściciela nowego obiektu
Workspace.
• Password
jest łańcuchem znaków zawierającym hasło dla nowego obiektu
work
space.
Hasło
może zawierać do 14 znaków. Korzystając z metody
createworks-
pace,
można załogować się do innego obszaru roboczego jako inny
użytkownik
z
innymi uprawnieniami do bazy danych. Po utworzeniu nowego obszaru
robo
czego
za pomocą metody createworkspace należy użyć metody Append,
aby
dodać obiekt Workspace do zbioru Workspaces: DBEngine.Workspaces .Append myWorkspace
Skorzystaj z metody count zbioru workspaces, aby zwrócić całkowitą liczbę obiektów workspace w tym zbiorze. Po dodaniu obiektu workspace do zbioru workspaces procedura wyszczególnia jego właściwości w oknie Instrukcje bezpośrednie,
korzystając Z pętli For...Each. . .Next.
Rezultat tej procedury pokazany jest poniżej:
Karne = NowyObszar
OserName
= Admin
i IsolateODBCTrans = 0
ŁoginTimeout = DefaultCursorDriver =
318
Programowanie w
T ype = 2
Na zakończenie metoda close usuwa obiekt workspace ze zbioru workspj
myWorkspace.Close
U waga: Przed usunięciem obiektu Workspace ze zbioru workspaces za pomocąj tody close zamknij wszystkie otwarte bazy danych oraz połączenia.
Przykład 2.22. A. Tworzenie obszaru roboczego i odczytywanie jego właściwości
Private Sub cmdWorkspace_Click()
Dim mójObszar As DAO.Workspace Dim prp As DAO.Property
On Error GoTo QuickFix
MsgBox DBEngine.Workspaces.count
For Each prp In DBEngine.Workspaces(0).Properties
Debug.Print prp.Name & " = " & prp Next prp
Set mójObszar = DBEngine.CreateWorkspace(Name:="NowyObszar" UserName:="admin", _ Password:="")
DBEngine.Workspaces.Append mójObszar MsgBox DBEngine.Workspaces.count
Debug.Print " "
For Each prp In mójObszar.Properties
Debug.Print prp.Name & " = " & prp.Value Next prp mójObszar.Close SendKeys "~g" Exit Sub QuickFix:
Debug.Print prp.Name & "="
: bazami danych za pomocą ADO
319
Resume Next
morzenie nowego konta użytkownika
Informacja dotycząca użytkownika przechowywana jest w pliku grupy roboczej i (Workgroup Information File) o nazwie system.mdw. Skorzystaj z obiektu User, aby J założyć indywidualne konto użytkownika w kodzie procedury VBA. Skorzystaj łnetody createuser obiektu workspace, aby utworzyć nowego użytkownika. Meto-I da ta wymaga trzech argumentów, nazwy użytkownika, PID użytkownika oraz hasła I użytkownika. Ostatni argument jest opcjonalny.
Bezpieczeństwo danych / obsługa transakcji
LryRobocze Użytkownicy i grupy Jyprawnenja.^^
Dodai użytkownika
do grupy : 3an Grupa; Personalny
S porządź wykaz użytkowników
Podaj użytkowników w poszczególnych grupach
U suń użytkownika z grupy
Załóż konto grupowe Nazwa grupy: Personalny
Użytkownicy bez hasła?
D odaj nowego użytkownika
Rysunek 2.23. Zakładanie kont indywidulanych oraz grupowych przy użyciu DAO
kj jki sposób mo
nek 2.23. Zakładanie kont indyy
Procedura w przykładzie 2.23 .A poniżej pokazuje, w jaki sposób można progra-matycznie utworzyć indywidualne konto dla użytkownika o nazwie Jan. Zakładając nowe konto użytkownika, należy podać jego imię oraz osobisty identyfikator (tak zwany PID). PID nie jest hasłem. W przykładowej procedurze następująca instrukcja tworzy nowe konto użytkownika:
Set
no
iwyUser
= wsp.CreateUser(strUser)
320
Programowanie w Access 2M
N azwa użytkownika zawarta jest w zmiennej struser. Procedura nastał używa właściwość PID obiektu user, aby określić osobisty identifikator dla now użytkownika. Następnie właściwość Password pozwala określić hasło użytkowa Zamiast trzech wierszy kodu w tej procedurze, można skorzystać z następującej ii strukcji:
Set nowyUser = wsp.CreateUser(strUser, "SPC100000", "gramofon")
Każdego nowego użytkownika należy następnie dodać do zbioru users zafl mocą metody Append:
wsp.Users.Append nowyUser
Jeżeli określone konto użytkownika już istnieje to wystąpi błąd. Aby zastawi pułapkę na ten błąd, procedura w przykładzie 2.23. zawiera procedurę obsługi blęj składającą się z dwóch instrukcji:
wsp.Users.Delete strUser Resume 0
Pierwsza instrukcja powyżej usuwa użytkownika ze zbioru users. Druga ii strukcja wraca do polecenia procedury, które spowodowało błąd, i procedura przebił ga dalej.
Przykład 2.23.A. Zakładanie nowego konta użytkownika
Private Sub cmdDodajUżytkownika__Click () Dim wsp As DAO.Workspace Dim nowyUser As DAO.User Dim strUser As String On Error GoTo ErrorHandler Set wsp = DBEngine.Workspaces(0) strUser = "Jan"
1 zajdzie błąd jeżeli użytkownik już istnieje Set nowyUser = wsp.CreateUser(strUser) nowyUser.PID = "SPC100000" nowyUser.Password = "gramofon" wsp.Users.Append nowyUser MsgBox "Dodano nowego użytkownika o nazwie:
& strUser
Tworzenie i manipulowanie bazami danych za pomocą ADO
321
Exit Sub EtrorHandler:
wsp.Users.Delete strUser
Resume 0 i End Sub
i ,wta użytkowników i grup
? X
Użytkownicy Grupy j Zmienianie hasta logowania j
r Użytkownik
\ Nazwa: ]S
c u
- |
Izłonkostwo
grupy |
|
Gronek grupy: |
|
wsssrismUm Dodai...... |
|
Użytkownicy |
« Usuń |
|
n ■ e-
Drukuj użytkowników i grupy
R ysunek 2.24. Opcja o nazwie Konta użytkowników i grup w menu Narzędzia =>
Zabezpieczenia przedstawia nowe konto indywidulane dla użytkownika Jana, dodane przez procedurę w przykładzie 2.23.A
Aby przyśpieszyć proces tworzenia nowych kont indywidualnych, Rys. 2.23 wcześniej w tym zagadnieniu zawiera przycisk opatrzony etykietą AA o nazwie „Dodaj nowego użytkownika". Po kliknięciu tego przycisku procedura uwidacznia kilka ukrytych pól, które umożliwiają podanie argumentów metodzie createuser (zob. rys.
2.25).
322
Programowanie w Access 200(11
m frmDAO PrzykB : Form* i 11
.JJBI.SI
Bezpieczeństwo danych / obsługa transakcji
Obszary Robocze Użytkownicy i grupy j uprawnienia użytkowników/grup 1 Transak je |
a
Dodaj
nowego
użytkownika Imię: Jan ID:PID123
BI
Sporządź
wykaz
1
II użytkowników
Załóż konto grupowe Nazwa grupy: Personalny
Dodaj użytkownika
do grupy
Imię: 3an Grupa: Personalny
Podaj użytkowników w poszczególnych grupach
Usuń użytkownika z grup" Użytkownicy bez hasła?
N azwa ||
OK Anuluj
Password*
Rysunek 2.25. Zastosowanie własnego formularza przy tworzeniu kont użytkowników Przykład 2.23.A. Tworzenie konta użytkownika (Przykład 2 - zob. rysunek 2.25 powyżej)
Private Sub cmdAddUser_Click() Dim Ctrl As Control
F or Each Ctrl In Me.Controls
If Ctrl.Properties("Tag").Value
Ctrl.Visible = True End If Next
Me.txtNazwa.SetFocus cmdAddUser.Enabled = False End Sub
"tgKDntoU" Then
P o kliknięciu przycisku OK (zob. rys. 2.25) umchomiona zostaje procedura cmdOKciick podana poniżej (zob. Część 1). Procedura ta sprawdza najpierw, czy wymagane dane zostały podane i czy są one poprawne. Możesz dodać do tej procedury j blok kodu, który sprawdzi liczbę znaków w polu Hasło (hasło nie może zawierać więcej niż 14 znaków). Jeżeli wszystko dobrze wygląda, to procedura zawoła funkcję
Tworzenie i manipulowanie bazami danych za pomocą ADO
323
CreateUserAccount
(zob. Część
2 poniżej) i przekaże do niej dane wpisane w
poszczególnych polach tekstu (txtNazwa,
txtpm, oraz
txtHasio).
Część 1. Zakładanie konta indywidualnego
'upisz następującą deklarację u samej góry kartki modułu Option Compare Database Dim Flag As Boolean
private . Sub cmdOK_C 1 i ck ()
' sprawdź czy podano parametry
If Me.txtNazwa = "" Or Me.txtPID = "" Then
MsgBox "Należy wpisać imię i Identyfikator użytkownika. ",
, "Wymagane parametry" Me. txtNazwa.SetFocus Exit Sub
End If
If Len(Me.txtPID) < 4 Then
MsgBox "Trzeba wpisać przynajmniej 4 znaki."
Me. txtPID.SetFocus
Exit Sub
End If
CreateUserAccount Me.txtNazwa, Me.txtPID, Me.txtHasio
If Not Flag Then
MsgBox Me.txtNazwa & " jest nowym użytkownikiem."
Me.cmdAddUser.Enabled = False
Else
MsgBox "Takie konto indywidualne już istnieje."
Me.cmdAddUser.Enabled = False Me.txtNazwa.SetFocus
End If
With Me
.txtNazwa.Value = "" .txtPID.Value = "" .txtHasio.Value = "" End With End Sub
324
Programowanie w Access w
Powyższa procedura woła funkcję pokazaną poniżej. Funkcja ta oczekuje tj argumentów. Gdy argument funkcji jest opcjonalny należy go poprzedzić słowem W CZOWym Optional.
Część 2. Tworzenie nowego konta użytkownika
Function CreateUserAccount(strUserName, strUserld, _
Optional strUserPassword) Dim wsp As DAO.Workspace Dim newUser As DAO.User
On Error GoTo ErrorHandler
Set wsp = DBEngine.Workspaces(0)
Set newUser = wsp.CreateUser(strUserName, _ strUserld, strUserPassword)
wsp.Users.Append newUser
' dodaj nowego użytkownika do grupy Users
newUser.Groups.Append wsp.CreateGroup("Users")
Flag = False
Exit Function ErrorHandler:
'MsgBox "Zaistniał jakiś problem."
'MsgBox Err.Number & ": " & Err.Description
Flag = True
Exit Function End Function
Klikając przycisk Anuluj, można odwołać tworzenie nowego użytkownika (2 rysunek 2.25 powyżej). Procedura pokazana poniżej usuwa dane z pól tekstu i ukrj te pola.
Część 3. Anulowanie operacji dodawania nowego konta użytkownika
P rivate Sub cmdAnuluj_Click() Dim Ctrl As Control On Error GoTo ErrorHandler With Me
.txtNazwa.Value = "
worzenie i manipulowanie bazami danych za pomocą ADO
.txtPID.Value = "" .txtHaslo.Value = "" .cmdAddUser.Enabled = True .cmdOK.SetFocus End With For Each Ctrl In Me.Controls
If ctrl.Properties("Tag").Value =
ctrl.Visible = False End If Next Exit Sub ErrorHandler:
Me.cmdAddUser. SetFocus
Resume 0 Exit Sub | End Sub
■tgKontoU" Then
325
gotowanie wykazu wszystkich użytkowników bazy danych
Nazwych y
durach tego rozdziału, k0wników i grup (User and
^ użytkownika (zob. rysunek kaz użytkowników Pro-
żtkowników w polu
Nazwych
.y—w,
^f^^^^^^^^
durach
tego rozdziału, ^^J^"^
użytkownika
(zob. rysune
ó
i (User and Group Accou^ kikó
Pro
namatycznie. x iW~ "' r ' .. •>>
^unikatu (zob. rysunek 2.26 poniżej).
Przyk.ad 2.23.B. Sporządzanie wykazu kont indywidulanych
private Sub cmdListaUsers_Click() Dim wsp As DAO.Workspace DimmójU AS DAO.User Dim strU As String
set wsp = DBEngine.Workspaces(0) For Each mójU In wsp.Users
strU = strU & Chr(13) kmójU.Name
Next mójU
„sgBox strU, , "Użytkownicy"
End Sub
326
Programowanie w Access]
a dmin
Creator
Engine
Jan
Martin
Jola
Julita
Jacek
Hania Adam
OK
R ysunek 2.26. Wykaz nazw użytkowników można sporządzić, odczytując zawartość zbia Users w procedurzeVBA
Tworzenie nowego konta grupy
Konto grupy może zawierać jedno lub więcej kont indywidualnych. KorzvsJ z obiektu Group, można ustawić uprawnienia dla danej grupy. Każdy użytkownik* dany do tej grupy będzie automatycznie posiadał uprawnienia przyznane całej gnij Microsoft Access posiada dwa podstawowe konta grupowe. Grupa o nazwie, posiada wszystkie uprawnienia. Grupa o nazwie users posiada pełne uprawnienia! wszystkich nowo utworzonych obiektów bazy danych. Podobnie jak ma to i w przypadku kont indywidualnych, informacje dotyczące grup są przechov w pliku grupy roboczej (Workgroup Information File) o nazwie Systenimdw. ] kład 2.23 .C demonstruje, w jaki sposób można utworzyć konto grupowe or personalny. Rysunek 2.27 przedstawia rezultat wykonania tej procedury.
Przykład 2.23.C. Zakładanie konta grupy
Private Sub cmdDodajKontoGrupy_Click(] Dim wsp As DAO.Workspace Dim nowaGrupa As DAO.Group
On Error GoTo ErrorHandler
Set wsp = DBEngine.Workspaces(0)
' załóż konto grupy
327
rorzenie i manipulowanie bazami danych za pomocą ADO
'PER50000")
Set nowaGrupa = wsp.CreateGroup("PERSONALNY" wsp. Group s.App end nowaGrup a MsgBox "Założono nowe konto grupy." Exit Sub 'orHandler: wsp.Groups.Delete "PERSONALNY"
Resume 0
I Sub
Dodawanie użytkownika do grupy
Każdego nowego użytkownika należy umieścić w odpowiedniej grupie. Skorzystaj z metody Append, aby dodać określony obiekt user do zbioru users:
Set grupaP = wsp .Groups ("PERSONALNY") ŁnipaP. Users .Append grupaP .CreateUser ("Jan")
Procedura w przykładzie 2.23 .D demonstruje, w jaki sposób można dodać użyt-I kownika o nazwie Jan do grupy personalny. Przed uruchomieniem tej procedury I upewnij się, że zarówno konto użytkownika, jak i konto grupy zostały już utworzone I (zob. przykład 2.23.A dotyczący zakładania nowego konta indywidualnego oraz przy-l kład 2.23.C, jeżeli chcesz utworzyć konto grupy).
Przykład 2.23.D. Dodawanie użytkownika do konta grupy
Private Sub cmdDodajDoGrupy_Click() Dim wsp As DAO.Workspace Dim grupaP As DAO.Group On Error GoTo ErrorHandler Set wsp = DBEngine.Workspaces(0) Set grupaP = wsp.Groups("PERSONALNY") grupaP.Users.Append grupaP.CreateUser("Jan"
Exit Sub ErrorHandler:
MsgBox Err.Number & ": " & Err.Description
End Sub
328
Programowanie
Konta użytkowników i yiup
Użytkownicy Grupy [ Zmienianie hasł-a logowania Nazwa:
R ysunek 2.27. Konto grupy o nazwie Personalny zostało utworzone przez procedurę cmdDodajKontoGrupy_Click() w przykładzie 2.23.C
Sporządzanie wykazu użytkowników w poszczególnych grupach
Konto grupy może zawierać jednego lub więcej użytkowników. Aby spór: wykaz użytkowników w każdym istniejącym koncie grupy, uruchom procedm w przykładzie 2.23 .E.
Przykład 2.23.E. Sporządzanie wykazu użytkowników wchodzących w skład grupy
Private Sub cmdListaGrupyUżyt Click() Dim wsp As DAO.Workspace Dim mójU As DAO.User Dim mojaGrupa As DAO.Group Dim taGrupa As DAO.Group
lżenie i manipulowanie bazami danych za pomocą ADO
329
S et wsp = DBEngine.Workspaces(0) For Each mojaGrupa In wsp.Groups
Debug.Print "Konto grupy: " & mojaGrupa.Name Set taGrupa = wsp.Groups(mojaGrupa.Name) If taGrupa.Users.count < 1 Then
Debug.Print Chr(9) & "Nie znaleziono żadnych użytkowników." End If For Each mójU In taGrupa.Users
Debug.Print Chr(9) & mójU.Name Next
[ Next End Sub
Konta użytkowników i grup
JLJiil
Użytkownicy J Giupy 1 Zmienianie hasła logowania \
Użytkownik " ' Z
| Nazwa: pan
Nowa...
Usuń
Usuń hasło
|
laonkostwo grupy — Dostępne grupy: |
|
|
Członek grupy: |
|
Administratorzy ; |
PERSONALNY |
||
|
"personalny Użytkownicy |
Dodaj >> |
|
|
« Usuń |
|
|||
|
|
|
Drukuj użytkowników i grupy
C ancel
Rysunek2.28. Nowego użytkownika można dodać do istniejącego konta grupy, korzystając z interfejsu użytkownika lub za pomocą procedury VBA w przykładzie 2.23 .D
330
Programowanie w Access 200
U suwanie użytkowników z grup
Usunięcie użytkownika z istniejącego konta grupy jest bardzo proste. Wystara podać nazwę użytkownika, którego chcesz usunąć, oraz nazwę grupy, do której ti użytkownik aktualnie należy. Uruchom procedurę w przykładzie 2.23.F, aby usuną użytkowników, których utworzyłeś w poprzednich procedurach tego rozdziału. Zwij uwagę, że procedura ta woła funkcję o nazwie UsuńZGrupy, która dokonuje operat usuwania.
Przykład 2.23.F. Usuwanie użytkownika z konta grupy
Private Sub cmdUsuńZGrupy_Click() Dim strU As String Dim strGrupa As String
On Error GoTo Obsługa_Błędu
strU = InputBox("Wpisz nazwę użytkownika:",
"Likwidacja konta indywidualnego") strGrupa = InputBox("Wpisz nazwę grupy", "Usuń z grupy")
UsuńZGrupy strU, strGrupa
Exit Sub Obsługa_Błędu:
MsgBox Err.Number & ":
Exit Sub End Sub
" & Err.Description
Function UsuńZGrupy(kontolndyw, kontoGrupy) Dim mojaGrupa As DAO.Group Dim mójU As DAO.User Dim wsp As DAO.Workspace
On Error GoTo Obsługa_Błędu
Set wsp = DBEngine(0)
Set mójU = wsp.Users(kontolndyw)
mójU.Groups.Delete kontoGrupy MsgBox "Konto " & kontolndyw & " zostało usunięte z grupy" & kontoGrupy & "."
tworzenie i manipulowanie bazami danych za pomocą ADO
Exit Function Obsługa_Błędu:
If Err.Number = 3265 Then
MsgBox "Nie ma takiego użytkownika w grupie kontoGrupy & "."
Else
MsgBox Err.Number & ": " & Err.Description
End If
Exit Function I End Function
Hasła użytkowników
Jak już wcześniej wspomniano, przy zakładaniu nowego konta indywidualnego nie konieczne jest podanie hasła użytkownika. Jeżeli utworzyłeś kilka kont indywidualnych z hasłem i bez hasła, możesz sporządzić procedurę VBA, aby dowiedzieć się, który z użytkowników nie posiada hasła. Procedura w przykładzie 2.23 .G korzysta i pętli For...Each w celu pobrania nazw użytkowników ze zbioru users. Aby dowiedzieć się, czy dany użytkownik posiada hasło, procedura tworzy nowy obszar roboczy (Workspace) i próbuje załogować się, stosując nazwę użytkownika oraz hasło w postaci pustego łańcucha znaków (""). Jeżeli można się w ten sposób załogować, oznacza to, że dany użytkownik nie posiada hasła. Zmienna maHasło zostanie ustawiona na False. Procedura kończy się sporządzeniem w oknie Instrukcje bezpośred-i nie wykazu użytkowników nie posiadających hasła.
Przykład 2.23.G. Sporządzanie wykazu użytkowników bez hasła
p rivate Sub cmdBezHasła_Click () Dim wksDef As DAO.Workspace Dim wks As DAO.Workspace Dim mójU AS DAO.User Dim strNazwaU As String Dim maHasło As Boolean
domyślny obszar roboczy drugi obszar roboczy
On Error GoTo Obsługa_Błędu
Set wksDef = DBEngine.Workspaces(0)
■pobierz nazwy użytkowników ze zbioru Users
332
Programowanie w Access 200|
s trNazwaU = mójU.Name
If strNazwaU <> "Creator" And strNazwaU <> "Engine" Then maHasło = False
' Spróbuj załogować się do drugiego obszaru roboczego ' podając pusty łańcuch znaków w charakterze hasła ' jeżeli hasło jest nieprawidłowe, idź do etykietki Obsługa BłędJ
Set wks = DBEngine.CreateWorkspace("BezHasła",
strNazwaU, "")
'jeżeli można się załogować to użytkownik ten nie ma hasła If maHasło = False Then
Debug.Print "Bez hasła: " & strNazwaU End If End If Next
Exit Sub Obsługa_Błędu:
If Err.Number = 3029 Then ' użytkownik ma hasło maHasło = True Resume Next End If
MsgBox Err.Number & ": " & Err.Description End Sub
Uprawnienia indywidualne i grupowe
W Microsoft Access istnieją dwa typy uprawnień. Uprawnienia sugerowane (In plicit permissions) to uprawnienia, które posiada się z tytułu przynależności do okre słonej grupy. Uprawnienia bezpośrednie (Explicit permissions) to uprawnienia, 1 są bezpośrednio przypisane danemu użytkownikowi. Aby ułatwić sobie zarządzani uprawnieniami do bazy danych, należy najpierw przypisać uprawnienia poszczegól nym kontom grupowym, następnie zaś umieścić określonych użytkowników w tyci grupach. W ten sposób będzie można zmienić uprawnienia na poziomie grupy potrzeby zmiany uprawnień każdego użytkownika Zanim będziesz mógł przyzna uprawnienia do obiektów bazy danych, musisz zapoznać się z dwoma obiektami. Js den z tych obiektów nosi nazwę Container, drugi zaś Document.
W aplikacji Microsoft Access znajduje się zbiór o nazwie containers, któl przechowuje następujące obiekty typu container: Databases (bazy danych), Table] (tabele), Relations (Relacje), Forms (Formularze), Reports (Raporty), Module (Mm
Tworzenie i manipulowanie bazami danych za pomocą ADO
333
d uły), oraz Scripts (Skrypty). Obiekt Container zawiera informacje dotyczące bazy danych oraz dane dotyczące każdego zachowanego tej bazie formularza, modułu, relacji, raportu, makra, tabeli i kwerendy. Obiekt Container posiada kilka właściwości przydatnych przy przyznawaniu uprawnień i praw własności do bazy danych oraz jej obiektów (na przykład właściwość Permissions, właściwość owner, właściwość userName oraz właściwość inherit). Każdy obiekt Container posiada zbiór o nazwie Documents, który zawiera obiekty typu Document. Z kolei każdy obiekt Document przechowuje informacje dotyczące pojedynczego dokumentu. Procedura w przykładzie 2.29.A demonstruje, w jaki sposób przy użyciu struktury pętli można sporządzić wykaz uprawnień do bazy danych przyznanych użytkownikowi Admin. Procedura ta również podaje wykaz wszystkich dokumentów przechowywanych w każdym obiekcie typu container.
• IrmDAO Przyk6 : Formularz
,
Bezpieczeństwo danych / obsługa transakcji
Obszary Robocze | Użytkownicy i grupy Uprawnienia użytkowników/grup | Transakcje [
a
Sporządź
wykaz obiektów Container, Document
oraz
uprawnień
użytkownika Admin
CT~L
Daj
uprawnienie do
jfc
I wymazywania rekordów
z
^™ tabeli
!|: ■
C
I
Sprawdź
wszystkie
LJ uprawnienia
D I Sprawdź uprawnienia do LJ określonego obiektu
R ysunek 2.29. Przyznawanie uprawnień użytkownikom oraz grupom
Przykład 2.29.A. Sporządzenie wykazu obiektów Container oraz Document oraz uprawnień użytkownika Admin
Private Sub cmdListaContainers_Click ()
334
Programowanie w Access 2(1
Dim mójCont As DAO.Container Dim mójDoc As DAO.Document Dim prp As DAO.Property
For Each mójCont In DBEngine(0)(0).Containers Debug.Print "Container: " & mójCont.Name Debug.Print "Właściwości obiektu " & mójCont.Name
Debug.Print " "
For Each prp In mójCont.Properties Debug.Print " " & prp.Name _
& " = " & prp Next prp
Debug.Print " "
Debug.Print "Dokumenty w kontenerze " & mójCont.Name & For Each mójDoc In mójCont.Documents
Debug.Print "Nazwa dokumentu: " & mójDoc.Name _ & "(" & mójDoc.LastUpdated & ")" Next mójDoc Debug.Print "========================j======"
Next mójCont End Sub
Po uruchomieniu powyższej procedury otwórz okno Instrukcje bezpośredn aby obejrzeć jej rezultat:
Container: Forms Właściwości obiektu Forms
N ame = Forms Owner = admin UserName = admin Permissions = 1048575 AllPermissions = 1048575 Inherit = True
D okumenty w kontenerze Forms:
Nazwa dokumentu: frmDAO_Przykl(1999-11-02 22:26:01)
Nazwa dokumentu: frmDAO_Przyk2(1999-11-03 22:26:59)
Nazwa dokumentu: frmDAO_Przyk3(1999-11-03 22 32:25)
Nazwa dokumentu: frmDAO_Przyk4(2000-01-19 22 35:30)
Tworzenie i manipulowanie bazami danych za pomocą ADO
335
N azwa dokumentu: frmDAO_Przyk5(1999-11-13 00:50:29) Nazwa dokumentu: frmDAO_PrzYk6(1999-11-17 01:17:54) Sazwa dokumentu: frmKlienci (2000-05-01 21:24:33)
U waga: Ustawienie właściwości Permissions na 1048575 wskazuje, że użytkownik o nazwie Admin posiada pełne uprawnienia do określonego obiektu container.
Z miana właściciela obiektu
Możesz przenieść prawa własności do określonego obiektu (tabeli, kwerendy, formularza, raportu lub skryptu) na innego użytkownika, wybierając Narzędzia => Zabezpieczenia =» Uprawnienia użytkowników i grup oraz uaktywniając zakładkę Zmienianie właściciela, lub możesz to uczynić programatycznie, tak jak to przedstawia procedura w przykładzie 2.29. B.W procedurze tej użytkownik Jan zostaje nowym właścicielem formularza o nazwie frmDAOExl.
Przykład 2.29.B. Zmiana właściciela formularza
Private Sub cmdZmieńWł_Click () Dim nowyWł As String Dim ObjTyp As String Dim ObjNazwa As String
J
On
Error GoTo Obsługa_Błędu
nowyWł = "Jan" Ob j Typ = "Forms" ObjNazwa = "frmDAO_Przykl"
'zawołaj funkcję ZmieńPrawa przedstawioną poniżej ZmieńPrawa nowyWł, ObjTyp, ObjNazwa Exit Sub Obsługa_Błędu:
MsgBox Err.Number & ": " & Err.Description
Bnd Sub
Funkcja ZmieńPrawa wołana przez procedurę w przykładzie 2.29.B podana jest poniżej. Zwróć uwagę na to, że aby sprawdzić, czy dany użytkownik posiada upraw-
336
Programowanie w Ao
n ienie do zmiany praw własności obiektu, należy porównać właściwość aiip sions danego dokumentu ze stałą dbSecWriteOwner przy użyciu operatora i jak w przykładzie poniżej:
If (doc. AllPermissions And dbSecWriteOwner) o 0 Then....
Jeżeli rezultat tego porównania jest prawdziwy (oO) , oznacza to, że użytto jest autoryzowany do zmiany praw własności obiektów bazy danych.
Function ZmieńPrawa(nowyWł, ObjTyp, ObjNazwa) Dim db As DAO.Database Dim cont As DAO.Container Dim doc As DAO.Document
On Error GoTo Obsługa_Błędu
Set db = CurrentDb
Set cont = db.Containers(ObjTyp)
Set doc = cont.Documents(ObjNazwa)
'sprawdź czy posiadasz uprawnienie do zmiany praw własności obiekt! If (doc.AllPermissions And dbSecWriteOwner) o 0 Then doc.Owner = nowyWł MsgBox "Nowy właściciel: " & nowyWł,. , ObjTyp & ": "
& ObjNazwa Else
MsgBox "Nie posiadasz uprawnień do zmiany praw własności.' "Skontaktuj się z administratorem bazy danych." Exit Function End If
Exit Function Obsługa_Błędu:
MsgBox Err.Number & ": " & Err.Descripti.on End Function
Sprawdzanie uprawnień do obiektów
Aby sprawdzić, czy dany użytkownik posiada uprawnienia do konkretnej obiektu bazy danych, można otworzyć okno dialogowe Uprawnienia użytkownik i grup (wybierz Narzędzia => Zabezpieczenia, Uprawnienia użytkownik
i grup), lub uruchomić procedurę w przykładzie 2.29.C. Procedura ta prosi o podanie nazwy użytkownika po czym sprawdza wszystkie obiekty Container oraz Document i wypisuje uprawnienia do każdego z dokumentów. Sprawdź rezultat tej procedury w oknie Instrukcje bezpośrednie. Zero (0) oznacza, że użytkownik nie posiada żadnych praw dostępu do danego obiektu.
11*1
Uprawnienia
Obiekt:
Zmienianie
właściciela
IlimjllriF^Mi "T-— —
jfrmDA0_Przyk2 !frmDA0_Przyk3 frmKlienci frmDA0_Przyk5 frmDAO_Przykć frmDA0_Przyk4
Typ obiektu: (Formularz
Bieżący właściciel:
.■■■ ■■:. ■■ .
Administrator Administrator Administrator Administrator Administrator Administrator
Nowy właściciel: [Administrator
Lista: C Grupy
Użytkownicy
Zmień właściciela
Bieżący użytkownik: Administrator
R ysunek 2.30. Prawa własności do obiektu formularza (frmDAOPrzykłl) przypisane użytkownikowi o nazwie Jan przez procedurę w przykładzie 2.29.B
Przykład 2.29.C. Sprawdzanie uprawnień użytkownika
private Sub cmdSprawdźUprawnienia__Click () DimmójCont As DAO.Container DimmójDoc As DAO.Document Dim strNazwaU As String
338
Programowanie w AccesslJ
s trNazwaU = InputBox("Wpisz nazwę użytkownika:",
"Sprawdź uprawnienia") If strNazwaU = "" Then Exit Sub For Each mójCont In DBEngine(0)(0).Containers Debug.Print "Container: " & mójCont.Name For Each mójDoc In mójCont.Documents
Debug. Print Chr(9) & "Nazwa dokumentu: " & mój Doc. Name mójDoc.UserName = strNazwaU Debug.Print mójDoc.Permissions Next Next End Sub
Sprawdzanie uprawnień do konkretnego obiektu bazy danych
Możesz programatycznie sprawdzić, czy dany użytkownik posiada określa uprawnienie do konkretnego obiektu bazy danych. Na przykład procedt w przykładzie 2.29.D demonstruje, w jaki sposób można sprawdzić, czy określa użytkownik jest autoryzowany do ustalania tabeli tblKiienci w bieżącej bazie i nych. Aby to zrobić, właściwość AiiPermissions jest porównana ze stałąonazii dbsecDeleteData przy użyciu operatora and, według wzoru poniżej:
If (mójDoc .Permissions And dbsecDeleteData) > 0 Then ....
Jeżeli rezultat polecenia if jest prawdziwy, oznacza to, że dany użytkownil prawo wymazywania danych z określonej tabeli.
Przykład 2.29.D. Sprawdzanie uprawnień do konkretnego obiektu
Private Sub cmdSprawdźUprawDoUsuwania_Click() Dim db As DAO.Database Dim mójCont As DAO.Container Dim mójDoc As DAO.Document Dim strNazwaU As String
On Error GoTo Obsługa_Błędu
Set db = CurrentDb
Set mójCont = db.Containers("Tables")
S et mój Doc = mójCont .Documents (" tblKlienci" ] ■rNazwaU = InputBox("Wpisz nazwę użytkownika", "Sprawdź uprawnienia")
mójDoc.UserName = strNazwaU
If (mójDoc.Permissions And dbSecDeleteData) > 0 Then Debug.Print Chr(9) & "Autoryzowany"
Else
Debug.Print "Nie autoryzowany"
End If
Debug.Print mójDoc.Permissions
Exit Sub Obsługa_Błędu:
MsgBox Err.Number & ": " & Err.Description
End Sub
Przyznawanie określonych uprawnień kontom grupowym
Procedura w przykładzie 2.29.E ilustruje, w jaki sposób można przyznać grupie Personalny uprawnienie do usuwania tabeli w bieżącej bazie danych. Każdy członek grupy Personalny będzie automatycznie posiadał prawo do usunięcia określonej tabeli w tej bazie danych.
Przykład 2.29.E. Przyznawanie grupie uprawnienia do usunięcia obiektu
private Sub cmdDajPrawoDoUsuwania_Click() Dim db As DAO.Database Dim doc As DAO.Document Dim strTabela As String Dim strKontoIndywLubGrupy As String
strKontoIndywLubGrupy = "Personalny" strTabela = "tblKlienci"
Set db = CurrentDb
Set doc = db.Containers("Tables").Documents(strTabela)
doc.UserName = StrKontoIndywLubGrupy
doc.Permissions = doc.Permissions Or dbSecDeleteData
End Sub
340
Programowanie w Access 20i
O bsługa transakcji
Transakcje w bazie danych są często stosowane przy wstawianiu lub usuwani danych z kilku powiązanych ze sobą tabel. Transakcja jest zespołem czynności, któj są wykonane i zatwierdzone w jednej serii stanowiącej całość. Jeżeli korzystał z bankomatu, to wiesz już, na czym polega obsługa transakcji. Za każdym razem pj podejmowaniu gotówki ze swojego konta bank odejmuje podebraną przez Ciebie sm mę z książeczki czekowej lub oszczędnościowej. Aby dana transakcja zakończyła sit pomyślnie, musisz otrzymać gotówkę, a twoje konto w banku musi otrzymać debet Transakcja jest dwustronną operacją. W danej transakcji muszą być wykonanie Ąo wszystkie instrukcje, albo żadne. Jeżeli jedna część transakcji się nie powiedzie,to cała transakcja zostanie anulowana.
m frmDAO_Przyk6 : FornmAtiv
Bezpieczeństwo danych / obsługa transakcji
Obszary Robocze j Użytkownicy i grupy | Uprawnienia użytkowników/gr jp Transakcje j
j Powiąż klientów j [z pracownikiem, j
D odaj nowe powiązania Klienci podlegający pracownikowi 3. Mor an (IdPracownika = 537847)
I dKlienta
A LFKI
BLAUS
DRACD
FRANK
KOENE
IFHMS
"fj
Id klienta [ Id pracownika | Data wpisu I Wpisał
BERGS FOLKO
537847 537847
dbo
1999-11-13 \ 1999-04-02
R ysunek 2.31. Zastosowanie transakcji (Przykład 1)
Kiedy daną transakcję trzeba odwołać lub anulować, to mówi się że daną trans-j akcję cofnięto (Rolled back). Przy dokonywaniu masowych zmian w tabelach bazy danych w chwili wystąpienia błędu wszystkie zmiany wprowadzone w tabelach muszą być cofniętne, aby dana baza danych pozostała w stanie nienaruszonym. Obiekt workspace dysponuje trzema metodami umożliwiającymi programatyczną obsługę trans-
a kcji'. BeginTrans, CommitTrans, oraz RoiioacK. jmi,jO
określenia miejsca rozpoczęcia transakcji. Skorzystaj z metody commitTran, aby zatwierdzić wprowadzone zmiany. W razie wystąpienia błędu w transakcji, instrukcja Rollback umożliwi anulowanie zmian wprowadzonych w transakcji od momentu instrukcji BeginTrans. Rollback anuluje zmiany i przywraca stan sprzed rozpoczęcia transakcji. Ponieważ nie wszystkie obiekty Recordset mogą obsługiwać transakcje, należy skorzystać z właściwości Transactions obiektu Recordset, aby dowiedzieć się, czy dany obiekt posiada możliwość obsługi transakcji.
Procedura w przykładzie 2.31.A demonstruje, w jaki sposób można zastosować transakcję przy dodawaniu nowych rekordów do tabeli bazy danych na podstawie informacji przechowywanych winnej tabeli. Tabela o nazwie NiemieccyKlienci zawiera identyfikatory tych klientów, którzy muszą być powiązani z określonym identyfikatorem pracownika (idPracownika). Procedura odczytuje każdy rekord z tabeli KiemieccyKlienci i tworzy nowy rekord w tabeli o nazwie Powiązania. Operacja ta wymaga użycia metody AddNew obiektu Recordset oraz wpisania danych w czterech polach. Zwróć uwagę, że procedura zastawia dwie pułapki na błędy. Jedna z nich, GłównaObsługaBłędu, przejmie błędy zachodzące poza transakcją. Przypuśćmy, że wpisałeś nieprawidłową nazwę tabeli NiemieccyKlienci. W trakcie wykonywania tej procedury Visual Basic nie będzie mógł przypisać zawartości zmiennej rstl, wobec czego przejdzie do instrukcji znajdujących się poniżej etykietki GłównaObsługaBłędu. Jeżeli natomiast błąd wystąpi w trakcie wykonywania transakcji, to Visual Basic przejdzie do procedury obsługi błędu err_Rollback i wykona instrukcję Rollback, która anuluje całą transakcję. Rezultat wykonania procedury cmdAssociatec-lients_click w przykładzie 2.31.A przedstawiony jest na rysunku 2.32.
Pit
yklad
2.31.A.
Zastosowanie
transakcji (Przykład
1)
Prlvate Sub cmdPowiążKlientów_Click() DlmmojaDb As DAO.Database Dim rstl As DAO.Recordset Dim rst2 As DAO.Recordset Dim IdPrac As String
On Error GoTo GłównaObsługaBłędu
qet mojaDb = CurrentDb
set rstl = InojaDb.OpenRecordsetrNiernieccyKlienci
set rst2 = mojaDb.OpenRecordset("Powiązania") IdPrac = -537847"
BeginTrans
342
Programowanie w Access 2
O n Error GoTo err_Rollback With rstl
Do Until .EOF
Debug.Print rstl!IdKlienta With rst2
.AddNew
rst2!IdKlienta = rstl!IdKlienta rst2!IdPracownika = IdPrac rst2IDataWpisu = Now()
1 usuń znak komentarza w następnej instrukcji, aby spowodować! ' cofnięcie transakcji
'rst2IWpisanoPrzez = "mójld" rst2IWpisanoPrzez = "mójld" .Update End With rstl.MoveNext Loop
End With CommitTrans
rstl.Close Set mojaDb = Nothing Me.lboxPowiazania.Requery
Me.ZmieńEtykietkę.Caption = "Usuń powiązania" Me.cmdUsuńPowiązania.Enabled = True Me.cmdUsuńPowiązania.SetFocus Me.cmdPowiążKlientow.Enabled = False Exit Sub GłownaObsługaBłędu:
MsgBox Err.Number & ": " & Err.Description Exit Sub err_Rollback: Rollback MsgBox "Transakcję anulowano.", _
vbOKOnly + vbExclamation, "Nieoczekiwany błąd" rstl.Close Set myDb = Nothing End Sub
orzenie i mani
pulowanie bazami danych za pomocą ADO
użytkowników/grup Transakcje |
Bezpieczeństwo danych / obsługa transakcji
Obszaryjętoczej Uży
U suń powiązania
[ dKlientą_
ALFKI
BLAU5
IDRACD
FRANK
.KOENE
zl
Klienci podlegający pracownikowi 3. Hor an (IdPracownika = S3784?)
| Id pracownika
537347 :537847
537847
537847
537847 :537R47
Id klienta
BERGS
FOLKO
ALFKI
BLAU5
DRACD
frank:
[Data wpis* i | Wpisał 1999-11-13 dbo 1999-04-02 dbo 2002-02-12 OOimójId 2002-02-12 00:: mójld 2002-02-12 00: mójld ?nn?-n?-i ? nn:: mńitH
Rysunek 2.32. Zastosowanie transakcji (Przykład 2)
I
przykładzie.
Przykład 2.31.B. Zastosowanie transakcji (Przykład 2)
private Sub cmdUsuńPowiązania_Click () Dimm0jaDb As DAO.Database Dim rstl As DAO.Recordset Dim IdPrac As String Dim strSQL As String On Error GoTo err_UsuńPowiązania
I dPrac = "537847" BeginTrans
Do Until rstl.EOF
344
Programowanie w Access 2(fl
D ebug.Print rstl!IdKlienta strSQL = "DELETE FROM Powiązania " _
& "WHERE ([IdKlienta] = ' _
& rstl!IdKlienta & ' ) And "
& "(Powiązania.[IdPracownika]) = """ &
IdPrac &
Debug.Print strSQL
mojaDb.Execute strSQL, dbFailOnError rstl.MoveNext Loop
CommitTrans rstl.Close Set mojaDb = Nothing With Me
.lboxPowiazania.Requery
.ZmieńEtykietkę.Caption = "Dodaj nowe powiązania" .cmdPowiążKlientów.Enabled = True .cmdPowiążKlientów.SetFocus .cmdUsuńPowiązania.Enabled = False End With Exit Sub
err_UsuńPowiązania: Rollback MsgBox "Transakcję cofnięto.",
vbOKOnly + vbExclamation, "Nieoczekiv/any błąd" End Sub
Podsumowanie
W tym rozdziale znalazło się szereg przykładów użycia obiektów DAO (Da1 Access Objects). Korzystając z informacji omówionycłt w tym rozdziale, możesz t sporządzić całą nową bazę danych programatycznie. Jednakże o wiele łatwiej jestwy-J konać niektóre spośród czynności zademonstrowanych przez procedury tego rozdzia-1 łu, posługując się wbudowanym interfejsem użytkownika. Zatem rosądniej będzie! wykonywać proste czynności, takie jak tworzenie kwerend czy relacji między tabela-J mi za pomocą systemu menu w aplikacji Microsoft Access, i używać DAO w celu! automatyzacji bardziej skomplikowanych czynności. Przyglądając się ponownie pro-i cedurom tego rozdziału, nie trudno zauważyć, że z punktu widzenia użytkownika najlepszym zastosowaniem dla DAO jest manipulowenie danymi oraz obsługa transakcji.
R ozdział 3
Tworzenie i manipulowanie bazami danych za pomocą ADO
Microsoft Access 2000 posiada więcej niż jedną metodę dostępu do baz danych. W poprzednim rozdziale poznałeś zasady korzystania z obiektów, właściwości i metod DAO (Data Access Objects). DAO jest obecnie wychodzącym już z mody sposobem dostępu do danych i manipulowania nimi. Chociaż DAO jest bardzo wydajne w odniesieniu do rodzimych baz danych Microsoft Jet, sugerowanym sposobem wykonywania zadań programatycznych w odniesieniu do baz danych jest korzystanie ztnodelu obiektów ADO (ActiveX Data Objects). ADO współpracuje z nową technologią określaną terminem OLE DB. Technologia ta oparta jest na obiektach, ale nie dotyczy jedynie relacyjnych baz danych. W rozdziale drugim dowiedziałeś się w jaki sposób możesz skorzystać z ODBC (Open Database Connectivity) i obiektów DAO, aby przesłać polecenia bezpośrednio do serwera w celu pobrania danych. Podczas gdy ODBC zostało stworzone w celu ułatwienia dostępu do relacyjnych baz danych, OLE DB jest w stanie dotrzeć do danych pochodzących zarówno z relacyjnych i nie-relacyjnych źródeł danych, takich jak usługi katalogowe (ang. directory services), magazyny pocztowe (ang. mail stores), aplikacje multimedialne (ang. multimedia), pliki tekstowe, oraz dane przechowywane w centralnych komputerach (systemy VSAM oraz MVS). Aby dotrzeć do danych zewnętrznych za pomocą ODBC, na komputerze zawierającym źródło danych musi być zainstalowany odpowiedni sterownik ODBC. W odróżnieniu od ODBC, OLE DB nie używa sterowników w celu nawiązania komunikacji z magazynem danych. OLE DB korzysta z tak zwanych dostawców danych. Dostawcami danych są programy, które umożliwiają dostęp do danych. OLE DB posiada wielu dostawców, na przykład, Microsoft OLE DB Provider dla Serwera SQL | czy też Microsoft Jet 4.0 OLE DB Provider. Istnieją również specjalni dostawcy dla serwera Oracle, NT 5 Active Directory oraz ODBC.
Główny model obiektów OLE DB nosi nazwę ActiveX Data Objects (ADO). ! W odróżnieniu od DAO, który składa się z pojedynczej biblioteki obiektów, ADO za-I wiera trzy biblioteki obiektów; każda z nich reprezentuje inną funkcjonalność (zobacz
J
-J
346
Programowanie w Access 20M
tabelę 3.1). Dzięki takiemu podziałowi jedynie obiekty potrzebne do wykonania spl cyficznego zadania muszą być w danej chwili władowane.
Tabela 3.1 Komponenty modelu obiektów ActiveX Data Objects.
Model obiektów
Zastosowanie
A DODB
(ActiveX® Data Objects)
MANIPULACJE DANYMI
Dostęp i manipulowanie danymi za pomocą dostawcy OLE DB. Za pomocą obiektów ADO można połączyć się ze źródłem danych, odczytywać, dodawać, modyfikować i wymazywać dane
ADOX
(ADO Extensions for DDL
and Security)
DEFINICJA DANYCH I BEZPIECZEŃSTWO DANYCH I Za pomocą odbiektów ADOX można definiować tabele, wido- I ki, indeksy, oraz tworzyć i modyfikować konta użytkowników I i grup
JRO
(Jet and Replication Objects)
REPLIKACJA
Za pomocą obiektów JRO można tworzyć, modyfikować i dokonywać synchronizacji replik. JRO można używać tylko w odniesieniu do baz danych Microsoft Jet
Biblioteka obiektów ADODB jest najczęściej używaną biblioteką ze wzlędu na to, że umożliwia ona pobieranie i manipulowanie danymi. Jej obiekty przedstawione I są na rysunku 3.1. Jeśli porównasz tę bibliotekę obiektów z biblioteką wykorzystywaną przez przez DAO (zob. Rozdział 2), to zapewnię zdziwi cię taka mała liczba \ obiektów. Jak można wykonać wszystkie zadania związane z bazami danych korzy-1 stając z tak ograniczonej liczby obiektów? Jak się wkrótce przekonasz, im mniej I obiektów tym lepiej. Nie trzeba się tyle uczyć i znacznie łatwiejsze jest je używać (po I tym jak się do nich nieco przyzwyczaisz).
Jeżeli zainstalowałeś Microsoft Access 2000 lub jakąkolwiek inną aplikację wchodzącą w skład pakietu Office 2000, serwer Microsoft SQL Server 7.0, lub przeglądarkę Internet Explorer 5.0, to powinienneś mieć na swoim komputerze zainstalowaną bibliotekę ADO 2.1. Jeżeli korzystasz z systemu operacyjnego Windows 2000, to posiadasz wersję 2.5. Ustawienie wyjściowe w aplikacji Microsoft Access 2000 powoduje, że bazy danych Accessa automatycznie odwołują się do obiektów ADO. i Aby upewnić się, że posiadasz odwołanie do biblioteki obiektów ADODB, lub aby ustawić odwołanie do bibliotek ADOX i JRO, wykonaj teraz następujące czynności:
Tworzenie i manipulowanie bazami danych za pomocą ADO
347
1 , W oknie bazy danych, wybierz przycisk Moduły (Modules) i kliknij Nowy
(New).
Z
menu edytora Microsoft Visual
Basic,
wybierz Narzędzia
=> Odwołania (To
ols
=>
References).
Upewnij
się,
że biblioteka obiektów Microsoft
ActiveX
Data Objects 2.1
Li
brary
lub
Microsoft
ActiveX
Data Objects 2.5
Library
jest
zaznaczona.
Jeżeli
nie
możesz jej znaleźć, sprawdź całą listę korzystając z suwaka
przewijania. Po
odnalezieniu
nazwy biblioteki w spisie, kliknij na klatkę po lewej stronie
nazwy,
aby
ją wybrać.
4, Kliknij
na pole wyboru po lewej stronie biblioteki o nazwie Microsoft
ADO
Ext.
2.1
for
DDL and Security.
5 Zazncz również bibliotekę Microsoft Jet and Replication Objects 2.1 Library.
16. Kliknij OK.
Patrz leż
[ połączenie
M Błedy
"□
Polecenie
P arametry
Parametr
—(Zestaw rekordów
P ola
Pole
K ażdy z obiektów ma kolekcję cech (Properties)
P ołączenie
Polecenie
Z estaw rekordów
P ole
C echy
Cecha
Rysunek 3.1. Model obiektów ADO
rv^H
348
Programowanie w Access 21
Aby dokładnie określić, z którego modelu obiektów korzystasz (DAO czy ADH wpisz w deklaracji zmiennych kwalifikator przed nazwą obiektu. Na przykład,
'następująca deklaracja wskazuje, że obiekt rst (Recordset) pochodził biblioteki obiektów ADO Dim rst As ADODB.Recordset
'następująca deklaracja wskazuje, że obiekt rst (Recordset) pochodzi] biblioteki obiektów DAO Dim rst As DAO.Recordset
Jeżeli pominiesz kwalifikator określający nazwę biblioteki obiektów to VM wybierze obiekt z biblioteki obiektów, która wymieniona jest pierwsza w wykazieB bliotek w oknie dialogu Odwołania (References).
Po tym krótkim wstępie, przystąpimy teraz do programowania przy użyciu Mm
Dostęp do danych przy użyciu ADO
iii
Dostęp do danych i manipulowanie nimi w sposób programatyczny przy użyci ADO wymaga nawiązania łączności z odpowiednim źródłem danych. Silnik bazy danych Microsoft Jet umożliwia dotarcie do danych, które znajdują się w bazach danycl Microsoft Jet, zewnętrzych źródłach danych (takich jak Microsoft Excel, Paradox, czyj też dBase), oraz w źródłach dostępnych poprzez sterowniki ODBC. Następujące pod-rozdziały demonstrują różne sposoby otwierania zarówno rodzimych baz danych Microsoft Jet, jak i źródeł zewnętrzych. Dodatkowo dowiesz się, w jaki sposób można nawiązać łączność z bazą danych, która jest obecnie otwarta, połączyć się z serwerem SQL, utworzyć nową bazę danych i ustawić jej właściwości, oraz zapobiegać błędom występującym w bazach danych. Rysunek 3.2 ilustruje treść twojego pierwszego spotkania z ADO.
iipulowanie bazami danych za pomocą ADO
EJ C Arkusz Microsoft Excel _fJ r Tabelę dBase IV g! ^ Plik tekstowy
Dostcp
do danych ADO \
Tabele
oraz pola | Klucze, indeksy, oraz relacje
otwórZ
rodzimą bazę danych (Microsoft M) Otwórz
zewnętrzną bazę danych
p\ & i« trybie do odczytu-zapisu
B !« tylko do odczytu
Cl ® zabezpieczoną hasłem
£j $ zabezpieczoną na poziomie użytkownika
R ysunek 3.2. Dostęp do danych w ADO
zapisu
Przed otwarciem
z nią łączność
Otwieranie bazy danych Microsoft Jet w trybie do odczytu-
„kreś,o„ej bazy danych , procedury VBA „alety nawiać Lrzysaj w rym celu z obiektu ADO Connection.
Zacznij
ii
od deklaracji zmiennej obiektowej typu Connection:
Dim conn
As ADODB.Connection
cjalizuj Zm« obieca pomoc, s.owa kluczowego Set:
350
Programowanie w Access 20H
S et conn = New ADODB.Connection
3. Skorzystaj z właściwości Provider obiektu Connection, aby wskazać nazwę dj.! stawcy OLE DB, który ma być użyty do połączenia się ze źródłem danych. Podaj inne konieczne informacje umożliwiające nawiązanie łączności (na przykład ścieżkę dostępu do pliku bazy danych), korzystajcie z właściwości Connection.! String obiektu Connection.
With conn
.Provider = "Microsoft.Jet.OLEDB.4.0; " .ConnectionString = "Data Source=" & mojaDB End With
W tym przykładzie, mojaDB jest zmienną typu String, która przechowuje ścieżkę dostępu do pliku bazy danych:
mojaDB = "C:\Program Files\Microsoft Of£ice\Office\Samples\ Nor-thwind.mdb"
4. Zastosuj metodę Open obiektu Connection, aby otworzyć łączność ze źródłem danych.
conn.Open
Zapis synktaktyczny w ADO jest dosyć giętki. Możesz nawiązać oraz otworzyć \ łączność z bazą danych za pomocąjednej instrukcji, tak jak w przykładzie poniżej:
conn.Open "Provider= "Microsoft.Jet.OLEDB.4.0;"S _
"Data Source = C:\Program Files\Microsoft Office \Office\Samples\Northwind.mdb;"
W powyższym przykładzie informacja o sposobie połączenia się z bazą danych podana jest w charakterze pierwszego argumentu metody Open.
Tworzenie i manipulowanie bazami danych za pomocą ADO
351
iektu
Connection
po
to, aby wyraźnie
określić sposób dostępu do danych. Przyk.ad
3.2.A. Otwieranie bazy danych w trybie do odczytu-zap.u
(Rread-write)
sub
openA_ReadWrite()
Dim
conn
As ADODB. Connection
Dim
mojaDb As String
on
Error GoTo ErrorHandler
mojaDb
= "C:\Program
FilesXMicrosoft OfficeN
_
Tabela 3.2. Powszechnie stosowani dostawcy danych |
|
||
Nazwa dostawcy |
Właściwość |
Znaczenie |
|
Microsoft Jet |
Microsoft. Jet.OLEDB .4.0 |
Używany w odniesieniu do rodzimych baz danych Microsoft Jet 4.O. Ten dostawca otwiera bazę danych w trybie do odczytu-zapisu |
|
Microsoft SQL Server |
SQLOLEDB |
Umożliwia dostęp do baz danych na serwerach SQL Server 6.5, 7.0 oraz 2000 |
|
Oracle |
MSDAORA |
Umożliwia dostęp do baz danych na serwerze Oracle |
|
ODBC |
MSDASQL |
Umożliwia dostęp do źródeł danych ODBC, które nie mają specjalnego dostawcy OLE DB. ODBC jest domyślnym dostawcą dla ADO |
|
Active Directory Service |
ADSDSOObject |
Umożliwia dostęp do usług katalogowych Windows NT 4.0, Novell, oraz LDAP |
|
Index Server |
MSIDXS |
Daje tylko do odczytu dostęp do danych w sieci Web |
|
Przykład 3.2.A demonstruje,w jaki sposób można użyć ADO w celu otwarcia bazy danych do odczytu-zapisu. Metoda Open obiektu Connection tworzy domyślnie |
352
Programowanie w Access
& "Office\Samples\Northwind.mdb" ' Otwórz do odczytu-zapisu Set conn = New ADODB.Connection With conn
.Provider = "Microsoft.Jet.OLEDB.4.0; "
.Mode = adModeReadWrite
.ConnectionString = "Data Source=" & mojaDb
.Open End With
MsgBox "Nawiązano połączenie." conn.Close
MsgBox "Zamknięto połączenie." Exit Sub ErrorHandler:
MsgBox Err.Number & ": " & Err.Description End Sub
Sub OpenA_ReadWrite2()
Dim conn As ADODB.Connection
On Error GoTo ErrorHandler
' Otwórz do odczytu-zapisu
Set conn = New ADODB.Connection conn.Open "Provider=Microsoft.Jet.0LED3.4.0; " & _ "Data Source=C:\Program Files\Microsoft OfficeV & "Office\Samples\Northwind.mdb;" MsgBox "Nawiązano połączenie." conn.Close
MsgBox "Zamknięto połączenie." Exit Sub ErrorHandler:
MsgBox Err.Number & ": " & Err.Description End Sub
Otwieranie bazy danych Microsoft Jet w trybie tylko do odczytu
Aby otworzyć bazę danych tylko w trybie do odcz]/tu, należy przypisać właści-l wości Mode obiektu Connection stałą o nazwie adModeRead (zobacz Przykład 3.2.B).
I Tworzenie i manipulowanie bazami danych za pomocą ADO
353
J ak wspomniano wcześniej, w ADO bazy danych są domyślnie otwierane w trybie do I apisu-odczytu. Za pomocą ośmiu stałych możesz jednak sam kontrolować typ dostępu do danych (zobacz tabelę 3.3 poniżej).
Msla3.3. Ustawienia właściwości Mode obiektu |
Connection |
|
Rodzaj praw dostępu |
Wartość |
Nazwa stałej |
Nie podano uprawnień |
0 |
adModeUnknown |
Uprawnienia tylko do odczytu (Read-only) |
1 |
AdModeRead |
Uprawnienia tylko do zapisu (Write-only) |
2 |
adModeWrite |
Uprawnienia do zapisu-odczytu (Read/write) |
3 |
AdModeReadWrite |
Uniemożliwia innym osobom otwarcie połączenia i uprawnieniami do odczytu |
4 |
adModeShareDenyRead |
Uniemożliwia innym osobom otwarcie połączenia z uprawnieniem do zapisu |
8 |
adModeShareDenyWrite |
Uniemożliwia innym osobom otwarcie połączenia |
16 |
adModeShareDenyNone |
Uniemożliwia innym osobom otwarcie połączenia zjakimikolwiek uprawnieniami |
12 |
adModeShareExclusive |
Przykład 3.2.B. Otwieranie bazy danych w trybie tylko do odczytu (Read-only)
Sub 0penB_ReadOnly ()
Dim conn As ADODB.Connection ■
Dim mojaDb As String
On Error GoTo Obsługa_Błędu
mojaDb = "C:\Program Files\Microsoft Offi-ce\Office\Samples\Northwind.mdb"
■ otwórz w trybie tylko do odczytu
Set conn = New ADODB.Connection
With conn
.Provider = "Microsoft.Jet.OLEDB.4.0; " .Mode = adModeRead
354
Programowanie w Access 1
.ConnectionString = "Data Source=" & mojaDb .Open
End With
MsgBox "Baza danych została otwarta tylko do odczytu."
conn.Close
MsgBox "Baza danych została zamknięta."
Exit Sub Obsługa_Błędu:
MsgBox Err.Number & ": " & Err.Description End Sub
Otwieranie bazy danych Microsoft Jet zabezpieczonej hasłem
Jeżeli bazę danych zabezpieczono hasłem, to na! eży podać w ramach właścin ści ConnectionString ustawienie właściwości Jet OLEDB:Database Password:
"Jet OLEDB:Database Password=sekret;"
W hasłach rozróżniane są małe i duże litery. Przykład 3.2.C demonstruje, wja| sposób można otworzyć przykładową bazę danych Northwind, po uprzednim zaj pieczeniu jej hasłem. Przed uruchomieniem przykładowej procedury, otwórz bazę M nych Northwind.mdb w trybie wyłączności (w pustyni oknie aplikacji Microsoft Ac-I cess wybierz Plik => Otwórz, odszukaj folder zawierający plik Northwind.mdb,* znacz nazwę tego pliku, kiliknij na strzałkę obok przycisku Otwórz, i wybierz Otwm z wyłącznością). Ustaw hasło bazy danych na „sekret" wybierając Narzędzia => Za>| bezpieczenia => Ustaw hasło bazy danych. Po ustawieniu hasła zamknij bazę dan™ Northwind.
Przykład 3.2.C. Otwieranie bazy danych zabezpieczonej hasłem
Sub OpenC_WithdBPassword()
Dim conn As ADODB.Connection
Dim mojaDb As String
On Error GoTo Obsługa_Błędu
mojaDb = "C:\Program Files\Microsoft OfficeV
"PL\Office\Samples\Northwind.mdb" Set conn = New ADODB.Connection With conn .Provider = "Microsoft.Jet.OLEDB.4.0; "
. ConnectionString = "Data Source=» & mojaDb & »;
.jet OLEDB:Database Password=sekret;"
.Open
End With
MsgBox "Otwarto bazę danych zabezpieczoną hasłem.
conn.Close
MsgBox "Zamknięto bazę danych."
Exit Sub Obsługa_Błędu:
MsgBox Err.Number & ": " & Err.Description
End Sub
Otwieranie bazy danych Microsoft Jet Database zabiezpieczo-nej na poziomie użytkownika
Aby otworzyć bazę danych, która została zabezpieczona na poziomie użytkownika należy podać następujące informacje:
! , Pełnąścieżkę dostępu do pliku informacjyjnego grupy roboczej I , Nazwę użytkownika , Hasło użytkownika
u informacje o grupach roboczych programu Microsoft Access
jeżeli po raz pierwszy tworzysz plik grupy roboczej.
Przykład 3.2.D. Otwieranie
bazy danych zabezpieczonej na poziomie użytkownika
Sub openD_UserSecurity()
Dim conn As ADODB.Connection Dim mojaDb As String Dim sysDb As String
356
Programowanie w Access 2QN
On Error GoTo Obsługa_Błędu
mojaDb = "C:\Program Files\Microsoft Ofi:ice\" & _ "Office\PL\Samples\Adresy.mdb"
sysDb = "C:\Program Files\Microsoft OfficeV & _ "Of f ice \ PL \ Samples \ Zabezpiecz ony.mdv/"
Set conn = New ADODB.Connection
With conn
.Provider = "Microsoft.Jet.OLEDB.4.0; " .ConnectionString = "Data Source=" & mojaDb & "Jet OLEDB:System Database=" & sysDb .Open , "Programista", "WebMaster"
End With
MsgBox "Otwarto bazę danych zabezpieczoną " & "na poziome użytkownika."
conn.Close
MsgBox "Baza danych została zamknięta."
Exit Sub Obsługa_Błędu:
MsgBox Err.Number & ": " & Err.Description End Sub
Zapis syntaktyczny w ADO jest dość swobodny. Ustawienia właściwości możn określić wieloma sposobami. Fragment kodu poniżej ilustruje, w jaki sposób za i mocą zbioru Properties obiektu Connection można uniknąć problemu z formatowa! niem długich ciągów znaków przy określeniu łańcucha połączenia. Zwróć uwagę nal to, że przed odwołaniem się ze zbioru Properties obiektu Connection należy najpierw wskazać nazwę dostawcy, z usług którego zamierzasz skorzystać.
With conn
.Provider = "Microsoft.Jet.OLEDB.4.0; "
.Properties("Jet OLEDB:System Database") = siysDb
.Open myDb, "Programista", "WebMaster"
End With
Otwieranie arkusza Microsoft Excel przy użyciu ADO
Korzystając z ADO i dostawcy o nazwie Microsoft Jet 4.0 OLE DB można otworzyć zewnętrzne źródła danych wspierane przez silnik bazy danych Microsoft Jet, W tym celu skorzystaj z właściwości Extended Properties obiektu Connection, j
; Tworzenie i manipulowanie bazami danych za pomocą ADO
357
przekazać łańcuch połączenia. Procedura poniżej demonstruje, w jaki sposób można otworzyć przy użyciu ADO poprzednią wersję arkusza Microsoft Excel 97 (wersja 8,0) o nazwie C:\Report.xls.
Przykład 3.2.E. Otwieranie arkusza Excela za pomocą ADO
| Sub OpenE_ExcelSpread ()
Dim conn As ADODB.Connection
Set conn = New ADODB.Connection
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;» & _
"Data Source=C:\Report.xls; " & _
"Extended Properties=Excel 8.0;"
MsgBox "Arkusz Excela został otwarty."
conn.Close
MsgBox "Zamknięto arkusz Excela."
lEnd Sub
Otwieranie pliku dBASE przy użyciu dostawcy MSDASQL
J
MSDASQL jest dostawcą Microsoft OLE DB dla ODBC. Dostawca ten pracuje z wszystkimi źródłami danych ODBC. Możesz skorzystać z MSDASQL w celu uzyskania dostępu do danych znajdujących się na przykład w pliku bazy danych dBase. Jak wiesz, przy łączeniu się z bazą danych za pomocą sterownika ODBC należy podać parametry połączenia. W tym celu należy sporządzić źródło danych (DSN - Data Source Name) przy użyciu programu administratora ODBC. Ikona ODBC znajduje się w panelu sterowania Windows. Jeżeli pracujesz w Windows 2000, otwórz narzędzia administracyjne w panelu sterowania i kliknij na ikonę Źródła danych (ODBC). Źródło danych (DSN) zawiera informacje dotyczące konfiguracji bazy danych, jej bezpe-czeństwa oraz miejsca jej przechowywania. Istnieją trzy typy DSN:
358
Programowanie w Access 20t|
D SN użytkownika (User DSN)
DSN użytkownika przechowywane jest lokalnie w rejestrze Windows orj pozwala połączyć się z bazą danych tylko użytkownikowi, który sporą 1 dził źródło danych
D SN pliku (File DSN)
Informacje dotyczące sposobu połączenia się ze źródłem danych są prze-chowywane w pliku z rozszerzeniem .dsn, z którego mogą korzystać różni użytkownicy. Plik ten przechowywany jest w katalogu Program Fi-les\Common Files\Odbc\Data Sources. DSN pliku można łatwo przetnie-ścić na inny serwer lub komputer poprzez skopiowanie odpowiedniego pliku .dsn
D SN systemu (System DSN)
DSN systemu przechowywany jest lokalnie w rejestrze Windows i umoż-l liwia dostęp do źródła danych wszystkim użytkownikom zalogowanymnaj określonym komputerze (serwerze)
P rocedura w przykładzie 3.1.F ilustruje sposób otwierania pliku bazy danycm dBASE (Customer.dbf) przy użyciu utworzonego źródła danych o nazwie PlikDbase, I Przed uruchomieniem tej procedury, otwórz Panel sterowania i kliknij na ikonę 0I» BC. Kliknij na zakładkę DSN użytkownika, oraz przycisk Dodaj. Wybierz Driver J Microsoft dBASE (*.dbf) i kliknij Koniec. Wpisz nazwę źródła danych (DSN) oral wersję bazy danych według wzoru poniżej. Usuń zaznaczenie w polu wyboru oboM Use Current Directory. Kliknij OK, aby zakończyć tworzenie nazwy źródła danych, I Skopiuj plik Customer.dbf z załączonego dysku do katalogu głównego na swoiił komputerze (C:\).
ODBC dBASE Setup
.::.:.„•.
Data Source Name: Description:
r D atabase
Version: ) dBase IV Directory: C:\
Select Directory...
Select Indexes...
OK
C ancel
Help
Use Current Directory
Options>> I
worzenie i manipulowanie bazami danych za pomocą ADO
359
I Przykład 3.2.F. Otwieranie pliku bazy danych dBase przy użyciu ADO
5ub OpenF_dBase () ■m conn As ADODB.Connection mim rst As ADODB.Recordset fet conn = New ADODB.Connection
conn. Open "Provider=MSDASQL;DSN=PlikDbase" Set rst = New ADODB.Recordset
rst.Open "Customer.dbf", conn, , , adCmdTable Do Until rst.EOF
Debug.Print rst.Fields (1) .Value rst.MoveNext
Loop
MsgBox "Nazwy klientów podano w oknie Instrukcje bezpośrednie."
Sub
Po połączeniu się z zewnętrznym źródłem danych (dBASE), procedura otwiera sstaw rekordów w oparciu o plik bazy danych dBase C:\Customers.dbf i odczytuje ości pierwszego pola każdego rekordu do okna Instrukcje bezpośrednie. Procedura id korzysta ze źródła danych użytkownika w celu połączenia się z zewnętrznym plikiem dBASE. DSN zawiera informacje dotyczącze nazwy i miejsca przechowywania pliku oraz wymaganego sterownika ODBC. Zamiast tworzyć DSN, możesz podać nazwę sterownika ODBC oraz serwera bezpośrednio w łańcuchu połączenia, tworząc połączenie bez DSN (ang. DSN-less connection). Wszystkie informcje dotyczące połączenia podane są w kodzie procedury przy użyciu parametrów „driver=" oraz „se-wr= " w łańcuchu połączenia. Na przykład, aby uzyskać dostęp do przykładowej ba-zv danych Northwind przy użyciu dostawcy MSDASQL, możesz skorzystać z następujących instrukcji:
i.Open "Provider=MSDASQL;" & _
|«Driver={Microsoft Access Driver (*.mdb)};" & _ .DBQ=C:\Program Files\Microsoft Office\Office\Samples\ Northwind. mdb; " & _ •UID=Admin; PWD= ; "
conn.
W powyższym przykładzie wszystkie informacje wymagane w celu uzyskania łączenia z bazą danych Northwind zostały podane w kodzie programu bez potrzeby :enia DSN. Poniżej pokazana jest procedura wykonująca te same czynności co dura w przykładzie 3.2.F., z tą różnicą, że nie potrzeba tworzyć źródła danych v celu uzyskania połączenia.
360
Programowanie w Acce
S ub OpenF_dBase_BezDSN{)
Dim conn As New ADODB.Connection
Dim rst As New ADODB.Recordset
conn.Open "DRIVER={Microsoft dBase Driver i*.dbf)};" & "DBQ=C:\;"
Debug.Print conn.ConnectionString
rst.Open "select * from [Customertdbf]", conn, adOpenStatic,
adLockReadOnly, adCmdText
Do Until rst.EOF
Debug.Print rst.Fields(1).Value rst.MoveNext Loop
conn.Close Set conn = Nothing
MsgBox "Nazwy klientów podano w oknie Instrukcje bezpośrednie. End Sub
Otwieranie pliku tekstowego przy użyciu ADO
Istnieje kilka sposobów otwierania plików tekstowych drogą programowania W tym zagadnieniu dowiesz się jak można uzyskać dostęp do pliku tekstowego pn użyciu sterownika o nazwie Microsoft Text Driver. Zwróć uwagę na to, że wszystkii informacje dotyczące połączenia podane są w kodzie procedury (jest to więc połączą nie nie wymagające sporządzenia źródła danych). Następująca przykładowa procedura otwiera zestaw rekordów w oparciu o plik tekstowy o nazwie C:\Pracownicy.txt i wp| suje zawartość tego pliku do okna Instrukcje bezpośrednie.
Przykład 3.2.G. Otwieranie pliku tekstowego przy użyciu ADO
Sub OpenG_TextFile() Dim conn As New ADODB.Connection Dim rst As New ADODB.Recordset Dim fid As ADODB.Field
Debug.Print conn.ConnectionString
conn.Open "DRIVER={Microsoft Text Driver (*.txt; *.csv)};" & "DBQ=C:\; "
I
Tworzenie i
ie i
manipulowanie bazami danych za pomocą
ADO
361
r st.Open "select * from [Pracownicyttxt]", conn, adOpenStatic, _ adLockReadOnly, adCmdText Do Until rst.EOF
For Each fid In rst.Fields
Debug.Print fid.Name & "=" & fid.Value
Next fid rst.MoveNext
Loop
conn.Close Set conn = Nothing MsgBox "Dane zostały wpisane w oknie Instrukcje bezpośrednie."
Łid Sub
Łączenie się z bieżącą bazą danych Microsoft Access
Aby zwrócić odwołanie do bieżącej bazy danych przy użyciu ADO, skorzystaj zobiektu CurrentProject.Connection, tak jak przedstawiono przykładzie 3.2.H. Po nawiązaniu łączności z bieżącą bazą danych, przykładowa procedura korzysta z pętli, aby odczytać nazwy właściwości oraz ich ustawienia ze zbioru Properties obiektu Connection.
Rezultat procedury wpisany jest zarówno do okna Instrukcje bezpośrednie, jak ido pliku tekstowego o nazwie C:\Property.txt. Aby uzyskać dostęp do systemu plików danego komputera, procedura ta korzysta z funkcji CreateObject. Funkcja ta zwraca obiekt o nazwie FileSystemObject (fs). Przed odwołaniem się do obiektu Fi-leSvstemObject w kodzie procedury VBA należy najpierw ustawić odwołanie do biblioteki Microsoft Scripting Runtime. Bibliotekę tę rezprezentuje zainstalowany na twoim komputerze plik o nazwie Scrrun.dll. Aby sporządzić to odwołanie wybierz Narzędzia => Odwołania w oknie edytora Visual Basic.
362
Programowanie w Access 2
References - ŁearnADO
Available References;
H Visual Basic For Applications
S3 Microsoft Access 9.0 Object Library
S3 OLE Automation
8 Microsoft Office 9.0 Object Library
rosoft ADO Ext. 2.5 for DDL and Security •/ j5j|jjJjj?-£S^svjIJiI'TjlmjI-MbI mEmmBwewmrHw a Microsoft Excel 9.0 Object Library 3 Microsoft Word 9,0 Object Library i^f Microsoft Data Source Interfaces BMicrosoft ActiveX Data Objects 2,5 Library [*!; Microsoft Jet and Replication Objects 2.5 Library
acwzmain □ acwztool ""'Microsoft Access Wizard Control Librarv
<!____"_ 1
Ś
Priority i
Cancel
Browse,
Help
M icrosoft Scripting Runtime
Location; C:\WIMNT\System32\scrrun.dll Language: Standard
Metoda CreateTextFile tworzy obiekt TextStream (txtFile). Metoda WriteLinc] wpisuje właściwość oraz odpowiadające tej właściwości ustawienie do pliku teksto-! wego (C:\Property.txt). Metoda Close zamyka plik tekstowy. Częściowy wydruk właściwości obiektu Connection przedstawiony jest poniżej.
Immediate
Active Sessions=128
Asynchable Commit=False
Catalog Location=1
Catalog Terrn=Database
Column Definition=1
NULL Concatenation Behavior=2
Data Source Name= C:\JK_BOOKSWBA_ACCESS_
Read-Only Data Source=False
DBMS Name=MS Jet
DBMS Version=04.00.0D0D
GROUP BY Support=4
Heterogeneous Table Support=2
Identifier Case Sensitivity=8
Maximum Index Size=255
Maximum Row Size=4049
Maximum Row Size Includes BLOB=False
Maximum Tables in SELECT=0
Multiple Storage Objects=False
Multi-Table Update=True
NULL Collation Order=4
OLE Object Support=1
ORDER BY Columns in Select List=False
Łorzenie i manipulowanie bazami danych za pomocą ADO
Łw3.2.H. Nawiązywanie łączności z bieżącą bazą danych Microsoft Access
I Dim conn As ADODB .Connection Dim fs As Object Dim txtFile As Object Dim I As Integer
Set conn = CurrentProject.Connection
Set fs = CreateObjectCScripting.FileSystemObject")
Set txtFile = fs.CreateTextFile("C:\Property.txt", True)
For I = 0 To conn.Properties.count - 1
Debug.Print conn.Properties(I) .Name & " = " & _
conn. Properties(I) .Value
txtFile.WriteLine (conn.Properties(I).Name & "=" & _
conn.Properties(I) .Value)
Next I , . „
MsgBox "Sprawdź rezultat w oknie Instrukcje bezposredme.
^f "Rezultat tej procedury został również wpisany do pliku 'C-I ;\property.txf . " txtFile. Close conn. Close Set conn = Nothing End Sub
363
vb-
Tworzenie
nowej bazy danych Microsoft Access
:
Nową
bazę danych Microsoft Jet
można
utworzyć programatycznie za pomocą metody
Create
obiektu
Catalog
pochodzącego
z biblioteki ADOX.
Biblioteka
ADOX jest
przedstawiona na rysunku 3.3 dalej w tym rozdziale. Metoda Create
tworzy i
otwiera nowe połączenie ADO ze źródłem danych. Jeżeli dany
dostawca nie wspiera tworzenia
nowych obiektów Catalog,
to pojawi się
błąd. Procedura w przykładzie 3.2.1
utworzy nową (pustą) bazę danych o nazwie NowaBazaAccess.mdb
w katalogu
iwnym twojego
komputera. Pułapka na błąd spowoduje, że procedura nie zatrzyma
ię w
przypadku napotkania na plik bazy danych o tej samej nazwie.
Polecenie Kill
biblioteki
obiektów VBA
wymaże ten
plik z dysku, jeżeli zaistnieje błąd.
Przykład 3.2.1. Tworzenie nowej bazy Microsoft Access przy użyciu ADO
Sub
CreateI_NewDatabase ()
D im cat As New ADOX.Catalog
Dim mojaDb As String
mojaDb = "C:\NowaBazaAccess.mdb"
On Error GoTo ErrorHandler
cat.Create "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & mo. jaDb
MsgBox "Utworzono bazę danych o nazwie (" & mojaDb & ")." Exit Sub
ErrorHandler:
If Err.Number = -2147217897 Then Kill mojaDb Resume 0 End If End Sub
Przy tworzeniu bazy danych możesz ustawić właściwość Jet OLEDB:Encry| Database na True, aby opatrzyć bazę danych szyfrem. Możesz również dołączyć! formację o wersji bazy danych korzystając z właściwości JetOLEDB:Engine TyJ Po prostu dodaj te właściwości do łańcucha połączenia, według przykładu poniżej:
cat.Create "Provider=Microsoft.Jet.OLEDB.4.0;" &
"Data Source=" & mojaDb & _
"Jet OLEDB:Encrypt Database=True;" & _
"Jet OLEDB:Engine Type =1;"
Kopiowanie bazy danych
ADO nie posiada specjalnej metody umożliwiającej kopiowanie plików. Jednafc-1 że, jeżeli na twoim komputerze w folderze Windowa System 32 znajduje się ply o nazwie Scrrun.dll, to możesz utworzyć odwołanie do biblioteki obiektów Microsoft j Scripting Runtime w ekranie edytora Visual Basic, alty uzyskać dostęp do systemu plików twojego komputera.
Procedura w przykładzie 3.2J. korzysta z metody Copy File obiektu FileSystel mObject, aby skopiować plik C:\NowaBazaAccess.mdb do folderu C:\ProgramFiJ Przed uruchomieniem tej procedury upewnij się, że taki folder istnieje. Dla przypo- i mnienia, plik C:\NowaBazaAccess.mdb został utworzony przez procedurę Creał I_NewDatabase w przykładzie 3.2.1.
Tworzenie i manipulowanie bazami danych za pomocą ADO
365
P rzykład 3.2.J. Kopiowanie pliku
Sub CopyJ_AnyFile ()
Dim fs As Object
Dim mojaDb As String
Set fs = CreateObject ( "Scripting.FileSystemObject'
nojaDb = "C:\NowaBazaAccess.mdb"
fs.CopyFile mojaDb, "C:\Program Files\"
End Sub
Łączenie się z serwerem SQL Server
ADO posiada kilka sposobów nawiązania łączności z bazą danych znajdującą się na serwerze SQL Server. Aby dotrzeć do danych przechowywanych na serwerach Microsoft SQL Server 6.5 / 7.0 lub 2000, możesz skorzystać z dostawcy SQLOLE-DB, który jest rodzimym dostawcą Microsoft OLE DB dla SQL.
Sub ConnectToSQL_SQLOLEDB()
Dim conn As ADODB.Connection
Set conn = New ADODB.Connection
Stop
' Zmodyfikuj informacje dotyczące połączenia z serwerem
With conn
.Provider = "SQLOLEDB"
.ConnectionString = "Data Source=Mozartv4;" & _ "database=Muzycy; Userld=sa; Password=;"
.Open End With If conn.State = adStateOpen Then
MsgBox "Połączenie z serwerem zostało nawiązane." End If conn.Close Set conn = Nothing End Sub
Zwróć uwagę, że w przykładzie powyżej ustawieniem właściwości Provider obiektu Connection jest SQLOLEDB. Właściwość ConnectionString oznaczająca łańcuch połączenia zawiera nazwę serwera, nazwę bazy danych, identyfikator użytkownika oraz hasło. Należy zmodyfikować informacje w łańcuchu połączenia, aljy połączyć się z własną bazą danych na serwerze SQL.
- .„g.miiuwanie w Access2l)fl
Innym sposobem połączenia się z bazą danych przechowywaną na serwerzesj jest zastosowanie dostawcy MSDASQL. Ten dostawca umożliwia dostęp do istniej cych źródeł ODBC. Możesz otworzyć łączność z zewnętrzym źródłem danych za^ mocą ODBC DSN. To oczywiście wymaga utworzenia nazwy źródła danych (DjJ na dysku komputera przy użyciu ikony 32-bit ODBC znajdującej się w Panelu sterowi nia systemu operacyjnego Windows (w Windows 2000, skorzystaj z ikony Data Soji ces (ODBC) z narzędzi administracyjnych w Panelu sterowania).
Przykład kodu poniżej otwiera i zamyka połączenie z zewnętrzym źródłem m nych oparte na DSN o nazwie Pubs (możesz opuścić ustawianie właściwości Providjl gdyż MSDASQL jest domyślnym dostawcą dla ADO - wystarczy podać nazwę źróJ danych DSN).
With conn
.Open "Provider=MSDASQL; DSN=Pubs .Close
End With _
Połączenia DSN są dosyć niewygodne, gdyż wymagają one utworzenia nazw źródła danych (DSN) na komputerze każdego użytkownika. Jest jednak na to sposól Możesz utworzyć połączenie nie wymagające nazwy źródła danych, które będzie niej zależne od stacji dysków użytkownika. Zamiast tworzyć nazwę źródła danych na dyl ku użytkownika, po prostu podaj informacje dotyczące połączenia ze źródłem danyj ODBC w kodzie swojej procedury VBA. Zobacz dwie procedury w przykładzie 3.2.B nawiązujące tego typu łączność (bez nazwy źródła danych).
Sub Connect_ToSQLServer() Dim conn As ADODB.Connection Set conn = New ADODB.Connection With conn
' połączenie bez-DSN przy użyciu
sterownika ODBC
1 (zmodyfikuj poniższe informacje)
.Open "Driver={SQL Server};" & _
"Server=DMISAPPS;" &
"UID=sa;" & _
"PWD=Witam;" & _
"Database = Praca" .Close End With End Sub
■ bez utworzenia \
Sub Connect_ToSQLServer2 () Dim conn As ADODB.Connection Set conn = New ADODB. Connection With conn
'połączenie bez-DSN przy użyciu i dostawcy SQLOLEDB ' (zmodyfikuj poniższe informacje) .Open "Provider=SQLOLEDB;" & "DataSource=DMISAPPS;" &_ "Initial Catalog=Praca;" & "UID=sa; "Password=Witam;" .Close
End With
End Sub
Tworzenie i manipulowanie bazami danych za pomocą ADO
367
Błędy w bazach danych
W VBA możesz pułapkować błędy w swoich procedurach korzystając ze specjalnych instrukcji On Error:
i On Error GoTo NazwaEtykietki
On Error Resume Next
On Error GoTo 0
Aby poznać powód błędu, należy sprawdzić wartość właściwości Number obiektu Err znajdującego się w bibliotece VBA. Właściwość Description obiektu Err zawiera natomiast znaczenie napotkanego numeru błędu.
Programując dostęp do danych za pomocą ADO, oprócz obiektu Err z biblioteki VBA, możesz uzyskać informacje dotyczące błędów za pomocą obiektu Error z biblioteki ActiveX Data Objects (ADO). Kiedy błąd wystąpi w aplikacji korzystającej z modelu obiektów ADO, obiekt Error dodawany jest do zbioru Errors obiektu Connection i błąd jest zakomunikowany w postaci pola dialogu. Podczas gdy obiekt Err z biblioteki VBA przechowuje tylko informacje dotyczące ostatnio napotkanego błędu, zbiór Errors w bibliotece ADO może przechowywać kilka pozycji dotyczących ostatniego błędu. Za pomocą właściwości Count zbioru Errors możesz policzyć błędy spowodowane przez jakąś niedozwoloną czynność. Sprawdzając zawartość zbioru Errors, możesz uzyskać więcej informacji odnośnie typu błędu. Zbiór Errors jest dostępny tylko z obiektu Connection. Błędy, które występują w samym ADO są przekazywane do obiektu Err w bibliotece VBA, natomiast błędy, które dotyczą dostawcy, są zapisywane w zbiorze Errors obiektu Connection. Błędy te są generowane przez okre-ślongo dostawcę OLEDB, gdy obiekty ADO są zastosowane w celu uzyskania dostępu do danych. Procedura w przykładzie 3.2.L próbuje otworzyć nie istniejącą bazę danych, aby zademonstrować możliwości obiektu Err oraz zbioru Errors.
Przykład 3.2.L. Sprawdzanie zawartości obiektu Err z biblioteki VBA oraz zbioru Errors z biblioteki ADO
Sub DBError ()
Dim conn As New ADODB.Connection
Dim errADO As ADODB.Error
On Error GoTo CheckErrors
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\my.mdb" CheckErrors:
368
Programowanie w Acces
Debug.Print "Numer błędu VBA: " & Err.Number & vbCrLf s
" {" & Err.Description & ")"
Debug.Print
"Poniżej
podana jest informacja dotycząca tegobl»
Sc
vbCrLf & "zawarta w kolekcji ADO Errors."
For Each errADO In conn.Errors
Debug.Print vbTab & "Numer błędu: " & errADO.Number Debug.Print vbTab & "Wyjaśnienie: " & errADO.Description Debug.Print vbTab & "Numer błędu (JeC Error): " & errADO. SQLState
Debug.Print vbTab & "Rodzimy błąd: " & errADO.NativeError Debug.Print vbTab & "Źródło: " & errADO.Source Debug. Print vbTab & "Kontekst pomocy: " & errADO.HelpContext Debug.Print vbTab & "Plik pomocy: " U errADO.HelpFile
Next
MsgBox "Błędy zostały wpisane w oknie Instrukcje bezpośrednie." End Sub
Rezultat wykonania powyższej procedury pokazany jest poniżej:
Immediate
Numer błędu VBA: -2147467259 (Could not find file 'C:\my.mdb'.) Poniżej podana jest informacja dotycząca tego błędu: zawarta w kolekcji ADO Errors.
Numer błędu: -2147467259
Wyjaśnienie: Could not find file 'C:\my.mdb'.
Numer błędu (Jet Error): 3024
Rodzimy błąd: -534578963
Zródlo: Microsoft JET Database Engine
Kontekst pomocy: 5003024
Plik pomocy: Active Sessions=128 Asynchable Commit=False Catalog Location=1 Catalog Term^Database Column Definition^ NULL Concatenation Behavior=2 Data Source Name=C:\JK_BOOKS\VBA_ACCESS_PL_ Read-Only Data Source=False DBMS Narne=MS Jet DBMS Version=04.00.0000 GROUP BY Support=4
Tworzenie i manipulowanie bazami danych za pomocą ADO
369
Tworzenie tabel oraz pól przy użyciu ADO
Teraz gdy opanowałeś już sztukę nawiązywania łączności z rodzimymi i ze-wnętrzymi bazami danych i utworzyłeś pustą bazę danych za pomocą obiektów ActiveX Data Access należy zapoznać się z innymi cechami ADO, które umożliwiają | tworzenie i dowiązywanie tabel, dodawanie i modyfikowanie pól, tworzenie kluczy podstawowych i obcych (indeksy) oraz relacji między tabelami. Innymi słowy, należy zapoznać się z tymi obiektami, które umożliwiają dostęp do struktury bazy danych. Aby przystąpić do definiowania bazy danych, będziemy korzystać z obiektów znajdujących się w bibliotece ADOX. Pełna nazwa tej biblioteki brzmi w języku angielskim ActiveX Data Objects Extensions for DDL and Security. Zanim będziesz mógł odwołać się do ADOX w swoich procedurach, wybierz w oknie edytora Visual Basic Narzędzia => Odwołania (Tools => References) i zaznacz Microsoft ADO Ext. 2.5 [or DDL and Security. Biblioteka obiektów ADOX, która jest rozszerzeniem biblioteki obiektów ADODB, pokazana jest na rysunku 3.3. Korzystając z biblioteki ADOX możesz programowo tworzyć tabele, dodawać nowe pola, klucze i indeksy. Możesz również zdefiniować system zabezpieczeń bazy danych.
[ Katalog
- [Tabele
"HTabela
—JKolumny |—[Kolumna
—|lndeksy [—{indeks
'—[Kolumny |—| Kolumna"
—I Klucze
RKlucz
I—[-Kolumna
-[Grupy
~]—[Grupa
I—|Użytkownicy
|—[Użytkownik"
-[Użytkownicy
|—[Użytkownik |
—|Grupy |—[Grupa
-[Procedury
J—! Procedura I—|Polecenie
MWidoki"
"H Widok
■—fPole cenie i Rysunek 3.3. Hierachia obiektów ADOX
■"——
370
Programowanie w Access Ę
U samej góry hierarchii obiektów ADOX znajduje się obiekt o nazwie CataltJ Jest to obiekt niezmiernej wagi, gdyż reprezentuje on całą bazę danych i zawierali bele bazy danych, kolumny, indeksy, konta grup i kcnta użytkowników, procedml oraz widoki. Aby uzyskać programowy dostęp do struktury bazy danych należy prj pisać danemu katalogowi obiekt Connection przy użyciu ActiveConnection. TeeoiJ uczysz się już w następnym podrozdziale.
aB frmPoznajADOl : Formularz
Dostęp do danych ADO Tabele oraz pola i Klucze, indeksy oraz relacje
Właściwości
tabeli
Właściwości
pola
:
-Tabela ——
ft] @ Sporządź
BJ fi* Skopiuj
r! & Usuń
r Pola (Kolumny) — ,•
i
_DJ # Dodaj nowe pola i
\
E
j * Usuń
pole i
• Właśc wości F G
Łączenie
H1 @ Połącz tabelę I j $ Połącz arkusz
li
Wymień tabele w bazie danych
£j
Zmień autonumer
J j
Wymień tabele oraz ich pola
Wymień typy danych
Wstaw tabelę do dokumentu Worda
R ysunek 3.4. Czynności związane z tabelami i polami bazy danych
Tworzenie nowej tabeli w bazie danych Microsoft Access
Skorzystaj z obiektu Catalog w bibliotece ADOX. aby utworzyć nową Czynności związane z tworzeniem nowej tabeli w bazie danych Microsoft podane są poniżej:
1. Zadeklaruj swoje zmienne:
Dim conn As ADODB.Connection Dim cat As ADOX.Catalog Dim tbl As ADOX.Table
I
Tworzenie
j i
manipulowanie bazami danych za pomocą
ADO
371
1 2, Połącz się z bazą danych:
1 Set conn = New ADODB .Connection
I conn.Open "Provider=Microsof t. Jet .OLEDB . 4 . 0 ; " & _
I 'Data Source=C : \NowaBazaAccess .mdb"
I 3. Przypisz otwarte połączenie właściwości ActiveConnection obiektu Catalog:
Ket cat = New ADOX.Catalog
I set cat.ActiveConnection = conn
4, Utwórz nowy obiekt tabeli
Set tbl = New ADOX.Table
i, Podaj nazwę nowej tabeli:
tbl.Name = "tblDane"
Obiekt Table jest członkiem zbioru Tables, który z kolei należy do obiektu Catalog. Każdy obiekt Table posiada właściwość Name oraz właściwość Type. Przez ustawienie właściwości Name można określić nazwę tabeli, natomiast ustawienia właściwości Type określają czy dany obiekt Table jest rodzimą tabelą aplikacji Microsoft Access, połączoną tabelą, tabelą systemową, czy też widokiem. Po przykład użycia właściwości Type zwróć się do zagadnienia zatytułowanego „Tworzenie wykazu tabel wbazie danych" w dalszej części tego rozdziału.
i Dodaj obiekt Table do zbioru Tables obiektu Catalog:
cat.Tables.Append tbl
U waga
: W tej chwili sporządzona tabela jest pusta.
7 Dodaj nowe pola (kolumny) do tabeli:
Kith tbl.Columns
.Append "IdObiektu", adVarWChar, 10 .Append "Kategoria" , adSmalllnt j-.Append "Datalnstalacji", adDate
End With
372
Programowanie w Ai
Fragment powyższego kodu tworzy trzy pola o nazwach IdObiektu, Kate J oraz Datalnstalacji. Nowe pola tabeli można utworzyć bardzo szybko przekazuj metodzie Append zbioru Columns następujące argumenty: nazwę kolumny, typ* nych oraz rozmiar pola. Zwóć uwagę na to, że ADOX korzysta z innych typów Ę nych niż te, które są używane przez DAO oraz w interfejsie użytkownika (zwróci do rozdziału 2 po informacje dotyczące pracy z obiektami DAO (Data Access m jects)). Tabela 3.3 wymienia typy danych w ADOX i ich odpowiedniki w interfejs użytkownika.
Obiekt Table zawiera zbiór Columns, który z kolei zawiera obiekty o nazwie Columu Aby dodać nowe pole do danej tabeli, możesz utworzyć nowy obiekt Column, korzył stając z następującego kodu:
Dim col As ADOX.Column set col = New ADOX.Column With col
.Name = "IdObiektu"
.DefinedSize = 10 End With tbl.Columns.Append col
Ostatnie polecenie w powyższym przykładzie dodaje nowy obiekt kolumny (pole) do I zbioru Columns danej tabeli. Właściwość Name określa nazwę pola (kolumny). W)a-| ściwość DefinedSize określa maksymalny rozmiar wpisu, który można dokonać w danej kolumnie (polu). Aby utworzyć inne pole tabeli, należy utworzyć nowy obieli Column i ustawić jego właściwości Name oraz DefinedSize. Tworzenie pól wtensw sób zabiera więcej czasu i jest mniej wydajne niż metoda zademonstrowana wcześnie! w tym zagadnieniu.
Tabela 3.3. Typy danych w ADOX
Typ danych w ADOX
Typ danych w Microsoft Access
adBoolean
Tak/Nie
adUnsignedTinylnt
Liczba(Rozmiar pola = Bajt)
a dSmallnt
Liczba(Rozmiar pola = Liczba całkowita)
Tworzenie i manipulowanie bazami danych za pomocą ADO
373
|
|
Typ danych w ADOX |
Typ danych w Microsoft Access |
adSingle |
Liczba(Rozmiar pola = Pojedyncza precyzja) |
adDouble |
Liczba(Rozmiar pola = Podwójna precyzja) |
adDecimal |
Liczba(Rozmiar pola = Dziesiętne) |
adlnteger |
Liczba(Rozmiar pola = Liczba całkowita długa) Autonumerowa-nie |
adCurrency |
Walutowy |
adVarWChar |
Tekst |
adDate |
Data/Godzina |
adLongVarBinary |
Obiekt OLE |
dbMemo |
Nota |
adLongVarWChar |
Hiperłącze |
Przykład 3.4.A. Tworzenie tabeli
Sub CreateA2_Table ()
Dim cat As ADOX.Catalog Dim mojaTbl As ADOX.Table On Error GoTo Err_mojaTbl
Set cat = New Catalog
cat.ActiveConnection = CurrentProject.Connection Set mojaTbl = New Table 1 utwórz obiekt Table With mojaTbl
.Name = "tblFiltry" With .Columns
.Append "Id", adVarWChar, 10 .Append "Znaczenie", adVarWChar, 255
J
374
Programowanie
w Access!
.Append "Typ", adlnteger End With End With
' dodaj nową tabelę do zbioru Tables cat.Tables.Append mojaTbl Set cat = Nothing
MsgBox "Utworzono nową tabelę o nazwie 'tblFiltry' Exit Sub Err__mojaTbl:
If Err.Number = -2147217857 Then
cat.Tables.Delete "tblFiltry"
Resume End If
MsgBox Err.Number & ": " & Err.Description End Sub
Następująca tabela została utworzona przez procedurę w przykładzie 3.4.A.
tblFiltry; Tabela
1 y ,-JnJx|
Nazwa pola
T
Znaczenie Typ
Opis
y'P danych
Tekst Tekst Liczba
Właściwości pola
Ogólne Odnośnik J |
|
Rozmiar pola |
10 |
Format |
|
Maska wprowadzania |
|
Tytuł |
|
Wartość domyślna |
|
Reguła poprawności |
|
Komunikat o błędzie |
|
Wymagane |
Tak "..' ■ |
Zerowa długość dozwolon. |
Nie |
Indeksowane |
Nie |
Kompresja Unicode |
Tak 1 |
Tworzenie
i ma
mipulowanie
bazami danych za pomocą
ADO
375
Kopiowanie tabeli
Procedura w przykładzie 3.4.B korzysta z instrukcji języka SQL SELECT... 1N-110, aby wybrać wszystkie rekordy z tabeli o nazwie tblKlienci i wpisać je do tabeli I onazwie tblKlienci_Kopia znajdującej się w tej samej bazie danych. Instrukcja SB-ILECT...INTO jest ekwiwalentem sporządzenia kwerendy tworzącej tabelę. Instrukcja I ta tworzy nową tabelę i wpisuje do niej dane pochodzące z innych tabel. Aby skopio-1 wać tabelę, instrukcja SQL jest przekazana jako pierwszy argument metody Execute I obiektu Connection. W ten sposób skopiowana tabela nie będzie jednak posiadała in-I deksów, które być może istniały w tabeli oryginalnej.
I Przykład 3.4.B. Sporządzanie kopii tabeli
IsubCopyB2_Table()
Dim conn As New ADODB.Connection On Error GoTo err_CopyB2_Table Set conn = CurrentProject.Connection onn.Execute "SELECT tblKlienci.* INTO &_ ■tblKlienci_KoPia FROM tblKlienci"
;:"porz.dZono Kopi, tabeli klienci."
Exit Sub err CopyB2_Table:
I£ Err.Number = -2147217900 Then
conn.Execute "DROP Table tblKlienci_Kopia
Resume
ElSe . r ..." & Err Description
MsgBox Err.Number & ': & brr.
End If
End Sub
Wymazywanie tabeli bazy danych
H»X, uzyskują dostęp do zbiomTa^kor^c którą chcesz
, pokładzie 3.4 C oczekuje pararaeW ktayo^ • obecneJ ba.
C^f-'«^ i"SmkCJC " °km6 InSt'Uk* beZP° "
376
Programowanie w Access 20M
D elete_Table("tblKlienci_Kopia"
Po naciśnięciu klawisza Enter, Visual Basic wymaże określoną tabelę z bieżącej bazy danych. Jeżeli taka tabela nie istnieje, to wyświetlony zostanie odpowiednia munikat. Aby powyższa instrukcja mogła działać należy sporządzić procedj w przykładzie 3.4.C poniżej.
Przykład 3.4.C. Wymazywanie tabeli z bazy danych
Sub Delete_Table(strTblName As String)
Dim cat As ADOX.Catalog
On Error GoTo ObsługaBłędu
Set cat = New ADOX.Catalog
' Otwórz obiekt Catalog
cat.ActiveConnection = CurrentProject.Connection
cat.Tables.Delete strTblName
Set cat = Nothing
Exit Sub ObsługaBłędu:
MsgBox "Tabeli '" & StrTblName & _
"' nie można wymazać " & vbCrLf &
"ponieważ jej nie ma."
Resume Next End Sub
Dodawanie nowych pól do istniejącej tabeli
Czasami będziesz chciał programatycznie dodać nowe pole do istniejącej już ta-1 beli. Procedura przedstawiona poniżej dodaje nowe pole tekstowe o nazwie MojeNo-J wePole do tabeli tblKlienci znajdującej się w bieżącej bazie danych. Nowe pole może zmieścić 15 znaków. Po więcej informacji odnośnie dodawania pól do tabeli zwróć się do zagadnienia „Tworzenie nowej tabeli w bazie danych Microsoft Access" wcześniej w tym rozdziale.
Przykład 3.4.D. Dodawanie nowego pola do tabeli
Sub Add_NewFields()
Dim cat As New ADOX.Catalog Set cat = New ADOX.Catalog
'Otwórz obiekt Catalog
cat.ActiveConnection = CurrentProject.Connection
cat.Tables("tblKlienci") .Columns.Append _
"MojeNowePole", adWChar, 15 Set cat = Nothing End Sub
i Wymazywanie pola z tabeli
Procedura w przykładzie 3.4.E. ilustruje w jaki sposób można uzyskać dostęp do i zbioru Columns obiektu Table w bibliotece ADOX i skorzystać z dostępnej w tym I zbiorze metody Delete w celu usunięcia pola z tabeli bazy danych. Procedura ta nie I będzie działać, jeżeli pole, które chcesz usunąć wchodzi w skład indeksu.
I Przykład 3.4.E. Wymazywanie pola z tabeli
SubDelete_Field()
Dim cat As ADOX.Catalog cpt- cat = New ADOX.Catalog
cat ^Connection = CurrentPr03ect.C0nnect.0n cat'.TablesCtblFiltry-) .Columns .Delete "Typ" Set cat = Nothing End Sub
c mazanie
! ć z indeksami przy użyciu obiektów ADO.
Bląd wykonań, wystąpi przy próbie wymazania pola, które jest częs.ą .deksu. Aby zobaczyć ten błąd, zamień instrukcję:
-tblFiltry-> .Columns.Delete "Typ"
at.TBbles(
następującą linijką kodu:
Lbles(«tblKlienci") .Columns .Delete "IdSzefa'
i uruchom ponownie procedurę w przykładzie 3.4.E.
378
Programowanie w Access
P onieważ pole IdSzefa w tabeli tblKlienci jest kluczem, Visual Basic niej wymazać tego pola i wyświetla następujący błąd wykonania:
Microsoft Visual Basic
Run-time error '-2147467259 (80004005)': :
Cannot delete a field that is part of an index or is needed by the system.
Debug
Help
J
Wyszczególnianie właściwości tabeli
Zbiór Properties obiektu Table w bibliotece ADOX pozwala ustawić i pobij właściwości danej tabeli. Zbiór Properties daje dostęp do standardowych właściwJ ADO oraz właściwości, które są specyficzne dla danego dostawcy danych. Następuj ca procedura uzyskuje dostęp do tabeli o nazwie tblKlienci i wpisuje właściwości oj ich wartości do okna Instrukcje bezpośrednie.
Przykład 3.4.F. Sporządzanie wykazu właściwości tabeli
Sub List_TableProperties()
Dim cat As ADOX.Catalog
Dim tbl As ADOX.Table
Dim pr As ADOX.Property
Set cat = New ADOX.Catalog
Set cat.ActiveConnection = CurrentProject.Connection
Set tbl = cat.Tables("tblKlienci")
' pobierz właściwości tabeli
For Each pr In tbl.Properties
Debug.Print tbl.Name & ": " & pr.Name & "= "; pr.Value
Next
MsgBox "Sprawdź dane w oknie Instrukcje bezpośrednie." End Sub
i Tworzenie i manipulowanie bazami danych za pomocą ADO
379
Po uruchomieniu procedury w przykładzie 3.4.F okno Instrukcje bezpośrednie [wyświetla właściwości tabeli oraz ich wartości:
Immediate
t blKlienci: tblKlienci: tblKlienci: tblKlienci: tblKlienci: tblKlienci: tblKlienci: tblKlienci: tblKlienci: tblKlienci:
biJ
Temporary Tab!e= False
Jet OLEDB:Table Validation Text=
Jet OLEDB:Table Validation Rule=
Jet OLEDB:Cache Link Narne/Password= False
Jet OLEDB:Remote Table Narne=
Jet OLEDB:Link Provider String=
Jet OLEDB: Link Datasource=
Jet OLEDB:Exclusive Link= False
Jet OLEDB:Create Link= False
Jet OLEDB:Table Hidden In Access= False
Wyszczególnianie właściwości pól
Następująca procedura podaje właściwości pola o nazwie TypKlienta znajdującego się w tabeli tblKlienci.
Przykład 3.4.G. Generowanie wykazu właściwości pól
Sub List_FieldProperties ()
Dim cat As ADOX.Catalog
Dim col As ADOX.Column
Dim pr As ADOX.Property
Set cat = New ADOX.Catalog
Set cat.ActiveConnection = CurrentProject.Connection
Set col = New ADOX.Column
Set col = cat.Tables("tblKlienci")-Columns("TypKlienta") Debug.Print "Liczba właściwości pola TypKlienta " & "(" & col.Properties.count & ")"
1 pobierz właściwości pola
For Each pr In col.Properties
Debug.Print pr.Name & "="; pr.Value
Next
MsgBox "Właściwości podano w oknie Instrukcje bezpośrednie." End Sub
■
380
Programowanie w Access
P o uruchomieniu procedury w przykładzie 3.2.G w oknie Instrukcje bezpośil nie znajduje się wykaz nazw właściwości pola oraz ich wartości:
Immediate
Liczba właściwości pola TypKIienta (15)
Autoincrernent=False
Default="B"
Description=B (Business) lub I (Osoba)
Nullable=False
Fixed Length=False
Seed= 1
Increment^ 1
Jet OLEDB:Colurnn Validation Text="Wpisz "B" na oznaczenie firm
Jet OLEDB:Column Validation Rule="B" Or "I"
Jet OLEDB:IISAM Not Last Columnwise
Jet OLEDB:AutoGenerate=False
Jet OLEDB:One BLOB per Page=False
Jet OLEDB:Compressed UNICODE Strings=True
Jet OLEDB:Allow Zero Length=False -i
Jet OLEDB:Hyperlink=False
Łączenie tabel w aplikacji Microsoft Access
Access 2000 umożliwia łączenie tabel pochodzących z rodzimych baz danyi Microsoft Access oraz ze źródeł zewnętrzych takich jak arkusze Excela, pliki bazd nych dBase, Paradox, pliki w formacie Exchange/Outlook, Lotus, jak również pij tekstowe oraz HTML.
Aby połączyć się z tabelą bazy danych Access, należy ustawić następujące j ściwości tabeli:
Jet OLEDB:LinkDatasource Jet OLEDB:Remote Table Name Jet OLEDB:CreateLink
Procedura w przykładzie 3.4.H demonstruje, w jaki sposób należy połącz; z bieżącą bazą danych tabelę Spedytorzy z przykładowej bazy danych Northwin Aby uwidocznić tabelę Spedytorzy w oknie bazy danych po uruchomieniu tej pr< dury naciśnij klawisz F5.
Tworzenie i manipulowanie bazami danych za pomocą ADO
381
P rzykład 3.4.H. Przyłączanie tabeli Microsoft Jet
Sub Link_JetTable ()
Dim cat As ADOX.Catalog
Dim lnkTbl As ADOX.Table
Dim dbNazwa As String
Dim tblNazwa As String
On Error GoTo ObsługaBłędu
dbNazwa = "C:\Program Files\Microsoft Office\PL\Office\" & _
" \Samples\Northwind.mdb" tblNazwa = "Spedytorzy" Set cat = New ADOX.Catalog
'Otwórz Catalog bazy danych, do której chcesz przyłączyć tabelę cat.ActiveConnection = CurrentProject.Connection Set lnkTbl = New ADOX.Table With lnkTbl
' Podaj nazwę nowej tabeli i ustaw jej właściwość ParentCatalog 1 Otwórz Catalog, aby umożliwić dostęp do zbioru Properties .Name = tblNazwa Set .ParentCatalog = cat ' Ustaw właściwości
.Properties("Jet OLEDB:Create Link") = True .Properties("Jet OLEDB:Link Datasource") = dbNazwa .Properties("Jet OLEDB:Remote Table Name") = tblNazwa
End With
' Dodaj tabelę do zbioru Tables cat.Tables.Append lnkTbl Set cat = Nothing
MsgBox "Obecna baza danych zwiera tabelę połączoną " & "o nazwie " & tblNazwa Exit Sub I ObsługaBłędu:
MsgBox Err.Number & ": " & Err.Description
i End Sub
Przyłączanie arkusza Microsoft Excel
Do bazy danych Microsoft Access można przyłączyć arkusz Excela korzystając zmetody TransferSpreadsheet obiektu DoCmd, tak jak to demonstruje procedura w przykładzie 3.4.1.
382
Programowanie w Access]
Zwróć jednak uwagę na to, że ani obiekt DoCmd ani jego metoda Transfers adsheet nie są członkami hierarchii obiektów ADO. Obiekt DoCmd należy do b teki obiektów Microsoft Access 9.0. Przykładowa procedura zaczyna się od utwoi nia tabeli połączonej o nazwie tenArkusz na podstawie wskazanego zakresu kotu (A1:B15) znajdującego się w arkuszu o nazwie Regiony w pliku Regiony.xls. An ment -1 w poleceniu DoCmd wskazuje na to, że pierwszy wiersz arkusza zawieraj zwy kolumn. Następnie procedura korzysta z obiektu Recordset w bibliotece A] w celu pobrania danych z tabeli tenArkusz i wpisania ich do okna Instrukcje bezi średnie. Przed otwarciem obiektu Recordset należ}' ustawić kilka właściwości i obiektu:
}.
• ' Właściwość ActiveConnection ustawia odwołanie do bieżącej bazy danych.
• Właściwość
CursorType określa, w jaki sposób obiekt Recordset
powinie
współpracować
ze źródłem danych.
• Ustawienie
adOpenKeyset mówi Visual
Basicowi,
że zamiast pobierać wszysi
rekordy
ze źródła danych, należy pobrać same klucze. Dane, które klucze
te i
prezentują
zostaną pobrane w miarę przeglądania zestawu rekordów przez
i
kownika.
Ustawienie to gwarantuje lepsze rezultaty i szybsze działanie,
ani;
pobieranie
od razu dużych ilości danych.
Właściwość
LockType wskazuje na to, w jaki sposób należy zablokować
podczas
manipulowania nimi
Ustawienie
adLockOptimistic blokuje rekord tylko w momencie próby zachow
nia
go w pamięci na dysku.
Przy otwieraniu zestawu rekordów (Recordset) należy również podać źródło di nych. Źródłem danych w tej procedurze jest tabela połączona o nazwie tenArkus; W zależności od typu źródła danych należy przekazać odpowiedni parametr.
• Ustawienie adCmdTable wskazuje na to, że należy zwrócić wszystkie wie z tabeli źródłowej.
Obiekt Recordset można również otworzyć przekazując mu za jednym ra wszystkie wymagane parametry w sposób następujący:
Rst.Open "tenArkusz", CurrentProject.Connection, adOpenKeyset, adLockOptimistic, adCmdTable
Tworzenie i manipulowanie bazami danych za pomocą ADO
383
P rzykład 3.4.1. Dołączanie arkusza Excela
Sub LinkI_ExcelSheet ()
Dim rst As New ADODB.Recordset
DoCmd.TransferSpreadsheet acLink, acSpreadsheetTypeExcel8,
"tenArkusz", "C:\Regiony.xls", -1, "Regiony!A1:B15"
With rst
.ActiveConnection = CurrentProject.Connection
.CursorType = adOpenKeyset
.LockType = adLockOptimistic
.Open "tenArkusz", , , , adCmdTable End With Do Until rst.EOF
Debug.Print rst.Fields (0) .Value, rst.Fields (1) .Value
rst.MoveNext Loop End Sub
Tworzenie wykazu tabel
Procedura w przykładzie 3.4.J tworzy wykaz tabel w bazie danych Northwind. Korzysta ona z obiektu Catalog w bibliotece ADOX w celu uzyskania dostępu do bazy danych, następnie zaś przegląda kolekcję tabel, aby pobrać nazwy tabel programu Access, tabel systemowych oraz widoków (Views). Zbiór Tables w bibliotece ADOX przechowuje różne typy obiektów (zobacz Tabelę 3.4 poniżej).
Tabela 3.4. Typy tabel w zbiorze Tables w bibliotece ADOX
A CCESS TABLE
Systemowa tabela aplikacji Access
L INK
Tabela połączona Microsoft Jet
P ASS-THROUGH
Tabela połączona pochodząca ze źródła ODBC
SYSTEM TABLE
Systemowa tabela silnika bazy danych Microsoft Jet
TABLE
Zwykła tabela aplikacji Microsoft Access
VIEW
Widok /Tabela będąca wynikiem kwerendy zwracającej dane
Przykład 3.4.J. Tworzenie wykazu tabel w bazie danych
Sub ListTbls ()
Dim cat As ADOX.Catalog
384
Programowanie w Access 200^
Dim tbl As ADOX.Table Set cat = New ADOX.Catalog
cat.ActiveConnection = "Provider=MicrosoJ:t.Jet.OLEDB.4.0; " & "Data Source=C:\Program Files\Microsoft Office\PL\" & _ "Office\Samples\Northwind.mdb;" For Each tbl In cat.Tables
If tbl.Type <> "VIEW" And _
tbl.Type <> "SYSTEM TABLE" And _
tbl.Type <> "ACCESS TABLE" Then Debug.Print tbl.Name Next tbl
MsgBox "Wykaz tabel znajduje się w oknie Instrukcje bezpośrednie, End Sub
Aby sporządzić wykaz tabel w swojej bazie dan3'ch możesz również skór; z metody OpenSchema obiektu Connection (zobacz zagadnienie zatytułowane, S: rządzanie wykazu tabel oraz pól tabeli" w dalszej części tego rozdziału).
Zmiana autonumeracji
Jak wiesz, w tabelach bazy danych aplikacji Microsoft Access często stosuje s jako klucz podstawowy pole typu Autonumerowanie. Autonumer jest unikatową lic bą przyrastającą (zwiększoną o jeden) lub liczbą losową przypisaną automatyc; przez Microsoft Access w trakcie dodawania nowego rekordu do tabeli. Microsoft I cess 2000 umożliwia programatyczne ustawienie wartości początkowej oraz wa przyrostu dla pól Autonumer przy użyciu instrukcji języka SQL. Procedura I w przykładzie 3.4.K otwiera zestaw danych (Recordset) w oparciu o tabelę tblKlienci I w bieżącej bazie danych pobierając wartość ostatniego autonumeru i sprawdzając jed-1 nocześnie bieżącą wartość przyrostu. Po wyświetleniu informacji w oknie dialosu 1 przy użyciu funkcji MsgBox, procedura zwiększa ostatnio użyty autonumer o jeden i zamyka Recordset. Następnie polecenie SQL modyfikuje typ danych istniejącego w tabeli pola. W poleceniu tym zastosowane są instrukcje języka SQL: ALTER TA- i BLE oraz ALTER COLUMN. W języku Jet 4.0 SQL kolumna Autonumer posiada typ danych o nazwie IDENTITY. Korzystając z właściwości Start oraz Step tego typu danych możesz programatycznie ustawić wartość początkową oraz wartość przyrostu następnego autonumeru.
Przykład 3.4.K. Zmiana wartości pola autonumer
Sub ChangeAutoNumber()
Tworzenie i manipulowanie bazami danych za pomocą ADO
385
D im conn As ADODB.Connection
Dim strSQL As String
Dim beginNum As Integer
Dim stepNum As Integer
Dim rst As New ADODB.Recordset
Set conn = CurrentProject.Connection With rst
.CursorType = adOpenKeyset .LockType = adLockReadOnly .Open "tblKlienci", conn .MoveLast End With
beginNum = rst(O) rst.MovePrevious stepNum = beginNum - rst(O)
MsgBox "Ostatnia wartość Autonumeru = " & beginNum & vbCr & "Bieżąca wartość przyrostu = " & stepNum, vblnformation,
"AutoNumber" beginNum = beginNum + 1 rst.Close StrSQL = "ALTER TABLE tblKlienci " & _
"ALTER COLUMN Clientld Identity " & _ " (" St. beginNum & " , 5) " conn.Execute strSQL
MsgBox "Nowa wartość Autonumeru = " & beginNum & vbCr & "Nowa wartość przyrostu = 5", vblnformation, _ "Wartość Autonumeru została zmieniona." End Sub
J
Sporządzanie wykazu tabel oraz pól tabeli
Wcześniej w tym rozdziale (zobacz Przykład 3.4.J) nauczyłeś się sporządzać wykaz tabel w bazie danych Northwind uzyskując dostęp do zbioru Tables obiektu Catalog w bibliotece obiektów ADOX. Procedury w tym podrozdziale demonstrują, w jaki sposób można skorzystać z metody OpenSchema obiektu Connection w bibliotece ADO, w celu uzyskania więcej informacji odnośnie tabel w bazie danych oraz ich pól. Aby wyszczególnić tabele w bazie danych, skorzystaj z ustawienia adSchemaTables jako parametru metody OpenSchema:
Set rst = Connection.OpenSchema(adSchemaTables)
386
Programowanie w Access 21
S ub ListTbls2()
' Procedura ta wyszczególnia tabele bazy danych przy użyciu metody
OpenSchema
1 Wcześniejszy przykład 3-2 J w tym rozdziale demonstruje w jaki i
sób można
' otrzymać listę tabel przy użyciu zbioru Tables dla obiektu Catalog]
bibliotece ADOX
. i" Dim rst As ADODB.Recordset
Set rst = CurrentProject.Connection.OpenSchema(adSchemaTables)
Do Until rst.EOF
Debug.Print rst.Fields("TABLE_TYPE") & " ->" &
rst.Fields("TABLE_NAME")
rst.MoveNext
Loop
End Sub
Nazwy tabel zwróconych przez metodę OpenSchema wymienione są w oknie strukcje bezpośrednie:
Immediate
TABLE ->AuthorlSBN
TABLE ->Authors
TABLE ->Employees
ACCESS TABLE ->MSysAccessObjects
SYSTEM TABLE ->MSysACEs
ACCESS TABLE ->MSyslMEXColumns
ACCESS TABLE ->MSyslMEXSpecs -
SYSTEM TABLE ->MSysObjects
SYSTEM TABLE ->MSysQueries
SYSTEM TABLE ->MSysRelationships
LINK->Spedytorzy
TABLE ->tblAgents
TABLE ->tblClients2
TABLE ->tblCopy
TABLE ->lblFillers
TABLE ->tbIFiltry
TABLE ->tblKlienci
LINK->tenArkusz
LiJJ
Uzyskanie wykazu nazw pól danej tabeli wymaga użycia stałej adScheraa lumns jako parametru metody OpenSchema. Poniższa procedura sporządza wykaz i dla każdej tabeli w bazie danych Northwind.
387
Tworzenie
i manipulowanie bazami danych za pomocą
ADO Przykład
3.4.L. Wyszczególnianie nazw tabel oraz ich pól
i Sub ListTblsAndFields ()
Dim conn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim obcTbl As String
Dim nowaTbl As String
Dim licznik As Integer
Set conn = New ADODB.Connection
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\Program Files\Microsoft Office\PLV
"Office\Samples\Northwind.mdb;" Set rst = conn.OpenSchema(adSchemaColumns) obcTbl = " " nowaTbl = "" licznik = 1 Do Until rst.EOF
obcTbl' = rst!table_Name If (obcTbl <> nowaTbl) Then nowaTbl = rst!table_Name Debug.Print "Tabela: " & rst!table_Name
licznik = 1
& rst!Column_Name
End If
Debug.Print " Pole " & licznik &
licznik = licznik + 1 rst.MoveNext
Loop
rst.Close
conn.Close
Set rst = Nothing
Set conn = Nothing
MsgBox "Zobacz rezultat w oknie Instrukcje bezpośrednie."
End Sub
Częściowy
rezultat wykonania powyższej procedury pokazany jest poniżej:
388
Programowanie w Access 20M
|
|
Tabela: Sprzedaż wg produktów w 1997 roku jtJ |
|
Pole |
1: KwartalWysylki |
Pole |
2: NazwaKategorii |
; Pole |
3: NazwaProduktu |
Pole |
4: SprzedazProduktów |
Tabela: Zamówienia |
|
Pole |
1; AdresOdbiorcy |
Pole |
2: DataWymagana |
Pole |
3: DataWysylki |
Pole |
4: DataZamówienia |
Pole |
5: Fracht |
i Pole |
6: IDklienta |
Pole |
7: IDpracownika |
: Pole |
8: IDspedytora |
Pole |
9: IDzamówienia |
Pole |
10: KodPocztowyOdbiorcy |
Pole |
11: KrajOdbiorcy |
'■- Pole |
12: MiastoOdbiorcy |
Pole |
13: NazwaOdbiorcy |
Pole |
14: RegionOdbiorcy |
i Tabela: Zamówienia kwartalne |
|
Pole |
1: IDklienta |
Pole |
2: Kraj i |
: Pole |
3: Miasto |
Pole |
4: NazwaFirmy -rj- |
Wyszczególnianie typów danych
Następująca procedura korzysta z parametru adSchemaProviderTypes i met( OpenSchema obiektu Connection w celu sporządzenia wykazu typów danych roz znawanych przez dostawcę danych Microsoft Jet OLE DB 4.O.
Przykład 3.4.M. Wyszczególnianie typów danych
Sub ListDataTypes()
Dim conn As ADODB.Connection
Dim rst As ADODB.Recordset
Set conn = New ADODB.Connection
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\Program Files\Microsoft OfficeV
"PL\Office\Samples\Northwind.mdb;" Set rst = conn.OpenSchema(adSchemaProviderTypes) Do Until rst.EOF
Debug.Print rst!Type_Name & vbTab _
T worzenie i manipulowanie bazami danych za pomocą ADO
& -Rozmiar: ■ & rst!Column_Size rst.MoveNext
; Loop rst.Close conn.Close Set rst = Nothing
Set conn = Nothing ,
MsgBoX "Zobacz rezultat w oknie Instrukcje bezpośrednie.
End Sub
Po uruchomieniu powyższej procedury, nazwy typów danych oraz ich rozmiary pojawią się w oknie Instrukcje bezpośrednie:
Short Rozmiar: 5
Long Rozmiar: 10
Single Rozmiar. 7
Double Rozmiar: 15
Currency Rozmiar: 19
DateTime Rozmiar. 8
Bit |Rozmiar: 2
Byte Rozmiar: 3
GUID Rozmiar: 16
BigBinary Rozmiar: 4000
LongBinary Rozmiar: 1073741823
VarBinary Rozmiar. 510
LongText Rozmiar: 536870910
VarChar Rozmiar. 255
Decimal Rozmiar: 28
Umieszczanie tabeli Microsoft Access w dokumencie Microsoft
Word
Chciaż ADO nie posiada specjalnej metody pozwalającej na skopiowanie danych z aplikacji Microsoft Access do dokumentu Microsoft Word, możesz skorzystać z technologii automatyzacji w celu połączenia się z Wordem, następnie zaś skorzystać z metody InsertDatabase obiektu Range w celu wstawienia tabeli Accessa do dokumentu Worda.
Procedura w przykładzie 3.4.N poniżej demonstruje w jaki sposób można skopiować tabelę Pracownicy z bazy danych Northwind do dokumentu w aplikacji Microsoft Word. Przed uruchomieniem tej procedury upewnij się, że w oknie dialogu
390
Programowanie w Access 2
O dwołania (wybierz Narzędzia | Odwołania w ekranie edytora Visual Basic) i ne jest odwołanie do biblioteki obiektów Microsoft Word 9.0.
Przykład 3.4.N. Umieszczanie tabeli bazy danych Access w dokumencie Worda
Function CopyToWord()
Dim aplWord As Word.Application
Dim dok As Word.Document
Dim zakres As Word.Range
On Error GoTo ObsługaBłędu
Set aplWord = New Word.Application
1 utwórz zmienną obiektową typu Document
Set dok = aplWord.Documents.Add()
Set zakres = dok.Content
' wstaw tabelę Accessa w dokumencie Worda
zakres.InsertDatabase Connection:="TABLE Pracownicy", _
DataSource:="C:\Program Files\Microsoft Office\" & _ "PL\Office\Samples\Northwind.mdb"
aplWord.Visible = True
Exit Function ObsługaBłędu:
MsgBox Err.Description, vbCritical, "Błąd automatyzacji"
Exit Function End Function
Tworzenie indeksów oraz relacji między tabelami przy użyciu ADO
Poza możliwością programatycznego tworzenia tabel, biblioteka obiektów OX zawiera obiekty przeznaczone do dodawania kluczy podstawowych, indeksów oraz tworzenia relacji między tabelami. Rysunek 3.5 demonstruje niektóre spośród czynności, które możesz wykonać programowo podczas definiowania swoich tabel.
Tworzenie i manipulowanie bazami danych za pomocą ADO
391
ifrmPoznajADOl: Formularz
Dostęp do danych ADO j Tabele oraz pola Klucze, indeksy oraz relacje
-Klucz/Indeks —
"1 (* Podstawowy ej r Pojedynczy cl f Wielopolowy
£3
Podaj indeksy w istniejącej w tabeli
Usuń indeks
Sporządź Relacje między tabelami
R ysunek 3.5. Praca z kluczami podstawowymi, indeksami oraz relacjami
Tworzenie klucza podstawowego
Klucz podstawowy jest indeksem, w którym właściwości Unikatowy (Unique) oraz Klucz podstawowy (PrimaryKey) posiadają wartość True. Klucz podstawowy identyfikuje rekord w tabeli. Przy tworzeniu nowych kluczy, skorzystaj z obiektu Key w bibliotece ADOX. Aby określić, czy klucz jest podstawowy, obcy, lub unikatowy, posłuż się właściwością Type. Na przykład, aby utworzyć klucz podstawowy, przypisz właściwości Type obiektu Key stałą o nazwie adKeyPrimary. Procedura w przykładzie 3.5.A demonstruje w jaki sposób można dodać klucz podstawowy do tabeli o nazwie tblFiltry znajdującej się w bieżącej bazie danych. Zwróć uwagę na to, że po ustawieniu właściwości Name oraz Type dla obiektu Key, procedura dodaje kolumnę ID do zbioru Columns tego obiektu. Następnie, sam obiekt Key zostaje dodany do zbioru Keys danej tabeli. Ponieważ mogą wystąpić błędy jeżeli tabela jest otwarta lub zawiera już klucz podstawowy, załączona pułapka na błąd zapewni, że procedura będzie przebiegała bez zakłóceń.
392
Programowanie w Access 2
P rzykład 3.5.A. Tworzenie klucza podstawowego
Sub CreateA3_PrimaryKey()
Dim cat As New ADOX.Catalog Dim mojaTbl As New ADOX.Table Dim pKey As New ADOX.Key On Error GoTo ErrorHandle
cat.ActiveConnection = CurrentProject.Connection Set mojaTbl = cat.Tables("tblFiltry") With pKey
.Name = "PrimaryKey" .Type = adKeyPrimary End With
pKey.Columns.Append "Id" moj aTbl.Keys.Append pKey Set cat = Nothing Exit Sub ErrorHandle:
If Err.Number = -2147217856 Then
MsgBox "Tabeli 'tblFiltry' nie można otworzyć.
vbCritical, "Zamknij tabelę"
Elself Err.Number = -2147217767 Then
mojaTbl.Keys.Delete pKey.Name
Resume
Else
MsgBox Err.Number & ": " & Err.Description End If End Sub
Tworzenie indeksu złożonego z jednego pola
Korzystając z obiektu Index w bibliotece ADOX możesz programowo dodać in-j deks do tabeli. Przed utworzeniem indeksu, upewnij się, że tabela jest zamknięta i że I nie zawiera ona już indeksu o takiej samej nazwie. Aby zdefiniować indeks, posłuż siej następującymi wskazówkami:
Dodaj jedną lub więcej kolumn do indeksu korzystając z metody Append.
Ustaw
właściwość Name
obiektu
Index
oraz
określ inne właściwości indeksuj
jeżeli
jest to konieczne.
Łorzenie i manipulowanie bazami danych za pomocą ADO
393
Możesz skorzystać z właściwości Unikatowy (Unique) obiektu Index, aby okre-Iślić czy indeks ma być unikatowy. Początkowym ustawieniem właściwości Unique I jest False. Inna właściwość, IndexNulls, pozwala określić czy w indeksie dozwolone ■sąwartości Null. Właściwość ta może zawierać jedną z następujących stałych:
adlndexNullsAllow |
Możesz utworzyć indeks nawet jeżeli w polu indeksu znajduje się wartość Null (nie spowoduje to błędu) |
AdlndexNullsDisallow (ustawienie początkowe) |
Nie można utworzyć indeksu, jeżeli w indeksowanej kolumnie (polu) znajduje się wartość Null (zajdzie błąd) |
adlndexNullsIgnore |
Możesz utworzyć indeks nawet jeżeli w polu indeksu znajduje się wartość Null (nie spowoduje to błędu). Właściwość Ignoruj zerowe (Ignore-Nulls) w oknie Indeksy w interfejsie użytkownika otrzyma ustawienie Tak |
AdlndexNullsIgnoreAny (ta wartość nie jest wspierana przez dostawcę Microsoft Jet Provider) |
Możesz utworzyć indeks nawet jeżeli w polu indeksu znajduje się wartość Null. Właściwość Ignoruj zerowe (IgnoreNulls) w oknie Indeksy w interfejsie użytkownika otrzyma ustawienie Nie |
i Skorzystaj z metody Append, aby dodać obiekt Index do zbioru Indexes danej
tabeli.
Procedura w przykładzie 3.5.B pokazuje, w jaki sposób można dodać indeks złożony z jednego pola o nazwie idxZnaczenie do tabeli tblFiltry. Po ustawieniu właściwości indeksu, kolumna Znaczenie zostaje dodana do indeksu i porządek sortowania indeksu jest określony przy użyciu stałej adSortAscending (jest to ustawienie domyślne). Aby zmienić porządek sortowania indeksu na malejący skorzystaj ze stałej ad-SortDescending. Wreszcie, indeks zostaje dodany do zbioru Indexes obiektu Table.
Przykład 3.5.B. Dodawanie indeksu złożonego z jednego pola do istniejącej już tabeli
Sub AddB3_SFieldIndex ()
Dim cat As New ADOX.Catalog
Dim mojaTbl As New ADOX.Table
Dim indeks As New ADOX.Index
On Error GoTo Err_AddB3_SFieldIndex
394
Programowanie w Access M
cat.ActiveConnection = CurrentProject.Connection Set mojaTbl = cat.Tables("tblFiltry") With indeks
.Name = "idxZnaczenie" .Unique = False
.IndexNulls = adlndexNullsDisallow .Columns.Append "Znaczenie" .Columns(0).SortOrder = adSortAscending End With
mojaTbl.Indexes.Append indeks Set cat = Nothing Exit Sub Err_AddB3_SFieldIndex:
If Err.Number = -2147217856 Then
MsgBox "Tabeli 'tblFiltry' nie można otworzyć.",
vbCritical, "Zamknij tabelę" Elself Err.Number = -2147217868 Then
mojaTbl.Indexes.Delete indeks.Name Resume 0 Else
MsgBox Err.Number & ": " & Err.Description End If End Sub
Indeksy sporządzone przez procedurę w przykładach 3.5.A oraz 3.5.B pr: wionę są poniżej:
f Indeksy: tblFiltry
Nazwa indeksu
P rimaryKey
Nazwa pola
Znaczenie Id
Porządek sortowania
Rosnąco Rosnąco
Podstawowy Nie Unikatowy Nie Ignoruj zerowe Nie
Właściwości indeksu
Na2wa tego indeksu, Każdy indeks może użyć maksymalnie 10 pól,
Tworzenie i manipulowanie bazami danych za pomocą ADO
395
D odawanie indeksu złożonego do tabeli
Procedura w przykładzie 3.5.B w poprzednim zagadnieniu zademonstrowała sposób dodania indeksu złożonego z jednego pola do istniejącej już tabeli przy użyciu obiektu Index z biblioteki ADOX. Możesz również dodać do tabeli indeks złożony zdwóch i więcej pól. Procedura poniżej deklaruje obiekt Connection pochodzący z biblioteki ADO i otwiera połączenie z bazą danych Northwind. Następnie, procedura wykorzystuje metodę Execute obiektu Connection, aby wykonać polecenie DDL (data definition language) CREATE INDEX, które doda indeks do tabeli Pracownicy. Programowanie w języku DDL omówione jest szczegółowo w rozdziale 4.
Polecenie CREATE INDEX składa się z trzech części: 1. nazwy indeksu, który zamierzasz utworzyć oraz słowa kluczowego ON, j 2. nazwy istniejącej tabeli, która będzie zawierała ten indeks, oraz
3. nazwy pól, które mają być indeksowane (nazwy pól należy wymienić w nawiasie po nazwie tabeli).
Indeks będzie rosnący, chyba że na końcu polecenia CREATE INDEX umieszczono słowo kluczowe DESC. W przykładowej procedurze poniżej indeks o nazwie Location oparty jest na dwóch polach: City oraz Region.
Przykład 3.5.C. Dodawanie indeksu złożonego do bieżącej tabeli
Sub AddC3_MFieldIndex ()
Dim conn As New ADODB.Connection With conn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.Open "Data Source=C:\Program FilesXMicrosoft Office\PL\" &
"Office\Samples\Northwind.mdb"
' Utwórz indeks złożony o nazwie Miejse oparty na ' polach Miasto oraz Region.
.Execute "CREATE INDEX Miejsce on Pracownicy (Miasto, Region);" End With conn.Close Set conn = Nothing
MsgBox "Utworzono nowy indeks o nazwie Miejsce." End Sub
396
Programowanie w Access 2W
W yszczególnianie indeksów w tabeli
Zbiór Indexes mieści wszystkie indeksy zdefiniowane w danej tabeli. Proceł poniżej demonstruje, w jaki sposób możesz wyszczególnić indeksy zdefmkmJ w tabeli Pracownicy w bazie danych Northwind i wpisać ich nazwy do okna InstnJ cje bezpośrednie.
Przykład 3.5.D. Wyszczególnianie indeksów w tabeli
Sub List_Indexes()
Dim conn As New ADODB.Connection Dim cat As New ADOX.Catalog Dim tbl As New ADOX.Table Dim idx As New ADOX.Index With conn
.Provider = "Microsoft.Jet.OLEDB.4.0" .Open "Data Source=C : \Program FileiAMicrosoft Office\PL\"
"Office\Samples\Northwind.mdb" End With
cat.ActiveConnection = conn Set tbl = cat.Tables("Pracownicy") For Each idx In tbl.Indexes
Debug.Print idx.Name Next idx conn.Close Set conn = Nothing
MsgBox "Indeksy są podane w oknie Instrukcje bezpośrednie." End Sub
Wymazywanie indeksów z tabeli
Chociaż możesz wymazać niepotrzebne lub przestarzałe indeksy w oknie dialog Indeksy w interfejsie użytkownika, o wiele szybciej wymazuje sieje programatyczi Procedura w przykładzie 3.5.E ilustruje, w jaki sposób można wymazać wszysi indeksy z wyjątkiem klucza podstawowego z tabel: Pracownicy w bazie danych Ni thwind. Zwróć uwagę na to, że po każdym wymazaniu indeksu ze zbioru Indaj obiektu Table, musisz ponownie ustawić odwołanie do tabeli, gdyż bieżące ustawie znikają, gdy indeks zostaje wymazany. Stąd, polecenie GoTo Setup odsyła Vis Basic do eytkietki Setup, aby pobrać nowe odwołanie do obiektu Table.
[worzenie i manipulowanie bazami danych za pomocą ADO
397
I Przykład 3.5.E. Wymazywanie indeksów z tabeli
Sub Delete_Indexes ()
Dim conn As New ADODB.Connection Dim cat As New ADOX.Catalog Dim tbl As New ADOX.Table Dim idx As New ADOX.Index Dim count As Integer With conn
.Provider = "Microsoft.Jet.OLEDB.4.0" .Open "Data Source=C:\Program FilesXMicrosoft Office\PL\" & _
"Office\Samples\Northwind.mdb" End With
cat .ActiveConnection = conn etup:
Set tbl = cat.Tables("Pracownicy") Debug.Print tbl.Indexes.count For Each idx In tbl.Indexes
If idx.PrimaryKey <> True Then
tbl.Indexes.Delete (idx.Name) GoTo Setup End If Next idx conn.Close Set conn = Nothing MsgBox "Wymazano wszystkie indeksy oprócz" & _
"klucza podstawowego. " bd Sub
vorzenie relacji między tabelami
Aby utworzyć relację jeden do wielu (one-to-many) pomiędzy tabelami, należy:
Skorzystać z obiektu Key z biblioteki ADOX, aby utworzyć obcy klucz i przypisać właściwości Type obiektu Key stałą o nazwie adKeyForeign.
Klucz obcy składa się z jednego lub więcej pól w tabeli obcej, które unikalnie ntyfikują wszystkie rzędy w tabeli podstawowej (Primary table).
i
398
Programowanie w Access
S
korzystać
z właściwości RelatedTable, aby wskazać nazwę tabeli obcej
(FoJ
ign
table).
Skorzystać
z metody Append,
aby
dodać odpowiednie kolumny (pola) w tan
obcej
do klucza obcego.
Tabela obca zazwyczaj znajduje się po stronie .,wiele" w relacji jeden do wij i daje klucz obcy do innej tabeli w bazie danych.
Przypisać
właściwości RelatedColumn nazwę odpowiedniej kolumny w
tabJ
podstawowej.
Posłużyć
się metodą Append,
aby
dodać klucz obcy do zbioru Keys
tabeli
posil
dającej
klucz podstawowy.
Procedura w przykładzie 3.5.F. ilustruje, w jak sposób tworzy się relację jedej do wielu pomiędzy dwiema tabelami: Autorzy oraz AutorISBN.
Przykład 3.5.F. Tworzenie relacji jeden do wielu
Sub CreateTblRelation()
Dim cat As New ADOX.Catalog
Dim fKey As New ADOX.Key
On Error GoTo ObsługaBłędu
cat.ActiveConnection = CurrentProject.Connection
With fKey
.Name = "AutorISBN"
.Type = adKeyForeign
.RelatedTable = "Autorzy"
.Columns.Append "IdAutora"
.Columns("IdAutora").RelatedColumn = "IdAutora" End With
cat.Tables("AutorISBN").Keys.Append fKey MsgBox "Utworzono relację między tabelami." Exit Sub ObsługaBłędu:
cat.Tables("AutorISBN").Keys.Delete "AutorISBN" Resume End Sub
I Tworzenie i manipulowanie bazami danych za pomocą ADO
399
Po uruchomieniu procedury w przykładzie 3.5.F. okno Relacje w interfejsie
j użytkownika wygląda tak:
■ ■ ■■■-.- ■■-■.. - |
_:n.x' |
||||
|
|
"\ |
■■■■■:■■■ '■ ■* |
||
|
NazwiskoAutora ImieAutora Ulica Miasto |
|
|
||
|
IdAUbora ISBN |
||||
|
Region KodPocztowy Telefon Komentarz |
|
|||
y _ ±- |
Tworzenie i uruchamianie kwerend
Dostawca Microsoft Jet Provider rozróżnia następujące typy kwerend:
Kwerendy zwracające rekordy, takie jak kwerendy wybierające (SELECT), znane są jako bezparametrowe kwerendy zwracające rzędy.
Używaj obiektu View z biblioteki ADOX, aby pracować z kwerendami, które zwracają rekordy i nie przyjmują parametrów. Wszystkie obiekty View należą do zbioru Views obiektu Catalog w bibliotece ADOX. Aby zachować te typy kwerend w bazie danych, dodaj obiekt Command z bibioteki ADOX do zbioru Views za pomocą metody Append.
K werendy, które zwracają rekordy i są w stanie pobrać parametry znane są jako parametryzowane kwerendy zwracające rzędy.
400
Programowanie w Access 1
U żywaj obiektu Procedure z biblioteki ADOX, aby pracować z kwerendami, LiJ zwracają rekordy i przyjmują parametry. Wszystkie obiekty Procedure należą do zH ru Procedures obiektu Catalog w bibliotece ADOX. Aby zachować te typy kweij w bazie danych, dodaj obiekt Command z bibioteki ADOX do zbioru Procedures] pomocą metody Append.
Kwerendy, które nie zwracają rekordów, takie jak kwerendy wykonujące zadaj (Action) lub kwerendy definiujące dane (DDL), znane są jako kwerendy ■ zwracające rzędów. Kwerendy modyfikujące dane (Action) wykonują szers operacji na danym zestawie rekordów. Umożliwiają one dodawanie, rnodyfikc wanie, oraz wymazywanie rekordów. Kwerendy definiujące dane (DDL) są J sowane do tworzenia obiektów bazy danych oraz zmiany struktury bazy.
.
Używaj obiektu Procedure z biblioteki ADOX, aby pracować z kwerendami, której zwracają rekordów. Wszystkie obiekty Procedure należą do zbioru Procedures obieU Catalog w bibliotece ADOX. Aby zachować te typy kwerend w bazie danych, da obiekt Command z bibioteki ADOX do zbioru Procedures za pomocą metody Appi
. —.
W dalszych zagadnieniach tego rozdziału nauczysz się tworzyć, uruchami] modyfikować, wymazywać i wyszczególniać kwerendy w swojej bazie danych.
S! frmPoznaiADO2: Formularz
T worzenie i uruchamianie kwerend I
r Sporządź
i ńj 0 '%'/■
i b I 0 Kwerendę z parametrem
'< C ] ® Kwerendę przekazującą
/"Uruchom -~~'—~~—~ —— ---
i J]Jj 0 Kwerendę wybierająca. i E I ^ Kwerendą z parametrem I F j fif Kwerendę aktualizującą
G j Zmodyfikuj kwerendę j H j Podaj wykaz kwerend I j Usuń kwerendę
Rysunek 3.6. Praca z kwerendami przy użyciu obiektów ADO
Tworzenie i manipulowanie bazami danych za pomocą ADO
401
T worzenie kwerendy wybierającej (Select Query)
Aby utworzyć kwerendę zwracającą rzędy, taką jak dostępna w interfejsie użytkownika kwerenda wybierająca, otwórz obiekt Catalog w bibliotece ADOX i skorzystaj z właściwości CommandText obiektu Command. Przypisz właściwości Com-I mandText polecenie SQL. Na przykład, aby wybrać wszystkich pracowników z tabeli I Pracownicy, możesz podać następujące instrukcje:
I ciad.CommandText = "Select * FROM Pracownicy"
lub
IstrSQL = "Select * FROM Pracownicy" I and.CommandText = strSQL
Procedura w przykładzie 3.6.A otwiera obiekt Catalog i przypisuje właściwości ActiveConnection tego obiektu bazę danych Northwind. Następnie, polecenie SELECT jest przypisane obiektowi Command. Ponieważ obiekt Command zawsze tworzy tymczasową kwerendę, aby zapisać daną kwerendę na stałe w bazie danych procedura musi dodać obiekt Command do zbioru Views za pomocą metody Append.
Przykład 3.6.A. Tworzenie kwerendy wybierającej
Sub Create_SelectQuery() Dim cat As ADOX.Catalog Dim and As ADODB. Command Dim strPath As String Dim strSQL As String Dim strQryName As String On Error GoTo ErrorHandle strPath = "C:\Program Files\Microsoft Office\PL\" & _
"Office\Samples\Northwind.mdb"
strSQL = "SELECT Pracownicy.* FROM Pracownicy WHERE " _ & "Pracownicy .Miasto= ' Londyn' ; " strQryName = "Pracownicy w Londynie" Set cat = New ADOX.Catalog cat.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" &
"Data Source =" & strPath Set cmd = New ADODB.Command cmd. CommandText = strSQL
402
Programowanie w Access w
c at.Views.Append StrQryName, cmd
Set cmd = Nothing
MsgBox "Procedura zakńnczyła się pomyślnie.",
vblnformation, "Utwórz kwerendę wybierającą " Exit Sub ErrorHandle:
If InStr(Err.Description, "already exists") Then cat.Views.Delete strQryName Resume Else
MsgBox Err.Number & ": " & Err.Description End If End Sub
Jeżeli po wykonaniu powyższej procedury otworzysz przykładową bazę i Northwind, to nie znajdziesz w oknie bazy danych kwerendy o nazwie „Pracow w Londynie". Kwerendy sporządzone za pomocą obiektów ADOX nie są widocj w oknie bazy danych. Jednakże, jeżeli masz jakiekowiek wątpliwości czy kwereJ
takiej
nazwie w istocie została
sporządzona przez powyższą procedurę, możesz!
dość
łatwo sprawdzić. W oknie bazy danych Northwind, kliknij na
przycisk Kwe
kliknij
dwukrotnie myszą
na opcję Utwórz
kwere ndę za
pomocą
kreatora (Crs
query
by using wizard). Kiedy
pojawi się okno Kreatora kwerendy, sprawdź spis \
rend
w
rozwijanej liście Tabele/Kwerendy, według lysunku pokazanego
poniżej.
K reator prostych kwerend
.,, ...... , V
Jakie pola mają być umieszczone w kwerendzie? Możesz wybrać spośród kilku tabel lub kwerend.
Tabele/Kwerendy
Kwerenda: Pracownics' w Lond1,
Dostępne pola:
Wybrane pola:
N azwisko
Imię
Stanowisko
ZwrotGrzecznościowy
DataUrodzenia
DataZatrudnienia
Adres
A nuluj
Dalej > I Zakończ
t worzenie Knwcuuj *, j,„.
Aby utworzyć parametryzowaną kwerendę zwracającą rzędy, dodaj parametry do łańcucha SQL. Parametry należy zdefiniować przy użyciu słowa kluczowego parame-Łers, tak jak pokazano poniżej:
■' zdefiniuj polecenie SQL
sr:SQL = "Parameters [Wpisz nazwę kraju] Text;" & ■ ■SELECT Klienci.* FROM Klienci WHERE " _ I i "Klienci.Kraj=[ Wpisz nazwę kraju];"
I 'crzypisz łańcuch SQL właściwości CommandText obiektu Command I sec cmd = New ADODB. Command I ;nd.CommandText = strSQL
Polecenie SQL zaczyna się od zdefiniowania jednego parametru o nazwie wpisz I nazwę kraju. Parametr ten może przechować tylko tekst. Druga część polecenia SQL I wybiera wszystkie rekordy z tabeli Klienci, dla których wpis w polu Kraj równa się I wartości podanej w parametrze. Następnie polecenie SQL zostaje przypisane właściwości CommandText obiektu command. Cała procedura pokazana jest w przykładzie j,6.B. Ponieważ obiekt command zawsze tworzy tymczasową kwerendę, aby zapisać daną kwerendę na stałe w bazie danych procedura musi dodać obiekt command do zbioru Procedures za pomocą metody Append.
Przykład 3.6.B. Tworzenie kwerendy parametryzowanej
Sub Create_ParameterQuery () Dim cat As ADOX.Catalog Dim cmd As ADODB.Command Dim strPath As String Dim strSQL As String
Dim strQryName As String
On Error GoTo ErrorHandle
strPath = "C:\Program FilesXMicrosoft Office\PL\" & _ "Office\Samples\Northwind.mdb"
strSQL = "Parameters [Wpisz nazwę kraju] Text;" & _
404
Programowanie w Access 2
" SELECT Klienci.* FROM Klienci WHERE '
& "Klienci.Kraj=[Wpisz nazwę kraju];"
strQryName = "Klienci według kraju"
Set cat = New ADOX.Catalog
cat.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4 . 0;
"Data Source =" & strPath
Set cmd = New ADODB.Command
cmd.CommandText = strSQL
cat.Procedures.Append strQryName, cmd
Set cmd = Nothing
MsgBox "Procedura zakończyła się pomyślnie.", vblnformation, "Kwerenda z parametrem"
Exit Sub ErrorHandle:
If InStr(Err.Description, "already exists") Then
cat.Procedures.Delete strQryName
Resume
Else
MsgBox Err.Number & ": " & Err.Description
End If End Sub
Jak wcześniej wspomniano, kwerendy utworzcne programatycznie za pomocą adox nie są uwidocznione w oknie bazy danych. Aby użytkownik mógł korzysta z kwerendy parametryzowanej, skorzystaj z kreatora kwerend. Sporządzisz wtedy ni wą kwerendę na podstawie oryginalnej kwerendy, tak jak pokazano poniżej:
■7^-n .■ -...i. . v
Jakte pola mała. być umieszczone w kwerendzie' Możesz wybrat spośród hkj tabel lub kwerend.
JKwerenda:
Klienci wedHjg kraju ^
j
■
Dostępne poJas.. ;>.: '
■ . :
_ J
Adres
Miasto
Region
KodPocztowy
Kra)
Telefon
faks
i
Tworzenie i manipulowanie bazami danych za pomocą ADO
405
P o kliknięciu przycisku Dalej pojawia się okno dialogowe Wprowadzanie wartości parametru:
Wprowadzanie wartości par
Wpisz nazwę kraju
O K
Anuluj
P o wpisaniu nazwy kraju w tym oknie (np. Francja) pojawią się wszystkie rekordy klientów danego kraju.
3 Klienci wed3ufl kraju Kwerenda: Kwei i |
|
|
|||||
|
ID klienta |
Nazwa firmy |
Przedstawiciel |
Stanowisko |
Adres |
||
7 |
^Tililil |
Biondel pere et fils |
Frederique Citeaux |
: Dyrektor ds. marketingu |
24, place Kleber |
||
|
BONAP |
: Bon app' |
Laurence Lebihan |
Właściciel |
12, rue des Bouchers |
||
|
DUMON |
: Du monde entier |
Janinę Labrune |
Właściciel |
67, rue des Cinquante ( |
||
|
FOLIG |
Folies gourmandes |
Martine Ranee |
Asystent agenta sprzedaży |
184, chaussee de Toun |
||
|
FRANR |
France restauration |
Carine Schmitt |
Dyrektor ds. marketingu |
54, rue Royale |
||
- |
LACOR |
La come d'abondance |
Daniel Tonini |
Przedstawiciel handlowy |
67, avenue de I'Europe |
||
LAMAI |
La maison d'Asie |
Annette Roulet |
Dyrektor ds. sprzedaży |
1 rue Alsace-Lorraine |
|||
~~ |
PARIS |
■ Paris specialites |
Marie Bertrand |
Właściciel |
265, boulevard Charonn |
||
~~ |
SPECD |
Specialites du monde |
Dominique Perrier |
Dyrektor ds. marketingu |
25, rue Lauriston |
||
~~ |
VICTE |
Victuailles en stock |
Mary Saveley |
Agent sprzedaży |
2, rue du Commerce |
||
L |
WET mm |
:Vins et alcools Chevalier rrnii |
Paul Henriot |
1 Główny księgowy |
59 rue de I'Abbaye |
||
|
r,>i> |
|
|
|
Po zamknięciu kwerendy kwerenda oparta na kwerendzie Klienci według kraju jest teraz dostępna dla użytkownika.
406
Programowanie w Access 21
^Otwórz
j^ Projektuj
u
Obiekty jNazwa
i
Northwind:
Baza danych
Utwórz kwerendą w widoku projektu Utwórz kwerendę za pomocą kreatora Alfabetyczna lista produktów Bieżąca lista produktów Dziesięć najdroższych produktów
(jp Faktury Filtr faktur
OD Klienci i dostawcy wg miast
Klienci według kraju Kwerenda
Kwerenda dla formularza Zamówienia Podsumowania zamówień Produkty o cenie powyżej przeciętnej Produkty wg kategorii Rozszerzone opisy 2amówień ||p Sprzedaż wg kategorii
Sprzedaż wg kategorii w 1997 roku
U
rłp CnrMkHw* urn l»fc
L
-Jnixt
Odnośna kwerenda do raportu Alfabetyc2... 1999-05-05 20:0,
Filtruje rekordy w tabeli Produkty; w wynik,.. 1999-03-2317:3,
(Największe wa'tosci) Zwraca 10 najdrożs... 1999-03-23173,
(Kryteria) Źródł 3 rekordów dla raportu Fak... 1999-05-28 06:4,
Filtry rekordów « raporcie Faktura. Odwoł... 1999-03-23 17:3,
(Kwerenda składająca) Zwraca listą dosta... 1999-03-23 17:3,
2002-03-18 18:0,
Odnośna kwereida dla formularza Zamówi... 1999-05-28 04:1
Źródło rekordów dla innych kwerend. Uży.,. 1999-05-0513:3,
(Podkwerenda) Zwraca produkty o cenie j... 1999-03-23 17:3,
Odnośna kwereida dla raportu Produkty ,., 1999-03-2318:1.
Źródło rekordów dla kilku formularzy i rapo... 1999-04-2221:2,
Źródło rekordów dla raportu Sprzedaż wg ... 1999-04-2221:2,
Podsumowania sprzedaży produktów wg k... 1999-05-05 13:5,
T worzenie kwerendy przekazującej
Kwerendy przekazujące (Pass-through) są poleceniami SQL, które sąwysyj bezpośrednio do serwera bazy danych z pominięciem silnika bazy danych Micros Jet. W DAO kwerendy przekazujące były stosowane w celu uzyskania lepszej wyd ności przy pobieraniu danych z zewnętrzych źródeł danych ODBC. W ADO moa skorzystać z dostawcy Microsoft OLE DB dla serwera SQL, aby uzyskać bezpośn dostęp do serwera SQL. Z tego powodu tworzenie kwerend przekazujących jest ; teczne. Można jednak utworzyć kwerendę tego typu przy użyciu ADOX i dostaw Microsoft Jet Provider. Następująca procedura demonstruje, jak to zrobić. W celu j łączenia się z bazą danych Northwind skorzystamy z połączenia ODBC o na ODBCNorth. Informacje dotyczące szczegółów utworzenia źródła danych DSN: dują się w zagadnieniu zatytułowanym „Otwieranie pliku dBASE przy użyciu dostaw cy MSDASQL" wcześniej w tym rozdziale. Po nawiązaniu łączności ze źródłem i nych procedura przypisuje instrukcję SQL właściwości commandText obiektu commJ i ustawia jeszcze dwie dodatkowe właściwości obiektu command, które są związał z dostawcą źródła danych:
Jet OLEDB:ODBC Pass-Through Statement
Jet OLEDB:Pass Through Query Connect String
Tworzenie i manipulowanie bazami danych za pomocą ADO
Kwerenda przekazująca jest następnie zachowana w zbiorze Procedures.
j Przykład 3.6.C. Tworzenie kwerendy przekazującej
407
S ub Create_PassThroughQuery () Dim cat As ADOX.Catalog Dim cmd As ADODB.Command Dim strPath As String Dim strSQL As String Dim strKwerenda As String Dim strODBCConnect As String On Error GoTo ObsługaBłędu strPath = "C:\Program Files\Microsoft Office\PL\" & _
"Office\Samples\Northwind.mdb" StrSQL = "SELECT Klienci.* FROM Klienci WHERE " _
& "Klienci.Kraj='Francja';" strKwerenda = "Francuzi"
StrODBCConnect = "ODBC;DSN=ODBCNorth;UID=sa;PWD=;" Set cat = New ADOX.Catalog cat.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & strPath Set cmd = New ADODB.Command
With cmd
.ActiveConnection = cat.ActiveConnection
.CommandText = strSQL
.Properties("Jet OLEDB:ODBC Pass-Through Statement") = True .Properties("Jet OLEDB:Pass Through Query Connect String") = s trODBCConnec t
End With
cat.Procedures.Append strKwerenda, cmd
Set cmd = Nothing
MsgBox "Procedura zakończyła się pomyślnie.",
vblnformation, "Kwerenda przekazująca" Exit Sub ObsługaBłędu:
If inStr(Err.Description, "already exists.") Then
cat.Procedures.Delete strKwerenda
Resume
Else
MsgBox Err.Number & ": " & Err.Description
408
Programowanie w Access 2
End If End Sub
Uruchamianie kwerendy wybierającej
Istnieje kilka sposobów uruchomienia za pomocą ADO kwerendy zwracają rzędy. Kolejne zagadnienie demonstruje dwie procedury, które uruchamiają kwers Produkty według kategorii znajdującą się w bazie danych Northwind.
Pierwsza procedura w przykładzie 3.6.D korzysta z obiektów command oraz! cordset. W tym przykładzie łączność ze źródłem danych zostaje otwarta za porno
właściwości ActiveConnection. Następnie właściwość CommandText obiektu Coi
mand określa nazwę kwerendy, którą zamierzasz uruchomić. Jeżeli nazwa kwerei zawiera odstępy między wyrazami, to należy podać nazwę kwerendy wnawiasaJ kwadratowych. Typ kwerendy determinuje się, ustawiając właściwość commandTyJ
obiektu Command. Użyj tutaj Stałą adCmdTable lub adCmdStoredProc, jeżeli ciągaj
ków przypisany właściwości CommandText jest nazwą kwerendy. W końcu mej Execute obiektu command uruchamia kwerendę. Zwrócony zestaw rekordów przej zany jest zmiennej obiektowej Recordset, aby użytkownik był w stanieje przegląd al Zamiast korzystać z pętli w celu przeczytania zwróconych rekordów, procedura wyj rzystuje metodę Getstring obiektu Recordset, aby wydrukować wszystkie rzędl w otrzymanym zestawie rekordów do okna Instrukcje bezpośrednie.
Przykład 3.6.D. Uruchamianie kwerendy zwracającej rzędy (kwerenda wybierająca)
Sub Execute_SelectQuery()
Dim cmd As New ADODB.Command
Dim rst As New ADODB.Recordset
Dim dbPath As String
dbPath = "C:\Program FilesXMicrosoft Off}.ce\PL\" i
"Office\Samples\Northwind.mdb" With cmd
.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0 ; " &
"Data Source =" & dbPath
.CommandText = "[Produkty wg kategorii]"
.CommandType = adCmdTable End With
Set rst = cmd.Execute Debug.Print rst.Getstring rst.Close
Tworzenie i manipulowanie bazami danych za pomocą ADO
409
Set rst = Nothing
MsgBox "Zobacz rezultat w oknie Instrukcje bezpośrednie. " End Sub
Przykład rekordów wygenerowanych przez procedurę w przykładzie 3.6.D.
Immediate
Bakalie Longlife Tofu 5 kg pud. 4 0
Bakalie Manjirnup Dried Apples 50 - 300 g pud. 20 0
Bakalie Tofu 40- 100 g pud. 35 0
Bakalie Uncle Bob's Organie Dried Pears 12 - 500 g op. 15 0
Mieso/Drób Pate chinois 24 pud. x 2 szt. 115 0
Mieso/Drób Tourtiere 16 szt. 21 0
Nabiał Camembert Pierrot 15 - 300 g op. 19 0
Nabiał Flotemysost 10 - 500 g op. 26 0
Nabiał Geitost 500 g 112 0
Nabiał Gorgonzola Telino 12 - 100 g op. 0 0
Nabiał Gudbrandsdalsost 10 kg pud. 26 0
Nabiał Mascarpone Fabioli 24 - 200 g pud. 9 0
Nabiał Mozzarella di Giovanni 24 - 200 g op. 14 0
Nabiał Queso Cabrales 1 kg pud. 22 0
Nabiał Queso Manchego La Pastora 10 - 500 g pud. 86 0
Nabiał Raclette Courdavault 5 kg pud. 79 0
Przykładowa procedura poniżej demonstruje jeszcze inną metodę uruchamiania za pomocą ADO kwerendy zwracającej rzędy. Zwróć uwagę na to, że oprócz obiektów command oraz Recordset, procedura ta korzysta z obiektu catalog. Łączność ze źródłem danych nawiązana jest poprzez przypisanie wartości właściwości Activecon-nection obiektu catalog, a nie obiektu Command, jak to miało miejsce w poprzednim przykładzie (zob. przykład 3.6.D powyżej). Następujący wiersz kodu wskazuje nazwę kwerendy, którą zamierzamy uruchomić:
Set cmd = cat.Views("Produkty wg kategorii").Command
Polecenie to przypisuje zmiennej obiektowej cmd nazwę kwerendy przechowywaną w zbiorze views obiektu catalog pochodzącego zbibłioteki ADOX. Następnie metoda open obiektu Recordset otwiera obiekt Rekordset oparty na podanej kwerendzie:
410
Programowanie w Access 2
r st.Open cmd, , adOpenStatic, adLockReadOnly, adCmdTable
Zauważ kilka opcjonalnych argumentów metody open, które określają źrój danych (cmd). Przecinek w miejscu drugiej go argumentu oznacza wykorzysta bieżącego połączenia z bazą danych (Activeconnection), typ kursora - Cursor?
(adOpenStatic), typ zabezpieczenia - LockType (adLock-ReadOnly) oraz opcje^
datkowe - options (adCmdTable). Następnie procedura wpisuje zawartość rekoit do okna Instrukcje bezpośrednie za pomocą metody Getstring obiektu Records! (tak samo jak to zrobiła procedura w przykładzie 3.6.D). Funkcja MsgBox wyświd komunikat podający liczbę pobranych rekordów. Do obliczenia liczby rekordów sla właściwość Recordcount obiektu Recordset. Aby otrzymać prawidłową liczbę j kordów, należy przypisać argumentowi cursorType metody open stałą o nazwie aj penStatic. Jeżeli ustawisz ten argument na adOperDynamie lub adOpenForwardOnl to właściwość Recordsetcount zwróci —1. Aby dowiedzieć się więcej na temat t stałych, przejdź do zagadnień dotyczących pracy z obiektami Recordset w dals części tego rozdziału.
Sub Execute_SelectQuery2() Dim cat As ADOX.Catalog Dim cmd As ADODB.Command Dim rst As New ADODB.Recordset Dim dbPath As String dbPath = "C:\Program Files\Microsoft Office\PL\" & _
"Office\Samples\Northwind.mdb" Set cat = New ADOX.Catalog cat.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4 . 0;" &
"Data Source =" & dbPath Set cmd = New ADODB.Command
Set cmd = cat.Views("Produkty wg kategorii").Command rst.Open cmd, , adOpenStatic, adLockReadOnly, adCmdTable Debug.Print rst.Getstring MsgBox "Ta kwerenda zwróciła " & rst.RecordCount & vbCr &
" rekordów do okna Instrukcje bezpo; rednie.' rst.Close Set rst = Nothing Set cat = Nothing End Sub
Tworzenie i manipulowanie bazami danych za pomocą ADO
411
Uruchamianie kwerendy z parametrem
Załóżmy, że chcesz uruchomić kwerendę o nazwie Filtr faktur, która wygląda następująco:
N azwaOdbiorcy ńdresOdbiorcy MiastoOdbiorcy RegionOdbiorcy
P ole:
Tabela;
Sortuj;
Pokaż;
Kryteria;
lub;
[Forms]![Zarnowienia]![IDzamowienia]
P onieważ ta kwerenda odwołuje się do pola IDzamówienia na formularzu Faktury, a formularz ten w tej chwili jest zamknięty, przed uruchomieniem kwerendy jesteś proszony o wprowadzenie wartości parametru.
.prowadzanie war
mmmm
Forms!Zarnówienia!IDzamówienia
OK
Anuluj
P rocedura w przykładzie 3.6.E demonstruje, w jaki sposób uruchomić ten typ kwerendy programatycznie przy użyciu ADO. Procedura ta łączy się z bazą danych Northwind i określa nazwę kwerendy w sposób następujący:
Set cmd = cat.Procedures("Filtr faktur").Command
412
Programowanie w Access j
N astępnie wartość parametru podana jest przy użyciu zbioru Parameters obi Command:
cmd.Parameters("[Forms]![Faktury]![IDzamówienia]") = 10258
U waga: Zamiast podawać wartości parametrów przed otwarciem obiektu Record możesz skorzystać z argumentu Parameters metody open (obiektu Recorset). W,| sposób przekażesz wartość parametru, tak jak w poleceniu poniżej:
S et rst = cmd.Execute(Parameters:=10258)
Następnie, korzystając z metody Execute obiektu command, otwieramy RecJ
set:
Set rst = cmd.Execute
Na zakończenie procedura korzysta z pętli w celu pobrania i wpisania do i Instrukcje bezpośrednie zawartości dwudziestego pola (NazwaProduktu) w ka rekordzie. Po uruchomieniu procedury w oknie Instrukcje bezpośrednie znąjdu następujące dane:
NazwaProduktu: Chang
NazwaProduktu: Chef Anton's Gumbo Mix
NazwaProduktu: Mascarpone Fabioli
Przykład 3.6.E. Uruchamianie kwerendy parametryzDwanej
Sub Execute_ParamQuery()
Dim cat As ADOX.Catalog
Dim cmd As ADODB.Command
Dim rst As ADODB.Recordset
Dim dbPath As String
dbPath = "C:\Program Files\Microsoft Office\PL\" & _
"Office\Samples\Northwind.mdb" Set cat = New ADOX.Catalog cat.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4 . 0 ; " &
!
413
"Data Source =" & dbPath Set cmd = New ADODB.Command
Set cmd = cat.Procedures("Filtr faktur").Command ' podaj wartość parametru
cmd. Parameters("[Forms]![Zamówienia] ![IDzamówienia]") = 10258 ' wykonaj polecenie, aby pobrać zestaw rekordów Set rst = cmd.Execute ' wpisz nazwy produktów do okna Instrukcje bezpośrednie
Do Until rst.EOF
Debug.Print rst(20).Name & ": " & rst(20)
rst.MoveNext
Loop
rst.Close
Set rst = Nothing
Set cmd = Nothing
MsgBox "Zobacz rezultat w oknie Instrukcje bezpośrednie. "
End Sub
Uruchamianie kwerendy aktualizującej
W ADO uruchamianie kwerend, które modyfikują dane, nie nastręcza większych trudności. Możesz skorzystać z metody Execute obiektu connection lub obiektu , command. Procedura w przykładzie 3.6.F korzysta z metody Execute obiektu Connection, aby uaktualizować rekordy w tabeli Produkty mieszczącej się w bazie danych Northwind. Modyfikowane są tylko te rekordy, w których wartość w polu IDkategorii wynosi 8. Cena jednostkowa rekordów, jakie spełnią ten warunek, będzie zwiększona ojeden dolar. Metoda Execute zwraca liczbę zaktualizowanych rekordów do zmiennej 0 nazwie LiczbaRek.
Przykład 3.6.F. Uruchamianie kwerendy aktualizującej
Sub Execute_UpdateQuery ()
Dim conn As New ADODB.Connection
Dim LiczbaRek As Integer
Dim strPath As String
strPath = "C:\Program Files\Microsoft Office\PL\" & _
"Office\Samples\Northwind.mdb"
conn.Open "Provider = Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & strPath
i
- :
414
Programowanie w Access 2
c onn.Execute "Update Produkty Set " & _
"CenaJednostkowa = CenaJednostkowa + 1" & _
" Where IDkategorii = 8", LiczbaRek, adExecuteNoRecords
MsgBox LiczbaRek & " rekordów zostało uaktualnionych."
conn.Close End Sub
Następna procedura demonstruje, w jaki sposób można uruchomić kwerendę* tualizującą za pomocą metody Execute obiektu command. Po uruchomieniu przyj dowej procedury poniżej cena productu (cenajednostkowa) wszystkich rekordi w tabeli Produkty zostanie powiększona o 10 procent.
Sub Execute_UpdateQuery2() Dim cmd As ADODB.Command Dim LiczbaRek As Integer Dim strPath As String
strPath = "C:\Program Files\Microsoft Office\PL\" & _ "Office\Samples\Northwind.mdb"
Set cmd = New ADODB.Command With cmd
.ActiveConnection = "Provider = Microsoft.Jet.OLEDB.4. 0;" &
"Data Source=" & strPath .CommandText = "Update Produkty Set " & _
"CenaJednostkowa = CenaJednostkowa *1.1" .Execute LiczbaRek End With
MsgBox LiczbaRek End Sub
Modyfikowanie kwerendy
Jeżeli chcesz zmodyfikować kwerendę zachowaną poprzednio w bazie danych skorzystaj z następujących wskazówek:
Pobierz kwerendę ze zbioru views lub Procedures obiektu catalog.
Przypisz właściwości CommandText obiektu command nowe polecenie SQL.
Tworzenie i manipulowanie bazami danych za pomocą ADO
3 . Zachowaj zmiany, przypisując właściwości command obiektu view lub obiektu
Procedure zmodyfikowany obiekt Command.
Wcześniej w tym rozdziale dowiedziałeś się, w jaki sposób można utworzyć kwerendę wybierającą przy użyciu ADO (zob. przykład 3.6.A). Kwerendę tę nazwaliśmy Pracownicy w Londynie . Zobaczmy teraz, w jaki sposób można tę kwerendę i zmodyfikować, tak aby sortowała ona rekordy pracowników według ich daty urodzenia.
[ Przykład 3.6.G. Modyfikowanie kwerendy wybierającej
Sub Modify_Query ()
Dim cat As ADOX.Catalog
Dim cmd As ADODB.Command
Dim strPath As String
Dim newStrSQL As String
Dim oldStrSQL As String
Dim strKwerenda As String
strPath = "C:\Program FilesXMicrosoft Office\PL\" & _
"Office\Samples\Northwind.mdb"
newStrSQL = "SELECT Pracownicy.* FROM Pracownicy WHERE " _ & "Pracownicy.Miasto='Londyn' ORDER BY DataUrodzenia;" strKwerenda = "Pracownicy w Londynie" Set cat = New ADOX.Catalog cat.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" &
"Data Source=" & strPath Set cmd = New ADODB. Command Set cmd = cat.Views(strKwerenda).Command 1 pokaż bieżące polecenie SQL dla tej kwerendy oldStrSQL = cmd.CommandText
MsgBox oldStrSQL, , "Aktualne polecenie SQL" ' zaktualizuj polecenie SQL kwerendy cmd.CommandText = newStrSQL MsgBox newStrSQL, , "Nowe polecenie SQL" 1 zachowaj zmodyfikowaną kwerendę Set cat.Views(strKwerenda).Command = cmd Set cat = Nothing End Sub
416 |
Programowanie w Access] |
|||
W trakcie odtwarzania tej procedury pojawią s treść polecenia SQL przed modyfikacją i po tej czyn |
ię dwa okna komunikatu podaj ności. |
|||
EE^'- " x |
|
|
||
SELECT Pracownicy.* FROM Pracownicy WHERE Pracownicy. Miasto='Londyn'j |
|
|
||
|
i OK ; |
|
|
|
|
|
|
|
|
|
|
|
Nowe
polecenie SQL
SELECT Pracownicy.* FROM Pracownicy WHERE Pracownicy,Mi;isto='Londyn' ORDER BY DataUrodzeJ
OK
W yszczególnianie nazw kwerend w bazie danych
Procedura w przykładzie 3.6.H pobiera nazwy wszystkich kwerend zachowań* w bazie danych Northwind, sprawdzając wszystkie obiekty view przechowywj w zbiorze views obiektu catalog.
Przykład 3.6.H. Wyszczególnianie nazw kwerend zachowanych w bazie danych
Sub List_SavedQueries()
Dim cat As New ADOX.Catalog
Dim v As ADOX.View
Dim strPath As String
strPath = "C:\Program Files\Microsoft Office\PL\" & _
"Office\Samples\Northwind.mdb" cat.ActiveConnection = "Provider=Microsoft.Jet.OleDb.4.0; " &
"Data Source =" & strPath For Each v In cat.Views
Debug.Print v.Name Next
Set cat = Nothing MsgBox "Zobacz spis kwerend w oknie Instrukcje bezpośrednie.1 End Sub
Tworzenie i manipulowanie bazami danych za pomocą ADO
417
Zrzut ekranu przedstawiony poniżej podaje nazwy kwerend zachowanych w bazie danych Northwind bez względu na to, czy są one widoczne w oknie bazy danych w interfejsie użytkownika w aplikacji Access 2000.
immediate
Alfabetyczna lista produktów
Bieżąca lista produktów
Dziesięć najdroższych produktów
Faktury
Kwerenda dla formularza Zamówienia
Podsumowania zamówień
Pracownicy w Londynie
Produkty o cenie powyżej przeciętnej
Produkty wg kategorii
Rozszerzone opisy zamówień
Sprzedaż wg kategorii
Sprzedaż wg kategorii w 1997 roku
Sprzedaż wg produktów w 1997 roku
Zamówienia kwartalne
Usuwanie kwerendy
Aby usunąć kwerendę, skorzystaj z metody Delete zbioru Procedures lub views. Uruchamiając procedurę w przykładzie 3.6.1 będziesz mógł szybko usunąć sporządzone wcześniej w tym rozdziale kwerendy Pracownicy w Londynie oraz Klienci według kraju.
Przykład 3.6.1. Wymazywanie kwerendy
Sub Delete_AQuery ()
Dim cat As New ADOX.Catalog
Dim strPath As String
On Error GoTo ObsługaBłędu
strPath = "C:\Program Files\Microsoft Office\PL\" & _
"Office\Samples\Northwind.mdb" cat.ActiveConnection = "Provider=Microsoft.Jet.OleDb.4.0;
"Data Source =" & strPath
cat.Procedures.Delete "Klienci według kraju" cat.Views.Delete "Pracownicy w Londynie"
418
Programowanie w Access Km
MsgBox "Obie kwerendy zostały usunięte." Exit Sub ObsługaBłędu:
If Err.Number = 3265 Then
MsgBox "Kwerenda taka nie istnieje."
Exit Sub Else
MsgBox Err.Number & ": " & Err.Description End If End Sub
Wyszukiwanie i czytanie rekordów
Aby programatycznie pracować z danymi przy użyciu ADO, należy poznać za- i sady użycia obiektu Recordset. Obiekt Recordset reprezentuje zestaw rekord* w tabeli lub zestaw rekordów otrzymanych w wyniku uruchomienia kwerendy lui polecenia SQL. W kolejnym zagadnieniu tego rozdziału poznasz różne metody otwil ranią obiektu Recordset. Dowiesz się również, jak poruszać się w otrzymanym zł stawie rekordów, wyszukiwać, odczytywać oraz liczyć rekordy (rysunek 3.7 poniżej! przedstawia następny zestaw zagadnień do opanowania).
B9 frmPoznaiAD03; Formularz
W yszukiwanie i czytanie rekordów j praca z rekordami | Więcej na temat obiek u Recordest
i Otwieranie obiektu Recordset , JSJ
Poruszanie się pomiędzy rekordami
Wczytywanie danych z pola 'ekordu
i ft I <& ;f< ?nda !
li
i f I
j
iii
Polecenie 5QL
Czytanie zawartości całego 'ekordu
£J
« W oparciu o kryteria j ustalanie numeru rekordu
D1
■ ® Bezpośrednio i
——-1
m" —■■
■--
- Wyszukiwanie rekordów przy użyciu —— 11 0 metody Find 3J (S? metody Seek Kj <S w oparciu o złożone kryteria
Zwracanie taby rekordów w tabeli
Rysunek 3.7. Wyszukiwanie i czytanie rekordów przy użycii ADO
Tworzenie i manipulowanie bazami danych za pomocą ADO
419
O twieranie obiektu Recordset
ADO dysponuje kilkoma sposobami otwierania obiektu Recordset. Zacznijmy od tego, że istnieje możliwość utworzenia obiektu Recordset bez potrzeby użycia innych obiektów. Załóżmy, że chcesz pobrać wszystkie rekordy z tabeli tbiKi ienci znajdującej się w bieżącej bazie danych. Kod, który trzeba sporządzić, jest bardzo prosty:
Sub OtwieranieRecordsetu() Dim rst as ADODB.Recordset set rst = New ADODB.Recordset i With rst
.Source = "Select * from tblKlienci;" .ActiveConnection = CurrentProject.Connection .Open End With rst.Close
Set rst = Nothing End Sub
W powyższym przykładzie dwa pierwsze wiersze kodu deklarują obiekt Recordset i tworzą nową instancję tego obiektu. Następnie właściwość source określa dane, które chcesz pobrać (źródłem danych może być tabela, kwerenda, procedura przechowywana, widok, plik lub obiekt command). Polecenie select poleca wybranie wszystkich danych z tabeli tblKlienci. Następnie właściwość ActiveConnection określa, w jaki sposób należy połączyć się z bazą danych. Ponieważ tabela tblKlienci znajduje się w bazie danych, która jest w tej chwili otwarta, możesz skorzystać z instrukcji CurrentProject.connection. Wreszcie, metoda Open pobiera wskazane rekordy.
Zanim zapoznasz się z innymi metodami otwierania obiektu Recordset, warto zapoznać się bliżej z obiektem Recordset, gdyż obiekt ten różni się od obiektu Recordset pochodzącego z biblioteki DAO, z którym pracowaliśmy w rodziale 2. Obiekty Recordset w ADO są kontrolowane przez tzw. kursor (Cursor). Przy tworzeniu nowego zestawu rekordów (Recordset), automatycznie otwierany jest domyślny kursor. Kursor określa, czy możesz poruszać się w zestawie rekordów w tą i z powrotem, czy też tylko do przodu (forward-only), czy masz prawo przeglądać rekordy w trybie tylko do odczytu (read-only), czy też upoważniony jesteś do modyfikacji danych. Kursor określa również, czy zmiany wprowadzone w danych są udostępnione innym użytkownikom. Skorzystaj z właściwości cursorType, aby określić typ obiektu Recordset, który chcesz utworzyć.
Aby szybko dowiedzieć się, jakie typy kursora są dostępne w ADO, otwórz Przeglądarkę obiektów, wybierz bibliotekę ADODB z pola listy Projekt/Biblioteka (Project/Library) i wpisz CursorType w polu poszukiwania, według wzoru poniżej:
420
Programowanie w Access 2
■s
Object
Browse*
:
I CursorType
Search Results
£ jlLJMJ-I' "3 MJ7
|
I Class |
Member |
B\ ADODB |
<& Recordset |
eS1 CursorType |
|
Hi .'' wi'iK<Ł'.-TiaiHii.'M |
|
|
|
|
; Classes
^ ConnectPromptEnur_^J ^ CopyRecordOptions ^ CursorLocationEnur-^i #* CursqrOptlonEnum
t
| ut nr!
i Erium
a^
DataTypeEnum
$P
EditModeEnum
SS
Error jj
Members of'CursorTypeEnum' SJ adOpenDynamlc l£i adOpenFotwardOnly iii adOpenKeyset jlI adOpenStatic
I Enum CursorTypeEnum
■ Member of ^^.Kg
Przeglądarka obiektów wyświetla cztery wbudov/ane stałe, które można użyfl w celu określenia typu tworzonego zestawu rekordów (Fecordset).
Przy dynamicznym kursorze (adOpenDynamic =2) użytkownicy mają dostęp ( zmian w bazie danych, które zostały wprowadzone przez innych użytkowników. KurJ sor dynamiczny nie jest wspierany przez silnik bazy danych Microsoft Jet 4.O. AH skorzystać z tego kursora, należy skorzystać z innych dostawców OLEDB, takich jąB MSDASQL czy SQLOLEDB. Dynamiczny kursor pozwala poruszać się do przodfl i do tyłu w danym zestawie rekordów.
Jeżeli kursor jest forward-only (adOpenForwardOnly = o), to jakiekolwiek i zmiany w bazie danych (dodanie nowych rekordów, modyfikacje, usuwanie rekor-B dów) wprowadzone przez innych użytkowników nie są widoczne w danej chwili. Po- I nieważ kursor ten pozwala przeglądać rekordy tylko do przodu, jest to najszybszy I w użyciu kursor, i jest on również ustawieniem wyjściowym.
Jeżeli kursor jest oparty na kluczu (adOpenKeyset =i), możesz poruszać się I w danym zestawie rekordów do przodu i do tyłu, jednakże nowe rekordy dodane przez I innych użytkowników nie są widoczne. Jeżeli inny użytkownik usunął jakiś rekord, to I nie można otworzyć tego rekordu z twojego zestawu rekordów. Przy korzystaniu z tego kursora często stosuje się metodę Requery, która pozwala odświeżyć dany Re-1 cordset, aby zobaczyć aktualne dane.
Przy kursorze statycznym (adopenstatic = 3) pobrane dane odzwierciedlają stan, jaki istniał w danym momencie czasu. Ten kursor szczególnie przydaje się przy j wyszukiwaniu danych lub sporządzaniu raportów. Kursor statyczny umożliwia poru-1 szanie się do tyłu i do przodu w danym zestawie rekordów, jednakże nowe rekordy,
Tworzenie i manipulowanie bazami danych za pomocą ADO
421
m odyfikacje oraz rekordy usunięte przez innych użytkowników nie są widoczne. Skorzystaj z tego kursora, jeżeli chcesz zwrócić dokładną liczbę rekordów przy użyciu
metody RecordCount.
Właściwość cursorType należy ustawić przed otwarciem obiektu Recordset za pomocą metody open (jeżeli nie ustawisz tej właściwości, to Access utworzy Recordset typu forward-only). Oprócz właściwości CursorType, możesz ustawić również właściwość LockType, aby określić, czy zestaw rekordów można zmodyfikować. Ustawieniem domyślnym tej właściwości jest read-only (tylko do odczytu). Stałe służące do ustawienia właściwości LockType wyszczególnione są w oknie Przeglądarka obiektów, pokazanym poniżej.
: Object Browser
ADODB
LockType
-Search Results
111
L ibrary
Class
Member
|\ ADODB
&& Recordset
LockType
Lo c kTyp e E n u rn
C lasses
MarstialbptionsEnurn
$
MoveRecordOptionsEni
ObjectStateEnurn
£
g}
Parameter
0> ParameterAttributesEriL
# ParameterDirectionEnu
Members of'LockTypeEnum' GO adLockBatchOptimistic B adLockOptimlstic £B adLockPessimistic a adLockReadOnly
j Enurn LockTypeEnum
I Member of ADODB
Ustawiając LockType na adLockBatchOptimistic (4) zmiany wprowadzone wdanych będą przechowywane lokalnie, aż do momentu użycia metody updateBa-tch. Po uruchomieniu tej metody wszystkie dane zostaną zmodyfikowane od razu. Edytowane dane nie są blokowane, aż do momentu użycia metody updateBatch.
Jeżeli ustawieniem LockType jest stała adLockoptimistic(3) to edytowane dane zostaną zablokowane przy próbie zachowania zmian w danym rekordzie. Rekordy są blokowane dopiero w momencie zawołania metody update, i blokada jest zwolnio-
422
Programowanie w Access 20
n a natychmiast po zakończeniu operacji zapisu danych. Oznacza to, że dwaj użytko' nicy będę mogli jednocześnie zmodyfikować dany rekord .
Przy pesymistycznym ustawieniu właściwości LockType (adLockPessimistii =2) wszystkie rekordy są zablokowane w momencie przystąpienia do modyfikacji < nego rekordu. Rekord pozostaje zablokowany, dopóki użytkownik nie zakończy (lj odwoła) edycji danych. Oznacza to, że dwaj użytkownicy nie będą mogli jednocześni zmodyfikować danego rekordu.
Jeżeli ustawienie właściwości LockType jest ty:ko do odczytu (adLockReadoniy =1), to nie można zmienić żadnych danych. Jest to ustawienie wyjściowe.
Otwieranie zestawu rekordów na podstawie tabeli lub kwerendy
Obiekt Recordset można otworzyć na podstawie danych pochodzących z tabeli,! widoku, polecenia SQL lub polecenia zwracającego rzędy.
Przyjrzymy się teraz różnym metodom otwierania obiektu Recordset. • Użycie metody Execute z obiektem connection: Connection .Execute
Dim conn As ADODB.Connection
Dim rst as ADODB.Recordset
Set conn = New ADODB.Connection
conn.Open "Provider=Microsoft.Jet.OLEDE.4.0; " & _
"Data Source = C:\mojaBaza.mdb"
Set rst = conn.Execute("Select * from Klienci") rst.close conn.close
Użycie metody Execute z obiektem command: Command.Execute
Dim conn As ADODB.Connection Dim cmd As ADODB.Command Dim rst as ADODB.Recordset With conn
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; "Data Source = C:\mojaBaza.mdb" .Open End With With cmd
Tworzenie i manipulowanie bazami danych za pomocą ADO
423
. ActiveConnection = conn
.CommandText = "Select * from Klienci" End With
set rst = cmd.Execute rst.close conn.close
Użycie motody open obiektu Recordset: Recordset.Open
Dim rst As ADODB.Recordset
Dim strConnection As String
strConnection = "Provider=Microsoft.Jet.OLEDB.4.0; " & _
"Data Source = C:\mojaBaza.mdb" Set rst = New ADODB.Recordset With rst
.Open "Select * From Klienci", strConnection, adOpenForwardOnly .Close End with rst.Close Set rst = Nothing
Procedura w przykładzie 3.7.A pokazuje, w jaki sposób można otworzyć zestaw rekordów oparty na tabeli tblKlienci lub kwerendzie ąryTypyKlientów. Procedura ta korzysta z metody MoveNext, za pomocą której można poruszać się po danym zestawie rekordów aż do napotkania jego końca (EOF). Po otwarciu zestawu rekordów warto sprawdzić, jaki typ obiektu Recordset został utworzony. Procedura ta wykorzystuje omówione w poprzednim zagadnieniu właściwości CursorType oraz Lockry-pe w celu ustalenia typu zwróconego zestawu rekordów. Po uruchomieniu procedury, okno Instrukcje bezpośrednie wyświetli:
I
CursorType: 0 ; LockType: 1
Wynika z tego, że Visual Basic utworzył obiekt Recordset, w którym można się poruszać tylko do przodu (forward-only = 0), i który przeznaczony jest tylko do odczytu (read-only =1).
Aby utworzyć zestaw rekordów o innym typie, ustaw właściwości cursorType orazLockType przed otwarciem obiektu Recordset.
424
Programowanie w Access 2
Przykład 3.7.A. Otwieranie zestawu rekordów na podstawie tabeli lub kwerendy
Sub OtwórzTabelę()
Dim conn As ADODB.Connection Dim rst As ADODB.Recordset Set conn = CurrentProject.Connection Set rst = New ADODB.Recordset rst.Open "tblKlienci", conn 'rst.Open "qryTypyKlientów", conn Do Until rst.EOF
Debug.Print rst.Fields(1) rst.MoveNext Loop Debug.Print "CursorType: " & rst.CursorType & vbCr _
& "LockType: " & rst.LockType rst.Close conn.Close Set rst = Nothing Set conn = Nothing
MsgBox "Otwórz okno Instrukcje bezpośrednie." End Sub
O twieranie zestawu rekordów na podstawie polecenia SQL
Następująca procedura demonstruje, w jaki sposób należy skorzystać z metody Execute obiektu connection w celu otworzenia zestawu rekordów opartego na poleceniu SQL, które wybiera wszystkich pracowników z tabeli Pracownicy w przykładowej bazie danych Northwind. W oknie Instrukcje bezpośrednie pojawi się imię i nazwisko pierwszego pracownika znajdującego się w tabeli. Podobnie jak w poprzednim przykładzie, w otrzymanym zestawie rekordów można poruszać się tylko do przodu (forward-only ) i rekordy przeznaczone są tylko do odczytu (read-only).
Przykład 3.7.B. Otwieranie zestawu rekordów opartego na po eceniu SQL
Sub CreateBl_RstWithSQL()
Dim conn As ADODB.Connection Dim rst As ADODB.Recordset
Dim strConn As String
Tworzenie i manipulowanie bazami danych za pomocą ADO
425
strConn = "Provider = Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\Program FilesXMicrosoft Office\PL\" &
"Office\Samples\Northwind.mdb;" Set conn = New ADODB.Connection conn.Open strConn
Set rst = conn.Execute("Select * from Pracownicy") Debug.Print rst("Nazwisko") & ", " & rst("Imię") rst.Close conn.Close Set rst = Nothing Set conn = Nothing
MsgBox "Otwórz okno Instrukcje bezpośrednie" nd Sub
Hwieranie zestawu rekordów na podstawie kryteriów
Zamiast pobierać wszystkie rekordy z danej tabeli lub kwerendy, można skorzy-ić z klauzuli where w poleceniu SQL, aby pobrać tylko te rekordy, które spełniają kiś warunek. Poniższa procedura korzysta z metody open obiektu Recordset w celu utworzenia zestawu rekordów typu do przodu (Forward-only) oraz tylko do odczytu d-only) i zawiera rekordy tyko tych klientów, którzy nie mają przydzielonego kierownika.
Przykład 3.7.C. Otwieranie zestawu rekordów na podstawie kryteriów
I Sub OpenCl_RstWithCriteria()
Dim conn As New ADODB.Connection Dim rst As New ADODB.Recordset Set conn = CurrentProject.Connection
rst.Open "SELECT * FROM tblKlienci WHERE IdSzefa Is Null", conn, adOpenForwardOnly, adLockReadOnly Do While Not rst.EOF
Debug.Print rst.Fields("NazwaKlienta").Value rst.MoveNext Loop
rst.Close conn.Close Set rst = Nothing Set conn = Nothing
426
Programowanie w Access 2oJ
M sgBox "Sprawdź okno Instrukcje bezpośrednie." End Sub
Bezpośrednie otwieranie zestawu rekordów
Jeżeli planujesz otworzyć tylko jeden zestaw rekordów z konkretnego źródła daj nych, to możesz otworzyć go bezpośrednio bez poprzedniego otwierania obiektu coil nection. Ta metoda wymaga podania informacji dotyczących źródła danych orazpB łączenia przed użyciem metody open obiektu Recordset, tak jak to pokazuje procedł ra w przykładzie 3.7.D poniżej.
Przykład 3.7.D. Bezpośrednie otwieranie zestawu rekordów
Sub OpenDl_RstDirectly()
Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset
With rst
.Source = "Select * From tblKlienci;"
.ActiveConnection = CurrentProject.Connection
.Open
End With
MsgBox rst.Fields(1)
rst.Close
Set rst = Nothing
End Sub
Szczegóły dotyczące źródła danych oraz sposobu połączenia można przekazać metodzie open obiektu Recordset również w następujący sposób:
rst.Open "Select * From tblKlienci", CurrentProject.Connection
Poruszanie się w zestawie rekordów
Nawigację w zestawie rekordów umożliwia pięć metod typu Move: MoveFirstl MoveLast, MoveNext, MovePrevious oraz Move. Następująca procedura demonstruje, w jaki sposób można poruszać się w zestawie rekordów w celu pobrania nazw pól oraz zawartości każdego rekordu.
T worzenie i manipulowanie bazami danych za pomocą ADO 427
Przykład 3.7.E. Poruszanie się w zestawie rekordów
Sub MoveAround ()
Dim conn As ADODB.Connection Dim rst As ADODB.Recordset Dim fid As ADODB.Field Dim strConn As String
Set conn = New ADODB.Connection
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" _
& "Data Source = C:\Program Files\Microsoft Office\PL\" & _
"Office\Samples\Northwind.mdb;" conn.Open strConn Set rst = New ADODB.Recordset
rst.Open "Select * from Klienci where " & _
"StanowiskoPrzedstawiciela = 'Asystent marketingu'", _
conn, adOpenForwardOnly, adLockReadOnly Do While Not rst.EOF
Debug.Print "Nowy rekord "
For Each fid In rst.Fields
Debug.Print fid.Name & " = " & fid.Value
Next
rst.MoveNext
Loop
rst.Close
conn.Close
Set rst = Nothing
Set conn = Nothing
MsgBox "Wyniki znajdują się w oknie Instrukcje" & vbCrLf _
S " bezpośrednie."
End Sub
Rezultaty powyższej procedury wydrukowane są w oknie Instrukcje bezpośrednie:
428
Programowanie w Access 205!
I mmediate
Nowy rekord
IDklienta = FAMIA
NazwaFirmy = Familia Arquibaldo
Przedstawiciel = Aria Cruz
StanowiskoPrzedstawiciela = Asystent marketingu
Adres = Rua Orós,92
Miasto = Sao Paulo
Region = SP
KodPocztowy = 05442-030
Kraj = Brazylia
Telefon = (11) 555-9857
Faks =
Nowy rekord
IDklienta = LAUGB
NazwaFirmy = Laughing Bacchus Wine Cellars
Przedstawiciel = Yoshi Tannamuri
StanowiskoPrzedstawiciela = Asystent marketingu
Adres = 1900 Oak St.
Miasto = Vancouver
Region = BC
Określanie pozycji rekordu
Skorzystaj z właściwości AbosolutePosition obiektu Recordset, aby otrzymać i numer bieżącego rekordu. Właściwość ta określa relatywną pozycję rekordu w catyj zestawie rekordów. Procedura w przykładzie 3.7.F otwiera zestaw rekordów wy J niony danymi o pracownikach z tabeli Pracownicy w bazie danych Northwind. \H ściwość AbsoiutePosition trzy razy w trakcie wykonywania procedury zwracał mer rekordu. Na początku numer rekordu wynosi jeden (1). Następnie procedura korzysta z metody Move, aby przesunąć kursor o trzy rzędy do przodu, po czym właści-l wość AbsoiutePosition zwraca 4 (1+3) jako nową pozycję bieżącego rekordu.I Wreszcie, metoda MoveLast przesuwa kursor na sam koniec zestawu rekordów. Włal ściwość AbsoiutePosition wskazuje teraz, że jest to dziewiąty rekord. Właściwości Recordcount obiektu Recordset zwraca całkowitą liczbę rekordów znajdujących się I w otrzymanym zestawie.
conn,
adOpenKeyset, _
Tworzenie
i manipulowanie bazami danych za pomocą
ADO Przykład
3.7.F. Zwracanie pozycji rekordu
I Sub FindRecordPositionO _.... conn As ADODB.Connection Dim rst As ADODB.Recordset Dim strConn As String Set conn = New ADODB.Connection
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" _
& "Data Source = C:\Program FilesXMicrosoft OfficeXPLX "Office\Samples\Northwind.mdb;"
I conn.Open strConn Set rst = New ADODB.Recordset With rst
.Open "Select* from Pracownicy", adLockOptimistic, adCmdText Debug.Print .AbsolutePosition
.Move 3
Debug.Print .AbsolutePosition
.MoveLast
Debug.Print .AbsolutePosition
Debug.Print .RecordCount
.Close End With conn.Close Set rst = Nothing Set conn = Nothing End Sub
429
Odczytywanie danych z pola rekordu
Skorzystaj ze zbioru Fields obiektu Recordset, aby zwrócić wartość określonego pola w otwartym zestawie rekordów. Poniższa procedura korzysta z pętli Do while w celu sprawdzenia wszystkich rekordów, i drukuje nazwy wszystkich klientów znajdujących się w tabeli tblKlienci do okna Instrukcje bezpośrednie.
430
Programowanie w Access 2QN
P rzykład 3.7.G. Odczytywanie wartości pól
Sub ReadFieldO
Dim conn As ADODB.Connection Dim rst As ADODB.Recordset
Set conn = CurrentProject.Connection
Set rst = New ADODB.Recordset
rst.Open "Select* from tblKlienci", conn, adOpenStatic
Do While Not rst.EOF
Debug.Print rst.Fields("NazwaKlienta").Value
rst.MoveNext Loop
rst.Close conn.Close Set rst = Nothing Set conn = Nothing End Sub
Pobieranie zawartości rekordów
Zamiast korzystać z pętli w celu pobrania wszystkich pól we wszystkich reb dach, możesz skorzystać z metody Getstring obiektu Recordset, aby od razu pob potrzebne dane. Metoda Getstring kopiuje określoną liczbę rzędów z zestawu refaj dów do łańcucha znaków i umieszcza je w dwuwymiarowej tablicy. Metoda string zwraca zestaw rekordów w postaci łańcucha znaków (string) i posiadał stepujący zapis synktaktyczny:
Set mojaTablica = recordset.Getstring(StringFormat, NumRows, ColumnDelimiter, RowDelimiter, NullExpr)
Pierwszy argument tej metody (stringFormat) określa format danych. Drugi i gument (NumRows) określa liczbę rzędów, którą zamierzasz umieścić w danej Jeżeli w tym miejscu nie wpiszesz liczby rekordów, to metoda Getstring zw wszystkie rzędy. Trzeci argument (ColumnDelimiter) określa sposób oddzielenia! nych w kolumnie (ustawieniem początkowym jest tabulator).
Czwarty argument (RowDelimiter) określa sposób oddzielenia rekordów dów) - ustawieniem wyjściowym jest znak karetki (carriage return). Piąty;
Tworzenie i manipulowanie bazami danych za pomocą ADO
431
m ent (NullExpr) oznacza wyrażenie, które ma reprezentować wartości zerowe (wartością domyślną jest pusty ciąg znaków).
Przykład 3.7.H. Odczytywanie zawartości rekordów
GetRecords()
Dim conn As New ADODB.Connection Dim rst As New ADODB.Recordset Dim mojaTablica As Variant Dim r As Integer 'licznik rekordu Dim f As Integer 'licznik pola
Set conn = CurrentProject.Connection Set rst = New ADODB.Recordset rst.Open "SELECT * FROM tblKlienci", conn, adOpenForwardOnly, _ adLockReadOnly, adCmdText Zapisz wszystkie rzędy w tablicy mojaTablica = rst .GetRows () ' Odszukaj górną granicę drugiego wymiaru tablicy For r = 0 To UBound(mojaTablica, 2)
Debug.Print "Rekord " & r + 1 & " "
' Odszukaj górną granicę pierwszego wymiaru tablicy For f = 0 To UBound(mojaTablica, 1) 'Wydrukuj dane z każdego rzędu tablicy
Debug.Print rst.Fields(f).Name & "=" & _
mojaTablica(f, r) Next f Next r End Sub
Po uruchomieniu procedury w przykładzie 3.7.H. nazwy pól oraz ich wartości dla każdego rekordu zostają wydrukowane w oknie Instrukcje bezpośrednie:
432
Programowanie w Access 2
Immediate
Rekord 1
ldKlięnta=1
NazwaKlienta=1185 Plus Sp. z o.o.
TypKlienta=B
Status=K
ldSzefa=
KlientOdRoku=
LiczbaSpotkan=4
DataWpisu=1997-02-20
ldWpisu=KA
DataModyfikacJFi 998-08-27 18:18:16
ldModyfikacji=KA
MojeNowePole=
Rekord 2
ldKlienta=2
NazwaKlienta=1787 Reklama Sp. z o.o.
TypKlienta=B
Status=K
ldSzefa=
KlientOdRoku=1997
LiczbaSpotkan=1
Wyszukiwanie rekordów przy użyciu metody Find
Biblioteka obiektów ADO udostępnia dwie metody służące do wyszukiwaniar kordów: Find oraz seek. W tym zagadnieniu dowiesz się, jak używać metody Fi| w celu odnalezienia wszystkich klientów według następującego kryterium: TypKiif ta = „i". W odróżnieniu od bibliotetki DAO, która posiada aż cztery metody t Find (FindFirst, FindNext, FindPrevious, FindLast), ADO dysponuje tylko je
metodą Find. Poszukiwanie zawsze zaczyna się od bieżącego rekordu. Kierunekpn szukiwania oraz pozycja rekordu, od której ma się rozpocząć przeszukiwanie po są jako parametry metody Find. Parametr searchDirection oznaczający kierun poszukiwania może przybrać następujące wartości: adSearchForward (poszukiwał do przodu) lub adSearchBackward (poszukiwanie do tyłu).
Tworzenie i manipulowanie bazami danych za pomocą ADO
433
Przykład 3.7.1. Znajdowanie rekordów za pomocą metody Find
Sub Find_FindWithFind()
Dim conn As New ADODB.Connection
Dim rst As New ADODB.Recordset
Set conn = CurrentProject.Connection
rst.Open "tblKlienci", conn, _
adOpenKeyset, adLockOptimistic
1 odszukaj pierwszy rekord, który odpowiada
' podanemu kryterium
rst.Find "TypKlienta ='I'"
Do Until rst.EOF
Debug.Print rst.Fields("NazwaKlienta").Value
' szukaj do przodu zaczynając od
' następnego rekordu
rst.Find "TypKlienta ='I'", SkipRecords:=1,
SearchDirection:=adSearchForward
Loop
rst.Close
conn.Close
Set rst = Nothing
Set conn = Nothing End Sub
Aby odnaleźć ostatni rekord, zastosuj metodę MoveLast przed użyciem metody Find. Jeżeli żaden z rekordów nie zaspakaja podanego warunku, to bieżący rekord jest umieszczony przed samym początkiem zestawu rekordów przy poszukiwaniu do przodu (foward) lub na samym końcu zestawu rekordów przy poszukiwaniu do tyłu (backward). Możesz skorzystać z właściwości EOF (End of File) lub BOF (Begining of File), aby dowiedzieć się, czy odnaleziono rekord spełniający warunek. W ADO z metodą Find nie można używać operatora is. Aby odnaleźć pusty rekord (posiadający wartość zerową (Null), skorzystaj ze znaku równości (=). Na przykład:
1 wyszukaj rekordy, które nie mają wpisu w polu IdSzefa Rst.Find "IdSzefa = Null"
'wyszukaj rekordy, które posiadają dane w polu IdSzefa ! Rst.Find "IdSzefa oNull"
434
Programowanie w Accej
Aby wyszukać rekordy na podstawie więcej niż jednego warunku, sfe z właściwości Filter obiektu Recordset, tak jak to demonstruje prl w przykładzie 3.7.K w dalszej części tego rozdziału.
Wyszukiwanie rekordów przy użyciu metody Seek
Możesz skorzystać z metody seek obiektu Recordset, aby szybko odnalj kord na podstawie indeksu. Jeżeli nie podasz indeksu przed przystąpieniem dw kiwań, Visual Basic zastosuje w poszukiwaniu klucz podstawowy. Jeżeli ręki stanie odnaleziony, to obecna pozycja rzędu zostanie zmieniona na odnalezioni cję. Zapis synktaktyczny metody Seek wygląda tak:
recordset.Seek KeyVaiues, SeekOption
Pierwszy argument metody seek (KeyVaiues) określa wartości, które znaleźć. Drugi argument (seekoption) określa typ porównania pomiędzy koi indeksu oraz wartościami podanymi w pierwszym argumencie (KeyVaiues). I ra w przykładzie 3.7.J używa metody seek w celu wyszukania pierwszej firn posiada w polu Region wpis „SP":
Rst.Seek "SP", adSeekFirstEQ
Aby znaleźć ostatni rekord, który spełnia ten sam warunek, s z następującej instrukcji:
Rst.Seek "SP", adSeekLastEQ
Argument Seekoption w metodzie seek określa się za pomoc z następujących stałych:
Stała |
Wartość |
Znaczenie |
AdSeekFirstEQ |
1 |
Wyszukuje pierwszy klucz równy wartości poc w argumencie KeyVaiues. |
AdSeekLastEQ |
2 |
Wyszukuje ostatni klucz równy wartości podai w argumencie KeyVaiues. |
Tworzenie i manipulowanie bazami danych za pomocą ADO
435
Stała |
Wartość |
Znaczenie |
AdSeekAfterEQ |
4 |
Wyszukuje klucz równy wartości podanej w argumencie KeyValues lub poszukuje klucza tuż po miejscu, w którym klucz byłby znaleziony. |
AdSeekAfter |
8 |
Poszukuje klucza tuż po miejscu, w którym wartości podane w argumencie KeyValues zostałyby odnalezione. |
-AdSeekBeforeEQ |
16 |
Poszukuje albo klucza równego wartości podanej w argumencie KeyValues, albo tuż przed miejscem, w którym wartości te byłyby odnalezione. |
AdSeekBefore |
32 |
Poszukuje klucza tuż przed miejscem, w którym wartości podane w argumencie KeyValues byłyby odnalezione. |
Z metody seek można tylko korzystać w bazach danych Microsoft Jet 4.O. Aby dowiedzieć się, czy można skorzystać z metody seek do wyszukiwania rzędu w zestawie rekordów w trakcie pracy ze starszymi bazami danych, zastosuj metodę supports obiektu Recordset. Metoda ta określa, czy dany obiekt Recordset posiada daną cechę. Wartość boolowska True (Prawda) oznacza, że dana cecha jest akceptowana przez obiekt, natomiast wartość False (Fałsz) oznacza, że nie.
1 zobacz czy obiekt Recordset może skorzystać z metody Seek HsgBox rst. Supports (adSeek)
I pnykład 3.7.J. Wyszukiwanie rekordów przy użyciu metody Seek
Sub Find_FindWithSeek()
Dim conn As New ADODB.Connection
Dim rst As New ADODB.Recordset
conn.Open "Provider = Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\Program Files\Microsoft Office\PL\" &
"Office\Samples\Northwind.mdb;" With rst
.Index = "Region"
436
Programowanie w Access j
. Open "Klienci", conn,
adOpenKeyset, adLockOptimistic, adCmdTableDirect ' zobacz czy obiekt Recordset może skorzystć ' z metody Seek
MsgBox rst.Supports(adSeek) .Seek "SP", adSeekFirstEQ End With If Not rst.EOF Then
Debug.Print rst.Fields("NazwaFirmy"i.Value End If rst.Close conn.Close Set rst = Nothing Set conn = Nothing
MsgBox "Sprawdź rezultaty w oknie Instrukcje bezpośrednie." End Sub
Jeżeli metoda Seek oparta jest na indeksie złożonym, skorzystaj z funkcji' o nazwie Array, aby określić wartości parametru Keyvalues. Na przykład, w tai opisy zamówień w bazie danych Northwind klucz podstawowy złożony jest z dw pól: idzamówienia oraz idProduktu. Aby odszukać zamówienie, w którym w; w polu Idzamówienia =10295 i IdProduktu = 56, skorzystaj z następującej in cji:
Rst.Seek Array(10295, 56), adSeekFirstEQ
Wyszukiwanie rekordów w oparciu o kilka warunków
Metoda Find w ADO nie pozwala wyszukiwać rekordów opartych na więcej iii) jednym warunku. Aby poradzić sobie z tym ograniczeniem, skorzystaj z właściwośa Filter obiektu Recordset w celu przygotowania zestawu rekordów, który zawiej tylko rekordy spełniające podane kreyteria. Procedura w przykładzie 3.7.K korzysJ z właściwości Filter w celu odnalezienia tylko tych pracowników, które są płci żeń-I skiej i zamieszkują w Stanach Zjednocznonych.
Przykład 3.7.K. Wyszukiwanie rekordu opartych na dwóch i więcej warunkach
Sub Find_WithFilter()
Dim conn As New ADODB.Connection
iiiB
i Tworzenie i manipulowanie bazami danych za pomocą ADO
437
D im rst As New ADODB.Recordset
conn.Open "Provider = Microsoft.Jet.OLEDB.4.0;" &
"Data Source=C:\Program Files\Microsoft Office\PL\"
"Office\Samples\Northwind.mdb;" rst.Open "Pracownicy", conn,
adOpenKeyset, adLockOptimistic
rst.Filter = "ZwrotGrzecznościowy ='Ms.' and Kraj ='USA' Do Until rst.EOF
Debug.Print rst.Fields("Nazwisko").Value
rst.MoveNext Loop
rst.Close conn. Close Set rst = Nothing Set conn = Nothing End Sub
Obliczanie liczby rekordów
Aby zwrócić szereg rzędów z danego zestawu rekordów, skorzystaj z metody GetRows. Metoda ta zwraca dwuwymiarową tablicę. Aby dowiedzieć się ile rekordów zostało zwróconych, skorzystaj z funkcji VBA o nazwie ubound, według wzoru w procedurze 3.7.L poniżej. Poniważ elementy tablicy zliczane są od zera, należy dodać jeden (1) do rezultatu funkcji ubound, aby uzyskać prawidłową liczbę rekordów.
Przykład 3.7.L. Obliczanie liczby rekordów
Sub CountRecords ()
Dim conn As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim mojaTablica As Variant
Dim zwrRekordy As Integer
Set conn = CurrentProject.Connection
Set rst = New ADODB.Recordset
rst.Open "SELECT * FROM tblKlienci",
conn, adOpenForwardOnly, _
adLockReadOnly, adCmdText 1 umieść wszystkie rekordy w tablicy mojaTablica = rst.GetRows() zwrRekordy = UBound(mojaTablica, 2) + 1
438
Programowanie w Access 2«J
MsgBox "Całkowita liczba rekordów wynosi: " & zwrRekordy rst.Close conn.Close Set rst = Nothing Set conn = Nothing End Sub
Odwołaj się do procedury w przykładzie 3.7.H (wcześniej w tym rozdziale),; dodwiedzieć się, w jaki sposób możesz wydrukować zawartość sporządzonej tablifl do okna Instrukcje bezpośrednie.
Praca z rekordami
Teraz, gdy zapoznałeś się już z rozmaitymi metodami otwierania zestawu rekor-1 dów, poruszania się w nim, wyszukiwania rekordów oraz otczytywania zawartości obiektu Recordset, spójrzmy na kilka przykładów użycia ADO w przeprowadzanie takich operacji jak: dodawanie, modyfikowanie, kopiowanie, sortowanie i usuwanie rekordów.
SB frmPoznajADG3: Formularz
Skopiuj rekordy do -
J>J <® Arkusza Excela Ej <8" DokumentuWorda JFJ $■ pliku tekstowego
Wyszukiwanie i czytanie rekordów Praca z rekordami i Więcej na temat obiektu Recordest |
i Rekord |
|
|
ś |
|
podaj nowy I | |
|
fg |
Zmodyfikuj i |
li |
|
Usuń |
- Filtruj/sortuj rekordy przy użyciu : - - —
G J ^ Klauzuli SQL h I *■* Właściwości Filter i j <S? Właściwości Sort
R ysunek 3.8. Praca z rekordami
'Uli'
T worzenie i manipulowanie bazami danych za pomocą ADO
439
D odawanie nowego rekordu
Aby dodać nowy rekord, skorzystaj z metody AddNew. Procedura w przykładzie 3.8. A dodaje dwa nowe rekordy do określonej tabeli. Ponieważ przy pierwszym użyciu metody AddNew wartości pól nie są podane, utworzony jest pusty rekord. Przy powtórnym użyciu metody AddNew, do tabeli dodane zostają dane dotyczące Janka Kowalskiego. Zwróć uwagę, że nowe rekordy są automatycznie zachowane w pamięci, bez potrzeby użycia metody update. Po użyciu metody AddNew nowy rekord staje się rekordem bieżącym.
Przykład 3.8.A. Dodawanie nowego rekordu do tabeli
■gub Add_Record ()
Dim conn As ADODB.Connection Dim rst As New ADODB.Recordset Set conn = CurrentProject.Connection ! With rst
.Open "Select * from tblAgenci",
conn, adOpenKeyset, adLockOptimistic
1 dodaj pusty rekord
.AddNew
1 dodaj rekord i podaj wartości niektórych pól
.AddNew
!Imię = "Janek"
! Nazwisko = "Kowalski"
! Miasto = "Gdynia"
' pobierz wartość z pola Identyfikator
Debug.Print !Identyfikator.Value
' przejdź do pierwszego rekordu
.MoveFirst
.Close ■ End With conn. Close Set conn = Nothing Bid Sub
440
Programowanie w Acce
M odyfikowanie rekordu
ADO nie posiada metody Edit. Aby zmodyfikować dane w określonym i beli, odszukaj dany rekord i przypisz właściwości value nową wartość. Skora z metody update, jeżeli nie zamierzasz modyfikować więcej rekordów. Nie musi3 używać metody Update gdy przesuwasz się do innego rekordu. Użycie metody :tj spowoduje automatyczne wezwanie metody update przed wybraniem nowego rekj du:
' zmień nazwę klienta na Jacek Marski i przejdź do następnego rekordi rst!CustomerName="Jacek Marski" rst.MoveNext
Przykład 3.8.B. Modyfikowanie rekordu
Sub Update_Record()
Dim conn As ADODB.Connection
Dim rst As New ADODB.Recordset
Set conn = CurrentProject.Connection
With rst
.Open "Select * from tblAgenci " & " Where Nazwisko = 'Kowalski'",
conn, adOpenKeyset, adLockOptimistic
.Fields("Imię").Value = "Jerzy"
.Fields("Miasto").Value = "Katowice"
.Fields("Telefon") .Value = "456-0987 '
.Update
' wykonaj powyższe czynności w jednej linijce kodu
'.Update Array("Imię", "Miasto", "Telefon")/
Array("Jerzy", "Katowice", "456-0987")
.Close End With conn.Close Set conn = Nothing End Sub
Możesz również zmodyfikować kilka pól w określonym rekordzie, korzystając I z metody update i przekazując tej metodzie dwie tablice. Pierwsza tablica powinna! podać nazwy pól, druga zaś wymienić w kolejności podanych pól nowe wartości, któ-
I'
Tworzenie i manipulowanie bazami danych za pomocą ADO
441
r e należy wpisać. Na przykład następujące polecenie modyfikuje dane w polach imię, Miasto, Telefon:
.Update Array("Imię", "Miasto", "Telefon"), Array("Jerzy", "Katowice", ■456-0987")
W ten sam sposób można użyć metody AddNew.
Usuwanie rekordu
Aby usunąć rekord, odszukaj ten rekord i skorzystaj z metody Delete. Procedura w przykładzie 3.8.C usuwa rekord, który nie posiada wpisu w polu Nazwisko. Jak pamiętasz, w procedurze 3.8.A dodaliśmy pusty rekord.
Przykład 3.8.C. Usuwanie rekordu
Sub Delete_Record ()
Dim rst As ADODB.Recordset Set rst = New ADODB.Recordset On Error GoTo ObsługaBłędu With rst
.Open "Select * from tblAgenci " & "Where Nazwisko is Null", CurrentProject.Connection, adOpenKeyset, adLockOptimistic .Delete .Close End With Exit_Delete: Exit Sub | ObsługaBłędu:
MsgBox Err.Number & ": " & Err.Description Resume Exit_Delete i Sub
442
Programowanie w Access 2011
K opiowanie rekordów do arkusza Microsoft Excel
Procedura w przykładzie 3.8.D korzysta z technologii automatyzacji w celu sko-1 piowania rekordów z tabeli tblKlienci do arkusza kalkulacyjnego w aplikacji Micm soft Excel. Po otwarciu zestawu rekordów korzystamy ze zmiennych obiektowy™ które odwołują się do obiektów Excel Application (appiExcel), Excel WorkboJ (wkb), Excel Worksheet (wks) oraz Excel Range (startRange). Aby móc skorzystał z tych obiektów w kodzie procedury, należy najpierw ustawić odwołanie do bibliotJ Microsoft Excel 9.0 w oknie dialogowym Odwołania (wybierz Narzędzia => Oil wołania w ekranie edytora Visual Basic, odnajdź bibliotekę Microsoft Excel 9.0 m znacz pole wyboru obok tej nazwy i kliknij OK, aby opuścić okno dialogowe). Re-1 zultat kopiowania zestawu rekordów do arkusza pokazany jest poniżej kodu procedj w przykładzie 3.8.D.
Przykład 3.8.D. Kopiowanie rekordów do arkusza Excela
'Umieść następujące linijki kodu na samej gór^.e modułu Option Compare Database Option Explicit
' upewnij się, że w oknie dialogu Odwołania jest zaznaczona 1 biblioteka Microsoft Excel 9.0 Object Library
1 Zadeklaruj zmienną obiektową appiExcel u góry modułu
' poniżej Option Explicit
Public appiExcel As Excel.Application
Sub CopyToExcel()
Dim conn As ADODB.Connection Dim rst As ADODB.Recordset Dim wbk As Excel.Workbook Dim wks As Excel.Worksheet Dim StartRange As Excel.Range
On Error GoTo ObsługaBłędu
Set conn = CurrentProject.Connection
Set rst = New ADODB.Recordset
With rst
.Open "tblKlienci", conn,
adOpenKeyset, adLockOptimistic
Tworzenie i manipulowanie bazami danych za pomocą ADO
443
. Filter = "TypKlienta='B' and LiczbaSpotkań <>'O'"
End With
1 zmienną applExcel as Excel.Application należy
1 zadeklarować u góry kartki modułu
Set applExcel = New Excel.Application
' utwórz nowy skoroszyt (Workbook) Excela
Set wbk = applExcel.Workbooks.Add
' ustaw odwołanie do aktywnego arkusza (ActiveSheet)
Set wks = wbk.ActiveSheet
1 uwidocznij okno aplikacji Excela
applExcel.Visible = True
With wks
' Utwórz nagłówki kolumn .Cellsd, 1) .Value = "IdKlienta" 'Al .Cellsd, 2) .Value = "NazwaKlienta" 'Bl .Cellsd, 3) .Value = "TypKlienta" ' Cl .Cellsd, 4) .Value = "Status" ' Dl .Cellsd, 5) .Value = "IdSzefa" 'El .Cellsd, 6) .Value = "KlientOdRoku" • Fl .Cells(1, 7).Value = "LiczbaSpotkań" 'Gl .Cellsd, 8) .Value = "DataWpisu" 'HI .Cellsd, 9) .Value = "IdWpisu" ' II .Cellsd, 10) .Value = "DataModyf ikacj i" ' Jl .Cellsd, 11) .Value = " IdModyf ikacj i" ' Kl
End With
1 podaj zakres komórek, w którym należy umieścić
1 dane (A2)
Set StartRange = wks.Cells(2, 1)
' skopiuj rekordy i umieść je w komórce A2
StartRange.CopyFromRecordset rst
' autodopasuj szerokość kolumn
wks. Columns ("A: Z") .AutoFit
1 zamknij skoroszyt i zachowaj plik
wbk.Close SaveChanges:=True,
FileName:="C:\ExcelDump.xls"
' zamknij aplikację Excela
applExcel.Quit
Exit Sub ObsługaBłędu:
MsgBox Err.Description, vbCritical, _ "Błąd automatyzacji "
444
Programowanie w Access M
S et applExcel = Nothing Exit Sub End Sub
Po uruchomieniu procedury w przykładzie 3.8.D utworzony jest następującyĄ
kusz:
0 D E
Typkiienta Status idS K K K
^ntaiNazwa
Klienta
j"3"] 2
1787 Reklama Sp. z o.o
f
T] 3
20/20 Sport
Sp. z
o.o.
j
5
i 4
Maksel
Wytwórnia
Galanteri B ł
B
jTj i"i1B5
Plus Sp. z
o.o.
■■^efa
KiientOriBokuLiczbaSpotkańDanWpisuldWpiEii
DataM t,,acjiIdMudrtk
4
35481 KA 36034,76268
KA
35633 KA 35633 KA
36434,53351 257155 36251,53229 553361
1 35722 KA
36086 020132
K opiowanie rekordów do dokumentu Microsoft Word I
Aplikacja Microsoft Word posiada specjalną metodę o nazwie msertDatabasJ z której można skorzystać w celu pobrania danych z tabeli lub kwerendy bazy dany* Microsoft Access Przed użyciem obiektów Microsoft Word bezpośrednio z aplikaJ Access ustaw odwołanie do biblioteki Microsoft Word 9.0 w oknie dialogowym(}| wołania (wybierz Narzędzia ^ Odwołania w ekranie edytora Visual Bas1C, odnajl bibliotekę Microsoft Word 9.0, zaznacz pole wyboru obok tej nazwy i khknij OK,abl opuścić okno dialogu). Procedura w przykładzie 3.8.E otwiera nowy dokument Wordal z aplikacji Microsoft Access i korzysta z metody msertDatabase (w aplikacji WorJ da) w celu pobrania zawartości tabeli Produkty znajdującej się w bazie danych No,| thwind.
Przykład 3.8.E. Kopiowanie rekordów do dokumentu Worda
'Umieść następujące linijki kodu na samej gór^.e kartki modułu
Option Compare Database
Option Explicit
' sprawdź, że w oknie dialogu References jest zaznaczona
1 biblioteka Microsoft Word 9.0 Object Library
' Zadeklaruj zmienną obiektową applWord u góry kartki modułu
' poniżej Option Explicit
Public applWord As Word.Application
Sub SendToWordO
Dim doc As Word.Document
' zmienna applWord należy zadeklarować
Tworzenie i manipulowanie bazami danych za pomocą ADO
445
' As Word.Application u góry kartki modułu
Set applWord = New Word.Application
' utwórz nowy dokument Worda
Set doc = applWord.Documents.Add
applWord.Visible = True
doc. Paragraphs(1) .Range.InsertDatabase
Format:=wdTableFormatSimple2,
LinkToSource:=False, _
Connection:="Table Produkty", DataSource:="C:\Program Files\Microsoft Office\PL\" &
"Office\Samples\Northwind.mdb" Bid Sub
Po uruchomieniu procedury w przykładzie 3.8.E tabela Produkty z bazy Nor-thwind umieszczona jest w dokumencie Worda:
J[..numenH -MurosuK Woid
;He Edit View Insert Format Tools Table Window Help
O^irf iBC el <? I *-> -
'normal - Times New Roman - 12 » j B I B i;(
nii4) Hit 100% : ą
|= ':= is iw m fj - & - A, »
jDproduktu |
NazwaProduktu |
IDdostawcy |
IDkategorii |
Ilo ś ć Je dno stko wa |
CenaJednostkowa |
Stan] |
1 |
Chai |
12 |
2 |
10 op. x 20 szt. |
18,00 zl |
39 |
2 |
Chang |
1 |
1 |
24 - 350 g but. |
19,00 zl |
17 |
3 |
Aniseed Syrup |
1 |
2 |
12-550 ml but. |
10,00 zl |
13 |
4 |
Chef Anton's Cajun Seasoning |
2 |
2 |
48- 180 g op. |
22,00 zl |
53 |
5 |
Chef Anton's Gumbo Mix |
2 |
2 |
36 pud. |
21,35 zl |
0 |
6 |
Grandma's Boysenberry Spread |
3 |
2 |
12 - 240 g op. |
25,00 zl |
120 |
7 |
Uncle Bob's Organic Dried Pears |
3 |
7 |
12 - 500 g op. |
30,00 zl |
15 |
Hi s|s|:= <| |
Northwoods |
3 |
2 |
12 - 350 g op. |
40,00 zl |
6 > |
1/3
Polish
Aby pobrać tylko określone rekordy do dokumentu Worda, przygotuj kwerendę w aplikacji Access, która zwraca żądane rekordy. Następnie zaś skorzystaj z metody InsertDatabase i podaj słowo "Query" z nazwą kwerendy w argumencie connection, według wzoru poniżej:
Connection: = "Query FiltrProduktów"
446
Programowanie w Access2(J
K opiowanie rekordów do pliku tekstowego
Zapisywanie rekordów w pliku tekstowym jest bardzo proste. ProcedJ w przykładzie 3.8.F korzysta z obiektu FileScriptingobject oraz metody J String obiektu Recordset W celu Wpisania rekoidÓW Z tabeli Zamówienia wbaj danych Northwind do pliku tekstowego o nazwie "plikTestowy". Aby pomyślniej konać tę procedurę, należy ustawić odwołanie do biblioteki Microsoft Scripting RJ time w oknie dialogowym Odwołania (wybierz Narzędzia => Odwołania w eknr edytora Visual Basic, odnajdź bibliotekę Microsoft Scripting Runtime, zaznacz i wyboru obok tej nazwy i kliknij OK, aby opuścić okno dialogowe).
Przykład 3.8.F. Kopiowanie rekordów do pliku tekstowego
Sub WriteToFile()
Dim fso, txtfile
Dim conn As New ADODB.Connection Dim rst As New ADODB.Recordset Dim f As ADODB.Field
conn.Open "Provider = Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\Program Files\Microsoft Office\PL\" &_
"Office\Samples\Northwind.mdb;" rst.Open "[Dostawcy]", conn
Set fso = CreateObject("Scripting.FilsSystemObject") Set txtfile = fso.CreateTextFile("C:\PlikTestowy.txt", True)
With rst
For Each f In .Fields 1 Wpisz nazwy pól do pliku tekstowego txtfile.Write (f.Name) txtfile.Write Chr(9)
Next
txtfile.WriteLine ' przesuwa się do następnej linijki
1 wpisz wszystkie rekordy do pliku tekstowego
txtfile.Write rst.GetString(adClipString)
.Close
End With
txtfile.Close End Sub
Tworzenie i manipulowanie bazami danych za pomocą ADO
447
P o uruchomieniu tej procedury rekordy zostaną umieszczone w pliku d\PlikTekstowy.txt pokazanym poniżej:
g plikTestowy- Notepad
Fis Edit Format Help
-JSJiŁl
[ 5dÓśtawcy~~ NazwaFirmy Przedstawiciel stanowiskoprzedstawiciela
Exotic Liquids Cnarlotte cooper Dyrektor ds. zaopatrzenia
05
'
s
(w
sis (03)
4-c
Norske
D17
(617)
!
łusashino-shi
Tokyo 100 Japonia
(03) 3555-5011
:huo-ku Osaka 545 Japonia (06) 431-7877 Mayumi
iioonie Ponds Melbourne victoria 3058 Australia
(lochy (0544) 60323 (0544) 60603 FORMAGGI.HTM#FORMAGGI.HTM#D15
Suite'210 Bend
2100
Paul
Revere Blvd.
Fiskebakken
10
Lyngby
Rijnweg
22 Zaandam
Hunter s Hill Sydney j, rue des Alpes
OR 97101 USA (503) 555-9931
Boston MA 02134 USA (617) 555-3267
2800 Dania 438441Q8 43844115
9999 ZZ Holandia (12345) 1212 (12345'
NSW Annecy
2042 Australia (02) 555-5914 (02) 5!
74000 Francja 38.76.98.06 38.76.Ę<gj
: H
F iltrowanie rekordów za pomocą klauzuli SQL Where
Korzystając z klauzuli SQL where, można przygotować zestaw rekordów, które spełniają określone kryteria. Jeżeli wyrażenie zawarte w klauzuli where jest prawdziwe, wówczas dany rekord jest włączony do naszego zestawu, w przeciwnym razie dany rekord jest z niego wyłączony. Procedura w przykładzie 3.8.G otwiera zestaw rekordów, który zawiera tylko rekordy posiadające wartość Null lub empty string (tzn. są puste) w polu KlientOdRoku.
Przykład 3.8.G. Filtrowanie rekordów za pomocą klauzuli WHERE
Sub GetRecords_WithSQLWhere () Dim conn As ADODB.Connection Dim rst As ADODB.Recordset Dim strSQL As String strSQL = "Select * from tblKlienci Where
"isNull(KlientOdRoku) OR "
& "KlientOdRoku =='•■' Set conn = CurrentProject.Connection Set rst = New ADODB.Recordset rst.Open strSQL, conn, _
adOpenKeyset, adLockOptimistic MsgBox "Wybrano " & rst.RecordCount
& " rekordów." rst. Close Set conn = Nothing End Sub
Programowanie w Access!
F iltrowanie rekordów przy użyciu właściwości Filter
W ADO możesz również skorzystać z właściwości Filter, aby uzyskać tylk
w tym rozdziale). Jeżeli określony zestaw rekordów, które chcesz
na serwerze SQL, to zamiast właściwości Filter, należy użyć procedurę przecho1
waną (stored procedure).
Przykład 3.8.H. Filtrowanie rekordów za pomocą właśc iwości Filter
Sub FilterH2_FltrRecords()
Dim conn As New ADODB.Connection Dim rst As New ADODB.Recordset
conn.Open "Provider = Microsoft.Jet.OLEDB.4.0;" & "Data Source=C:\Program Files\Microsoft Office\PL\" & "Office\Samples\Northwind.mdb;"
With rst
.Open "Klienci", conn, _
adOpenKeyset, adLockOptim:.stic
.Filter = "Miasto='Madryt' and Kraj ='Hiszpania' MsgBox "Liczba klientów: " fc .RecordCount
End With
Do Until rst.EOF
Debug.Print rst.Fields(1).Value
rst.MoveNext Loop
rst.Filter = adFilterNone MsgBox "Filter usunięto. " & vbCr & "Tabela zawiera " & rst.RecordCount & " rekordów." rst.Close conn.Close MsgBox "Sprawdź w oknie Instrukcje bezpośrednie."
End Sub
Tworzenie i manipulowanie bazami danych za pomocą ADO
449
S ortowanie rekordów
Możesz skorzystać z właściwości sort, aby zmienić porządek wyświetlania rekordów. Właściwość sort nie zmienia fizycznej kolejności rekordów; rekordy są po prostu wyświetlone w kolejności określonej przez indeks. Jeżeli sortujesz według pól, które nie wchodzą w skład indeksu, to dla każdego pola tworzony jest tymczasowy indeks. Ten indeks zostaje automatycznie usunięty przez przypisanie właściwości sort pustego ciągu znaków. Właściwość Sort można użyć tylko, korzystając zkursora po stronie klienta (client-side cursor). Zwróć uwagę, że w przykładowej procedurze pokazanej poniżej została użyta następująca instrukcja:
.CursorLocation = adUseClient
Jeżeli korzystasz z kursora po stronie serwera (server-side cursor), to otrzymasz następujący błąd, „The operation requested by the application is not supported by the provider" (Operacja nie jest wspierana przez dostawcę danych). Wyjściowy porządek sortowania jest rosnący (ASC). Aby uporządkować zestaw rekordów rosnąco według pola Kraj, następnie zaś malejąco według pola Miasto, użyj następującej instrukcji:
rst.Sort = "Kraj ASC, Miasto DESC"
Procedura w przykładzie 3.8.1 wyświetla rekordy w porządku rosnącym według pola Kra j. Następnie właściwości sort przypisany jest pusty ciąg znaków i rekordy są wyświetlone w porządku ich występowania w tabeli. Chociaż można używać właściwości sort do sortowania danych, uzyskasz lepsze rezultaty, korzystając zkhuzuli order by w poleceniu SQL lub w kwerendzie użytej do otwarcia określonego zestawu rekordów.
Przykład 3.8.1. Sortowanie rekordów
Sub SortRecords ()
Dim conn As New ADODB.Connection
Dim rst As New ADODB.Recordset
conn.Open "Provider = Microsoft.Jet.OLEDB.4.0;" &
"Data Source=C:\Program Files\Microsoft Office\Pl\" &
"Office\Samples\Northwind.mdb;" 1 sortuj na nie indeksowanym polu With rst
.CursorLocation = adUseClient .Open "Klienci", conn, _
450
Programowanie w Accesi
a dOpenKeyset, adLockOptim:.stic .Sort = "Kraj" Do Until rst.EOF
Debug.Print rst.Fields("NazwaFirmy").Value &
": " & rst.Fields("Kraj").Value .MoveNext Loop
Debug. Print " oryginalne sortowanie"
.Sort = "" Do Until .EOF
Debug.Print rst.Fields("NazwaFirmy").Value &
": " & rst.Fields("Kraj").Value .MoveNext Loop .Close End With conn.Close Set rst = Nothing Set conn = Nothing End Sub
Zaawansowane możliwości obiektu Recordset
Oprócz zwykłego obiektu Recordset, z którym dotąd pracowaliśmy, umożliwia pracę z dwoma bardziej zaawansowanymi typami rekordów. Jeden typów nosi nazwę disconnected recordset, drugim jest tzw. saved recordset. Disą nected recordset umożliwia pracę z zestawem rekordów, który jest odłączony] źródła danych. Saved (lub persisted) recordset jesl zestawem rekordów zachowani w pliku, który można zamnknąć i ponownie otworzyć bez aktywnego połączenia! źródłem danych. W kolejnych zagadnieniach tego rozdziału dowiesz się, jak moi] korzystać z tych zaawansowanych zestawów rekordów.
tiitm,
u*
Tworzenie i manipulowanie bazami danych za pomocą ADO
451
g frniPoznajADO3: Formularz
JJP x
Wyszukiwanie i czytanie rekordów j Praca z rekordarni Więcej na temat obiektu Recordest
- Persisted/Disconnected Recordset B] Zachowaj rekordy na dysku
C i Właduj zachowane rekordy
R ysunek 3.9. Praca z zaawansowanymi zestawami rekordów
Fabrykowanie zestawu rekordów
Zestaw rekordów nie musi być połączony ze źródłem danych. ADO pozwala na tworzenie zestawu rekordów w pamięci. Aby sfabrykować taki zestaw rekordów, utwórz najpierw wszystkie żądane pola przy użyciu metody Append obiektu Field, następnie zaś otwórz sporządzony zestaw i wypełnij go danymi. Na przykład, możesz w łatwy sposób sporządzić zestaw rekordów przechowywujący dane pochodzące z nie relacyjnych źródeł danych takich jak katalog plików na dysku.
Procedura w przykładzie 3.9.A demonstruje, w jaki sposób można przygotować pusty zestaw rekordów zawierający trzy pola (Nazwa, Rozmiar, DataModyf ikacji) i następnie wypełnić go nazwami plików znajdujących się w określonym folderze. I Przy otwieraniu zestawu rekordów, który nie jest podłączony do źródła danych (Di-I sconnected Recordset) należy postawić przecinek w pozycji dwóch argumentów I metody open (source oraz ActiveConnection), tak jak w przykładzie poniżej:
I rst.Open , , adOpenStatic, adLockBatchOptimistic
Powyższa instrukcja otwiera zestaw rekordów, który jest odłączony od źródła
I danych.
452
Programowanie w Access 2
F unkcja VBA o nazwie FileLen zwraca rozmiar pliku w bitach. Inna VBA, FileDateTime, umożliwia pobranie daty i godziny modyfikacji pliku. Aby po-brać datę i godzinę osobno, zastosuj funkcję FileDateTime jako argument funkcji Da-tevaiue lub TimeValue. Wypróbuj następujące polecenia w oknie Instrukcje bezpo. średnie w trakcie wykonywania procedury w przykładzie 3.9.A w trybie krokowym:
? DateValue(FileDateTime(teczka & pole)) ? TimeValue(FileDateTime(teczka & pole))
Przykład 3.9.A. Tworzenie własnego zestawu rekordów
Sub Custom_Recordset()
Dim rst As ADODB.Recordset Dim strPlik As String Dim strPath As String Dim strTeczka As String
strPath = InputBox("Wpisz ścieżkę dostępu do " &
"pliku np., C:\Program Files")
If Right(strPath, 1) <> "\" Then strPath = strPath & "\" strTeczka = strPath strPlik = Dir (strPath &■■*.*") If strPlik = "" Then
MsgBox "Ten folder nie zawiera żadnych plików. " Exit Sub End If
Set rst = New ADODB.Recordset
1 utwórz pusty zestaw rekordów zawierający trzy pola With rst
.CursorLocation = adUseClient
.Fields.Append "Nazwa", adVarChar, 255
.Fields.Append "Rozmiar", adDouble
.Fields.Append "DataModyfikacji", adDBTimeStamp
1 otwórz Recordset
.Open , , adOpenStatic, adLockBatchOptimistic
Do While strPlik <> ""
If strPlik = "" Then Exit Do 1 dodaj nowy rekord .AddNew Array("Nazwa", _
"Rozmiar", _
Tworzenie i manipulowanie bazami danych za pomocą ADO
453
"DataModyfikacji"),
Array(strPlik, FileLen(strTeczka & strPlik) , FileDateTime(strTeczka & strPlik)) strPlik = Dir Loop
.MoveFirst
' wydrukuj zawartość obiektu Recordset do okna ' Instrukcje bezpośrednie Do Until .EOF
Debug.Print !Nazwa & vbTab & !Rozmiar & vbTab & !DataModyfikacj i .MoveNext Loop End With
Set rst = Nothing End Sub
Po wykonaniu procedury w przykładzie 3.9.A okno Instrukcje bezpośrednie wyświetla nazwy plików w podanym folderze, ich rozmiar oraz datę.
Immediate
DEFAULT.HTM 676 1999-12-07 12:00:00 JAVA. HTM 5454 1999-12-07 12:00:00 JAVAX.HTM 10467 1999-12-07 12:00:00 MAIN. HTM 592 1999-12-07 12:00:00 NAVSTYLE.CSS 2282 1999-12-07 12:00:00 OPEN.HTM 11180 1999-12-07 12:00:00 STYLE.CSS 1114 1999-12-07 12:00:00
HJU
Użycie zestawu rekordów zachowanego w pliku
ADO pozwala zachować Recordset w pamięci na dysku i pracować z nim z dowolnej aplikacji VBA. Skorzystaj z metody save obiektu Recordset, aby go zachować w pamięci. Podaj nazwę pliku i jeden z następujących typów formatów:
adPersitADTG - Advanced Data TableGram adPersitXML - Extensible Markup Language
454
Programowanie w Access 2
Procedura w przykładzie 3.9.B otwiera Recordset na podstawie poleceniaSQ Po otwarciu zestawu rekordów metoda save umożliwia umieszczenie rekon w pliku. Metoda save nie zamyka obiektu Recordset. Można kontynuować pij z zestawem rekordów. Zamknij Recordset, jeżeli nie planujesz już go więcej uży
Przykład 3.9.B. Zachowywanie rekordów w pliku na d> sku
Sub SaveRecordsToDisk()
Dim rst As New ADODB.Recordset
Dim strSQL As String
Dim strNazwaPliku As String
StrNazwaPliku = "c:\AgenciInfo.rst"
StrSQL = "SELECT [Imie]&" & Chr$(34) & " " & Chr$(34)
& " & [Nazwisko] AS [Imię Nazwisko], [Ulica]&" & Chr$(34) &
", " & Chr$(34) & " & [Miasto] AS Adres, tblAgenci.Telefon" &
vbNewLine & "FROM tblAgenci;"
' otwórz Recordset w oparciu o określore polecenie SQL ' skorzystaj z aktualnego połączenia
rst.Open strSQL, CurrentProject.Connect ion
' zachowaj Recordset w pliku Agencilnfo.rst
' korzystając z formatu Advanced Table DataGram (ADTG)
rst.Save strNazwaPliku, adPersistADTG rst.Close
MsgBox "Zapisano rekordy w pliku " & StrNazwaPliku & ". End Sub
C o można zrobić z zachowanym w pliku zestwem rekordów? Plik taki można w każdej chwili otworzyć bez potrzeby nawiązywania łączności ze źródłem danychi Procedura w przykładzie 3.9.C demonstruje, w jaki sposób można doczepić zachowa ne w poprzedniej procedurze rekordy do formularza przygotowanego w aplikacji Ad cess. Procedura BindRecordsetToForm jest wywołana w czasie ładowania formularg z procedury zdarzenia przy załadowaniu (Load). Przy otwieraniu zestawu rekordov zachowanego w pliku na dysku należy skorzystać z usług dostawcy o nazwie MSPei sistOLEDB:
- I
! Tworzenie i manipulowanie bazami danych za pomocą ADO
455
Łst.Open "C:\AgenciInfo.rst", "Provider=MSPersist", , , adCmdFile
Stała adCmdFile w powyższym poleceniu wskazuje, że zachowany Recordset należy otworzyć z pliku wskazanego w argumencie Source ("C:\AgenciInfo.rst").
1, Sporządź formularz pokazany poniżej. Nie wskazuj na razie, skąd mają pochodzić dane. Formularz powinnien być niezwiązany ze źródłem danych (oznacza to, że nie należy ustawiać właściwości źródło rekordów (Recordsource) formularza). Umieść następnie trzy pola tekstu w tym formularzu i ustaw następujące właściwości tych pól:
Właściwość
Nazwa
Nazwa txtDane
Źródło formantU". Imię Nazwisko
Nazwa: txtAdres
Źródło formantu: Adres
Nazwa: txtTelefon
Źródło formantu: Telefon
U waga: Nazwy podane w ustawieniu właściwości źródło formantu (ControlSource) pól tekstu są nazwami pól w zachowanym zestawie rekordów.
IrmAqencilnfo: Formularz
|TT • 1 ■ i ■ Z ■ i • 3 ■ i ■■ 4 • i • 5 • i ■ 6 ' i • 7 • i • 8' i■ ■ i ' 8 ' I ' 10
456
Programowanie w Access 291
2 . Wpisz następującą procedurę zdarzenia Przy załadowaniu (Load):
Private Sub Form_Load() BindRecordsetToForm End Sub
Wstaw nowy moduł i wpisz w nim procedurę w przykładzie 3.9.C poniżej.
Zachowaj formularz jako frmAgenciinfo.
Otwórz formularz frmAgencilnfo.
Po otwarciu formularza możesz przeglądać udostępnione rekordy. Rekordy tej przeznaczone tylko do odczytu.
Otwórz teraz okno Właściwości tego formularza i sprawdź ustawienie właściwi ści źródło rekordów (Recordsource). Jak widać na poniższym rysunku, formuln wyświetla dane znajdujące się w pliku sporządzonym przez procedurę 3.9.B wcześni! w tym rozdziale.
81 frmAgencilnfo: I iii-iimlai.»
Imię Nazwisko;
Adres; Obwodowa 12, Gdańsk
T elefon; J058242209
R ekord; M
1 ► u ■
li Formularz
2Ś
Format Dane | Zdarzenie j Inne
Źródło rekordów BTiffHWflB
Filtr, ,
Uporządkuj wedtug
Filtry dozwolone , Tak
Edycja dozwolona Tak
Usuwanie dozwolone Tak
Dodawanie dozwolone Tak
Wprowadzanie danych Nie
Typ zestawu rekordów Dynamiczny
Maksymalna liczba rekordów .... 10000
Filtruj serwer
Tabela unikatowa
Polecenie ponowej synchronizacji
Wszystkie
* 1 ■•• 1 jJ
J
Tworzenie i manipulowanie bazami danych za pomocą ADO
457
P rzykład 3.9.C. Wykorzystanie zestawu rekordów zachowanego na dysku
Sub BindRecordsetToFormt)
Dim rst As New ADODB.Recordset
Dim frm As New Form
Set frm = Forms![frmAgencilnfo]
1 Otwórz Recordset zachowany w pliku na dysku
' przy użyciu dostawcy MSPERSIST OLE DB
rst.Open "C:\AgenciInfo.rst",
"Provider=MSPersist", , , adCmdFile
' przypisz właściwości RECORDSET formularza
' otwarty Recordset
Set frm.Recordset = rst End Sub
Bezpieczeństwo danych przy użyciu ADOX
Oprócz zarządzania obiektami oraz modyfikowania struktury bazy danych, biblioteka obiektów ADOX pozwala zarządzać sprawami bezpieczeństwa bazy danych. Możesz programatycznie utworzyć konta użytkowników i konta grup, jak również przypisać odpowiednie uprawnienia użytkownikom oraz grupom. Skorzystaj ze zbiorów users oraz Groups obiektu Catalog, aby utworzyć konta użytkowników i grup izarządzać nimi (a także kontami grup). Skorzystaj z metod GetPermissions oraz SetPermissions obiektów User oraz Group, aby pobrać lub ustawić uprawnienia do obiektów bazy danych. Zanim będziesz mógł skorzystać z ADOX, ustaw odwołanie do biblioteki Microsoft ADO Ext. 2.1 for DDL and Security (wybierz Narzędzia => Odwołania w oknie edytora Visual Basic). Kolejne zagadnienia w tym rozdziale pokażą ci krok po kroku metody zarządzania bezpieczeństwem danych przy użyciu obiektów, metod i właściwości ADOX w procedurach VBA.
Tworzenie konta grupy
Aby utworzyć nowe konto grupy, otwórz obiekt Catalog, podając sposób połączenia się z bazą danych, i skorzystaj z metody Append zbioru Groups, aby dodać nowe konto grupy. Przy tworzeniu nowego konta grupy nie można podać idenyfikatora osobistego (PID). ADOX automatycznie generuje identyfikator typu SID dla danego konta grupy. Jednakże bez PID'a, nie można stworzyć ponownie identycznego konta grupy, jeżeli oryginalne konto zostanie uszkodzone lub usunięte. Z tego powodu lep-
458
Programowanie w Access
Twoi
szym rozwiązaniem jest wykorzystanie modelu obiektów DAO przy tworzeniu no^ł go konta grupy (zob. rozdział 2.).
Procedura w przykładzie 3.10.A pokazuje, w jaki sposób można utworzyć nowe' konto grupy o nazwie „Handel" w bieżącej bazie danych. Jeżeli konto wa\ o wskaznej nazwie już istnieje (błąd 2147467259), pułapka na błąd wyświetli okt wiedni komunikat.
m frmPoznaiAD04: Formularz
En>
Tworzenie kont 1 Uprawnienia } Hasła
Ot'
D:
"Grupy/Użytkownicy
^ Utwórz konto grupy Jy ® Utwórz konto indywidualne
j£j & Dodaj użytkownika do grupy Dj $% Usuń konto indywidualne EJ 0 Usuń konto grupy
r Wykaz |
|
|
Wszystkie grupy j |
|
Wszyscy użytkownicy i |
i HJ # ; ......T.l |
Użytkownicy w grupach j |
R ysunek 3.10. Dodawanie kont użytkowników oraz grup Przykład 3.10.A. Tworzenie konta grupy
Sub Create Group()
Dim cat As New ADOX.Catalog
On Error GoTo ObsługaBłędu
1 otwórz obiekt Catalog
cat.ActiveConnection = CurrentProject.Connection
' utwórz nową grupę
cat.Groups.Append "Handel"
Exit Sub
*m
Tworzenie i manipulowanie bazami danych za pomocą ADO
459
O bsługaBłędu:
If Err.Number = -2147467259 Then
MsgBox "To konto grupy już istnieje."
Else
MsgBox Err.Number & ": " & Err.Description
End If
Exit Sub End Sub
Aby utworzyć konto grupy w innej bazie danych niż bieżąca baza danych, należy otworzyć Catalog, podając nazwę systemowej bazy danych:
Dim baza As String
baza = "C:\Program Files\Microsoft Office\Office\" &
"Samples\Northwind.mdb" cat .ActiveConnection = _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & baza & ";" & _
"Jet OLEDB:System database=" & _ "C:\Program Files\Microsoft OfficeV & _
"Office\SYSTEM.MDW;" & "User Id=Admin;Password=;"
Aby sprawdzić rezultat wykonania procedury w przykładzie 3.10.A, wybierz Narzędzia => Zabezpieczenia => Konta użytkowników i grup. Następnie kliknij na zakładkę Grupy (zob. rysunek poniżej):
U żytkownicy Giupy | Zmienianie hasł-a logowania Nazwa1
* i
Administratorzy Jżytkownicy
Twoi
Tworzenie konta użytkownika
ADOX umożliwia założenie nowego konta użytkownika przez prze] todzie Append zbioru Users nazwy użytkownika oraz jego hasła. Przy tworzeniu J wego konta użytkownika nie można wybrać samemu identyfikatora osobistego M jest on wybrany automatycznie.
Procedura w przykładzie 3.10.B tworzy nowe konto użytkownika o nazw „Ekspert" z hasłem „gwiazda". Podanie hasła w tej chwili jest opcjonalne. HasłomoJ na podać później za pomocą metody ChangePassword obiektu User.
Przykład 3.10.B. Tworzenie konta użytkownika
Sub Create_User()
Dim cat As New ADOX.Catalog
On Error GoTo ObsługaBłędu:
1 otwórz Catalog
Connection
cat.ActiveConnection = CurrentProject.
' utwórz nowe konto użytkownika i dodaj ja 1 do zbioru Users cat.Users.Append "Ekspert", "gwiazda"
Exit Sub
ObsługaBłędu:
If Err.Number = -2147467259 Then
MsgBox "Konto 'Ekspert' już istnieje
End If Exit Sub End Sub
Konto użytkownika o nazwie Ekspert zostało utworzone w rezultacie wykonał procedury w przykładzie 3.10.B. Aby otworzyć to okno dialogu, wybierz NarzęJ => Zabezpieczenia => Konta użytkowników i grup:
Tworzenie i manipulowanie bazami danych za pomocą ADO
461
U żytkownicy j Grupy j Zmienianie hasfa logowania j
r Użytkownik
Nazwa: j ^fSfftBBESSJj! 1 Administrator
-Członkostwo grupy Dostępne grupy:
Członek grupy:
D rukuj użytkowników i grupy
OK
Cancel
Umieszczanie użytkowników w grupach
Procedura w przykładzie 3.10.C zakłada nowe konto grupy o nazwie „Elita," następnie zaś dodaje do tej grupy konto użytkownika o nazwie „Ekspert".
Przykład 3.10.C. Dodawanie użytkownika do nowo założonej grupy
Sub AddUser_ToNewGroup ()
Dim cat As New ADOX.Catalog
On Error GoTo ObsługaBłędu 1 Otwórz Catalog
cat .ActiveConnection = CurrentProject.Connection
1 Załóż nowe konto grupy
cat .Groups .Append "Elita"
1 Dodaj użytkownika do nowej grupy
cat.Users("Ekspert") .Groups.Append "Elita"
Exit Sub ObsługaBłędu:
If Err.Number = -2147467259 Then
MsgBox "Grupa 'Elita' już istnieje."
End If
Exit Sub Jnd Sub
462
Programowanie w Access 21
P o uruchomieniu procedury w przykładzie 3.10.C konto indywidualne onazł "Ekspert" jest członkiem nowej grupy o nazwie "Elita".
Konta użytkowi I
JlJŚ
Użytkownicy | Grupy j Zmienianie hasJ-a logowania j
r Użytkownik ~~——~~ ...,..,..-....—,-,.,—.„.—
Nowa... Usuń
Usuń hasło 1
■ Członkostwo grupy Dostępne grupy:
Członek grupy:
E lita
Handel
Użytkownicy
Dodaj »
« Usuń
Drukuj użytkowników i grupy
O K
Cancel
U suwanie kont indywidualnych
Skorzystaj z metody Delete zbioru users obiektu catalog, aby usunąć konta użytkownika. Procedura w przykładzie 3.10.D usuwa konto użytkownika onazvi Ekspert utworzone przez wcześniejszą procedurę w tym rozdziale.
Przykład 3.10.D. Usuwanie konta użytkownika
Sub Delete_User(kontolnd As String)
Dim cat As New ADOX.Catalog
On Error GoTo ObsługaBłędu
1 Otwórz Catalog
cat.ActiveConnection = CurrentProject.Connection
With cat
' wymaż konto użytkownika .Users.Delete kontolnd
End With
1 zamknij obiekt Catalog Set cat = Nothing
[MsgBox "Konto użytkownika ■Ekspert■ zostało wymazane."
bcit Sub ibsługaBłędu:
If Err.Number = 3265 Then
cat.Users.Append "Ekspert", "gwiazda"
End If Resume
End Sub
Usuwanie konta grupy
Skorzystaj z metody Delete zbioru Groups obiektu catalog, aby usunąć konto grupy. Procedura w przykładzie 3.10.E usuwa konto grupy Masters założone przez wcześniejszą procedurę w tym rozdziale.
Przykład 3.10.E. Usuwanie konta grupy
Sub Delete_Group(NazwaGrupy As String) Dim cat As New ADOX.Catalog On Error GoTo ObsługaBłędu
'Otwórz Catalog cat .ActiveConnection = CurrentProject.Connection
' Wymaż konto grupy
cat.Groups.Delete NazwaGrupy ' Zamknij obiekt Catalog Set cat = Nothing MsgBox "Koto grupy 'Masters' zostało wymazane."
Exit Sub
ObsługaBłędu:
If Err.Number = 3 26 5 Then
cat.Groups.Append "Masters"
End If Resume
End Sub
^■^
464
Programowanie w Access 2M
W yszczególnianie kont grupowych
ft
Procedura w przykładzie 3.10.F demonstruje, w jaki sposób należy pobrać na wszystkich zdefiniowanych kont grupowych ze zbioru Groups obiektu Catalog.
Przykład 3.10.F. Wyszczególnianie kont grupowych
Sub List_Groups()
Dim cat As New ADOX.Catalog
Dim grp As New ADOX.Group
1 Otwórz Catalog
cat.ActiveConnection = CurrentProject.Connection
For Each grp In cat.Groups Debug.Print grp.Name
Next
MsgBox "Nazwy grup znajdują sie w oknie " &
"Instrukcje bezpośrednie." End Sub
Wykaz kont grupowych sporządzony przez procedurę w przykładzie 3.10.F:
1 Immediate |
|
ill |
Admins Elita | Users |
|
.A. i |
lii |
|
JLJ • |
Sporządzanie wykazu kont indywidualnych
Procedura w przykładzie 3.10.G przedstawia, w jaki sposób można spór:
wykaz kont użytkowników znajdujących się w zbiorze users obiektu Catalog.
.
Przykład 3.10.G. Sporządzanie wykazu kont użytkowników
Sub List_Users()
Dim cat As New ADOX.Catalog
Dim kontolnd As New ADOX.User
Tworzenie i manipulowanie bazami danych za pomocą ADO
465
I1 otwórz Catalog
cat.ActiveConnection = CurrentProject.Connection For Each kontolnd In cat.Users
Debug.Print kontolnd.Name Next MsgBox "Konta użytkowników są wyszczególnione " &
"w oknie Instrukcje bezpośrednie. " End Sub
■
W ykaz kont indywidualnych sporządzony przez procedurę w przykładzie 3.10.G:
Immediate |
|
admin |
|
Creator |
i |
Engine |
-J |
|
|
Sporządzanie wykazu użytkowników należących do danej grupy
Czasami chcemy się dowiedzieć, którzy użytkownicy należą do poszczególnych grup. Procedura w przykładzie 3.10.H demonstruje, w jaki sposób można sporządzić taki wykaz drogą programowania.
Przykład 3.10.H. Sporządzanie wykazu użytkowników w poszczególnych grupach
Sub List_UsersInGroups O
Dim cat As New ADOX.Catalog Dim grp As New ADOX.Group Dim kontolnd As New ADOX.User
'Otwórz Catalog
cat.ActiveConnection = CurrentProject.Connection For Each grp In cat.Groups
Debug.Print "Nazwa grupy. " & grp.Name
If cat.Groups(grp.Name).Users.count = 0 Then
Debug.Print vbTab & "W grupie " & grp.Name &
Programowanie w Access 2QQ
" nie ma żadnych użytkowników."
End If
For Each kontolnd In cat.Groups(grp.Name).Users Debug.Print vbTab & "Nazwa użytkownika: " &
kontolnd.Name Next kontolnd Next grp Set cat = Nothing MsgBox "Nazwy grup i użytkowników znajdują " & _
"się w oknie Instrukcje bezpośrednie." End Sub
Po uruchomieniu procedury w przykładzie 3.10.H nazwy kont grupowych i indywidualnych są wyszczególnione w oknie Instrukcje bezpośrednie:
dc ni
N azwa grupy: Admins
Nazwa użytkownika: admin Nazwa grupy: Elita
W grupie Elita nie ma żadnych użytkowników.
Nazwa grupy: Handel
W grupie Handel nie ma żadnych użytkowników.
Nazwa grupy: Users
Nazwa użytkownika: admin
Ustawianie
i pobieranie uprawnień użytkowników oraz grup
35
=
;: 3
Tworzenie i manipulowanie bazami danych za pomocą ADO
467
I do różnych obiektów. Pamiętaj, że ustawiając uprawnienie dla danej grupy użytkowników, każdy użytkownik będący członkiem tej grupy uzyska te same uprawnienia.
i frmPoznajADO4 : Formuł w
Tworzenie kont Uprawnienia Hasła
AI Sprawdź właściciela
P rzyznawanie uprawnień
BJ S Uprawnienia do obiektu bazy danych |
CJ ® Uprawnienia do bazy danych D j 0H Uprawnienia do zbioru Containers
Ej Sprawdź uprawnienia
I Rysunek 3.11. Ustawianie i pobieranie uprawnień użytkowników oraz grup
Prawa właściciela
Baza danych oraz każdy jej obiekt posiadają właściciela. Właścicielem jest użytkownik, który utworzył dany obiekt. Właściciel obiektu posiada specialne przywileje. W każdej chwili może on przyznać lub odebrać uprawnienia do danego obiektu. Aby pobrać informacje dotyczące właściciela danego obiektu, skorzystaj z metody Getob-jectowner obiektu Catalog. Metoda ta oczekuje dwóch parametrów - nazwy obiektu oraz jego typu. Na przykład, aby dowiedzieć się, kto jest właścicielem danej tabeli, skorzystaj z polecenia o następującej składni:
at.GetObjectOwner (ObjName, adPermObjTable)
W poleceniu powyżej cat jest zmienną obiektową reprezentującą obiekt catalog wbibliotece ADOX, ObjName jest nazwą obiektu bazy danych, natomiast adPermObj-
468
Programowanie w Access 2
Table jest wbudowaną stałą, która określa typ obiektu. Nazwy stałych można sprał dzić w oknie Przeglądarka obiektów, jak widać poniżej:
Object Browser
object TypeEnum
Search Results
L ibrary
Class
Member
A D OX
#> ObjectTypeEnum
j Classes
j$ Indexes
#J InheritTypeEnum
©Key
i© Keys
v^j KeyTypeEnum
#>]
S3 Procedure
<& Procedures
IS Properties
Members of ObjectTypeEnum'
® adPermObjColumn
Q adPermObjDatabase
S adPermObjProcedure
Si adPermObjProviderSpedfic
E) adPermObjTable
@ adPerrnObjView
E nurn ObjectTypeEnum
ni ftllAV
Przykład 3.11.A. Sprawdzanie nazwy właściciela obiektu
Sub Get_ObjectOwner()
Dim cat As New ADOX.Catalog
Dim NazwaObiektu As Variant
NazwaObiektu = "tblKlienci"
' Otwórz obiekt Catalog
cat.ActiveConnection = CurrentProject.Connection
' Podaj imię właściciela tabeli tblKlienci
MsgBox "Właścicielem tabeli " & NazwaObiektu S " jest " & vbCr
& cat.GetObjectOwner(NazwaObiektu, adPermObjTable) & "." End Sub
I Tworzenie i manipulowanie bazami danych za pomocą ADO
469
A by zmienić właściciela obiektu przy użyciu ADOX, skorzystaj z metody seto-
j bjectOwner obiektu Catalog:
I cat.SetObjectOwner("tblKiienci", adPermObjTable, "Ekspert")
Powyższe polecenie informuje, że prawo własności do tabeli tblKiienci ma być przekazane użytkownikowi "Ekspert".
Ustawianie uprawnień użytkownika do obiektu
W ADOX uprawnienia do danego obiektu ustawia się przy użyciu metody set-permissions. Bezpieczeństwem danych na poziomie użytkownika łatwiej jest kierować, jeżeli ustawisz uprawnienia tylko dla kont grup, następnie zaś przydzielisz użytkowników do określonych grup. Jak pamiętasz, uprawnienia dla danej grupy są automatycznie dziedziczone przez użytkowników tej grupy. Metoda SetPermissions, którą można używać zarówno do ustawiania uprawnień użytkownika, jak i uprawnień całej grupy, posiada następujący zapis syntaktyczny:
GroupOrUser.SetPermissions(Nazwa, typObiektu, Czynność, Prawa[, Odziedzicz][, IdTypuObiektu])
• Nazwa jest nazwą obiektu, dla którego zamierzasz ustawić uprawnienia.
t TypObiektu jest typem uprawnień (zob. rysunek w poprzednim zagadnieniu, z nazwami stałych, które można zastosować w pozycji tego argumentu).
Czynność
jest typem czynności, którą należy wykonać przy
przydzielaniu
uprawnień.
Zastosuj w tej pozycji wbudowaną stałą o nazwie adAccessSet,
która
wskazuje,
że należy przyznać podane uprawnienia.
Prawa
jest stałą lub wartością typu Long,
wskazującą
uprawnienia, które należy
przydzielić.
Jeżeli chciałbyś przydzielić kilka uprawnień, skorzystaj z
operatora
logicznego
or,
aby
połączyć stałe. Rysunek poniżej przedstawia nazwy
wbudo
wanych
stałych, które można użyć do określenia typu uprawnień.
Przykładowa
procedura
3.1 l.B przydziela użytkownikowi uprawnienia do odczytu
(adRight-
Read),
dodawania
(adRightlnsert), modyfikacji (adRightUpdate) Oraz usuwa
nia
(adRightDelete) rekordów.
W ADOX możesz skorzystać z następujących stałych, które służą do ustawienia uprawnień dotyczących obiektów bazy danych:
j
gument
Dziedzicz jest wartością
typu Long,
która
określa, w jaki sposób obie™ odziedziczą
uprawnienia. Ustawieniem wyjściowym jest stała o nazwie adinij
ritNone.
Argument IdTypuObiektu jest wartością typu variant,
która
okreśB GUID (Global Unique
Identifier) dla
typu obiektu, który nie jest zdefiniowaj przez
dostawcę OLE DB. Argument ten jest obowiązkowy jeżeli
ustawieni™ argumentu
TypObiektu jest stała O nazwie adPermObjProviderSpecific
(J wana
do przydzielania uprawnień do formularzy, raportów oraz
makropoleceJ w
przeciwnym razie argument ten można pominąć. |
|
|
|
Programowanie w Access 20 |
||
Udox |
»] <J | Raj j _f j |
|
|
|||
[Right sEnum |
|
|
|
|||
; Search Results |
|
|
|
|||
| 1 Ubrajy . |
j Class m ,,,„lJ„WgwbejiijmiiijMMMJ |
|
||||
"" r^'iMSiBw |
|
|
||||
jl |
|
|
||||
! Classes |
|
Members of 'RightsEnum' |
|
|||
IS Groups |
|
SB adRightCreate |
|
■ |
||
^S Index |
|
52 adRightDelete |
|
|
||
© Indexes |
|
S3 adRigMDrop |
|
|
||
zip InheritTypeEnum |
|
SB adRightExclusive |
|
|
||
©Key |
|
E) adRightExecute |
|
|
||
^ Keys |
|
a adRightFull |
|
|
||
^ KeyTypeEnum |
|
l=J adRightlnsert |
|
|
||
■if ObjectTypeEnum |
|
n adRightMaxImumAllowed |
|
|
||
Jjj Procedure |
|
a adRightNone |
|
|
||
k^l Procedures |
|
P adRightRead |
|
|
||
igj Properties |
|
£1 adRightReadDesign |
|
|
||
jffl Property |
|
:Z! adRightReadPermlssions |
|
|
||
s^fRightslnum |
|
(i) adRightReference |
|
|
||
rip RuleEnunn |
|
B adRightUpdate |
|
|
||
i# SortOrderEnum |
|
■U adRightWithGrant |
|
|
||
gS Table |
|
O adRlghtWriteDeslgn |
|
|
||
0 Tables |
J |
® adRightWriteOwner |
|
|
||
^ User |
|
iiJ adRightWritePermissions |
|
|
||
:iE9 Users |
zl |
|
|
|
||
Enum RjghitsEnum |
|
|
||||
i Membei' of ADOX |
: dj |
|
||||
• Ostatnie |
dwa argumenty podane w nawiasach kw |
adratowych są opcjonalne. |
Obiekt |
GUID |
Formularz (Form) |
{c49c842e-9dcb-lldl-9f0a-00c04fc2c2e0} |
Raport (Report) |
{c49c8430-9dcb-11 d 1 -9f0a-00c04fc2c2e0} |
Makro (Macro) |
{c49c 842f-9dcb-11 d 1 -9f0a-0Oc04fc2c2e0} |
■ i
Tworzenie i manipulowanie bazami danych za pomocą ADO
471
U waga: Uprawnienia na poziomie obiektu jest znacznie łatwiej ustawiać oraz zarządzać nimi przy użyciu obiektów Data Active objects (DAO). Zostały one omówio-I new rozdziale 2.
P rzed uruchomieniem procedury w przykładzie 3.11 .B uruchom procedurę w przykładzie 3.10.B wcześniej w tym rozdziale, aby utworzyć konto użytkownika
o nazwie Ekspert.
Przykład 3.11.B. Ustalanie uprawnień użytkownika do obiektu
Sub Set_UserObjectPermissions () Dim cat As New ADOX.Catalog
1 Otwórz obiekt Catalog
cat .ActiveConnection = CurrentProject.Connection ' przypisz użytkownikowi Ekspert uprawnienia 1 do tabeli tblKlienci
cat.Users("Ekspert").SetPermissions "tblKlienci", _ adPermObjTable, _ adAccessSet, _
adRightRead Or adRightlnsert Or adRightUpdate Or adRightDelete Set cat = Nothing End Sub
Jeżeli po uruchomieniu procedury set_UserObjectPermissions (przykład 3.11.B) otworzysz okno dialogowe Uprawnienia użytkowników i grup, znajdziesz w nim następujące ustawienia:
472
Programowanie w Access l
Mpi awnienia MżyH«ł«
Uprawnienia
j Zmienianie właściciela
]
Nazwa
użytkownika/grupy: Nazwa
obiektu:
tblAgenci
tbIAgents
tblClients2
tblCopy
tbIFilters
tbIFiltry
Spedytorzy
Usta: @ Użytkownicy (~ Grupy Typ obiektu: JTabela
r • uprawnienia
j i i hs Odczytaj dane
I R Czytanie projektu P* Aktualizuj dane
) I Modyfikuj projekt W Wstaw dane
i f~ Administruj fs Usuń dane
Bieżący użytkownik: ] Administrator
U stawianie uprawnień użytkownika do bazy danych
Aby przydzielić uprawnienia do bazy danych, wpisz pusty ciąg znaków w pozycji nazwy bazy danych:
cat.Users("Guru").SetPermissions adPermObjDatabase, _ adAccessSet, adRightExclusive
Powyższe polecenie przypisuje użytkownikowi "Guru" prawo do otwierania bazy I danych z wyłącznością.
Przykład 3.11.C. Ustawianie uprawnień użytkownika do bazy danych
Sub Set_UserDbPermissions()
Dim cat As New ADOX.Catalog
Dim baza As String
baza = "C:\Program Files\Microsoft Office\Office\" &
f/'
Tworzenie i manipulowanie bazami danych za pomocą ADO
473
"Samples\Northwind.mdb" 1 Otwórz obiekt Catalog
cat.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & baza & ";" & _
"Jet OLEDB:System database=" &
"C:\Program Files\Microsoft Office\Office\SYSTEM.MDW;" &
"User Id=Admin;Password=;"
' Przypisz uprawnienia użytkownikowi o nazwie Guru cat .Users("Guru") .SetPermissions " ", adPermObjDatabase,
adAccessSet, adRightExclusive End Sub
Następujące ustawienia znajdują się w oknie dialogowym Uprawnienia użytkowników i grup po uruchomieniu procedury Set_UserDbPermissions (zob. przykład 3.11. C):
U
ptawnienia
| Zmienianie
właściciela
j
Jjazwa
uźytkownika/grupy: Nazwa
obiektu:
[Administrator Ekspert
Usta: ^Użytkownicy ^" Grupy. Typ obiektu: JBaza danych ^j
-Uprawnienia —~~~ " —™*—"1
| r Otwórz/Uruchom f™ :..."..-..■:■ >■■■■■■■■■■ i
[5 Otwórz z wyłącznością f \
; P Administruj P" USii6 Ó.W? i
Bieżący użytkownik; i Administrator i
Ustawianie uprawnień użytkownika do zbioru Containers
Teraz, gdy potrafisz już programatycznie przydzielać uprawnienia użytkownikom do określonego obiektu, np. tabeli lub kwerendy, czy też samej bazy danych, warto dowiedzieć się również, w jaki sposób można przydzielić uprawnienia do szeregu obiektów, takich jak tabele, kwerendy, formularze, raporty, czy makra: Jak pamiętasz z rozdziału 2., każdy obiekt Database posiada zbiór o nazwie containers, który mieści wbudowane obiekty o nazwie Container. Obiekt Container grupuje podobne
474
Programowanie w Access 209
typy dokumentów reprezentowane przez obiekt Document. Zbiór containers moaj wykorzystać do ustawienia zasad bezpieczeństwa dla wszystkich obiektów DocumeJ określonego typu. Możesz ustawić uprawnienia, które użytkownicy i grupy otrzymał dla wszystkich nowo utworzonych obiektów w bazie danych, podając Null w miejsc! argumentu Nazwa obiektu (w metodzie SetPermissions), tak jak to przedstaJ przykładowa procedura poniżej. Kod tej procedury daje użytkownikowi Ekspert« przypomnienia, konto to zostało utworzone w jednej z procedur w poprzednich zagad-l nieniach) prawo do projektowania (design), odczytu (read), modyfikacji (update), doj dawnia (insert), oraz usuwania (delete) danych we wszystkich nowo utworzonych taj belach oraz kwerendach. Zwróć uwagę, że wartość Null przekazana jest jako pierwszy! argument metody SetPermissions, aby wskazać, że uprawnienia mają dotyczyć tylJ ko nowych obiektów o typie określonym przez drugi argument tej metody.
Przykład 3.11.D2. Przydzielanie uprawnień do zbioru Containers
Sub Set_UserContainerPermissions 0 Dim cat As New ADOX.Catalog 'Otwórz obiekt Catalog
cat.ActiveConnection = CurrentProject.Connection ' Przydziel uprawnienia użytkownikowi Ekspert do tabel cat.Users("Ekspert").SetPermissions Null,
adPermObjTable,
adAccessSet,
adRightRead Or
adRightlnsert Or
adRightUpdate Or
adRightDelete, adlnheritNone End Sub
P o uruchomieniu powyższej procedury użytkownik Ekspert posiada następujące! uprawnienia do wszystkich nowo utworzonych obiektów Tables (Tabele) orazoJ eries (Kwerendy):
Tworzenie i manipulowanie bazami danych za pomocą ADO
475
uprawnienia użytkowników i
Uprawnienia
j Zmienianie właściciela
|
Nazwa
użytkownika/grupy: Nazwa
obiektu;
Administrator
AuthorISBN
Authors
AutorKBN
Autorzy
Employees
tblAgenci
tblAgents
Lista: (* Użytkownicy C Grupy Typ obiektu: Tabela
^■■Uprawnienia
i P P Odczytaj dane
! |7 Czytanie projektu R Aktualizuj dane
P Modyfikuj projekt W Wstaw dane
P Administruj f? Usuń dane
Bieżący użytkownik: | Administrator
QK
Cancel
Sprawdzanie uprawnień do obiektów
Możesz ustalić uprawnienia użytkownika lub grupy do określonego obiektu za pomocą metody GetPermissions w bibliotece ADOX. Ponieważ metoda ta zwraca uprawnienie do danego obiektu w postaci wartości numerycznej, aby wyświetlić nazwy stałych reprezentujących uprawnienia, musisz napisać dodatkowy kod, który rozszyfruje zwróconą wartość.
Procedura w przykładzie 3.1 l.E demonstruje, w jaki sposób należy pobrać uprawnienia przydzielone użytkownikowi Ekspert do tabeli tblKlienci w bieżącej bazie danych.
Przykład 3.11.E. Sprawdzanie uprawnień do określonego obiektu
bub GetObjectPermissions(strKontoInd As String, _
varNazwaObiektu As Variant, lngTypObiektu As ADOX.ObjectTypeEnum) Dim cat As New ADOX.Catalog
Programowanie w Accession
Tw<
D im listaPraw As Long Dim strTypyPraw As String
1 Otwórz obiekt Catalog
cat.ActiveConnection = CurrentProject.Connection listaPraw = cat.Users(strKontoInd). _
GetPermissions(varNazwaObiektu, lngTypO'oiektu)
Debug.Print listaPraw
If (listaPraw And ADOX.RightsEnum.adRightCreate) = _
adRightCreate Then
strTypyPraw = strTypyPraw & "adRightCreate" & vbCr
End If
If (listaPraw And RightsEnum.adRightRead) = adRightRead Then
strTypyPraw = strTypyPraw & "adRightRead" & vbCr ■
End If
If (listaPraw And RightsEnum.adRightUpdate1 = adRightUpdate Then strTypyPraw = strTypyPraw & "adRightUpdate" & vbCr
End If
If (listaPraw And RightsEnum.adRightDelete) = adRightDelete Then strTypyPraw = StrTypyPraw & "adRightDelete" & vbCr
End If
If (listaPraw And RightsEnum.adRightlnsert) = adRightlnsert Then strTypyPraw = strTypyPraw & "adRightlnsert" & vbCr
End If
If (listaPraw And RightsEnum.adRightReadDesign) = _
adRightReadDesign Then
strTypyPraw = StrTypyPraw & "adRightRs^adDesign" & vbCr
End If
Debug.Print strTypyPraw
End Sub
Rysunek na stronie następnej pokazuje, w jaki sposób można wywołać procedu w przykładzie 3.1 l.E z okna Instrukcje bezpośrednie oraz wyniki, które ta procedu zwraca:
■*
Tworzenie i manipulowanie bazami danych za pomocą ADO
477
immediate
|3etObjectPermissions "Ekspert", "tblKlienci",adPermObjTable
-1073642496
adRightRead
adRightUpdate
adRightDelete
adRightlnsert
adRightReadDesign
Zabezpieczanie bazy danych hasłem
W zależności od tego, na jakim poziomie chcesz zabezpieczyć swoją bazę danych, możesz zmienić hasło użytkownika Admin lub zmienić hasło bazy danych. Na-I stepujące zagadnienie demonstruje, w jaki sposób można wykonać programatycznie I czynności związane ze zmianą hasła bazy danych.
m fmiPoznajADCM: Formularz
Tworzenie kont j Uprawnienia Hasła i
B j Zmień hasło użytkownika
I Rysunek 3.12. Ustawianie hasła
I Zmiana hasła bazy danych
Po zmianie hasła bazy danych przy otwarciu bazy danych pojawi się okno dialo-
I gowe Hasło. Tylko użytkownicy posiadający prawidłowe hasło będą mogli otworzyć
bazę danych. Aby ustawić hasło bazy danych przy użyciu ADO, musisz skorzystać
478
Programowanie w Access 21
Z metody CompactDatabase Z biblioteki obiektów Microsoft Jet and Replicatj objects (JRO) oraz podać wartość dla parametru Password.
Następująca procedura ustawia hasło bazy danych North windNowy na „witali Przed uruchomieniem procedury w przykładzie 3.12.A ustaw ustawienie do biblioti obiektów JRO, według wzoru poniżej:
■ References - PoznajADO |
|
|
|
|
|
Available References: |
|
|
|||
|
OK |
|
|
||
|
y Visual Basic For Applications ™T] lyj Microsoft Access 9,0 Object Library Bj OLE Automation H Microsoft Office 9.0 Object Library y, Microsoft ADO Ext, 2,6 for DDL and Security y Microsoft Scripting Runtime • Microsoft Excel 9.0 Object Library w1 Microsoft Word 9.0 Object Library f y' Microsoft Data Source Interfaces |
'riority |
Cancel Browse,,. |
|
|
|
Help |
|
|||
|
HMicrosoft Jet and Replication Objects 2.6 Librarv m |
\\ |
|
||
|
*
Microsoft
DAO 3.6
Object
Library |
|
|
||
|
|
|
|||
; 1 'I1L.F <_OUI L JCL gllu r\CJJI!LCIUUI 1 "JUjCH. J £. . D LILT Of y | Location: C:\ProgramFiles\CommonFiles\System\A |
5O\msjro.dll |
|
|||
|
Language: Standard |
|
|
|
|
|
|
|
|||
Przykład 3.12.A. Zmiana hasła bazy danych |
|
|
|||
Sub Change DBPasswordO |
|
||||
Dim jetEng As New JRO.JetEngine |
|
||||
Dim strCompactFrom As String |
|
||||
Dim strCompactTo As String |
|
||||
Dim strPath As String |
|
||||
strPath = "C:\Program Files\Microsoft |
Office\" & |
||||
"Office\Samples\" |
|
||||
strCompactFrom = "Northwind.mdb" |
|
||||
strCompactTo = "NorthwindNowy.mdb" |
• |
||||
On Error GoTo ObsługaBłędu |
|
||||
' Skompaktuj bazę danych i podaj nowe |
hasło bazy |
||||
jetEng.CompactDatabase "Data Source=" |
& |
'
Tworzenie i manipulowanie bazami danych za pomocą ADO
479
strPath & strCompactFrom & ";",
"Data Source=" & strPath & strCompactTo & ";:
"Jet OLEDB:Database Password=witam" Exit Sub ObsługaBłędu:
If Err.Number = -2147217897 Then
Kill strPath & strCompactTo Else
MsgBox Err.Number & ": " & Err.Description
Exit Sub End If Resume End Sub
Zmiana hasła użytkownika
Aby zmienić hasło użytkownika, możesz skorzystać z metody changePassword obiektu User. Metoda ta wymaga podania obecnego i nowego hasła użytkownika.
Przykład 3.12.B. Zmiana hasła użytkownika
Sub Change_UserPassword()
Dim cat As New ADOX.Catalog
Dim baza As String
baza = "C:\Program Files\Microsoft Office\Office\" &
"Samples\Northwind.mdb"
1 Otwórz obiekt Catalog i podaj nazwę systemowej bazy danych cat .ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & baza & ";" & _
"Jet OLEDB:System database=" &
"C:\Program Files\Microsoft Office\Office\SYSTEM.MDW" ' Zmień hasło użytkownika o nazwie Admin cat .Users("Admin") .ChangePassword " ", "sekret" End Sub
i
Po uruchomieniu procedury w przykładzie 3.10.B i otwarciu bazy danych Nor-I thwind pojawi się okno dialogowe wymagające podania hasła. Wpisz Admin w polu I nazwy oraz „sekret" w polu hasło. Aby usunąć hasło użytkownika Admin, uaktywnij I okno dialogowe Konta użytkowników i grup, wybierając Narzędzia => Zabezpie-
480
Programowanie w Access 201
c zenia. Na zakładce Zmienianie hasła logowania (Change Logon Password) wpJ stare hasło (sekret) i kliknij przycisk Apply.
Transakcje
W rozdziale 2. podczas pracy z DAO nauczyłeś się stosować metody obieH Workspace (BeginTrans, CommitTrans oraz RollbackTrans) w celu wykonania serł operacji na danych. Dzięki tym metodom uzyskałeś pewność, że wszystkie operacje! zakończą się powodzeniem przed zatwierdzeniem dokonanych zmian. W ADO obiekt j Connection dysponuje takimi samymi metodami, które umożliwiają zarządzanie transakcjami.
BeginTrans Rozpoczęcie transakcji.
CommitTrans Zatwierdzenie zmian i zakończenie transakcji.
RollbackTrans Anulowanie zmian dokonanych w transakcji i zakończenie transakcji.
Chociaż biblioteki obiektów DAO oraz ADO dysponują podobnymi metodam pracy z transakcjami, obiekt, z którym te metody są stosowane określa zakres transakcji. Podczas gdy w DAO obiekty Workspace umożliwiają wykonanie transakcji obej-1 mującej kilka baz danych Microsoft Access, w ADO transakcje ograniczone sądoj jednej bazy danych. To ograniczenie wynika stąd, że z obiektu Connection można ■ w danej chwili odwołać się tylko do jednej bazy danych.
Procedura w przykładzie 3.13.A zakłada, że chcesz wprowadzić nowe zamówię-1 nie złożone przez klienta. Ponieważ dane tego klienta nie istnieją jeszcze w bazie da-1 nych, pierwsza instrukcja SQL - insert into wpisuje informacje o kliencie do tabeli I Klienci w bazie danych Northwind. Zanim klient może złożyć zamówienie na określone produkty, należy również dodać rekord do tabeli zamówienia. Tę czynność w« konuje druga instrukcja INSERT INTO. Ponieważ oba wpisy muszą zajść przed wpjl saniem szczegółów zamówienia w tabeli opisy zamówień, zmiany te traktowane są I jako pojedyncza transakcja. Jeżeli w którymkolwiek miejscu wystąpi błąd (na przykład tabela zamówienia akurat jest otwarta w trybie Projektuj), cała transakcja został nie anulowana. Zwróć uwagę na użycie instrukcji insert into w tej procedurze. Jel żeli nie wyszczególnisz nazw pól, musisz podać wartości dla wszystkich pól w tabeli
Tworzenie i manipulowanie bazami danych za pomocą ADO
481
g frmPoznajADOS; Formutare
Transakcje j Kompaktowanie/Zabezpieczanie szyfrem | Replikacja bazy danych
ź transakcję j
| Rysunek 3.13. Tworzenie transakcji
I Przykład 3.13.A. Tworzenie transakcji
Sub CreateAl_Transaction ()
Dim conn As ADODB.Connection
On Error GoTo err_CreateAl_Transaction
Set conn = New ADODB.Connection
With conn
.Provider = "Microsoft.Jet.OLEDB.4 . 0 " .ConnectionString = "Data Source = " & _
"C:\Program Files\Microsoft Office\PL\Office\" & "Samples\Northwind.mdb" .Open
.BeginTrans
.Execute "INSERT INTO Klienci Values ('GWIPO1, 'Gwiazda Polarna1," & " 'Marcin Garnia', 'Kierownik sprzedaży'," & " 'ul.Majewskiego 10',"
& " ' Warszawa1, Null, '02-106', 'Polska', '0114822230445 ' , Null) "
.Execute "INSERT INTO Zamówienia (IDklienta, IDpracownika, "
482
Programowanie w Access 2000
& "DataZamówienia, DataWymagana) Values ('GWIPO', 1, Dated,
& " Date ()+5)" .CommitTrans .Close End With Exit Sub
err_CreateAl__Transaction: MsgBox Err.Description With conn
.RollbackTrans .Close End With End Sub
Po uruchomieniu procedury w przykładzie 3.13.A, do tabeli Klienci oraz zamó-wienia dodany jest rekord nowego klienta "Gwiazda Polarna", tak jak to widać na rysunku poniżej:
■ Klienci: Tabela
ID
zamówienia|
Pracownik Data zamówienia Data wymagana
Data wysyłki ID spedytora
ID
klienta
- GWIPO
Nazwa firmy
Gwiazda Polarna
Przedstawiciel
Marcin Garnia
Stanowisko
Kierownik sprzedamy
Adres
ul.MajewskiaqolQ
_*J utonumerowanie' * Rekord: u
Oavolio, Nancy
29.03.2002
03.04.2002
K ompaktowanie bazy danych
Przy częstym użyciu, w miarę upływu czasu, twoja baza danych może coraz go-i rzej się sprawować. Jak wiesz, częste usuwanie obiektów z bazy danych prowadzi do jej fragmentacji. Aby poprawić wydajność bazy danych i zmniejszyć rozmiar pliku bazy danych, możesz skompaktować lub zreperować oazę danych Microsoft Access, korzystając z biblioteki Microsoft Jet OLE DB Provider and Replication Objects (JRO), która jest częścią składową w hierarchii obiektów ADO. Aby móc pracować I z tą biblioteką obiektów, wybierz Narzędzia => Odwołania z ekranu edytora Visual Basic i zaznacz Microsoft Jet and Replication Objects 2.5. Bazę danych Microsoft Jet I można skompaktować przy użyciu metody compactDatabase obiektu jetEnghe. Przed skompaktowaniem bazy danych upewnij się, żt jest ona zamknięta. Podaj nazwę nowego pliku bazy danych, następnie usuń oryginalny plik i zmień nazwę skoin paktowanej bazy danych na oryginalną nazwę.
>#Bsa*
Tworzenie i manipulowanie bazami danych za pomocą ADO
483
m frmPoznajADOS: Formularz
Transakcje Kompaktowanie/Zabezpieczanie szyfrem 1 Replikacja bazy danych
ś
■1
i.Skompatóuj base i danych
Z abezpiecz bazą danych szyfrem
Rysunek 3.14. Kompaktowanie i szyfrowanie bazy danych
Procedura poniżej demonstruje, w jaki sposób należy skorzystać z obiektów biblioteki JRO w celu skompaktowania przykładowej bazy danych Northwind.
Przykład 3.14.A. Kompaktowanie bazy danych
Sub CompactDb ()
Dim jetEng As New JRO.JetEnglne Dim strCompactFrom As String Dim strCotnpactTo As String Dim strPath As String
strPath = "C:\Program Files\Microsoft Office\Office\Samples\"
strCompactFrom = "Northwind.mdb"
strCompactTo = "NorthwindNowy.mdb"
1 zastaw pułapkę gdyby plik o takiej nazwie już istniał na dysku
On Error GoTo ObsługaBłędu
1 Skompaktuj bazę danych
jetEng.CompactDatabase _
"Data Source=" & strPath & strCompactFrom & ";", _ "Data Source=" & strPath & strCompactTo & ";"
1 Wymaż oryginalną bazę danych
■
Programowanie w Access 2001
Kill strPath & strCompactFrom 1 Zmień nazwę bazy danych na oryginalną Name strPath & strCompactTo As strPath & strCompactFrom MsgBox "Zakończono kompaktowanie bazy danych." Exit Sub ObsługaBłędu:
If Err.Number = -2147217897 Then
Kill strPath & strCompactTo Else
MsgBox Err.Number & ": " & Err.Description Exit Sub End If Resume End Sub
Zabezpieczanie bazy danych szyfrem
Aby osiągnąć wyższy stopień bezpieczeństwa danych i zabezpieczyć bazę danych przez osobami nieupoważnionymi, możesz zaszyfrować bazę danych. Przed przystąpieniem do szyfrowania danych, zabezpiecz bazę danych, przyznając odpowiednie uprawnienia użytkownika oraz grupy do obiektów bazy danych. Aby zaszyfrować bazę danych, trzeba być właścicielem tej bazy lub członkiem grupy Admins w pliku grupy roboczej (System.mdw), który był w użyciu w czasie tworzenia bazy danych. Skorzystaj z metody CompactDatabase obiektu jetEngine z biblioteki Microsoft Jet and Replication Objects (JRO), aby zaszyfrować lub odszyfrować bazę I danych. Aby móc skorzystać z obiektu JetEngine, należ}/ najpierw ustawić odwołanie do biblioteki obiektów Microsoft Jet and Replication Objects.
Aby zaszyfrować bazę danych, musisz również przypisać wartość True właści- 1 WOŚci Jet OLEDB: Encrypt Database obiektu CompactDatabase w ciągu połączenia i (zob. przykładową procedurę poniżej). Po zaszyfrowaniu bazy danych znajdujących 1 się w tej bazie danych nie można przeczytać przy użyciu jakiegokolwiek programu 1 użytkowego czy też procesora tekstu. Procedura w przykładzie 3.14.B tworzy zaszy-frowaną wersję przykładowej bazy danych Northwind. -
Przykład 3.14.B. Szyfrowanie bazy danych
Sub EncryptDb()
Dim jetEng As New JRO.JetEngine
Tworzenie i manipulowanie bazami danych za pomocą ADO
485
D im strCompactFrom As String Dim strCorapactTo As String Dim strPath As String
strPath = "C:\Program Files\Microsoft Office\Office\Samples\'
strCompactFrom = "Northwind.mdb"
strCompactTo = "NorthwindSzyfr.mdb"
1 skorzystaj z metody CompactDatabase, aby utworzyć
' nową zaszyfrowana wersję bazy danych
jetEng.CompactDatabase "Data Source=" & strPath & strCompactFrom & ";", _ "Data Source=" & strPath & strCompactTo & ";" & "Jet OLEDB:Encrypt Database=True" End Sub
Replikacja bazy danych
Aby udostępnić określoną bazę danych użytkownikom przebywającym w różnych obszarach geograficznych, można przesłać im pełną lub częściową kopię bazy danych. Użytkownicy mobilni lub zdalni mogą korzystać z lokalnej kopi bazy danych, wprowadzać zmiany w danych na własnym komputerze i następnie synchro-nizować wprowadzone zmiany z główną bazą danych w określonych odstępach czasu. Czynności te umożliwia technologia określana terminem replikacji (Replication). Replikacja bazy danych polega na tworzeniu wielu kopi (replik) danej aplikacji i udostępnieniu tych kopi zdalnym użytkownikom po to, aby mogli oni z kolei udostępnić zmiany wprowadzane w bazie danych innym użytkownikom.
Replikacja bazy danych zapewnia następujące korzyści:
Wygodną
dystrybucję zmian w istniejących aplikacjach - zmiany oraz
modyfi
kacje
wprowadzone w kwerendach, formularzach, raportach oraz innych
kompo
nentach
bazy danych można automatycznie wprowadzić do zdalnych kopi
bazy
danych
w czasie następnej synchronizacji.
Redukcję
ruchu w sieci - repliki bazy danych można umieścić na różnych
serwe
rach
obsługujących innych użytkowników lub inne grupy, w ten sposób
zmniej
szając
nadmierny ruch w sieci.
Tworzenie
kopi zapasowych - nie trzeba tworzyć oddzielnej kopi zapasowej
ba
zy
danych, gdyż każda replika może służyć jako kopia rezerwowa.
Jeżeli wzo
rzec
projektowania (ang. Design
Master)
ulegnie
uszkodzeniu, można w każdej
486
Programowanie w Access 20
c hwili uczynić inną replikę wzorcem projektowania. O tworzeniu wzorca projektowania oraz replik pochodnych dowiesz się w dalszej części tego rozdziału.
m frmPoznajADOS: Formularz
Transakcje)
Kompatóowanie/Zabezpieczanie
szyfrem Replikacja bazy dany ch )
Utwórz
replikę Kliknii
dwukrotnie na nazwę bazy
danych, któtąch
Northwind_haslo.mdb *
Jf« Wzorzec
Northwind.mdb
pj [ B i & Replika całkowita
I c 1 «
projektowania
Org_Northwind.mdb 2.
— Wybierz typ filtra dla repliki częściowej
Oparty nai relacji
« Replika częściowa j | » Oparty na wyrażeniu
, Obiekty we wzorcu — j projektowania
\ d\c Zreplikuj nowy i—' obiekt
\ E ]£•" Nie pozwól na
:™^ replikowanie obiektu
Synchronizacja replik
Pobierz właściwości repliki
[ Sprawdzanie j i konfliktów | jsynchrorazacjj
R ysunek 3.15. Eksperymenty z replikacjąbazy danych
Chociaż możesz sporządzić replikę swojej bazy danych przy użyciu interfejsu użytkownika w aplikacji Microsoft Access 2000 (zot, polecenie Replikacja w menu Narzędzia), w kolejnych zagadnieniach tego rozdziału nauczysz się dokonywać repli-kacji programatycznie przy użyciu ADO.
Przed przystąpieniem do eksperymentów zreplikacją ustaw odwołanie do biblioteki obiektów Microsoft Jet and Replication Objerts (JRO), wybierając Narzędzia] => Odwołania w oknie edytora Visual Basic. Po ustawieniu odwołan.a do JRO moj żesz sprawdzić w Przeglądarce obiektów nazwy obiektów, właściwość! oraz metoj dostępne w tej bibliotece:
Tworzenie i manipulowanie bazami danych za pomocą ADO
487
F7f)bject Browser |
|
|
lUiLJJJ |
|
|
I glasses |
Members of Replica' |
3 <globals> |
IS1 ActiveConnection |
■ Filter |
[S? ConflictFunction |
1 g Filters |
US' ConflictTables |
I $> FilterTypeEnum |
«* CreateReplica |
ąjetEnąine |
IS? DesignMasterid |
BSReplica- j |
IŚ1 Filters |
1 ^ReplicaTypeEnum |
■»* GetObjectReplicability |
1 § SyncModeEnutn |
■s* MakeRepiicabie |
I # SyncTypeEnum |
<* PopulatePartial |
1 R UpdatabilityEnum |
[Ś1 Priority |
I # Visibilit/Enum |
^" Replicald |
|
IŚ? ReplicaType |
• |
IS1 RetentionPeriod |
|
«j> SetObjsctReplicability |
|
i* Synchronize |
|
Ei1 Visibility |
Class Replica |
3 |
I Member of JRfi |
3 |
1
O biekt Replica posiada metody określające, czy dany obiekt można replikować (GetObjectReplicability), W jaki sposób utworzyć replikę (CreateReplica), jak zrobić z bazy danych wzorzec projektowania (MakeRepiicabie), jak można wypełnić częściową replikę danymi (PopulatePartial), jak ustawić zdolność do replikacji danego obiektu (setobjectReplicability) oraz w jaki sposób dokonać synchronizacji repliki (synchronize). Oprócz metod istnieje szereg właściwości obiektu Replica: DesignMasterid, Replicald, Visibility, RetentionPeriod czy też ConflictTables.
Procedury VBA w kolejnych podrozdziałach tego rozdziału zapoznają cię zpodstawami replikacji bazy danych.
Tworzenie repliki głównej (Wzorzec projektowania)
Replika jest kopią bazy danych. Istnieją trzy typy replik: replika główna, określana wzorcem projektowania (Design Master), replika całkowita (Full Replica) oraz replika częściowa (Partial Replica). Aby programatycznie replikować dane, zacznij od sporządzenia kopi zapasowej swojej bazy danych. Będzie ci ona potrzebna w przypadku jakiegoś problemu z replikowaną bazą danych. Następnie utwórz replikę bazy danych, korzystając z metody MakeRepiicabie obiektu Replica. Metoda ta \wmaga podania pełnej ścieżki dostępu do pliku bazy danych. Metoda MakeRepii-caibe w bibliotece JRO może przyjąć dodatkowy argument o nazwie coiumnTrac-king, który wskazuje, czy zmiany wprowadzone w replice mają być śledzone na po-
488
Programowanie w Access 2(j
z iomie kolumny (pola), czy też na poziomie wiersza (rekordu). W programie AccJ 2000 śledzenie zmian jest automatycznie ustawione na poziomie kolumny. OznJ to, że zmiany wprowadzone w dwóch różnych kolumnach (polach) tego samego kordu w dwóch różnych replikach nie spowodują konfliktu w trakcie synchronize danych. W odróżnieniu od biblioteki ADO, w DAO (Data Access Objects) konflil są określane na poziomie wiersza. Do konfliktu dochodzi za każdym razem, kiedy] sam rekord jest zmieniany w dwóch oddzielnych replikach, nawet jeśli w każ z replik są zmieniane inne pola. Aby śledzić zmiany na poziomie wiersza, nali przypisać właściwości CoiumnTracking wartość False, tak jak w przykładzie poniżi
wzorzecProjektowania.MakeReplicable strścieżka, False
Metoda MakeReplicabie zamienia normalną bazę danych Microsoft Accesl replikę główną (wzorzec projektowania). Z wzorca projektowania można utwoi dodatkowe repliki przy użyciu metody createReplica. Wzorzec projektowania j pierwszym członkiem danego zestawu replik (Replica Set). W czasie tworzenia ca projektowania do bazy danych automatycznie dodane zostają nowe tabele syi mowę i do istniejących w bazie danych tabel dodane zostaną nowe pola. Zmil w strukturze bazy danych zawsze należy wykonać we wzorcu projektowania. Wp« padku uszkodzenia wzorca możesz zrobić dowolną replikę z tego samego zestal replik wzorcem projektowania. Poniższa proceduia demonstruje, w jaki sposób nall przygotować kopię zapasową bazy danych i sporządzić replikę główną (wzorzec pro jektowania).
Przykład 3.15.A. Tworzenie repliki głównej (Wzorzec projektowania)
Sub Create_DesignMaster(strBaza As String, strPath As String) Dim repDesignMaster As New JRO.Replica Dim fso As Object
On Error GoTo ErrorHandle
' Ustaw odwołanie do obiektu FileSystemObject
Set fso = CreateObject("Scripting.FileSystemObject")
' przygotuj kopię zapasową bazy danych p::zed przystąpieniem ' do replikacji If InStr(strBaza, "Org_") Then
MsgBox "To jest oryginalny plik.", vbCritical, "Wybierz inny pij Exit Sub
Łorzenie i manipulowanie bazami danych za pomocą ADO
489
lv.& li
1 upewnij się, że nie ma pliku o tej samej nazwie ■fNot fso.FileExists(strPath & "Org_" & strBaza) Then
fso.CópyFile strPath & strBaza, strPath & "Org_" & strBaza
End If
1'sporządź replikę wybranej bazy danych If Not InStr(strPath & strBaza, "Org_") Then [ repDesignMaster.MakeReplicable strPath & strBaza, True MsgBox "Utworzono replikę główną."
L if
Set repDesignMaster = Nothing Exit Sub
orHandle: If InStr (Err.Description, "replicable") Then
MsgBox "Plik " & strBaza & " został już zreplikowany."
End If, . Sub
Tworzenie repliki całkowitej
Na podstawie wzorca projektowania możesz utworzyć dodatkowe repliki, korzystając z metody createReplica. Metoda ta wymaga dwóch obowiązkowych i kilku opcjonalnych argumentów, które pozwalają określić typ repliki, jej widoczność, prio-I r\tet, oraz zdolność do modyfikacji. Jeżeli pominiemy dodatkowe argumenty, to utworzymy tzw. replikę całkowitą. Replika taka będzie dostępna globalnie i można ją będzie modyfikować. Procedura poniżej demonstruje sposób tworzenia repliki całko-
Przyklad 3.15.B. Tworzenie repliki całkowitej
; sub Make_Replica (DesignMasterName As String, _ NewRepName As String)
Dim repDesignMaster As New JRO.Replica On Error GoTo ObsługaBłędu With repDesignMaster
.ActiveConnection = DesignMasterName .CreateReplica NewRepName, "Replica of
490
Programowanie w Access 209
DesignMasterName End With
Set repDesignMaster = Nothing MsgBox "Utworzono nową replikę o nazwie: " &
NewRepName & "." Exit Sub ObsługaBłędu:
If Err.Number = -2147217897 Then Kill NewRepName
Else
MsgBox Err.Number & ": " & Err.Description
Exit Sub End If Resume End Sub
Z repliki głównej (wzorzec projektowania) można utworzyć dowolną liczbę d datkowych replik. Wszystkie repliki utworzone z tego samego wzorca należą do tj samego zestawu replik, i tylko repliki należące do tego samego zestawu mogą sj chronizować i wymieniać dane pomiędzy sobą.
Tworzenie repliki częściowej
Replika częściowa (Partial Replica) jest repliką, która nie zawiera wszystki danych znajdujących się w replice głównej. Ten typ repliki jest odpowiedni dlaua kowników, którzy tylko muszą pracować z określonymi danymi. Replikę częściB tworzy się, ustawiając filtr na tabelach lub kwerendach. Filtr ten można oprzeć na J rażeniu (Expression-based Filter) lub na relacji (Relationship-based Filter). Repl częściowa zawiera wszystkie tabele, które istnieją we wzorcu projektowania, jednr użytkownik ma dostęp tylko do danych udostępnionych przez filtr. Stąd niektón bele w replice częściowej są puste. Ponieważ repliki częściowe zawierają mniej re dów, można je szybciej synchronizować. Replikę częściową można utworzyć, ko stając z metody createReplica i podając dwa wymagane argumenty (nazwę rej częściowej oraz jej znaczenie) oraz stosując stałą o nazwie jrRepTypePart w miejscu argumentu opcjonalnego. Należy również zdefiniować filtr, który ok~ jakie rekordy replika częściowa ma zawierać. Każda replika może zawierać jedenl więcej filtrów. W JRO istnieją dwa typy filtrów. Filtr oparty na wyra (expression-based) podaje kryteria, które rekord w replice częściowej musi zadov aby wejść w skład tej repliki (tzn. może być replikowany z repliki głównej). Kr podaje się w formie podobnej do klauzuli SQL where bez słowa kluczowego f
[Tworzenie i manipulowanie bazami danych za pomocą ADO 491
Na przykład poniższa procedura stosuje następujące kryterium, które daje dostęp tylko I do rekordów określonej firmy:
I "(JazwaFirmy = 'New Orleans Cajun Delights'"
Drugi typ filtra (relationship-based) ogranicza rekordy na podstawie relacji mię-I dzy tabelami. W procedurze poniżej użytkownik będzie miał dostęp tylko do produk-I tów dostarczanych przez New Orleans Cajun Delights. Po ustawieniu filtrów, skorzy-■ staj z metody PopulatePartial, aby dodać rekordy do repliki częściowej na bazie I podanych filtrów. Metoda ta wymaga podania ścieżki dostępu do pliku i pełnej nazwy pepliki, z której chcesz pobrać rekordy.
I
Przykład
3.15.C. Tworzenie repliki częściowej (Partial
Replica) Sub
Make_PartialReplica(FilterOption As Integer) Dim
repFull As New JRO.Replica Dim
łepPartial As
New JRO.Replica Dim
repFullName As String Dim
repPartialName As String Dim
fit As JRO.Filter Dim
strFilterType As String
On Error GoTo ObsługaBłędu
repFullName = "C:\Program Files\Microsoft Office\PL\" &
"Office\Samples\Northwind.mdb" repPartialName = "C:\Program Files\Microsoft Office\PL\" &
"Office\Samples\Orleans.mdb"
1 Utwórz replikę częściową
repFull.ActiveConnection = repFullName
repFull.CreateReplica repPartialName, _
"Partial Replica (Produkty New Orleans)", _
jrRepTypePartial Set repFull = Nothing
repPartial.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0 ;" & "Data Source= " & repPartialName & ";Mode=Share Exclusive"
If FilterOption = 1 Then
' utwórz filtr oparty na wyrażeniu (expression-based)
repPartial.Filters.Append "Dostawcy", jrFilterTypeTable,
492
Programowanie w Access 20
" NazwaFirmy ='New Orleans Cajun Delights'" Elself FilterOption = 2 Then
' utwórz filtr oparty na relacji (relationship-based) repPartial.Filters.Append "Dostawcy", jrFilterTypeTable,
"NazwaFirmy ='New Orleans Cajun Delights'"
repPartial.Filters.Append "Produkty",
jrFilterTypeRelationship, "DostawcyProdukty"
End If
' wypełnij replikę częściową w oparciu o filtr
repPartial.PopulatePartial repFullName
MsgBox "Utworzono replikę częściową o nazwie " &
repPartialName & vbCr
& " w oparciu o wybrany filtr ." & vbCr
& "Zobacz informacje dotyczące filtra w oknie " &
"Informacje bezpośrednie. " For Each fit In repPartial.Filters
If fIt.FilterType = jrFilterTypeTable Then strFilterType = "Oparty na wyrażeniu"
Else
strFilterType = "Oparty na relacji"
End If
Debug.Print "Nazwa tabeli: " & fIt.TableName & vbCr & vbTab & "Typ filtra: " & strFilterType & vbCr & vbTab & "Kryterium filtrowania: " & fIt.FilterCriteria
Next
Set repPartial = Nothing Exit Sub ObsługaBłędu:
If Err.Number = -2147217897 Then Kill repPartialName
Else
MsgBox Err.Number &
Exit Sub End If Resume End Sub
& Err.Description
Po
wykonaniu powyższej
procedury typ zastosowanego filtra w replice c*J
wej
podany jest w oknie Instrukcje
bezpośrednie: ■
i manipulowanie bazami danych za pomocą ADO
493
N azwa tabeli: MSysCmdbars
Typ filtra: Oparty na wyrażeniu
Kryterium filtrowania: TRUE Nazwa tabeli: MSyslMEXColumns
Typ filtra: Oparty na wyrażeniu
Kryterium filtrowania: TRUE Nazwa tabeli: MSyslMEXSpecs
Typ filtra: Oparty na wyrażeniu
Kryterium filtrowania: TRUE Nazwa tabeli: MSysAccessObjects i Typ filtra: Oparty na wyrażeniu
Kryterium filtrowania: TRUE Nazwa tabeli: Dostawcy
Typ filtra: Oparty na wyrażeniu
Kryterium filtrowania: NazwaFirmy ='New Orleans Cajun Delights'
jzwa tabeli: Produkty
Typ filtra: Oparty na relacji)
Kryterium filtrowania: DostawcyProdukty
! Replikacja obiektów
Przy tworzeniu dodatkowych replik ze wzorca projektowania można zreplikować ■wszystkie obiekty należące do wzorca lub też ustalić, że pewne obiekty lokalne nie i będą replikowane. Zdolność do replikacji danego obiektu ustawia się za pomocą me-I todysetobjectReplicability. Metadata wymaga trzech argumentów: nazwy tabeli i lub kwerendy w postaci ciągu znaków, ciągu znaków o nazwie „Tables" oraz wartości I logicznej True, jeżeli obiekt ma być replikowany, lub False w przeciwnym razie.
Korzystając z interfejsu użytkownika, spróbuj teraz otworzyć plik będący wzor-I cem projektowania i sporządź w nim nową kwerendę o nazwie Test na podstawie I dowolnych tabel.
494
Programowanie w Access 200
Northwind: Wzoivec pro j. i: wm.m
ątórz K Projektu;
)
Zamówienia
kwartalne Źródio
rekordów dla formuł, i ..
^Zamówieniakwartalne
wg produktów (Kwerendakrzyżowa)Źródł..
Z
U
Grupy
Ijjpg Filtr faktur
3£*j;) Klienci i dostawcy wg miast
rjp^-) Klienci wed3ug kraju Kwerenda
EJjfijj) Kwerenda dla formularza Zamówienia
E£§|£) Podsumowania zamówień
E^) Produkty o cenie powyżej przeciętnej
lUFij;) Produkty wg kategorii
ʧjP§> Rozszerzone opisy zamówień
lii!1^) Sprzedaż wg kategorii
liUj) Sprzedaż wg kategorii w 1997 roku
Cp^) Sprzedaż wg lat
[ff^) Sprzedaż wg pracowników i krajów
EpW) Sprzedaż wg produktów w 1997 roku
Filtry rekordów w raporcie F. . (Kwerenda składająca) Zwr ..
Odnośna kwerenda dla form,. Zródłorekordówdlainnych... (Podkwerenda) Zwraca pro'1.. Odnośna kwerenda dla rapt'.. Źródło rekordów dla kilku fo'.. Źródło rekordów dla raportu.. Podsumowania sprzedaży p'.. (Kwerenda parametryczna) .. (Kwerenda parametryczna) .. Źródło rekordów dla kweren..
1997-02-11
15 1997-02-11 15 2002-03-18
18 1997-02-11
15 1997-02-1115
1997-02-H 15 1997-02-11
15 1997-02-11 15 1997-02-U
15 1997-02-U 15 1997-02-U 15 1997-02-U 15 1997-02-U 15 2002-03-30
22 1997-02-U
15 1997-02-U
lSi
i
Zmodyffcpwany j Utworzony Aj
2002-03-19 20:4... 1999-03-23 17:3... 2002-03-18 18:0,.. 1999-05-28 04:4... 1999-05-05 13:3... 1999-03-23 17:3... 1999-03-23 18:1... 1999-04-22 21:2... 1999-04-22 21:2... 1999-05-05 13:5... 1999-05-05 13:3... 1999-03-23 18:1... 1999-05-05 13:5... 2002-03-30 22:4... 1999-05-28 04:4... 1999-05-28 04:4.,,
P o jej utworzeniu kwerenda Test jest lokalna w danej bazie danych. Aby to twierdzić, kliknij prawym klawiszem myszy na nazwę tej kwerendy w oknie bazy nych i wybierz Właściwości z podręcznego menu, Zauważ, że pole wyboru o naa Replikowalny nie jest zaznaczone:
|
|
MM |
|
|
|
Ogólne | g] Test |
|
|
Typ: |
Kwerenda: Kwerenda wybierająca (lokaina) |
|
Opis: |
|
"3 M |
Utworzony: 2002-03-30 22:49:23 Zmodyfikowany: 2002-03-30 22:49:23 Właściciel: Administrator |
\ |
|
Atrybuty: |
V Ukryty f~ Replikowalny |
|
|
OK j Cancel ."- |
|
Jeżeli utworzysz dodatkową replikę lub spróbujesz dokonać synchroniz z istniejącą już repliką, ten nowy obiekt kwerendy nie będzie replikowany. Aby; sić dany obiekt do replikacji, należy ustawić właściwość Replicabie tego obii w oknie Właściwości, lub z kodu procedury VBA przy użyciu metody setobject plicability. Procedura w przykładzie 3.15.D przyjmuje dwa argumenty:
495
i Tworzenie i manipulowanie bazami danych za pomocą ADO
i ścieżkę z nazwą wzorca projektowania oraz nazwę obiektu. Następujące polecenie uruchamia procedurę w przykładzie 3.15.D:
HakeObject_Replicable "C:\Program Files\Microsoft Office\PL\ Office\Samples\Northwind.mdb", "Test"
Po wpisaniu kodu procedury w przykładzie 3.15 należy wpisać powyższą instrukcję (po zmodyfikowaniu ścieżki dostępu do pliku) w okne Instrukcje bezpośrednie, pomijając znak podkreślenia zastosowany w tym przykładzie do przeniesienia długiej instrukcji do następnego wiersza. Jak wiesz, w oknie Instrukcje bezpośrednie taki podział instrukcji jest niedozwolony.
Przykład 3.15.D. Ustawianie zdolności do replikacji danego obiektu
Sub MakeObject_Replicable(repName As String, _
objName As String)
Dim repDesignMaster As New JRO.Replica With repDesignMaster
.ActiveConnection = repName .SetObjectReplicability objName, "Tables", True
End With
Set repDesignMaster = Nothing
MsgBox objName & " można replikować."
End Sub
Obiekty lokalne
Kiedy twoja baza danych zawiera poufne informacje, których nie chcesz udostępnić większości użytkownikom, na pewno będziesz chciał uniemożliwić replikację pewnych obiektów bazy danych (np. tabeli płac), ustawiając zdolność do replikacji danego obiektu na False. Nowo utworzony obiekt we wzorcu projektowania jest obiektem lokalnym (jest to ustawienie wyjściowe). Jeżeli ten obiekt musi być dostępny dla innej repliki, należy ustawić właściwość Replicable tego obiektu na True (zob. poprzednie zagadnienie). Jeżeli chcesz uczynić poprzednio replikowany obiekt lokalnym, dokonaj najpierw synchronizacji, aby nie stracić zmian, które mogły być wprowadzone w tym obiekcie w innej replice. Przy zamianie obiektu replikowanego na obiekt lokalny we wzorcu projektowania w trakcie synchronizacji obiekt ten zostanie usunięty z repliki. Aby zmienić dany obiekt na loklany (i uniemożliwić jego replikację), wpisz kod procedury podanej w przykładzie 3.15.E, następnie zaś wywołaj tę procedurę z okna Instrukcje
4 96
Programowanie w Access 2OC
bez-pośrednie, wpisując wjednym wierszu astępujące^e^^^ ślema, który nie jest dozwolony w tym oknie i odpowiednio dopasuj &ieżkc
MakeObjectLocal_InDesignMaster "C:\Program F±les\Microsoft Office\PL\ Office\Samples\Northwind.mdb", " Klienci i dostawcy wg miast", "Tables"
obiektu, ustawiając właściwość Repiicabie tego obiektu na False przy użyciu metody SetObjectReplicability.
Przykład 3.15.E. Uniemożliwianie replikacji danego obiektu
Sub MakeObjectLocal_InDesignMaster(strBaza As String,
objName
As
String, objType
As
String) l
Dim
repDesignMaster As New JRO.Replica '
With repDesignMaster
.ActiveConnection = strBaza
.SetObjectReplicability objName, objType, False End With
Set repDesignMaster = Nothing
MsgBox "Obiektu o nazwie " & objName & " vi zbiorze " & objType & vbCr & "nie wolno replikować. " & "Obiekt ten jest teraz obiektem lokalnym.", _ vblnformation, "Zadanie wykonano" End Sub
Synchronizacja replik
Synchronizacja umożliwia aktualizację zmian pomiędzy replikami. W trakcie synchronizacji następuje wymiana wszystkich uaktualnionych rekordów oraz obiektów w obu replikach tego samego zestawu. Synchronizacja zapewnia aktualność da-nych.
W JRO rozróżnia się trzy typy synchronizacji:
Tworzenie i manipulowanie bazami danych za pomocą ADO
497
D
wukierunkowa,
import/eksport (jrSyncTypelmpExp)
-
wymiana uaktualnio
nych
rekordów i obiektów jest obustronna. Przebiega ona z repliki
docelowej do
repliki
źródłowej oraz z repliki źródłowej do repliki docelowej.
Import
danych (jrSyncTypelmport) - wymiana uaktualnionych rekordów
oraz
obiektów
następuje tylko z repliki docelowej do repliki źródłowej.
Eksport
danych (jrSyncTypeExport)
-
wymiana uaktualnionych rekordów oraz
obiektów
następuje tylko z repliki źródłowej do repliki docelowej.
Oprócz typu synchronizacji, można również podać jej tryb:
• Bezpośrednia
(Direct)
(jrSyncModeDirect) (ustawienie
domyślne) - obie repliki
muszą
znajdować się na komputerach połączonych bezpośrednio z lokalną
siecią
komputerową
i są dostępne poprzez udostępnione foldery sieciowe.
t Pośrednia (Indirect) (jrSyncModelndirect) - kiedy replika znajduje się na komputerze nie podłączonym do sieci (na przykład na laptopie), zmiany umieszczane są w specjalnym folderze i są automatycznie synchronizowane, gdy użytkownik podłączy się do sieci. Ten proces wymaga instalacji synchronizatorów zarówno w sieci, jak i na rozłączonym z sieci komputerze.
• Pr/ez
Internet (Internet) (jrSyncModelnternet) - używany do
synchronizacji
z
bazą danych podłączoną do serwera internetowego.
Poniższa procedura demonstruje, w jaki sposób używa się synchronizacji dwukierunkowej . Jeżeli chcesz dowiedzieć się o synchronizacji replik przez Internet, musisz zainstalować specjalne narzędzie o nazwie Menedżer replikacji (Replication Manager) i skonfigurować serwer intemetowy w celu udostępnienia replikacji. Informacje dotyczące instalacji i konfiguracji Menedżera replikacji w celu przeprowadzenia synchronizacji za pomocą sieci Internetu są szczegółowo opisane w następującym dokumencie dostępnym w sieci Internetu:
http: //support.microsoft.com/support/Access/Content/repl/replintwp.asp
Aby przeprowadzić synchronizację replik, oba pliki baz danych muszą należeć do tego samego zestawu replik (Replica Set). Każdy zestaw replik posiada własny, unikatowy identyfikator (ID). Aby dwie repliki należały do tego samego zestawu replik, muszą być sporządzone z tego samego wzorca projektowania (Design Master). Nie wystarczy utworzyć repliki z tej samej oryginalnej (nie replikowanej) bazy danych. Jeżeli utworzyłeś dwie repliki, które należą do dwóch różnych zestawów replik i chcesz wprowadzić dane znajdujące się w jednej replice do drugiej, możesz skopiować lub importować dane. Nie możesz użyć replikacji, aby zaktualizować zmiany pomiędzy replikami pochodzącymi z innych zestawów replik.
498
Programowanie w Access |
P rzykład 3.15.F. Synchronizacja replik
Sub Sync_Replicas(strRep As String, strRepI-ica As String,
Optional sncType As SyncTypeEnum, Optional sncMode As SyncModeEnum)
Dim repDesignMaster As New JRO.Replica repDesignMaster.ActiveConnection = strRep
' wymień dane oraz obiekty pomiędzy replikami repDesignMaster.Synchronize strReplica,
sncType, sncMode Set repDesignMaster = Nothing MsgBox strRep & vbCrLf &
"oraz " & vbCrLf & strReplica & vbCrLf & "zostały zsynchronizowane." End Sub
Właściwości repliki
Procedura w przykładzie 3.15.G sprawdza pliki bazy danych Microsoft Acce w określonym folderze i wpisuje właściwości repliki do okna Instrukcje bezpośr nie. Sprawdzane są następujące właściwości repliki:
W łaściwość repliki
Znaczenie
R eplicaType
Określa typ repliki - replika całkowita (j rReplicaTypeFull), replika częściowa (jrReplicaTypePartial), wzorzec projektowania (j rRepTypeDesignMaster), oraz zdolność do replikacji określonej bazy danych (jrRepType-
NotReplicable).
D esignMasterld
Unikatowy identyfikator wzorsa projektowania (Design Master) w zestawie replik.
R etentionPeriod
Liczba dni, przez które dany zestaw replik przechowuje szczegóły i dotyczące usuniętych rekordów, zmiany schematu bazy danych, 1 i inne informacje. Domyślny ckres zachowania danych wynosi 60 dni.
i Tworzenie i manipulowanie bazami danych za pomocą ADO
499
Właściwość repliki |
Znaczenie |
Priority |
Priorytet repliki wpływa na to, w jaki sposób zmiany w rekordach są rozwiązywane podczas konfliktu synchronizacji. |
Visibility |
Widoczność repliki wskazuje, czy można ją zsynchronizować z innymi replikami. |
ReplicalD |
Unikatowy identyfikator dla każdej repliki (z wyjątkiem wzorca projektowania) wchodzącej w skład danego zestawu replik. |
Przykład 3.15.G. Pobieranie właściowści repliki
Sub Get_ReplicaProperties(strPath As String) Dim fso As FileSystemObject Dim mdbFile As File Dim myFolder As Folder Dim typeNum As Integer Dim repNatne As String 'Dim repMaster As New JRO.Replica
Set fso = CreateObject("Scripting.FileSystemObject") Set myFolder = fso.GetFolder(strPath) For Each mdbFile In myFolder.Files
If InStr(mdbFile.Name, ".mdb") Then repName = strPath & mdbFile.Name repMaster.ActiveConnection = Path & repName Select Case repMaster.ReplicaType Case jrRepTypeNotReplicable
Debug.Print repName & " nie jest replikowana." Case jrRepTypeDesignMaster Debug.Print repName &
" jest wzorcem projektowania (Design Master)." Debug.Print "Design Master Id: " & _
repMaster.DesignMasterld Debug.Print "Retention Period: " & _
repMaster.RetentionPeriod
Debug.Print "Priority: " & repMaster.Priority Debug.Print "Visibility: " & repMaster.Visibility Case jrRepTypeFull
Debug.Print repName &
500
Programowanie w Access 20
" jest repliką całkowitą (Full Replica).' Debug.Print "Replica Id: " &
repMaster.Replicald Debug.Print "Retention Period: " & repMaster.RetentionPeriod
Debug.Print "Priority: " & repMaster.Priority Debug.Print "Visibility: " & repMaster.Visibilityj Case jrRepTypePartial
Debug.Print repName &
" jest repliką części.ową (Partial Replica)." Debug.Print "Retention Period: " &
repMaster.RetentionPeriod
Debug.Print "Priority: " & repMaster.Priority Debug.Print "Visibility: " & repMaster .Visibility ■ End Select End If
Next mdbFile MsgBox "Właściwści repliki podane są " &
"w oknie Instrukcje bezpośrednie." End Sub
C:\Program Files\Microsoft Office\PL\Office\Samples\Northwind.mdb jest wzjrcem projektowania (Design
Design Master Id: {E338CF6F-7EE5-4E79-B821-74657D16B3D0}
Retention Period: 60
Priority: 90
Visibility: 1
C:\Program Files\Microsoft Office\PL\Office\Samples\Org_Northwind.mdb nisi jest replikowana.
C:\Program Files\Microsoft Office\PL\Office\Samples\RepLondyn.mdb jest repliką całkowitą (Full Replica).
Replica Id: {5C1DBC1B-1FF4-4E07-AD9D-8DF7B825D56C}
Retention Period: 60
Priority: 81
Visibility: 1
C:\Program Files\Microsoft Office\PL\Office\Samples\Orleans.mdb jest repliką częściową (Partial Replica)
Retention Period: 60
Priority: 81
Visibility: 1
Konflikty synchronizacji replik
W trakcie synchronizacji replik mogą wystąpić błędy. Błąd może być spowodo-j wany modyfikacją tego samego rekordu w dwóch replikach. Gdy Microsoft Jet prj stąpi do synchronizacji dwóch replik, uzyska sprzeczne ze sobą informacje. Możesz! skorzystać z właściwości conf lictTable, aby dowiedzieć się, czy w trakcie syncJ nizacji wystąpiły jakieś konflikty. Właściwość ta zwraca nazwę tabeli konfliktowi
Tworzenie i manipulowanie bazami danych za pomocą ADO
501
(conflict Table), zawierającą rekordy bazy danych, które konfliktowały podczas i synchronizacji. Tabela konfliktów zawiera dwie kolumny. Pierwsza kolumna podaje nazwy tabel, w których wystąpił konflikt, natomiast druga podaje odpowiadające im nazwy tabel konfliktowych. Jeżeli tabela konfliktowa nie istnieje (lub baza danych nie jest replikowana), to właściwość conflictTable zwraca pusty ciąg znaków (""). Jeżeli dowiesz się, że w trakcie synchronizacji wystąpił konflikt, powinieneś napisać swoją własną procedurę VBA, która rozpatrzy ten konflikt w zależności od twoich potrzeb.
Procedura w przykładzie 3.15.H pokazuje, w jaki sposób można się dowiedzieć, czy zaszły błędy podczas synchronizacji replik. Przed uruchomieniem tej procedury należy wykonać następujące czynności:
1. Uruchom
nową
instancję aplikacji Microsoft Access i otwórz wzorzec
projekto
wania
bazy danych Northwind.mdb,
który
utworzyłeś w procedurze VBA
0 nazwie create_DesignMaster w przykładzie 3.15.A.
2. # Wybierz Narzędzia => Replikacja => Utwórz replikę. W polu nazwa pliku
wpisz Replika_Anglia jako nazwę nowej repliki i kliknij OK.
Wybierz
ponownie Narzędzia
=> Replikacja =ś> Utwórz replikę. W
polu nazwa
pliku
wpisz Replika_Francja
jako
nazwę nowej repliki i kliknij OK.
Zamknij wzorzec projektowania Nothwind.mdb.
Otwórz
replikę o nazwie Replika_Anglia.
Otwórz
tabelę Klienci i zmień kod
pocztowy
dla firmy Alfreds
Futterkiste na
12208.
Zamknij
tabelę Klienci oraz
1 replikę bazy danych Replika_Anglia.
Otwórz
teraz replikę o nazwie Replica_France. Otwórz tabelę Klienci i
zmień
kod
pocztowy dla firmy Alfreds
Futterkiste
na 12207.
Zamknij
zarówno tabelę,
jak
i bazę danych.
Otwórz
replikę wzorzec projektowania Northwind.mdb i wybierz Narzędzia
=>
Replikacja
=> Synchronizuj.
Po
pojawieniu się
okna dialogowego Synchronizowanie
bazy danych 'Nor-
thwind'
(zob.
rysunek poniżej) wybierz plik o nazwie Repiika_Angiia.mdb
i
kliknij OK.
502
Programowanie w Access 2Ood
Synchi onizowame bazy danych 'Northwind'
Synchronteuj
f» Bezpośrednio z repliką:
OK
Anuluj
i
FilesWIicrosort 0frice\PLA0rfice\5arriples\Replika Analiz,rndb
Przeglądaj,.
r" Zrób'C:\...\Replika_Anglia.mdb' wzorcem projektowania w tle ze wszystkimi synchronizatorami W tle zsynchronizatorem:
: 1 |
|
|
|
|
|
J |
|
|
|
|
|
|
|
9. Kliknij Tak |
W |
odpowiedzi |
na |
następujący |
komunikat: |
|
(Microsoft Access |
|
|
|
|
|
: |
Ta baza danych musi zostać zamknięta przed synchronizacją.
Czy chcesz, aby Microsoft Access zamknąf bazę danych i dokonał synchronizacji z 'C:\Program FilesJMicrosoft Office\PL\Ofnce\Sarnptes\Replika_Anglia.mdb'?
Tak
1 0. Kliknij OK, aby potwierdzić zakończenie procesu synchronizacji danych:
Microsoft Access
Synchronizacja zakończyła się pomyślnie.
OK
W
e
wzorcu projektowania (Northwind.mdb) wybieiz Narzędzia
=* Replikacja
=>
Synchronizuj.
Po
pojawieniu się
okna dialogowego Synchronizowanie
bazy danych 'Nor
thwind'
(zob.
rysunek poniżej) wybierz plik o nazwie Replica_ Francja.n
i kliknij OK.
Tworzenie i manipulowanie bazami danych za pomocą ADO
503
wnchronizowanie bazy danych "Northwin
? xl
• ■Synchronizuj
(•' Bezpośrednio z repliką:
Files\Mitrosoft Office\PL\Office\SampleslReplika Francia.mdb
f™ Zrób'C:\...\Replika_Francia,mdb' wzorcem projektowania f* W tle ze wszystkimi synchronizatorarni f* W tle z synchronizatorem:
OK
A nuluj Przeglądaj.,,
13. Kliknij Tak w odpowiedzi na następujący komunikat:
Microsoft Access
Ta baza danych musi zostać zamknięta przed synchronizacją.
, Czy chcesz, aby Microsoft Access zamknął bazę danych i dokonał synchronizacji z 'C:\Program Files\Microsoft Office\PL\Office\Samples\Replika_Francja.mdb'?
Tak
Nie
J
1 4, Kliknij Tak w odpowiedzi na następujący komunikat:
2<J
Ten element zestawu replik wchodzi w konflikty z innymi elementami związane z synchronizacją zmian.
Microsoft Access
Czy chcesz teraz rozwiązać te konflikty?
Tak
Nie
15. Kliknij przycisk View w oknie dialogowym Przeglądarka konfliktów (Microsoft Replication Conflict Viewer):
504
Programowanie w Access 2000
# Microsoft R<-|.||.. 111 onilli I V
K2Q Database; Northwind.mdb
Sefect a table, then click View to see its conflicts. Tables in 'Northwind.mdb1 with conflicts:
£ bout Close
16. Okno dialogowe Przeglądarka konfliktów podaje powód konfliktu i pozwą] określić sposób rozwiązania tego konfliktu. W tym przykładzie kliknij Close, ; opuścić to okno dialogowe bez wprowadzania jakichkolwiek zmian.
U waga: Kliknęcie przycisku View w przeglądarce koriflików wyświetla okno wsk żujące na powód konfliktu:
■
'record This retard lost the conflict. Either lesubmit yom . '
updatscr delete ttaconffict record, -j < 5howrffields
o^erwjte wthconfktingdat.
etab of tłiis canflct for later reference Conflict I of 1
| gesolve | Postpone
17. Uruchom procedurę Get_conflictTables w przykładzie 3.15.H, aby uzyskać nazwę tabeli konfliktowej.
Tworzenie i manipulowanie bazami danych za pomocą ADO
505
Przykład 3.15.H. Pobieranie nazwy tabeli konfliktowej
Sub Get_ConflictTables()
Dim repMaster As New JRO.Replica
Dim rst As ADODB.Recordset
Dim strPath As String
strPath = "C:\Program FilesXMicrosoft Office\PL\" _
& "Office\Samples\Northwind.mdb" repMaster.ActiveConnection = strPath Set rst = repMaster.ConflictTables With rst
If .EOF Then
Debug.Print "Nie ma konfliktów." Else
Do Until .EOF
Debug.Print "Tabela: " & rst.Fields(0) & vbCr. _
; "Tabela konfliktów: " & .Fields(1) & vbCrLf .MoveNext Loop .Close End If End With
Set repMaster = Nothing End Sub
[
Procedura w przykładzie 3.15.H podaje w oknie Instrukcje bezpośrednie miejsce, w którym napotkano na konflikt podczas synchronizacji replik, oraz nazwę tabeli konfliktów.
immediate
xj
Tabela: Klienci
Tabela konfliktów: Klienci Conflict
Tabela konfliktów Klienci_conf likt jest tabelą ukrytą. Uwidocznij tę tabelę w oknie bazy danych, wybierając Narzędzia => Opcje => Widok, i klikając na pole wyboru obok nazwy obiekty ukryte. Zamknij okno dialogowe. W oknie bazy danych pojawi się ukryty obiekt Klieci_conf likt:
506
Programowanie w Access 20
' ■in.il.1n- ifi.l
-IdI'x);
2| Otwórz J^ Projektuj JJlNows: X RJ "V i. |
|
|
|
|
|
|
|||
\ Obiekt)' |
Nazwa |
:--f. |
j Zmor iyFS<owany |
j Utworzony |
|
||||
|
Efj UwÓT2 tabelę w widoku projektu |
|
|
|
|
||||
|
ESj Utwórz tabelą za pomocą, kreatora |
|
|
|
|
|
|||
: '■-■ |
[§] Utwórz tabelę, wprowadzając dane |
|
|
|
|
||||
|
Ijl^ Dostawcy |
Nazwy dostawców, adresy, numery t... |
200; -03-30 21: |
... 1997-02-1 |
15:47 |
|
|||
B |
(Bgg Kategorie |
Kategorie produktów oferowanych pr.., |
2001-03-30 21: |
... 1997-02-1 |
15:17 |
|
|||
i "a |
1 W& Klienci |
Nazwy klientów, adresy i numery tele.,. |
2002-03-30 21: |
... 1997-02-1 |
15:47 |
|
|||
%. |
iwj flUB HH |
|
2002-03-31 11: |
... 2002-03-3 |
11;14 |
3 |
|||
|
H© Opisy zamówić |
Cechy produktów, ilości i ceny dla każ... |
2002-03-30 21: |
... 1999-05-2 |
17:39 |
3 |
|||
|
H^) Pracownicy |
Nazwiska pracowników, stanowiska i... |
2002-03-30 21: |
... 1997-02-1 |
15:47 |
|
|||
j Grupy |
{0^0 Produkty |
Nazwy produktów, dostawcy, ceny i... |
2002-03-30 21: |
... 1997-02-1 |
15:47 |
|
|||
|
(H® Spedytorzy |
Nazwy i numery telefonów spedytorów. |
200; -03-30 21: |
.,. 1997-02-1 |
15:47 |
|
|||
|
HS§) Zamówienia |
Na2wa klienta, data zamówienia i kos... |
2002-03-30 21; |
... 1997-02-1 |
15;47 |
|
|||
|
■«i ■ ■ ■ ■ |
|
|
|
|
±1 |
Po otwarciu tabeli konfliktów zobaczymy konfliktujący rekord:
12207
■ Klienci
Conflict:
Tabela (lokalna)
iviiasto [ RegtorTficodPomowy]
ConflictRoWGi
IDklienta I NazwaFirmy | Przedstawiciel StannwiskoPr;|
ALFKI Alfreds Futterkis Maria Anders Przedstawiciel r Obere Str. 57 Berlin
Rekord; H I ■ i | 1 > j M |t«| z 1
ii
A by poznać szczegóły dotyczące korzystania z replikacji danych w aplik Microsoft Access 2000, przeczytaj dokument dotyczący replikacji. Dokument ten (li czący ponad 40 stron) można ściągnąć w Internecie z biblioteki Microsoft Softwai Library (MSL). Poszukaj pliku Replicat.exe w swojej przeglądarce internetowej.
Podsumowanie
Ten rozdział pokazał, w jaki sposób można wykonać mnóstwo operacji zwią nych z bazą danych, wykorzystując obiekty ADO (ActiveX Data Objects). Pracowa z trzema modelami obiektów, które wchodzą w skład biblioteki obiektów ADO. Sąt biblioteka ADODB, biblioteka ADOX oraz biblioteka JRO. Nauczyłeś się programa-J tycznie łączyć ze źródłami danych, tworzyć tabele, pola, indeksy oraz relacje. Na uczyłeś się również wyszukiwać i czytać rekordy, zakładać konta użytkowników grup, przyznawać i odbierać uprawnienia do obiektów bazy danych, jak również! zmieniać hasła. Zapoznałeś się z szeregiem zaawansowanych narzędzi a Microsoft Access 2000 umożliwiających między innymi tworzenie własnego zestaw rekordów i udostępnianie bazy danych użytkownikom w odległych regionach popn technologię replikacji. Rozdział ten dał ci cenny zestaw technik programowania służą cych do wykonywania szeregu zadań. Teraz, gdy potrafisz już używać dwa mo
Tworzenie i manipulowanie bazami danych za pomocą ADO
507
d ostępu do danych, którymi dysponuje aplikacja Microsoft Access 2000 (starsze obiekty Data Acess Objexts (DAO) omówione w rozdziale 2., oraz ActiveX Data Objects (ADO) będące tematem tego rozdziału), będziesz w stanie poradzić sobie z różnymi problemami programowania. Znajomość dwóch sposobów wykonania danej czynności (ADO i DAO) to lepiej niż jeden sposób. Ponieważ metody DAO z upływem czasu staną się przestarzałe, im więcej sporządzisz nowych procedur VBA przy użyciu ADO, tym lepiej. Nie zapomnij jednak o DAO. Przyda się ona przy wykonywaniu tych zadań, z którymi ADO jeszcze sobie dobrze nie radzi, jak również przy analizowaniu starych procedur VBA napisanych w DAO przed ich konwersją.
. -• -
I Rozdział 4
Programowanie przy użyciu języka DDL
W 2. 3. rozdziale tej książki poznałeś dwa modele obiektów (DAO oraz ADO) i miałeś okazję wypróbować różne metody tworzenia i manipulowania bazami danych programatycznie z aplikacji Microsoft Access 2000. W szczególności poznałeś dwie metody tworzenia baz danych, dodawania tabel, indeksów, definiowania relacji między tabelami, zabezpieczania bazy danych za pomocą hasła, defniniowania kont użytkownika oraz kont grup, a także przyznawania praw do obiektów bazy danych. Teraz czas na jeszcze jedną metodę wykonania tych samych czynności bezpośrednio z kodu procedury VBA. Wiele spośród wymienionych powyżej zadań w bazie danych można również wykonać przy użyciu języka definicji danych (DDL - Data Definition Language), który jest komponentem strukturalnego języka zapytań (SQL - Structured Query Language).
Głównym silnikiem bazy danych, na którym opiera się aplikacja Microsoft Access 2000 jest Microsoft Jet 4.0 w skrócie określany terminem Jet Engine, natomiast bieżąca wersja języka SQL znana jest pod" nazwą ANSI SQL-92. SQL jest językiem zapytań, służącym do definiowania i operowania danymi przechowywanymi w systemach relacyjnych baz danych. ANSI jest skrótem od American National Standards Institute (Amerykański Narodowy Instytut Standaryzacji), który przyczynił się do ujednolicenia tego języka. Obecnie w zastosowaniu są dwie podstawowe wersje: SQL 89 i SQL 92. Nazwy tych wersji pochodzą od roku, w którym powstały. Wersja języka SQL będąca w użyciu w aplikacji Microsoft Access 2000 jest specjanym dialektem języka SQL. Silnik bazy danych Microsoft Access (Jet Engine) nie tylko nie wdraża w całości standardu ANSI SQL-92, ale dostarcza dodatkowe rozszerzenia pod nazwą standardu Jet 4.0 ANSI SQL-92, które oferują użytkownikom dostęp do nowych opcji wbudowanych w aplikacji Microsoft Access. Szereg nowych instrukcji SQL, które zostały wprowadzone w Accessie 2000, nie będą działały w poprzednich wersjach tej aplikacji. Nowych instrukcji można tylko używać z rodzimymi bazami danych Microsoft Jet, ADO, oraz dostawcą o nazwie Jet OLE DB.
510
Programowanie w Access 20
W języku SQL można wyodrębnić następujące dwa komponenty powszechnie stosowane z silnikiem bazy danych Microsoft Jet 4.0:
• Język
definicji danych DDL
(Data Definition Language) oferuje
szereg instrukcji
SQL
przeznaczonych
do tworzenia i modyfikacji różnych komponentów bazy
danych,
takich jak tabele, indeksy, relacje, widoki, oraz procedury
przechowy
wane.
Z języka tego korzysta się również przy zarządzaniu
bezpieczeństwem ba
zy
danych. W rozdziale tym nauczysz się używać następujących
instrukcji DDL:
CREATE TABLE, DROP TABLE, ALTER TABLE, CREATE INDEX, DROP INDEX, CHECK CONSTRAINT, CREATE VIEW, DROP VIEW, CREATE PROCEDURE, DROP PROCEDURE, EXECUTE, ADD USER, ALTER DATABASE, ALTER USER, CREATE GROUP, CREATE USER, DROP GROUP, DROP USER, GRANT Oraz REVOKE.
• Język
o manipulacji danych DML (Data
Manipulation Language) oferuje
in
strukcje
SQL
umożliwiające
pobieranie i manipulowanie danymi oraz dokony-i
wanie
transakcji. Do instrukcji tych należą: select,
union, update, delete, in
sert
INTO,
SELECT INTO, TRANSFORM, PARAMETER, BEGIN TRANSACTION, COMMIT.]
oraz rollback.
Rozdział ten prezentuje podstawy korzystania z języka DDL w celu tworzenia] i zmiany struktury bazy danych.
Tworzenie i usuwanie tabel
Korzystając z polecenia create table, można w łatwy sposób utworzyć nov tabelę w bazie danych. Polecenia tego można użyć tylko do tworzenia tabel w ba danych obsługiwanych przez silnik bazy danych Microsoft Jet. Dwa przykłady pr: stawione poniżej prezentują tworzenie i wymazywanie tabeli o nazwie tbiszkoł w otwartej oraz w nowej bazie danych.
1 |
m frmPoznajDDLl: Tworzenie tabel pizy u. |
-Inlxj |
|
||
|
|
|
|
|
|
|
|
[Sporząditabeię^TJblSzkoify"] [(w bieżącej bazie danych)! |
j~" Usuń tabeli |
|
|
|
|
Sporządź tabelę "tbISzkofy" (w nowej bazie danych Szkoty.mdb) |
|
|
|
|
|
|
|
||
Rysunek 4.1. Tworzenie i usuwanie tabel |
|
|
Programowanie przy użyciu języka DDL
511
P rzykład 4.1. Al. Tworzenie tabeli w bieżącej bazie danych
Private Sub cmdTabelal_Click () Dim mojaDB As DAO.Database Dim mojaTabela As String Set mojaDB = CurrentDb
On Error GoTo Obsługa_Błędu mojaTabela = "tblSzkoły"
mojaDB.Execute "CREATE TABLE " & mojaTabela & _ " (IdentSzkoły AUTOINCREMENT(100, 5), NazwaSzkoły Char (25)," & "Miasto Char (25), Rejon Char (35), RokZałożenia Date);" mojaDB.Close
modDDLUtility.EnableChecks (Right(Me.cmdTabelal.Name, 1)) Application.RefreshDatabaseWindow Exit Sub Obsługa_Błędu:
MsgBox Err.Number & ":" & Err.Description Exit Sub End Sub
Powyższa procedura określa wartość początkową (Seed) oraz wielkość przyrostu (Increment) dla pola identyfikacyjnego (AutoNumber). Wykorzystuje do tego następującą składnię:
Nazwa_kolumny AUTOINCREMENT (Seed, Increment)
Zwróć uwagę, że w tabeli tblSzkoły znajduje się pole identyfikacyjne o typie danych Autonumerowanie z wartością początkową 100 oraz przyrostem w wysokości 5. Po uruchomieniu okna bazy danych i otwarciu tej tabeli w trybie Widok arkusza danych wartość w polu Schoolld w pierwszym rekordzie wyniesie 100, wartość tego pola w drugim rekordzie wyniesie 105, w trzecim, 110, itp. Po utworzeniu tabeli tblSzkoły procedura w przykładzie 4.1.A1 przywołuje procedurę o nazwie EnableChecks znajdującą sie w standardowym module opatrzonym nazwą modDDLUtility. Celem tej procedury jest udostępnienie pola wyboru po prawej stronie pierwszego przycisku (zob. rys. 4.1). Pole to umożliwa szybkie usuwanie nowo utworzonej tabeli. Kod procedury EnableChecks pokazany jest poniżej.
Sub EnableChecks(strNum As String) Set frm = Forms!frmPoznajDDLl
512
Programowanie w Access 2000
S elect Case strNum Case "1"
With frm.chkskasujl .Value = False .Enabled = True .SetFocus End With
frm.cmdTabelal.Enabled = False Case "2"
With frm.chkSkasuj2 .Value = False .Enabled = True .SetFocus End With
frm.cmdTabela2.Enabled = False End Select End Sub
Tabela tbiszkoły utworzona przez procedurę w przykładzie 4.1.A1 zawiera pię pól przedstawionych na rysunku poniżej.
B tbISzkoły: Tabela
Nazwa pola
~| IMazwaSzkoły
MteSxtZ....IlZZI!r~
Rejon
RokZałożenia
Typ danych
ńutonumerowanie
Tekst
Tekst
Tekst ■~Z
Data/Godzina
Właściwości pola
-IDI x|
O gólne (odnośnik)
Rozmiar pola Liczba całkowita długa
Nowe wartos'ci Przyrostowy
Format *
Tytuł
Indeksowane Nie
Programowanie przy użyciu języka DDL
513
P o przeanalizowaniu kodu procedury w przykładzie 4.1.A1 i porównaniu otrzymanej w jej wyniku tabeli z rysunkiem powyżej, nie trudno zauważyć, że Access SQL
I stosuje inne typy danych niż te, które są dostępne przy projektowaniu tabel w interfejsie użytkownika. Tabela 4.1 poniżej prezentuje odpowiedniki typów danych
[w SQL.
Tabela 4.1. Typy danych w trybie Projektuj i ich odpowiedniki w Access SQL
r Typy danych w trybie Projektuj tabelę |
Typy danych w Access SQL |
Tekst |
TEXT, ALPHANUMERIC, CHAR, CHARACTER, STRING albo VARCHAR |
Nota |
LONGTEXT, MEMO, LONGCHAR albo note |
Liczba (Rozmiar pola = Bajt) |
BYTE albo INTEGER1 |
Liczba (Rozmiar pola = Liczba całkowita) |
SHALBOT, INTEGER2 albo SMALLINT |
Liczba (Rozmiar pola = Liczba całkowita długa) |
COUNTER, INTEGER, INT albo AUTO INCREMENT |
Liczba (Rozmiar pola ^Pojedyncza precyzja) |
SINGLE, FL0AT4 albo REAL |
Number (Rozmiar pola = Podwójna precyzja) |
DOUBLE, FLOAT albo NUMBER |
Data/Godzina |
DATETIME, DATE, TIME albo TIMESTAMP |
Walutowy |
CURRENCY albo MONEY |
Autonumerowanie (Rozmiar pola = Liczba całkowita długa) |
AUTOINCREMENT albo COUNTER \ |
Autonumerowanie (Rozmiar pola = ID replikacji) |
GUID |
Tak/Nie |
BOOLEAN, BIT, LOGICAL, LOGICAL1 albo yesno |
514
Programowanie w Access J
T ypy danych w trybie Projektuj tabele Obiekt OLE
Typy danych w Access SQL
LONGBxNARY, OLEOBJECT albo GENERAL
A by usunąć istniejącą tabelę z bazy danych, skorzystaj z języka DDL i jego poi cenią drop table. Tabela musi być zamknięta przed przystąpieniem do jej usuwani Procedura w przykładzie 4.1.A2 demonstruje, w jaki sposób należy zastosować pd cenie drop table wewnątrz procedury VBA. Możesz również zastosować to polec nie bezpośrednio w oknie kwerendy definiującej dane. Aby to uczynić, utwórz nov kwerendę. Kliknij przycisk Zamknij w oknie cialogowym Pokazywanie tabe Z menu Kwerenda wybierz polecenie Wyłącznie SQL => Definiująca dane. Wpl następujące polecenie w oknie kwerendy definiującej dane:
Drop Table tblSzkoły;
Uruchom przygotowaną kwerendę, wybierając Uruchom z menu Kwerenda! Operacja usuwania tabeli z kodu procedury V8A przedstawiona jest również] w przykładzie 4.1 .A2 poniżej.
Przykład 4.1.A2. Usuwanie tabeli
Private Sub chkSkasujl_Click() Dim mojaDB As DAO.Database
Set mojaDB = CurrentDb On Error GoTo ErrorHandler mojaDB.Execute "DROP TABLE tblSzkoły;" mojaDB.Close
modDDLUtility.EnableButtons (Right(chkSkasujl.Name, Application.RefreshDatabaseWindow Exit Sub ErrorHandler:
If Err.Number = 3211 Then
DoCmd.Close acTable, "tblSzkoły", acSavePrompt
Resume 0 Else
MsgBox Err.Number & ":" & Err.Description Exit Sub
Programowanie przy użyciu języka DDL
515
E nd If [End Sub
Dwie procedury pokazane poniżej (przykład 4.1.B1 oraz 4.1.B2) demonstrują, w jaki sposób można utworzyć tabelę w nowej bazie danych i w jaki sposób usuwa się plik bazy danych przy użyciu polecenia Kin udostępnionego przez bibliotekę obiektów VBA.
Przykład 4.1.Bl. Tworzenie tabeli w nowej bazie danych
Private Sub cmdTabela2_Click() I Dim mojaDB As DAO.Database | Dim mojaTabela As String I Dim wksDefault As DAO.Workspace
Set wksDefault = DBEngine.Workspaces(0) i Set mojaDB = wksDefault.CreateDatabase("Szkoły.mdb", dbLangPolish)
I On Error GoTo Obsługa_Błędu mojaTabela = "tblSzkoły"
" mojaDB.Execute "CREATE TABLE " & mojaTabela & _
"(IDSzkoły AUTOINCREMENT, NazwaSzkoły Char (25)," & "Miasto Char (25), Rejon Char (35), RokZałożenia Date);"
mojaDB.Close
modDDLUtility.EnableChecks (Right(cmdTabela2.Name, D)
Exit Sub Obsługa_Błędu:
MsgBox Err.Number & ":" & Err.Description
Exit Sub Sub
vklad 4.1.B2. Usuwanie pliku bazy danych
I
Private
Sub chkSkasuj2_Click ()
Dim ścieżka
As String ścieżka
= CurDir
If Dir(CurDir & "\Szkoiy.mdb") <> "" Then Kill CurDir & "\Szkoly.mdb"
MsgBox "Wymazano plik bazy danych 'Szkoły.mdb1." modDDLUtility.EnableButtons (Right(chkskasuj2.Name, 1))
516
End If End Sub
Programowanie w Access 7
Zapewnianie integralności danych
Podczas tworzenia tabel w bazie danych często trzeba zdefiniować odpowiedn reguły poprawności dotyczące wartości, które są dozwolone w kolumnach (polaq projektowanej tabeli. Ograniczenia (Constraints) stanowią zbiór reguł, jakie muą spełniać dane wprowadzane do tabeli. Za pomocą ograniczeń możesz podać warunl jaki muszą spełniać dane wprowadzane do pola lub wszystkie dane w rekordzie ora określić, czy pole może zawierać wartość Null. Ograniczenia pozwalają również a zdefiniowanie wartości domyślnej w polu, relacji między tabelami oraz kluczy pod stawowych. Istnieje pięć typów ograniczeń (zob. wykaz poniżej).
Nazwa Ograniczenia
PRIMARY KEY
(Klucz podstawowy)
FOREIGN KEY
(Klucz obcy)
Zastosowanie
Identyfikuje jedną lub więcej kolun których wartości jednoznacznie identyfikują dany rząd w tabeli.
Definiuje relacje pomiędzy tabelami, umożliwiając integralność danych przy dodawaniu, modyfikacji oraz usuwaniu rekordów tabeli.
UNIQUE
(Ograniczenie unikatowe)
Skorzystaj z tego ograniczenia, aby uniemożliwić wpisywanie powtarzają-cych się wartości (duplikatów) w kolumnach, które nie wchodzą w skład klucza podstawowego.
Wskazuje, że dana kolumna nie może być pozostawiona pusta. Kolumny wchodzące w skład klucza podstawowego są automatycznie definiowane z ograniczeniem not null.
Określa wartości, które są dozwolone w jednej lub więcej kolumnach tabeli,
Programowanie przy użyciu języka DDL
517
Przy dodawaniu ograniczeń do danej tabeli wszystkie znajdujące się w tej tabeli ■dane są poddane weryfikacji. Tabele oraz kolumny mogą zawierać szereg ograniczeń I typu check. Ograniczenie check może porównać wartość w danej kolumnie I z określoną wartością logiczną lub z inną kolumną w tej samej lub innej tabeli. Ogra-I niczenie check nie pozwala jednak na sprecyzowanie własnego komunikatu o błędzie, I co jest możliwe w interfejsie użytkownika Microsoft Access 2000. Procedura I w przykładzie 4.2.A korzysta z ograniczenia primary key, aby zidentyfikować ko-I luranę ID jako klucz podstawowy o nazwie PrimaryKey. Ograniczenie check zasto-I sowane w tej procedurze powoduje, że w kolumnie LataPracy można wpisać tylko I liczby w podanym zakresie. Ograniczenie check można zastosować w odniesieniu do I jednej lub wielu kolumn. W trakcie usuwania tabeli usuwane są również ograniczenia
CHECK.
1 frmPazna JDDL2: T worz
. ;;,.. ...;
I Sporządź tabelą 'tbIŃagrody' zr eg!i§.gop.rd.wności j
S porządź tabelą 'tblZarnówienia'
z regułą poprawności odnoszącą się do pola
w tabeli 'tblZapasy'
Rysunek 4.2. Tworzenie tabel z indeksami i regułami poprawności
Przykład 4.2.A. Użycie ograniczenia CHECK w celu ograniczenia wartości, które można wpisać w danej kolumnie
private Sub cmdTabela4_Click()
Dim con As ADODB.Connection
Set con = CurrentProject.Connection
Dim mojaTabela As String
On Error GoTo Obsługa_Błędu mojaTabela = "tblNagrody" con.Execute "CREATE TABLE " & mojaTabela & _
"(ID AUTOINCREMENT CONSTRAINT PrimaryKey PRIMARY KEY," & "LataPracy INT, CONSTRAINT OdDo " & _ "CHECK (LataPracy BETWEEN 1 AND 50));"
518
Programowanie w Access I
c on.Close
Set con = Nothing
Application.RefreshDatabaseWindow
Exit Sub Obsługa_Błędu:
MsgBox Err.Number & ":" & Err.Description Exit Sub End Sub
Jeżeli spróbujesz wpisać wartość w kolumnie LataPracy, która nie znajduje si w zakresie wartości określonych przez ograniczenie OdDo, Microsoft Access wy-świeli następujący komunikat:
Microsoft Access
Ś
One or more values are prohibited by the validation rule 'NaSkConsti aint' set for 'tblZamówienia'. Enter a value that the expression for this field can accept.
OK
Pomoc
P owyższy komunikat informuje użytkownika, że wpisanie jednej lub więcej] wartości jest zabronione przez regułę poprawności o nazwie 'Naskconstrainf utwol rzonąw tabeli tbizamówienia. Należy wpisać wartość, którą wyrażenie określone dla danego pola może przyjąć.
Procedura w przykładzie 4.2.B demonstruje, w jaki sposób tworzy się ograniczę nie check w celu zagwarantowania, że wartości wpisane w kolumnie sztuki wtabe tbizamówienia są mniejsze niż wartość podana w kolumnie Maxsztuki w tabeli tbl zapasy dla określonego kodu ISBN.
Przykład 4.2.B. Tworzenie tabeli z regułą poprawności odnoszącą się do kolumny w innej tabeli
Private Sub cmdTabela5_Click()
Dim con As ADODB.Connection
Set con = CurrentProject.Connection
Dim mojaTabela As String
On Error GoTo Obsługa_Błędu
mojaTabela = "tbizamówienia"
con.Execute "CREATE TABLE " & mojaTabeLa & _
"(NrZam AUTOINCREMENT CONSTRAINT PrimaryKey PRIMARY KEY, " I "ISBN CHAR, Sztuki LONG, " & _
Programowanie przy użyciu języka DDL
519
" CONSTRAINT NaSkConstraint CHECK " & _
"(Sztuki <(Select MaxSztuki from tblZapasy" & _
" WHERE ISBN = tblZamówienia.ISBN)));" con.Close Set eon = Nothing
Application.RefreshDatabaseWindow Exit Sub Obsługa_Błędu:
MsgBox Err.Number & ":" & Err.Description Exit Sub End Sub
Uruchom powyższą procedurę, aby utworzyć tabelę tbizamówienia. Następnie otwórz sporządzoną tabelę i wpisz kody ISBN, tak jak je przedstawia tabela tblzapa-sy (zob. poniżej):
ISBN |
MaxSztuki |
1587660909 |
5 |
1672345569 |
7 |
W polu items w tabeli tbizamówienia wpisz liczbę równą lub większą od liczby w kolumnie MaxSztuki dla odpowiedniego kodu ISBN. Rezultat tej czynności przedstawiony j est poniżej:
One or more values are prohibited by the validation rule 'NaSkConstraint' set for 'tbizamówienia', Enter a value that the expression for this field can accept.
J eżeli spróbujesz manualnie usunąć tabele utworzone przez procedury w przykładach 4.2.A oraz 4.2.B, Microsoft Access wyświetli następujący komunikat:
520
Programowanie w Access 2|
traint
on table
/f
\ '""^cannc*
'3e
completed
on this table because it is referenced by constraint NaSkConsti /
. \
Na5ktonstraint.
OK
Pomoc
J
Powyższy komunikat informuje użytkownika, że polecenie języka DDL nie mJ być wykonane w odniesieniu do wybranej tabeli, ponieważ istnieje ograniczeni O nazwie NaSkConstraint.
Aby usunąć tabelę tbiNagrody, wpisz następujące polecenie SQL w oknie rendy definiującej dane:
'DROP TABLE tbiNagrody;
D la przypomnienia, tabela musi być zamknięta przed przystąpieniem do jej i nięcia. Jeżeli nie chcesz usunąć tabeli, a zamierzasz usunąć z niej ograniczenie, zasft suj następującą składnię:
ALTER TABLE nazwa_tabeli DROP CONSTRAINT nazwa_ograniczenia
Aby usunąć ograniczenie, trzeba znać jego nazwę. Stąd, aby usunąć ograniczenie z tabeli tbiNagrody, otwórz okno kwerendy definiującej dane, wpisz instrukcje noria. ną poniżej i wybierz Kwerenda => Uruchom:
Programowanie przy użyciu języka DDL
521
SKwecendal :Kwei» i " u-
ALTER TABLE tblNagrody DROP CONSTRAINT OdDo;
ń
Przed użyciem polecenia alter table warto jest sporządzić kopię zapasową ta-
beli.
Definiowanie relacji między tabelami
Aby powiązać ze sobą dane znajdujące się w dwóch tabelach, dodaj do drugiej tabeli jedną lub więcej kolumn, które przechowują wartości klucza podstawowego pierwszej tabeli. Kolumny te staną się tak zwanym kluczem obcym w drugiej tabeli. Aby odwołać się do innej tabeli, możesz skorzystać z ograniczenia foreign key. Klucze obce mogą być złożone z jednego lub więcej pól. Ograniczenie foreign key wymusza więzy integralności (Enforces Referential Integrity), nie pozwalając na to, by zmiany wprowadzone w tabeli zawierającej klucz podstawowy naruszyły wjakikolwiek sposób istniejące powiązanie zdanymi znajdującymi się w tabeli zawierającej klucz obcy. Dla przykładu, nie można usunąć rekordu w tabeli zawierającej klucz podstawowy, jeżeli wartość tego klucza odpowiada wartości klucza obcego (fo-^reign key) w innej tabeli. Główną tabelę w relacji identifikuje się za pomocą klauzuli
EFERENCES.
Aby utworzyć zupełnie nową tabelę i powiązać ją z istniejącą już w bazie danych elą, wykonaj następujące czynności:
Użyj polecenie create table z nazwą tabeli.
Przykład: CREATE TABLE tblSzczegóły_Zamówienia
Po nazwie tabeli zdefiniuj kolumny (pola) tej tabeli. Definicja kolumny składa się z nazwy kolumny, typu przechowywanych w niej danych oraz rozmiaru kolumny (jeżeli jest on wymagany w odniesieniu do wybranego typu danych).
522
Programowanie w Access 2000
P rzykład: NrZam CHAR, IdProduktu CHAR, Sztuki LONG, Cena MONEY
• Użyj klauzuli constraint z nazwą ograniczenia, aby określić klucz podstawowy. Następnie użyj klauzuli primary key z nazwą kolumny lub kolumn, z których będzie się składał klucz podstawowy.
Przykład: CONSTRAINT PrimaryKey PRIMARY KEY(NrZam, IdProduktu)
• Użyj
klauzuli constraint
z
nazwą
ograniczenia, aby określić klucz obcy. Na
stępnie
użyj klauzuli foreign
key z
nazwą
kolumny, na której ma być oparty
klucz
obcy.
Przykład: CONSTRAINT fkNrZam FOREIGN KEY (NrZam)
• Użyj klauzuli references, aby określić główną tabelę w relacji.
Przykład: REFERENCES tblProdukty_Zamówienia
• Możesz
również skorzystać z klauzuli on
update cascade oraz
on
delete ca
cade,
aby
wymusić więzy integralności z operacjami kaskadowej aktualiz
i usuwania kaskadowego powiązanych rekordów.
Przykład: ON UPDATE CASDADE ON DELETE CASCADE
U waga: Aby nie wymuszać więzów integralności referencyjnej, możesz skorzysi z instrukcji on update no action lub on delete mo action albo też calkowk pominąć słowa kluczowe on update lub on delete. Pamiętaj jednak, że, wybie tę drogę postępowania, nie będziesz w stanie zmienić wartości klucza podstawowe] jeżeli w tabeli obcej istnieją powiązane rekordy.
Z obacz procedurę w przykładzie 4.3.A, aby dowiedzieć się, w jaki sposób na prawidłowo połączyć powyższe przykłady w jedno polecenie SQL. Proce w przykładzie 4.3 tworzy tabelę o nazwie tbiszczegóły_zamówienia z czterema] lami i definiuje wielopolowy klucz podstawowy oparty na dwóch polach: idProduki oraz NrZam. Ograniczenie foreign key oparte na jednym polu tabeli tbiszczegl
ły Zamówienia odwołuje się do tabeli tblProdukty_Zamówienia.
P rogramowanie przy użyciu języka DDL
523
.! frmPoznajDDL3: Tworzenie r
-In! xj
Spot żądz tabelę 'tblśzczegołyjiamówienia' i powiąż ją z tabelą 'tblProdukty_Zamówienia'
R ysunek 4.3. Definiowanie relacji między tabelami z uwzględnieniem kaskadowej integralności danych
Przykład 4.3.A. Tworzenie relacji między dwoma tabelami z ustawianiem reguł aktualizacji kaskadowej oraz usuwania kaskadowego
Private Sub cmdTabela7_Click() Dim con As ADODB.Connection Set con = CurrentProject.Connection Dim mojaTabela As String
On Error GoTo Obsługa_Błędu
mojaTabela = "tblSzczegóły_Zamówienia"
con.Execute "CREATE TABLE " & mojaTabela & _
"(NrZam CHAR, IdProduktu CHAR, Sztuki LONG, Cena MONEY, "CONSTRAINT PrimaryKey PRIMARY KEY (NrZam, IdProduktu), "CONSTRAINT fklnvoiceld FOREIGN KEY (NrZam) " & _ "REFERENCES tblProdukty_Zamówienia " & _ "ON UPDATE CASCADE ON DELETE CASCADE);"
con.Close
Set con = Nothing
Application.RefreshDatabaseWindow
Exit Sub Obsługa_Błędu:
MsgBox Err.Number & ":" & Err.Description
Exit Sub End Sub
524
Programowanie w Access 20C
W ynik procedury w przykładzie 4.3.A ilustrują dwa zrzuty ekranu przedstawione poniżej. Pierwszy z nich przedstawia relację jeden-do-wiele pomiędzy tabelami tblSzczegóły_Zamówienia oraz tblProdukty_Zamówienia. Na drugim rysunku i
znajduje się okno dialogowego Edytowanie relacji, na którym zaznaczone są pola wyboru kaskadowego aktualizowania i usuwania pól oraz rekordów pokrewnych.
■ : Relacje
M-Zan
RodzajPłatności
WarunkiPłatności
Rabat
M-Zam ItfrodiłŁu
Sztuki Cena
Eelytowłłnie relacji
JI2L
Tabela/Kwerenda:
Pokrewna tabela/kwerenda:
| tblProdukty_Zamówien jj tbl5zczegóły_Zamówienia J^
OK
A nuluj
- y Wymuszaj więzy integralności
P" Kaskadowo aktualizuj pola pokrewne J? Kaskadowo usuń rekordy pokrewne
Utwór2nowe..
Typ relacji:
Jeden-do-wielu
Aby lepiej zapoznać się z tworzeniem tabel oraz relacji za pomocą języka DDL, wykonaj następujące ćwiczenie (korzystając z okna kwerendy definiującej dane). Aby uruchomić to okno, przejdź do okna bazy danych i wybierz Utwórz kwerendę i w widoku projektu. W oknie dialogowym Pokazywanie tabeli kliknij Zamknij. Z menu Kwerenda, wybierz Wyłącznie SQL oraz Definiująca dane. Każde z podanych poniżej poleceń można uruchomić poprzez wybranie opcji Uruchom z menu Kwerenda.
Programowanie przy użyciu języka DDL
525
1, Aby utworzyć główną tabelę w relacji, wpisz następujące polecenie i uruchom kwerendę:
I Kwerenda 1 : Kwerenda definiująca darte
ĆREATETABLE gfównaTabela (Id COUNTER'Constrainf PrimaryKeyPRIMARY KEY,"K7aj*TST (15))|
2. Aby utworzyć tabelę powiązaną, wpisz następujące polecenie i uruchom kwerendę:
j3 Kwerenda 1: Kwerenda def
-In
CREATE TABLE obcaTabela (Id LONG, Rejon TEXT
3. Aby utworzyć relację jeden-do-wiele pomiędzy tabelami głównaTabeia oraz caTabela, wpisz następujące polecenie i uruchom kwerendę:
i-flS Kwerendal: Kwerenda definiująca d.inc
;■.:;::■■■ . . " ... '. '-. - ^ V
IalteRTABLE obcaTabela ADD CONSTRAINT Relacja FOREIGN KEY(Id) REFERENCES głównaTabeia
4. Dodaj obie tabele (głównaTabeia oraz obcaTabela) do okna Relacje:
y.*j
• ; Relacje
f!
Id
Kraj
i\.
( Rejon
5. Kliknij dwukrotnie myszą na linię łączącą obie tabele, aby wyświetlić okno Edy-towanie relacji:
526
Programowanie w Access 20(X
Edytowanie relacji
Ił*}
Tabela/Kwerenda: |
Pokrewna tabela/kwerenda: |
głównaTabela |
y i obcaTabeia ^J |
Id |
^ \ Id |jlj
I |
p-M Wymuszaj więzy integralności ——-P Kaskadowo aktualizuj pola pokrewne IT™ Kaskadowo usuń rekordy pokrewne
OK
A nuluj
Typ sprzężenie...
Utwórz nowe,.
Typ relacji:
Jeden-do-wlelu
6. Aby usunąć relację między tabelami, wpisz następujące polecenie i urucho kwerendę:
aH" Kwerendal: Kwerenda definiują! <i ci.uif
ALTER TABLE obcaTabeia'DROP CONSTRAINT'Relacjal
-MM
7 . Aby usunąć tabelę głównaTabeia znajdującą się w relacji po stronie „jeden" wpisz następujące polecenie i uruchom kwerendę:
ii" Kwerendal: Kwerenda defin me
f
iROP
TABLE
głównaTabeia
A by usunąć tabelę obcaTabeia znajdującą się w relacji po stronie „wiele1! wpisz następujące polecenie i uruchom kwerendę:
is5 Kwerendal: Kwerenda definiująca dane
-jnlxii
D ROP TABLE obcaTabeia
zJ
Modyfikowanie tabel przy użyciu DDL
Definicję tabeli można zmodyfikować poprzez aktualizację, dodanie nowych lu usunięcie istniejących kolumn oraz ograniczeń. Procedury w tym zagadnieniu ilustrują sposób, w jaki używa się poleceń języka definicji danych, aby:
I Programowanie przy użyciu języka DDL
527
i dodać nowe kolumny (pola) do tabeli,
i zmienić typ danych kolumny (pola),
zmienić rozmiar pola tekstowego,
usunąć kolumnę (pole) z tabeli,
i dodać klucz podstawowy do istniejącej tabeli,
• dodać
do istniejącej tabeli unikatowy indeks złożony z kilku pól,
I
• usunąć
indeks,
usunąć kolumnę, która wchodzi w skład indeksu,
określić wartość początkową dla kolumny (pola) w tabeli,
• zmienić
wartość początkową (Seed)
oraz
wielkość przyrostu (Increment)
dla
pola
identyfikacyjnego
(Autonumerowanie).
Dodawanie nowych pól do tabeli
Użyj polecenia alter table z nazwą tabeli, aby zmodyfikować strukturę tabeli po jej utworzeniu za pomocą polecenia create table. Przed przystąpienieniem do modyfikacji struktury tabeli warto jest sporządzić na wszelki wypadek kopię zapasową tabeli. Polecenie alter table można użyć z klauzulą add column, aby dodać nowe pole do tabeli. Na przykład procedura w przykładzie 4.4.A dodaje do tabeli tbisz-koly pole o nazwie Budżet2002 z typem danych money, korzystając z następującej instrukcji:
ALTER TABLE tblSzkoły ADD COLUMN BudŻet2002 MONEY
Podczas dodawania nowego pola do tabeli należy określić nazwę tego pola, typ danych, które pole ma przechowywać, a dla pól tekstowych oraz Binary - rozmiar
pola.
0M
528
Programowanie w Access 2i
m frmPoznajDDL4: Modyfikowanie tabel
j Dodaj nowe pole i
Dodaj klucz podstawowy.
Wpisz' Lublin' w charakterze
wartości domyślnej w polu
Miasto.
Z mień typ pola.
Dodaj unikatowy indeks oparty na dwóch polach.
Zmień autonumerację zaczynając od 1000.
Z mień rozmiar pola.
Wymaż pole wchodzące w skted indeksu.
U suń pole z tabeli.
Wymaż indeks.
R ysunek 4.4. Modyfikowanie tabel
Przykład 4.4.A. Dodawanie nowego pola (kolumny) do istniejącej tabeli
Private Sub cmdDodajNowePole_Click() Dim mojaDB As Database Set mojaDB = CurrentDb
mojaDB.Execute "ALTER TABLE tblSzkoły ADD COLUMN Budżet2002 MONEY; mojaDB.Close End Sub
Zmiana typu danych kolumny (pola) tabeli
Aby zmienić typ danych określonej kolumny (pola) tabeli, można skór: z klauzuli alter column w poleceniu alter table. Należy określić przy tym na pola, pożądany typ danych oraz, jeżeli masz do czynienia z polem tekstowym 1 lem typu Binary - rozmiar pola. Procedura w przykładzie 4.4.B zmienia typ pola identszkoły w tabeli tbiszkoły z Autonu merowanie na pole teksti o rozmiarze 15 znaków.
Programowanie przy użyciu języka DDL
529
Przykład 4.4.B. Modyfikowanie typu danych
Private Sub cmdZmianaTypuPola_Click() Dim mojaDB As DAO.Database Set mojaDB = CurrentDb
mojaDB.Execute "ALTER TABLE tblSzkoły "
& "ALTER COLUMN IdentSzkoły CHAR(15);" mojaDB.Close I End Sub
Modyfikacja rozmiaru pola tekstowego
Rozmiar pola tekstowego można łatwo zwiększyć lub zmniejszyć. W tym celu skorzystaj z polecenia alter table z nazwą tabeli oraz zastosuj klauzulę alter column z nazwą kolumny (pola), której rozmiar chcesz zmienić. Następnie określ typ danych dla tego pola i jego rozmiar (zob. przykład 4.4.C, który zmniejsza rozmiar pola NazwaSzkoły z 255 na 40 znaków.
Przykład 4.4.C. Zmiana rozmiaru pola
Private Sub cmdZmianaRozmiaruPola_Click() Dim mojaDB As DAO.Database Set mojaDB = CurrentDb
mojaDB.Execute "ALTER TABLE tblSzkoły " _
& "ALTER COLUMN NazwaSzkoły CHAR(40);" mojaDB.Close End Sub
Usuwanie kolumny (pola) z tabeli
Aby usunąć kolumnę (pole) z tabeli, użyj klauzuli drop column w poleceniu al-!ter table. Wystarczy podać nazwę pola. Procedura poniżej usuwa pole Budżet2002 ztabeli tblSzkoły.
530
Programowanie w Access 2000
P rzykład 4.4.D. Usuwanie pola z tabeli
Private Sub cmdUsuwaniePola_Click() Dim mojaDB As DAO.Database Set mojaDB = CurrentDb
mojaDB.Execute "ALTER TABLE tblSzkoły "
& "DROP COLUMN Budżet2002;" mojaDB.Close End Sub
Dodawanie klucza podstawowego do tabeli
Możesz użyć klauzuli add constraint w poleceniu alter table, aby zdefiniować jedną lub więcej kolumn jako klucz podstawowy w tabeli (zob. procedurę w przykładzie 4.4.E).
Przykład 4.4.E. Dodawanie klucza podstawowego do tabeli
Private Sub cmdDodajKluczPodstawowy_Click() Dim mojaDB As DAO.Database Set mojaDB = CurrentDb
mojaDB.Execute "ALTER TABLE tblSzkoły "
& "ADD CONSTRAINT primKlucz PRIMARY KEY(IdentSzkoły) ;" mojaDB.Close End Sub
Dodawanie indeksu złożonego do tabeli
Zastosuj klauzulę add constraint oraz słowo kluczowe unique w poleceniu j alter table, aby zdefiniować w tabeli indeks złożony z dwóch lub więcej pól. Stówo j kluczowe unique zapobiega wprowadzaniu duplikatów w indeksowanym polu.
Programowanie przy użyciu języka DDL
531
P rzykład 4.4.F. Dodawanie do tabeli unikatowego indeksu opartego na dwóch polach
Private Sub cmdDodajUnikatowyIndeks_Click() Dim mojaDB As DAO.Database Set mojaDB = CurrentDb
mojaDB.Execute "ALTER TABLE tblSzkoły "
& "ADD CONSTRAINT indeks UNIQUE(IdentSzkoły, Rejon);" mojaDB.Close End Sub
Po uruchomieniu procedury w przykładach 4.4.E oraz 4.4.F tabela tbiszkoły zawiera dwa indeksy przedstawione poniżej:
1 f Indeksy: tblSzkoły |
|
|
|
|
Nazwa indeksu |
| Nazwa pola Porządek sortowania -*.] |
|
|
jffHB |
: IdentSzkoły |
Rosnąco """"! |
|
|
: Rejon |
Rosnąco |
|
primKlucz |
IdentSzkoły |
Rosnąco |
— |
|
Właściwości indeksu |
|
Podstawowy Nie Unikatowy Tak Ignoruj zerowe Nie |
|
|
|
Nazwa tego indeksu, Każdy indeks może użyć maksymalnie 10 pól, |
Usuwanie kolumny wchodzącej w skład indeksu
Aby usunąć kolumnę, która wchodzi w skład indeksu, wykonaj następujące czynności:
Zastosuj
klauzulę
drop
constraint, aby
usunąć indeks. Pamiętaj, żeby podać
nazwę
indeksu, który chcesz usunąć.
Zastosuj
klauzulę
drop
column, aby
usunąć określoną kolumnę tabeli. Musisz
przy
tym podać nazwę kolumny (pola), które chcesz usunąć z tabeli.
Obie klauzule należy zastosować w poleceniu alter table. Następująca procedura usuwa kolumnę o nazwie Rejon z tabeli tblSzkoły. Dla przypomnienia, proce-
532
Programowanie w Access 2(
d ura w przykładzie 4.4.F wcześniej w tym rozdziale dodała indeks złożony oparty
dwóch polach: IdentSzkoły oraz Rejon.
Przykład 4.4.G. Usuwanie pola będącego częścią indeksu
Private Sub cmdUsuwaniePolaZIndeksu_Click() Dim mojaDB As DAO.Database Set mojaDB = CurrentDb
With mojaDB
.Execute "ALTER TABLE tblSzkoły DROP CONSTRAINT indeks; .Execute "ALTER TABLE tblSzkoły DROP COLUMN Rejon;" .Close End With End Sub
Usuwanie indeksu
Zastosuj klauzulę drop constraint, aby usunąć indeks. Należy przy tym podać nazwę indeksu. Następująca procedura usuwa klucz podstawowy z tabeli tblSzkoły
Przykład 4.4.H. Usuwanie indeksu
Private Sub cmdUsuwanieKlucza_Click() Dim mojaDB As DAO.Database Set mojaDB = CurrentDb
mojaDB.Execute "ALTER TABLE tblSzkoły DROP CONSTRAINT primKlucz; mojaDB.Close End Sub
Po uruchomieniu procedur w przykładach 4.4.G oraz 4.4.H okno Indeksy uruchomione z tabeli tblSzkoły powinno być puste.
Ustawianie wartości wyjściowej dla określonego pola w tabeli
Jeżeli podasz wartość wyjściową dla danego pola tabeli, to za każdym razeą gdy nowy rekord jest dodany do tabeli, wartość wyjściowa pojawi się w tym polu, poi
Programowanie przy użyciu języka DDL
533
w arunkiem że użytkownik nie wpisał innej wartości. Korzystając z języka DDL, możesz ustalić wartość początkową dla danego (istniejącego już) pola tabeli przy użyciu klauzuli set default. Składnia wygląda następująco:
ALTER TABLE nazwaTabeli ALTER [COLUMN] nazwaPola SET DEFAULT war-tośćPoczątkowa;
Zwróć uwagę, że w powyższym zapisie część polecenia obięta nawiasem kwadratowym [COLUMN] jest opcjonalna.
Przykład 4.4.1. Ustawianie wartości początkowej dla pola tabeli
Private Sub cmdUstawDefault_Click() Dim con As ADODB.Connection Dim sql As String
Set con = CurrentProject.Connection
sql = "ALTER TABLE tblSzkoly ALTER Miasto SET DEFAULT Lublin" With con
.Execute sql .Close End With
Set con = Nothing End Sub
Po uruchomieniu procedury w przykładzie 4.4.1 wyjściową wartością w polu
Miasto jest Lublin:
534
Programowanie w Access |
tblSzkoly; Tabela
Nazwa pola
Ident5zkoły NazwaSzkoły Miasto „ RokZałożenia
Typ danych
Tekst
I Tekst Tekst' Data/Godzina
Opis
W łaściwości pola
25
Ogólne Odnośnik Rozmiar pola Format
Lublinl
Maska wprowadzania Tytuł
Nie
Wartość
domyślna
Reguła
poprawności
Komunikat
o błędzie
Wymagane
Zerowa
długość dozwolon. Nie
Indeksowane Nie
Kompresja Unicode Nie
M odyfikacja wartości początkowej oraz wielkości przyrostu dla pola identyfikacyjnego
Kiedy tabela zawiera pole identyfikacyjne o typie danych Autonumerowame, można ustawić wartość początkową (seed) oraz wielkość przyrostu (increment) dla teso pola Seed jest początkową wartością w danym polu, a increment jest liczbą dodaną do wartości początkowej (seed) w celu uzyskania nowej wartość, dla następnego rekordu Jeżeli pominiesz te dane, to wartość początkowa oraz wielkość przyrostu be.-dą automatycznie równe 1. Korzystając z języka DDL, możesz zmienić wartość początkową oraz wielkość przyrostu dla pola z typem danych Autonumerowame przy użyciu następujących poleceń:
ALTER TABLE NazwaTabeli ALTER COLUMN NazwaPola AUTOINCREMENT (seed, increment)
albo
ALTER TABLE NazwaTabeli ALTER COLUMN NazwaPolc. COUNTER (seed, increment)
I Programowanie przy użyciu języka DDL
535
a lbo
ALTER TABLE NazwaTabeli ALTER COLUMN NazwaPola IDENTITY (seed, increment)
Procedura w przykładzie 4.4.J zmienia wartość początkową pola idpracownika w tabeli Pracownicy na 1,000.
Przykład 4.4.J. Zmiana wartości początkowej pola identyfikacyjnego
private Sub cmdZraianaAutonumeracji_Click() Dim mojaDB As DAO.Database Set mojaDB = CurrentDb
mojaDB.Execute "ALTER TABLE Pracownicy " _
& "ALTER COLUMN Idpracownika COUNTER (1000);" mojaDB.Close End Sub
Po uruchomieniu procedury w przykładzie 4.4.J otwórz tabelę pracownicy i dodaj do niej kilka nowych rekordów. Zwróć uwagę, że numeracja nowych rekordów zaczyna się od tysiąca (1000).
Definiowanie indeksów oraz kluczy podstawowych
W Microsoft Access indeksy przyśpieszają proces wyszukiwania oraz sortowania rekordów. Pola tabeli, które są często używane w poszukiwaniach rekordów oraz pola, według których zamierzasz sortować, powinny posiadać indeks. Indeks można utworzyć w nowej lub istniejącej już tabeli. Indeks może składać się z jednego lub więcej pól. W tym podrozdziale dowiesz się, w jaki sposób używa się języka DDL w procedurach VBA do definiowania indeksów oraz kluczy podstawowych.
Tworzenie tabel z indeksami
Indeks można utworzyć podczas tworzenia nowej tabeli. W tym celu należy skorzystać z klauzuli constraint wewnątrz polecenia create table. Procedura w przykładzie 4.5.A tworzy nową tabelę o nazwie Dostawcal z unikatowym indeksem
0 nazwie idxNazwaDostawcy na podstawie pola NazwaDostawcy.
536
Programowanie w Access 2000
S3 frrnPoznaiDDLS: Indeksy i klurze podstawowe
Indeks
Indeks: Primary Key (WITH PRIMARY)
I ndeks (wielopolowy)
Indeks nie dopuszczjący wartości zerowych (NULL) CA1TH DISALLCWNULL)
K lucz podstawowy (pojedynczyMelopolowy)
Indeks dopuszczjący wartości NULL w polu klucza CWITH IGNORE NULL)
U suwanie ndeksu
R ysunek 4.5. Definiowanie indeksów i kluczy podstawowych Przykład 4.5.A. Tworzenie tabeli z indeksem
Private Sub cmdIndeksPojedynczy_Click() Dim mojaDB As DAO.Database Dim mojaTabela As String Set mojaDB = CurrentDb
On Error GoTo Obsługa_Błędu mojaTabela = "Dostawcal"
mojaDB.Execute "CREATE TABLE " & mojaTabela & "(IdDostawcy INTEGER, " _ & "NazwaDostawcy CHAR (30), " _ & "IdProduktu CHAR (12), " _ & "NazwaProduktu CHAR (19), " _ & "CenaProduktu MONEY, " _ & "CONSTRAINT idxNazwaDostawcy UNIQUE " & "(NazwaDostawcy));" mojaDB.Close Exit Sub Obsługa_Błędu:
MsgBox Err.Number & ":" & Err.Description End Sub
Rezultat procedury 4.5.A przedstawiony jest poniżej:
-v ■
Programowanie przy użyciu języka DDL
537
g Dostawca!: Tabela
Typ danych j
Liczba Tekst Tekst Tekst Walutowy
Opis
Ogólne
Podstawowy
Nie Unikatowy
Tak Ignoruj
zerowe Nie
Odnośnik
Rozmiar poia '■■ Format
Miejsca dziesiętne Maska wprowadzania Tytuł
Wartość domyślna Reguła poprawności Komunikat o błędzie Wymagane Indeksowane
Liczba całkow
Auto
Nie Nie
Porządek sortowania
Rosnąco
dxNazwaDostawcy NazwaDostawcy
Właściwości indeksu
;
Nazwa tego indeksu. Każdy
indeks może użyć
j maksymalnie
10 pól.
A by dodać indeks do istniejącej już tabeli, skorzystaj z polecenia create index. W procedurze poniżej dodaj indeks o nazwie idxMiasto do tabeli tbiszkoły.
Sub Pojedynczyldxl()
Dim mojaDB As DAO.Database Dim mojaTabela As String Set mojaDB = CurrentDb
On Error GoTo Obsługa_Błędu mojaTabela = "tblSzkoły"
mojaDB.Execute "CREATE INDEX idxMiasto ON " & mojaTabela _ & "(Miasto) ;" mojaDB.Close Exit Sub Obsługa_Błędu:
MsgBox Err.Number & ":" & Err.Description End Sub
Rezultatem procedury w przykładzie 4.5.B jest utworzenie indeksu o nazwie idxProdukt na podstawie dwóch pól: idProduktu oraz NazwaProduktu.
Przykład 4.5.B. Tworzenie indeksu opartego na dwóch polach tabeli
Private Sub cmdIdxWielopolowy_Click()
P rogramowanie w Access 20
Dim mojaDB As DAO.Database Dim mojaTabela As String Set mojaDB = CurrentDb
On Error GoTo Obsługa_Błędu mojaTabela = "Dostawca2" mojaDB.Execute "CREATE TABLE " & mojaTabela & "(IdDostawcy INTEGER, " _ & "NazwaDostawcy CHAR (30), " _ & "IdProduktu CHAR (12), " _ & "NazwaProduktu CHAR (19), " _ & "CenaProduktu MONEY, " _ & "CONSTRAINT idxProdukt UNIQUE " _ & "(IdProduktu, NazwaProduktu))J" mojaDB.Close Exit Sub
Obsługa_Błędu:
MsgBox Err.Number & ":" & Err.Description
End Sub
N azwa poją IdProduktu NazwaProduktu
Rosnąco Rosnąco
sortowania
ń
Właściwości indeksu
podstawowy Me Unikatowy Ta^ Ignoruj zerowe Nie
Nazwa
tego irdeksu. Każdy
indeks może użyć
i riaksymalnie
10 poi.
Przyklad4,.C. Tworzeń, ^-podstawowego opartego najednympo,
Private Sub cmdPojedynczyKluczPodstawowy._Click() Dim mojaDB As DAO.Database Dim mojaTabela As String Set mojaDB = CurrentDb
<*mm
[programowanie przy użyciu języka DDL
539
On Error GoTo Obsługa_Błędu mojaTabela = "Dostawca3"
mojaDB.Execute "CREATE TABLE " & mojaTabela _ & "(IdDostawcy INTEGER, " & "NazwaDostawcy CHAR (30), " _ & "IdProduktu CHAR (12), " _ & "NazwaProduktu CHAR (19), " _ & "CenaProduktu MONEY, " _ & "CONSTRAINT idxPrimary PRIMARY KEY " & "(IdDostawcy));" mojaDB.Close Exit Sub |)bsługa_Błędu:
MsgBox Err.Number & ":" & Err.Description [End Sub
Aby utworzyć tabelę z kluczem podstawowym opartym na dwóch i więcej ko-j lumnach (polach), zmodyfikuj klauzulę constraint w procedurze przedstawionej w przykładzie 4.5.C, podając po słowie kluczowym primary key nazwy kolumn I w nawiasie. Następująca klauzula constraint utworzy klucz podstawowy o nazwie
idxPrimary na podstawie kolumn IdDostawcy oraz IdProduktu: •CONSTRAINT idxPrimary PRIMARY KEY (IdDostawcy, IdProduktu));"
Tworzenie indeksów z restrykcjami
Aby dodać indeks do istniejącej tabeli, możesz skorzystać z polecenia create index. Polecenie create index można użyć z następującymi opcjami:
primary - Tworzy klucz podstawowy, który nie pozwala na duplikaty w indeksowanym polu.
disallow null - Tworzy indeks, który nie zezwala na dodanie rekordów z wartościami Null w indeksowanym polu.
ignore null - Nie indeksuje rekordów posiadających wartości Null w indeksowanym polu.
Aby zadeklarować powyższe opcje indeksu, należy zastosować słowo kluczowe
540
Programowanie w Access 2000 I
P rocedura w przykładzie 4.5.D definiuje pole idDostawcy jako klucz podstawowy przy wykorzystaniu opcji primary.
Przykład 4.5.D. Tworzenie klucza podstawowego
Private Sub cmdWithPrimary_Click() Dim mojaDB As DAO.Database Dim mojaTabela As String Set mojaDB = CurrentDb
On Error GoTo Obsługa_Błędu mojaTabela = "Dostawcal" mojaDB.Execute "CREATE INDEX idxPrimaryl ON " & mojaTabela & "(IdDostawcy) WITH PRIMARY mojaDB.Close Exit Sub Obsługa_Błędu:
MsgBox Err.Number & ":" & Err.Description End Sub
Zwróć uwagę, że indeks utworzony przez procedurę w przykładzie 4.5.D posiada właściwości indeksu Podstawowy (Primary) oraz Unikatowy (Unique) ustawione na Tak. Oznacza to, że ten indeks jest kluczem podstawowym i nie pozwala na powtarzanie się wartości.
fIndeksy: Dostawca!
Nazwa indeksu
idxNazwaDosta'A'cy
KUIdxPrimarvl
Nazwa pola
NazwaDostawcy IdDostawcy
Porządek sortowania
Rosnąco Rosnąco
Właściwości indeksu
Podstawowy Tak Unikatowy Tak Ignoruj zerowe Nie
Nazwa tego indeksu, Kaźcy indeks może użyć maksymalnie 10 pól.
-
Programowanie przy użyciu języka DDL
541
M ożesz zabronić wprowadzania wartości Null w indeksowanych polach, stosując restrykcyjną opcję disallow null (zob. procedurę w przykładzie 4.5.E).
Przykład 4.5.E. Tworzenie indeksu zabraniającego wpisywanie wartości Null w polu klucza
private Sub cmdDisallowNull_Click() Dim mojaDB As DAO.Database Dim mojaTabela As String Set mojaDB = CurrentDb
On Error GoTo Obsługa_Błędu mojaTabela = "Dostawcal"
mojaDB.Execute "CREATE INDEX idxNazwaProduktu ON " & mojaTabela _ & "(NazwaProduktu) WITH DISALLOW NULL ;" mojaDB.Close Exit Sub Obsługa błędu:
MsgBox Err.Number & ":" & Err.Description End Sub
Rezultatem uruchomienia procedury w przykładzie 4.5.E jest indeks o nazwie idxNazwaProduktu, który nie ignoruje wartości Null.
f Indeksy: Dostawcal
2Ś
N azwa indeksu
idxNazwaDostawcy
idxPrimaryl
Nazwa pola
NazwaDostawcy
NazwaProduktu
IdDostawcy
Porządek sortowania
Rosnąco Rosnąco Rosnąco
Właściwości indeksu
Podstawowy Nie Unikatowy Nie Ignoruj zerowe Nie
i Nazwa tego indeksu. Każdy indeks może użyć maksymalnie 10 pól.
Aby nie dopuścić wartości Null znajdujących się w indeksowanych kolumnach (polach) tabeli w danym indeksie, zastosuj restrykcyjną opcję ignore null, według wzoru w przykładzie 4.5.F.
542
Programowanie w Access 20
Przykład 4.5.F. Tworzenie indeksu z restrykcją IGNORE NLLL
Private Sub cmdIgnoreNull_Click() Dim mojaDB As DAO.Database Dim mojaTabela As String Set mojaDB = CurrentDb
On Error GoTo Obsługa__Błędu mojaTabela = "Dostawca2" mojaDB.Execute "CREATE INDEX idxNazwaProduktu ON " & mojaTabela & "(NazwaProduktu) WITH IGNORE NULL ;" mojaDB.Close Exit Sub Obsługa_Błędu:
MsgBox Err.Number & ":" & Err.Description End Sub
Rezultatem uruchomienia procedury w przykładzie 4.5.F jest indeks o nazwie idxNazwaProduktu, który dopuszcza użycie wartości Null w indeksowanej kolumnie (polu). Jednakże wartości Null nie będą uwzględnione w poszukiwaniach, które wykorzystują ten indeks.
|
|
|
|
|
|||
| £ Indeksy: Dostawca2 |
|
ill |
|||||
j |
Nazwa indeksu |
Nazwa pola |
1 Po |
'Zcjdek sortowania a | |
|||
!BJIdxNazwaProduktuB| |
NazwaProduktu |
Rosnąco |
i |
||||
|
idxProdukt |
IdProduktu |
Rosnąco |
■ ■■■■■■ - i |
|||
|
|
NazwaProduktu |
Rosnąco |
|
|||
|
|
|
|
|
|||
|
|
||||||
|
|
Właściwości indeksu |
|
||||
|
|||||||
|
|
||||||
Podstawowy Nie Unikatowy Nie Ignoruj zerowe Tak |
|
|
|
||||
| Nazwa |
tego indeksu, Ksżdy indeks może użyć rnaksymaln>e 10 pól. |
Programowanie przy użyciu języka DDL
543
1 Usuwanie indeksów
Skorzystaj z polecenia drop index, aby usunąć indeks. Za każdym razem przy usuwaniu kolumny (pola) będącego częścią indeksu należy najpierw usunąć ten indeks za pomocą poleceń drop constraint albo drop index. Przed usunięciem indeksu upewnij się, że tabela zawierająca ten indeks jest zamknięta.
Przykład 4.5.G. Usuwanie indeksu
Private Sub cmdDeleteIdx_Click() Dim mojaDB As DAO.Database Dim mojaTabela As String Set mojaDB = CurrentDb
On Error GoTo Obsługa_Błędu mojaTabela = "Dostawcal" mojaDB.Execute "DROP INDEX idxNazwaDostawcy ON " & mojaTabela & ";"
mojaDB.Close Exit Sub Obsługa_Błędu:
MsgBox Err.Number & ":" & Err.Description End Sub
Bezpieczeństwo danych: hasła oraz konta użytkowników i grup
Standard Jet 4.0 ANSI SQL-92 obsługuje szereg opcji związanych z bezpieczeństwem danych, które ułatwiają wykonywanie czynności, takich jak zarządzanie hasłami bazy danych oraz hasłami użytkowników, tworzenie i usuwanie kont użytkowników oraz kont grup, jak również przyznawanie i usuwanie uprawnień do obiektów bazy danych. Procedury, które znajdziesz w tym podrozdziale, demonstrują, w jaki sposób stosuje się proste polecenia języka DDL w kierowaniu bezpieczeństwem bazy danych. Wychodzę z założenia, że zapoznałeś się już z treścią rozdziałów 2 i 3 tej książki i wiesz, w jaki sposób używa się DAO oraz ADO w celu nawiązania łączności z bazą danych.
544
Programowanie w Access 2000
M frmPoznaiDDLS: Bezpieczeńst
U
staw
hasło
bazy danych
.S?ko(y,,.mdfa...-.f!.sekret!),_...
Umieś: konto użytkownika JanM w grupie Mozart
Usuń hasło bazy danych Szkoły, mdb
Usuń konto użytkownika JanM z grupy Mozart
Wyma* konto użytkownika JanM
Dodaj konto użytkownika:
Nazwa: J3nM
Hasło: rybak
ID: 0302
Z mień hasło użytkownika JanM:
Stare hasło: rybak nowe hasło: programista
Z ałóż konto grupowe: Nazwa: Mozart ID; 2002Kolekcja
Ustaw następujące uprawnienia do tablel dla v szystkich użytkowników
grupy Mozart:
: : ' SELECT
DELETE
INSERT
UPDATE
Usuń uprawnienie do wymazywania
danych z tabel dla wszystkich
użytkom ników grupy Mozart
Wymaż konto grupowe Mozart
R ysunek 4.6. Zarządzanie bezpieczeństwem danych przy użyciu DDL
Ustawianie hasła bazy danych
Bezpieczeństwo danych można zaimplementować na poziomie bazy danych i na poziomie użytkownika. Bezpieczeństwo na poziome bazy danych jest najłatwiejs; w implementacji, gdyż wymaga jedynie ustawienia hasła dla bazy danych. Może skorzystać z polecenia alter database, aby ustawić nowe hasło lub zmienić j hasło na nowe. Struktura tej instrukcji jest następująca:
ALTER DATABASE PASSWORD nowHasło stareHasło
Ustawiając hasło po raz pierwszy, wpisz Null w miejcu stareHasło (zob. procedurę w przykładzie 4.6.A). W celu ustawienia lub usunięcia hasła bazy danych bazę danych Access należy otworzyć w trybie wyłączoności:
Programowanie przy użyciu języka DDL
545
Microsoft Access
Aby ustawić hasło bazy danych lub je usunąć, należy mieć bazę otwartą w trybie wyłączności.
1J Aby otworzyć bazę w trybie wyłączności, zamknij bazą danych i otwórz ją ponownie, używając polecenia Otwórz z menu Plik. W oknie dialogowym Otwieranie kliknij strzałkę po prawej stronie przycisku, a następnie wybierz opcją Otwórz z wyłącznością.
OK
P rzykład 4.6.A. Ustawianie hasła bazy danych
Private Sub cmdSetDBPassword_Click()
1 przed uruchomieniem tej procedury, uruchom procedurę w przykładzie
i 4-1 Bl aby utworzyć plik bazy danych o nazwie Szkoly.mdb
Dim con As New ADODB.Connection
Dim ścieżka As String
ścieżka = CurDir
con.Mode = adModeShareExclusive
con.Open "Provider = Microsoft.Jet.OleDb.4.0;" &
"Data Source=" & ścieżka & "\Szkoly.mdb;" con.Execute "ALTER DATABASE PASSWORD sekret null' con.Close Set con = Nothing End Sub
Usuwanie hasła bazy danych
Aby usunąć hasło bazy danych, należy po prostu zastąpić bieżące hasło wartością Null. Wykonaj to przy użyciu polecenia alter database password według wzoru w poprzednim podrozdziale. Ponieważ baza danych jest zabezpieczona hasłem, należy skorzystać z właściwości Jet oledb: Database Password, aby podać hasło w celu otwarcia bazy danych. Właściwość ta jest właściwością obiektu connection specyficzną dla dostawcy Microsoft Jet 4.0 OLE DB. Następująca procedura pokazuje, w jaki sposób należy usunąć hasło „sekret" z bazy danych Szkoły.mdb, które zostało ustawione przez procedurę w poprzednim podrozdziale.
Przykład 4.6.B. Usuwanie hasła bazy danych
Private Sub cmdSkasujDBPassword_Click() Dim con As New ADODB.Connection
546
Programowanie w Access 2000
D im myPass As String
Dim ścieżka As String
myPass = "sekret" n. ścieżka = CurDir
con.Mode = adModeShareExclusive
con.Open "Provider = Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & ścieżka & "\Szkoły.mdb;" & "Jet OLEDB:Database Password = " & myPass
con.Execute "ALTER DATABASE PASSWORD null sekret'
con.Close
Set con = Nothing End Sub
Zakładanie konta użytkownika
Zabezpieczenie bazy danych na poziomie użytkownika jest bardziej skompliko wane niż ustawianie hasła bazy danych. Operacja ta wymaga utworzenia kont indy dualnych i grupowych oraz przyznania uprawnień użytkownikom oraz grupom przeprowadzania operacji na różnych obiektach bazy danych. Skorzystaj z pole create user, aby utworzyć nowe konto indywidulane. Podaj imię użytkownika < jego hasło i tak zwany osobisty identyfikator (PID), aby uczynić to konto unikatc wym.
CREATE USER imięUżytkownika hasłoUżytkownika PID
Możesz od razu utworzyć kilka kont indywidualnych, oddzielając nazwy użytkowników przecinkami. Procedura poniżej zakłada nowe konto użytkownika o na GeorgeM z hasłem „rybak" oraz „0302" jako PID.
Przykład 4.6.C. Tworzenie konta użytkownika
Private Sub cmdDodajKontoIndywid_Click() Dim adoCon As New ADODB.Connection
Set adoCon = CurrentProject.Connection
adoCon.Execute "CREATE USER JanM rybak 0302'
adoCon.Close
Set adoCon = Nothing End Sub
Programowanie przy użyciu języka DDL
547
P o uruchomieniu procedury w przykładzie 4.6.C powinieneś zobaczyć konto o nazwie JanM w oknie dialogowym Konta użytkowników i grup (wybierz Narzędzia => Zabezpieczenia => Konta użytkowników i grup).
l onta użytkowników i grup
Użytkownicy Grupy Zmienianie hasra logowania J
[Użytkownik-
Nazwa: | iSłISI
Nowa,,,
Usuń
Usuń hasło
- |
Członkostwo
grupy — ■ Użytkownicy Dodaj » «.Usuń |
|
Członek grupy: |
Druku) użytkowników i grupy
O K
Cancel
Zmiana hasła użytkownika
Hasło użytkownika można zmienić za pomocą polecenia alter user w następującej formie:
ALTER USER imięUżytkownika PASSWORD noweHasło stareHasło Przykład 4.6.D. Zmiana hasła użytkownika
Private Sub cmdZmianaUserPassword_Click()
Dim adoCon As New ADODB.Connection
Set adoCon = CurrentProject.Connection
adoCon.Execute "ALTER USER JanM PASSWORD programista rybak"
adoCon.Close
Set adoCon = Nothing End Sub
Aby założyć nowe konto grupy, musisz skorzystać z polecenia create grom Powinieneś w tym celu podać nazwę grupy i unikatowy PID (Personal Identifier).
CREATE GROUP nazwaGrupy PID
Możesz utworzyć od razu więcej niż jedno konto grupy, oddzielając nazwy grj przecinkami. Procedura w przykładzie 4.6.E tworzy konto grupy o nazwie „Mozarta podając „2002Kolekcja" w charakterze PID.
Przykład 4.6.E. Zakładanie konta grupy
Private Sub cmdPrzygotujKontoGrupy_Click() Dim adoCon As New ADODB.Connection
Set adoCon = CurrentProject.Connection adoCon.Execute "CREATE GROUP Mozart 2 002Kolekcja" adoCon.Close Set adoCon = Nothing End Sub
Dodawanie użytkowników do grup
Skorzystaj z polecenia add user, aby dodać użytkownika do konta grupy. Podai w tym celu nazwę konta indywidulanego ze słowem kluczowym to oraz nazwą grupy, tak jak w przykładzie poniżej:
ADD USER imięUżytkownika TO nazwaGrupy
Przykład 4.6.F. Dodawanie konta indywidualnego do konta grupy
Private Sub cmdDodajKontoIndywDoGrupy_Click(; Dim adoCon As New ADODB.Connection
Set adoCon = CurrentProject.Connection adoCon.Execute "ADD USER JanM TO Mozart" adoCon.Close Set adoCon = Nothing End Sub
P rogramowanie przy użyciu języka DDL
549
| Usuwanie użytkownika z konta grupy
Aby usunąć konto użytkownika z danej grupy, należy skorzystać z polecenia drop user, podając nazwę użytkownika, słowo kluczowe from oraz nazwę grupy. Na przykład, aby usunąć konto JanM z grupy Mozart, należy użyć następującego polecenia:
[DROP USER JanM FROM Mozart
yklad 4.6.G. Usuwanie użytkownika z konta grupy
[Private Sub cmdUsuńKontoZGrupy_Click() i Dim adoCon As New ADODB.Connection
Set adoCon = CurrentProject.Connection adoCon.Execute "DROP USER JanM FROM Mozart" adoCon.Close Set adoCon = Nothing
End Sub
Usuwanie konta użytkownika
Aby usunąć konto indywidualne z bazy danych, skorzystaj z instrukcji drop user, podając nazwę konta indywidualnego, tak jak to przedstawia procedura ; w przykładzie 4.6.H.
Przykład 4.6.H. Usuwanie konta użytkownika
Private Sub cmdSkasujKontoIndywid_Click() Dim adoCon As New ADODB.Connection
Set adoCon = CurrentProject.Connection adoCon.Execute "DROP USER JanM" adoCon.Close Set adoCon = Nothing
End Sub
550
Programowanie w Access 200
I
Przyznawanie uprawnień do obiektów bazy danych
Skorzystaj z polecenia grant, aby przydzielić uprawnienia do danego obiek w bazie danych danemu użytkownikowi lub grupie. Procedura w przykładzie 4.6 przyznaje grupie Mozart uprawnienia select, delete, insert oraz update wszystkich tabel w bazie danych. Polecenie grant wymaga:
wykazu uprawnień, które chcemy przyznać,
słowa
kluczowego on
z nazwą
tabeli lub innego obiektu lub nazwy kontenera!
danego
obiektu (np. Tables,
Forms, Reports, Modules, Scripts),
słowa kluczowego to z nazwą konta indywidualnego lub konta grupy.
G RANT wykazUprawnień ON nazwaTabeli | nazwaCbiektu nazwaKontaGrupy | nazwaKontalndywidualnego
nazwaKonteneru TO j
Uwaga: Oprócz tabel, kontener o nazwie Tables zawiera kwerendy, widoki, procedury przechowywane, natomiast kontener Scripts zawiera również makra.
P rzykład 4.6.1. Przyznawanie istniejącemu kontu grupy uprawnień do tabel
Private Sub cmdSetTblPermissions_Click() Dim adoCon As New ADODB.Connection
Set adoCon = CurrentProject.Connection
adoCon.Execute "GRANT SELECT, DELETE, INSERT, & "UPDATE ON CONTAINER TABLES TO Mozart"
adoCon.Close
Set adoCon = Nothing End Sub
Otwórz okno dialogowe Uprawnienia użytkowników i grup (wybierz Narzędzia => Zabezpieczenia => Uprawnienia użytkowników i grup), aby sprawdzić
przywileje przyznane członkom grupy Mozart przez procedurę w przykładzie 4.6.1.
Programowanie przy użyciu języka DDL
551
,.,wnienla użytkowników I quip
J?J.XJ
Lista;
<"* Użytkownicy
(*
Grupy
Typ obiektu; [Tabela
.Uprawnienia ~- —
■■• ~~" -
1^ Odczytaj dane W A&ualiżuj dane W Wstaw dane $/ Usuń dane
I P Czytanie projektu 1 f" Modyfikuj projekt : f" Administruj
Bieżący użytkownik: \ Administrator
OK
Cancel
O dbieranie uprawnień
Skorzystaj z polecenia revoke, aby odebrać uprawnienie do korzystania lub zmiany danego obiektu dla istniejącego konta indywidualnego lub grupowego. Polecenie to posiada następujący zapis syntaktyczny:
nazwaKonteneru
REVOKE wykazUprawnień ON nazwaTabeli I nazwaObiektu FROM nazwaKontaGrupy | nazwaKontalndywidualnego
Procedura w przykładzie 4.6 J odbiera członkom grupy Mozart uprawnienie do wymazywania tabel.
J
Przykład 4.6.J. Odbieranie uprawnień do obiektu
Private Sub cmdRevokePermission_Click()
Dim adoCon As New ADODB.Connection
Set adoCon = CurrentProject.Connection
adoCon.Execute "REVOKE DELETE ON CONTAINER TABLES FROM Mozart"
adoCon.Close
Set adoCon = Nothing End Sub
552
Programowanie w Access 2000
Zwróć uwagę, że po odtworzeniu powyższej procedury uprawnienie delete (Usuń dane) jest wyłączone dla członków grupy Mozart w odniesieniu do wszystkich nowych tabel i kwerend:
Uprawnienia
| Zmienianie właściciela
j
Nazwa
użytkownika/grupy: Nazwa
obiektu:
[Administrator [Użytkownicy
>ostawcal >ostawca2 >ostawca3 Employees myForeignTb myPrimaryTbl Jrders
?■ x
L ista: C Użytkownicy ff Grupy Typ obiektu: jTabela
1 r Uprawnienia
\ I J? Odczytaj dane
I iy Czytanie projektu IC' Aktualizuj dane
i f™ Modyfikuj projekt n? Wstaw dane
I I Administruj T" Usuń dane
Bieżący użytkownik; \ Administrator
Usuwanie konta grupy
Skorzystaj z polecenia drop group, aby usunąć konto grupy. Musisz jedynie pi dać nazwę konta grupy, które chcesz usunąć. Jeżeli chcesz usunąć od razu kilka kon oddziel nazwy kont przecinkiem.
Przykład 4.6.K. Usuwanie konta grupy
Private Sub cmdUsunKontoGrupy_Click() Dim adoCon As New ADODB.Connection
Set adoCon = CurrentProject.Connection adoCon.Execute "DROP GROUP Mozart" adoCon.Close Set adoCon = Nothing End Sub
Programowanie przy użyciu języka DDL
553
Widoki i procedury przechowywane
W Accessie 2000 dostępna jest nowa technologia o nazwie aparat danych Microsoft Engine (MSDE), która umożliwia lokalne przechowywanie danych zgodne z programem Microsoft SQL Server 7.0. Inna, również nowa, funkcja o nazwie Projekt Microsoft Access (.adp), jest specjalnym plikiem, który umożliwia podłączenie formularzy i raportów Microsoft Access bezpośrednio do serwera SQL lub MSDE. W projektach ADP do przeprowadzania różnych operacji związanych z kwerendami stosuje się dwa nowe obiekty: widoki i procedury przechowywane. Widoki (Views) zastępują stosowane w Accessie kwerendy wybierające (select), jednakże nie pozwalają na użycie klauzuli order by do sortowania rekordów lub parametrów do filtrowania rekordów. Procedury przechowywane (Stored procedures) wykonują te same operacje co kwerendy aktualizujące oraz kwerendy parametryzowane. Można je także stosować przy tworzeniu kwerend wybierających, które sortują rekordy. Ponieważ procedury przechowywane są skompilowane w momencie ich zachowania na dysku, działają one szybciej aniżeli standardowe instrukcje SQL. W tym podrozdziale poznasz instrukcje języka DDL umożliwiające tworzenie i uruchamianie widoków i procedur przechowywanych.
ItmPoznajOOLT: Widoki i prote
[Sporządź wkiok oparty na tabelach \
S porządź wykaz widoków
Usuń widok
\ 5poRąd£ procedurą \ przechowywaną z parametrem i w oparciu o tabelę 'tblAgenci'
;
Uruchom procedurę
i przechowywaną
'procWpis^Dane'
Usuń procedurę przechowywaną 'procWpiszOane'
J
1
Rysunek 4.7. Tworzenie widoków oraz procedur przechowywanych przy użyciu DDL
Tworzenie widoków
Jeżeli użytkownicy twojej aplikacji muszą przeglądać i modyfikować dane w jednej lub kilku tabelach, i nie chcesz, aby bezpośrednio otwierali te tabele lub posiadali dostęp do niektórych pól tabeli (np. informacji o zarobkach), możesz ograniczyć rodzaj informacji widoczych dla użytkownika poprzez udostępnienie tzw. Widoku. Widok można porównać do wirtualnej tabeli. Zamiast udostępniać wszystkie dane, możesz określić, jakie dane można przeglądać. Widok można utworzyć z jednej lub więcej tabel. Aby utworzyć widok, używa się instrukcji select w celu wybrania ko-
554
Programowanie w Access 20
l umn (pól), które chcemy dodać do widoku (kolumny te mogą pochodzić z jednej li więcej tabel). Następnie należy skojarzyć polecenie select z poleceniem creh view. Składnia instrukcji tworzącej widok jest następująca:
CREATE VIEW nazwaWidoku [(nazwyPól)]
AS
SELECT (nazwyPól)
FROM nazwaTabeli
Nazwy widoków nie mogą się powtarzać w tej samej bazie danych. Podań nazw pól w widoku jest opcjonalne (zwróć uwagę na nawiasy kwadratowe wskła podanej powyżej). Aczkolwiek w przypadku, gdy chcesz wymienić nazwy pól, jaj będą ujęte w wyniku, należy podać nazwę każdego pola w widoku. Również nali podać nazwę każdego pola obliczeniowego. Jeżeli nie podasz nazw pól, nazww lumn w utworzonym widoku będą takie same jak pola podane w poleceniu select!
Nazwy kolumn można również podać w poleceniu select, tak jak pokazują procedura w przykładzie 4.7.A. Przykładowa instrukcja poniżej tworzy widok zawj rający tylko zamówienia, w których kwota w polu Fracht jest mniejsza niż 10 zł. ]
CREATE VIEW TaniFracht (NrZam, Fracht, KrajOdbiorcy)
AS
SELECT IdZamówienia, Fracht, KrajOdbiorcy
FROM Zamówienia
WHERE (((Fracht)<10));
Instrukcji tworzącej widok nie można wpisać bezpośrednio w trybie SQ1 w oknie kwerendy. Należy jej użyć za pomocą metody Execute z biblioteki ADO1 nawiązaniu połączenia z bazą danych. Zobaczmy to na następującym przykładzie: 1
1.
2. 3. 4.
W oknie bazy danych wybierz z menu Narzędzia opcję Makro, a następ Edytor Visual Basic.
W oknie edytora Visual Basic wybierz Wstaw => Moduł (Insert I Module). W oknie Właściwości (Properties) zmień nazwę modułu na widDDL7.
W oknie kod programu (widDDL7 - code) wpisz podaną poniżej procedurę \
niFracht.
Sub TaniFracht()
Dim con As ADODB.Connection
Set con = CurrentProject.Connection
Programowanie przy użyciu języka DDL
555
con.Execute "CREATE VIEW TaniFracht (IdZamówienia, Frach,
KrajOdbiorcy) AS "&_
"SELECT IdZamówienia, Fracht, KrajOdbiorcy "&_ "FROM Zamówienia WHERE (((Fracht)<10));" con.Close
Set con = Nothing End Sub
5. Ustaw kursor w dowolnym miejscu wewnątrz procedury TaniFracht i naciśnij klawisz F5 (lub wybierz Uruchom => Sub/UserForm).
Utworzony widok nie będzie widoczny w interfejsie użytkownika w oknie bazy danych. Widoki można używać tak, jak się używa tabele. Aby zwrócić dane, korzystając z utworzonego widoku TaniFracht, wykonaj następujące czynności:
t W oknie bazy danych kliknij obiekt Kwerendy i wybierz opcję Utwórz kwerendę w widoku projektu.
Gdy pojawi się okno dialogowe Pokazywanie tabeli, kliknij przycisk Zamknij.
Wybierz Widok => Widok SQL (lub naciśnij przycisk SQL na pasku narzędzi).
W oknie Kwerendal: kwerenda wybierająca wpisz następujące polecenie:
SELECT * FROM TaniFracht;
Wybierz Kwerenda => Uruchom (lub kliknij na przycisk Uruchom na pasku narzędzi).
Access wyświetli listę zamówień, dla których wartość w polu Fracht jest poniżej
10 zł.
Procedura w przykładzie 4.7.A tworzy widok o nazwie Pracownicy_wOi. Widok I ten oparaty jest na danych pochodzących z tabel Pracownicy oraz tabeli zamówienia
I i zawiera pięć pól (Employee Id, FullName, Title, ReportsTo oraz Orderld). Przykład 4.7.A. Tworzenie widoku opartego na tabelach
Sub Utworz_Widok ()
Dim con As ADODB.Connection
Set con = CurrentProject.Connection
On Error GoTo Obsługa_Błędu
556
Programowanie w Access 2000
c on.Execute "CREATE VIEW widok_Pracownicy AS. " & _ "SELECT Pracownicy.IDpracownika, Pracownicy.Stanowisko, " & _ "Pracownicy.Szef, Zamówienia.IDzamówienia FP.OM Pracownicy " & "INNER JOIN Zamówienia ON Pracownicy.IDpracownika = Zamówienia.IDpracownika;"
con.Close Set con = Nothing Exit Sub Obsługa_Błędu: If Err.Number = -2147217900 Then
con.Execute "DROP VIEW widok_Pracownicy" Resume Else
MsgBox Err.Number & ":" & Err.Description End If End Sub
Widoki nie są widoczne w interfejsie użytkownika w aplikacji Microsoft Access. Jeżeli jednak po uruchomieniu powyższej procedury chcesz się upewnić, że widok został w istocie utworzony, wybierz w oknie bazy danych opcję utwórz kwerendę za pomocą kreatora i gdy pojawi się okno Kreator prostych kwerend otwórz rozwijaną listę Tabele/Kwerendy:
Kreator prostych kwerend
3akie pola mają być umieszczone w kwerendzie? Możesz wybrać spośród kilku tabel lub kwerend.
Tabele/Kwerendy
D ostępne pola:
Wybrane pola:
IDpracownika
Stanowisko
Szef
IDzamówienia
A nuluj
Dalej >
Zakończ
Programowanie przy użyciu języka DDL
557
Sporządzanie wykazu widoków
Aby otrzymać listę sporządzonych widoków, skorzystaj ze zbioru views obiektu Catalog, który znajduje się w bibliotece ADOX. Ilustruje to procedura w przykładzie 4.7.B. Aby procedura ta mogła działać, należy sporządzić najpierw odwołanie do tej biblioteki (informacje na temat pracy z biblioteką obiektów ADOX znajdziesz w rozdziale 3.).
Przykład 4.7.B. Sporządzanie wykazu zachowanych widoków
Sub Lista_Widoki() I Dim cat As New ADOX.Catalog Dim vi As ADOX.View
cat.ActiveConnection = CurrentProject.Connection For Each vi In cat.Views
Debug.Print vi.Name Next vi End Sub
Procedura w przykładzie 4.7.B zwraca nazwy istniejących widoków do okna Instrukcje bezpośrednie:
T aniFracht widok_Pracownicy
ku
=1
U suwanie widoku
Skorzystaj z polecenia drop view, aby usunąć określony widok z bazy danych. W tym celu powinieneś podać nazwę lub nazwy widoków, które chcesz usunąć. Procedura poniżej usuwa widok o nazwie widok_Pracownicy, który został utworzony przez wcześniejszą procedurę. Zwróć uwagę, że tak samo jak create view, polecenie drop view można tylko użyć z metodą Execute obiektu connection z biblioteki obiektów ado.
•mm*
558
Programowanie w Access
Przykład 4.7.C. Usuwanie widoku
Sub Skasuj_Widok()
Dim con As ADODB.Connection
Set con = CurrentProject.Connection
On Error GoTo Obsługa_Błędu
con.Execute "DROP VIEW widok_.Pracownicy;" con.Close Set con = Nothing Exit Sub Obsługa__Błędu:
If Err.Number = -2147217865 Then
MsgBox "Widok już został wymazany." Exit Sub
Else
MsgBox Err.Number & ":" & Err.Description End If End Sub
Tworzenie procedury przechowywanej z parametrem
Za pomocą procedur przechowywanych można wykonać w Accessie 2000 szen operacji związanych z usuwaniem, dodawaniem lub modyfikacją rekordów. Woddl nieniu od widoków, procedury przechowywane mogą przyjąć parametry. Aby utwl rzyć procedurę przechowywaną, skorzystaj z instrukcji create procedure (lub ca ate proc). Podaj przy tym nazwę procedury przechowywanej oraz słowo kluczoł as z instrukcją SQL, która wykona daną czynność w bazie danych. Polecenie SQL można przygotować posługując się trybem Projektuj w oknie kwerendy i następnie skopiować do procedury VBA z trybu SQL. Przy tworzeniu procedur z parametiJ Access pozwala na podanie nie więcej niż 255 parametrów. Parametry należy odda* lić od siebie przecinkami. Procedura w przykładzie 4.7.D tworzy procedurę przechowywaną, która umożliwia dodanie nowego rekordu do tabeli tbiAgenci przez podani wartości parametrów. Zwróć uwagę, że dodanie nowych rekordów do tabeli urno wia instrukcja insert into będąca składnikiem języka manipulacji danymi Manipulation Language - DML).
^tjs
Programowanie przy użyciu języka DDL
559
Przykład 4.7.D. Tworzenie procedury przechowywanej z parametrem
Sub Create_SpZParametrem()
Dim con As ADODB.Connection
Set con = CurrentProject.Connection
On Error GoTo Obsługa_Błędu
con.Execute "CREATE PROCEDURE procWpiszDane(Id TEXT, Imie TEXT, " & _
"Nazwisko TEXT, Ulica TEXT, Miasto TEXT, Tel TEXT) AS " & _ "INSERT INTO tblAgenci VALUES (Id, Imie, Nazwisko, " & _
"Ulica, Miasto, Tel) ; "
con.Close Set con = Nothing Exit Sub Obsługa_Błędu:
If Err.Number = -2147217900 Then
con.Execute "Drop Proc procWpiszDane" Resume Else
MsgBox Err.Number & ":" & Err.Description End If End Sub
Podobnie jak widoki, procedury przechowywane nie są widoczne w oknie bazy danych. Jednakże po odtworzeniu powyższej procedury możesz sprawdzić, czy procedura przechowywana została utworzona, uruchamiając kreatora prostych kwerend, i Otwierając listę Tabele/Kwerendy.
Uruchamianie procedury przechowywanej z parametrem
Po utworzeniu procedury przechowywanej można skorzystać z instrukcji execute, aby ją uruchomić. Procedura w przykładzie 4.7.E uruchamia procedurę przechowywaną o nazwie wpiszDane, którą sporządziliśmy w poprzednim podrozdziale. Zwróć uwagę, że procedura ta korzysta z funkcji inputBox, w celu pobrania wartości parametrów od użytkownika.
Przykład 4.7.E. Uruchamianie procedury przechowywanej z parametrami
J
Sub Execute_StoredProc()
560
Programowanie w Access 20
D im con As ADODB.Connection
Set con = CurrentProject.Connection
On Error GoTo Obsługa_Błędu con.Execute "EXECUTE procWpiszDane " & _
InputBox("Id, Imię, Nazwisko, Ulica, Miasto, Tel1 con.Close Set con = Nothing Exit Sub Obsługa_Błędu:
MsgBox Err.Number & ":" & Err.Description End Sub
Po uruchomieniu procedury przechowywanej w przykładzie 4.7.E, Access wyświetla okno dialogowe, w którym należy wpisać wartości podanych parametrów. Zwróć uwagę, że czwarty parametr, ze względu na odstęp między numerem i nazwą ulicy, został obięty pojedynczym cudzysłowem:
Microsoft Access
Id, Imię, Nazwisko, Ulica., Miasto, Tel
OK~j|
C ancel
0900, Marek, Blacha, '23 Konopnickiej', Warszawa, 2380647|
Po kliknięciu OK w oknie dialogowym nowy rekord zostanie dodany do tabeli tblAgenci:
B tblAgenci: Tabela
Id
Rekord: H I
Imię
jj Jerzy
Agata
Marcin
4.
Iwona
Igor
Jan
7:
Jerzy
8 Barbara 900 Marek
Nazwisko
Cemarski ■ Bartok Kowalski Ko walczyk Kamyk Przemyk Sarzynski Stefańska Blacha !►♦! z 9
Ulica
Obwodowa 12 Strzępek 43 Banacha 1 Majewskiego 14 Borzykowska 111 Romska 4A Żwirki Wigury 112 MatuszkiS 23 Konopnickiej
Gdańsk
| Warszawa
Warszawa
Barania Góra
Gdynia
Rotka
Koszalin
Mielnik
Warszawa
Telefon
058242209
022230846
022230643
882455678
9809999
1144554
9090909
909022
li
2380647
>r
•#« fft
Programowanie przy użyciu języka DDL
561
U suwanie procedury przechowywanej
Skorzystaj z instrukcji drop procedure (albo drop proc), aby usunąć procedurę I przechowywaną. Składnia tej instrukcji wygląda tak:
DROP PROCEDURE nazwa_Procedury_Przechowywanej
Przykład procedury poniżej usuwa procedurę przechowywaną o nazwie procWpiszDane z bieżącej bazy danych.
Przykład 4.7.G. Usuwanie procedury przechowywanej
Sub Skasuj_StoredProc ()
Dim con As ADODB.Connection
Set con = CurrentProject.Connection
On Error GoTo Obsługa_Błędu
con.Execute "DROP PROCEDURE procWpiszDane; " con.Close Set con = Nothing Exit Sub [obsługa_Błędu:
If Err.Number = -2147217865 Then
MsgBox "Procedura została już uprzednio wymazana. Exit Sub Else
MsgBox Err.Number & ":" & Err.Description End If End Sub
Podsumowanie
Ten rozdział zaprezentował liczne przykłady użycia poleceń języka definicji danych wewnątrz procedur VBA oraz w oknie kwerendy w trybie Projektuj. Zamiast ograniczyć się tylko do składni SQL, nauczyłeś się praktycznie używać te polecenia do wykonywania specyficznych operacji na bazie danych. W szczególności, dowiedziałeś się, w jaki sposób używa się poleceń DDL do tworzenia tabel, widoków, procedur przechowywanych, kluczy podstawowych oraz indeksów, jak również nauczy-teś się definiować różne ograniczenia, z którymi muszą być zgodne dane wprowadza-
562
Programowanie w Access 20
n e do tabeli. Chociaż język Access SQL zawiera znacznie więcej instrukcji niż te, które omówiono w tym rozdziale, jak na początek powinno to zupełnie wystarczyć. Dalszą wiedzę w tej dziedzinie możesz uzyskać, studiując bibliotekę MSDN załączoną z pakietem Microsoft Office 2000 dla deweloperów lub przeszukując źródła dostępne w Internecie.
R ozdział 5
Programowanie zdarzeń w formularzach i raportach
W jednym z podrozdziałów rozdziału 1. otrzymałeś już krótkie wprowadzenie do programowania zdarzeń. W jednym z ćwiczeń krok-po-kroku sporządziłeś procedurę obsługi zdarzenia, która zmieniła tło pola tekstowego umieszczonego w formularzu po wybraniu tego pola przez użytkownika. Warto teraz wrócić do rozdziału 1., aby przypomnieć sobie te zagadnienia. Niżej podane są terminy, które powinieneś znać przed przystąpieniem do programowania zdarzeń w aplikacji Microsoft Access 2000:
t Event (zdarzenie) - Zdarzenia są czynnościami rozpoznawanymi przez dany obiekt. Zdarzenia zachodzą przy przesuwaniu myszy, naciśnięciu klawisza, wprowadzeniu zmian w danych, otwieraniu formularza, dodawaniu, modyfikowaniu, usuwaniu rekordu, itp. Zdarzenia mogą być wywołane przez użytkownika danej aplikacji, przez inną aplikację lub przez system operacyjny.
i Event property (właściwość zdarzenia) - Formularze, raporty oraz elementy kontrolne formularzy oraz raportów posiadają różne właściwości, które można użyć do spowodowania określonych czynności. Gdy zajdzie jakieś zdarzenie, Microsoft Access wykonuje procedurę zdarzenia przypisaną do jakieś właściwości typu Event. Właściwości zdarzeń wyszczególnione są na zakładce Zdarzenie w oknie Formularz po klinięciu przycisku Właściwości. Nazwy właściwości zdarzeń rozpoczynają się od wyrazów „Przy", „Po" lub „Przed" (ang. On), po którym podana jest nazwa zdarzenia. Na przykład właściwość zdarzenia o nazwie Przy klinięciu (On Click) odpowiada zdarzeniu click, natomiast właściwość zdarzenia Przy uzyskaniu fokusu (On Got Focus) stosuje się w celu zareagowania na zdarzenie GotFocus.
• Event procedure (procedura obsługi zdarzenia) - Jest to kod pisany w języku VBA, który obsłuży dane zdarzenie. Kod ten określi, w jaki sposób dany formularz, raport lub przycisk na nim umieszczony powinien zareagować na określone zdarzenie. Sporządzając procedury zdarzeń, możesz zmodyfikować wbudowany w aplikacji sposób reagowania na dane zdarzenie.
564
Programowanie w Access 2000
E
vent
trapping (pułapkowanie
zdarzeń) - Przypisując dany program do wła- i
ściwości
zdarzenia (Event
property), zakłada
się pułapkę na dane zdarzenie. Pu- j
łapka
ta spowoduje, że Access nie zareaguje w normalny sposób na
zachodzące
zdarzenie.
Twój kod przejmie zdarzenie i czynność zostanie wykonana w
sposób
zaprogramowany
przez ciebie.
Sequence
of events (kolejność
zdarzeń) - Zdarzenia odbywają się I
w
odpowiedzi na konkretne czynności w ustalonej kolejności. Na
przykład zda-
rżenie
Przy kliknięciu (OnClick) zachodzi przed zdarzeniem Przy kiiknię-
i
ciu
dwukrotnym (On DoubleClick). Podczas wykonywania danej czynności
za
chodzi
kilka zdarzeń jedno po drugim. Na przykład podczas otwierania
formula
rza
zachodzą następujące zdarzenia:
Przy otwarciu (open)
Przy załadowaniu (Load)
Przy zmianie rozmiaru (Resize)
Przy aktywowaniu (Activate)
Przy bieżącym (current)
Przy wejściu (Enter) - zdarzenie dotyczące obiektu formularza
Przy
uzyskaniu fokusu (GotFocus) - zdarzenie dotyczące
obiektu formularza
Natomiast
zamknięcie formularza generuje następujące zdarzenia:
Przy zakończeniu (Exit) - zdarzenie dotyczące obiektu formularza
Przy utracie fokusu - zdarzenie dotyczące obiektu formularza
Przy zwolnieniu (unload)
Przy dezaktywowaniu (Deactivate)
Przy zamknięciu (close)
Aby dowiedzieć się, czy określone zdarzenie zachodzi w odpowiedzi na ność użytkownika, umieść polecenie MsgBox wewnątrz procedury zdarzenia, któi chcesz przetestować. W Microsoft Accessie 2000 formularze, raporty oraz przyciski 1 w nich umieszczone reagują na liczne zdarzenia. Zdarzenia można uporządkować we-B dług obiektu (zdarzenia zachodzące w formularzach, zdarzenia zachodzące w rapor-fl tach, zdarzenia związane z przyciskami) lub według przyczyny, która spowodowaJ dane zdarzenie (naciśnięcie klawisza, zwolnienie przycisku myszy itp.). W tym roz-B dziale znajdziesz liczne przykłady procedur obsługi zdarzeń, które możesz sporządzić* w celu zaprojektowania bardziej dynamicznych formularzy oraz raportów. Na zalą-B
Programowanie zdarzeń w formularzach i raportach
565
c zonym dysku znajduje się aplikacja, która pozwoli ci poeksperymentować ze zdarzeniami. Więcej informacji na temat tej aplikacji znajdziesz na końcu tego rozdziału.
Zdarzenia zachodzące w formularzu
Formularze w Microsoft Access potrafią reagować na różnorodne zdarzenia. Zdarzenia te umożliwiają zarządzanie całymi rekordami oraz reagowanie na zmiany wprowadzane w danych. Programista może określić, co ma się wydarzyć podczas dodawania nowych rekordów, zmiany lub usuwania istniejących rekordów lub gdy inny rekord stanie się rekordem bieżącym. Można również określić, w jaki sposób dany formularz ma się pojawić na ekranie, i co ma się stać w momencie zamknięcia tego formularza. Możesz również zarządzać problemami, które powstaną, gdy dane nie są udostępnione. Podczas projektowania własnych formularzy z pewnością zauważysz, że niektóre zdarzenia są bardzo często używane, natomiast inne dosyć rzadko. Następujące zagadnienia pokazują liczne praktyczne przykłady procedur obsługi zdarzeń, które możesz sporządzić dla swoich formularzy.
Zdarzenia dotyczące danych (Data Events)
Zdarzenia dotyczące danych zachodzą przy zmianie danych w obiekcie kontrolnym lub w rekordzie umieszczonym w formularzu albo przy przesunięciu fokusu z jednego rekordu na inny rekord.
Nazwa zdarzenia Si^^^B^HK |
Przy bieżącym (Current) |
Opis zdarzenia |
Przykład 1 |
Zdarzenie Przy bieżącym (Current) |
Private Sub Form_Current() |
zachodzi podczas otwierania formularza |
If Wycofany = True Then |
lub odświeżania danych znajdujących się |
Me.Section(1).BackColor = 255 |
w formularzu oraz przy uruchamianiu |
Me.Picture = "" |
innego rekordu. |
Else |
Używaj tego zdarzenia do synchronizacji |
Me.Picture="C:\Program Files\"&_ |
danych pomiędzy formularzami lub przy |
"Microsoft Office\Office\" & _ |
przemieszczaniu się do określonego ele- |
"Bitmaps\Styles\Stone.bmp" |
mentu formularza. |
End If |
|
End Sub |
566
Programowanie w Access 20
P rzykład 1 - Wypróbuj to sam: Otwórz w trybie edycji formularz Produkt w bazie danych NWIND. Wpisz pokazaną powyżej procedurę obsługi zdarzeń Form_current ( ). Zadaniem tej procedury jest zmiana tła nagłówka formularza (Se ej a 1) na czerwony kolor (255) dla każdego wycofanego produktu. Zdarzeń Form_current zachodzi za każdym razem, gdy uruchomisz inny rekord w formularz
Nazwa zdarzenia
Przed wstawieniem (Beforelnsert)
Opis zdarzenia
Przykład 2
Z darzenie Przed wstawieniem zachodzi przy wpisywaniu pierwszego znaku w nowym rekordzie, przed utworzeniem nowego rekordu. Używaj tego zdarzenia przy sprawdzaniu poprawności wprowadzanych danych lub w celu wyświetlenia informacji o nowo wprowadzanych danych. Za pomocą tego zdarzenia możesz umieścić wartości wyjściowe w polach danego rekordu w trakcie wykonywania programu. Zdarzenie to można anulować, jeżeli wprowadzane dane są niezgodne z ustalonymi regułami poprawności.
Private Sub Form__Bef orelnsert (Cancel As
Integer)
Me.Kraj = "Poljika" End Sub
P rzykład 2 - Wypróbuj to sam: Skorzystaj z kreatora formularzy w celu sporządzenia nowego formularza na podstawie tabeli Klienci w bazie danych NWIND, Wybierz następujące pola: IDklienta, NazwaFirmy, Adres, Miasto, Region, Kod-i Pocztowy oraz Kraj. Zachowaj nowy formularz pod nazwą „Nowi klienci". Otwórz formularz w trybie edycji, kliknij na pasek tytułu formularza i uruchom okno właści-1 wości. Na zakładce Dane zmień właściwość wprowadzanie danych na Tak. Kliknij pole tekstu idklienta na formularzu i ustaw na zakładce Dane właściwość Włączony i (Enabled) dla tego pola na Nie. W oknie Kod programu wpisz pokazaną powyżej procedurę Form_Bef oreinsert. Zapisz zmiany wprowadzone w formularzu Nowi klienci i otwórz formularz w trybie Widoku. Pole IDklienta powinno być unieru-1 chomione. Po wpisaniu pierwszego znaku w polu NazwaFirmy w polu Kraj automatycznie pojawi się tekst „Polska".
Programowanie zdarzeń w formularzach i raportach
567
Nazwa zdarzenia ^^^H| |
Po wstawieniu (Po wstawieniu) |
Opis zdarzenia |
Przykład 3 |
Zdarzenie Af terlnsert zacho- |
Private Sub Form_Afterlnsert0 |
dzi przy dodawaniu nowego |
Dim conn As New ADODB.Connection |
rekordu. Używaj tego zdarzenia |
Dim rst As New ADODB.Recordset |
w celu odświeżenia zestawu |
Set conn = CurrentProject.Connection |
rekordów po dodaniu nowego |
rst.CursorType = adOpenKeyset |
rekordu lub do wyświetlenia |
rst.Open "Klienci", conn |
innych informacji. |
MsgBox "Dodano " & rst .RecordCount & _ |
|
" -ego klienta." |
|
rst.Close |
|
Set rst = Nothing |
|
conn.CloseSet conn = Nothing |
|
End Sub |
Przykład 3 - Wypróbuj to sam: Skorzystaj z formularza Nowi klienci, który sporządziłeś w przykładzie 2. W oknie Kod programu wpisz pokazaną powyżej procedurę Form_Af terlnsert. Procedura ta podaje całkowitą liczbę rekordów w tabeli Klienci po dodaniu nowego rekordu.
N azwa zdarzenia
Przed aktualizacją (BeforeUpdate)
Opis zdarzenia
Przykład 4
Z darzenie Przed aktualizacją zachodzi po zmodyfikowaniu rekordu, przed zapisaniem tego rekordu w tabeli. Zdarzenie to zostanie spowodowane przejściem do innego rekordu lub próbą zachowania bieżącego rekordu. Zdarzenie to zachodzi po zdarzeniu Przed wstawieniem (Beforeln-sert). Używaj zdarzenia Przed aktualizacją (Before Update), aby sprawdzić cały rekord i wyświetlić komunikat proszący o potwierdzenie wprowadzonych zmian. Zdarzenie to można anlu-
Private Sub Form_BeforeUpdate(Cancel As
Integer)
If Not IsNull(Me.NazwaFirmy) Then Me.IDklienta = Left(NazwaFirmy,3)&_
Right(NazwaFirmy, 2) MsgBox "Dodałeś właśnie klienta Nr: "&_
Me..Idklienta Else
MsgBox "Wpisz nazwę firmy.", vbOKOnly, "Brakuje danych" Me.NazwaFirmy.SetFocus Cancel = True End If End Sub
568
Programowanie w Access 2
l ować, jeżeli wprowadzone dane nie mogą być z jakiegoś powodu zaakceptowane.
P rzykład 4 - Wypróbuj to sam: Skorzystaj z formularza Nowi klienci, kt< sporządziłeś w przykładzie 2. W oknie Kod programu wpisz przedstawioną powy procedurę obsługi zdarzenia Form_BeforeUpdate. Procedura ta wpisze odpowiedi wartość w polu iDpracownika przed zachowaniem nowego rekordu w pamięci.
Nazwa zdarzenia
Po aktualizacji (AfterUpdate)
Opis zdarzenia
Przykład 5
Z darzenie Po aktualizacji zachodzi po zachowaniu zmian w danym rekordzie. Zdarzenie to jest również wywołane przy utracie fokusu przez element kontrolny formularza i po zmianie danych w elemencie kontrolnym. Używaj zdarzenia Po aktualizacji w celu modyfikacji danych w elementach kontrolnych formularza oraz przy przemieszczaniu się do innego rekordu lub elementu formularza.
Private Sub Form_AfterUpdate() Dim fso As FileSystemObject Dim myFile As Object On Error Resume Next Set fso = CreateObject
("Scripting.FilesysteinObject") Set myFile = fso.GetFile
("C: \MoiKlienci.txt") If Err.Numbsr = 0 Then ' otwórz plik tekstowy Set myFile = fso.openTextFile
("C:\MoiKlienci.txt", 8) Else
'sporządź plik tekstowy
Set myFile = fso .createTextFile
("C: \MoiKlienci.txt") End If
myFile.writoLine UCase(Me.IDklienta)i_ " Data utworzenia:"&Date &""&Time myFile.Closi3 End Sub
P rzykład 5 - Wypróbuj to sam: Skorzystaj z formularza Nowi klienci, kt sporządziłeś w przykładzie 2. W oknie Kod progi amu wpisz przedstawioną powy procedurę zdarzenia Form_AfterUpdate. Procedura ta zachowuje informacj o wszystkich nowo dodanych rekordach (zob. rysunek poniżej). Aby procedura ta m gła działać, należy ustawić odwołanie do biblioteki Microsoft Scripting RuntiiJ w oknie dialogowym Odwołania (Wybierz Narzędzia => Odwołania w oknie edyj
Programowanie zdarzeń w formularzach i raportach
569
r a Visual Basic). Procedura najpierw sprawdza, czy na dysku komputera istnieje już plik o nazwie C:\MoiKlienci.txt. Jeżeli plik ten istnieje, polecenie Err .Number zwraca zero. Jeżeli takiego pliku nie ma, procedura go utworzy. Istniejący plik zostanie otwarty w celu dodania nowych danych („8" reprezentuje tryb dodawania danych). Jeżeli chcesz zastąpić zawartość pliku nowymi danymi, zamiast wartości „8" użyj „2".
- Notepad
.-.Inlxi
File Edit Format Help
J3ARLA Y
&.LKO Data utworzenia:2002-01-20
Nazwa zdarzenia H^^| |
Przy buforowaniu (Dirty) |
Opis zdarzenia |
Przykład 6 |
Zdarzenie Przy buforowa- |
Private Sub Form_Dirty(Cancel As Integer) |
niu zachodzi przy zmianie |
If IDkategorii <= 8 Then |
zawartości formularza lub |
MsgBox "Nie jesteś autoryzowany do |
tekstu w polu kombi. Zdarze- |
wprowadzania zmian. " |
nie to będzie wywołane próbą |
Cancel = True |
wpisania dowolnego znaku |
End If |
w polu tekstu umieszczonym |
End Sub |
w formularzu lub w polu |
|
kombi. Używaj tego zdarze- |
|
nia, aby sprawdzić, czy dany |
|
rekord można zmodyfikować. |
|
Przykład 6 - Wypróbuj to sam: Aby wypróbować ten przykład, potrzebny jest formularz KategorieProduktu (zob. przykład 7 dotyczący sporządzenia tego formularza). W oknie Kod programu wpisz pokazaną powyżej procedurę zdarzenia Form_Dirty. Otwórz tabelę KategorieProduktu i spróbuj wprowadzić zmiany w oryginalnych rekordach. Nie będziesz mógł zmienić danych, jeżeli identyfikator w polu idkategorii jest mniejszy lub równy 8.
570
Programowanie w Access 2000
Nazwa zdarzenia ■HHB |
Przy usunięciu (Delete) |
|
Opis zdarzenia |
Przykład 7 |
|
To zdarzenie zachodzi podczas |
Private Sub Form_Delete(Cancel As Integer) |
|
zaznaczania jednego lub więcej |
If IDkategorii <= 8 Then |
|
rekordów do usunięcia, zanim |
MsgBox "Nie można wymazać |
|
rekordy te zostaną usunięte |
orygi |
nalnych kategorii." |
z tabeli bazy danych. Używaj |
Cancel = True |
|
tego zdarzenia w celu zdefinio- |
Else |
! |
wania ograniczeń dotyczących |
If MsgBox("Czy |
naprawdę chcesz wymazać"s |
danych, które mogą być usu- |
" ten rekord?", |
vbOKCancel, |
nięte. Przy usuwaniu zespołu |
"Potwierdzenie |
Wymazania") = vbCancel Then I |
rekordów zdarzenie Delete |
Cancel = True |
|
zachodzi dla każdego rekordu. |
End If |
|
Możesz anulować proces usu- |
End If |
1 |
wania albo w procedurze zda- |
End Sub |
|
rzenia Przy usunięciu(De- |
|
1 |
lete), albo w procedurze obsługi |
|
|
zdarzenia Przed usunięciem |
|
|
(BeforeDelConfirm), ustawiając |
|
|
argument Cancel na True. |
|
j |
Przykład 7 - Wypróbuj to sam: Sporządź formularz KategorieProduktu nal podstawie tabeli Kategorie w bazie danych NWIND. Skorzystaj z kreatora formula-1 rzy, wybierając opcję Kolumnowy. W oknie Kod programu wpisz pokaźną powyżej procedurę obsługi zdarzenia Form_Deiete. Otwórz formularz w trybie Widoku i kliknij na selektor rekordu. Naciśnij klawisz Delete. Powinieneś zobaczyć komunikat mówiący, że nie można usunąć oryginalnych kategorii. Następnie dodaj nową! tegorię produktu i spróbuj ją usunąć. Jeżeli procedura obsługi zdarzę Form_Before- Delconfirm (zob. przykład 8) nie zawiera żadnego kodu, będzie poproszony dwa razy o potwierdzenia operacji usuwania.
Programowanie zdarzeń w formularzach i raportach
571
Nazwa zdarzenia ^^^|^^| |
Przed usunięciem (BeforeDelConfirm) |
Opis zdarzenia |
Przykład 8 |
Zdarzenie Przed usunięciem |
Private Sub Form_BeforeDelConfirm(Cancel _ |
zachodzi po zdarzeniu Przy usu- |
As Integer, Response As Integer) |
nięciu (Delete), zanim pojawi się |
Response = acDataErrcontinue |
na ekranie pole dialogowe proszące |
End Sub |
o potwierdzenie usuwania. Jeżeli nie |
|
sporządzisz własnej procedury ob- |
|
stugi zdarzenia Przed usunię- |
|
ciem, to Access wyświetli standar- |
|
dowy komunikat proszący |
|
o potwierdzenie operacji usuwanie |
|
rekordów. Użyj tego zdarzenia |
|
w celu sporządzenia własnego ko- |
|
munikatu potwierdzającego usunię- |
|
cie danych. |
|
Przykład 8 - Wypróbuj to sam: Skorzystaj z formularza KategorieProduktu, który sporządziłeś w przykładzie 7. W oknie Kod programu wpisz przedstawioną powyżej procedurę zdarzenia Form_BeforeDelConfirm. Otwórz formularz KategorieProduktu w trybie Widoku, dodaj dwa nowe rekordy, następnie usuń jeden z nowo wprowadzonych rekordów.
Polecenie Response = acDataErrcontinue umieszczone wewnątrz procedury obsługi zdarzenia Form_BeforeDeiconfirm spowoduje anulowanie standardowego okna komunikatu proszącego o potwierdzenie operacji usuwania rekordów, które Microsoft Access zwykle wyświetla.
Nazwa zdarzenia StaB |
Po usunięciu (AfterDelConfirm) |
Opis zdarzenia |
Przykład 9 |
Zdarzenie Po usunięciu |
Private Sub Form_AfterDelConfirm(Status As Integer) |
zachodzi po usunięciu re- |
MsgBox "Usunięto zaznaczone rekordy." |
kordu. Skorzystaj |
End Sub |
z procedury zdarzenia Po |
|
usunięciu, aby przejść do |
|
innego rekordu lub w celu |
|
wyświetlenia komunikatu |
|
572
Programowanie w Access 2000
i nformującego użytkownika o pomyślności lub zaniechaniu operacji usuwania jednego lub więcej rekordów.
Przykład 9 - Wypróbuj to sam: Skorzystaj z formularza KategorieProduktuJ który sporządziłeś w przykładzie 7. W oknie Kod programu wpisz przedstawioną; powyżej procedurę obsługi zdarzenia Form_AfterDeiconfirm. Otwórz formularz Ka-j tegorieProduktu w trybie Widoku i dodaj dwa nowe rekordy, następnie i usuń jeden z nowo wprowadzonych rekordów. Zamiast standardowego okna komunikatu, której Access zwykle wyświetla przy usuwaniu rekordów, pojawia się teraz przygotowany przez ciebie komunikat.
Zdarzenia związane z oknami (Window Events)
Zdarzenia związane z oknami zachodzą podczas otwierania, zamykania oraz] zmiany rozmiaru formularza.
Nazwa zdarzenia 1H8H |
Przy otwarciu (Open) |
|
|
Opis zdarzenia |
Przykład 10 |
'IB |
|
Zdarzenie Przy otwarciu |
Private Sub Form_Opsn(Cancel As Integer) |
||
zachodzi podczas otwierania |
Dim takNie As Integer |
||
formularza, tuż przed wy- |
takNie = MsgBox("Czy chcesz oglądać ten |
||
świetleniem pierwszego re- |
formularz " & |
||
kordu. Skorzystaj z tego zda- |
"na pełnym ekranie:", vbYesNo + vbQuestion, |
||
rzenia, aby poprosić użyt- |
"Window Size") |
||
kownika o dodatkowe infor- |
If takNie = vbNo Then |
||
macje lub otworzyć dodatko- |
DoCmd.Restore |
|
|
we formularze. Zdarzenie to |
SendKeys "%od" |
|
|
można anulować. Zdarzenie |
Else |
|
|
Przy otwarciu nie zacho- |
DoCmd.Maximize |
|
|
dzi w formularzu, który został |
End If |
|
|
już otwarty. |
End Sub |
__J |
Przykład 10 - Wypróbuj to sam: Skorzystaj z formularza KategorieProduktu, który sporządziłeś w przykładzie 7. W oknie Kod programu wpisz pokazaną powyżej procedurę obsługi zdarzenia Form_open. Po otwarciu formularza pojawi się komunikat
Programowanie zdarzeń w formularzach i raportach
573
z zapytaniem, czy chcesz oglądać dany formularz na pełnym ekranie. Jeżeli odpowiesz negatywnie, okno zostanie dopasowane do rozmiaru formularza. Polecenie sendKeys "Sod" spowoduje wybranie opcji Dopasuj do rozmiaru formularza z menu Okno. Znak % reprezentuje klawisz Alt. Litera „o" poleca otwarcie menu Okno, a litera „d" wybiera opcję Dopasuj do rozmiaru formularza w tym menu.
Nazwa zdarzenia
Przy załadowaniu (Load)
Opis zdarzenia
Przykładll
Private
Sub Form_Load() With
Me.IDdostawcy .SetFocus
.Dropdown
End
With End Sub
Zdarzenie
Przy załadowaniu
zachodzi podczas otwierania
formularza, gdy wyświetlony jest pierwszy
rekord. Zdarzenie to następuje po zdarzeniu Przy
otwarciu. Jeżeli formularz zawiera podfor-mularz,
Access właduje podformularz przed włado-waniem
formularza głównego. Zdarzenie
Przy załadowaniu dla głównego formularza
zachodzi dopiero po władowaniu podfor-mularza i uaktywnieniu
pierwszego elementu kontrolnego
podformularza.
Używaj tego zdarzenia, aby odwołać się do zawartości elementów kontrolnych formularza.
P rzykład 11 - Wypróbuj to sam: Skorzystaj z formularza Products w bazie danych NWIND. W oknie Kod programu wpisz przedstawioną powyżej procedurę zdarzenia Form_Load. Procedura ta spowoduje automatyczne otwarcie pola kombi o nazwie IDdostawcy w momencie otwarcia formularza.
J
Nazwa zdarzenia ^^^^^^^^^^^u |
y zmianie rozmiaru (Resize) |
Opis zdarzenia |
Przykład 12 |
Zdarzenie Przy zmianie rozmiaru zacho- |
Private Sub Form_Resize() |
dzi, gdy zmienimy rozmiar otwartego for- |
Dim w As Single |
mularza. Możesz stosować to zdarzenie, aby |
Dim s As Single |
zmienić rozmiar przycisków kontrolnych |
w = Me.WindowHeight |
w zależności od rozmiaru formularza. |
s = Me.WindowWidth |
|
Debug.Print "Wysokość: =" & w |
|
Debug.Print "Szerokość: =" & s |
|
End Sub |
574
Programowanie w Access 2000
P rzykład 12 - Wypróbuj to sam: Skorzystaj z formularza KategorieProduktJ w bazie danych NWIND. W oknie Kod programu wpisz przedstawioną powyżej procedurę zdarzenia Form_Resize. Po otwarciu formularza KategorieProduktu zostanie wywołana procedura zdarzenia Przy otwarciu (zob. przykład 10). Kliknij „Nie", gdy pojawi się komunikat pytający o wyświetlenie formularza w postaci zmaksymalizo-wanej. Uruchom ekran edytora Visual Basic oraz okno Instrukcje bezpośrednie. Zwróć uwagę, że polecenie DoCmd. Restore w procedurze obsługi zdarzenia Form_open spowodowało uruchomienie procedury zdarzenia Form_Resize i rozmiar formularza podany jest w oknie Instrukcje bezpośrednie. Uruchom teraz widok formularza i za pomocą myszy zmień wysokość formularza. Przeciąganie myszy spowoduje wywołanie procedury obsługi zdarzenia Form_Resize i nowe rozmiary formularza zostaną zarejestrowane w oknie Instrukcje bezpośrednie.
Nazwa zdarzenia
Przy zwolnieniu (Unload)
Opis zdarzenia
Przykład 13
i
Zdarzenie Przy zwolnieniu zachodzi przy próbie zamknięcia formularza, zanim formularz zostanie usunięty z ekranu. Jeżeli formularz zawiera podfor-mularz, to główny formularz jest rozładowany i zamknięty przed zamknięciem podformularza. Po zdarzeniu Przy zwolnieniu zachodzi zdarzenie Przy zamknięciu. Skorzystaj ze zdarzenia Przy zwolnieniu do przeprowadzenia tych operacji, które należy wykonać przed zamknięciem formularza.
Private Sub Form_Unload(Cancel As Integer) If MsgBox("Czy jesteś pewien, że chcesz zamknąć "ten formularz?", vMesNol = vbYes Then Exit Sub Else
Cancel = True End If End Sub
P rzykład 13 - Wypróbuj to sam: Skorzystaj z formularza Produkty w ba: danych NWIND. W oknie Kod programu wpisz przedstawioną powyżej procedu obsługi zdarzenia Form_unload. Zdarzenie to zostanie wywołane, gdy użytków opuści formularz, klikając na pole kontrolne lub naciskając klawisze Ctrl+F4.
Programowanie zdarzeń w formularzach i raportach
575
Nazwa zdarzenia MSjjfiij |
Przy zamknięciu (Close) |
Opis zdarzenia |
Przykład 14 |
Zdarzenie Przy zamknięciu |
Private Sub Form_Close() |
zachodzi w trakcie zamykania |
If Application.CurrentProject. _ |
formularza i usuwania go |
AliReports("Alfabetyczna lista produktów")._ |
i ekranu. Zdarzenie to zachodzi |
IsLoaded Then |
po zdarzeniu Przy zwolnie- |
DoCmd.Close acReport, _ |
niu (Unload) i często jest sto- |
"Alfabetyczna lista produktów " |
sowane do zamykania dodatko- |
End If |
wych formularzy, które jeszcze |
End Sub |
mogą być otwarte. Zdarzenia |
|
i Przy zamknięciu nie można |
|
anulować. L—.—. |
|
Przykład 14 - Wypróbuj to sam: Skorzystaj z formularza Produkty w bazie danych NWIND. W oknie Kod programu wpisz przedstawioną powyżej procedurę Form_close. Następnie otwórz formularz Produkty w trybie Widoku i kłiknij przycisk Podgląd listy produktów. Kiedy otworzy się raport, uaktywnij ponownie formularz Produkty i kliknij na pole kontrolne, aby zamknąć ten formularz. W tym rno-memcie będziesz poproszony o potwierdzenie operacji zamykania formularza, gdyż formularz ten posiada procedurę obsługi zdarzenia Form_unload (zob. przykład 13). Po kliknięciu na przycisk Tak w polu komunikatu wywołane zostanie zdarzenie Form_ciose. Kod procedury poleca zamknięcie raportu o nazwie „Alfabetyczna lista produktów", jeżeli jest on władowany. Obiekt CurrentProject oraz zbiór AliReports są. nowymi obiektami w Accessie 2000. Możesz skorzystać z właściwości isLoa-ded, aby sprawdzić, czy dany obiekt AccessObject jest w danej chwili władowany. Obiekt AccessObject odnosi się do określonego obiektu Microsoft Access wchodzącego w skład jednego z następujących zbiorów: AiiForms (wszystkie formularze), AliReports (wszystkie raporty), AiiMacros (wszystkie makra), AilModuies (wszystkie moduły), AilTables (wszystkie tabele), AiiQueries (wszystkie kwerendy), ai-iviews (wszystkie widoki), AllDataAccessPages (wszystkie strony dostępu do danych), AlistoredProcedures (wszystkie procedury przechowywane) oraz AliData-baseDiagrams (wszystkie diagramy).
J
576
Programowanie w Access 2000
Z darzenia związane z uzyskaniem lub utratą fokusu (Focus Events)
Zdarzenia typu fokus występują, gdy dany formularz jest uaktywniony lub traci fokus oraz gdy formularz lub formant w nim umieszczony traci lub zyskuje fokus.
Nazwa zdarzenia BHHHHH |
Przy aktywowaniu (Activate) |
|
Opis zdarzenia |
Przykład 15 |
|
Zdarzenie Przy aktywowaniu zacho- |
Private Sub Fo |
rm_Activate() |
dzi, gdy formularz jest uaktywniony |
Me.TabCtlO |
.Pages(1).Visible = False |
i staje się bieżącym oknem. Sytuacja ta |
End Sub |
|
zachodzi podczas otwierania formula- |
|
|
rza po raz pierwszy i gdy użytkownik |
|
|
uaktywnia formularz ponownie, klika- |
|
|
jąc on formularz lub jego formant. Sko- |
|
|
rzystaj z tego zdarzenia, aby wyświetlić |
|
|
lub ukryć dodatkowe formularze lub |
|
|
paski narzędzi. |
|
|
|
|
Przykład 15 - Wypróbuj to sam: Skorzystaj z formularza Pracownicy w bazie danych NWIND. W oknie Kod programu wpisz pokaźną powyżej procedurę obsługi i zdarzenia Form_Activate. Kod tej procedury spowoduje ukrycie zakładki o nazwie „Informacje personalne" w momencie wyświetlenia formularza na ekranie. Zwróć uwagę, że zakładki są numerowane od zera (0), stąd druga zakładka w formularzu ma indeks o wartości 1.
Nazwa zdarzenia
Przy dezaktywowaniu (Deactivate)
Opis zdarzenia
Przykład 16
Z darzenie Przy dezakty-wowaniu zachodzi, gdy użytkownik uruchamia inny formularz lub zamyka formularz. Stosuj to zdarzenie, aby wyświetlić lub ukryć dodatkowe formularze lub paski narzędzi.
Private Sub Form_Deactivate()
DoCmd.ShowToolbar "Erint Preview", acToolbarYes End Sub
Programowanie zdarzeń w formularzach i raportach
577
P rzykład 16 - Wypróbuj to sam: Skorzystaj z formularza Dostawcy w bazie danych NWIND. W oknie Kod programu wpisz pokaźną powyżej procedurę obsługi zdarzenia Form_Deactivate. Procedura ta spowoduje wyświetlenie paska narzędzi Podgląd wydruku (Print Preview) przy uruchomieniu innego okna.
N azwa zdarzenia
Przy uzyskaniu fokusu (GotFocus)
Opis zdarzenia |
|
Przykład 17 |
Zdarzenie Przy uzyskaniu fokusu za- |
Private |
Sub Form_GotFocus() |
chodzi, gdy formularz uzyskuje fokus, pod |
Me.NazwaFirmy.Visible = True |
|
warunkiem że w formularzu nie ma wi- |
Me.NazwaFirmy.SetFocus |
|
docznych lub aktywnych formantów. Zda- |
End Sub |
|
rzenie to jest najczęściej stosowane dla |
|
|
formantów umieszczonych w formularzu, |
Private |
Sub Form_Activate() |
natomiast rzadko dla samego formularza. |
Dim |
c As Control |
|
For |
Each c In Me.Controls |
|
|
c.Visible = False |
|
Next |
|
|
End Sub |
|
Przykład 17 - Wypróbuj to sam: Skorzystaj z formularza Klienci w bazie danych NWIND. W oknie Kod programu wpisz kod procedur podanych powyżej (Form_GotFocus oraz Form_Activate). Ponieważ zdarzenie GotFocus może zajść jedynie, gdy żaden inny formant formularza nie jest uaktywniony, kod procedury Form_Activate ukrywa wszystkie formanty. Czynność ta spowoduje uruchomienie procedury obsługi zdarzenia GotFocus. Kod znajdujący się w tej procedurze uwidoczni ukryte pole tekstu NazwaFirmy i uaktywni je.
J
N azwa zdarzenia
Przy utracie fokusu (LostFocus)
O pis zdarzenia
Zdarzenie Przy utracie fokusu zachodzi, gdy formularz przestanie być aktywny, pod warunkiem że w formularzu tym nie ma widocznych lub aktywnych formantów. Zdarzenie to jest najczęściej stosowane dla Formantów umieszczonych w formularzu, natomiast rzadko dla samego formularza.
578
Programowanie w Access 2000
Zdarzenia związane z posługiwaniem się myszą (Mouse Events)
Zdarzenia te zachodzą przy przesuwaniu myszy lub korzystaniu z jej przycisków.
N azwa zdarzenia
Przy Klikni ciu (Click)
Opis zdarzenia
Przekład 18
Z darzenie to zachodzi przy kliknięciu przycisku myszy na pustym obszarze formularza lub selektorze rekordu albo na formancie znajdującym się w formularzu.
Private Sub Form_Click()
MsgBox "Zaszła procedura zdarzenia Przy kliknięciu.
Me.TekstO.Left = TekstO.Left + 567 End Sub
P rzykład 18 - Wypróbuj to sam: Sporządź nowy formularz i wprowadź wninJ dwa pola tekstu. Umieść oba pola jedno po drugim w pozycji 2 centymetrów na po-1 ziomej linijce. W oknie Kod programu wpisz pokazaną powyżej procedurę obsługi zdarzenia Form_click. Otwórz formularz w trybie Widoku i kliknij selektor rekordu. Po kliknięciu Tak w odpowiedzi na komunikat pierwsze pole tekstu przesunie siej 1 cm w prawą stronę. Wielkość ekranu mierzona jest w jednostkach miary określanych terminem twip. Na centymetr przypada 567 twipów (1/120 punktu), natomiast] w jednym calu znajduje się 1440 twipów.
N azwa zdarzenia
Przy kliknięciu dwukrotnym (DblClick)
Opis zdarzenia
Zdarzenie Przy kliknięciu dwukrotnym zachodzi po dwukrotnym kliknięciu pustego obszaru formularza lub kliknięciu na selektor rekordu, lub na formant znajdujący się w formularzu.
Programowanie zdarzeń w formularzach i raportach
579
N azwa zdarzenia
Przy naciśniętej myszy (MouseDown)
Opis zdarzenia |
|
Przykład 19 |
Zdarzenie Przy naciśniętej my- |
Private Sub Form_MouseDown(Button As Integer, _ |
|
szy zachodzi po kliknięciu na |
|
Shift As Integer, _ |
pusty obszar formularza lub na |
|
X As Single, _ |
selektor rekordu, lub na formant |
|
Y As Single) |
umieszczony w formularzu. Zda- |
Debug.Print "Zdarzenie Mouse Down" |
|
rzenie to zachodzi przed proce- |
Select Case Shift |
|
durą zdarzenia Przy kliknię- |
Case 0 |
|
ciu (Click). Zdarzenie Przy |
MsgBox |
"Nie nacisnąłeś żadnego klawisza." |
naciśniętej myszy przyjmuje |
Case 1 ' |
lub acShiftMask |
cztery argumenty: |
MsgBox |
"Nacisnąłeś SHIFT." |
Button - określa stan przyci- |
Case 2 ' |
lub acCtrlMask |
sków myszy. Skorzystaj ze stałej |
MsgBox |
"Nacisnąłeś CTRL." |
acLef tButton, aby sprawdzić |
Case 3 |
|
lewy przycisk myszy, ze stałej |
MsgBox |
"Nacisnąłeś CTRL oraz SHIFT." |
acRightButton, aby sprawdzić |
Case 4 ' |
lub acAltMask |
prawy przycisk myszy, oraz ze |
MsgBox |
"Nacisnąłeś ALT." |
stałej acMiddleButton, aby |
Case 5 |
|
sprawdzić, czy użytkownik naci- |
MsgBox |
"Nacisnąłeś ALT oraz SHIFT." |
snął środkowy przycisk myszy. |
Case 6 |
|
Shift - określa stan klawiszy |
MsgBox |
"Nacisnąłeś CTRL oraz ALT." |
Shift oraz Alt, gdy przycisk |
Case 7 |
|
wskazany przez argument But- |
MsgBox |
"Nacisnąłeś CTRL, ALT oraz SHIFT." |
ton został wciśnięty lub zwol- |
End Select |
|
niony. Skorzystaj ze stałej acS- |
If Buttor |
i = 1 Then ' acLeftButton |
hiftMask, aby sprawdzić, czy |
MsgBox |
"Nacisnąłeś lewy przycisk myszy." |
klawisz Shift został naciśnięty. |
Elself Button = 2 Then 'acRightButton |
|
Stała acCtrlMask sprawdza |
MsgBox |
"Nacisnąłeś prawy przycisk myszy." |
klawisz Ctrl, natomiast stała |
Elself Button = 4 Then 'acMiddleButton |
|
acAltMask pozwala wykryć |
MsgBox |
"Nacisnąłeś środkowy przycisk myszy." |
użycie klawisza Alt. |
End If |
|
Argumenty X, Y - określają |
End Sub |
|
poziomą (x) i pionową (y) pozy- |
|
|
cję od lewego górnego rogu |
|
|
formularza lub formantu. |
|
|
580
Programowanie w Access 2000
P rzykład 19 - Wypróbuj to sam: Sporządź formularz Produkty2 oparty nata-l beli Produkty w bazie danych NWIND. W oknie Kod programu wpisz przedstawioną powyżej procedurę obsługi zdarzenia Form_MouseDown. Uaktywnij następnie for-1 mularz w trybie Widoku i kliknij selektor rekordu, jednocześnie przytrzymując do-1 wolny przycisk myszy i naciskając dowolny klawisz Alt, Ctrl lub Shift. W trakcie uruchomienia procedury obsługi zdarzenia Przy naciśniętej myszy (MouseDown) I zobaczysz dwa komunikaty; pierwszy z nich poinformuje, który z klawiszy (Alt, Ctrl I lub Shift) nacisnąłeś. Drugi komunikat oznajmi, który przycisk myszy (lewy, środko-f wy czy prawy) został użyty.
Przy ruchu myszy (MouseMove)
Zdarzenie Przy ruchu myszy zachodzi podczas przesuwania myszy po pustym obszarze formularza lub na obszarze selektora rekordu albo nad formantem umieszczonym w formularzu. Zdarzenie to zachodzi przed zdarzeniem Przy kliknięciu (Click) i przyjmuje te same argumenty co omówione powyżej zdarzenie Przy naciśniętej myszy (MouseDown).
N azwa zdarzenia
Przy zwolnionej myszy (MouseUp)
Opis zdarzenia
Zdarzenie Przy zwolnionej myszy zachodzi po zwolnieniu przycisku myszy. Zdarzenie to zachodzi przed zdarzeniem Przy kliknięciu (Click) i przyjmuje te same argumenty co zdarzenia Przy naciśniętej myszy (MouseDown) oraz Przy ruchu myszy (MouseMove).
Z darzenia związane z użyciem klawiatury (Keyboard Events)
Zdarzenia klawiaturowe mogą być wywołane przez naciśnięcie dowolnego 1 wiszą na klawiaturze lub przesłaniu naciśnięcia klawisza za pośrednictwem metol SendKeys.
■i ■
Programowanie zdarzeń w formularzach i raportach
581
N azwa zdarzenia
Przy naciśnięciu klawisza (KeyDown)
Opis zdarzenia |
Przykład 20 |
Zdarzenie Przy naciśnięciu |
Private Sub Form_KeyDown(KeyCode As Integer, _ |
klawisza zachodzi, gdy formu- |
Shift As Integer) |
larz nie zawiera przycisków lub |
Select Case KeyCode |
gdy właściwość KeyPreview |
Case vbKeyFl |
formularza ustawiona jest na |
MsgBox "Nacisnąłeś klawisz Fl." |
Tak. Zdarzenie to przyjmuje dwa |
Case vbKeyHome |
argumenty. Argument KeyCode |
MsgBox "Nacisnąłeś klawisz Home." |
określa, który klawisz został |
Case vbKeyTab |
wciśnięty, natomiast argument |
MsgBox "Nacisnąłeś klawisz Tab." |
Shift pozwala wykryć naci- |
End Select |
śnięcie klawiszy Shift, Ctrl lub |
Select Case Shift |
Alt. |
Case acShiftMask |
|
MsgBox " Nacisnąłeś klawisz SHIFT." |
|
Case acCtrlMask |
|
MsgBox " Nacisnąłeś klawisz CTRL." |
|
Case acAltMask |
|
MsgBox " Nacisnąłeś klawisz ALT." |
|
End Select |
|
End Sub |
Przykład 20 - Wypróbuj to sam: Skorzystaj z formularza Dostawcy w bazie danych NWIND. W oknie Kod programu wpisz pokazaną powyżej procedurę obsługi zdarzenia Form_KeyDown. Na zakładce Zdarzenia w oknie właściwości formularza ustaw właściwość Podgląd klawisza na Tak. Na zakładce Format w tym samym oknie Właściwości ustaw właściwość Selektory rekordów na Tak. Następnie uruchom formularz Dostawcy w trybie Widoku i naciśnij klawisze wymienione w procedurze podanej powyżej. Procedura ta wyświetli komunikat po naciśnięciu jednego z następujących klawiszy: Fl, Home, Tab, Shift, Ctrl lub Alt. Stałe określające klawisze można odszukać w Przeglądarce obiektów:
582
Programowanie w Access 2000
*ar Object Browser
(Access
I constants
" Search Results ■
L ibrary
■\ Access
Class
A cCommand OldConstants
Member
Q acCmdListConstants
( Classes
©
BoundObjectFrame
jjj
IS
CheckBox
&i
CodeData
gS
CodeProject
©
ComboBox
fS
ComrnandButton _jj
*śji
Constants |
■© Control IS! Controls
Members of Constants'
El vbKeyF5
SB vbKeyF6
a vbKeyF7
© vbKeyFS
E) vbKeyF9
O vbKeyG
El vbKeyH
m vbKeyHelp
El vbKeyHome
m vbKeyl
M odule Constants
Predefined constants
Nazwa zdarzenia
Przy zwolnieniu klawisza (KeyUp)
Opis zdarzenia
Przykład 21
Z darzenie Przy zwolnieniu klawisza zachodzi, gdy formularz nie zawiera przycisków lub gdy właściwość formularza o nazwie Podgląd klawisza (KeyPreview) ustawiona jest na Tak. Zdarzenie to można anulować, przypisując argumentowi KeyCode zero.
Private Sub Forn_KeyUp (KeyCode As Integer,
Shift As Integer)
Debug.Print "Zwolniłeś klawisz " s KeyCode & Speice(l) & " - "; Chr (KeyCode)
End Sub
Programowanie zdarzeń w formularzach i raportach
583
Przykład 21 - Wypróbuj to sam: Skorzystaj z formularza Dostawcy w bazie danych NWIND. W oknie Kod programu wpisz pokazaną powyżej procedurę obsługi zdarzenia Form_KeyUp. Procedura ta wpisze w oknie Instrukcje bezpośrednie kod oraz wartość zwolnionego klawisza.
N azwa zdarzenia
Przy naciśniętym klawiszu (KeyPress)
Opis zdarzenia
Przykład 22
Z darzenie Przy naciśniętym klawiszu zachodzi po naciśnięciu i zwolnieniu klawisza lub kombinacji klawiszy. Zdarzenie to zachodzi, gdy na formularzu nie ma przycisków albo gdy właściwość formularza o nazwie Podgląd klawisza (KeyPreview) ustawiona jest na Tak. Zdarzenie to reaguje tylko na znaki ANSI generowane przez klawiaturę. Zdarzenie Przy naciśniętym klawiszu można anulować, przypisując argumentowi KeyAscii wartość zerową.
Private Sub Form_KeyPress(KeyAscii As Integer)
Debug.Print "KeyAscii =" & KeyAscii & Spaced) & "= " & Chr (KeyAscii) If KeyAscii =27 Then
DoCmd.Close Else
KeyAscii = 0 End If End Sub
Przykład 22 - Wypróbuj to sam: Skorzystaj z formularza Dostawcy w bazie danych NWIND. W oknie Kod programu wpisz pokazaną powyżej procedurę obsługi zdarzenia Form_KeyPress. Aby ta procedura mogła działać, należy ustawić właściwość Podgląd klawisza (KeyPreview) na zakładce zdarzenie na Tak. Właściwość podgląd klawisza określa, czy zdarzenia klawiaturowe formularza zachodzą przed zdarzeniami klawiaturowymi przycisków umieszczonych w formularzu. Powyższa procedura wydrukuje w oknie Instrukcje bezpośrednie kod ASCII oraz wartość naciśniętego klawisza. Po naciśnięciu klawisza ucieczki (ESC) (KeyAscii 27) formularz zostanie zamknięty. Polecenie KeyAscii=o uniemożliwi wpisanie danych w jakimkolwiek polu formularza. Aby naciśnięcie klawiszy nie kontrolowało przycisków formularza, należy ustawić właściwość Podgląd klawisza na Tak.
Zdarzenia występujące przy błędzie (Error Events)
Jakikolwiek błąd wykonania spowodowany w interfejsie użytkownika w aplikacji Microsoft Access lub przez silnik bazy danych Microsoft Jet wywoła pro-
J
584 |
Programowanie w Access 2000 1 |
||||||
cedurę obsługi zdarzenia Przy błędzie (Error). Procedu |
ra obsługi zdarzenia Error nie 1 |
||||||
wykrywa błędów spowodowanych przez polecenia jęz; |
/ka Visual Basic for Applica- 1 |
||||||
tions. |
|
||||||
|
Nazwa zdarzenia ^S^nH^^^^^^^^gT""™?"_"' ~ |
e (Error) |
|
||||
|
|
Opis zdarzenia Przykład 23 |
|
||||
|
|
Zdarzenie Przy błędzie zachodzi, |
Private Sub Form_3rror(DataErr As Integer, |
|
|||
|
|
gdy zaistnieje problem z danymi |
Response As Integer) |
|
|||
|
|
wyświetlanymi przez dany formu- |
Const conDuplicateKey = 3022 |
|
|||
|
|
larz. Skorzystaj z tego zdarzenia, |
Dim strMsg As String |
|
|||
|
|
aby zastąpić standardowy komunikat |
Dim IDklienta As String |
|
|||
|
|
o błędzie własnym komunikatem. |
IDklienta = Me . ::dklienta |
|
|||
|
|
|
' Nie pokazuj wbudowanych komunikatów b3edUj |
|
|||
|
|
Zdarzenie Przy błędzie przyj- |
If DataErr = conDuplicateKey Then |
|
|||
|
|
muje dwa argumenty. DataErr jest |
Response =■ acDataErrContinue |
|
|||
|
|
kodem błędu, który zaistniał. Argu- |
' Pokai w3ć.sny komunikat b3edu |
|
|||
|
|
ment Response jest stałą, która |
strMsg = "Klient " & Idklienta & " |
|
|||
|
|
wskazuje, czy należy wyświetlić, |
jud istnieje." |
|
|||
|
|
czy też zaniechać standardowy ko- |
MsgBox stiMsg, vbCritical, "Duplikat" |
|
|||
|
munikat: |
End If |
|
|
|||
|
|
End Sub |
|
|
|||
• acDataErrContinue - igno- |
|
|
|
||||
|
ruje błąd i kontynuuje |
|
|
|
|||
|
wyświetlanie standardowego |
|
|
|
|||
|
komunikatu błędu zdefiniow- |
|
|
|
|||
|
anego w aplikacji Microsoft |
|
|
|
|||
|
Access. |
|
|
|
|||
|
• acDataErrDisplay - wy- |
|
|
|
|||
|
świetla standardowy komuni- |
|
|
|
|||
|
kat błędu Microsoft Access. |
|
|
|
|||
|
|
Jest to ustawienie wyściowe. |
|
|
|
Przykład 23 - Wypróbuj to sam: Sporządź formularz oparty na tabeli Klienci w bazie danych NWIND. Uaktywnij okno właściwości formularza i kliknij na zakładce Dane. Przypisz właściwości Wprowadzanie danych (DataEntry) wartość Tak. W oknie Kod programu wpisz pokazaną powyżej procedurę obsługi zdarzenia Form_Error. Uaktywnij formularz w trybie Widoku i wpisz ALFKI w polu iDkiien- i ta. Wpisz również nazwę firmy, gdyż wpis w tym polu jest obowiązkowy. Kliknij i selector rekordu. Procedura wyświetli komunikat przy próbie dodania nowego rekordu
' ■ -
Programowanie zdarzeń w formularzach i raportach
585
p osiadającego taki sam identyfikator jak istniejący już rekord. Zauważ, że zamiast standardowego komunikatu błędu, wyświetlony jest twój własny komunikat.
Zdarzenia zachodzące przy stosowaniu filtrów (Filter Events)
Zdarzenia związane z filtrami są wywołane w trakcie otwierania lub zamykania okna z filtrem lub przy wprowadzaniu lub usuwaniu filtra.
N azwa zdarzenia
Przy filtrowaniu (Filter)
Opis zdarzenia |
Przykład 24 |
Zdarzenie Przy filtrowaniu |
Private Sub Form_Filter(Cancel As Integer, _ |
zachodzi w czasie sporządzania |
FilterType As Integer) |
filtra, który ogranicza liczbę |
Select Case FilterType |
rekordów wyświetlonych |
Case acFilterByForm |
w formularzu na podstawie |
MsgBox "Wybrałeś fitrowanie rekordów " s |
podanych kryteriów. Zdarzenie |
"według formularza.", vbOKOnly + |
to zachodzi po wybraniu opcji |
vblnformation, _ |
Filtruj według formula- |
"Filtrowanie według formularza" |
rza (Filter By Form) lub Za- |
Me.NazwaKategorii.SetFocus |
awansowany |
Me.IDkategorii.Enabled = False |
filtr/Sortowanie (Advanced |
Case acFilterAdvanced |
Filter/Sort). |
MsgBox "Nie jesteś uprawniony do użycia"4 |
Skorzystaj z tego zdarzenia, aby |
"opcji zaawansowany filtr/sortowanie.", _ |
usunąć filtr, wprowadzić usta- |
vbOKOnly + vblnformation, _ |
wienia początkowe lub wyświe- |
"Zaawansowane filtrowanie według |
tlić własne okno dialogowe fil- |
formularza" |
trujące rekordy. Aby anulować |
Cancel = True |
polecenie filtrowania, przypisz |
End Select |
argumentowi Cancel |
End Sub |
w procedurze obsługi zdarzeń |
|
wartość True, co spowoduje, że |
|
filtr nie będzie zastosowany. |
|
Przykład 24 - Wypróbuj to sam: Skorzystaj z formularza KategorieProduktu, który sporządziłeś w przykładzie 7. W oknie Kod programu wpisz podany powyżej kod procedury obsługi zdarzenia Form_Fiiter. Uruchom tryb Widok formularza i wybierz Rekordy => Filtr => Filtruj według formularza (lub kliknij przycisk Filtruj według formularza na pasku narzędzi). Zwróć uwagę na to, że po pojawieniu się
Programowanie w Access 2001 na ekranie okna dialogowego Filtrowanie według formularza pole tekstowe ID kategorii jest nieczynne. Możesz unieruchomić niektóre elementy formularza, jeżeli za-j leży ci na tym, aby użytkownik nie używał ich do filtrowania danych. Aby usunąa filtr, kliknij przycisk Usuń filtr na pasku narzędzi lub wybierz Rekordy => Usuń filtij /sortowanie. Spróbuj jeszcze raz, wybierając tym razem Rekordy => Filtr => Za-j awansowany filtr/sortowanie. Ponieważ procedura obsługi zdarzenia anulowała I opcję Zaawansowany filtr/sortowanie, nie będziesz mógł z niej skorzystać.
N azwa zdarzenia
Przy zastosowaniu filtru (ApplyFilter)
Opis zdarzenia
Przykład 25
Z darzenie Przy zastosowaniu filtru zachodzi przy wprowadzeniu filtru w celu ograniczenia rekordów po wybraniu opcji Zastosuj filtr/sortowanie, Filtruj według wyboru lub Usuń filtr/sortowanie. Skorzystaj z tego zdarzenia, aby zmienić wygląd formularza przed zastosowaniem filtru lub w celu anulowania wprowadzonych zmian w momencie wywołania zdarzenia Przy zastosowaniu filtru.
Argument ApplyType może być jedną z następujących stałych:
acShowAllRecords
acApplyFilter
acCloseFilterWindow
acApplyServerFilter
acCloseServerFilter-
Window
Private Sub Form_ApplyFilter (Cancel As Integer,
ApplyType As Integer) Dim Response As Integer
If ApplyType = acApplyFilter Then If Me.Filter = "" Tien
MsgBox "Nie wybrałeś żadnego kryterium.", _ vbOKOnly + vbCrit.Lcal, "Potrzebne kryteria" GoTo ExitHere End If
Response = MsgBoxi"Wybrane kryteria są " s
"następujące:" & tbCrLf _
& Me.Filter, vbOKCancel + vbQuestion,
"Kryteria filtrowania") End If
If Response = vbCaicel Then
Cancel = True End If
If ApplyType = acShowAllRecords Then Me.Filter = "" MsgBox "Filtr usunięto." End If
If ApplyType = acCloseFilterWindow Then Response = MsgBox{"Czy jesteś pewien, że
chcesz " &
"zamknąć okno filtrowanie?", vbYesNo) If Response = vbNo Then
Cancel = True; End If End If
Programowanie zdarzeń w formularzach i raportach
587
|
ExitHere: |
|
|
Me.IDkategorii |
.Enabled = True |
|
Me.IDkategorii |
.SetFocus |
|
End Sub |
|
Przykład 25 - Wypróbuj to sam: Skorzystaj z formularza KategorieProduktu, I który sporządziłeś w przykładzie 7. W oknie Kod programu wpisz przedstawioną powyżej procedurę obsługi zdarzenia Form_AppiyFiiter. Wyświetl następnie formularz w trybie widoku i kliknij przycisk Filtruj według formularza. W tym momencie ' wywołane zostanie zdarzenie Form_Fiiter (zob. przykład 24). Wybierz kategorię z pola kombi Nazwa kategorii i kliknij przycisk Zastosuj filtr na pasku narzędzi. Czynność ta wywoła zdarzenie Form_AppiyFiiter. Poeksperymentuj z formularzem filtra, sprawdzając inne sytuacje, takie jak kliknięcie przycisku Zastosuj filtr, gdy kryteria filtrowania nie zostały podane, lub zamknięcie okna z filtrem. Aby sprawdzić warunek, który usuwa filter, wybierz kryteria filtrujące i kliknij OK, aby ograniczyć ilość zwróconych rekordów. Następnie kliknij przycisk Usuń filtr. Zwróć uwagę, że nazwa tego przycisku zmienia się na Usuń filtr albo Zastosuj filtr w zależności od sytuacji.
Zdarzenia zachodzące przy cyklu czasomierza (Timing Events)
Zdarzenia mogą być spowodowane przemijaniem czasu.
1 Nazwa zdarzenia ■HHHHHHj |
Przy cyklu czasomierza (Timer) |
Opis zdarzenia |
Przykład 26 |
Zdarzenie Przy cyklu czasomie- |
Private Sub Form_Timer() |
rza zachodzi w otwartym formularzu. |
Static OnOff As Integer |
Częstotliwość zajścia tego wydarzenia |
If OnOff Then |
określona jest wartością (millisekund) |
Me.PodglądRaportu.Caption = "Przegląd |
wpisanych w ustawieniu właściowści |
listy produktów" ' |
Okres czasomierza (Timerlnterval), |
Me.PodglądRaportu.Visible = True |
która znajduje się na zakładce Zdarze- |
Else |
nie w oknie właściwości danego for- |
Me.PodglądRaportu.Caption = "" ' |
mularza. |
Me.PodglądRaportu.Visible = False |
Skorzystaj z tego zdarzenia, aby wy- |
End If |
świetlić ekran przewodni (splash scre- |
OnOff = Mot OnOff |
en) w czasie otwierania bazy danych. |
End Sub |
Zdarzenie to jest również pomocne |
|
przy ograniczeniu czasu, jaki dany re- |
|
588
Programowanie w Access 20
k ord może pozostać zablokowany w aplikacjach przeznaczonych dla szeregu użytkowników.
P rzykład 26 - Wypróbuj to sam: Skorzystaj z formularza Produkty w bazie danych NWIND. W oknie Kod programu wpisz pokaźną powyżej procedurę obsługi | zdarzenia Form_Timer. Procedura ta powoduje migotanie tekstu „Przegląd listy produktów" umieszczonego na przycisku lub też całego przycisku, jeżeli skorzystasz ze skomentowanego wiersza kodu zamiast wiersza go poprzedzającego. Aby powyższa procedura mogła działać, należy zastartować czasomierz, zmieniając właściwość j Okres czasomierza (Timerlnterval) z wartości 0 (zatrzymany) na określony przedział czasu. Przedział czasu o wielkości 1,000 spowoduje wykonanie zdarzenia Timer co i sekundę. Procedura obsługi zdarzenia Load danego formularza ustawia właściowość j okres czasomierza na 250, co powoduje, że tekst przycisku (lub cały przycisk) jest włączany i wyłączany co % sekundy. Właściwość okres czasomierza można zmienić w interfejsie użytkownika, wpisując odpowiednią wartość obok właściwości Okres czasomierza w oknie Właściwości formularza na zakładce Zdarzenie lub wpisując następujące polecenie wewnątrz procedury obsługi zdarzenia Form_Load:
Me.TimerInterval =2 50
Zdarzenia zachodzące w sekcjach formularza
Oprócz sterowania zdarzeniami całego formularza, możesz sporządzać własne procedury obsługi zdarzeń dla poszczególnych sekcji formularza: Szczegóły (Detail), Nagłówek formularza (FormHeader), Stopka formularza (FormFooter), Nagłówek strony (PageHeader) oraz Stopka strony (PageFooter). Sekcje formularza reagują na
następujące zdarzenia: Przy kliknięciu (Click), Przy kliknięciu dwukrotnym (DblClick), Przy naciśniętej myszy (MouseDowil), Przy zwolnionej myszy
(MouseUp) oraz Przy ruchu myszy (MouseMove). Przykładowa procedura pokazana poniżej demonstruje, wjaki sposób można zmienić kolor każdej sekcji formularza w odpowiedzi na dwukrotne kliknięcie myszą w dowolnym miejscu sekcji Szczegóły.
Programowanie zdarzeń w formularzach i raportach
589
N azwa zdarzenia
Przy kliknięciu dwukrotnym (DbICJick) (zdarzenie zachodzące w sekcji formularza)
Przykład 27
Private Sub Szczegóły_DblClick(Cancel As Integer) With Me
.Section(acHeader).BackColor = _ RGB(Rnd * 128, _ Rnd * 256, _ Rnd * 255)
. Section(acDetail).BackColor = _ RGB(Rnd * 128, Rnd * 256, Rnd * 255)
.Section(acFooter).BackColor = _ RGB(Rnd * 128, Rnd * 256, Rnd * 255) End With End Sub
Przykład 27 - Wypróbuj to sam: Otwórz w trybie Projektuj formularz Kate-[gorieProduktu, który sporządziłeś w przykładzie 7. Włącz nagłówek i stopkę, wybierając Widok => Nagłówek/Stopka strony. Zwiększ rozmiar tych sekcji, tak aby były [widoczne w czasie oglądania formularza w trybie Widoku. W oknie Kod programu
[wpisz pokaźną powyżej procedurę obsługi zdarzenia Szczegóły_Dbiciick. Następnie (uruchom formularz w trybie Widoku i kliknij dwukrotnie myszą w sekcji Szczegóły, jaby zmienić kolor tła wszystkich sekcji formularza.
Aby lepiej zapoznać się z sekcjami dostępnymi w formularzu, sprawdź zagadnienia w wbudowanej pomocy:
590
Programowanie w Access 20
|s? Microsoft Access - Pomoc
g|OtX
Sekcje formularza
E fektywność formularza można zwiększyć przez dodanie jednej lub kiiku sekcji. Wszystkie formularze mają sekcję szczegółów, ale mogą również zawierać sekc;e nagłówka formularza, nagłówka strony, stopki strony i stopki formularza.
Widok projektu
Nagłówek formularza wyświetla informacje jednakowe dla każdecjo rekordu takie, jak tytuł formularza. Nagłówek formularza pojawia się u góry1 ekranu w widoku Formularz i u góry
Nagłówek strony wyświetla pierwe) *""* podcza
Northwind Traders
informacje takie, jak tytuł lub nagłówki kolumn u góry każdej drukowanej strony. Nagłówki stron pojawiają się tylko na wydrukowanych formularzach.
Sekcja szczegółów wyświetla
rekordy. Możesz wyświetlać
Jeden rekord na ekranie lub
stronie lub wyświetlać tyle,
ile się zmieści.
Stopka strony wyświetla
informacje takie, jak data lub
numer strony na dole każdej
drukowanej strony. Stopki
stronpojarwiają się Vlko na
wydrukowanych formularzach. Stopka formularza wyświetla informacje
jednakowe dla każdego rekordu, takie jak przyciski poleceń lub instrukcje używania formularza. Stopka fornularza pojawia się na dole ekranu w widoku Formularz lub w wydruku po ostatniej sekcji szczegółów na ostatniej stronie.
12 3
Zdarzenia zachodzące w raportach
W trakcie wyświetlania raportu zachodzi szereg zdarzeń. Kolejne przykłady ue monstrują, w jaki sposób można kontrolować to, co dzieje się gdy raport zostaje otwarty, uaktywniony lub zamknięty oraz gdy w danym raporcie nie ma rekordów d wyświetlenia, albo też rekordy będące źródłem danego raportu po prostu nie istnieją.
) |
|
Programowanie zdarzeń w formularzach i raportach 591 |
|
|||
|
|
|
||||
|
Przy otwarciu (Open) |
|
||||
|
Opis zdarzenia |
Przykład 28 |
|
|||
|
Zdarzenie Przy |
Private Sub Report_Open(Cancel As Integer) |
|
|||
|
otwarciu za- |
Dim strCustName As String |
|
|||
|
chodzi w czasie |
Dim strSQL As String |
|
|||
|
otwierania ra- |
Dim strWHERE As String |
|
|||
|
portu. Skorzystaj |
On Error GoTo Obsługa Błędu |
|
|||
|
z tego zdarzenia, |
strSQL = "SELECT * from Klienci" |
|
|||
|
aby wyświetlić |
StrCustName = InputBox("Wpisz pierwszą literę nazwy " & |
|
|||
|
dodatkowe for- |
" firmy lub wpisz gwiazdkę (*), aby zobaczyć" & |
|
|||
|
mularze, własne |
" wszystkie firmy.", "Show All /Or Filter") |
|
|||
|
paski narzędzi |
If strCustName = "" Then |
|
|||
|
lub zmienić źró- |
Cancel = True |
|
|||
|
dło danych dla |
Elself strCustName = "*" Then |
|
|||
|
danego raportu. |
Me.RecordSource = strSQL |
|
|||
|
|
Me.lbiKiienci-Caption = "Wszystkie firmy" |
|
|||
|
|
Else |
|
|||
|
strCustName = & Trim(strCustName) & "*" & |
|
||||
|
|
strWHERE = ." WHERE NazwaFirmy Like " |
|
|||
|
|
& strCustName & "" |
|
|||
|
|
Debug.Print strSQL |
|
|||
|
|
Debug.Print strWHERE |
|
|||
|
|
Me.RecordSource = strSQL & strWHERE |
|
|||
|
|
Me.lbiKiienci.Caption = "Klienci na literę " & |
|
|||
|
|
UCase(Mid(strCustName, 2, 1)) |
|
|||
|
|
End If |
|
|||
|
|
Exit Sub |
|
|||
|
|
Obsługa Błędu: |
|
|||
|
|
MsgBox Err.Description |
|
|||
|
|
End Sub |
|
|||
Przykład 28 |
- Wypróbuj to sam: Sprządź raport tabelaryczny na podstawie ta- |
|||||
1 beli Klienci w bazie danych NWIND. Zachowaj ten raport pod nazwą rptKlienci. |
||||||
■ Zmień nazwę etykietki znajdującej się w nagłówku raportu na lbiKiienci. W oknie |
||||||
Kod programu wpisz podaną powyżej procedurę obsługi zdarzenia Report_open. |
||||||
1 Przy uruchomienii |
l tego raportu pojawi się okno, w którym możesz wpisać gwiazdkę |
|||||
I (*), aby zobaczyć |
dane wszystkich klientów, lub wpisać pierwszą literę firmy, żeby |
|||||
■ ograniczyć liczbę |
wyświetlonych w raporcie rekordów. Aby anulować raport, kliknij |
|||||
|
Anuluj lub naciśnij Esc, gdy pojawi się okno „proszące" o podanie danych. |
592
Programowanie w Access 20Q
Nazwa zdarzenia
Przy zamknięciu (Close)
Opis zdarzenia
Przykład 29
Z darzenie Przy zamknięciu zachodzi w czasie zamykania raportu. Skorzystaj z tego zdarzenia, aby zamknąć otwarte formularze lub własne paski narzędzi, lub też wykonać inne operacje organizacyjne. Tego zdarzenia nie można anulować.
Private Sub Report_Close() If Forms.Count > 0 Then
MsgBox "Liczba otwartych formularzy: " & Forms.Count Else MsgBox "W tej chwili nie ma żadnego otwartego
formularza." End If End Sub
Przykład 29 - Wypróbuj to sam: Skorzystaj z raportu rptKlienci, który sp rządziłeś w przykładzie 27. W oknie Kod programu wpisz przedstawioną procedurę zdarzenia o nazwie Report_ciose. Procedura ta informuje użytkownik czy w chwili zamknięcia raportu istnieją jeszcze jakieś otwarte formularze.
Nazwa zdarzenia
Przy aktywowaniu (Activate)
Opis zdarzenia
Z darzenie Przy aktywowaniu zachodzi w czasie otwierania raportu zaraz po zdarzeniu Przy otwarciu, zanim zajdzie zdarzenie dla pierwszej sekcji raportu. Skorzystaj z tego zdarzenia w celu wyświetlenia na ekranie własnego paska narzędzi.
Private Sub Report_Activate()
DoCmd.ShowToolbar "Print Preview",
AcToolbarNo DoCmd. ShOA/Toolbar "Wydruk raportu"
AcToolbarYes End Sub
P rzykład 30 - Wypróbuj to sam: Sporządź własny pasek narzędzi o nazwie „Wydruk raportu" z przyciskami przedstawionymi na rysunku poniżej (odwołaj sici do wbudowanej pomocy, jeżeli potrzebne ci są dokładne instrukcje dotyczące pra z paskami narzędzi). Skorzystaj z raportu rptKlienci, który sporządziła w przykładzie 27. W oknie Kod programu wpisz orocedurę obsługi zdarzenia rJ port_Activate. Po otwarciu raportu i podaniu kryterium standardowy pasek narzędą
00
Programowanie zdarzeń w formularzach i raportach
593
P odgląd wydruku, który Microsoft Access wyświetla, zostanie ukryty i pojawi się zaprogramowany przez ciebie pasek o nazwie Drukowanie rekordów.
Y
Wydruk raportu
Jj1 jD Dopasuj ->- Ustawienia strony.,,
N azwa zdarzenia
Przy dezaktywowaniu (Deactivate)
Opis zdarzenia
Przykład 31
Z darzenie Przy dezaktywowaniu zachodzi przed zdrzaniem Przy zamknięciu. Skorzystaj ze zdarzenia Przy dezaktywowaniu, aby ukryć własny pasek narzędzi.
Private Sub Report_Deactivate()
DoCmd.ShowToolbar "Wydruk raportu"
AcToolbarNo End Sub
Przykład 30 - Wypróbuj to sam: Skorzystaj z raportu rptKlienci, który sporządziłeś w przykładzie 27. W oknie Kod programu wpisz pokaźną powyżej procedurę obsługi zdarzenia Report_Deactivate. W trakcie zamykania raportu procedura ta spowoduje ukrycie paska narzędzi użytkownika.
Nazwa zdarzenia ^gl|»8||j|| |
Przy braku danych (NoData) |
Opis zdarzenia |
Przykład 32 |
Zdarzenie Przy braku danych |
Private Sub Report_NoData(Cancel As Integer) |
zachodzi, jeżeli źródło danych będą- |
MsgBox "Nie ma danych spełniających podane |
ce podstawą danego raportu nie za- |
kryterium" |
wiera żadnych rekordów. Zdarzenie |
Cancel = True |
to pozwala anulować raport, gdy nie |
End Sub |
ma rekordów do wyświetlenia. |
|
J
Przykład 32 - Wypróbuj to sam: Skorzystaj z raportu rptKlienci, który sporządziłeś w przykładzie 27. W oknie Kod programu wpisz pokaźną powyżej procedurę obsługi zdarzenia Report_NoData. Uruchom raport i wpisz kryterium proszące I o wyświetlenie klientów, których nazwy firm zaczynają się na literę „X." Ponieważ w tabeli Klienci nie ma nazw klientów rozpoczynających się od litery „X," raport zostaje anulowany.
594
Programowanie w Access 2000
Nazwa zdarzenia lBflH[j^^^H|H |
Przy stronie (Page) |
Opis zdarzenia |
Przykład 33 |
Zdarzenie Przy stronie zachodzi po |
Private Sub Report_Page() |
sformatowanu strony, zanim strona ta zo- |
Me.DrawWidth =25 |
stanie wydrukowana. Skorzystaj z tego zda- |
Me.Line (0, 0)-(Me.ScaleWidth, |
rzenia, aby dopasować wygląd wydruków |
Me.ScaleHeight), vbRed, B |
do własnych potrzeb, wprowadzając w nim |
End Sub |
linie koła, lub grafikę. |
|
Przykład 33 - Wypróbuj to sam: Skorzystaj z raportu rptKiienci, który sporządziłeś w przykładzie 27. W oknie Kod programu wpisz pokaźną powyżej procedurę obsługi zdarzenia Report_Page. Procedura ta dodaje czerwoną grubą ramkę na każdej stronie raportu. Zwróć uwagę, że metoda Drawwidth określa grubość linii, natomiast metoda Line rysuje linię w górnym lewym rogu ekranu (0, 0) oraz w dolnym prawym rogu (Me. ScaleWidth, MeScaleHeight). Właściwości ScaleWidth oraz Sca-leHeight okeślają szerokość i wysokość raportu.
Nazwa zdarzenia |HflH^H |
Przy błędzie (Error) |
|
Opis zdarzenia |
Przykład 34 |
|
Zdarzenie Przy błędzie spo- |
Private Sub Report_ |
Error (DataErr As Integer, |
wodowane jest błędami wynikają- |
|
Response As Integer) |
cymi z braku dostępu do danych, |
'uzyskaj informacj |
3 dotyczące błędu |
które są źródłem raportu. Skorzy- |
MsgBox Applicatio |
a. AccessError (DataErr), |
staj z tego zdarzenia, aby zamie- |
vbOKOnly, "Num |
sr błędu: " & DataErr |
nić standardowy komunikant |
If DataErr = 3078 |
Then |
o błędzie swoim własnym komu- |
MsgBox "Wyświe |
tl własny komunikat |
nikatem. Argument DataErr za- |
|
o błędzie." |
wiera numer błędu. Argument |
End If |
|
Response określa, czy komuni- |
Response = acData |
SrrContinue |
katy o błędzie mają być wyświe- |
End Sub |
|
tlone. Może to być jedna |
|
|
z następujących stałych: |
|
|
• acDataErrContinue — |
|
|
ignoruje błąd i kontynuuje |
|
|
wykonywanie procedury bez |
|
|
wyświetlenia standardowego |
|
1 |
>00
Programowanie zdarzeń w formularzach i raportach
595
komunikatu błędu. |
|
|
• acDataErrDisplay |
— wy- |
|
świetla standardowy |
komu- |
|
nikat Microsoft |
Access |
|
o błędzie. Jest to ustawienie |
|
|
wyjściowe. |
|
|
Przykład 34 - Wypróbuj to sam: W oknie bazy danych NWIND zmień nazwę tabeli Klienci na Kiienci2. Otwórz raport rptKiienci, który sporządziłeś I w przykładzie 27 w trybie Projektuj. W oknie Kod programu wpisz pokazaną po-I wyżej procedurę Report_Error. Uruchom raport. Kiedy pojawi się okno dialogu pro-; szące o podanie kryterium, wpisz dowolną literę i kliknij OK. W tym momemcie zostanie uruchomiony kod procedury Report_Error, ponieważ Visual Basic nie będzie 1 mógł znaleźć źródła danych będących podstawą raportu rptKiienci. Źródłem danych tego raportu jest tabela Klienci. Ponieważ zmieniliśmy nazwę tej tabeli na Kiienci2, Visual Basic nie może odnaleźć danych, co powoduje błąd. Procedura obsługi zdarzenia Report_Error demonstruje, w jaki sposób korzysta się z argumentu DataErr oraz I metody AccessError, aby określić numer błędu oraz jego treść. Polecenie Response i =acDataErrcontinue zapobiega wyświetleniu przez Microsoft Access standardowego komunikatu o błędzie.
Zdarzenie Error działa w raportach tak samo jak zdarzenie Error dla formularzy I -w zdarzeniu tym można tylko pułapkować błędy spowodowane przez Microsoft Ac-I cess lub silnik bazy danych Jet Engine. W celu zastawienia pułapki na błędy w kodzie IVBA skorzystaj z polecenia on Error goto, aby skierować tok działania procedury ■domiejsca, w którym znajduje się kod procedury obsługi błędu (zob. przykład 27).
Przed przejściem do następnego podrozdziału przywróć tabeli Kiienci2 jej pra-I widłową nazwę - Klienci i uruchom raport rptKiienci, aby upewnić się, że nie powoduje on błędów.
Zdarzenia zachodzące w sekcjach raportu
Raport w aplikacji Microsoft Access 2000 może zawierać 25 sekcji. Można w nim uruchomić takie sekcje jak Nagłówek/Stopka raportu (Report Header/Footer), Nagłówek/Stopka strony (Page Header/Footer), Szczegóły (Detail) oraz dziesięć sekcji Sortowanie/grupowanie (Group Headers/Footers). Wszystkie sekcje raportu reagują na zdarzenia Przy formatowaniu (Format) oraz Przy wydruku (Print). Zda-I rżenia te zachodzą podczas drukowania lub przeglądania raportu na ekranie. Dodatkowo, sekcje Nagłówek/Stopka raportu oraz Szczegóły posiadają zdarzenie o nazwie Przy powrocie (Retreat), które zachodzi, gdy Access musi wrócić do po-
596
Programowanie
Przy formatowaniu (Format) (zdarzenie zachodzące w sekcji raportu)
Option Compare Database Dim cieniowany As Boolean
Private Sub Szczegóły_Format(Cancel As Integer,
FormatCount As Integer) If cieniowany Then
Me.Szczegó3y.BackColor = vbYellow Else
Me.Szczegó3y.BackColor = vbwhite End If
cieniowany = Not cieniowany End Sub
P rzykład 34 - Wypróbuj to sam: Skorzystaj z raportu rptKiienci, z którymi pracowałeś w poprzednich przykładach. Otwórz ten raport w trybie Projektuj i UilgJ w sekcji Szczegóły, następnie otwórz okno Właściwości i odnajdź zdarzenie Przy 1 formatowniu. Wybierz [Procedura zdarzenia] z pola listy i wpisz kod proceduiM przedstawionej powyżej. U góry modułu (w obszarze Deklaracji) wpisz następujące I polecenie:
Dim cieniowany As Boolean
■
Powyższa instrukcja deklaruje zmienną globalną typu Boolean, która będzie przechowywała informacje o cieniowanych rzędach raportu. W czasie uruchomienia raportu, podczas drukowania sekcji Szczegóły, Access sprawdzi zawartość zmienną cieniowany i, jeżeli wartość tej zmiennej jest True, kolor tła danego rekordu na raporcie zostanie zmieniony na żółty (żółty kolor spowoduje jasno szary odcień po wydm. kowaniu raportu na drukarce laserowej). Następnie zmiennej cieniowany zostanie przypisana wartość False dla następnego rzędu, za pomocą instrukcji podanej poniżej; cieniowany = Not cieniowany
Programowanie zdarzeń w formularzach i raportach
597
P owyższa instrukcja działa na zasadach przełącznika. Jeżeli wartość zmiennej I cieniowany była prawdą (True), to teraz będzie fałszem (False), itd. Rezultat sforma-I towania raportu po wykonaniu procedury Detail_Format w przykładzie 34 przed-■stawiony jest poniżej:
|
|
|
|
|
|
|
Klienci na IMerę C |
|
|
|
|
|
ID Nx&v&flrfwy PyigiSuwicie! Stanowiska Adres |
M.» i! |
|
Telefon Faks |
|
|
CfC CKb Com Has para Pati-33 Simpson ftatnlspriEda Ceni to 333 |
|
ID ID Afgentt |
(1) 13S5SSS (1)135-*£S |
|
|
C EV CenlroaanEfddUoc FreriQ5<»Cher<l Pyrekfcrdj.m SErrnide Grarsil |
asasa utaaot.t. |
OEUZZ ..=>:».: |
|
|
|
oho croo-Acy Cftiese YarclAts^ LAJteddEl MaupBr.2P |
Bem |
3312 SWEdca |
a«s?mas. |
|
|
COM C«r.er<JoM«l» PBdroA*«o PW«riK =pti *i.„«!«»* |
|
|
(11)9»T« |
|
|
COH Ccns^JOakd Hotdrc Btcslieh Brown PraedJbMdcl fcrtrlEyOaOKriJ |
|
tAK1 GL Weka |
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
Następna procedura demonstruje, w jaki sposób można wydrukować w stopce I raportu zakres rekordów przedstawionych na danej stronie. Możesz zmodyfikować tę I procedurę, aby wyświetlić nazwisko i kod pierwszego klienta na każdej stronie.
Nazwa zdarzenia vHM| |
Przy wydruku (Print) |
■H |
(zdarzenie zachodzące w sekcji raportu) |
Opis zdarzenia |
Przykład 36 |
Zdarzenie Przy wydruku |
Private Sub Szczegóły_Print(Cancel As Integer, _ |
zachodzi po sformatowaniu |
PrintCount As Integer) |
danych w sekcji raportu, za- |
Static rCount As Integer |
nim dane te zostaną wydru- |
Static start As Integer |
kowane. Zdarzenie to zacho- |
|
598
Programowanie w Access 20
d zi dla każdego rekordu w sekcji Szczegóły, zanim Microsoft Access wydrukuje dane tego rekordu. Dla nagłówków i stopek raportu zdarzenie to zachodzi dla każdej nowej grupy. Zdarzenie Przy wydruku zachodzi tylko dla sekcji, które są drukowane. Możesz skorzystać z argumentu Print-Count, aby sprawdzić, czy zdarzenie to zaszło więcej niż raz dla danego rekordu. Jeżeli część rekordu jest drukowana na jednej stronie, a pozostała część na następnej stronie, to zdarzenie Przy wydruku zajdzie dwa razy,
wartość argumentu Print-Count wyniesie 2. Możesz skorzystać z argumentu Cancel, aby anulować drukowanie danej sekcji raportu.
If Me.Page <> Me.txtStrona Then start = Me.Curren;Record Me.txtstrona = Me.Page rCount = 0
End If
rCount = rCount + 1
& rCount
If start <= rCount Then Me.txtZakres = stert & "
Else
rCount = Me.CurrentRecord End If End Sub
Private Sub SekcjaNagłówkaStrony_Print (Cancel As
Integer,
PrintCount As Integer) Me.txtstrona = 0 End Sub
P
rzykład
35 - Wypróbuj to
sam:
Skorzystaj
z raportu rptKiienci zktorv
pracowałeś
wpoprzednich przykładach. Otwórz raport w trybie j
17
w jego stopce dwa pola tekstu. Zmień właściwość Nazwa Z^ xtStrona i ustaw jego właściwość Widoczny (Visible) na Nie. Usuń temu polu etyk.etke. Nazwij drugie pole tekstu txtZakres i umieść e tym polem Etykietka powinna zawierać tekst: Rekordy. Hiknij teraz I se goty i uruchom okno Właściwości. Ustaw właściwość Przy wydruku w seS gory na [Procedura zdarzenia] i wpisz kod procedury oUgi zdarzITa f^ ły_Print pokazanej powyżej. Następnie wpisz procedurę obsługi zdarzenia Sek " Nagł6wkastrony_Print według wzoru powyżej. Procedura ta ustawi wartość w I tekstu txtstrona na zero (0) za każdym razem, gdy dla nowej strony zajd ie zł£ me Przy wydruku. Procedura SzcZeg6ły_Print zachodzi dla każdego ręko d t cedura ta korzysta ze zmiennych start oraz rcount w celu przechowywania^
Programowanie zdarzeń w formularzach i raportach
599
cji dotyczących pierwszego oraz ostatniego rekordu na danej stronie. Następujący rysunek wyświetla zakres rekordów wydrukowany u dołu raportu.
|
|
|
|
|
|
|
|
|
Wszpstkiefirnty |
|
|
|
|
|
|
|
ID N&ovafirmy PrmdSaYifcie, |
|
|
Region Koi &&} |
Teltfcn |
/••fa |
|
|
AUFK AI*eB* Fuifcifcbfc MarJaArrtei* ANA AroTHJIoBnpareOa AnaTtUlo |
|
Srrth ■ |
1Z3B Nientcv |
mxixB |
ihh»» |
|
|
A»T AnfcrtoMcferwTSKJ Ar.Krto MciErw |
lAiteom nara an |
|
ng-tn Meksyk |
■ «■» |
|
|
|
AftO ttomirtHcrn TKon.ajHz.mr |
uKau Ulna. |
■« |
IAIA1 10 lAlEta |
CUS»->7S |
Itnstser |
|
|
IIP, ■tn.luttsrMbWp : CKblmliriLfY |
a,»«.»i .,„««», s |
Ul<» |
S-S6BZ! &weaa |
Barwią. |
B2HZ3. |
|
|
BLA Blaa 8ee Delkofcjj HsrreMoc* |
pnM.«uao U»».K |
Ua-nra. |
<BXK K<cm<y |
DOHB« |
DB1OBI |
|
|
■ LO ik-nfel pent e i 11J t redEHqir clfca |
Pv(KkF>tfi m 2>,plaa;M«Er |
inw |
erem (randa |
88a].1S31 |
SŚD.1S32 |
|
|
BOLI BaUoConldseprepa Me'(r>80(nn.er |
|
i«l |
2asa HiapaH |
©1)3*22 |
(BD5S5 91 |
|
|
10. icmnp' La^tvaiipra |
■ma CfMHisBoun |
» nifnin |
13XB Frarda |
S12».«S.tO |
112.....I |
|
|
BOT Bollcn.-tidlatusl'el BKabEh Itiocłi |
|
|
BC T2II9I* Karola |
W9.1 |
IB«as»3 |
|
|
BBB IV flcicrHBEi Vl*tKl Afhtvsrti |
|
|
BC2SKT UUlIca |
aijiarrai |
|
|
|
C<C CacUs OcmHas poa PaHdoMmpscn |
*™—' ""» = |
B>T»,Aira |
"" *-"" |
(1) O»9999 |
(1|13»«S |
|
|
c ho chon-Mi1 crt«jE 'taro tnfera |
uuwaael Hamtris |
Bem |
3112 BMcz |
□ tóJOTSS* |
|
|
|
COM ComirdeMWw F>Bll»A*r*o |
r<»«r«fcw< M.MU»MB.> |
|
»■ OS432I} BrailłB |
«1)t>H<> |
|
|
|
COB CorwddBtd Hddno BttabEhSloo^ |
FtirdsUdil >i«oan |
|
mi a muu, |
IT1JSI99-22S |
(71JSS&91 |
|
|
■ HA BraditnbhitBrtkRfc* BuBnOBfcS |
|
|
sum mm* |
[=.i-mi2 |
E.mssc |
|
|
DUM Dumordr snler Jarfc Labrirv |
WiCddu O.Fuilnciniui |
|
|
auriu |
mil |
|
|
|
|
|
vuaar lAicha |
|
«**?" |
|
|
|
|
1- 19 |
|
|
|
|
|
|
|
|
|
|
|
|
N azwa zdarzenia
Przy powrocie (Retreat) (zdarzenie zachodzące w sekcji raportu)
Opis zdarzenia
Przykład 36
Z darzenie Przy powrocie zachodzi po zdarzeniu Przy formatowaniu, i przed zdarzeniem Przy wydruku. Jeżeli po sformatowaniu sekcji raportu Access „spostrzeże", że dane nie zmieszczą się na stronie, cofnie się wówczas do odpowiedniego miejsca w raporcie, aby zagwarantować, że sekcja rozpocznie się prawidłowo na następnej stronie. Zdarzenie Przy powrocie zachodzi dla grupy stopek oraz nagłówków, których właściwość Trzymaj razem (Keep Together) w oknie dialogowym Sortowanie/grupowanie została ustawiona na Całą grupę (Whole Group) lub Z pierwszym szczegółem (With First Detail). Zdarzenie to również wywołane jest w podraportach, w których właściwości Można powiększać (CanGrow) lub Można zmniejszać (CanShrink) zostały ustawione na Tak. Użycie zdarzenia Przy powrocie demonstruje raport Sprzedaż wg lat (Sales By Year) w bazie danych NWIND.
600
Programowanie w Access 2000
Ogólne informacje dotyczące poszczególnych sekcji raportu znajdują się we i wbudowanej pomocy w aplikacji Microsoft Access:
tg Microsoft Access - Pomoc
S ekcje raportu
W widoku "Projekt" sekcje są reprezentowane przez pasma i każda sekcja, którą zawiera raport, jest reprezentowana jednokrotnie. W wydrukowanym raporcie niektóre sekcje mogą się powtarzać. Użytkownik określa, gdzie pojawiają się informacje w każdej sekcji, przez umieszczanie formantów, takich jak etykiety i pola tekstowe.
-i
Daiauysj-Bi ID zuiuwśnb: Wartość zrnmtńaóz:
Wl
dok Proiekt
Nagłówek
raportu poiawa-się
raz na początku raportu. Możesz używać go do takich
elementów, jak logo, tytuł raportu lub data wydruku.
Nagtovtek
raportu
iest dtukovwny
przed
nsgtó-vAiem
sśrony
na pierwszej stronie
raportu.
Sekcją
szczegółów zażera H
gtówne
dane raportują |
sekcja
iest povtezana
dla
i
każdego
rekordu w
podstawowym
źródle
rekordów
raportu.
jh
Nagłówek
strony poia-!
wia się u qóry każdej (I
strony rapjorlu. Używaj go
do wyświetlania elementów takich, jak nagłówki kolumn.
|DatatVysylki 11 IDzamóweniajbartoscZamówenial
*r Stopka strony pojawia się j| u góry każdej strony ra-cortu. Uzy\naj jej do wyświetlania elementów [ Sm«acaBumifa:| |=Surna([WartośćZarnftienia)]| takich, iak numery stron.
12.3
'--Stopka raportu poiawa się rai na końcu raportu. Uży*a jei do wysWetlania elementów takich, jak pod:yjmovwnie rapo tu. Stopka
Z darzenia rozpoznawane przez formanty
Po wypróbowaniu 35 przykładów zaprezentowanych w tym rozdziale powinieneś już wiedzieć, dlaczego znajomość obsługi zdarzeń jest niezbędna w Microsoft Access. Pozwalają one budować przyjazne aplikacje, które pracują zgodnie ze specyfikacjami użytkownika. Jednakże, podczas gdy zdarzenia dla formularzy i raportów pozwalają zarządzać całymi rekordami lub samym formularzem czy raportem, istnieją jeszcze liczne zdarzenia zachodzące w poszczególnych formantach umieszczonych w formularzu lub raporcie. Istnieją więc zdarzenia dla etykietek, pól tekstowych, pól kombi oraz pól listy, przycisków zwykłych oraz przycisków opcji i innych formantów, które zostały zainstalowane z aplikacją Microsoft Access. Zdarzenia te umożliwiają kontrolę nad tym, co ma się zdarzyć na poziomie pola. Najlepszym sposobem zapoznania się ze zdarzeniami, na które reaguje dany formularz, raport czy formanty w nich umieszczone, jest zaprojektowanie aplikacji, która rozwiązuje jakiś specyficzny problem. Załączony do książki dysk zawiera formularz służący do wpisywania i wyszukiwania danych. Użyj tego formularza do dalszych eksperymentów z proce-
Programowanie zdarzeń w formularzach i raportach
d urami obsługi zdarzeń. Możesz zmodyfikować ten formularz i wprowadzić w nim" I własne usprawnienia. Tematem aplikacji jest przechowywanie informacji dotyczących sprzętu komputerowego w poszczególnych szkołach. Formularz podzielony jest na łatwe w zarządzaniu cztery sekcje. Zostały one pokazane na rysunku poniżej
Sprzętem
U Szkoły; |57to21 ' 3 Nazwa szkoły: Sil High School
Ulica; ;2nd5freet Podaj nowa szkołę | MlasM| ,,od; j,=g;j<"
Ml PIP Typ sprzętu Producent
.
Dodaj nowego
typ
sprzętu producenta
letad; If] * if
ocedura obsługi zdarzenia: Przed aktualizacją eforeUpdate)
Zdarzenie BeforeUpdate zachodzi przy próbie zachowania rekordu lub przy uszczaniu pola formularza po wprowadzeniu w nim zmian. Zdarzenie to dotyczy 1 tekstowych, pól kombi, pól listy, przycisków opcji, pól wyboru oraz związanych «ek obiektu. Użyj tego zdarzenia w celu sprawdzenia poprawności wprowadzanych ych. Na przykład pole kombi w sekcji Informacje o szkole w przykładowym for-
lularzu w aplikacji Zarządzanie sprzętem zawiera następującą procedurę obsługi
darzenia przypisaną właściwości Przed aktualizacją:
irivate Sub cboSiteId_Bef oreUpdate (Cancel As Integer) strMsg As String, strTitle As String intStyle As Integer If IsNull(MeicboSiteld) Then
strMsg = "Wybierz wartość pola kombi Id szkoły."
strTitle = "Wymagany identyfikator szkoły"
J
602
Programowanie w Access 2000
i ntStyle = vbOKOnly MsgBox strMsg, intStyle, strTitle Cancel = True End If End Sub
Powyższa procedura obsługi zdarzenia spowoduje wyświetlenie specjalnego I munikatu, jeżeli nie wybrano wartości w polu komb cbositeid. Aby anulować: rżenie przed aktualizacją, należy ustawić wartość argumentu cancel na True.
Procedura obsługi zdarzenia: Po aktualizacji (AfterUpdate)
Zdarzenie po aktualizacji zachodzi po zmodyfikowaniu danych we formanc formularza. Zdarzenie to dotyczy pól tekstowych, pól kombi, pól listy, przycisk opcji, pól wyboru oraz związanych ramek obiektu. W odróżnieniu od procedury ob-1 sługi zdarzenia Przed aktualizacją, zdarzenia po aktualizacji nie można odwo-i łać. Użyj tego zdarzenia, aby wypełnić danymi inne formanty formularza na podstawie wybranej i wprowadzonej wartości. Na przykład po wprowadzeniu zmian w polu kombi cbositeid w sekcji informacje o szkole w przykładowym formularzu aplikacji Zarządzanie sprzętem wykonany jest kod następującej procedury obsługi zdarzenia:
Private Sub cboSiteId_AfterUpdate()
With Me
.txtSchoolName = Me.[cbositeid].Column(l)
.txtStreet = Me.cboSiteId.Column(2)
.txtCity = Me.cboSiteId.Column(3)
.txtZip = Me.cbositeid.Column(4)
.cboRooms.Value = vbNullString
.cboRooms.Requery
.txtRoomDescription = vbNullString
.cboRoomType = vbNullString
.cboOS = vbNullString
.txtOperatingSystem = vbNullString
.cboProject = vbNullString
.txtPID = vbNullString End With If Me.cboRooms.ListCount = 0 Then
' nie wyświetlaj nagłówków kolumn
Me.cboRooms.ColumnHeads = False Else
Programowanie zdarzeń w formularzach i raportach
603
M e.cboRooms.ColumnHeads = True End If
Me.cboRooms.SetFocus I End Sub
W procedurze cbositeid_AfterUpdate przedstawionej powyżej adres szkoły zostaje wypełniony na podstawie zawartości kolumn w polu kombi cbositeid. Na przykład, aby automatycznie wypełnić pole txtStreet, możesz odczytać wartość właściwości columns () pola kombi cbositeid, chociaż kolumna ta nie jest widoczna po otwarciu tego pola.:
Me.txtStreet = Me.cboSiteId.Column(2)
Ponieważ numeracja kolumn w polu kombi zaczyna się od zera (0), powyższe polecenie odczytuje zawartość trzeciej kolumny. Następnie pole kombi opatrzone etykietką „Nr klasy" zostaje odświeżone i dane zostają usunięte z innych formantów umieszczonym w formularzu. Zwróć uwagę na użycie stałej vbNulistring zamiast pustego łańcucha znaków (" ") w celu usunięcia danych w polach tekstu lub w polach kombi na tym formularzu. Ostatni fragment kodu tej procedury zawiera instrukcję warunkową if...Then...Eise, która ustawia właściwość Nagłówki kolumn (ColumnHe-ads) pola kombi cboRooms na False jeżeli w wybranej szkole nie ma klas posiadających sprzęt komputerowy.
Procedura obsługi zdarzenia:
Przy wartości spoza listy (NotlnList)
Zdarzenie Przy wartości spoza listy wywołane jest wprowadzeniem wartości, która nie znajduje się w liście dozwolonych wartości, gdy właściwość ogranicz do listy (LimitToList) pola kombi jest ustawiona na Tak. Zdarzenie to dotyczy tylko pól kombi. Skorzystaj z tego zdarzenia, aby wyświetlić własny komunikat lub uruchomić własną funkcję, która zezwoli użytkownikowi na dodanie nowego elementu do listy. Na przykład po próbie dodania nie istniejącej wartości do pola kombi opatrzonego etykietką „System operacyjny" w sekcji Informacje o klasie w przykładowej formie aplikacji Zarządzanie sprzętem, zostaje uruchomiona następująca procedura obsługi zdarzenia:
Private Sub cboOS_NotInList(NewData As String, _ Response As Integer) MsgBox "Proszę wybrać wartość z listy.", _
vblnformation + vbOKOnly, "Nieprawidłowe dane" End Sub
J
604
Programowanie w Access 20
Powyższy kod procedury zdarzenia spowoduje wyświetlenie specjalnego komunikatu, jeżeli użytkownik wpisze nieprawidłową wartość w znajdującym się na for-j mularzu polu kombi cboos.
Procedura obsługi zdarzenia: Przy wejściu (Enter)
Zdarzenie Przy wejściu zachodzi, zanim dany formant formularza zostanie uaktualniony przez przejście z innego formantu na tym samym formularzu. Zdarzenie to dotyczy pól tekstowych, pól kombi, pól listy, przycisków opcji, pól wyboru, grup i opcji, przycisków, przełączników oraz związanych i niezwiązanych ramek obiektu. jak również podformularzy i podraportów. Możesz skorzystać z tego zdarzenia, abyj wyświetlić komunikat kierujący użytkownika do wprowadzenia danych w określonym i formancie formularza. Na przykład do pola kombi opatrzonego etykietką Typ klasy I w sekcji Informacje o klasie w przykładowym formularzu Zarządzanie sprzętem dowiązana jest następująca procedura obsługi zdarzenia:
P rivate Sub cboRoomType_Enter()
If Me.cboSiteld = "" Or isNull(Me.cboSiteld) Then MsgBox "Należy podać Id szkoły.", _
vblnformation + vbOKOnly, "Brak identyfikatora szkoły" Me.cboSiteld.SetFocus Exit Sub End If If Me.cboRooms = "" Or IsNull(Me.cboRooms) Then
MsgBox "Należy podać numer klasy.", vblnformation + vbOKOnly,
"Brak numeru klasy" Me.cboRooms.SetFocus Exit Sub End If End Sub
Po kliknięciu przez użytkownika na pole kombi cboRoomType procedura obsługi zdarzenia Przy wejściu sprawdza, czy w polach kombi cbositeid oraz cboRoom zostały wybrane dane. Jeżeli użytkownik nie wybrał danych z załączonych list, to wyświetlony jest komunikat i automatycznie uaktywni 3ne zostaje odpowiednie pole kombi.
Programowanie zdarzeń w formularzach i raportach
605
P rocedura obsługi zdarzenia: Przy kliknięciu (Click)
Zdarzenie to zachodzi, gdy użytkownik kliknie na formant formularza lewym przyciskiem myszy lub naciśnie przycisk Enter, gdy uaktywniony jest formant formularza i właściwość Wartość domyślna (Default) tego formantu jest ustawiona na Tak. Zdarzenie Przy kliknięciu dotyczy tylko formularzy, sekcji formularza oraz formantów znajdujących się w danym formularzu. Przykładowy formularz w aplikacji Zarządzanie sprzętem zawiera szereg przycisków, które umożliwiają dodanie no-I wych wartości do pól kombi. Na przykład po kliknięciu przycisku opatrzonego etykietką „Dodaj nową szkołę" zostanie wykonany kod procedury zdarzenia Przy kliknięciu, który otworzy nowy formularz (zobacz poniżej), gdzie użytkownik będzie mógł wpisać informacje dotyczące nowej szkoły.
Wprowadzanie danych; m < |
|
3S':\•;!?■■'''"', ' |
|
|
|
|
|
|
|
|
Wpisz dene o nowej *?kole |
|
— ■'" |
|
|
|
|
||
Id szkoły: || |
||||
|
Nazwa szkoły: | |
|
|
|
|
Ulica: ) |
|
|
|
|
Miasto; j |
Kod pocztowy: f |
|
|
|
|
Zapisz |
Anuluj |
|
|
|
|
|
Po kliknięciu przez użytkownika przycisku Zapisz w formularzu „Informacje o nowej szkole" procedura obsługi zdarzenia Przy kliknięciu dowiązana do tego przycisku sprawdza, czy wszystkie pola tekstu zostały wypełnione i czy numer szkoły nie zawiera więcej niż 6 znaków. Trzecim znakiem w polu tekstu opatrzonym etykietką id szkoły musi być jedna z następujących liter: K,M, R, Q, X . Pole tekstu Kod pocztowy zawiera pięciocyfrową liczbę. Procedura również sprawdza, czy numer szkoły nie figuruje już w tabeli. Zwróć uwagę, że formularz Informacje o nowej szkole jest niezwiązany (nie jest on powiązany ze źródłem danych, takim jak tabela, kwerenda lub polecenie SQL). Ponieważ wszystkie pola tekstu umieszczone na formularzu są niezwiązane, po sprawdzeniu poprawności danych, procedura korzysta z metody AddNew z biblioteki ADO, aby utworzyć nowy rekord (praca z obiektami ADO jest treścią rozdziału 3. tej książki). Rekord zostaje dodany do tabeli tbisites, która służy jako źródło danych dla pola kombi opatrzonego etykietką id szkoły w przykładowym formularzu w aplikacji Zarządzanie sprzętem. Następnie pole ! kombi cbositeid zostaje odświeżone, aby nowo dodany numer szkoły był dostępny z listy, gdy użytkownik wróci do głównego formularza.
606
Programowanie w Access 2000
P rivate Sub cmdSaveSitelnfo_Click()
On Error GoTo Err_cmdSaveSiteInfo_Click
Dim conn As ADODB.Connection Dim rst As New ADODB.Recordset Dim Ctrl As Control Dim count As Integer
' sprawdź poprawność danych
For Each Ctrl In Me.Controls If ctrl.ControlType = acTextBox And IsNull(ctrl) _
Or IsEmpty(ctrl) Then count = count + 1 If count > 0 Then
MsgBox "Należy wypełnić wszystkie pola tekstowe."f vblnformation + vbOKOnly, _ "Brakuje danych" ctrl.SetFocus Exit Sub End If End If Next
If Len(Me.txtAddSiteld) <> 6 Then
MsgBox "Pole txtAddSiteld mui zawierać 6 znaków."
Me.txtAddSiteld.SetFocus
Exit Sub End If
If Not ((Me.txtAddSiteld)) Like "##[KMRQX]###" Then
MsgBox "Trzeci znak musi byas jedną z następujących liter:
& vbCr & vbCr _
& "K = Brooklyn" & vbCr _
& "M = Manhattan" & vbCr _
& "R = Staten Island" & vbCr _
& "Q = Queens" & vbCr _
& "X = Bronx", _
vblnformation + vbOKOnly, "Nieprawidłowa dzielnica" Me.txtAddSiteld.SetFocus Exit Sub
Programowanie zdarzeń w formularzach i raportach
607
End If
1 sprawdź kod pocztowy
If Len(Me.txtAddZip) <> 5 Then
MsgBox "Kod pocztowy musi mieć 5 znaków " & "długości. " & vbCr & vbCr & "Popraw kod pocztowy.", _
vblnformation + vbOKOnly, "Błędny kod" Me.txtAddZip.SetFocus Exit Sub End If
' sprawdź czy w kodzie pocztowym znajdują się litery If Not IsNumeric(Me.txtAddZip) Then
MsgBox "Kod pocztowy nie może zawierać liter.",
vblnformation + vbOKOnly, "Błędny kod" Me.txtAddZip.SetFocus Exit Sub End If
' zapisz dane
Set conn = CurrentProject.Connection With rst
.Open "Select Siteld from tblSites", _ conn, adOpenKeyset, adLockOptimistic ' sprawdź czy Siteld nie jest duplikatem
.Find "Siteld='" & Me.txtAddSiteld &
' jeżeli szkoła już istnieje to opuść procedurę If Not rst.EOF Then
MsgBox "Ta szkoła figuruje już w bazie danych: & rst("Siteld"), _
vblnformation + vbOKOnly, "Duplikat" Me.txtAddSiteld.SetFocus Exit Sub End If
.AddNew
!Siteld = Me.txtAddSiteld ISchoolName = Me.txtAddSchoolName !Street = Me.txtAddStreet !City = Me.txtAddCity IZipCode = Me.txtAddZip .Update
J
608
Programowanie w Access 2000
. Close End With
Set rst = Nothing conn.Close Set conn = Nothing
' odśwież pole kombi na formularzu głównym Forms i frmDataEntryMain.cboSiteld.Requery 1 zamknij formularz DoCmd.Close Exit_cmdSaveSiteInfo_Click:
Exit Sub Err_cmdSaveSiteInfo_Click:
MsgBox Err.Description Resume Exit_cmdSaveSiteInfo_Click End Sub
Zwróć uwagę na to, że formularz w aplikacji Zarządzanie sprzętem zawiera szereg przycisków ze znakiem zapytania. Do każdego z tych przycisków dołączona jest procedura obsługi zdarzenia o nazwie Przy kiikn:.ęciu, która wyświetla prosty formularz podający informacje dotyczące danej sekcji formularza lub ekranu. Następująca procedura zdarzenia zostanie wywołana po kliknięciu na przycisk ze znakiem zapytania znajdujący się w sekcji Informacje o klasie w formularzu głównym tej aplikacji:
Private Sub cmdRoomlnfoSec_Click()
On Error GoTo Err_cmdRoomInfoSec_Click
Dim stDocName As String
Dim stLinkCriteria As String
stDocName = "frmHelpMe" stLinkCriteria = "Helpld = 2" DoCmd.OpenForm StDocName, , ,
stLinkCriteria
Exit_cmdRoomInfoSec_Click:
Exit Sub Err_cmdRoomInfoSec_Click:
MsgBox Err.Description
Resume Exit_cmdRoomInfoSec_Click End Sub
Programowanie zdarzeń w formularzach i raportach
609
P owyższa procedura ładuje odpowiedni temat i wyświetla go w polu tekstu (zob. rysunek poniżej):
j:] Plik pomocy
Pomoc dla Sfktji: Informacje o klasie
Przed wpisaniem numeru klasy należy wybrać identyfikator szkoły w polu Id szkoły.
Po
wybraniu identyfikatora szkoły
w polu Id szkoły, pole listy
Nr
Klasa zostaje wypełnione aktualnymi numerami klas, jeżeli w
bazie
danych istnieją odpowiadające tej szkole rekordy. Jeżeli w
bazie
danych nie ma jeszcze żadnych rekordów odnośnie
wybranej
szkoły, w polu kombi Nr Klasy nie ma żadnych opcji.
Jeżeli pole kombi Nr Klasy jest puste, wpisz numer klasy.
Po wybraniu lub wpisaniu numeru klasy automatycznie
i/-. -r f. j-\+ *•.' j-s nnn^nvMiinn^ « Irt • "T*i im I .> 1.-..-, i I C"1 i i «■%+■ ^. w.
P rocedura obsługi zdarzenia:
Przy kliknięciu dwukrotnym (DblClick)
Zdarzenie Przy kliknięciu dwukrotnym zachodzi, gdy użytkownik kliknie dwukrotnie myszą w formularzu lub na jego formancie. Zdarzenie to dotyczy jedynie formularzy, sekcji formularza oraz formantów umieszczonych w formularzu (nie dotyczy formantów znajdujących się w raportach). Aby zobaczyć przykład tego zdarzenia, kliknij przycisk Dodaj nowy typ sprzętu w formularzu głównym w aplikacji Zarządzanie sprzętem. Pojawi się ekran o nazwie Wprowadzanie danych: nowy typ sprzętu (patrz poniżej).
J
610
Programowanie w Access 2000
Wpisj
nowy typ spive
Typ
sprzętu:
Wprowadzanie
danych: nowy typ sprzętu
Typy sprytu | Ej.; |
|
Id |
I Description |
1 |
CPU |
3 |
Drukarka |
5 |
Imation |
4 |
ITV |
11 |
|
7 |
MiniWieża |
9 |
MiniWieża Monitor |
2 |
Monitor |
6 |
Serwer |
10 |
Serwer Monitor |
8 |
Skaner |
M
Z apisz I Anuluj
F ormularz ten umożliwia dodanie nowego sprzętu, który pojawi się w kolumnie Typ sprzętu w sekcji Informacje o sprzęcie komputerowym w formularzu głównym. Lewa strona ekranu wyświetla pole listy z wykazem bieżących typów sprzętu. Użytkownik może kliknąć dwukrotnie myszą na dowolny typ sprzętu, aby dowiedzieć się, czy dany sprzęt można usunąć z listy.
Private Sub lboxCategories_DblClick(Cancel As Integer) Dim conn As ADODB.Connection Dim myAsset As String Dim myAssetDesc As String Dim Response As String Dim strSQL As String myAsset = Me.lboxCategories.Value myAssetDesc = Me.lboxCategories.Column(1) If myAsset >= 1 And myAsset <= 11 Then MsgBox "Nie można usunąć - Ten sprzęt jest aktualnie w użyciu.",
vbOKOnly + vbCritical, "Typ sprzętu: " & myAsset Exit Sub End If If (Not isNull(DLookup("[AssetType]", "tblProjectDetails"
"[AssetType] = " & myAsset))) Or _ Not IsNull(DLookup("[EquipCategoryld]" "tblEquipInventory",
"[EquipCategoryld] = " & myAsset)) Then MsgBox "Tego sprzętu nie można usunąć.",
vbOKOnly + vbCritical, "Typ sprzętu: " & myAsset
300
Programowanie zdarzeń w formularzach i raportach
611
Else
Response = MsgBoxC'Czy chcesz usunąć nazwę tego sprzętu?",
vbYesNo, "Wymazać - " & myAssetDesc & " ?") If Response = 6 Then
Set conn = CurrentProject.Connection
strSQL = "DELETE * FROM tblEquipCategories Where EquipCategoryld = conn.Execute (strSQL & myAsset) conn.Close Set conn = Nothing Me.lboxCategories.Requery End If End If End Sub
lie w-tu. ieć
Zdarzenia zachodzące w formularzu głównym aplikacji
Sekcja Informacje o sprzęcie komputerowym u dołu formularza głównego aplikacji Zarządzanie sprzętem wyświetla podformularz umożliwiający dodanie nowego sprzętu dla wybranej szkoły, klasy oraz wskazanego projektu. Jeżeli sprzęt już istnieje dla wybranej szkoły, klasy lub projektu, informacje dotyczące sprzętu pojawią się w odpowiednich kolumnach. Każdy sprzęt musi posiadać informację o jego gwarancji. Po kliknięciu przycisku Wpisz/Zmień w kolumnie Gwarancja użytkownik może wpisać lub zmienić termin gwarancji, opis gwarancji oraz nazwę firmy prowadzącej serwis gwarancyjny. Po władowaniu formularza Wprowadzanie danych: gwarancja (zob. poniżej) zostanie wykonana procedura obsługi zdarzenia Przy załadowaniu (Load), która skopiuje informacje o sprzęcie z formularza głównego do formularza Wprowadzanie danych: gwarancja. Jeżeli informacje dotyczące gwarancji zostały już wpisane, pola tekstu umieszczone w dolnej części formularza Gwarancje zostaną automatycznie wypełnione istniejącymi danymi.
I
612
?rogramowanie w Access 2000
SH Wprowadzanie danych: gwarancja
. J!^x>^ -I* ~..J< •
W m-,.' ilrfne 11 iiw.ir.mi ji ilU
MiniWieża ( Model No: TR-1O0 )
WID (Id gwarancji): [ 22 PID (Id projektu);
Termin gwarancji: J5 Treść gwarancji
obocizna
Firma gwarancyjna: JABC Komputery
ZapiSE
Anuluj
P rivate Sub Form_Load() Dim conn As ADODB.Connection Dim rst As New ADODB. Recordset Dim strFiiter As String
Dim mySubForm As Form
Set mySubForm - [Forms]![frmDataEntryMain]![frmSubProjectDetails].[Formj
Me.txtSelectedAssefType = mySubForm![EquipCatld|.Columnp) &_
11 ( Model No: " 8, mySubForm![Model] & " )" Me,txtSelWID = mySubForm![WID] Me.txtSelPID = mySubForml[PID]
: pobierz informacje o gwarancji, jeżeli zostały już wpisane strFilter = "WID=m &txtSelWID 8. '"And PID =" LtxtSelPID & " Set conn = CurrentProject.Connection With rst
.Open "Select * from tbiProjectDetails". _
conn, adOpenKeyset, adLockOptimistic .Filter = strFilter If Not IsNull(IWarrYears) Or_
Not IsEmpty(IWarrYears) Then Me.txtWarrantyYrs ■ IWarrYears If Not lsNull(!Warranty)Or_
Not IsEmpty(IWarranty) Then Me.txtWarrantyDesc = Warranty If Not IsNull(IWarrSeiviceVendor) Or_
Not
lsEmpty(!WarrSetviceVendor) Then Me.txtWarrantySer<iceVendor=
IWarrServiceVendor
.Close
End
With
conn.Close
Set
conn =
Nothing
EndSub „
Podczas zamykania formularza Wprowadzanie danych: gwarancja zostanie wywołana procedura obsługi zdarzenia Przy zwolnieniu (Unload). Zdarzenie to uaktualni informacje w polu tekstu Okres w sekcji Informacje o sprzęcie komputerowym na formularzu głównym, aby użytkownik mógł wiedzieć, jak długi jest termin gwarancji danego sprzętu bez potrzeby otwierania dodatkowego formularza.
Programowanie zdarzeń w formularzach i raportach
613
:
Private Sub Form_Unload(Cancel As Integer)
Forms!frmDataEntryMain!frmSubProjectDetails.Form!txtWarrOK.Requery
End Sub
Zdarzenie Przy załadowaniu (Load) zajdzie również, gdy użytkownik kliknie przycisk Wpisz/Zmień w kolumnie Seria w sekcji Informacje o sprzęcie komputerowym na formularzu głównym. Po pojawieniu się formularza Wprowadzanie danych: numery seryjne w górnej części tego formularza znajduje się informacja dotycząca szkoły oraz wybranego sprzętu (zobacz rysunek poniżej). Użytkownik może wpisać dowolną liczbę numerów seryjnych dla wybranego sprzętu i szkoły w podformularzu znajdującym się w tym formularzu.
; wprowadzenie danych: n-- . ...
I
d
szkoły
::01M021
Klasa;
;100
IIMuh bul
laboratorium 1 Drukarka
|
Id sprzętu |
Numer seryjny |
Użytków |
lik Komentarz |
|
|
|
r___. |
JEE-AA234 |
jNauczyciel |
dl |
|
|
96 |
JEE-33U2 |
r~ |
zi\ |
* |
|
jmerowanie) |
1 |
i |
zl\ |
|
|
|
|
|
|
Rekord: |
iiJjJI |
" r ►ii»j.i»*i z 2 |
|
|
Uwaga: Jeżeli sprzęt przeznaczony jest dla nauczyciela, wybierz odpowiednią opcję w polu kombi Użytkownik.
1 ■ .i;... : ,:
P ierwszą kolumną w podformularzu jest pole tekstu, które wyświetla numer kolejnego wiersza (zob. rysunek poniżej). Numerowanie wierszy umożliwia funkcja Humberit. Wymaga ona dwóch argumentów: nazwy podformulrza oraz identyfikatora. Funkcja ta dowiązana jest do pola tekstu za pomocą właściwości źródło forman-tu (Control Source), w następujący sposób:
=NumberIt( [Forms] ! [frmSerialNumbers] ! [frmSubSerialEntry] . [Form] , [Equiplnvld] )
Programowanie w Access:
Public Function Numberlt(myForm As Form, key) On Error GoTo ErrorHandler Dim rst As DAO.Recordset Dim LineNumber As Long
Set rst = myForm.RecordsetClone LineNumber = 1 rst.MoveFirst Do Until (key = rst.Fields(0)) Or rst.EOF LineNumber = LineNumber + 1 rst.MoveNext Loop ErrorHandler:
If Err Then
If Not IsNull(key) Then Numberlt = LineNumber End If Else
Numberlt = LineNumber End If End Function
I
Podczas zamykania formularza Wprowadzanie danych: numery seryjne, kod umieszczony w procedurze obsługi zdarzenia Przy zwolnieniu (Unload) odświeży pole tekstu znajdujące się w kolumnie Ilość w sekcji Informacje o sprzęcie komputerowym na formularzu głównym aplikacji. Pole teks:u wyświetla liczbę wpisanych numerów seryjnych dla wybranego typu sprzętu we wskazanej szkole oraz klasie.
Private Sub Form_Unload(Cancel As Integer)
Forms ! f rmDataEntryMainl frmSubProjectDetails .Form! txtCountSerial.Requery I End Sub
W aplikacji Zarządzanie sprzętem zachodzi jeszcze szereg innych zdarzeń, któ- I
re kontrolują sposób, w jaki formularz główny oraz jego formanty reagują na czynnM
ści użytkownika. Po dokładniejszym zapoznaniu się z tą aplikacją niewątpliwie znaj- 1
dziesz miejsca, w których przydałoby się sporządzić dodatkowe procedury obsług i
zdarzeń, ułatwiające pracę z tą aplikacją. Otwórz tę aplikację i rozłóż ją na części 1
składowe. Odbuduj ją. Nie bój się dodać do niej nowej funkcjonalności. Jeżeli chcesz,
zmień interfejs użytkownika. Naucz się obsługiwać każde zdarzenie, które przyjdzieci]
na myśl.
Programowanie zdarzeń w formularzach i raportach
615
P odsumowanie
W tym rozdziale omówiliśmy programowanie zdarzeniowe. Poznałeś liczne zdarzenia, które zachodzą w aplikacji Microsoft Access 2000 - w formularzach, raportach oraz w szeregu formantach. Nauczyłeś się reagować na zdarzenia, sporządzając własne procedury obsługi zdarzeń w module formularza oraz raportu. Zobaczyłeś również, że niektóre zdarzenia programuje się łatwiej niż inne, i chociaż niektóre z poznanych zdarzeń mają większe zastosowanie niż pozostałe, dobrze jest wiedzieć, I że są one w zasięgu ręki, gdy zajdzie potrzeba ich użycia. Programowanie zdarzeń może być czasem bardzo irytujące, gdyż w modelu obiektów aplikacji Access znajduje się szereg zdarzeń, które mogą zajść w tej samej chwili. Nie zniechęcaj się jednak. Jeżeli zamierzasz programować efektywne aplikacje użytkowe, korzystając z Microsoft Access, to zagadnienie obsługi zdarzeń musisz dobrze opanować. Właściwe użycie zdarzeń da ci pełną kontrolę nad wieloma aspektami Accessa.
R ozdział 6
Microsoft Access
w przeglądarce internetowej
W dzisiejszym świecie każdy chce posiadać dostęp do danych przy użyciu wewnętrznej sieci Intranetu lub sieci World Wide Web. Książka ta nie byłaby zupełna bez wskazania ci sposobu skierowania nabytych w poprzednich rozdziałach tej książki umiejętności programistycznych w miejsca cieszące się największym zainteresowaniem. Czy chciałbyś dowiedzieć się na przykład, w jaki sposób można udostępnić informacje przechowywane w bazie danych Access innym osobom, tak aby mogli oni korzystać z nich bezpośrednio z przeglądarki internetowej? Wystarczy dodać do swoich umiejętności VBA trochę poleceń języków HTML (Hypertext Markup Language) oraz VBScript (Microsoft Visual Basic, Scripting Edition), aby móc zacząć budować aplikacje, które są gotowe do wykorzystania w sieci Intranetu i Internetu.
Chociaż Microsoft Access 2000 nie posiada specjalnego kreatora do tworzenia stron WWW, polecenie Eksport w menu Plik pozwala na zachowanie tabel, kwerend oraz formularzy do sieci WWW w jednym z następujących formatów: HTML Documents, Microsoft Active Server Pages, and Microsoft IIS 1-2.
Dla przykładu, aby użytkownik miał dostęp z przeglądarki internetowej do informacji o pracownikach bazy danych Northwind, zaznacz tabelę Pracownicy w oknie bazy danych Northwind i wybierz Plik => Eksportuj. W oknie dialogowym Eksportuj tabela 'Pracownicy' jako (zob. poniżej), wybierz Microsoft Active Server Pages w polu Zapisz jako typ i kliknij Zapisz.
Po kliknięciu przycisku Zapisz pojawi się okno dialogowe Opcje wyjścia stron serwera Microsoft Active (zob. poniżej). W tym oknie należy przynajmniej podać nazwę źródła danych DSN (Data Source Name) w celu połączenia się do bazy danych Access (w tym przykładzie skorzystamy z bazy North Wind) oraz nazwę serwera Web (skorzystamy tutaj z ogólnie przyjętej nazwy „localhost"). Localhost zastępuje nazwę komputera, na którym uruchamiany jest dany program. Localhost korzysta z zarezerwowanego adresu IP 127.0.0.1.
618
Programowanie w Access i
E ksportuj Tabela 'Pracownicy* lako
Zapis;
Japisz jako typ: Microsoft Active Server Pages
Anuluj
rze.
http://localhost umożliwia połączenie się ze stroną główną na lokalnym kompute-
Opcje wyjścia stron s , . , i
. ..
Szablon HTML:
Informacje
o źródle
danych
i
Nazwa źródła danych: I
NorthWind
Użytkownik podłączany jako: j Admin i Hasło dla użytkownika:
Wyjście
stron serwera Microsoft Active
Server -
URL
serwera: http:
//localhost
Przeglądaj.
i Limit czasu sesji (min); j |
Anuluj
Po kliknięciu OK w oknie dialogowym Opcje wyjścia zostanie utworzony plik z rozszerzeniem .asp (Pracownicy.asp), który jest dynamicznie powiązany z tabelą Pracownicy w bazie danych Northwind. Ponieważ wybrałeś format ASP zamiast HTML, za każdym razem, gdy zmienią się informacje w tabeli Pracownicy, twoja 1 strona ASP wyświetli aktualne dane.
Microsoft Access w przeglądarce Internetowej
619
Z anim będziesz mógł wyświetlić tę stronę ASP w swojej przeglądarce, należy wykonać dwie dodatkowe czynności:
Utworzyć
źródło danych DSN (ODBC
Data Source) o
tej samej nazwie, którą
wpisałeś
w oknie dialogowym Opcje
wyjścia stron
serwera Microsoft Active.
Zainstalować
i skonfigurować serwer WWW, aby móc uzyskać dostęp do
adresu
URL
(Unified
Resource Locator -
Zunifikowany Wskaźnik Zasobów), który
wpisałeś
w oknie dialogowym Opcje
wyjścia stron
serwera Microsoft Active.
Powyższe czynności wykonamy w dalszych częściach tego rozdziału. Umiejętność tworzenia dynamicznych stron WWW za pomocą interfejsu użytkownika w aplikacji Microsoft Access pozwoli ci rozpocząć tworzenie aplikacji intemetowych. W tym rozdziale koncentrujemy się jednak nie na interfejsie użytkownika, lecz na tym, w jaki sposób własnoręcznie tworzy się strony ASP w celu wyświetlania danych, tworzenia zapytań oraz modyfikacji danych przechowywanych w bazie danych Microsoft Access z dowolnej przeglądarki internetowej.
Publikacja „żywych danych" czyli - Active Server Pages
Za pomocą opracowanej przez Microsoft technologii Active Server Pages (ASP) można tworzyć dynamiczne aplikacje w sieci WWW. Obecnie w użyciu jest wersja ASP 3.0, która jest częścią serwera WWW - Internet Information Server (IIS) 5.0. Strony Active Server Pages są plikami tekstowymi charakteryzującymi się rozszerzeniem .asp. Pliki te zawierają standardowe znaczniki formatowania HTML oraz specjalne skrypty. Ponieważ podstawowym językiem skryptów dla ASP jest VBScript, potomek języków Visual Basic oraz Visual Basic for Applications, posiadasz już wiele umiejętności niezbędnych do udostępnienia aplikacji opracowanych za pomocą bazy danych Microsoft Access na stronach intemetowych. Ponadto, wszystkie narzędzia, które są potrzebne do korzystania z bazy danych Access w sieci intranet oraz Internetu, są w zasięgu twojej ręki. Chociaż przykłady tego rozdziału zostały przygotowane za pomocą programu Microsoft Visual InterDev 6.0, do pisania własnego kodu możesz skorzystać z Notatnika programu Windows lub innego dowolnego edytora tekstu. Od czego zatem powinieneś zacząć? Możesz rozpocząć od zdobycia praktycznych umiejętności posługiwania się językiem HTML. Dobrym miejscem na rozpoczęcie nauki jest sieć Internetu. Łatwe, prowadzone krok po kroku, lekcje znajdziesz
W witrynach: http: //www. htmlgoodies.com oraz http: //www. bfree.on. ca/HTML.
Jeżeli nie znasz na tyle języka angielskiego, to polecam przetłumaczoną na język polski książkę HTML Goodies z polskim tytułem „Rodzynki języka HTML" (ISBN 83-7158-198-X, Wydawnictwo MIKOM, Autor - Joe Bums, Przekład z j. angielskiego -Ryszard Glegoła). Ponieważ strony ASP są mieszanką znaczników HTML oraz pole-
620
Programowanie w Access 2000
c eń języków skryptowych, takich jak VBScript lub JScript, warto się również dowiedzieć jak najwięcej na temat każdego z tych komponentów.
Active Server Pages umożliwiają tworzenie dynamicznych stron WWW, które są uaktualniane przy każdorazowym ich uruchomieniu. ASP jest niezależne od platformy, której używasz. Oznacza to, że możesz oglądać strony sporządzone za pomocą ASP w dowolnej przeglądarce internetowej. Obecnie najczęściej używanymi przeglądarkami są Internet Explorer oraz Netscape Navigator.
Kod ASP jest przetwarzany na serwerze WWW i przesłany do przeglądarki in-ternetowej w postaci kodu HTML. Po otwarciu pliku ASP za pomocą edytora teksu, takiego jak Notatnik programu Windows, kod ASP wygląda następująco:
m Pracownicy -
File Edit Format Help
-JSi-Xi
<HTML> <HEAD>
<META HTTP-EQUIV-"content-Type" CONTENT-"text/html;charset-windows-125Q"> <TITLE>Pracowni cy</TITLE>
</HEAD> I
<BODY>
If Isobject(session("Northwind_conn")) Then
set conn = sess1on("Northw1nd_conn") Else
set conn = server.createob]ect("ADODB.connection")
conn, open "Northwind","Admin",""
set session("Northwind_conn") - conn •
=nd If |
If IsObject(session("pracowmcy_rs")) Then
Set rs - session("Pracownicy_rs") Else
sql = "SELECT * FROM [Pracownicy]"
set rs = server .createobjectC'ADODB. Recordset")
rs.open sql, conn, 3, 3
If rs.eof Then
rs.AddNew j
End if
set sessionC'Pracownicy^s") - rs End if
<TABLE BORDER=1 BGCOLOR-#ffffff CELLSPACING=0><FONT FACE="Arial" COLOR=#00
<THEAD> <TR>
Otwórz teraz plik Pracownicy.asp, który przygotowałeś na początku tego rozdziału. Zwróć uwagę na strukturę tego pliku. Zauważ wiele znaczników w ogranicznikach < >:
<HTML>, <HEAD>, </HEAD>, <TITLE>, </TITLE>, <30DY>, <B>, </B>, <TR>, jtd.
Znaczniki HTML przekazują przeglądarce, w jaki sposób należy wyświetlić plik. Znaczniki występują parami. Każdy element objemowany jest znacznikiem początkowym i końcowym. Znacznik końcowy porzedzony jest znakiem „/", na przykład </title>.
Znacznik <html> na początku pliku informuje przeglądarkę o tym, że to, co znajduje się dalej, jest dokumentem HTML. Znacznik końcowy </HTML> na końcu pliku informuje przeglądarkę, że jest to koniec dokumentu HTML.
,
Microsoft
Access w przeglądarce
Internetowej
621
Odwołaj się do wspomianych powyżej witryn, aby odszyfrować znaczenie wszystkich znaczników HTML, które znajdują się w pliku Pracownicy .asp.
Oprócz znaczników HTML, plik Pracownicy.asp zawiera znaczniki <% oraz %>. Znacznik <% mówi, że to, co następuje jest skryptem VBScript, a nie dokumentem HTML. Znacznik %> oznacza koniec segmentu VBScript. Kod wpisany pomiędzy znacznikami <% oraz %> zostanie wykonany na serwerze WWW. Skrypty ASP są obsługiwane po stronie serwera (server-side scripts), podczas gdy interfejsem użytkownika jest przeglądarka internetowa. Gdy użytkownik odwoła się w przeglądarce do strony ASP, serwer zinterpretuje polecenia skryptu i prześle z powrotem do przeglądarki gotową stronę zawierającą już tylko czysty dokument HTML. Cały ciężar przetwarzania skryptu pozostaje na serwerze. Skryptów wykonywanych na serwerze nie można łatwo skopiować, gdyż do przeglądarki przesłany jest tylko rezultat skryptu. Użytkownicy zatem nie mają dostępu do komend skryptu, który utworzył stronę, przeglądaną w danej chwili. Mają oni tylko dostęp do kodu HTML dla danej strony.
Oprócz skryptów wykonywanych na serwerze, plik .ASP może zawierać tzw. skrypty klienckie (client-side scripts) wykonywane na komputerze użytkownika. Skrypty klienckie znajdują się między znacznikami <script> oraz </script>. Kiedy przeglądarka napotka znacznik <SCRIPT>, wówczas wysyła ona skrypt znajdujący się poniżej tego znacznika do tzw. Scripting Engine, który jest częścią przeglądarki internetowej i służy do przetwarzania skryptów. Ponieważ nie wszystkie przeglądarki potrafią przetwarzać skypty klienckie, często stosuje się znaczniki komentarza (<!— oraz ->), które powodują zignorowanie znacznika <SCRIPT> przez te przeglądarki.
Przeglądając dalej plik Pracownicy.asp, zauważysz w nim również kilka wierszy i kodu VBScript, które wpisują dane na stronie internetowej. Dane te znajdują się między znacznikami <%= oraz %>. Korzystając ze znaku równości wewnątrz tych znaczników, możesz wyświetlić wartość zmiennej języka VBScript na stronie WWW.
622
Programowanie w Access 2000
M Pracownicy - Notepad
File Edit Format Help
</THEAD> <TBODY>
ALIGN=RIGHTXFONT
SIZE=2
On
Error Resume Next
rs.MoveFirst
do while Not rs.eof
<TR VALIGN=TOP>
<TD BORDERCOLOR=#COcOcO
r*o-t-inTi-!i
< TD BORDERCOLOR=#COcQcO XFONT
<%=Server.HTMLEncodeCrs.FieldsC
<TD BORDERCOLOR=#COCOCO XFONT
<%=server.HTMLEncodeCrs.FieldsC
<TD BORDERCOLOR=#COCOCO XFONT <%=server. HTMLEncodeOs. Fi el ds C <TD BORDERCOLOR=#cOcOCO XFONT
<%=server.HTMLEncodeCrs.Fi elds(
<TD BORDERCOLOR=#cOcOcO ĄLIGN= <%=server.HTMLEncode(rs. FieldsC <TD BORDERCOLOR=#COcOcO ALIGN=
<%=server.HTMLEncodeCrs.FieTdsC
<TD BORDERCOLOR=#cOcOcO XFONT <%=server.HTMLEncode(rs.FieldsC <TD BORDERCOLOR=#cOcOcO XFONT <%=server.HTMLEncode(rs.Fi elds( <TD BORDERCOLOR=#COcOcO XFONT <%=server.HTMLEncode(rs.FieldsC <TD BORDERCOLOR=#cOcOcO XFONT <%=server.HTMLEncodeCrs.Fi el ds( <TD BORDERCOLOR=#COcOcO ><FONT
<%=Server.HTMLEncodeCrs. Fi elds C
FACE="Arial" COLOR=#000000> !<BRX/FONTX/TD>
SIZE=2 FACE="Arial" COLOR=#OOQOOO>
"Nazwisko"). value)X><BRx/FONTx/TD> SIZE=2 FACE="Arial" COLOR=#000000> "Imię").Value)XxBRx/FONTx/TD> SIZE=2 FACE="Arial" COLOR=#000000> "Stanowi sko").value)%xBRx/FONTx/TD> SIZE=2 FACE="AriaV COLOR=#000000>
"ZwrotGrzeczności owy"). val ue)%><BRx/FONTx/T0>
RIGHTXFONT SIZE=2 FACE-"Arial" COLOR=#000000> "Dataurodzenia"). Value)%xBRx/FONTx/TD> RIGHTXFONT SIZE=2 FACE="Arial" COLOR=#000000>
"Datazatrudnienia").va1ue)%xBRx/FONTx/TD>
size=2 FACE="Aria1" COLOR-#000000>
"Adres "). val ue)%xBRx/FONTx/TD>
SIZE=2 FACE="Arial" COLOR=#000000>
"Miasto"), val ue)XxBRx/FONTx/TD>
SIZE=2 FACE-"Arial" COLOR=#OOQOOO>
"Regi on"). val ue)%xBRx/FONTx/TD>
SIZE=2 FACE="Arial" color-#000000>
"KodPocztowy"). val ue)%xBRX/FONTx/TD>
SIZE=2 FACE="Arial" COLOR-#000000>
"Kraj").value)X><BRx/FONTx/TD>
ASP udostępnia swój własny model obiektów, który składa się z pięciu obiektów przedstawionych poniżej (tabela 6.1).
Tabela 6.1 Model obiektów ASP
N azwa obiektu
Znaczeni'
R equest
Pobieranie informacji przesyłanych do serwera WWW przez przeglądarkę
R esponse
Przesyłanie informacji do przeglądarki
A pplication
Współdzielenie informacji pomiędzy użytkownikami aplikacji
S erver
Zarządzanie obiektami serwera, strumieniami HTML
S ession
Przechowywanie informacji sesji użytkownika
Obiekty
ASP posiadają
metody, właściwości oraz zdarzenia, które służą dom;
nipulowania
różnymi ich cechami. Na przykład metoda write
obiektu
Response^
Microsoft Access w przeglądarce Internetowej
623
u możliwia przekazywanie tekstu do przeglądarki internetowej, natomiast metoda cre-ateobject obiektu server umożliwia utworzenie łączności między stroną WWW oraz bazą danych Access. Chociaż rozdział ten nie porusza wszystkich istniejących obiektów ASP oraz ich właściwości, metod, a także zdarzeń, dowiesz się w nim, jak korzystać z obiektów oraz metod związanych z wykonaniem określonych czynności dotyczących wyświetlania oraz manipulacji danych pochodzących z bazy danych Microsoft Access w przeglądarce internetowej.
Instalacja Microsoft Information Services (IIS 5) lub Personal Web Server
Aby móc wykonać prezentowane w tym rozdziale ćwiczenia, należy zainstalować program Microsoft Information Services (IIS) 5 (jeżeli pracujesz w środowisku Windows NT lub Windows 2000 Professional), albo Personal Web Server 4.0 (jeżeli pracujesz w środowisku Windows 95/98 lub NT Stacja robocza 4.0).
|
Windows 2000 |
|
Windows 98 |
|
Instalacja Internet Information Services |
|
Instalacja Personal Web Server |
|
(wersja 5 lub nowsza) |
|
|
1. |
Włóż CD-ROM Windows 2000 |
1. |
Włóż CD-ROM Windows 98 do sta- |
|
Professional do stacji dysków. |
|
cji dysków. |
2. |
Kliknij Start, wybierz Ustawienia |
2. |
Kiedy pojawi się okno dialogowe, |
|
(Settings) i Panel sterowania |
|
kliknij przycisk Przeglądaj ten CD |
|
(Control Panel). |
|
(Browse This CD). |
3. |
Kliknij dwukrotnie myszą Do- |
3. |
Kliknij dwukrotnie myszą Dodatki |
|
daj/Usuń programy |
|
(Add-ons). |
|
(Add/Remove Programs). |
4. |
Kliknij dwukrotnie myszą pws. |
4. |
Kliknij przycisk Dodaj/Usuń |
5. |
Kliknij dwukrotnie myszą Se- |
|
składniki Windows (Add/Remove |
|
tup.exe. |
|
Windows Components) w górnym |
6. |
Kiedy pojawi się okno dialogowe |
|
lewym rogu. |
|
Microsoft Personal Web Server |
5. |
Kliknij pole wyboru obok Internet |
|
Setup, kliknij Typowa (Typical), |
|
Information Services (IIS). |
|
aby określić rodzaj instalacji. |
6. |
Kliknij przycisk Dalej (Next), aby |
7. |
Pojawi się okno wskazujące katalog |
|
rozpocząć instalację. |
|
główny Personal Web Server. Klik- |
7. |
Po zakończeniu instalacji kliknij |
|
nij przycisk Dalej (Next), aby kon- |
|
Koniec (Finish), aby zamknąć |
|
tynuować instalację. |
|
okno dialogowe. |
|
|
8. |
Uruchom ponownie komputer. |
8. |
Po zakończeniu instalacji kliknij |
|
|
|
przycisk Koniec (Finish). |
624
Programowanie w Access 2000
9
.
Pojawi się
komunikat proszący
o
ponowne uruchomienie komputera.
Kliknij
Tak
(Yes),
aby
zastartować
komputer.
Po zainstalowaniu IIS (lub Personal Web Server) na dysku komputera powinien znajdować się folder o nazwie Inetpub.
§K C:\Inetpub
j File Edit View Favorites Tools Help
v"Back - jj ^ Search Cj Folders
: Address
C:\Inetpub
x *> m-
-JflL*
I Norton AntiVlrus
Folders
ftproot
3 !c3 Inetpub
I AdminScripts I ftproot I iissamples I mailroot I Scripts i_] webpub j I wwwroot
AdminScripts
D
Scripts
iisiamples mailroot
webpub wA?wroot
Tworzenie wirtualnego katalogu
Folder C:\lnetpub\wwwroot jest katalogiem macierzystym dla serwera Personal Web Server lub IIS. Pliki oraz programy znajdujące się w tym folderze i jego podka-talogach są dostępne dla osób odwiedzających witrynę. Aby strony, które nie są przechowywane w katalogu macierzystym ani jego podkatalogach, były dostępne dla odwiedzających, możemy utworzyć tzw. katalog wirtualny. Katalog wirtualny jest nazwą katalogu, która odpowiada katalogowi fizycznemu na serwerze.
Aby pracować z ćwiczeniami tego rozdziału, załóż teraz na dysku C swoje?o komputera katalog o nazwie C:\PoznajASP i zrób z niego katalog wirtualny według i instrukcji poniżej.
1. Otwórz program Eksploratora Windows i załóż nowy folder na dysku C o nazvj C:\PoznajASP.
2. Kliknij prawym klawiszem myszy na folder PoznajASP i wybierz Właściwości (Properties).
Pojawi się okno PoznajASP właściwości przedstawione poniżej.
Microsoft Access w przeglądarce Internetowej
625
G eneral |v/eb Shaiing | Shamg | fPozna^SP
T»pb. Ffe Folder
Locafon: C:\
Size; 5,01 K8 (5132 tyles)
Sceondisk: 16.OK8 (16384b>lei
Contahs: 1 Fiej. 0 Folders
Deated |
28 Sutego 2002. |
17 44 |
53 |
tributes: |
I™ Read-only F Hidden r AicKve |
|
|
|
OK |
|
Cancel j |
3. Kliknij zakładkę Web Sharing.
W wyświetlonym oknie dialogowym można określić nazwę katalogu, z której użytkownicy będą mogli skorzystać, aby oglądać strony znajdujące się w tym katalogu.
Generat Web Staing j Sharing j : H Internet Infofmatton Services &e started
f* Do not shape this folder
-f Share this folder
A&ases
1
4. Kliknij przycisk opcji Share this folder.
Pojawi się okno dialogowe Edit Alias, pokazane poniżej. Katalog wirtualny ma alias, czyli nazwę, której używają przeglądarki internetowe, aby uzyskać dostęp do tego katalogu. Alias pozwala na skrócenie nazwy katalogu i zapewnia większe bezpie-
626
Programowanie w Access 2000
c zeństwo danych. Ponieważ użytkownicy nie znają dokładnego miejsca przechowywania plików na serwerze, nie mogą ich zmodyfikować.
Edit Alias
Directory:
Alias: |
;- Access permissions
| 15" Read i 1~ Write .
■ Application permissions
I C None
| f* Scripts
! f" £xecute (includes scripts)
I Script source access H* Directory browsing
OK
Cam
I
5 . Wpisz w polu Alias nazwę NorthDB, tak jak pokazano poniżej. W sekcji Access permissions musi być zaznaczone pole wyboru Read. W sekcji Application permissions powinien być wybrany przycisk opcji Scripts.
Przy zakładaniu witualnego katalogu konieczne jest określenie praw do tego katalogu. Prawo do odczytu (Read) umożliwia dostęp do stron WWW.
Opcja ta musi być wybrana, aby można było oglądać zawartość katalogu. Oprócz prawa do odczytu należy włączyć opcję Scrips dla katalogów wirtualnych, które zawierają strony ASP.
Microsoft Access w przeglądarce Internetowej
627
Directory:
JNorthDB
- Access permissions —-
F Read r Write
-Application permissions C None f*1 Scripts f* Execute (includes scripts)
f~ Script source access r" Directory browsing
"OKI Cancel
6. Po kliknięciu OK pojawi się następujące okno dialogowe, które wskazuje na to, że katalog PoznajASP będzie udostępniony pod nazwą NorthDB (zob. poniżej).
fc-MASP Propertiet
General Web Sharing J Sharing | j i Internet Information Services are started
JJJŚ
ł Do not share this folder
r f? Share this folder
i Aliases .
OK Cancel
17. Kliknij OK, aby zamknąć okno PoznajASP Properties (Właściwości).
8. Aby uzyskać szybki dostęp do wszystkich komponentów niezbędnych w ćwiczeniach tego rozdziału, wkopiuj przykładową bazę danych Nor-thwind.mdb z folderu C:\Windows\Program FilesXMicrosoft Office\Office\Sam-ples do folderu C:\PoznajASP.
628
Programowanie w Access 2000
9 . Wkopiuj plik Pracownicy .asp, który sporządziłeś na początku tego rozdziału do folderu C:\PoznajASP.
Teraz, gdy masz już miejsce na przechowywanie niezbędnych plików, przystąpimy do tworzenia plików .asp, które dadzą nam dostęp do przykładowej bazy danych w aplikacji Microsoft Access.
Nawiązywanie łączności z bazą danych Microsoft Access za pomocą DSN
Przed połączeniem się z bazą danych z przeglądarki internetowej możesz utworzyć źródło danych. Źródło danych zawiera informacje dotyczące sposobu połączenia się z dostawcą danych, w tym przypadku, bazą danych Microsoft Access. W rozdziale 3. tej książki dowiedziałeś się o trzech rodzajach źródeł danych: DSN użytkownika, DSN pliku oraz DSN systemu. DSN-y pliku są najbardziej przydatne w pracy ze stro-1 nami WWW. Ponieważ informacje wymagane do połączenia się ze źródłem danych znajdują się w pliku tekstowym, DSN-y pliku można łatwo udostępnić innym użyt- i kownikom oraz przemieścić z jednego serwera WWW na inny, jeżeli zajdzie taka potrzeba.
1. Aby utworzyć DSN pliku, otwórz Panel sterowania.
Jeżeli korzystasz z systemu operacyjnego Microsoft Windows 2000 Professional, | kliknij dwukrotnie myszą na ikonę Narzędzia administracyjne (Administrative Tools), następnie uruchom ikonę Źródła danych (ODBC). Jeżeli pracujesz na komputerze z Windows NT, Windows NT Stacja robocza, Windows 98 lub Windows 95, kliknij dwukrotnie myszą na ikonę 32-bitowe ODBC w Panelu sterowania. Pojawi się okno dialogowe ODBC Administrator źródła danych, pokazane poniżej.
Usa DSN j System DSN j File DSN | Olivets | Tracing) Connection Pooling J About J
Usef Data Sourci
Name |
DFJyer *J |
|
Microsoft Access Driver ('.mdb] |
Baza danych Visual FoxPro |
Microsoft Visual FoxPro Driver |
CRSS |
SQL Server |
dBASE Files |
Microsoft dBase Driver f.dbf) |
dBase Files-Word |
Microsoft dBase VFP Driver (".dbf |
DeluxeCD |
Microsoft Access Driver (".mdb) |
Excel Files |
Microsoft Excel Driver f.xls) |
H |
SQL Servei |
FoxPro Files ■ Word |
Microsoft FoxPro VFP Driver p.db j |
11 |
CHI Carwar -Ti |
An ODBC User data source stores tnfoimation about how to connect to the indicated data provider. A User data source ts only visible to you, and can only be used on the current machine.
Microsoft Access w przeglądarce Internetowej
629
2 . Wybierz w tym oknie zakładkę DSN Pliku (File DSN) i kliknij przycisk Dodaj (Add).
i 'ODBC Data Source Administrator
User
DSN j System DSN File DSN j Drivers) Tracing ] Connection Pooling
)
About
Look
in: DataSources -rj
ft] Add...
A n ODBC File data source allows you to connect to a data provider. File DSNs can be shared by users who have (he same drivers installed.
OK |
Cancel |
|
Help |
3. Zaznacz Driver do Microsoft Access (*.mdb) i kliknij przycisk Następne
(Next).
: reate New Data Source
ill
Select a driver for which you want to set up a data source.
LiŁ±
3.
3.
Name !
CRDB2 CR Informix CR Informix9
CR 0racle7 3.
CR 0racle8 3.
CR Sybase System 10 3.
Driver da Microsoft para arquivos texto (*.txt; *.csv] 4.
4.
wiHririniiiiHttwHiiimfHiiiffm
Driver do Microsoft dBase (*.dbf)
Advanced...
N ext>
Cancel
P odaj NorthWind jako nazwę źródła danych DSN i kliknij Dalej (Next).
Kliknij Dalej (Next). Pojawi się następujący ekran:
630
Programowanie w Access 2000
C reate New Data Source
Type the name of the file data source you want to save this connection to. Or, find the location to save to by cficking Browse.
N orthWino!
Browse...
< Back | Next >]| Cancel j
6 . Kliknij przycisk Koniec (Finish).
Create New Data SotmCSf
When you click Finish, you will create the dak source which you have just configured. The driver m. iy prompt you for more information.
File Data Source
Filename: NorthWind
Driver: Driver do Microsoft Access p.mdb)
J
< Back
Finish
Cancel
7 .
W oknie dialogowym wybierz teraz przycisk Select i podaj nazwę bazy danych, z którą chcesz się połączyć. Zaznacz Northwind.mdb w folderze PoznajASP I i kliknij OK.
Microsoft Access w przeglądarce Internetowej
631
DDBC Microsoft Access •».-
-IlJSl
Repair.,.
Compact..
r System Database
j I? None
I C Database:
Directories: c:\poznajasp
I™" Readonly f™ Exclusive
I List Files of Type: Drives:
(Access Databases (*.mijj \\B c:: IBM_PRELOAD J*]
Network::
Kliknij OK, aby zamknąć okno dialogowe ODBC Setup.
Po kliknięciu OK w oknie ODBC Adminstrator źródła danych powinna znajdować się nazwa utworzonego źródła danych NorthWind (zobacz poniżej).
Kliknij OK, aby zamknąć okno dialogowe ODBC Adminstrator źródta danych.
Ustawienie
początkowe
powoduje, że DSN pliku przechowywane jest w folderze
\Program
Files\Common
Files\ODBC\Data Sources.
Skopiuj
teraz plik NorthWind.dsn
z
folderu \Program
Files\Common
Fi-
les\ODBC\DataSources
do
swojego foldera o nazwie C:\PoznajASP.
Teraz, gdy masz już DSN użytkownika, zobaczmy, w jaki sposób można wyświetlić tabelę Pracownicy w przeglądarce internetowej. Zanim jednak będziesz mógł zobaczyć listę pracowników, zmodyfikuj w pliku .ASP kod dotyczący połączenia z bazą danych. Dodamy teraz do naszego kodu odwołanie do pliku DSN, który sporządziłeś w instrukcjach powyżej.
632
Programowanie w Access 2000
1 3. Otwórz plik Pracownicy .asp, który przygotowałeś na początku tego rozdziału i zmodyfikuj go według wzoru poniżej.
m Pracownicy - Notepad
if: . ■ " -"::
F ile Edit Format Help
%
If lsobject(session("Northwind_conn")) Then
Set conn = session("Northwind_conn") Else
Set conn = Server.Greateobject("adodb.Connection")
set session*' Nortnwind_conni End If
Zapisz modyfikacje w pliku i zamknij ten plik.
Uruchom przeglądarkę internetową.
Wpisz
http.V/Iocalhost/NorthDb/Pracownicy.asp
w
pasku
adresu przeglądarki
internetowej
i naciśnij Enter,
aby
przetworzyć plik .ASP i wygenerować stonę i
WWW.
W
przeglądarce
internetowej powinna pojawić się tabela Pracownicy
przedsta
wiona
poniżej.
File Edit View Favorites Tools Help J J} '■$ Uyarch
: Address j^j http://!ocalhosr_/NorthDB/pracownicy.asp
Pracofvnicy
1 0 ., , i , ■ c ■ , Zwrot Data Data . .
., Nazwisko Imię Stanowisko . . , , . Adres
pracownika) r „—„^^„„^„^ grzscżnosaowy urodzenia zatrudnienia ^^^^_^
12/B/1968
Przedstawiciel handlowy
5/1/1992 507-20th Se iAve. E. Apt.
i2A
2 Fuller j Wiceprezes Ids. sprzedaży
| 2/19/19521 8/14/1992 908 W. tac Capital Wa /
. .....
18. Wybierz Widok => Źródło (View => View Source), aby uzyskać wgląd do kodu.
Microsoft Access w przeglądarce Internetowej
633
«5 pracownicy[l] - Notepad
File Edit Format Help
Seta http-equiv- content-Type" content-
<TITl_E>Pr acowni cy</TITLE>
</HEAD>
<BODY>
"text/html;charset=windows-12 5Q">
j
■ STABLE BORDER=1 BGCOLOR=#ffffff CELLSPACING=0xFONT FACE="Ari a"l " COLOR=#000000 <CAPTlONxB>Pracowmcy</Bx/CAPTlONx/FONT>
<THEAD>
<TR>
<TH BGCOLOR=#COcOcO BORDERCOLOR=#000000 >
<FONT SIZE=2 FACE="AriaV COLOR=#000000>ID pracownika</FONTx/TH>
<TH BGCOLOR=#CQcOcO BORDERCOLOR=#000000 >
<FONT SIZE=2 FACE="Arial" COLOR=#000000>NaZW1 sko</FONTx/TH>
<TH BGCOLOR=#COcQcO BORDERCOLOR=#000000 >
<FONT SIZE=2 FACE="Ar1aV COLOR=#Q0QQQ0>Imi §</FONTX/TH>
<TH BGCOLOR=#COcOcO BORDERCOLOR=#00Q000 >
<FONT SIZE=2 FACE="AMaV COLOR=#000000>Stanowi sko</FONTx/TH>
<TH BGCOLOR=#cOcOcO BORDERCOLOR=#000000 >
<FONT SIZE=2 FACE="AriaT' COLOR=dt000000>Zwrot gr2ecznoceciowy</FONTx/TH>
<TH BGCOLOR=iltc0c0c0 BORDERCOLOR=#000000 >
<FONT SIZE=2 FACE="Arial" COLOR=#000000>Data urodzenia</FO(MTx/TH> <TH BGCOLOR=#COcOcO BORDERCOLOR=#000000 >
<font size=2 FACE="Arial" coLOR=#000000>Data zatrudnienia</FONTx/TH>
<TH BGCOLOR=#COCOCO BORDERCOLOR=#000000 >
<FONT SIZE=2 FACE="AHa"l" COLOR-#000000>AdreS</FONTx/TH>
<TH BGCOLOR=#c0c0c0 BORDERCOLOR=#000000 >
<FONT SIZE=2 FACE="Arial" COLOR-#000000>MiastO</FONTx/TH>
<TH BGCOLOR=#c0c0c0 BORDERCOLOR=#000000 >
<FONT SIZE=2 FACE = "Arial" COLOR=#000000>Regi On</FONTX/TH>
Zwróć uwagę, że polecenie View Source korzysta z programu Notepad.exe, aby wyświetlić plik źródłowy. Ponieważ polecenia języka skryptowego znajdujące się w pliku ASP są wykonywane na serwerze, zanim przeglądarka wyświetli daną stronę, na danej stronie WWW znajduje się tylko czysty kod HTML. Innymi słowy, przeglądarka nie widzi Twojego kodu ASP.
Nawiązywanie łączności z bazą danych Microsoft Access bez źródła danych
Można uzyskać dostęp do danych bez uprzedniego określenia nazwy źródła danych. W tym celu należy podać parametry DRIVER albo DBQ w ciągu połączenia. Parametr driver określa sterownik Microsoft Access, natomiast parametr DBQ trzyma ścieżkę dostępu do pliku bazy danych Microsoft Access. Rzuć okiem na następujący skrypt określający sposób połączenia:
Set conn = Server.CreateObject("ADODB.Connection") conn.Open "DRIVER=Microsoft Access Driver (*.mdb);DBQ=' "C: \PoznajASP\Northwind.mdb"
634
Programowanie w Access 2000
P owyższy skrypt tworzy najpierw instancję obiektu Connection pochodzącego z biblioteki ADO. Następnie otwiera on połączenie z bazą danych Northwind znajdującą się w folderze PoznajASP na dysku C, korzystając ze sterownika Microsoft Access.
Nawiązywanie łączności z bazą danych Microsoft Access przy użyciu dostawcy OLE DB
Z bazą danych Access możesz również połączyć się za pomocą nazwy rodzimego dostawcy dla Microsoft Access, którym jest Microsoft.Jet.OLEDB.4.0 (sposób korzystania z OLE DB został przedstawiony w rozdziale 3.). Aby skorzystać z połączenia OLE DB, należy określić nazwę dostawcy w parametrze Provider oraz podać ścieżkę dostępu do pliku bazy danych w parametrze Data Source, tak jak pokazano poniżej.
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
"C:\PoznajASP\Northwind.mdb"
Powyższy skrypt tworzy nową instancję obiektu ADO Connection i otwiera łączność z bazą danych Northwind, korzystając z ciągu połączenia OLE DB, określającego dostawcę danych oraz plik dostępu do danych.
Pobieranie rekordów
Teraz, gdy znasz już różne sposoby łączenia się z bazą danych, czas dowiedzieć się, w jaki sposób można wykonać proste polecenia SQL zwracające dane z dowolnej tabeli. W przykładzie poniżej pobierzemy nazwy klientów z tabeli Klienci i wyświetlimy je w przeglądarce internetowej.
Ćwiczenie 1
Uwaga: Jeżeli nie chcesz sam wprowadzać kodu, odnajdź plik o nazwie Klienci.asp na załączonym dysku i wkopiuj go do katalogu C:\PoznajASP.
1 . Uruchom program Notatnik Windows i wpisz podany poniżej kod ASP.
Microsoft Access w przeglądarce Internetowej
635
2 . Zachowaj plik pod nazwą Klienci.asp w katalogu C:\PoznajASP.
Pokazany poniżej plik Klienci.asp rozpoczyna się od określenia nazwy języka skryptowego w następujący sposób:
<% LANGUAGE=VBScript
Skrypt zawarty między znacznikami <% oraz %> jest skryptem pisanym w języku Visual Basic. Skrypt ten wykonuje następujące czynności:
Tworzy instancję obiektu Connection w bibliotece ADO.
Otwiera
łączność z bazą danych Northwind, korzystając ze sterownika
Microsoft
Access
(jest to połączenie nie wymagające nazwy źródła danych;
zostało ono
omówione
wcześniej w tym rozdziale).
Polecenie
SQL
select pobiera
wartości z pola NazwaFirmy w tabeli Klienci
i
tworzy obiekt Recordset
o
nazwie rst. Polecenie select
jest wykonane
za
pomocą metody Execute obiektu Connection. Instancja obiektu Recordset jest
utworzona w czasie wykonywania tego polecenia.
Pętla Do while służy do wydrukowania na stronie przeglądarki internetowej wszystkich rzędów przechowywanych w obiekcie Recordset (rst).
Metoda write obiektu Response (obiekt ten jest częścią modelu obiektów ASP) wpisuje wartość określonego łańcucha znaków lub wyrażenia w przeglądarce internetowej. Zawartość pola NazwaFirmy zostaje wpisana w przeglądarce za pomocą polecenia Response.write. Polecenie rst („NazwaFirmy") pobiera wartość pola NazwaFirmy z obiektu Recordset. Wartości przechowywane w obiekcie Recordset można pobrać za pomocą jednej z następujących instrukcji:
J
Response.Write rst .Fields ("NazwaFirmy")
Response.Write rst.Fields("NazwaFirmy").Value
Response.Write rst.Fields(1)
Response.Write rst.Fields(1).Value
Response.Write rst(l)
Response.Write rst("NazwaFirmy")
Ponieważ zbiór pól (Fields) jest główną kolekcją obiektu Recordset, możesz skróć swoje instrukcje, pomijając słowo Fields.
Znacznik HTML o nazwie <br> oznacza naciśnięcie klawisza Enter. Dzięki temu znacznikowi nazwy firm wyświetlone są w oddzielnych wierszach.
636
Programowanie w Access 2000
M etoda MoveNext oznacza przesunięcie się do następnego rekordu w obiekcie Recordset.
Ćwiczenie 1 (ciąg dalszy)
3. Otwórz przeglądarkę internetową (Internet Explorer albo Netscape Navigator).
Nazwa pliku: C:\PoznajASP\Klienci.asp (Cześć 1)
Klienci.asp
Language=VB5cript %> <HTHL> <HEAD>
<TITLE>Pobieranie danych</TITLE> </HEAD> <BODY>
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "DRIVER=Hicrosoft Access Driver (*.mdb);DBQ=" S
"C: \ PoznajASP\Northwind.mdb"
3et rst = conn.Execute("Select NazwaFirmy from Klienci") 'set rst = conn.Execute("Select Top 10 * From Klienci") Do vhile not rst.EOF
Response.Write rst("NazraaFirmy") fi
rst.MoveNext Loop
</html>
W pisz następujący adres: http: //localhost/northDB/Klienci.asp.
Naciśnij Enter lub kliknij Go.
W przeglądarce internetowej pojawią się nazwy klientów z tabeli Klienci w bazie danych Northwind (zobacz poniżej).
Microsoft Access w przeglądarce Internetowej
637
iPobieran.e danych - Microsoft Internet Fvp
File Edit View Favorites Tools Help
•J-" Back -
iłj Favorites yjjHistory _/
I Address j
http://localhost/rJorthDB/klienci.asp
Links
Alfreds Futterkiste
Ana Trujiflo Emparedados y helados
Antonio Moreno Taqueria
Around the Horn
Berglunds snabbkóp
Blauer See Delikates sen
Blondel pere et fils
Bólido Comidas preparadas
Bon app'
Bottom-Dollar Markets
B's Beverages
Cactus Comidas para llevar
Centro comercialMoctezuma
Chop-suey Chinese
Comercio Mineiro
Consolidated Holdings
Drachenblut Delikatessen
Du monde entier
Eastern Connection
Local intranet
d
P odział zestawu rekordów
W poprzednim zagadnieniu pracowaliśmy ze stroną ASP, która wygenerowała 91 rekordów z tabeli Klienci w bazie danych North wind i udostępniła je do wglądu w przeglądarce internetowej. Gdy potrzeba wyświetlić więcej niż kilka rekordów, dobrze jest podzielić generowany zestaw rekordów na kilka stron. W ten sposób użytkownik twojej aplikacji będzie mógł przeglądać określoną liczbę rekordów w danym czasie. W przykładzie drugim (zob. poniżej), utworzymy stronę ASP, która wyświetli tylko 12 nazw klientów na każdej stronie.
Użytkownik będzie mógł poruszać się między stronami danych, klikając na odpowiedni numer strony podany u dołu ekranu. Aby zwiększyć użyteczność strony ASP, nazwy klientów zostaną wyświetlone w postaci hiperłączy. Kliknięcie na nazwę klienta uruchomi inną stronę ASP, która wyświetli adres wybranego klienta.
638
Programowanie w Access 2000
Ć wiczenie 2
U waga: Jeżeli nie chcesz sam wprowadzać kodu, odnajdź plik o nazwie KartkLasp na załączonym dysku i wkopiuj go do katalogu C:\PoznajASP.
Uruchom program Notatnik Windows i wpisz podany poniżej kod ASP.
Zachowaj
plik pod nazwą
Kartki.asp
w katalogu
C:\l3oznajASP.
Nazwa
pliku: C:\PoznajASP\Kartki.asp
(Część
1)
i. Kartki.asp*
; ■■"■:'■■•■■.../ :
i <%8 Language=VBScript %>
|ćHTHL>
<HEADXTITLE>Podziel na strony</TITLEx/HEAD> j <BODY>
Dim conn, rst, mySQL, currPage, rows, counter
set conn = Server.CreateObject("ADODB.Connection")
conn. Open "DRIVER=Hicrosof t Access Driver (*.indb) ;DBQ=" S j "c:\PoznajASP\Northwind.mdfci"
get rst = Server.CreateObject("ADODB.Recordset")
rst.CursorType = 3 'adOpenStatic
rst.PageSize = 12
rnySQL= "Select * From Klienci ORDER BY NazwaFirmy" ! rst.Open rciySQL,conn
If Request.QueryString("CurrPage") ="" then 5 currPage=l
Else
currPage=Request.QueryString("currPage") i End if
i rst.AbsolutePage=currPage ! rows = 0
<H2>Klienci bazy danych NorthUind</H2> <I>Strona <%=currPage%> z <%=rst.PageCount%></I> <HR>
S krypt zaczyna się od deklaracji zmiennych. Ponieważ na stronach ASP wszystkie zmienne są typu variant, wygodnie jest je wymienić w jednym wierszu.
Następnie utworzony jest obiekt connection i nawiązana jest łączność z bazą danych Northwind za pomocą sterownika Microsoft Access.
Następnie utworzony jest obiekt Recordset.
Microsoft Access w przeglądarce Internetowej
639
A by umożliwić właściwy podział zestawu rekordów na poszczególne strony, należy przypisać właściwości CursorType stałą o nazwie adopenstatic. Zwróć uwagę, że skrypt korzysta z liczby (3), zamiast nazwy stałej (adopenstatic). Nazwy stałych ADO nie są zdefiniowane w VBScript. Jest to ustawienie wyjściowe. Lista stałych, które są używane z ADO, jest zdefiniowana w pliku Adovbs.inc (dla VBScript) oraz w pliku Adojavas.inc (dla JScript). Pliki te są automatycznie instalowane na dysku komputera w folderze C:\Program Files\Common Files\System\ado. Aby korzystać z nazw stałych zamiast z ich wartości, możesz dodać odwołanie do pliku Adovbs.inc u góry strony ASP, korzystając z dyrektywy #include file według wzoru poniżej:
< %@ Language=VBScript %>
< ! • • I \ ; :.:^:. ,,i ■ ' ; s i; - S " - ->
<HTHL>
<HEADXTITLE>Podeiel na strony</TITLEX/HEAD>
<BODY>
A by powyższa dyrektywa mogła działać, należy skopiować plik adovbs.inc do I folderu C:\PoznajASP. Po dodaniu powyższej dyrektywy będziesz mógł stosować w skrypcie VBScript nazwy stałych ADO zamiast ich wartości. Stosowanie nazw sta-I łych zwiększa czytelność kodu.
Strona
ustawiona jest na wyświetlanie 12 rekordów. Skorzystaj z
właściwości
PageSize,
aby
określić, ile rekodów należy wyświetlić na danej stronie.
Polecenie Select tworzy Recordset na podstawie wszystkich rekordów z tabeli
Klienci.
I • Następnie procedura pobiera stronę, na której się obecnie znajdujesz. Jeżeli zawartość zmiennej currPage jest pustym łańcuchem znaków (" "), oznacza to, że jesteś na pierwszej stronie.
I • Właściwość AbsolutePage obiektu Recordset umożliwia przejście do określonej strony po otwarciu zestawu rekordów. Właściwość ta identyfikuje numer strony, na której znajduje się bieżący rekord. AbsolutePage wynosi 1, gdy bieżącym rekordem jest pierwszy rekord w zestawie rekordów Recordset.
I • Początkowa wartość zmiennej rows wynosi zero (0). Zmienna ta ogranicza liczbę rekordów, które są wyświetlone na danej stronie.
I • Następnie, poza segmentem VBScript, segment kodu HTML wyświetla i formatuje wewnętrzny tytuł strony za pomocą znaczników <H2> oraz </H2>.
■ • Następnie komunikat informuje użytkownika o liczbie stron i obecnym numerze strony. Znacznik <i> wyświetla tekst komunikatu kursywą. Numer strony uzy-
640
Programowanie w Access 2000
s kany jest ze zmiennej currpage, natomiast ogólna liczba stron z właściwości
PageCount obiektu Recordset. • Znacznik <hr> rysuje na stronie poziomą linię.
Następny segment kodu VBScript (zob. poniżej) korzysta z pętli Do whiie...Loop, I aby policzyć rzędy w zestawie rekordów i upewnić się, że liczba rekordów wyświetlonych na danej stronie jest mniejsza od podanej wielkości strony. Nazwy firm są wypisane na każdej stronie w postaci hiperłączy przy użyciu znacznika HTML <a>. Znacznik ten posiada atrybut href, który określa docelową stronę i przekazuje dane na tą stronę, gdy użytkownik kliknie hiperłącze. Strona docelowa (Adres.asp) jest utworzona w dalszej części tego rozdziału. Znak zapytania (?) oddziela docelową stronę od przekazywanych danych. Dane dołączone do hiperłącza to nazwa pola, po której znaj- i duje się znak równości oraz wartość pola. Zatem, aby przekazać numer klienta do strony docelowej, skorzystamy z następującego polecenia:
<A
HREF="Adres.asp?IdKlienta=<%=rst("IdKlienta")%>"><%=rst("NazwaFirmy"
Na przykład, gdy użytkownik kliknie nazwę firm}' Que Delicia, następująca informacja przekazana jest do strony docelowej:
http://localhost/northdb/Adres.asp?IdKlienta=QUEDE
Znacznik <br> powoduje, że nazwa każdej firmy znajduje się w oddzielnym wierszu. Jeżeli wartość zmiennej rows jest większa niż podany rozmiar strony, rekordy są przesłane na następną stronę.
Po pobraniu wszystkich rekordów i umieszczeniu ich na odpowiednich stronach, na stronie wyrysowana jest linia pozioma za pomocą znacznika <hr>. Poniżej tej 1 linii znajduje się wykaz odnośników do poszczególnych stron.
Na zakończenie należy zamknąć wszystkie otwarte obiekty, przypisując im war- I tOŚĆ Nothing.
Microsoft Access w przeglądarce Internetowej
641
N azwa pliku: C:\PoznajASP\Kartki.asp (Część 2)
( Cartki.asp*
Do IŁile not rst.EOF and rows < rst.PageSize
<A HREF="Adres.asp?IdKlienta=<%=rst("IdKlienta" <%=rst("NazwaFirroy")%></A> <BR>
rows = rows + 1
rst.MoveNext Loop
Response.Write "<HR>" Response.Write "<B>5trony: </B>" For counter = 1 to rst.PageCount
<a hre£="Kartki.asp?currPage=<%=counter%>"x%=counter%></a> <H
Next
rst.close 3et rst = Nothing conn.Close set conn = Nothing
</BODY> </HTHL>
Ć wiczenie 2 (ciąg dalszy)
Otwórz przeglądarkę intemetową (Internet Explorer albo Netscape Navigator).
Wpisz następujący adres: http://localhost/NorthDB/Kartki.asp.
Naciśnij Enter lub kliknij Go.
Powinieneś otrzymać listę klientów z bazy danych North Wind na kilku stronach (zob. rysunek poniżej).
6. Uruchom inną stronę, kilkając na odsyłacz strony.
Uwaga: Kliknięcie na nazwę firmy nie wywołuje żadnego efektu. Aby hiperłącza mogły działać, należy najpierw sporządzić nową stronę ASP, która wyświetli adres klienta.
R ezultat strony ASP wygenerowany przez plik Kartki.asp jest łatwym w użyciu wykazem klientów z bazy danych Northwind.
642
Programowanie w Access 2000
5 Podziel na strony - Microsoft Inter
: File Edfc View Favorites Tools Help
j
v^Back "
■;■♦
> f||
H[>] tiH Search Jj Favorites ^History _
Address
JĆ]
http://kKalhost/NortriDB/kartki.asp j»]
j^Go
i Links »;
Klienci bazy danych NorthWind
Strona Iz8
Alfreds Futterkiste
AnaTrujillo Emparedados y helados
Antonio Moreno Taqueria
Around the Horn
Bergbnds snabbkóp
Blauer See Delikatessen
Blondel pere et fils
Bottom-Dollar Markets Bóhdo Comidas preparadas B's Beverages Cactus Comidas para llevar
Strony: 12 34 5 67 8
ig| Local intranet
Ćwiczenie 2 (ciąg dalszy)
U waga: Jeżeli nie chcesz sam wprowadzać kodu, odnajdź plik o nazwie Adres.asp na załączonym dysku i wkopiuj go do katalogu C:\PoznajASP.
Uruchom program Notatnik Windows i wpisz podany poniżej kod ASP.
Zachowaj plik pod nazwą Adres.asp w katalogu C:\PoznajASP.
Pierwszy segment kodu VBScript pomiędzy znacznikami <% oraz %> nawiązuje łączność z przykładową bazą danych Northwind, korzystając z dostawcy OLE DB. Polecenie select pobiera dane o wybranym kliencie. Następnie informacja zostaje zwrócona na stronę. Najpierw wpisany jest i sformatowany wewnętrzny tytuł za po-mocą znacznika <hi>. Użytkownik widzi nazwę klienta, którego informacje wdanej chwili ogląda. Poniżej znajduje się pozioma linia (zob. znacznik <hr>) oraz tabela wyświetlająca informacje o kliencie.
Microsoft Access w przeglądarce Internetowej
643
Z nacznik <table> oznacza początek tabeli. Znacznik <tr> rozpoczyna nowy rząd tabeli, a znacznik <td> wskazuje dane znajdujące się w tabeli (tzn. informacje, które są wpisane w komórce tabeli). Każdy z tych znaczników jest zamknięty znacznikiem końcowym (</table>, </tr> oraz </td>). Tabele znacznie upraszczają formatowanie informacji na stronie. Po wpisaniu danych na stronie, należy umożliwić użytkownikowi powrót do poprzedniej strony, aby mógł on sprawdzić dane innego klienta.
Nazwa pliku: C:\PoznajASP\Adres.asp (Część 1)
Adres.asp
<%@ Language=VBScript %>
<HTHL>
<HEADXTITLE>Wyniki poszukiwania</TITLEx/HEAD>
<BODY>
Dim mySQL, myPath
IdKlienta = TRIM(Request.QueryString("IdKlienta") )
myPath = "C:\PoznajASP\Northwind.radfci"
set conn = Server.CreateObject("ADODB.Connection")
conn.Open "Provider=Hicrosoft.Jet.0LEDB.4.O;Data Source=" £ myPath
get rst = Server.CreateObject("ADODB.Recordset")
rst.CursorType = 3 'adOpenStatic
mySQA= "Select * From Klienci WHERE IdKlienta='" & IdKlienta i •••"
rst.Open mySQL,conn
n
Nazwa pliku: C:\PoznajASP\Adres.asp (Część 2)
<HL>Adres klienta</Hl>
<I>Adres fiEmy <BX%=rst ("KazwaFirmy") i></EX/I>
<HR>
<TAELE t:Dlspaxi=2 ai:ig.-! = "Center">
< /TR> <TK>
<td>Hiasto:</td>
<tdxinput t.ype"'"text" r.anie="Hi»3to" valus«"<^-rsr ("Hiasco") %>" si2e-"15"x/td> </TR> <TR>
<td>Region:</td>
<tdxinput typeiB"text" na»e="Region" vaiusa"<^-r3t("Region"J^>1' 3i3e="15"X/'td> </TR> <TE>
<td>Kraj:</td>
■ctdxinput ^^^""teKt" R.ame="Kroj" vaiue=rf<%"=rst ("Kcaj") %>" ?iKe="15"x/td> </TR> <TR>
<Cd>Kod:</cd>
<cdxinput ^yp«="text" tiKwrie^'KodPoeztowy" vaiue="<**'rst ("KodPocztovy") %>" siKe="10"x/cd> </TR> <TR>
644
Programowanie w Access 2000
Nazwa pliku: C:\PoznajASP\Adres.asp (Część 3)
<TR> ~~~
<td>Faks:</td>
<tdxinput type="text" narfie»"Fak3" value*"<:*=rst ("Faks") %>" si£e='24"></tdxBR> </TR> </TABLE> <BR> <BR>
<CENTER>[ <A HREF="VBScript:history.back(l) ">2powrotem</JS> ]</CENTIR> <^
rst.close Set rst = Nothing conn.Close Set conn - Nothing %>
</BODY> </HTHL>
Hyperlink Z powrotem, który znajduje się u dołu strony wykonuje tę samą czynność co kliknięcie na przycisk Powrót (Back) w pasku narzędzi przeglądarki:
<CENTER>[ <A HREF="VBScript:history.back(l)">Zpowrotem</A> ]</CENTER>
Powyższe polecenie korzysta z metody Back obiektu History, aby władować poprzedni adres URL z wykazu odwiedzonych poprzednio stron. Ta metoda działa tak samo jak przycisk Powrót (Back) w pasku narzędzi przeglądarki. Znacznik <center> umieszcza hyperlink pośrodku wiersza.
Ć wiczenie 2 (ciąg dalszy)
Otwórz przeglądarkę internetową (Internet Explorer albo Netscape Navigator).
Wpisz następujący adres http: //localhost/NorthDB/Kartki.asp.
Naciśnij Enter lub kliknij Go.
W przeglądarce internetowej pojawią się na kilku stronach nazwy klientów z tabeli Klienci w bazie danych Northwind (zob. poniżej).
Uruchom inną stronę, klikając na odnośnik strony.
Kliknij dowolną nazwę firmy, aby uzyskać dostęp do informacji adresowych.
Po kliknięciu nazwy firmy w przeglądarce pojawi się ekran przedstawiony poniżej:
Microsoft Access w przeglądarce Internetowej
645
|
|
|
|
|
|
. Ffe |
Ed* View Favorites |
Tods Help |
|
|
|
|
|
\ -^Search |
_ij Favorite! ^History |
|
|
Addre |
S jc] top;//fcxaihost/rJorthDB/Adres, asp |
ndK!ienta=QUEEN |
T| f^Go Links " |
Adres klienta
Adres firmy Queen Coanha
Id Klienta: lOUEEN
Ulica: jAlamedados Canrrios. 891
Miasto: Region: Kraj: Kod: |
[Sao Paulo |
JSP |
|
[Brazylia |05487-020 |
|
Telefon: |
|
Fab: |
1 |
|
f 2powrotem |
il mtianet
Ograniczenie liczby zwróconych rekordów
Czasami będziesz chciał ograniczyć liczbę zwrócownych rekordów. Możesz w tym celu skorzystać ze słowa kluczowego top w poleceniur SQL, aby wyświetlić określoną liczbę rekordów. W przykładzie trzecim (zob. poniżej) zmodyfikujemy plik Klienci.asp, tak aby zwrócił tylko pierwsze 10 rekordów z tabeli Klienci.
Ćwiczenie 3
Otwórz plik C:\PoznajASP\Klienci.asp.
Odnajdź
w tym pliku polecenie rozpoczynające się od „set rst=" i
zamień je
następującym
poleceniem:
set rst = conn.Execute("Select Top 10 * From Klienci")
Zachowaj wprowadzone w tym pliku zmiany.
W przeglądarce (Internet Explorer albo Netscape Navigator) wpisz następujący
adres: http://localhost/NorthDB/Klienci.asp
5. Naciśnij Enter albo kliknij Go.
Rezultat zmodyfikowanego pliku Klienci.asp pokazany jest poniżej. W przeglądarce wyświetlone są tylko nazwy dziesięciu klientów.
646
Programowanie w Access 2000
Tools
Help
^Search
gjFavorites
'3
Pobieranie danych - Microsoft
File Edit View Favorites Address*"*
http://localhost/NorthDB/klienci.asp
| Links
A lfreds Futterkiste
Ana Trujillo Emparedados y helados
Antonio Moreno Taqueria
Around the Horn
Berglunds snabbkóp
Blauer See Delikatessen
Blondel pere et fils
Bólido Comidas preparadas
Bon app'
Bottom-Dollar Markets
[iJoone
{Hi Local intranet
P obieranie rekordów przy użyciu metody GetRows
Zamiast korzystać z pętli w celu pobrania rekordów, możesz zastosować metodę GetRows obiektu Recordset, aby pobrać rekordy do dwuwymiarowej tablicy. Widziałeś już przykłady posługiwania się metodą GetRows w rozdziale 2. i 3. tej książki w procedurach VBA korzystających z obiektów DAO oraz ADO. Przykładowa strona ASP (zob. ćwiczenie 4 poniżej) korzysta z metody GetRows, aby umieścić rekordy z tabeli spedytorzy w tablicy. Po umieszczeniu rekordów w tablicy są one wpisane do tabeli, którą użytkownik widzi w swojej przeglądarce. Jeżeli wpiszesz rekordy do tablicy, możesz zwolnić obiekty Recordset oraz connection wcześniej niż jest to i możliwe za pomocą pętli, i tym samym szybciej odciążyć serwer.
Microsoft Access w przeglądarce Internetowej
647
Ć wiczenie 4
U waga: Jeżeli nie chcesz sam wprowadzać kodu, odnajdź plik o nazwie PobierzSzybko.asp na załączonym dysku i wkopiuj go do katalogu C:\PoznajASP.
I Uruchom program Notatnik Windows i wpisz podany poniżej kod ASP. 2. Zachowaj plik pod nazwą PobierzSzy bko.asp w katalogu C:\PoznajASP.
Nazwa pliku: C:\PoznajASP\PobierzSzybko.asp (Część 1)
PobierzSzybko.asp
<%@ Language=VBScript %>
<HTML>
<HEAD><TITLE>Szybkie pobieranie danych</TITLE></HEAD>
<BODY>
<%
Dim conn, rst, strSQL, myPath, fid, allShippers, RowCounter, ColCounter
Dim NumOfCols, NumOfRows, currField
strSQL = "SELECT * FROM Spedytorzy ORDER BY IDspedytora"
myPath = "C:\PoznajASP\Northwind.mdb"
Set conn = Server.CreateObject("ADODB.Connection")
conn.open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & myPath
Set rst = conn.Execute(strSQL)
Response.Write "<TABLE Border=1 ><TR>" &. VbCrLf
For Each fid In rst.Fields
Response. Write 11<TD><B>" & fid.name & "</B></TD>" & VbCrLf
Next
Response.Write "</TR>" & VbCrLf allShippers = rst.GetRows
rst. Close
Set rst = Nothing
conn.Close
Set conn = Nothing
648 |
Programowanie w Access 2000 |
||||
Nazwa pliku: C:\PoznajASP\PobierzSzybko.asp (< |
:ześć 2) |
||||
I : |
'",, PobierzSzybko.asp |
|
|||
|
|
NumOfCols = UBound(allShippers, 1) ' kolumny |
|
||
|
|
NumOfRows = UBound(allShippers, 2) Wiersze |
|||
|
|
For RowCounter = 0 To NurnofRows |
|
||
i |
|
Response.Write "<TR>"& VbCrLf |
|
||
|
|
For ColCounter = D To NumOfCols |
|
||
|
|
currField = allShippers(ColCounter, RowCounter) |
|
||
|
|
IflsNull(currField) Then |
|
||
|
|
currField = currField &. " " |
|
||
I |
|
Elsełf currField= "" Then |
|
||
|
|
currField^"." |
|
||
|
|
EndH |
|
||
|
|
Response.Write "<TD Valign=:Top>" |
|
||
|
|
Response.Write currField |
|
|
|
|
|
Response.Write "</JQ>" & VbCrLf |
|
|
|
|
|
Next |
|
|
|
|
|
Response.Write "<TR>" & VbCrLf |
|
|
|
|
|
Next |
|
|
|
|
|
Response.Write "<n"ABLE>" |
|
|
|
|
|
|
</BODY> |
|
|
|
|
■i \ |
</HTML> |
J |
|
Przedstawione powyżej segmenty kodu VBScript korzystają z dostawcy OLE DB, aby połączyć się z bazą danych Northwind. Po wykonaniu polecenia SQL metoda write obiektu Response służy do sporządzenia tabeli:
Response.Write "<TABLE Border=l><TR>" & VbCrLf
Stała vbcrLf oznacza naciśnięcie klawisza Enter oraz rozpoczęcie nowego wiersza. Ta stała jest częścią języka VBScript, zatem nie musisz jej deklarować przed użyciem. Znacznik <tr> dodaje nowy rząd do tabeli. Pętla For Each...Next pobiera nazwy pól z zestawu rekordów i umieszcza je w nagłówku tabeli (w pierwszym rzędzie). Zwróć uwagę na to, w jaki sposób znaczniki HTML są użyte wewnątrz segmentu kodu VBScript. Po wypełnieniu nagłównków procedura korzysta z metody GetRows obiektu Recordset i umieszcza wszystkie rekordy w zmiennej o nazwie allshippers. Ponieważ masz już wszystkie niezbędne dane, możesz w tej chwili zamknąć Recordset i zerwać połączenie z bazą danych. Teraz, gdy rekordy znajdują się w dwuwymiarowej tablicy przed wpisaniem ich do komórek tabeli, możesz skorzystać z funkcji VBA o nazwie ubound, aby sprawdzić, ile pobrano rzędów oraz kolumn. Dane są wpisane w komórkach tabeli przy użyciu pętli For.. . Next. Ponieważ nie-
Microsoft Access w przeglądarce Internetowej
649
które pola mogą nie zawierać żadnych danych, poszczególne komórki tabeli mogą wyglądać tak jak przedstawiono poniżej:
ID spedytora |
JNazwaFirmy |
| Telefon |
1 |
[Speedy Express |
((503)555-9831 |
2 |
(United Package |
((503)555-3199 |
|
[Federal Shipping |
1(503)555-9931 |
1 |
(Airborne Express |
|
f5 ...................... |
Boxes Etc. |
(503) 555-9090 |
\ |
(DHL |
|
Aby uniknąć takich „dziur" w tabeli, kod VBScript umieszcza znak „ "
(a non-breaking space - czyli spacja) w komórce tabeli, jeżeli pole zawiera wartość Null:
currField = currField & " "
Powyższe polecenie dołącza znak „ " po danych pobranych z danego pola rekordu, co powoduje pojawienie się ramki komórki. Możesz również napisać następujące polecenie, aby nie pozwolić na jakiekolwiek luki w tabeli:
Response.Write "<TD>" & currField & " </TD>"
Oprócz tego, jeżeli pole zawiera wartość zerową („ "), procedura VBScript umieszcza kropkę w komórce tabeli, aby rozróżnić pomiędzy danymi, które na pewno nie istnieją(" ") oraz informacją, która być może istnieje, ale nie jest wiadoma (Null).
Przypomnij sobie, że ustawiając właściwość Zerowa długość dozwolona (Allo-wZeroLength) w polu tabeli na Tak oraz właściwość Wymagane (Required) na Nie, możesz wpisać podwójne cudzysłowy, aby wskazać, że dane nie istnieją dla tego pola (np. nie każdy klient będzie posiadał numer faksu). Pozostawienie pustego pola wskazuje, że informacja być może istnieje, ale nie jest znana w momencie wprowadzania danych. Zmodyfikowana tabela użytkownika pokazana jest poniżej:
650
Programowanie w Access 2000
jED spedytora |
NazwaFirmy |
Telefon |
|1 |
Speedy Express |
(503)555-9831 |
2 |
United Package |
(503)555-3199 |
pr |
Federal Shipping |
(503)555-9931 |
|
Airborne Express |
1 |
|
Boxes Etc. |
(503)555-9090 |
6 |
DHL |
|
Ćwiczenie 4 (ciąg dalszy)
Otwórz przeglądarkę internetową (Internet Explorer albo Netscape Navigator).
Wpisz następujący adres http: //localhost/NorthDB/PobierzSzybko.asp.
Naciśnij Enter lub kliknij Go.
W przeglądarce internetowej pojawi się wykaz spedytorów pokazany w tabeli (zob. poniżej).
Uruchom
bazę
danych Northwind w folderze C:\PoznajASP
i
otwórz tabelę Spe
dytorzy
w trybie Projektuj.
Kliknij
w polu Telefon
i
zmień właściwość Wyma
gane
(Required)
tego
pola na Nie. Zmień także właściwość Zerowa
długość do
zwolona
(Allow
Zero Length) na
Tak. Zachowaj zmiany w tabeli i otwórz jąj
w
trybie widoku. Dodaj dwa nowe rekordy, tak jak pokazano w tabeli
powyżej.
Nie
wpisuj danych w polu Telefon
dla
spedytora Airborne
Express. Wpisz
d
podwójne
cudzysłowy w polu Telefon
dla
spedytora DHL. Po zachowaniu re
kordu
znaki cudzysłowów znikną.
Zamknij tabelę Spedytorzy oraz Microsoft Access.
Wróć
do przeglądarki i naciśnij klawisz F5, aby odświeżyć dane lub
kliknij przy
cisk
Go.
Przed wprowadzeniem zmian w tabeli spedytorzy w przeglądarce internetowej j pojawiają się następujące dane wygenerowane przez plik PobierzSzybko.asp:
Microsoft Access w przeglądarce Internetowej
651
3 Szybkie pobieranie d |
|
|
|
-|n|x| |
|
File Edit View |
Favorites Tools |
Help |
|
|
|
^Back * .1 |
j j ^ a |
Search |
fly Favorites |
^History | ia| |
|
Address jj[} http:/ |
/localhost/NorthDB/PobierzSzybko .asp |
|
Links » |
||
|
|
|
|
|
|
(IDspedytora |
NazwaFirmy |
Telefon |
|
|
|
jl |
Speedy Express |
|(503) |
555-9831 |
|
|
|
United Package |
1(503) |
555-3199 |
|
|
|3 |
Federal Shipping |
|(503) |
555-9931 |
|
|
|
|
|
|
|
|
@Done |
|
|
|
^ Local intranet |
|
Użycie pól kombi
Formularze w aplikacji Accessa często korzystają z pól kombi w celu ułatwienia wyszukiwania informacji w bazie danych. Ponieważ pola kombi wyświetlają tylko dostępne opcje, nie musisz się obawiać, że użytkownik wpisze błędne informacje. Następny przykład ilustruje, w jaki sposób można wyświetlić pole kombi w przeglądarce i władować do niego nazwy produktów, po czym wyświetlić informacje o wybranym produkcie w postaci tabeli.
Ćwiczenie 5
U waga: Jeżeli nie chcesz sam wprowadzać kodu, odnajdź plik o nazwie PobierzProdukt.asp na załączonym dysku i wkopiuj go do katalogu C:\PoznajASP.
1 . Uruchom program Notatnik Windows i wpisz podany poniżej kod ASP. i 2. Zachowaj plik pod nazwą PobierzProdukt.asp w katalogu C:\PoznajASP.
652
Programowanie w Access 2000
N azwa pliku: C:\PoznajASPYPobierzProdukt.asp (Część 1)
i PobierzProdukt.a*p*
<%@ Language=VBScript
Dim conn, rst, strSQL
Set conn = Server.CreateObject("ADODB.Connection")
'conn. ConnectionTimeout = 15
'conn.CornmandTimeout - 30
conn.Open "Driver={Microsoft Access Driver f.mdb)}; DBQ=" &_
Server.MapPath("northwind.mdb") & ";" Set rst = Server.CreateObjectC'ADODB.Recordset") If Len(Request.QueryString("ldProduktu")) <> 0 Then
strSQL="SELECT* FROM Produkty WHERE ldProduktu=" rst.Open(strSQL & Request.QueryString("ldProduktu")) conn, 0, 1 If Not rst. EOF Then rst.MoveFirst %>
<TABLEBorder=1> <TR>
<TD><B>ld produktu</B><TD> <TD><B>Nazwa produkt u </Bx/TD> <TDxB>llość</B></TD> <TD><B>Stan magazynu</Bx/TD> <TD><B>Cena</BxiTD>
<TR>
<TD A!ign="Center"x%=rst.Fields("ldProduktu")%xyTD> <TDAiign="Left"><%=rst.Fields("NazwaProduktu")%></rD> <TDA!ign="Left"x%=rst.Fields("llośćJednostkowa")%></TD> <TD Align="Center"x%=rst.Fields("StanMagazynu")%></TD> <TD A!ign="Right"><%=FormatCurrency(rst.Fields("CenaJednostk(iwa")2)%x/rDs
</TR> </TABLE>
Segment kodu VBScript pokazany powyżej zaczyna się od nawiązana łączności ze źródłem danych. Zamiast korzystać z pełnej ścieżki dostępu do pliku bazy danych Northwind, powyższy kod demonstruje, w jaki sposób można skorzystać z metody MapPath obiektu server, aby pobrać ścieżkę bazy danych.
Polecenie
Server.MapPath("Northwind.mdb")
zwróci następującą ścieżkę: C:\PoznajASP\Northwind.mdb.
A jak dodasz polecenie Response.write server.MapPath („Northwind") do powyższego kodu, nazwa pliku i jego ścieżka pojawią się w przeglądarce. Nie trudno się jednak domyśleć, że korzystanie z polecenia Server.MapPath powoduje dodat-
1 . •
Microsoft Access w przeglądarce Internetowej
653
k owe obciążenie dla serwera. Stąd, przed zaimplementowaniem swojej strony na serwerze, aby uzyskać lepsze wyniki, zamień polecenie Server.MapPath pełną ścieżką dostępu do pliku (zob. kod w poprzednim przykładzie).
Zwróć uwagę na to, że przed otwarciem bazy danych zostały użyte następujące polecenia:
conn.ConnectionTimeout = 15 conn.CommandTimeout = 3 0
Pierwsze z tych poleceń przypisuje wartość 15 właściwości connectionTimeout obiektu connection. Oznacza to, że system ma czekać 15 sekund przed anulowaniem próby połączenia z bazą danych i wyświetleniem komunikatu błędu. W drugim poleceniu powyżej właściwość CommandTimeout obiektu Connection określa, jak długo należy czekać podczas wykonywania danej komendy, zanim próba połączenia zostanie anulowana i wygnerowany zostanie komunikat o błędzie. Początkowe ustawienia właściwości ConnectionTimeout oraz CommandTimeout wynoszą 30 sekund. Użycie właściwości ConnectionTimeout oraz CommandTimeout w przykładowej procedurze nie jest wymagane. Przed zastosowaniem tych właściwości w swoich własnych aplikacjach, upewnij się, że źródło danych oraz dostawca danych, z którego korzystasz dysponują tymi właściwościami.
Następnie procedura tworzy obiekt Recordset i otwiera go, korzystając z otwartego połączenia z bazą danych. Recordset otwarty w trybie Forward-Only (0
= adOpenPorwardOnly) Oraz Read-Only (1 =adLockReadOnly) . Jak Wspomiano
wcześniej, aby korzystać z nazw ADO stałych należy wprowadzić dyrektywę #mciu-de File na początku strony ASP. Polecenie select zawiera klauzulę where, która pobierze tylko rekord odnoszący się do wybranego w polu kombi produktu.
Dane wybranego rekordu są sformatowane w postaci tabeli. W tym przykładzie nazwy nagłówków tabeli są wprowadzone w kodzie programu. Aby uzyskać nazwy nagłówków, programatycznie należy skorzystać ze struktury pętli (zob. plik Pobierz-Szybko.asp przygotowany we wcześniejszym przykładzie). Po wpisaniu nazw nagłówków kolumn tabeli procedura wypełnia komórki tabeli odpowiednimi danymi. Tabela będzie zawierać tylko jeden rząd danych, ponieważ Recordset był ograniczony do jednego produktu wybranego w polu kombi. Po umieszczeniu danych w tabeli obiekt Recordset zostaje zamknięty.
654
Programowanie w Access 2000
N azwa pliku: C:\PoznajASPVPobierzProdukt.asp (Część 2)
> PobierzProdukt.as
EndH
rst.Close EndH
rst.Open "Produkty", conn, 0,1 If Not rst.EOF Then
rst.MoveFirst
<FORM Aciion="./PobierzProdukt.asp" Method="get"> <B>Wybierz produkt:</BxBR> <:SELECT Name="ldProduktu"> <0PTI0Nx/0PTI0N>
Do While Not rst.EOF
<OPTION Value="<%=rst.Fields("ldProduktu")%>"x%=rst.Fields("NazwaProduktu")%x/OPTION>
rst.MoveNsxt Loop
</SELECT>
<INPUT Type="Submit" Value="lnforrnacje">
</FORM>
EndH
rst. Close
Set rst = Nothing
conn.Close
Set conn = Nothing
3
Następnie zostaje otwarty drugi Recordset. Tym razem kod otwiera całą tabelę produkty i korzysta z pętli, aby zbudować listę produktów do wyświetlenia w polu kombi. Dla każdego rekordu utworzony jest znacznik HTML o nazwie <option>. Wartością tego znacznika jest wartość pochodząca z pola idProduktu, natomiast nazwa wartości ustawiona jest na wartość z pola NazwaFroduktu. Pierwsza wartość w polu kombi jest pustym wierszem, którą otrzymaliśmy przez pominięcie atrybutów wartości i nazwy wewnątrz znacznika <option>:
<OPTION></OPTION>
Pole kombi jest częścią formularza. Znacznik <form> jest stosowany do wygenerowania formularza HTML. Formularze umożliwiają użytkownikowi wprowadzanie danych w przeglądarce i stanowią miejsce, w którym można umieścić kontrolki ActiveX. W zależności od zastosowanej metody przekazu danych rozróżniamy dwa typy formularzy: get oraz post. Ten przykład korzysta z metody get, która wysyła infor-
Microsoft Access w przeglądarce Internetowej
655
m acje do serwera w adresie URL (zob. następny przykład dotyczący zastosowania formularzy z metodą post).
Wewnątrz segmentu ograniczonego znacznikami <form> oraz </form> można wprowadzić znaczniki reprezentujące rozmaite formanty HTML. W tym przykładzie formularz zawiera pole listy utworzone za pomocą znacznika <select> oraz przycisk utworzony za pomocą znacznika <input>.
Kiedy użytkownik kliknie na przycisk o nazwie Informacje nazwa produktu wybrana w polu kombi przekazana zostanie na stronę ASP, określoną w parametrze action wewnątrz polecenia rozpoczynającego się znacznikiem <form>.
Ćwiczenie 5 (ciąg dalszy)
Otwórz przeglądarkę internetową (Internet Explorer albo Netscape Navigator).
Wpisz następujący adres http: //localhost/NorthDB/PobierzProdukt.asp.
Naciśnij Enter lub kliknij Go.
Po zażądaniu strony Active Server Page (PobierzProdukt.asp) w twojej przeglądarce pojawi się następujący formularz:
3 http: . localhost Noi thDO PobierzProdukt.as
| File Edit View Favorites Tools Help
| -^Back - ^) jTj 4} ^Search JJFavorites -^Hi
JAddress j|J!] http ://localhost/NorthDB/Pobier7produkt. asp
JDX
3o i ! Links
Wybierz produkt:
"*] Informacje
' Mi Done
ocal intranet
Po otwarciu pola kombi pojawia się lista produktów. Zwróć uwagę, że pierwszy wpis w tym wykazie jest pustym wierszem.
656
Programowanie w Access 2000
||http://locaIhost/NorthDB/Pobief
=l3l2Si
File Edit View Favorites Tools Help
•J-Bacl - J j j $ Search .i| Favorites jHrstory
Address «J] http://localhost/NorthDB/PobierzProdul<t,asp
' _J kinks
W ybierz produkt:
|
Informacje |
|
|
Chai Chang Aniseed Syrup Chef Anton's Cajun Seasoning Chef Anton's Gumbo Mix Grandma's Boysenberry Spread Uncle Bob's Organic Dried Pears Northwoods Cranberry Sauce Mishi Kobe Niku Ikura ■» |
I Done
Iffg Local irtranet
Po wybraniu nazwy produktu w polu kombi i kliknięciu przycisku Informacje w przeglądarce pojawia się tabela przedstawiająca dane o wybranym produkcie:
3 http: . localhosL NorthDB •Pob.er.rl'rori.ikl.asp.'I
J File Edit View Favorites Tools Help
•^t> ' j J J ^Search _J Favorites J History _> ,J
[ Address j#j http://localhost/NorthDB/PobierzProdukt.asp?IdProduktu=10 _3
J
Links
l id produktu jNazwa produktu Dose
10 jlkura f^2"2
Wybierz produkt:
I Stan magazynu C ma
Informacje
I Done
.ocal in:ranet
4
Microsoft Access w przeglądarce Internetowej
657
J eżeli zastosujesz metodę get w celu przesyłania informacji do serwera WWW, parametry danych są widoczne w pasku adresu twojej przeglądarki (zob. rysunek powyżej). Ponieważ dane są widoczne, możesz je łatwo sprawdzić, spoglądając na ciąg adresu URL. Wadą przekazywania informacji metodą get jest to, że każdy może obejrzeć przekazywane dane i ponieważ długość adresu URL jest ograniczona do 2,048 znaków w przeglądarce Microsoft Internet Explorer, metoda ta może być używana z niewielką liczbą parametrów.
Użycie pola listy
W poprzednim zagadnieniu przeanalizowałeś przykład pobierania informacji przez wybór nazwy produktu z pola kombi. Czasami jednak użytkownik może zechcieć wyszukać więcej niż jeden produkt. Aby sprostać temu żądaniu, należy przygotować pole listy, które umożliwi wybór kilku opcji.
Ćwiczenie 6
U waga: Jeżeli nie chcesz sam wprowadzać kodu, odnajdź plik o nazwie Pobierz-Wiele.asp na załączonym dysku i wkopiuj go do katalogu C:\PoznajASP.
U ruchom program Notatnik Windows i wpisz podany poniżej kod ASP.
Zachowaj plik pod nazwą Pobierz Wielcasp w katalogu C:\PoznajASP.
Nazwa pliku: C:\PoznajASP\PobierzWiele.asp (Część 1)
-J7uJ~Ss* x**^-J
a nguage^VB Script %> <HTML>
I <HEAD><TITLE>Wy bierz produkty</T!TLE></HEAD> i <BODY> i <%
I Dim conn, rst, strSQL, totalltems, tbIHead, tbIRow i Set conn = Server. CreateObjectfADODB.Connection") ! conn.ConnectionTimeout = 15 I conn.CommandTimeout = 30 I conn.Open "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" &_
Server.MapPath("northwind.mdb") & ";" ! Set rst => Server.CreateObjectfADODB.Recordset")
Przedstawiony powyżej segment kodu VBScript nawiązuje łączność z bazą danych Nortwhind za pomocą sterownika Microsoft Access i tworzy instancję obiektu Recordset. Zobacz poprzednie ćwiczenie dotyczące użycia właściwości connection-Timeout oraz CoitimandTimeout obiektu Recordset oraz metody MapPath obiektu Se-
rver.
658
Programowanie w Access 2000
N azwa pliku: C:\PoznajASPVPobierzWiele.asp (Część 2)
FTf Len(Request.QueryString("ldProduktu'")) <> 0 Tlien
strSQL= "SELECT * FROM Produkty WHERE 1dProduktiF=" totalitems = Request. QueryStfing("ldProduktu").Coijnt myValues = Request.QueryString("idProdul<tu").Item Response-Write VP><B> Wygenerowano zapytanie SQL:</B>" f totalitems = 1 Then
rst.OpenfstrSQL 8. Request.QueryStringCldProduktu'')), conn, 0,1
<PRE><%= strSQL & Request.QueryStringfldProduktu") %></PRE>
Bse
strSQL="SELECT* FROM Produkty WHERE IdProduktu tN (' rst.Open(strSQL & myValues 8,")"), conn, 0,1
<PRE><%= strSQL & myValues & ")" %></PRE>
Endh
Response.Write "</P><TABLE Border=1>"
tbIHead = "<TRxTD><B>ld Produktu</B></TD>"
tbIHead = tbIHead & "<TD><B>Nazwa produktu</B></fT"D>"
tbIHead = tbIHead & "<TD><B>llosc</B><,aD>"
tbiHead = tblHead & "<TD><B>Stan magazynu</B></TD>"
tbIHead = tbIHead & "<TD><B>Cena jednostkowa</B><nT»</TR>"'
Response.Write tbIHead
Kod sprawdza, czy użytkownik wybrał opcje w polu listy. Jeżeli przynajmniej jeden produkt został zaznaczony, procedura definiuje polecenie select i korzysta z metody Querystring obiektu Request, aby zwrócić ilość wybranych produktów. Liczba ta jest następnie zachowana w zmiennej o nazwie totalitems. Polecenie Request.Querystring pobiera numery identyfikacyjne wybranych produktów i umieszcza je w zmiennej o nazwie myValues. Jeżeli użytkownik zaznaczył w polu listy tylko jeden produkt, Recordset jest otwarty przy użyciu następującego polecenia:
rst.Open(strSQL & Request.Querystring("IdProduktu")), conn, 0, 1
Zwróć uwagę na 0 oraz 1 na końcu polecenia. Liczby te oznaczają typ sporządzanego zestawu rekordów: forward-only (0) - wyszukiwanie do przodu, oraz readonly (1) - tylko do odczytu.
Następne polecenie,
<PRE><%=strSQL & Request.Querystring("IdProduktu") %></PRE>
wpisze treść polecenia SQL w przeglądarce. Użytkownik będzie w ten sposób wiedział, jakie polecenie wygenerowo dane, które w danej chwili ogląda. Znaczniki HTML <pre> oraz </pre> powodują, że tekst wpisany pomiędzy nimi jest sformatowany tak, jak został wpisany. Zachowane są odstępy spacji oraz naciśnięcie klawisza Enter.
Microsoft Access w przeglądarce Internetowej
659
J eżeli użytkownik wybrał więcej niż jeden produkt w polu listy, zmienna strQL zostaje wypełniona poleceniem select, które korzysta ze słowa kluczowego in po klauzuli where. Zapis synktaktyczny tego polecenia wygląda następująco:
SELECT * FROM nazwaTabeli WHERE nazwaKolumny IN(lista wartości)
nazwaTabeli jest nazwą tabeli, z której mają być pobrane rekordy,
nazwaKolumny
jest
nazwą kolumny zawierającej wartości, które będą porównane
z
listą wartości,
lista
wartości jest
listą wartości, które chcemy pobrać. Listę tę należy
umieścić
w
nawiasie po słowie kluczowym in.
Poszczególne
wartości należy oddzielić
przecinkami.
Zakładając, że użytkownik wybrał w polu listy produkty o identyfikatorach 1, 3, oraz 6, zostanie wygenerowane następujące polecenie SQL:
SELECT * FROM Produkty WHERE IdProducktu IN (1, 3, 6)
Pozostały segment kodu powyżej tworzy tabelę w przeglądarce. Nagłówki kolumn dla tabeli przechowywane są w zmiennej tblHead i umieszczone w tabeli przy użyciu następującego polecenia:
Response.Write tblHead
Nazwa pliku: C:\PoznajASP\PobierzWiele.asp (Część 3)
PobierzWiele.asp
I Do White Not rst.EOF
tblRow= "<TRxTD Align='Center'>" & rst.Fields("ldProduktu") & "</TD>" tbIRow = tbIRow & "<TD Align='Left'>" & rst.Fields("NazwaProduktu") & "</TD>" tbIRow = tbIRow & "<TD Align=Left'>" & rst FieldsflloscJednostkowa") Ł "</TD>" tblRow= tbIRow & "<TD Align='Center'>" 8, rst.FieldsfStanMagazynu") & "</TD>"
tbIRow = tbIRow & "<TD Align='Right'>" & FormatCurrency(rst.Fields("CenaJednostkowa"),2) & "</TD></TR>" Response.Write tbIRow rst.MoveNext Loop
Response.Write "</TABLE>" rst. Close End It
rst.Open "Produkty", conn. 0,1 IfNotrst.EOFThen
rst.MoveFirst %>
<FORM Actiotv="./PobierzWiele.asp" M9thod="GET>
<B>Wybierz produkty <BR>przytrzymaj klawiszCTRL lub SHIFT:</BxBR>
<SELECT Name="ldProduktu- MULTIPLE Si;e=B>
Do While Not rst.EOF
<OPTIONVaiue="<%=rstFieldsCldProduktu")%>"x%=r8t.Fields("NazwaProduktu")%></OPTION>
rst.MoveNext Loop
660
Programowanie w Access 2000
P o umieszczeniu nagłówków w tabeli zmienna tblRow użyta jest do przechowywania informacji dotyczącej jednego rekordu (rzędu), a polecenie Response. writetbiRow umieszcza informacje o rekordzie w rzędzie tabeli. Komórki tabeli są sformatowane przy użyciu ustawień parametru Align (Center, Right, oraz Left). Po pobraniu następnego rekordu, pętla do while wypełnia poszczególne rzędy tabeli, aż do napotkania końca zbioru rekordów. Po wprowadzeniu wszystkich informacji do przeglądarki tabela jest zamknięta za pomocą znacznika </table> i sam Recordset jest również zamknięty.
Następnie kod VBScript otwiera Recordset oparty na tabeli Produkty i pobiera id produktów oraz ich nazwy do włączenia ich w polu listy. Sekcja formularza HTML zawiera słowo kluczowe multiple w znaczniku select, co informuje przeglądarkę o potrzebie utworzenia pola listy. Rozmiar pola listy ustawiono na wyświetlenie ośmiu produktów.
Nazwa pliku: C:\PoznajASP\PobierzWiele.asp (Część 4)
.. PobierzWiele.asp
I </SEI_ECT>
<INPUT Type="Submit" Va!ue="Pobierz informacje"> I </FORM>
<%
EndH
rst. Close
Setrst= Nothing | conn. Close I Set conn = Nothing | %>
</BODY>
</HTML>
J
Aby użytkownik mógł przekazać swój wybór do serwera, formularz zawiera przycisk z etykietą Pobierz informacje. Procedura kończy się zamknięciem obiektów Recordset oraz Connection oraz zwolnieniem pamięci.
Ćwiczenie 6 (ciąg dalszy)
Otwórz przeglądarkę internetową (Internet Explorer albo Netscape Navigator).
Wpisz następujący adres http://localhost/NorthDB/PobierzWiele.asp.
Naciśnij Enter lub kliknij Go.
Przeglądarka wyświetli pole listy. Wybierz w tym polu produkty wskazane na rysunku poniżej i kliknij przycisk Pobierz informacje.
Microsoft Access w przeglądarce Internetowej
661
P o zaznaczeniu produktów w polu listy i kliknięciu na przycisk Pobież informacje w przeglądarce internetowej pojawiają się następujące dane:
5 Wybierz produkty -Miiuxoft Internet Explorer
File Edit View Favorites Tools Help
.; ■■'..... ■ . ' , . ■ . . •
■ Address jg] http://localhost/NorthDb/PobierzWiele.asp ^8UdProduktu=58adProdul<tu=78JdProduktu=8_£] f^Go Links
Wygenerowano zapytanie SQL:
SELECT • FROH Produkty WHERE IdProduktu IN (3, 5, 7, 8)
(Id Produktu jNazwa produktu |
Hose |
Stan magazynu |
Cena jednostkowa |
|
1 3 |
jAniseed Syrup |
12-550 ml but. |
13 |
$10.00 |
| 5 |
[Chef Anton's Gumbo Mix |
;36 pud. |
0 |
$21.35 |
i 7 |
jUncle Bob's Organic Dried Pears |
12 - 500 g op. |
15 |
$30.00 |
I 8 |
:[Northwoods Cranberry Sauce |
12 - 350 g op |
6 |
$40.00 |
W ybierz produkty
przytrzymaj klawiszCTRL lub SHIFT:
1
Chai
Chang
Aniseed Syrup
Chef Anton's Cajun Seasoning
Chef Anton's Gumbo Mix
Grandma's Boysenberry Spread
Uncle Bob's Organic Dried Pears
Northwoods Cranberry Sauce
Pobierz informacje
. .. i
I Local intranet
Dodawanie danych do tabeli
Możesz używać strony WWW w celu pobrania danych od użytkownika i zachowania ich następnie w tabeli aplikacji Microsoft Access. Następujące ćwiczenie tworzy prosty formularz służący do wprowadzania danych. Zawiera on tylko dwa pola. Celem tego formularza jest umożliwienie użytkownikom dodanie nowych spedytorów do tabeli spedytorzy w bazie danych Northwind.
Ćwiczenie 7
U waga: Jeżeli nie chcesz sam wprowadzać kodu, odnajdź plik o nazwie WpiszDa-ne.asp na załączonym dysku i wkopiuj go do katalogu C:\PoznajASP.
662
Programowanie w Access 2000
U ruchom program Notatnik Windows i wpisz podany poniżej kod ASP.
Zachowaj plik pod nazwą WpiszDane.asp w katalogu C:\PoznajASP.
Nazwa pliku: C:\PoznajASPYWpiszDane.asp (Część 1)
WpiszDane.asp
<%@ Language=VBScript %>
|<%
Dim con, strCon, strSQL, nazwa, tel, dobrze
nazwa=Request("txtNazwaFirmy")
tel=Request("tKtTelefon")
For Each key In Request. Form
If Request. Form(key)= "" Then
If key = "txtNazwaFirmy" Then Response.Write "<FONT Color = 'Blue'>Wpisz nazwę spedytora. </Font>"
Else Response.Write "<FONT Color = 'Red>Wpisz numer telefonu.</Font>"
End W
dobrze = False
Exit For
End If
dobrze=True Next
=.O xl
Pokazany powyżej segment kodu VBScript przypisuje wartości zmiennym nazwa oraz tel. Wartości te są pobrane z pól tekstu znajdujących się na formularzu HTML. Aby pobrać dane z formularza, kod korzysta z polecenia Request.Form("nazwa"),. gdzie nazwa jest nazwą pola w formularzu (pole tekstu, pole wyboru, itp.). Kod VBScript powyżej korzysta ze skróconej wersji polecenia Request. Form w następującej formie:
Request("txtNazwaFirmy").
Aby usunąć spacje na początku oraz końcu tekstu wpisanego w polach tekstu, możesz skorzystać z funkcji trim, która wygląda tak:
nazwa =TRIM(Request("txtNazwaFirmy")
Pętla For Each...Next sprawdza poprawność wprowadzonych danych przed wysłaniem informacji do serwera. Powinieneś sporządzić kod sprawdzający na przykład, czy użytkownik wpisał prawidłowy numer telefonu lub czy pole tekstu nie zostało pozostawione puste. W tym przykładzie sprawdzimy tylko, czy pola tekstu posiadają dane. Sprawdzanie poprawności danych powinno być przeprowadzone na maszynie użytkownika (tzn. na poziomie klienta), aby niepotrzebnie nie obciążać serwera. Kod sprawdza kolekcję Formularzy, aby dowiedzieć się, czy użytkownik wpisał jakieś da-
v
Microsoft Access w przeglądarce Internetowej
663
n e w polach Nazwa firmy oraz telefon, i wyświetla komunikat w innym kolorze, jeżeli informacji jest brak w jednym z tych pól. Jeżeli oba pola zostały wypełnione, to wartością zmiennej dobrze jest True, wobec czego procedura kontynuuje, tak jak pokazano poniżej (zob. Nazwa Pliku: C:\PoznajASP\WpiszDane.asp (Część 2)).
Nazwa pliku: C:\PoznajASP\WpiszDane.asp (Część 2)
i WpiszDane.asp
If dobrze = True Then
nazwa=Replace(Request ("txtNazwaFirmy"), ,' )
If Len(nazwa)<> 0 Or_ Len(tel)<>0 Then
Set con = Server.CreateObjectC'ADODB.Connection") strCon="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" strCon=strCon & server.MapPathfNorthwind.mdb") & ";" strCon=strCon & "User ID=; Passwords"
strSQL = "INSERT INTO Spedytorzy (NazwaFirmy, Telefon)"
strSQL = strSQL & "Values ('" & nazwa &
strSQL = strSQL &. ",'" & tel & " ')" With con
.Mode = 3
Open strCon
.Execute(strSQL) End With
Response.Write VIxFONT Color = 'Green'>" &_ "Dodano następujące dane:</lx/FONT><HR>" ' pobierz IdSpsdytora (z tabeli Spedytorzy)
strSQL = "SELECT MAX(IDspedytora) AS Ostatnield From Spedytorzy;" Set rst = con.Execute(strSQL) Response.Write "Id spedytora: <B>" & rst("Ostatnield")& "</BxP>"
I
^
Ponieważ wpisana przez użytkownika nazwa firmy może zawierać apostrof, wystąpi błąd, gdy wartość z apostrofem zostanie użyta w poleceniu SQL. Aby temu zapobiec, procedura korzysta z funkcji replace, która zastępuje apostrof dwoma znakami apostrofu w tekście wpisanym przez użytkownika:
nazwa=Replace(Request("txtNazwaFirmy") , , )
Po podaniu przez użytkownika nazwy firmy oraz numeru telefonu zostaje nawiązana łączność z bazą danych Northwind i wykonane zostaje polecenie insert into. Polecenie to dodaje nowy rekord do tabeli Spedytorzy i umieszcza zawartość zmiennych nazwa oraz tej w polach txtNazwaFirmy oraz txtTelef on. Następnie procedura zmienia kolor czcionki na zielony, aby poinformować użytkownika o dodaniu nowych informacji. Inne polecenie SQL pobiera numer identyfikacyjny nowo dodanego rekordu, natomiast polecenie Response.write wpisuje id spedytora w przeglądarce. Po pobraniu wartości z pola id spedytora obiekty Recordset oraz connection zostają zamknięte (zob. fragmet kodu w części 3 poniżej). Następny fragment kodu VBScript
664
Programowanie w Access 2000
w pisuje podaną przez użytkownika nazwę spedytora oraz numer telefonu w przeglądarce i usuwa bieżące wartości z pól tekstu.
Nazwa pliku: C:\PoznajASPYWpiszDane.asp (Część 3)
. WpiszDane.asp
rst.close
Set rst = Nothing
con.Close
Set con = Nothing
Response.Write "Nazwa firmy: <B>" & Request("txtNazwaFirmy") & "</B>«P>" Response.Write "Numer telefonu: <B>" & Request("txtTelefon") & "</B>" ' usuń dane z poi tekstu Nazwa spedytora oraz Telefon nazwa = "" tel = "" EndH End H
q
J
Pozostały segment strony ASP (zob. fragment kodu w części 4 poniżej) zawiera znaczniki HTML. Tworzą one formularz, w którym użytkownik może wpisać nazwę firmy oraz telefon. W tej części znajduje się również przycisk umożliwiający przekazanie wpisanych w polach tekstu danych do serwera WWW. Zwróć uwagę, że argument action odnosi się do pliku ASP o nazwie wpiszDane. Kiedy użytkownik przekaże dane, które wpisał w polach tekstu, klikając przycisk Dodaj dane, przeglądarka skorzysta z metody post w celu przesłania informacji do pliku .ASP na serwerze. W tym przypadku jest to plik WpiszDane.asp. Plik .ASP może zawierać formularz, który przesyła informacje do innego pliku .ASP lub do samego siebie (tak jak to przedstawia ten przykład). Korzystając z metody post, można wysłać nieograniczoną ilość znaków do serwera WWW. Metoda post jest również bardziej bezpieczną formą przekazu danych niż wspomniana wcześniej metoda get, ponieważ informacja przekazana do serwera nie jest widoczna w pasku tytułu przeglądarki (zob. wcześniejsze ćwiczenie dotyczące procesowania formularza za pomocą metody get). Zwóć uwagę, na sposób pobierania wartości ze zmiennych:
Value="<%=nazwa%"> Value ="<%=tel%">
Microsoft Access w przeglądarce Internetowej
665
Nazwa pliku C:\PoznajASP\WpiszDane.asp (Cześć 4)
<HR>
<HTML>
<HEAD>
<TITLE>Wprowadzanie danych<TITLE>
</HEAD>
<BODY>
<FORM Action="WpiszDane.asp" Method = "POST" Name="form1 ">
Nazwa spedytora: <IIMPUT Type="text1" Name="txtNazwaFirmy"
Value="<%=nazwa%>" Size= "30" > Telefon: <INPUT Type="text2" Name="txtTelefon" Value="<%=tel%>"x/P>
<INPUTType="Submit" Name="cmdSubmit" Value="Dodaj dane"x/P>
</FORM>
</BODY>
</HTML>
J
Ćwiczene 7 (ciąg dalszy)
Otwórz przeglądarkę intemetową (Internet Explorer albo Netscape Navigator).
Wpisz adres http://localhost/NorthDB/WpiszDane.asp.
Naciśnij Enter lub kliknij Go.
W przeglądarce pojawi się następujący formularz:
666
Programowanie w Access 2000
'3
Wprowadzanie danych - Microsoft
i-i
i
t :.<,.:.
File Edit View Favorites Tools Help
•i-'Bad - ->- - j J J] ^Search _jJFavorites .jHistory __j* ■=> * _J
. Address g] http://localhost/NorthDb/WpiszDane.asp
Links
i
Nazwa sped^ora: Dodaj dane
Telefon:
ocal intranet
Po wpisaniu danych w polu tekstu Nazwa spedytora i kliknięciu przycisku Dodaj dane przeglądarka wyświetla następujący ekran:
f§j Wprowadzanie danych -Micro- .
^MM
; « File Edit View Favorites Tools Help
^Batk - .J _] :2f i|Seatch ^tlF
Address f^http://bcalhost/NorthDb/Wpis2Dane.asp"
: J ~ J
3 ^Go \ \ Links ».
Wpisz numer telefonu.
N azwa spedytora: j Airborne Express
Dodaj dane
;,g] Done
Telefon: j
ocal intranet
Po wpisaniu numeru telefonu i kliknięciu przycisku Dodaj dane pojawi się następujący ekran:
Microsoft Access w przeglądarce Internetowej
667
'2 Wprowadzanie danych - Microsoft
I File Edit View Favorites Tools J J J ji
^History
Address #] http://localhost/NorthDb/Wpi5zDane,asp
Dodano następujące dane; Id spedytora: 20
Nazwa firmy: Airborne Express Numer telefonu: 066-020-0909
Nazwa spedytora: Dodaj dane i
Telefon:
i fig Local intranet
Zwróć uwagę, że w przeglądarce podany jest numer identyfikacyjny firmy z nowo dodanego rekordu oraz dane, które użytkownik wpisał w polach tekstu przed kliknięciem przycisku Dodaj dane. Użytkownik może kontynuować dodawanie danych do tabeli Spedytorzy, wpisując nowe wartości w polach tekstu oraz naciskając przycisk Dodaj dane.
Modyfikowanie rekordów
Możesz wyświetlić rekord w przeglądarce i pozwolić użytkownikowi zmodyfikować ten rekord. Zmiany wprowadzone w danych można następnie przekazać do serwera.
Najłatwiejszym i najszybszym sposobem zmodyfikowania danego rekordu jest wykonanie polecenia SQL o nazwie update. W tym celu utwórz stronę ASP, gdzie użytkownik może wybrać z pola listy produkt, który zamierza zmodyfikować. Po kliknięciu na przycisk z tabeli Produkty zostaną pobrane informacje z pól: nazwa produktu, cena jednostkowa oraz stan magazynu. Pobrane dane zostają umieszczone w polach tekstu w komórkach tabeli. Użytkownik może zmodyfikować dane w tych polach i przekazać zmodyfikowane dane z powrotem do tabeli bazy danych, klikając przycisk Aktualizuj.
668
Programowanie w Access 2000
Ć wiczenie 8
U waga: Jeżeli nie chcesz sam wprowadzać kodu, odnajdź plik o nazwie Modyfikuj-Produkt.asp na załączonym dysku i wkopiuj go do katalogu C:\PoznajASP.
Uruchom program Notatnik Windows i wpisz podany poniżej kod ASP.
Zachowaj plik pod nazwą ModyfikujProdukt.asp w katalogu C:\PoznajASP.
Nazwa pliku: C:\PoznajASP\ModyfikujProdukt.asp (Część 1)
'*.. ModyfikuiProdukt-asp
- □ xl
<%@ Language=VBScript %>
<HTML>
<HEAD><TITLE>Modyfikacja informacji o produkcie</TITLEx/HEAD>
<%
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "DRIVER=Microsoft Access Driver (*.mdb);DBQ=" & _
"c:\PoznajASP\Northwind.mdb" set rst = Sefver.CreateObject("ADODB.Recordset") HFLen(Request.QueryString("ldProduktu")) <> 0 Then
strSQL="SELECT * FROM Produkty WHERE ldProduktu="
rst.Open(strSQL & Request.QueryString("ldProduktu")), conn, 0, 1
If Not rst EOF Then rst. Move First
li
Pierwszy fragment kodu VBScript (zob. część I powyżej) rozpoczyna się od nawiązania łączności z bazą danych Northwind oraz utworzenia instancji obiektu Recordset. Pierwsze polecenie if...Then zostanie wykonane po wybraniu produktu z pola listy (po naciśnięciu przez użytkownika umieszczonego na formularzu przycisku). Metoda open obiektu Recordset służy do wykonania instrukcji select z klauzulą where. Określa ona, który rekord użytkownik chce pobrać z tabeli znajdującej się na serwerze WWW. Metoda open określa również sposób łączności z bazą danych (conn), typ kursora (adopenForwardOniy = o) oraz typ zabezpieczenia danych (LockType) (adLockReadOnly = l). Pobrane dane umieszczone są w tabeli (zob. fragment kodu HTML w części 2 poniżej). Po pobraniu danych obiekt Recordset można zamknąć. Zwróć uwagę, że formularz korzysta z metody post w celu przesłania danych do serwera. Formularz zostanie przekazany samemu sobie po kliknięciu przez użytkownika przycisku Zmodyfikuj dane:
Microsoft Access w przeglądarce Internetowej
669
< FORM ACTION="./ModyfikujProdukt.asp" METHOD="POST" id=form2 name=form2>
Na formularzu umieszczone są dwa ukryte pola tekstu. Ich zadaniem jest przechowywanie informacji o pobranym numerze identyfikacyjnym produktu oraz nazwie produktu:
<Input Type=hidden Name=txtIdProduktu Value="<% =rst("IdProduktu") %>"> <Input Type=hidden Name=txtNazwaProduktu Value="<% =rst("NazwaProduktu") %>">
Dane przechowywane w ukrytych polach są wykorzystane przez fragment kodu VBScript nieco dalej w pliku.asp w celu sporządzenia polecenia update i wyświetlenia komunikatu w przeglądarce.
Następny fragment kodu VBScript (zob. część 2 poniżej) zostaje wykonany po kliknięciu przez użytkownika przycisku umieszczonego w formularzu. Do serwera zostają przesłane informacje znajdujące się w poszczególnych polach tekstu. Korzystając z funkcji isEmpty, możesz sprawdzić, czy użytkownik kliknął dany przycisk. Jeżeli dane znajdujące się w tym formularzu zostały już przekazane do serwera, oznacza to, że użytkownik kliknął już przycisk o nazwie submit2:
If Not IsEmpty(Request.Form("submit2")) Then
Przed przekazaniem danych do serwera w celu wpisania ich do tabeli Produkty należy sprawdzić, czy w polach tekstu zostały wpisane dane (Cena jednostkowa oraz Skład magazynu). Jeżeli jakiekolwiek z tych pól jest puste (użytkownik mógł usunąć dane), zostanie wyświetlony odpowiedni komunikat i użytkownik będzie musiał ponownie wybrać nazwę produktu z pola listy, jeżeli chce kontynuować. Jeżeli natomiast pola tekstu zawierają dane (nawet jeżeli użytkownik nie wprowadził zmian w oryginalnych danych), kliknięcie przycisku Zmodyfikuj dane spowoduje wykonanie polecenia update na serwerze. W rezultacie tej operacji użytkownik zobaczy nazwę zmodyfikowanego produktu oraz polecenie update, które dokonało danej modyfikacji.
670
Programowanie w Access 2000
N azwa pliku : C:\PoznajASP\ModyfikujProdukt.asp (Część 2)
<BODY>
<FORM ACTION="./ModyfikujProdukt.asp" METHOD="POST" id=form2 narns=form2>
<!nput Type=hidden Narne^xtldProduktu Value="<% =rst("ldProduktu") %>">
<input Type=hidden Name=txtNazwaProdu.ktu Vaiue="<% =rst("NazwaProduktu") %>":
<Center>Modyfikacja danych: </Center><BR> <CENTERxH4><% =rst("NazwaProduktu") %>
(ld produktu=<%=rst("ldProduktu")%>)</Hx/CENTERxP> <TABLE BORDER=0 CELLSPACING=4 CELLPADDING=4> <TR>
<TD V/IDTH=200 COLSPAN="2"><FONT COLOR=Blue>Cena jednostkowa ($):</FONTx/TD> <TD B6CQLOR="*O0FF00">
<INPUTTYPE="text" NAME="CenaJednostkowa" VALUE="<% =rst("CenaJednostkowa") %>"<nQ> </TR> <TR>
<TD COLSPAN="2"xFONT COLOR=Blue>Stan magazynu:</FONTx/TD>
<TO BGCOLOR=#00FF00">
<INPUTTYPE="text" NAME="StanMagazynu" VALUE="<% =rst("StanMagazynu") %>"</TD>
<TR>
<TD COLSPAN="2"x/TD>
<TDxlNPUT type="submit" vaiue="Zmodyfikuj dane" id=submit2 riame=submit2x/TD> </TR>
</TABLExHR> </FORM>
EndH
rst. Close EndH
Zl
Nazwa pliku : C:\PoznajASP\ ModyfikujProdukt.asp (Cześć 3)
If Not lsEmpty(Request.Form("submit2")) Then IfRequest.FormC'CenaJednostkowa"^ "" or_ RequestFormfStanMagazynu") = "" then
Response.Write "<8><Font Color=Red>Wszystkie pola należy wypełnić " _ & "Spróbuj jeszcze raz</Bx/FONT>" Else
strSQL « "UPDATE Produkty SET " _ & "CenaJednostkowa = " &. Request.Form("CenaJednostkowa")8."'," _
& "StanMagazynu = '" & Request.Form("StanMagazynu")& _
& "WHERE IdProduktu = " & Request.FormftxtldProduktu") conn.Execute strSQL
Response.Write
"Wykonano
następująca
instrukcje<B>" _
&
Request.FormftxtNazwaProduktu")
&"</B><BR>"
Response.Write
"<PRE>" 8.
strSQL
&
"</PRE><BR>"
EndH
.
End
if
fl
. .
J
■f>
Ostatni fragment kodu (zob. część 4 poniżej) tworzy obiekt Recordset i wypełnia pole listy nazwami produktów.
Microsoft Access w przeglądarce Internetowej
N azwa pliku: C:\PoznajASP\ModyfikujProdukt.asp (Część 4)
MotlytikujProdukt.asp
I
strSql = "SELECT* FROM [Produkty] ORDER BY [NazwaProduktu]" Set rst = conn. Execute (strSql) IfNot rst EOF Then
rst.MoveFirst %>
<FORM ACT!ON="./ModyfikujProdukt.asp" METHOD="GET > <TABLE> <TR>
<TDxB>Wybierz produkt, który chcesz zmodyfikowac</Bx/TD>
<TDxSELECTW-ii!ii;="ldProduktu">
<OPTIONX/OPTION>
Do While Not rsf.EOF
Response.Write "<OPTION Value='" & rstfldProduktu") & '"> " & _
rst("NazwaProduktu") & "</OPTION>"
rst.MoveNext Loop End B rst. Close set rst = Nothing conn.Close set conn ~ Nothing
<TD><INPUT type="submit" vaiue="Pobierz dane" id=submit1 r.ame=submit1 ></TD>
</SELECTx/TD>
</TR>
<;/TABLExHR>
</FORMx/BO0Y>
</HTMU>
671
Ćwiczenie 8 (ciąg dalszy)
Otwórz przeglądarkę internetową (Internet Explorer albo Netscape Navigator).
Wpisz adres http://localhost/NorthDB/ModyfikujProdukt.asp.
Naciśnij Enter lub kliknij Go.
W przeglądarce pojawi się ekran z polem listy. W polu tym musisz wybrać nazwę produktu, który zamierzasz zmodyfikować:
'aModyfikacJa informacji o produkcie-Mmiii." Intrini i lyplii
; File Edit View Favorites Tools Hefc
v-iBacl. » ,J _ i 'J i^5earth jj Favorites J$ History
:AddreS51«] http://lo7albost/NorthDb/M I dukt asp
" i-il
\ Unks ;
W ybiera produkt, który chcesz zmodyfikować |
Pobierz dane
i .,. .
zl
P o wybraniu produktu w polu listy i kliknięciu przycisku Pobierz dane cena jednostkowa produktu oraz ilość na składzie zostają pobrane z tabeli Produkty:
672
Programowanie w Access 2000
• g Modyfikacja mformacli o produkcie - MitrnsoH ■... ,..:•,- .■ ■
; File Ed* View Favorites Tools Help
•^Back • j j ^ i^Seaich _ij Favorites $ History isjS,- 4j - _J
! Address \&\ http://localhost/NorthDb/ModyfikujProdukt.asp?IdProduktu=14&submitl=Pobierz+dane
jJSJiŁl
■^] e>Go Links "
Modyfikacja danych: Tofu (Idproduktu=14)
Cena jednostkowa ($): Stan magazynu:
ZtnodyfikU) dene
W ybierz produkt, który chcesz zmodyfikować j
Pobierz dane
U żytkownik może zmodyfikować oryginalne dane w polach tekstu i kliknąć przycisk Modyfikuj dane. Jeżeli użytkownik kliknie przycisk Modyfikuj dane, gdy pola Cena jednostkowa oraz Stan magazynu są puste, pojawi się następujący ekran:
•li Modyfikacja informacji o produkcie - Microsoft
File Edit View Favorites Tools Help
i ńddress J|j] http://localhost/NorthDb(Modyfll<ujPTOdukt.asp
W szystkie polanaleag'^ypehtic Sprobutj jesicjse rax. Wybiera produkt, który chcesz zmodyfikować J
Ppbierz dane
Local intranet
Jeżeli użytkownik kliknie przycisk Modyfikuj dane, gdy pola Cena jednostkowa oraz Stan magazynu nie są puste, na serwerze WWW zostanie wykonane polecenie update, i zmiany zostaną naniesione w tabeli Produkty, Jako potwierdzenie operacji uaktualnienia danych użytkownik otrzyma taki ekran:
Microsoft Access w przeglądarce Internetowej
673
-a Modyfikacja infor < ji«i.r.ulu
File Edit View Favorites Tools
■ J ji
^History ę^
Uddress j^J httpi//localhost/NorthDWModyfikLjProdutt.asp
Links
Wykonano następująca instrokcjeXofu
UPDATE Produkty SET CenaJednostkopa = '25', StanMagazynu = '35' WHERE IdProduktu = 14
Wybiera produkt, który chcesz zmodyfikować j
~rj Pobierz dane
i#]Done
| tocai intranet
Usuwanie rekordów
Jeżeli chcesz usunąć rekord, możesz skorzystać z polecenia SQL o nazwie delete. Następne ćwiczenie demonstruje, w jaki sposób można usunąć spedytora z tabeli spedytorzy. Sporządzając kod VBScript, którego zadaniem jest przeprowadzenie operacji usuwania rekordów, warto najpierw sprawdzić następujące okoliczności:
Czy
użytkownik wskazał rekord, który chce usunąć? Użytkownik mógł
kliknąć
przycisk
bez uprzedniego wpisania w polu tekstu numeru identyfikacyjnego
re
kordu.
Czy
wpisany numer identyfikacyjny rekordu istnieje w danej tabeli? To
pytanie
jest
szczególnie ważne, jeżeli użytkownik ma wpisać numer rekordu w
polu tek
stu,
zamiast wybrać go z pola listy.
Co
się stanie gdy rekord, który użytkownik zamierza usunąć, ma
powiązane re
kordy
w innych tabelach? Jak wiesz, Microsoft Access nie dopuści do
usunięcia
rekordów,
gdy mają moc więzy integralności.
Ćwiczenie 9
U waga: Jeżeli nie chcesz sam wprowadzać kodu, odnajdź plik o nazwie WymRe-kord.html na załączonym dysku i wkopiuj go do katalogu C:\PoznajASP.
1 . Uruchom program Notatnik Windows i wpisz podany poniżej kod ASP. Ten przykład korzysta z dwóch plików w celu dokonania operacji usunięcia rekor-
674
Programowanie w Access 2000
d ów. Pierwszy plik jest czystym plikiem HTML. Przekaże on dane drugiemu plikowi, który jest stroną ASP.
2. Zachowaj plik pod nazwą WymRekord.htm w katalogu C:\PoznajASP.
Nazwa pliku: C:\PoznajASP\WymRekord.html
%■; WymRekord.html
<HTML>
<HEAD>
<TITLE>Demonstracja wymazywani a </TITLE>
</HEAD>
<BODY>
<FORM Name=DeleteShipperForm Method=Get Action="WymRekord.asp"
<INPUT Type="Hidden" Name="Action" Value="Delete">
Wpisz numer identyfikacyjny spedytora do usunięcia
<lnput Type="Text" Size="6" Name="ldSpedytora">
<INPUT Type="Submit" Name="Delete" Value="Wykonaj">
</FORM>
</BOD,Y> </HTML>|
Argument Action na formularzu HTML uruchomi stronę ASP o nazwie Wym-Rekord.asp, gdy użytkownik kliknie przycisk Wykonaj. Kod HTML pokazany powyżej spowoduje wyświetlenie w przeglądarce następującego formularza:
3Demonstracja wymazywania "licroMift Internet '
I File Edit View Favorites Tools Help
>Bad - j J _,] ^Search _jjFavorites jHistory -_j- J - J
I Address f@Thtt^T//iocallhost/r^^ "~3 {>Go \\ Links
W pisz numer identyfikacyjny spedytora do usunięcia |
CDone
lip l"ocai intranet
Ć wiczenie 9 (ciąg dalszy)
U waga: Jeżeli nie chcesz sam wprowadzać kodu, odnajdź plik o nazwie WymRe-kord.asp na załączonym dysku i wkopiuj go do katalogu C:\PoznajASP.
Microsoft Access w przeglądarce Internetowej
675
Uruchom program Notatnik Windows i wpisz podany poniżej kod ASP.
Zachowaj plik pod nazwą WymRekord.asp w katalogu C:\PoznajASP.
Fragment kodu VBScript pokazany poniżej nawiązuje łączność ze źródłem danych i przechowuje wartość iaspedytora w zmiennej o nazwie spedytor. Jeżeli wartość tej zmiennej nie jest pusta, to utworzona jest nowa instancja obiektu Recordset i zostaje otwarta tabela spedytorzy. Obiekt Recordset zostaje otwarty przy użyciu kursora (adopenstatic), który reprezentowany jest liczbą 3 w poleceniu poniżej:
rst.Open "Spedytorzy", conn, 3
Nazwa pliku: C:\PoznajASP\WymRekord.asp
. WymRekordasp
Language=VBScript %> <%
Set conn = Server. CreateObjectf'ADODB. Connection") mydbFile=Server.MapPath("Northwind.rndb")
conn.Open " D rive r={ Micro soft Access Driver f.mdb)}; DBQ=" & mydbFile & ";" spedytor = Cstf(Request.QueryString("ldSpedytora")) If spedytor <>"" then
Set rst = Server.CreateObjectfADODB.Recordset") rst.Open "Spedytorzy", conn, 3 rst.Find "IdSpedytora = " & spedytor If rst. EOF then
Response.Write "Spedytor" & spedytor & " nie istnieje." Else
On Error Resume Next
conn. Execute "DELETE * FROM Spedytorzy WHERE IdSpedytora = " & spedytor If conn. Errors. Count > 0 then
Response.Write "Error Number: " & err. Number & "<P>" Response.Write "Error Description: " & err.Description & "<P>" Else
Response.Write "<H2>Wymazano spedytora: " & spedytor & ".</H2>" End if rst.close
Set rst = Nothing Endii Else
Response.Write "Nie podano numeru identyfikacyjnego spedytora. " Endrl
676
Programowanie w Access 2000
Przypomnij sobie z rozdziału 3. tej książki, że statyczny kursor (adopenstatic, 3) pobiera wszystkie dane w danym momencie i jest często stosowany w poszukiwaniach danych.
Następne polecenie korzysta z metody Find, aby sprawdzić, czy podany numer identyfikacyjny spedytora istnieje w tabeli spedytorzy:
rst.Find "IdSpedytora ="& spedytor
Następne polecenie warunkowe if...Then...Else decyduje c tym, jakie informacje mają być zwrócone do przeglądarki. Gdy właściwość eof obiektu Recordset jest Tru-e, oznacza to, że Recordset nie zawiera żadnych rekordów. W tej sytuacji należy powiadomić użytkownika, że nie ma takiego rekordu w tabeli. W przypadku gdy rekord zostanie znaleziony w tabeli spedytorzy, wykonane zostanie następujące polecenie delete:
conn.Execute "DELETE '
Jak wspomniano wcześniej, użytkownik może wpisać numer spedytora, który zawiera powiązane rekordy w innych tabelach. Ponieważ taka sytuacja niewątpliwie spowoduje błąd, fragment kodu VBScript zignoruje ten błąd i wykonanie kodu będzie kontynuowane od następnego wiersza.
On Error Resume Next
Następnym wierszem kodu jest inna instrukcja warunkowa if ...Then...Else, która wysyła komunikat do przeglądarki w zależności od tego, czy został napotkany błąd.
Można się tego dowiedzieć, sprawdzając zawartość zbioru Errors obiektu connection.
Kod wyświetli numer błędu oraz jego treść, jeżeli użytkownik wybrał spedytora, którego nie można usunąć ze względu na powiązane z nim w innych tabelach rekordy. Możesz zamienić tę sekcję kodu bardziej przyjaznym komunikatem. Jeżeli błędu nie będzie, przeglądarka wyświetli komunikat o usunięciu rekordu. Komunikat jest sformatowany wielkimi literami przy użyciu znaczników HTML z drugiego poziomu nagłówków: <H2> oraz </H2>.
Następnie można zamknąć obiekt Recordset. Jeżeli użytkownik kliknął przycisk Wykonaj i nie podał numeru identyfikacyjnego spedytora, który zamierza usunąć z tabeli, to zostanie wykonana klauzula Else w instrukcji warunkowej if...
Then...Else.
m
Microsoft Access w przeglądarce Internetowej
677
N azwa pliku: C:\PoznajASP\WymRekord.asp
, WymRekord.asp
Jnxi
<HTML>
<HEAD><TITLE>DELETESHIPPER</TITLE></HEAD>
<BODY>
<HR>
<A HREF="WymRekord.htrnr'>Kliknij tutaj</A>
</BODY>
</HTML>
O statni fragment strony ASP pokazany powyżej tworzy hiperłącze, który umożliwia użytkownikowi powrót do formularza HTML (WymRekord.html). Aby utworzyć hiperłącze, skorzystaj z następującej składni:
<A HREF="adres">wyświetlonyTekst</A>
gdzie "adres" jest nazwą pliku HTML, który chcesz uruchomić, a wyświetlony Tekst jest tekstem, na który użytkownik ma kliknąć.
Ćwiczenie 9 (ciąg dalszy)
Otwórz przeglądarkę internetową (Internet Explorer albo Netscape Navigator).
Wpisz adres http: //localhost/NorthDB/WymRekord.asp.
Naciśnij Enter lub kliknij Go.
Po kliknięciu przycisku Wykonaj, gdy pole tekstu idspedytora jest puste, pojawia się następująca strona:
678
Programowanie w Access 2000
DELETE SHIPPER - Miel osoft Inl
< i File Edit View Favorites Tools Help
■i-Back - > J} $ ^Search jJFavorites -^History ^» ,J
_£J
j Address j^] http://localho5t/NorthDb/WymRekord.asp?IdSpedytora=&Delete=Wytonaj JJ f^Go : | Links
Nie podano numeru identyfikacyjnego spedytora. Kliknij tutaj
ocal ii itranet
Po wpisaniu numeru spedytora, który istnieje w tabeli spedytorzy, i który nie ma zależnych rekordów w innych tabelach, pojawia się następująca strona:
DELETE SHIPPER - Microsoft Internet Explore
j File Edit View Favorites Tools Help
4->6ack - ^J J {$ £| Search NyFavorites ^History ; __y ^J ^,:, -
I Address [S] http^/localhost/NorthDb/WymRekord.asp?IdSpedytora=19&Delete=Wykonai^2J
J
Links
W ymazano spedytora: 19.
Kliknij tutaj
ical intranet
Po wpisaniu numeru spedytora, który nie istnieje, w odpowiedzi na kliknięcie przycisku Wykonaj, pojawia się następująca strona:
w
Microsoft Access w przeglądarce Internetowej
679
fj DELETE SHIPPER - Microsoft Int<
File Edit View Favorites Tools Help
tJjBact - J j ^) ^Search jJFavorites ^History | __^- ^J
i Address jffi http://localhost/Nor^ i
Links
Spedytor 999 nie istnieje. Kliknij tutaj
lig Local intranet
Po wpisaniu numeru spedytora, który znajduje się w innych tabelach, Acces nie dopuści do usunięcia rekordu:
DELETE SHIPPER - Microsoft Internet EkdI
F ile Edit View Favorites Tools Help
■ «♦ - J _J {$ ^Search JjFavorites
| Address 10} http://localhost/NorthDb/WymRekord.asp?Id5pedytora=3&Delete=Wykonaj H j^Go 11 Links
Error Number: -2147467259
Error Description: [Mcrosoft][ODBC Mcrosoft Access Driver] The record cannot be deleted or changed because table 'Zamówienia' includes related records.
Kliknij tutaj
■ Local intranet
Możesz zastawić pułapkę na błąd -2147467259 w segmencie kodu VBScript, aby wyświetlić przyjazny komunikat dotyczący tego błędu.
680
Progi amowanie w Access 2000
T worzenie interfejsu użytkownika
Teraz, gdy zaprojektowaliśmy kilka przykładowych stron ASP, zobaczmy, w jaki sposób można je ze sobą powiązać, tak, aby móc je łatwo uruchomić z okna przeglądarki. Zamiast wpisywać za każdym razem odpowiednią nazwę pliku ASP w pasku adresu w przeglądarce, możesz skorzystać z hiperłączy oraz ramek, aby utworzyć przystępniejszy i bardziej wizualny dostęp do swoich stron.
Ekran poniżej wyświetla okno przeglądarki Internet Explorer podzielone na trzy części.
Możesz poruszać się pomiędzy poszczególnymi przykładami utworzonymi w ćwiczeniach tego rozdziału, klikając na tekst znajdujący sie w lewym panelu. Po kliknięciu hiperłącza główne okno po prawej stronie wyświetli dane pobrane z bazy danych lub wyświetli formularz umożliwiający pobranie danych.
3http://tocalhast/Northt> ■
File Edit View Favorites Tools Help
J j 3} ^Search ^Favorites ^History 1^
J
e]http://localhost/NorthDb/interfejs,html
*J i>Go i! Links
Wybierz opcje z menu po lewej stronie.
Wydawnictwo MIKOM
Rozdział 6 - Przykłady ASP
Ćwiczenie 1 (Pobiera rekordy) Ćwiczenie 2 (Todnał na stron?) Ćwiczeni*; 3 (?obiera tylko 10 lekordów*)
&TOeni.eJiPobie metody GetRows'i
Ćwiczenie 5 rtJwcie pola kombi) Ćwiczenie 6 (Użycie pola lisfa^
Ćwiczenie 7 (Dodaj now rekord) Ćwiczenie 8 (Zmodyfikuj rekofct) Ćwiczenie 9 fWymsż rekord)
:|||r Local intranet
Microsoft Access w przeglądarce Internetowej
681
M ożesz podzielić stronę na kilka obszarów, korzystając z ramek (frames). Każdą ramkę kontroluje osobny plik HTML. Aby utworzyć stronę przedstawioną powyżej, skorzystamy z następujących plików:
Nazwa pliku |
Cel pliku |
Interfejs.html |
Tworzy stronę zawierającą dwie ramki. Jedna z ramek jest podzielona na dwa rzędy (stąd użytkownik odniesie wrażenie, że na stronie znajdują się trzy ramki). Określa, co ma być wyświetlone w każdej ramce, i poleca przeglądarkom, które nie wspierają ramek, aby je ignorowały. |
Logo.html |
Umieszcza logo firmy oraz hiperłącze umożliwiające szybki dostęp do witryny firmy. |
Przyk.html |
Tworzy hiperłącza do praktycznych ćwiczeń tego rozdziału. |
Rezultaty.html |
Umożliwia uzyskanie danych z bazy danych lub wy święta interfejs umożliwiający pobieranie danych. |
Ramkę tworzy się za pomocą znaczników HTML o nazwie <frameset> oraz <frame> z różnymi parametrami. Ramka może zawierać inne ramki. Strona przedstawiona powyżej zawiera dwie ramki. Ramka po lewej stronie podzielona jest na dwa rzędy. Decydując się na ramki, należy zdawać sobie sprawę, że nie wszystkie przeglądarki mogą z nich korzystać. Aby polecić przeglądarce, która nie potrafi korzystać z ramek, aby ramki te ignorowała, zastosuj znacznik <no frames> (zob. przykład w pliku Interfejs.html).
Ćwiczenie 10
Uwaga: Jeżeli nie chcesz sam wprowadzać kodu, odnajdź pliki wymienione w tabeli powyżej na załączonym dysku i wkopiuj je do katalogu C:\PoznajASP.
U ruchom program Notatnik Windows i przygotuj pliki HTML podane poniżej.
Zachowaj każdy plik w katalogu C:\PoznajASP.
682
Programowanie w Access 2000
Nazwa pliku: C:\PoznajASPUnterfejs.htm
| <HTML>
<FRAMESET COLS="290,*">
<FRAMESET ROWS="110, *">
<FRAME SRC="Logo. htmV> <FRAME SRC="Przyk.htm"l"> </FRAMESET>
<frame src="Rezultaty. htm~l" Name="mojeokno">
</FRAMESET> <NOFRAMES>
,Ta strona stosuje ramki.
</NOFRAMES> </HTML>
Polecenie,
<FRAMESET COLS="290",*">
dzieli stronę na dwie ramki. Pierwsza ramka ma szerokość 290 pikseli, a druga ramka zajmuje pozostałą część ekranu. Zestaw ramek (frameset) może zawierać zarówno ramki, jaki i inne zestawy ramek.
Polecenie,
<FRAMESET ROWS="110", *">
dzieli ramkę po lewej stronie na dwa rzędy. Pierwszy ma wysokość 110 pikseli, a drugi zajmuje pozostałą część ramki. Górna ramka odwołuje się do pliku Logo.html. Źródłem ramki w dolnej części jest plik Przyk.html.
Ramka po prawej stronie (zob. rysunek na początku tego podrozdziału) odwołuje się do pliku Rezultaty.html. Ramce tej przypisano nazwę mojeokno:
<FRAME SRC="Rezultaty.html" Name="mojeOkno">
Każdy zestaw ramek kończy się znacznikiem </frameset>. Przeglądarki, które nie mogą pracować z ramkami, wyświetlą komunikat informacyjny znajdujący się pomiędzy znacznikami <noframes> oraz </noframes>.
Microsoft Access w przeglądarce Internetowej
683
N azwa pliku: C:VPoznajASP\Logo.html
<HTML> <BODY>
<IMG ALlGN="Middle" width="100" height="100" ALT="odwiedź nas dzisiaj!" |5RC="Mikom.gif">
<Font co1or = "B"lue"xA HREF="http://www.mikom.com.pi">
<p>
wydawnictwo MIKOM</A></Font>
</BODY> </HTML>
F ragment kodu HTML powyżej umieszcza obrazek („MIKOM.gif) w górnym rzędzie ramki znajdującej się po lewej stronie ekranu, korzystając ze znacznika <IMG>. Parametry Width oraz Height określają rozmiar rysunku w pikselach. Tekst umieszczony poniżej obrazka jest hiperłączem. Kliknięcie na ten tekst spowoduje uruchomienie witryny Wydawnictwa MIKOM.
Nazwa pliku: C:\PoznajASP\Przyk.html
<HTML>
<base target ="mojeokno">
<H4>Rozdział 6 - Przykłady ASP</H4>
<p>
<font size="-l">
<A HREF="Kiienci.asp" target="mojeokno">ćwiczenie 1 (Pobierz rekordy)</AXBR>
<A HREF-"Kartki.asp '>CViczenie 2 (podział na strony)</AxBR>
<A HREF="K~liencil. asp">ćwiczenie 3 (Pobierz tylko 10 rekordów)</AxBR>
<A HREF="Pobierzszybko.asp">cViczenię 4 (Pobierz rekordy przy użyciu metody GetRows)</A><BRxP>
<;A HREF="PobierzProdukt.asp">ćwiczenie 5 (użycie pola kombi)</A><BR>
<A HREF="Pobierzwiele. asp">ćwiczenie 6 (użycie pola 1isty)</AXBRXP>
<A HREF="WpiszDane.asp">Cwiczenie 7 (Dodaj nowy rekord)</AxBR>
<A HREF="ModyfikujProdukt. asp">ćwiczenie 8 (zmodyfikuj rekord)</A><BR>
^A HREF="wymRekora.asp">ćwiczenie 9 (toymaż rekordJ</A>
</FONT>
</HTML>
Kod znajdujący się w pliku Przyk.htm jest dosyć prosty. Zawiera on szereg hi-perłączy, które umożliwiają uruchomienie różnych przykładów. Każdy z tych przykładów posiada własny plik .asp w folderze C:\PoznajASP. Aby kontrolować, w którym miejscu żądane informacje mają być wyświetlone, skorzystaj ze znacznika <base> z atrybutem Target wskazującym nazwę ramki, w której informacja ma się pojawić:
<BASE Target="mojeOkno">
Jeżeli umieścisz znacznik base Target na początku pliku, wszystkie hiperłącza zostaną wyświetlone w tej samej ramce.
684
Programowanie w Access 2000
Nazwa pliku: C:\PoznajASP\\Rezultaty.html
[ Wybierz opcje z menu po lewej strome. </HTML>
P lik Rezultaty.html wyświetli tekst informacyjny po otwarciu pliku Interfejs.html po raz pierwszy w przeglądarce (zob. rysunek na początku tego podrozdziału). Aby uruchomić daną aplikację, wpisz w pasku adresu w przeglądarce:
http://localhost/NorthDB/Interfejs.html.
Po kliknięciu na hiperłącze w ramce po lewej stronie ekranu prawa ramka wyświetli żądane informacje, tak jak przedstawia następująca ilustracja:
[ 3http:,.localhost/NnithDr>/inteifeis.html - f |
lirfotoft int'-rni-t Explorer |
|
|
]! File Edit View Favorites Tools Help |
gil |
||
attack • JJ j ^Search |
^Favorites ^History i L^j-' \^ ' ' * i^?| |
||
Address jg] http://!ocalhost/NorthDb/interfejs.htm |
5 C'Go Links J> |
||
|
|
Klienci bazy danych |
" " " ' "'■■' |
|
|
|
|
IITB |
NorthWind |
||
|
|
Strona Iz8 |
|
|
Alfreds Futterkiste |
|
|
Wydawnictwo M3K0M J |
Ana TrujiMo Empjredados yjielados |
|
|
M |
Antonio Moreno Taqueria Around the Horn |
|
|
Rozdział 6 - Przykłady ASP Ćwiczenie i (?obierz rekordy) |
|||
Berglunds snabbkop Blauer See Delikatessen |
|||
Ćwiczenie 2 podział na strony] |
Blondel pere et fils |
|
|
Ćwiczenie 3 (Pobiera tylko 10 rekordów11) Ćwiczenie 4 (Pobiera rekordv przv użyciu metody GetRowsi |
Bon app' Bottom-Dollar Markets |
|
|
Bólido Comidas preparadas |
|||
Ćwiczenie 5 fUzvcie polakomtoi) Ćwiczenie 6 flTzvcie pola listy") |
B's Beverages Cactus Comidas parallevar |
; |
|
Ćwiczenie 7 fDodai nowy rekofdi Ćwiczenie S CZmodyfifcuj rekord] ; Ćwiczenie 9 (V'/vtKi&i rekord! |
Strony: 12 3 4 5 6 7 8 |
||
™ |
|||
|
1 ' S ■oca' intranet Ą |
Microsoft Access w przeglądarce Internetowej
685
P odsumowanie
Rozdział ten wprowadził Cię w krąg programowania stron internetowych przy użyciu technologii określanej nazwą Active Server Pages (ASP). Dowiedziałeś się, w jaki sposób - korzystając z elementów języka HTML, tekstu oraz komend języka skryptowego (VBScript) - możesz szybko pobrać dane z bazy danych Microsoft Access i udostępnić je użytkownikom w postaci strony HTML. Po wpisaniu w adresie przeglądarki nazwy pliku z rozszerzeniem .asp, serwer przetwarza polecenia skryptu i wysyła do przeglądarki gotową stronę zawierającą już tylko „czysty" format HTML. W tym rozdziale nauczyłeś się dodawać, modyfikować oraz usuwać rekordy bazy danych prosto z przeglądarki internetowej. Poznałeś dwa style kodowania stron ASP; jeden z nich przeplatający polecenia HTML z komendami języka skryptowego, drugi - zwracający do przeglądarki czysty tekst HTML przy użyciu wbudowanego obiektu Response. Pracując z wieloma przykładami tego rozdziału, przekonałeś się, że pisanie skryptów ASP nie jest wcale takie trudne. Trzeba jednak znać pewne polecenia VBA oraz zasady użycia obiektów ActiveX Data Objects (ADO). Jednakże, chociaż łatwo jest zacząć programować strony internetowe, w tym rozdziale nie próbowaliśmy omawiać wszystkich szczegółów dotyczących HTML, ASP czy VBScript. Każdy z tych tematów wymaga osobnej książki. Zatem, jeżeli chcesz poznać te tematy, sięgnij do wszystkich możliwych źródeł.
■~ --^
Skorowidz
! (typ danych Single), 85
(typ danych Double), 58; 62
Else
(dyrektywa),
219
#Const
(dyrektywa), 219
#If...Then...#Else
(dyrektywa), 118; 129
#INCLUDE
FILE
(dyrektywa),
644
$ (typ danych String), 105; 144 % (typ danych Integer), 63; 85; 155 %> (koniec fragmentu skryptu
VBScript), 625 & (ampersand), 55; 62  , 655
.ASP (rozszerzenie pliku), 623 .MDB (rozszerzenie pliku), 229 .TXT (rozszerzenie pliku), 200 @ (typ danych Currency), 63 [ ] (nawiasy kwadratowe), 42 [Procedura zdarzenia], 30; 599; 602 _ (znak podkreślenia, kontynuacji
wiersza), 55; 93 „" pusty ciąg znaków, 92; 101; 108
(mniejsze, operator), 111
>
(nierówne,
operator), 111
<%
(początek fragmentu skryptu
VBScript), 625
<= (mniejsze lub równe, operator), 111 <B>, </B>, znacznik HTML, 625 <BASE>, znacznik HTML, 692 <CENTER>, znacznik HTML, 650 <FORM>, </FORM>, znacznik HTML,
660
<FRAME>, znacznik HTML, 690 <FRAMESET>, znacznik HTML, 690 <H2>, </H2>, znacznik HTML, 645; 685
<HEAD>, </HEAD>, znacznik HTML,
624 <HTML>, </HTML>, znacznik HTML,
624
<I>, znacznik HTML, 645 <NO FRAMES>, znacznik HTML, 690 <OPTION>, </OPTION>, znacznik
HTML, 660
<PRE>, </PRE>, znacznik HTML, 666 <SCRIPT>, </SCRIPT>, znacznik
HTML, 625
<SELECT>, znacznik HTML, 661 <TABLE>, </TABLE>, znacznik
HTML, 648
<TD>, </TD>, znacznik HTML, 648 <TITLE>, </TITLE>, znacznik HTML,
624 <TR>, </TR>, znacznik HTML, 624;
648
= (równe, operator), 111 > (większe, operator), 111 >= (większe lub równe, operator), 111
AbsolutePage, właściwość, 644 AbsolutePosition, właściwość, 291 ACTION, argument, 672 Action, kwerenda, 400 Activate, zdarzenie, 579; 595 Active Server Pages, 20; 621; 623; 694 ActiveConnection, właściwość, 370; 383;401
688
Programowanie w Access 2000
A ctiveX Data Objects, zob. ADO, 19;
139;345;347;367; 508; 694 adAccessSet, stała, 472 adCmdStoredProc, stała, 408 adCmdTable, stała, 382; 408 ADD COLUMN, instrukcja, 530 ADD USER, instrukcja, 512; 552 Add Watch, okno dialogu, 207 Add, metoda, 166
AddNew, metoda, 300; 341; 440; 610 adlndexNullsAllow, stała, 393 adlndexNullsDisallow, stała, 394 adlndexNullsIgnore, stała, 393 adKeyForeign, stała, 397 adKeyPrimary, stała, 391
adLockBatchOptimistic, stała, 422
adLockOptimistic, stała, 382; 422
adLockPessimistic, stała, 422
adLockReadOnly, stała, 423; 659
admin, 315
Administrative Tools (Narzędzia administracyjne), 632
ADO, 18; 139; 233; 345
ADO (ActiveX Data Objects), 19; 139; 345; 369;508
ADO, bezpośrednie otwieranie zestawu rekordów, 427
ADO, błędy w bazach danych, 367
ADO, dostęp do danych, 19; 242; 345;
348
ADO, filtrowanie rekordów, 310 ADO, kompaktowanie bazy danych, 484 ADO, kopiowanie bazy danych, 234; 364 ADO, kopiowanie tabeli, 375 ADO, łączenie tabel aplikacji Microsoft
Access, 380
ADO, model obiektów, 19; 345; 626 ADO, modyfikowanie kwerendy, 415
ADO, wyszczególnianie nazw
kwerend, 416 ADO, obliczanie liczby rekordów, 438
ADO, odczytywanie danych z pola
rekordu, 430
ADO, określanie pozycji rekordu, 429 ADO, otwieranie arkusza Microsoft
Excel, 356
ADO, otwieranie bazy danych, 349 ADO, otwieranie bazy danych
zabezpieczonej hasłem, 354 ADO, otwieranie obiektu Recordset, 419 ADO, otwieranie pliku dBase, 357 ADO, otwieranie pliku tekstowego, 360 ADO, otwieranie zestawu rekordów, 291 ADO, otwieranie zestawu rekordów w oparciu o polecenie SQL, 423 ADO, otwieranie zestawu rekordów
w oparicu o kryteria, 426 ADO, pobieranie zawartości rekordów,
431 ADO, poruszanie się w zestawie
rekordów, 427 ADO, przyłączanie arkusza Microsoft
Excel, 381
ADO, sortowanie rekordów, 450 ADO, tworzenie i uruchamianie kwerend, 267; 271; 273; 399 ADO, tworzenie indeksów I relacji między tabelami, 257; 390; 542 ADO, tworzenie klucza podstawowego,
257; 391 ADO, tworzenie kwerendy
przekazującej, 406 ADO, tworzenie kwerendy wybierającej,
267;401 ADO, tworzenie kwerendy
z parametrem, 403 ADO, tworzenie nowej bazy danych,
233; 363
ADO, tworzenie tabel oraz pól, 369 ADO, tworzenie wykazu tabel, 371; 383 ADO, uruchamianie kwerendy aktualizującej, 273; 413
*v
Skorowidz
689
A DO, uruchamianie kwerendy
wybierającej, 408 ADO, uruchamianie kwerendy
z parametrem, 411 ADO, usuwanie kwerendy, 417 ADO, wymazywanie tabel, 375 ADO, wyszczególnianie typów danych,
388 ADO, wyszczególnianie właściwości
pól, 379 ADO, wyszczególnianie właściwości
tabeli, 378 ADO, wyszukiwanie i czytanie
rekordów, 418 ADO, wyszukiwanie rekordów przy
użyciu metody Find, 433 ADO, wyszukiwanie rekordów przy
użyciu metody Seek, 435 ADO, wyszukiwanie rekordów
w oparciu o kilka warunków, 437 ADO, zaawansowane możliwości
obiektu Recordset, 451 ADODB, 346
Adojavas.inc (rodzaj pliku), 644 adOpenDynamic, stała, 410 adOpenForwardOnly, stała, 410 adOpenKeyset, stała, 382 adOpenStatic, stała, 410 Adovbs.inc (rodzaj pliku), 644 ADOX (ADO Extensions for DLL and
Security), 346
ADOX, hierarchia obiektów, 370 ADOX, tworzenie konta grupy, 369 ADP (Access Data Projects), 556 adPermObjProviderSpecific, stała, 473 adPermObjTable, stała, 470 adPersistADTG, stała, 455 adRightDelete, stała, 472 adRightlnsert, stała, 472 adRightRead, stała, 472 adSchemaColumns, stała, 386
adSchemaTables, stała, 385 ADSDSO (Active Directory Service),
351
ADSDSOObject, dostawca danych, 351 adSearchBackward, stała, 433 adSearchForward, stała, 433 adSeekAfter, stała, 436 adSeekAfterEQ, stała, 436 adSeekBefore, stała, 436 adSeekBeforeEQ, stała, 436 adSeekFirstEQ, stała, 435 adSeekLastEQ, stała, 435 adSortAscending, stała, 393 adSortDescending, stała, 393 AfterDelConfirm, zdarzenie, 575 Afterlnsert, zdarzenie, 570 AfterUpdate, zdarzenie, 606 Alias, 630
AllowZeroLength, właściwość, 655 AllPermissions, właściwość, 336 ALTER COLUMN, instrukcja, 384 ALTER DATABASE, instrukcja, 512 ALTER TABLE, instrukcja, 384 ALTER USER, instrukcja, 512 AND (operator logiczny), 115 ANSI SQL, 511 Append, metoda, 250; 372 Application permissions, 630 ApplyFilter, zdarzenie, 589 Argumenty, opcjonalne, 88 Argumenty, Przekazywanie
argumentów, 86 Array (zob. Tablica), 162 Array, funkcja, 156 AS, słowo kluczowe, 562 ASC (ascending sort), 271 ASCII, 219; 586 ASP (Active Server Pages), 623 ASP, model obiektów, 627 ASP, strona, 624 Attributes, właściwość, 263
Programowanie w Access 2000
Auto List Members, 40; 42 AUTOINCREMENT, instrukcja, 516 AutoNumber, 513 Autonumer, 384
Breakpoint, 196; 205
ByRef, słowo kluczowe, 88
BYTE, 515
Byte, typy danych, 57; 244
ByVal, słowo kluczowe, 87; 175
B
Baza danych, hasło, 354 Baza danych, kompaktowanie, 485 Baza danych, kopiowanie (ADO), 364 Baza danych, otwieranie, 237 Baza danych, tworzenie (ADO), 18; 20 Baza danych, tworzenie z ADO, 369 Baza danych, tworzenie z DAO, 267 Baza danych, ustawianie hasła (DDL),
549
Baza danych, właściwości bazy, 238 Baza danych, wymazywanie, 400 BeforeDelConfirm, zdarzenie, 574 Beforelnsert, zdarzenie, 570 BeforeUpdate, zdarzenie, 606 BeginTrans, metoda, 341; 482 Bezpieczeństwo danych, 315; 459; 547 Biblioteka, 46; 346 BIT, 516
Błąd, kompilacji, 67; 92 Błąd, logiczny, 196 Błąd, pułapkowanie, 195; 568 Błąd, syntaktyczny, 195 Błąd, wykonania, 63; 196; 223 Błędy syntaktyczne, 195 Błędy wykonania, 63; 196; 223 Błędy, błędy logiczne, 196 Błędy, pułapkownie, 195; 568 BOF (beginning of file), początek pliku,
288
BOF, właściwość, 288; 434 Bookmark, właściwość, 197; 288 Bookmarkable, właściwość, 297 BOOLEAN, 516 Boolean, typy danych, 57; 79
Call Stack (stos wywołań), 213
CanGrow, właściwość, 604
CanShrink, właściwość, 604
Caption, właściwość, 245
Case Else, klauzula, 124
Case, klauzula, 124
Case, użycie Is, 126
Catalog, obiekt, 363
ChangePas sword, metoda, 462
CHAR, 515
CHECK constraint (ograniczenie), 512
CHECK, ograniczenie, 512
Chr, funkcja, 92
Class, moduł klasy, 24
Click, zdarzenie, 26
Close #1, instrukcja, 226
Close, metoda, 233
Collection, obiekt, 167
Column, obiekt, 372
Command, obiekt, 399
CommandText, właściwość, 401
CommandTimeout, właściwość, 659
Comment Block/Un comment Block, 46
CommitTrans, metoda, 341
CompactDatabase, metoda, 234; 480
Compile error, 67; 92
Complete Word, 44
ConflictTable, 503
Connect, właściwość, 238
ConnectionTimeout, właściwość, 659
CONSTRAINT, klauzula, 512
Container, obiekt, 230
CopyFile, metoda, 364
Skorowidz |
691 |
CopyFromRecordset, metoda, 308 |
dbRelationDontEnforce, stała, 264 |
CREATE GROUP, instrukcja, 512 |
dbRelationlnherited, stała, 264 |
CREATE INDEX, instrukcja, 512 |
dbRelationUnique, stała, 264 |
CREATE PROC, instrukcja, 512 |
dbRelationUpdateCascade, stała, 264 |
CREATE PROCEDURE, instrukcja, |
dbSecDeleteData, stała, 338 |
512 |
dbSecWriteOwner, stała, 336 |
CREATE TABLE, instrukcja, 512 |
DDL (data definition language), 395 |
CREATE USER, instrukcja, 512 |
Deactivate, zdarzenie, 568; 580 |
CREATE VIEW, instrukcja, 512 |
Debug, 160 |
CreateDatabase, metoda, 232 |
Debug.Print, instrukcja, 62; 135 |
CreateField, metoda, 242 |
Debugging, narzędzia, 221 |
Createlndex, metoda, 260 |
Decimal, typy danych, 57 |
CreateObject, funkcja, 361 |
Default value, właściwość, 245 |
CreateObject, metoda, 627 |
Defined Size, właściwość, 372 |
CreateProperty, metoda, 245 |
Deklarowanie zmiennych, 58 |
CreateQueryDef, metoda, 269 |
DELETE, instrukcja, 275 |
CreateRelation, metoda, 263 |
Delete, metoda, 251; 304 |
CreateTextFile, metoda, 362 |
DESC (descending sort), słowo |
CreateUser, metoda, 319 |
kluczowe, 271 |
Create Workspace, metoda, 317 |
Description, właściwość, 245 |
CSng, funkcja konwersji danych, 73; 106 |
Design Master, replikacja, 488 |
CURRENCY, 516 |
DesignMasterld, właściwość, 500 |
CurrentDb, funkcja, 139; 242 |
Dim, słowo kluczowe, 59 |
Cursor, 217 |
Dir, funkcja, 234 |
CursorType, właściwość, 3 82 |
Dirty, zdarzenie, 573 |
|
DISALLOW NULL, opcja, 543 |
D |
Disconnected recordset, 451 |
|
DML (data manipulation language), 512 |
DAO (Data Access Objects), 18; 139 |
DML (Język manipulacji danych), 512 |
DAO, Kopiowanie bazy danych, 234 |
Do...Until, pętla, 131 |
Database Password, właściwość, 354 |
Docking, zakładka, 38 |
Database, object, 229 |
DoCmd, obiekt, 44; 381 |
Date, typy danych, 57; 66 |
Document, obiekt, 236 |
DATETIME, 516 |
dostawca danych, ADSDSOObject, 351 |
DateValue, funkcja, 453 |
dostawca danych, MSDAORA, 351 |
DBEngine, obiekt, 229 |
dostawca danych, MSDASQL, 351 |
dbFailOnError, stała, 275 |
dostawca danych, MSIDXS, 351 |
dbLangGeneral, stała, 233 |
dostawca danych, SQLOLEDB, 351 |
DblClick, zdarzenie, 614 |
DOUBLE, 516 |
dbOpenSnapshot, stała, 289 |
Double, typy danych, 57; 63 |
DBQ, parametr, 638 - - ~—^^^^^^^^^—^^^^—^^^^——^—— |
DRIVER, parametr, 638 |
Programowanie w Access 2000
D ROP COLUMN, instrukcja, 532 DROP CONSTRAINT, instrukcja, 523 DROP GROUP, instrukcja, 512 DROP INDEX, instrukcja, 512 DROP PROCEDURE, instrukcja, 512 DROP TABLE, instrukcja, 512 DROP USER, instrukcja, 512 DROP VIEW, instrukcja, 512 DSN (Data Source Name), 357 DSN-less, 359 Dynaset, 287; 290
E
Edit, metoda, 302; 441
Edytor, zakładka, 45
Else, klauzula, 118
Elself, klauzula, 120
Encrypt Database, właściwość, 364
End Function, słowo kluczowe, 24
End Property, słowo kluczowe, 173
End Sub, słowo kluczowe, 24
End With, słowo kluczowe, 302
Engine Type, właściwość, 364
Enter, zdarzenie, 608
EOF (end of file), koniec pliku, 287
EOF, właściwość, 434
Erase, funkcja, 157
Err, obiekt, 226
Error Events, 587
Error, obiekt, 229
Errors, kolekcja, 229
ESC, 133
Event (zdarzenie), 567
Event procedure (procedura obsługi
zdarzenia), 567 Event property (właściwość zdarzenia),
567 Event trapping (pułapkowanie zdarzeń),
568 EXECUTE, instrukcja, 512
Execute, metoda, 273
Exit Sub, słowo kluczowe, 173
Field, obiekt, 229
File DSN, 358; 633
FileDateTime, funkcja, 453
FileLen, funkcja, 453
FileScriptingObject, 447
FileSystemObject, obiekt, 361
Filter Events, 586
Filter, właściwość, 310; 435; 449
Find, metoda, 433
FindFirst, metoda, 296
FindNext, metoda, 296
FindPrevious, metoda, 296
FLOAT, 515
Focus Events, 577
For...Each...Next, pętla, 138
For...Next, pętla, 136
Foreign key, 263
FOREIGN KEY, ograniczenie, 518
Format, zdarzenie, 597
Formularz, 456; 565
FROM, słowo kluczowe, 267; 275
Funkcja InputBox, użycie, 73; 101
Funkcja MsgBox, ustawienie argumentu
Buttons, 91; 101; 410 Funkcje, 24
Funkcje konwersji typu, 74 Funkcje, Array, 156 Funkcje, wbudowane, 90
GET, metoda, 657; 659; 668 GetObjectOwner, metoda, 469 GetObjectReplicability, metoda, 489 GetRows, metoda, 648 GetString, metoda, 408
Skorowidz
693
G otFocus, zdarzenie, 29; 565 GRANT, instrukcja, 512; 552 Group, obiekt, 229 GUID, 244
H
HasModule, właściwość, 25 HREF, 641 HTML, 20; 380; 617 Hyperlink, 645
Hypertext Markup Language (HTML), 617
IsEmpty, funkcja, 673 IsMissing, funkcja, 89
Jet OLEDB, 354
Język, definicji danych (DDL), 512 Język, manipulacji danych (DML), 512 JRO (Microsoft Jet and Replication
Objects), 346 Jscript, 620
K
I
IDENTITY, typ danych, 384
If...Then, 112
If...Then...Else, 118
If...Then...ElseIf, 120
IGNORE NULL, opcja, 544
IgnoreNulls, właściwość, 258
IIS, 619; 623
Immediate window, 50
IN, słowo kluczowe, 662
Indeks, tworzenie indeksu opartego na
dwóch polach (DDL), 537 Index, obiekt, 393 IndexNulls, właściwość, 393 Inetpub (folder), 624 Initialize, zdarzenie, 177 InputBox, funkcja, 101 INSERT INTO, instrukcja, 278; 482 Instancja, 165; 636 INTEGER, 515 Integer, typy danych, 57; 77 Internet Explorer, 346; 620 Internet Information Services, 21; 623 Internet, synchronizacja, 499 Is, słowo kluczowe, 126 IsArray, funkcja, 157
Katalog wirtualny, 624
Katalog wirtualny, tworzenie, 624
Key, obiekt, 168
Keyboard Events, 582
KeyDown, zdarzenie, 582
KeyPress, zdarzenie, 584
Keys, kolekcja, 391
KeyUp, zdarzenie, 583
Kill, polecenie, 234
Klasa, 165
Klauzula Case Else, 124
Klauzula Elself, 120
Klucz obcy, 397; 518
Klucz podstawowy, 257; 391; 518
Klucz podstawowy, definicja, 257
Kod ASP, 620
Kod, okno kod programu, 36
Kolekcje, 165
Kolumny, 518; 523
Komentarz, 46
Kompilacja warunkowa, 219
Konstruktor kodu, 29
Kwerenda aktualizująca (UPDATE), 273
Kwerenda przekazująca (Pass-Through),
279 Kwerenda tworząca tabele (Make-
Table), 276
694
Programowanie w Access 2000
L astModified, właściwość, 302 Len, funkcja, 56; 109 Licznik (zob. Counter), 135 LIKE, słowo kluczowe, 269 Load, zdarzenie, 456 LockType, ustawienie, 422 LockType, właściwość, 382 LOGICAL, 515 Long, typy danych, 57; 63 LONGBINARY, 516 LONGCHAR, 515 LONGTEXT,515 LostFocus, zdarzenie, 579
Łączenie łańcucha znaków 62 M
MakeReplicable, metoda, 489 MapPath, metoda, 654 MaxRecords, właściwość, 279 MEMO, 515 Microsoft ActiveX Data Objects 2.5
Library, 347 Microsoft ADO Ext. 2.5 for DDL and
Security, 347 Microsoft Excel, 443 Microsoft Excel, kopiowanie rekordów
z tabeli Accessa (ADO), 443 Microsoft Excel, otwieranie arkusza
(ADO), 356 Microsoft Excel, przyłączanie arkusza
(ADO), 381
Microsoft Jet 4.0 OLE DB Provider, 345 Microsoft Jet and Replication Objects 2.5 Library, 484
Microsoft Scripting Runtime
(Scrran.dll), 361 Microsoft Scripting Runtime, biblioteka
obiektów, 361 Microsoft SQL Server, 346 Microsoft Word, kopiowanie rekordów
z tabeli Accessa (ADO), 445 Microsoft Word, umieszczanie tabeli
Microsoft Access (ADO), 389 Microsoft.Jet.OLEDB.4.0, 351 MkDir, instrukcja, 49 Mode, właściwość, 351 Model obiektów, DAO, 230 Moduł formularza, 165 Moduł klasy, 24; 165 Moduł standardowy, 165 MONEY, 515 Mouse Events, 579 MouseDown, zdarzenie, 580 Mour^Move, zdarzenie, 581 Mou. p, zdarzenie, 581 Move, metoda, 294 MoveFirst, metoda, 287 MoveLast, metoda, 287 MoveNext, metoda, 287 MovePrevious, metoda, 287 MSDAORA, dostawca danych, 351 MSDASQL, 351
MSDE (Microsoft Data Engine), 555 MsgBox, funkcja, 91 MSIDXS (Index Server), 351 MULTIPLE, słowo kluczowe, 663
N
Name, właściwość, 56; 171 Netscape Navigator, 620 New, słowo kluczowe, 177 Next Bookmark, 222 NoData, zdarzenie, 594 NoMatch, właściwość, 295
Skorowidz
695
NOT (operator logiczny), 111 NOT NULL, constraint, 518 Notepad, Notatnik Windows, 634
O
Obiekty Container, 236
Object Browser, 46
Object, typy danych, 58
ODBC (Open Database Connectivity),
229
ODBC data sources, 619 Odwołania, okno dialogu, 46; 231 Okno Eskplorator projektów, 33 Okno Instrukcje bezpośrednie, 50 Okno Kod programu, 36 Okno Stos wywołań, 214 Okno Szybka czujka, 212 Okno Właściwości, 35 Okno Zmienne lokalne, 213 OLE DB, 345 OLE, obiekt, 244 ON DELETE CASDADE, 524 On Error GoTo, 114 On Error GoTo 0, 224 On Error Resume Next, 224 ON UPDATE CASCADE, 524 ON UPDATE NO ACTION, 524 Open, metoda, 351 OpenDatabase, metoda, 235 OpenRecordset, metoda, 242 OpenSchema, metoda, 384 Operatory logiczne, AND, 111 Operatory logiczne, NOT, 111 Operatory logiczne, OR, 111 Operatory, porównania, 111 Option Base, polecenie, 147 Option Compare Database, polecenie,
177
Option Explicit, polecenie, 67; 69 Optional, słowo kluczowe, 88
OR (operator logiczny), 111 ORDER BY, klauzula, 271
Page, zdarzenie, 595
PageSize, właściwość, 640
Panel sterowania, 358
ParamArray, słowo kluczowe, 162
Parameter, obiekt, 230
Password, 317
PercentPosition, właściwość, 291
Personal Web Server, 623
Pętla, czym jest (definicja), 132
Pętla, Do...While, 131
Pętla, For Each.. .Next, 138
Pętla, For...Next, 136
PID, 319
Po aktualizacji (AfterUpdate), zdarzenie,
603 Po usunięciu (AfterDelConfirm),
zdarzenie, 573 Po wstawieniu (Afterlnsert), zdarzenie,
569
Pobieranie rekordów (VBScript), 648 Pole kombi, użycie, 198; 656 Pole listy, użycie, 30; 184 Polecenie Dokończ wyraz, 44 Polecenie Informacje o parametrze, 41 Polecenie Krokowo, 196; 214 Polecenie Krokowo z pomijaniem, 216 Polecenie On Error GoTo, 114 Polecenie Oznacz blok jako komentarz,
45 Polecenie Pokaż następną instrukcję,
218
Polecenie Run Sub/UserForm, 49 Polecenie Toggle Bookmark, 222 Polecenie Ustaw następną instrukcję,
218
696
Programowanie w Access 2000
P olecenie Usuń oznaczenie komentarza,
45
Polecenie Wyjdź z procedury, 217 Polecenie Wyświetl stałe, 41 Polecnie Szybkie informacje, 43 PopulatePartial, metoda, 489 POST, 657
Powtarzanie czynności, 131 Prawo do odczytu, 626 Preserve, słowo kluczowe, 155 PRIMARY KEY, ograniczenie, 518 Primary, właściwość, 258 Print, zdarzenie, 599 Priority, właściwość, 501 Private, słowo kluczowe, 29; 71 Procedura Property Get, 173 Procedura Property Let, 174 Procedura Property Set, 172 Procedury przechowywane (Stored
procedures), 25; 555 Procedury przechowywane,
wymazywanie (DDL), 570 Procedury przechowywane,
z parametrem (DDL), 568 Procedury typu Property, wczesne
opuszczanie, 173 Procedury zwykłe, 83 Procedury, główne i podrzędne, 106 Procedury, testowanie, 196; 226 Procedury, typy procedur, 24 Procedury, ustawianie punktów
przerwania, 198 Procedury, zatrzymywanie, 197 Programy, sprawdzanie poprawności,
670
Project Explorer, okno, 34 Property Get, procedura, 173 Property Let, procedura, 174 Property Set, procedura, 172 Przed aktualizacją (BeforeUpdate),
zdarzenie, 571; 612
Przed usunięciem (BeforeDelConfirm),
zdarzenie, 574 Przed wstawieniem (Beforelnsert),
zdarzenie, 570
Przeglądarka internetowa, 625 Przeglądarka obiektów, 46 Przekazywanie argumentów, 83 Przy aktywowaniu (Activate), zdarzenie,
595
Przy bieżącym (Current), zdarzenie, 569 Przy błędzie (Error), zdarzenie, 587 Przy braku danych (NoData), zdarzenie,
596 Przy buforowaniu (Dirty), zdarzenie,
573 Przy cyklu czasomierza (Timer),
zdarzenie, 590 Przy dezaktywowamu (Deactivate),
zdarzenie, 580
Przy filtrowaniu (Filter), zdarzenie, 588 Przy formatowaniu (Format), zdarzenie,
599
Przy kliknięciu (Click), zdarzenie, 581 Przy kliknięciu dwukrotnym (DblClick),
zdarzenie, 582 Przy naciśnięciu klawisza (KeyDown),
zdarzenie, 584 Przy naciśniętej myszy (MouseDown),
zdarzenie, 582 Przy naciśniętym klawiszu (KeyPress),
zdarzenie, 586
Przy otwarciu (Open), zdarzenie, 594 Przy powrocie (Retreat), zdarzenie, 603 Przy ruchu myszy (MouseMove),
zdarzenie, 583
Przy stronie (Page), zdarzenie, 597 Przy usunięciu (Delete), zdarzenie, 573 Przy utracie fokusu (LostFocus),
zdarzenie, 581 Przy uzyskaniu fokusu (GotFocus),
zdarzenie, 580
Skorowidz
697
P rzy wartości spoza listy (NotlnList),
zdarzenie, 614
Przy wejściu (Enter), zdarzenie, 608 Przy załadowaniu (Load), zdarzenie, 576 Przy zamknięciu (Close), zdarzenie, 578 Przy zastosowaniu filtru (ApplyFilter),
zdarzenie, 589 Przy zmianie rozmiaru (Resize),
zdarzenie, 577 Przy zwolnieniu (Unload), zdarzenie,
578 Przy zwolnieniu klawisza (KeyUp),
zdarzenie, 585 Przy zwolnionej myszy (MouseUp),
zdarzenie, 583 Przycisk, View Code, 35 Przycisk, View Object, 35 Public, słowo kluczowe, 71; 175 Pułapki, na błędy, 114; 224; 341 Pułapkowanie błędów, 126; 195; 223 Punkt przerwania, kiedy korzystać, 190
Q
QueryDef, kolekcja, 269 QueryDef, obiekt, 229 QueryDefName, właściwość, 271 QueryString, metoda, 665 Quick Watch, okno, 211
R
Randomize, polecenie, 152; 188 Range, obiekt, 389 Raport, moduły raportu, 25 RecordCount, właściwość, 291 RecordsAffected, właściwość, 275 Recordset, dodawanie nowych rekordów
(DAO), 230 Recordset, fabrykowanie zestawu
rekordów (ADO), 242
RecordsetClone, właściwość, 312 ReDim, polecenie, 154 REFERENCES, klauzula, 524 References, okno dialogu, 46; 231; 348 Rekordy, pobieranie rekordów przy
użyciu metody GetRows, 307 Relacje, 263
RelatedColumn, właściwość, 398 RelatedTable, właściwość, 398 Relation, atrybuty obiektu, 263 Relation, obiekt, 263 Relations, kolekcja, 229; 236 Remove, metoda, 169; 190 Replica, właściwości repliki, 500 Replicable, właściwość, 497 Replicald, właściwość, 489 Replication Manager, 499 ReplicaType, właściwość, 500 Replika, tworzenie repliki całkowitej
(JRO), 489 Replika, tworzenie repliki częściowej
(JRO), 489 Replika, tworzenie repliki głównej
(JRO), 489
Request, obiekt, 626; 665 Required, właściwość, 244; 300; 656 Resize, zdarzenie, 568 Response, obiekt, 626 Response.Write, polecenie, 640 Resume 0, polecenie, 264 Resume Next, polecenie, 225 Retreat, zdarzenie, 599 REVOKE, instrukcja, 512 Right, funkcja, 109 Rollback, metoda, 341 RollbackTrans, metoda, 482
Save, metoda, 455 Seek, metoda, 435
698
Programowanie w Access 2000
S elect Case, polecenie, 123
SELECT INTO, instrukcja, 277; 512
SendKeys, polecenie, 576
Server, obiekt, 626
Session, obiekt, 626
SET DEFAULT, instrukcja, 536
Set, słowo kluczowe, 74
SetObjectReplicability, metoda, 495
SetPermissions, metoda, 459; 471
SID, 459
Single, typy danych, 57; 63
Słowo kluczowe, Dim, 59
Słowo kluczowe, End Function, 24
Słowo kluczowe, New, 177
Słowo kluczowe, Optional, 88
Słowo kluczowe, Private, 29; 71
Słowo kluczowe, Select Case, 124
Słowo kluczowe, Sub, 24
SMALLINT, 515
Snapshot (typ obiektu Recordset
wDAO), 291 Sort, właściwość, 450 SQL Server, 346; 365 SQLOLEDB, dostawca danych, 351; 421 Stałe wewnętrzne, 80 Stałe, nazwy stałych, 42; 477 Stan przerwania, 197 Static, słowo kluczowe, 72; 175 Step Out (polecenie Wyjdź z procedury),
217 Step Over (polecenie Krokowo
z pomijaniem), 216 Step, klauzula, 136 Stop, instrukcja, 206 Stored procedure, 556 Stos wywołań, okno dialogowe, 212 STRING, 515 Struktura If...Then, 112 Struktura If...Then...Else, 118 Struktura If...Then...ElseIf, 120 Strukura Select Case, 123
Synchronizacja, 498 Synchronize, metoda, 489 System DSN, 358 System.mdw, 319; 486
Tabela konfliktów, 503
Tabela, czytanie zawartości pola (DAO),
292 Tabela, dodawanie r owego rekordu
(ADO), 299 Tabela, filtrowanie rekordów (ADO),
310 Tabela, kopiowanie rekordów do
arkusza Microsoft Excel (ADO), 308 Tabela, modyfikowanie (DAO), 302 Tabela, modyfikowanie rekordu (ADO),
302 Tabela, obliczanie liczby rekordów
(ADO), 294 Tabela, poruszanie się między rekordami
(DAO), 293 Tabela, wyszukiwanie rekordów (DAO),
294 Tabela, zachowywanie rekordów
w tablicy (DAO), 306 Tabela, zachowywanie wartości pól
w zmiennych (DAO), 305 Table (typ obiektu Table w DAO), 294 Table, obiekt, 371 TableDef, obiekt, 138; 242 Tables, kolekcja, 236; 371 Tablica, deklarowanie;, 156; 162 Tablica, dwuwymiarowa tablica, 145 Tablica, jednowymiarowa tablica, 143 Tablice, deklaracja, 156 Tablice, dwuwymiarowe, 143 Tablice, dynamiczne, 153 Tablice, górna i dolna granica, 147 Tablice, i pętle, 149
Skorowidz
699
Tablice, jednowymiarowe tablice, 143 Tablice, statyczne i dynamiczne, 153 Target, atrybut, 692 Terminate, zdarzenie, 178 TEXT, 515 TIME, 516 Timer, zdarzenie, 591 TMESTAMP, 516 Time Value, funkcja, 453 Timing Events, 590 Transakcja, tworzenie (ADO), 340 TransferSpreadsheet, metoda, 381 TRIM, funkcja, 670 Tryb przerwania, 67 Typ czujki, 208
Typ danych, znaki deklaracji, 63 Typ zmiennej, określanie, 63 Type, właściwość, 371 Typy danych, zmiana typu, 56; 244; 372; 515
U
Ubound, funkcja, 160; 307; 654 UNIQUE, ograniczenie, 519 UNIQUE, słowo kluczowe, 533 Unique, właściwość, 258; 391 Unload, zdarzenie, 579; 617 Updatable, właściwość, 285 UPDATE, instrukcja, 273; 512 UPDATE, kwerenda, 273; 525 Uprawnienia, indywidulane i grupowe
(DAO), 332 Uprawnienia, przyznawanie uprawnień
(DAO),'353 Uprawnienia, przyznawanie uprawnień
(DDL), 332 Uprawnienia, sprawdzanie uprawnień
(ADOX), 332
URL (Univeral Resource Locator), 623 User-defined, typy danych, 245
Users, kolekcja, 320 usługi katalogowe, 19; 345
Validation Rule, właściwość, 244
Validation Text, właściwość, 244
VARCHAR, 515
Variant, typ danych, 56; 79
VarType, funkcja, 77
VBA (Visual Basic for Applications),
587
VBA, biblioteka obiektów, 49 VBScript, 621
View Source, polecenie, 638 Views, kolekcja, 399 Visual Basic Edytor, 18
W
Weekday, funkcja, 120; 220
WHERE, klauzula, 269
Widoki (Views), 556
Wielkość przyrostu, 513
Właściciel obiektu, zmiana właściciela
(DAO), 469 Właściwości obiektu, pobieranie
i ustawianie, 469 Word dokument, 445 Workbook, obiekt, 443 Workspace, obiekt, 229 Workspaces, kolekcja, 229 Wskaźnik marginesowy, 2(J1 Wyrażenie, boolowskie, 112 Wzorzec projektowania (Design
Master), replikacja, 489
YESNO, 516
700
Programowanie w Access 2000
Z akładki, korzystanie z, 223 Zdarzenia, wysteepujące przy błędzie,
587 Zdarzenia, zachodzące przy stosowaniu
filtrów, 588 Zdarzenia, zachodzące w formularzu,
569 Zdarzenia, zachodzące w fromularzu
głównym aplikacji, 615 Zdarzenia, zachodzące w raportach, 593 Zdarzenia, zachodzące w sekcjach
raportu, 598
Zdarzenia, związane z oknami, 575 Zdarzenia, związane z posługiwaniem się
myszą, 581
Zdarzenia, związane z użyciem
klawiatury, 584 Zmienne lokalne, okno dialogowe, 69;
175
Znak &, 65
Znak dolara ($), 63; 144 Znak kontynuacji wiersza (_), 93 Znak równości (=■), 61; 645 Znak zapytania (?), 47; 645
Źródło danych, 229; 345; 594
Żywe dane (zob. Active Server Pages), 623
W ydawnictwo MIKOM poleca książki o bazach danych:
Bazy danych dla zwykłych śmiertelników
Bazy danych -język UML
Obiektowe bazy danych dla każdego
SQL dla zwykłych śmiertelników
SQL dla każdego
SQL. Zaawansowane techniki programowania
SQL Server 7 j
Zapytania SQL dla zwykłych śmiertelników. Praktyka obróbki danych w języku SQL
Dane w sieci WWW. Od relacji do modelu semistrukturalnego i XML
SQL przykłady praktyczne Projektowanie sieciowych baz danych SQL Server z XML
x
ZAMÓWIENIE
Imię i nazwisko lub nazwa firmy:
Adres z kodem:
Telefon:
Zamawiam następujące książki zobowiązując się opłacić przesyłkę przy odbiorze:
C zy wystawić fakturę VAT?
Oświadczenie
dla płatników VAT.
Oświadczamy,
że jesteśmy płatnikami VAT
i
upoważniamy WITKOM,
Warszawa
do wystawienia faktur VAT
bez
podpisu. NIP:
(pieczęć i czytelny podpis)
005
8
cftv'r-
?.8Fi4'-[)3-T9
Wydawnictwo MIKOM
Prowadzimy wysyłkową sprzedaż naszych książek. Wystarczy podać listę zamawianych tytułów (katalog wysyłamy bezpłatnie). Zamówienie zostanie zrealizowane w ciągu kilku dni.
Książki
oferujemy w naszych cenach detalicznych (niższych niż u
innych
dostawców).
Przy
jednorazowym zamówieniu na kwotę przekraczają
cą
600 złotych są stosowane katalogowe ceny hurtowe.
Odbiorca opłaca zryczałtowane koszty wysyłki.
Na życzenie wysyłamy wszystkim zainteresowanym aktualny katalog.
Aktualne ceny detaliczne naszych książek są podane na dołączonym do katalogu druku zamówieniu. Zamówienia można składać listownie, telefonicznie oraz za pośrednictwem Internetu. W Internecie można też zamówić informacje o nowościach.
Prosimy o zamówienia na adres firmy wysyłkowej
WITKOM
ul. Andrzejowska 3
02-312 Warszawa
Realizujemy zamówienia telefoniczne i internetowe tel./fax: (22) 823 70 77, 823 94 61
Strona WWW: http://www.mikomxom.pl
http://www.mikom.pl e-mail: zamowienia@mikom.pl