JULITTA KOROL programowanie wcess


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żyt­kownika w aplikacji Microsoft Access i chcą teraz dowiedzieć się jak efektywnie kor­zystać 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żo­ne 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 na­być, 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ła­dowej bazy danych Northwind wchodzącej w skład Accessa. Jeżeli natomiast legity­mujesz 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 za­dań 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óć pro­gramować w aplikacji Microsoft Access. W dziewięciu zagadnieniach tego rozdziału poznasz:



18

Programowanie w Access'.

  1. T ypy procedur, które możesz programować w Accessie oraz gdzie i w jaki
    sób sieje sporządza.

  2. Okno edytora Visual Basic oraz dostępne w n;m narzędzia programowania.

  3. Zasady przechowywania danych w celu późniejszego ich użycia.

  4. Przekazywanie dodatkowych informacji do procedur oraz funkcji przed ich
    chomieniem.

  5. Kontrolowanie toku wykonania programu za pomocą struktur warunkowych.

  6. Powtarzanie czynności przy użyciu struktur programowych określanych tei
    nem pętli.

  7. Przechowywanie wartości w tablicach statycznych oraz dynamicznych.

  8. Tworzenie własnych obiektów oraz kolekcji obiektów.

  9. 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 apli­kacji 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 roz­dziale skupia się na najnowszym i najbardziej polecanym przez Microsoft modelu obiektów noszącym nazwę ActiveX Data Objects (ADO). Po raz pierwszy wprowa­dzony w Access 2000 model obiektów ADO umożliwia dostęp do danych przecho­wywanych zarówno w relacyjnych bazach danych, jak i nie relacyjnych źródłach da­nych 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). Na­stę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ądza­niem 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 geo­graficznych.

Umiejętności nabyte w tym rozdziale umożliwią ci programowanie szeregu za­dań, 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 da­nych 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 wy­nikają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 zainstalo­wać 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 zamieszc­zony 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 studiow­ania. 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 „tabe­la". 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 zapa­mię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 umiesz­czonego 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 szero­kiego 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 wbu­dowanym językiem programowania - Visual Basic for Applications (krótko ok­reś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 ta­kie 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. Po­nieważ 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 pro­gramu. 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 zo­stał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 ustawie­nia 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:

  1. 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.

  2. 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.

  3. 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 prze­chowywany 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 prze­chowywane 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 pro­gramu (View => Code) lub klikniesz przycisk Kod programu na pasku na­rzędzi, to czynność ta spowoduje utworzenie modułu formularza lub mo­duł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 formula­rzu 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 po­czą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 da­nych po wybraniu przycisku Moduły. Moduły te używane są do przechowywa­nia 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ć spo­ro czasu na programowanie zdarzeniowe (ang. event-driven programming).

Access 2000 jest aplikacją reagującą na zdarzenia. Oznacza to, że cokolwiek zda­rzy 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, Ac­cess 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 pro­gramu (zob. rys. 1.5). Okno to szczegółowo omówione jest dalej w tym roz­dziale. 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 zda­rzenia. Słowa kluczowe End Sub w ostatniej linii kodu oznaczają koniec proce­dury 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.

  1. 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.

  2. Uaktywnij teraz formularz Klienci i wybierz Widok => Widok formularz.

  3. 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ę Kon­struktor 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 zdarze­nia. Z dalszych rozdziałów dowiesz się, jakie zdarzenia może dana czynność spowo­dować. 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 do­wiedział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 Vi­sual Basic i dostępnymi w nim narzędziami.

Korzystając z narzędzi w oknie edytora Visual Basic, możesz:

  1. Pisać procedury VBA;

  2. Projektować formularze;

  3. Przeglądać i modyfikować właściwości obiektów;

  4. Testować procedury i wyszukiwać błędy;

Do tej pory okno edytora Visual Basic uruchamiałeś z okna Właściwości for­mularza lub raportu w trybie projektu. Okno VBE możesz uruchomić dodatkowo trzema innymi sposobami:

  1. Z okna bazy danych - wybierz Narzędzia => Makro => Edytor Visual Basic.

  2. 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ł.

  3. 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 formula­rzy 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ła­snych 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:

  1. Z menu Widok - wybierz polecenie Project Explorer (Eksplorator projektu)

  2. 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:

  1. Pierwszy przycisk z lewej - Pokaż Kod programu (View Code) - wyświetla
    okno Kod programu dla wybranego modułu.

  2. Ś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.

  3. 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 alfabetycz­nym 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:

  1. Z menu Widok (View) - wybierz polecenie Okno właściwości (Properties A
    do w).

  2. Z klawiatury — naciśnij klawisz F4.

  3. 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 jednocze­sne 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

  1. 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;

  2. 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 wbudowa­nych 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 przyci­skó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:

  1. nacisnąć kombinację klawiszy Ctrl+J,

  2. 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/Me­thods),

» wybrać z menu Edycja polecenie Wyświetl właściwości/metody (List Proper­ties/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 podpowie­dzi, które pojawia się poniżej kursora po wpisaniu lewego nawiasu. Polecenie Para­meter 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 pod­powiedzi. 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 wpi­sywania 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

  1. K liknij przycisk Zwiększ wcięcie (Indent) na pasku narzędzi Edycja lub naciśnij
    klawisz Tab.

  2. 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.

  3. 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 ek­ranie 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 odtwarza­na 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:

  1. Z klawiatury - naciśnij klawisz F2.

  2. Z menu - wybierz Widok => Przeglądarka obiektów (View => Object
    ser).

  3. 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 ostat­nio 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 Pro­jekt/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 (Mem­bers) podaje właściwości, metody i zdarzenia, których dana klasa może używać. Cho­ciaż 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ą polece­nia Grupuj składowe z menu podręcznego Przeglądarki obiektów.

Jeżeli zaznaczysz w polu Projekt/Biblioteka projekt o nazwie Northwind, to li­sta Members wyszczególni procedury znajdujące się w tym projekcie. Aby przestu­diować kod dowolnej procedury, kliknij dwukrotnie myszą na jej nazwę. Jeżeli wybie­rzesz bibliotekę VBA w polu listy Projekt/Biblioteka, to zobaczysz wykaz wbudo­wanych 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 za­warty 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ąć zaznaczo­ną 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 dopaso­wać 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.

  1. W polu listy Projekt/Biblioteka (zob. rysunek 1.19) kliknij strzałkę v
    i wybierz bibliotekę Access.

  2. 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 da­nych, 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.

  1. W oknie bazy danych kliknij przycisk Moduły, następnie wybierz Nowy, aby
    utworzyć nowy standardowy moduł.

  2. W oknie Kod programu wpisz nazwę procedury sub NowaTeczka ().

  3. Naciśnij Enter. Visual Basic wpisze końcowe słowa kluczowe procedury End

Sub.

  1. Naciśnij F2, aby otworzyć okno Przeglądarka obiektów.

  2. Kliknij strzałkę w dół obok pola listy Projekt/Biblioteka i wybierz bibliotekę
    VBA.

  3. W polu Poszukiwany tekst wpisz file i naciśnij Enter.

  4. Odszukaj i zaznacz w spisie składowych metodę MkDir.

  5. Kliknij przycisk Kopiuj w oknie Przeglądarka obiektów, aby skopiować wy­
    braną metodę do Schowka aplikacji Windows.

  6. Zamknij okno Przeglądarka obiektów i wróć do okna Kod programu. Wklej
    skopiowaną instrukcję wewnątrz procedury NowaTeczka.

  7. 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

  1. U ruchom ekran edytora Visual Basic, naciskając klawisze Alt+Fll.

  2. Naciśnij klawisze Ctrl+G, aby uaktywnić okno Instrukcje bezpośrednie.

  3. 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 ot­warta.

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 ra­zem, 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 znaj­duje 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 usu­nąć 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 spraw­dzić 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 wy­konaniu 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 zmien­nych, dzięki temu unikniesz niepotrzebnego wpisywania znaków, kiedy w danej pro­cedurze 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łu­gość 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

  1. 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.

  2. 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 po­prawia 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 spowo­dować 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 przechowy­wać, zostanie jej przypisany typ danych variant. Chociaż variant może prze­chowywać dowolny typ danych, wymaga on większej ilości pamięci niż inne ty­py 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. ter­minu dimension, poi. wymiar), po której następuje nazwa zmiennej oraz jej typ. Przy­puść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 (DataUrodze­nia). Jeżeli nie podoba ci się ta nazwa, to możesz ją zastąpić innym wyrazem lub wy­razami (grunt by wybrana nazwa nie była jednym z zarezerwowanych słów kluczo­wych 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 przechowy­wać 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ć procedu­rę, 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ów­nież zadeklarować kilka zmiennych w jednym wierszu, oddzielając poszczególne de­klaracje 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 zmien­nych 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 informa­cji, 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 - „Niezgod­ność 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 Ba­sic 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 na­zwy 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.

  1. W oknie bazy danych kliknij przycisk Moduły.

  2. Kliknij przycisk Nowy, aby utworzyć nowy moduł.

  3. 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%.

  4. 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 zo­stały utworzone przez przypisanie wartości ich nazwom na początku procedury. Zmiennej koszt przypisano wartość, która jest rezultatem wzoru cena + (cena * poda­tek). Zmienna strMsg składa komunikat dla użytkownika o koszcie zakupu kalkulato­ra.

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ść przypisa­na 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 cudzy­słowem po słowie „wynosi" znajduje się dodatkowa spacja;

  1. znak & - służy on do łączenia poszczególnych części wyrażenia;

  2. 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;

  3. znak & - za każdym razem, gdy chcesz dołączyć do tworzonego łańcucha tekstu
    nową informację, należy ją poprzedzić tym znakiem;

  4. 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 zadek­larowana.

  1. Wróć do okna Kod programu, w którym wpisałeś procedurę KosztKal.

  2. 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 zo­stał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 proce­durze. 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:

  1. W oknie edytora Visual Basic wybierz Narzędzia => Opcje (Tools => Options)!

  2. 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ć samod­zielnie.

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 in­strukcji option Explicit jest automatyczne wychwycenie błędów w pisowni nazw zmiennych w chwili kompilacji programu (gdy Visual Basic przystępuje do tłuma­czenia 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 mo­duł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. Zmien­ne, 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ą wykorzy­stywać 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 kom­putera. 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 - zmien­ną 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 kosz­cie 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 proce­dury 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 pro­cedurę 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 mo­dułu, zaraz po instrukcj i op t i on Exp licit.

Zmienne na pozimie modułu, które są zadeklarowane za pomocą słowa kluczo­wego 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, zmien­na nowyzakup została zadeklarowana jako zmienna typu string. Po pojawieniu się okna dialogowego użytkownik ma wpisać koszt zakupu. Koszt zakupu w postaci tek­stu 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 pro­cedury 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:

  1. Umieść kursor w obrębie procedury Kosztzakupu i naciśnij F5.

  2. 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 poda­ny 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 Klien­ci. 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

  1. Zmiennych obiektowych można używać zamiast obiektu.

  2. Zmienne obiektowe są krótsze i łatwiejsze do zapamiętania i użycia aniżi
    tości, które wskazują.

  3. 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ę:

  1. Odnaj dź kod procedury ukryj Formant.

  2. OdnąjdŹ instrukcję formant.Visible = False.

  3. 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 reprezen­tuje 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ńcu­chem 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 mo­duł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 jed­nym 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.

  1. Wybierz Edycja => Zaznacz formularz lub naciśnij Ctrl+R.

  2. Wybierz Widok => Właściwości.

  3. Kliknij zakładkę Zdarzenie w oknie Właściwości formularza.

  4. Kliknij przycisk (...) po prawej stronie właściwości Przy filtrowaniu (On Fil­
    ter) i wybierz opcję Konstruktor kodu.

  5. 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ślo­ne czynności. Procedury te nie wymagają podawania dodatkowych informacji lub da­nych 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 napi­sać procedurę zwykłą, która wezwie daną funkcję.

Uruchamianie funkcji z okna Instrukcje bezpośrednie

  1. W oknie bazy danych kliknij przycisk Moduły. Wybierz Nowy, aby utworzyć
    nowy moduł.

  2. 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 (Va­riant) 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ą licz­bami 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 da­nych 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 po­czą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. Oka­zuje 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 klu­czowym 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 zade­klarowana 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 ra­zem ś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ą 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 komu­nikatu, 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 komu­nikatu 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 Instruk­cje 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, nato­miast 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 Ba­sic 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 cyto­wany, który znajduje się wewnątrz innego łańcucha znaków, wymaga dodatkowej pa­ry 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śle­nia), 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 bez­pośrednie.

3. W oknie Kod programu wpisz procedurę Komunikat podaną poniżej. Nie za­pomnij 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 komu­nikat (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 pierw­szy

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ń przyci­skó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 komu­nikatu 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 con­text, 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 dialo­gowym 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 Pro­fessional 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. Naj­częś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 Anu­luj, 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 symbo­licznych 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. Naj­częś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 Anu­luj, 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 symbo­licznych 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 na­wiasie. 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 pro­cedurę 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 wpi­szesz 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 do­wolną 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 obli­czenia 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) spowodo­wał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. Na­stę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 od­powiednie procedury podrzędne i funkcje. Procedura główna rozpoczyna się od dek­laracji 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 (in­nymi 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ę argumen­tó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

  1. Argument jest zmienną, stałą lub wyrażeniem przekazywanym do procedury, sp

  2. 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, przecho­wują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 obli­czenia 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żNazwisko­imię (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 poka­zują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

  1. Z adanie wykonywane przez procedurę może być wykorzystane przez k
    cedury.

  2. Każdą procedurę można przetestować indywidualnie przed jej uźj
    w procedurze głównej.

  3. 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 wa­runkowe 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 na­potka 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 mo­gła być wykonana

OR

Przynajmniej jeden z podanych warunków musi być spełniony, aby czyn­ność mogła być wykonana

NOT

Użyty w celu negacji warunku. Jeżeli warunek jest prawdziwy, not spo­woduje, że stanie się on fałszywy. Jeżeli warunek jest fałszywy, not spo­woduje, ż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

  1. W nowym module wpisz podaną powyżej procedurę ProsteifThen.

  2. 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."

  1. Uruchom procedurę ProsteifThen i wpisz liczbę inną niż 52.

  2. 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 zo­stanie 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 roz­dziale). 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ą proce­durę. 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żyt­kownik 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 pier­wszym 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 wynie­sie 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 in­strukcji 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ć opera­toró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ć in­strukcje 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 koniec­zne 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 (zazna­czonego 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 zastosow­ane 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 przypi­sana stała vbYes lub odpowiadająca jej wartość liczbowa 6. Jeżeli użytkownik wybie­rze 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 wybPrzy­cisk 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 pod­stawimy 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 demon­struje, 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ąt­pliwoś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 prawdzi­wa, jeżeli przynajmniej jeden z warunków jest prawdziwy.

Podsumowanie

Zaprezentowane struktury warunkowe umożliwiają sterowanie wykonaniem pro­cedury w zależności od sytuacji. Decyzje włączone do procedury czynią daną proce­durę 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ępu­jące wskazówki:

  1. jeśli chcesz podać tylko jeden warunek, wybierz prostą strukturę i f. . . Then;

  2. jeśli musisz zdecydować, który z dwóch warunków trzeba wykonać, wybierz
    strukturę if.. .Then.. .Else;

  3. 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 pow­tarzanie 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ą sek­wencję 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 praw­dziwy. 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 in­strukcje 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 Ba­sic 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 in­strukcja Loop.

Teraz wypróbuj następującą procedurę, która drukuje 27 liczb w oknie In­strukcje 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 ze­ro (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 De­bug. 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 bez­poś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 wska­zuje, o jaką wartość należy powiększyć lub zmniejszyć licznik, są opcjonalne. Op­cjonalne 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 licz­nika, 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.

  1. Przed uruchomieniem powyższej procedury otwórz dowolny formularz w trybie
    Widoku.

  2. 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 re­prezentuje 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 ba­za 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 zigno­rował 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 in­strukcji 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:

  1. instrukcja Exit For może być użyta w celu wcześniejszego zakończer
    For...Next albo For...Each...Next.

  2. 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ś zadeklaro­wać 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 podroz­działów dowiesz się, w jaki sposób można manipulować dużą liczbą danych za pomo­cą 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 najpopular­niejszych należą tablice jednowymiarowe (tzw. listy) i tablice dwuwymiarowe (tzw.

tabele).

W języku potocznym tablica jednowymiarowa często jest określana terminem li­sta. 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 Nu­de

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 po­mocą numeru wiersza i kolumny. W tym schemacie pierwszy element tablicy znajduje się w pierwszym wierszu i w pierwszej kolumnie (1,1). Ostatni element tablicy umiesz­czony 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 us­tawieniu 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 in­strukcji 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. Procedu­ra 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 ta­blicy 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.

  1. Odtwórz procedurę uiubioneMiasta i sprawdź jej rezultat.

  2. 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ę orygi­nalnej 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 argu­mentem. 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 ko­lumnach (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 de­klaruje tablicę statyczną o nazwie owoce, która może zawierać nie więcej niż 11 ele­mentó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 dy­namiczną 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, za­tem 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 na­stę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 tabli­cą, 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 po­niż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: „Niezgod­ność typów" (ang. Type mismatch). Aby uniknąć go należy zapamiętać, że każdy ele­ment 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ń re­gionalnych 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 podrozd­ziału zapoznałeś się z pięcioma wbudowanymi funkcjami VBA, które są często uży­wane 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 zautomaty­zowanie 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, Vi­sual Basic umożliwia tworzenie własnych obiektów i kolekcji obiektów oraz definio­wanie dla nich właściwości i metod. W kolejnych podrozdziałach zostały opisane za­sady 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 mate­riał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° 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 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 ele­mentów do kolekcji. Aby usunąć dowolny element z własnej kolekcji obiektów na­leż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Ż Wd^
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„i 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:

  1. Property Let -jest to procedura, która ustawia wartość właściwości,

  2. Property Get -jest to procedura, która zwraca wartość właściwości,

  3. 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 znajdu­jących Się po instrukcji wołającej procedurę Property Get, Property Let lub Pro­perty Set.

Tworzenie procedur Property Get

Obiekt pracownik (cPracownik) posiada cztery właściwości, które mają być od­czytywane 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 proce­dury 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 kluczo­we 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 proce­durami, 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 od­wołaniami do innych procedur.

Tworzenie metod obiektu

Oprócz właściwości obiekty posiadają zazwyczaj jedną lub więcej metod. Me­toda 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

  1. Tylko metody, które będą dostępne poza modułem danej klasy, powinny
    klarowane jako Public, wszystkie pozostałe jako Private.

  2. Metody wykonują pewne operacje na danych znajdujących się w danej Id

  3. 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 klu­czowym 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ć.

  1. Uruchom teraz okno edytora Visual Basic.

  2. Wybierz Wstaw => Moduł, aby dodać nowy niestandardowy moduł do swojej
    aplikacji.

  3. W oknie Właściwości zmień nazwę tego modułu na PracOperacj e.

  4. 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.

  1. W oknie bazy danych kliknij przycisk Formularze, następnie uruchom
    Utwórz formularz w widoku Projekt.

  2. Zapisz formularz pod nazwą frmPensje.

  3. 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ć kil­ka 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 pra­cownikó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 zo­staną 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 argu­mentu, który wskazuje na indeks wybranego elementu w polu listy. Po usunięciu pra­cownika 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 jed­nego 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łączo­nej do przycisku Dodaj na formularzu. Procedura ta wymaga trzech argumentów. Gdy Visual Basic dotrze do instrukcji with prac, wówczas utworzona zostanie nowa in­stancja klasy CPracownik. Właściwościom Nazwisko, imię oraz Pensja zostaną przy­pisane 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 nie­zbę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

  1. Wróć do widoku Projekt formularza frmPensje.

  2. Wybierz Widok => Formularz (View => Form) aby wyświetlić formularz, i

  3. 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]
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 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 pra­cownika, 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 zagad­nieniu 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 za­koń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 pro­cedura 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 zna­czenie 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")

  1. Przygotuj formularz przedstawiony na rysunku 1.41.

  2. 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

  1. K liknij obok właściwości Przy załadowaniu i kliknij przycisk z trzema]
    mi. Wybierz Konstruktor kodu i kliknij OK.

  2. 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

  1. Wybierz pole kombi na formularzu (cboEndDate) i ukatywnij okno Wlaścii

  2. Kliknij obok właściwości Przy zmianie na zakładce Zdarzenie i kliknij pn
    z trzema kropkami. Wybierz Konstruktor kodu i kliknij OK.

  3. 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

  1. Wybierz Wstaw I Moduł, aby dodać nowy standardowy moduł. W oknii
    ściwości nowego modułu zmień nazwę modułu na DniTygodnia.

  2. 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ą instruk­cję:


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 niek­tórych czynności wykonywanych podczas edycji kodu programu. Jeżeli kilka czyn­noś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

  1. Wróć do widoku Projekt formularza frmPensje.

  2. Wybierz Widok => Formularz (View => Form) aby wyświetlić formularz.

  3. 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)
mjmię = 1
End Property





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 pra­cownika, 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 za­koń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 zna­czenie 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,


  1. Przygotuj formularz przedstawiony na rysunku 1.41.

  2. 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 '

  1. K liknij obok właściwości Przy załadowaniu i kliknij przycisk z trzema H
    mi. Wybierz Konstruktor kodu i kliknij OK.

  2. 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

  1. Wybierz pole kombi na formularzu (cboEndDate) i ukatywnij okno Właścnfl

  2. 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.

  3. 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.

  1. Wybierz Wstaw I Moduł, aby dodać nowy standardowy moduł. W oknie f
    ściwości nowego modułu zmień nazwę modułu na Dni Tygodnia.

  2. 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ą instruk­cję:

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 pro­gramu. Visual Basic wyświetla wskaźniki marginesowe w celu uwidocznienia niek­tórych czynności wykonywanych podczas edycji kodu programu. Jeżeli kilka czyn­noś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 prze­rwania i naciśnij F9 (lub wybierz Debug => Clear Breakpoint). Powinieneś usunąć wszystkie punkty przerwania, jeżeli nie są one już potrzebne. Punkty przerwania zo­staną 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 proce­nty 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 Wa­tch) 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 znaj­duje 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ę proce­durę, 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 (Proce­dure) oraz Breaks w polu kombi Moduł (Module).

[ W sekcji Typ czujki (Watch Type) wybierz opcję Przerwij, gdy wartością wy­raż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.

  1. Wybierz z menu Analiza opcję Edytuj czujkę i wpisz w polu Wyrażenie:]
    277.

  2. 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 kla­wisze 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ść.

  1. Kliknij Anuluj, aby wrócić do okna Kod programu.

  2. 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ć pro­cedury 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 prze­rwania 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 pro­cedura:

[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 anal­izować 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 anal­izować.

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 zzkU 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.

  1. Wstaw nowy moduł i zmień jego nazwę w oknie Właściwości na Conditi

  2. 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) Vi­sual 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łą warun­kową 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 Ety­kieta

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 demon­struje 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:

  1. Przygotuj plik tekstowy o nazwie C:\Wakacje.txt za pomocą programu Ni
    Windows i wpisz w nim dowolny tekst.

  2. Uruchom procedurę Przeczytaj plik cztery razy w trybie krokowym
    następujących założeń:


  1. Podaj nazwę pliku C:\Wakacje.txt,

  2. Podaj nazwę pliku, którego nie ma na dysku C,

  3. Podaj nazwę dowolnego pliku na dyskietce A: (gdy dysku nie ma wstJ
    ków),

  4. 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

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 pro­gramowanie. Po przetestowaniu procedury powinnieneś przekazać ją do testowania i samvm użytkownikom. Użytkownicy szybko dadzą znać, czy procedura daje oczeki­wane 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 apli­kacji, 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 In­strukcje 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: Er­ror (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śred­nie 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<

  1. p racować z elementami systemu bezpieczeństwa, takimi jak konta indywij
    i grupowe,

  2. 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 da­nych, po czym zostaje utworzona baza danych. Natychmiast po jej utworzeniu zasto­sowana 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 (pro­gramowanie za pomocą obiektów ADO jest omówione w rozdziale 3.). Dopisując na-;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, mu­sisz 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 Conta­iners 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. Sil­nik 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, za­wiera 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ści­wość 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

  1. dbText jest stałą określającą typ danych zakładanego pola (zob. tabelę 2.2 poi

  2. 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 (Ko­munikat 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 pro­perties) oraz właściwości zdefiniowane przez użytkownika (user-defined properties). Właściwość zdefiniowana przez aplikację tworzona jest w rezultacie ustawienia war­toś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 doty­czących określonego obiektu. Przykład 2.5.A demonstruje, w jaki sposób można wy­korzystać 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 da­nych, 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 na­zwę 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 kom­binację 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 przy­czają 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 wska­zującej nazwę nowej relacji. W tym przykładzie, relacji tej nadaliśmy nazwę jeden-jowielul. Polecenie mojaRelacja.Table = "tblKraje" , podaje nazwę tabeli głów­nej (tabela ta zawiera klucz podstawowy tzw. Primary Key).

Polecenie mojaRelac ja. ForeignTable = " tblKrajeRejony" podaje nazwę ta­beli związanej (ta tabela zawiera klucz obcy tzw. Foreign Key). Możesz również po­dać 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 Rela­tion, 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 aktualizo­wać 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 uru­chamiają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 interfej­sem 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 pra­cowników z tabeli Employees, których tytuł zaczyna się od 'Ms.'. Kwerendy wybie­rają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 Parame­ter 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 para­metrem, 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żli­wia 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



WHERE

kryterium/ ograniczenie czynności do

pożądanych rzędów

Kryterium w klauzuli where pozwala określić, które rzędy zostaną zaktualizowa­ne. Kwerenda aktualizująca nie zwraca rekordów w postaci tabelarycznej. Aby przy­padkowo 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 urucho­mieniem kwerendy usuwającej zawsze sporządź kopię zapasową tabeli. Warto rów­nież 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 pole­cenia select poleceniem delete.

Metoda Execute pozwala na uruchomienie kwerend modyfikujących lub wyko­nanie 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ę usu­nię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 ser­werze bazy danych, możesz wysłać polecenia bezpośrednio do serwera w celu pobra­nia 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ści­wość 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 ro­dzaje 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. Kwe­rendę 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 wy­mienia sytuacje, w których rezultatów kwerendy nie można aktualizować (zob. rysu­nek 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 Re­cordset 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, doda­wanie, 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. Ze­stawy Dynasets, umożliwiają pobieranie, dodawanie, aktualiza­cję oraz usuwanie rekordów z jednej lub więcej tabel.

Snapshot

Stosowany do pobierania rekordów w rodzimej tabeli bazy da­nych Microsoft Access (plik .mdb) oraz z tabeli połączonej albo kwerendy. Zestawy typu snapshot posiadają kopię re­kordó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. Spe­cjalny 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 (Re­cordset) 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 kweren­dę można tylko otworzyć, korzystając z obiektu Recordset typu Dynaset lub snaps­hot. Na przykład, aby otworzyć zestaw rekordów oparty na kwerendzie, możesz za­stosować 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ść Absolu­tePosition 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 Re­cordset 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 przesu­niemy 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 meto­dy 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 bie­lącego indeksu, to zajdzie błąd podczas odtwarzania procedury. Metoda seek prze­szukuje 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 poda­nej wartości.

Z najduje pierwszy rekord, którego indeksowane pole jest mniejsze od podanej war­toś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
Znajduje pierwszy rekord, który spełnia podane kryterium.

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
Znajduje ostatni rekord, który spełnia podane kryterium.

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 Book­mark 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 pierw­szym rekordzie w zestawie Dynaset. Procedura następnie przystępuje do poszukiwa­nia 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ęp­nie, 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 dowie­dzieć 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 re­kord.

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, wyszukiwa­nia 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. Ponie­waż 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 nowe­go 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 nowe­go 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 rekor­dem. 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.

  1. Zamknij tabelę tbiKiienci2.

  2. 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, doda­wanie, 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. Ze­stawy Dynasets, umożliwiają pobieranie, dodawanie, aktualiza­cję oraz usuwanie rekordów z jednej lub więcej tabel.

Snapshot

Stosowany do pobierania rekordów w rodzimej tabeli bazy da­nych Microsoft Access (plik .mdb) oraz z tabeli połączonej albo kwerendy. Zestawy typu Snapshot posiadają kopię re­kordó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. Spe­cjalny 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
1

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 (Re­cordset) 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ść Absolu­tePosition 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 Re­cordset 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 prze­szukuje 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 poda­nej wartości.



Znajduje pierwszy rekord, którego indeksowane pole jest mniejsze od podanej war­toś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"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 rekor­dem. 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:

  1. Otwórz tabelę tbiKiienci2 w interfejsie użytkownika i usuń rekord
    Gosh, który został dodany przez procedurę w przykładzie 2.21.A.

  2. Zamknij tabelę tbiKlienci2.

  3. 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 pobie­rania 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 pole­ceń 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 spo­rzą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 pro­cedur. 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
^ przez użytkow.

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
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 za­mierzasz 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 re­kordy, 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 spo­sobem 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 na­zwa 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ż!

  1. Poruszanie się w zestawie rekordów oraz manipulowanie rekordami bez ni
    nia rekordów wyświetlonych w danym formularzu.

  2. Synchronizację formularza z rekordem odnalezionym w zestawie Recor

lone.

  1. Dostęp do właściwości RecordCount obiektu Recordset w celu uzyskani
    rekordów wyświelonych w formularzu.

  2. 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 nie­upoważ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) au­tomatycznie loguje danego użytkownika w domyślnym obszarze roboczym (DBEngi­ne.workspaces (0)) w charakterze użytkownika o nazwie Admin i nie wymaga poda­nia 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 otwar­tych?

?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:

  1. Utworzyć dowolną liczbę obiektów Workspace.

  2. Załogować się w charakterze innego użytkownika.

  3. Wymagać załogowania się za pomocąokreśloiego ID.

  4. 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 na­stę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 works­paces 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
Dostępne grupy:
Administratorzy


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 „Do­daj 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 wy­magane 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. Skorzy­staj 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 indywidu­alnych 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 dowie­dzieć 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 usta­wiona 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, rela­cji, 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ła­dzie 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 obiek­cie 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 przedsta­wia 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 żad­nych 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 ta­beli 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 work­space 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 za­twierdzić wprowadzone zmiany. W razie wystąpienia błędu w transakcji, instrukcja Rollback umożliwi anulowanie zmian wprowadzonych w transakcji od momentu in­strukcji 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 in­formacji przechowywanych winnej tabeli. Tabela o nazwie NiemieccyKlienci za­wiera identyfikatory tych klientów, którzy muszą być powiązani z określonym identy­fikatorem 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 trans­akcji.

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 me­tod DAO (Data Access Objects). DAO jest obecnie wychodzącym już z mody sposo­bem dostępu do danych i manipulowania nimi. Chociaż DAO jest bardzo wydajne w odniesieniu do rodzimych baz danych Microsoft Jet, sugerowanym sposobem wy­konywania zadań programatycznych w odniesieniu do baz danych jest korzystanie ztnodelu obiektów ADO (ActiveX Data Objects). ADO współpracuje z nową tech­nologią 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), ma­gazyny 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 komu­nikacji 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 po­siada 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 do­konywać 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ą wykorzystywa­ną 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 prze­glądarkę Internet Explorer 5.0, to powinienneś mieć na swoim komputerze zainstalo­waną 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).

  1. Z menu edytora Microsoft Visual Basic, wybierz Narzędzia => Odwołania (To­
    ols => References).

  2. 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 da­nych 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 spo­tkania 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 Of­fice \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 do­stawca 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 do­stawcy OLE DB. ODBC jest domyśl­nym dostawcą dla ADO

Active Directory Se­rvice

ADSDSOObject

Umożliwia dostęp do usług katalogo­wych 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 ba­zy 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żytkowni­ka 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 otwo­rzyć 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 uzy­skania 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 So­urce 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. Procedu­ra 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 przechowywa­nia 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 pli­kó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 bi­blioteki 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żytkow­nika 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 spe­cjalnych instrukcji On Error:

i On Error GoTo NazwaEtykietki

  1. On Error Resume Next

  2. 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 bi­blioteki 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 Con­nection 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 do­stępny tylko z obiektu Connection. Błędy, które występują w samym ADO są przeka­zywane 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ę da­nych, 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): " & errA­DO. 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 Ac­tiveX 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 znaj­dujących się w bibliotece ADOX. Pełna nazwa tej biblioteki brzmi w języku angiel­skim 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 biblio­teki 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 Ca­talog. 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.

  1. Właściwość LockType wskazuje na to, w jaki sposób należy zablokować
    podczas manipulowania nimi

  2. 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, adLoc­kOptimistic, 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 ba­zy 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 da­nych 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ć wy­kaz tabel w bazie danych Northwind uzyskując dostęp do zbioru Tables obiektu Ca­talog 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 doku­mentu Worda.

Procedura w przykładzie 3.4.N poniżej demonstruje w jaki sposób można sko­piować 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, przy­pisz właściwości Type obiektu Key stałą o nazwie adKeyPrimary. Procedura w przy­kł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:

  1. Dodaj jedną lub więcej kolumn do indeksu korzystając z metody Append.

  2. 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 indekso­wanej 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żytkowni­ka otrzyma ustawienie Tak

AdlndexNullsIgnoreAny (ta wartość nie jest wspierana przez do­stawcę 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ści­woś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śl­ne). 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 spo­só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. Pro­gramowanie 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 umiesz­czono 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

  1. S korzystać z właściwości RelatedTable, aby wskazać nazwę tabeli obcej (FoJ
    ign table).

  2. 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.

  1. Przypisać właściwości RelatedColumn nazwę odpowiedniej kolumny w tabJ
    podstawowej.

  2. 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), zna­ne są jako bezparametrowe kwerendy zwracające rzędy.

Używaj obiektu View z biblioteki ADOX, aby pracować z kwerendami, które zwra­cają 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ą meto­dy 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żyt­kownika kwerenda wybierająca, otwórz obiekt Catalog w bibliotece ADOX i skorzy­staj 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 SE­LECT jest przypisane obiektowi Command. Ponieważ obiekt Command zawsze two­rzy tymczasową kwerendę, aby zapisać daną kwerendę na stałe w bazie danych proce­dura 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

  1. 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

  2. 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ści­woś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 war­toś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 rekor­dy 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
Obiekty jNazwa

u


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 obiek­tó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 przechowy­waną w zbiorze views obiektu catalog pochodzącego zbibłioteki ADOX. Następnie metoda open obiektu Recordset otwiera obiekt Rekordset oparty na podanej kwe­rendzie:

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 Fak­tury, 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 Connec­tion, 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 zmien­nej 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:

  1. Pobierz kwerendę ze zbioru views lub Procedures obiektu catalog.

  2. 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 urodze­nia.

[ 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 da­nych 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 in­nych obiektów. Załóżmy, że chcesz pobrać wszystkie rekordy z tabeli tbiKi ienci znaj­dują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 Record­set 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 przecho­wywana, widok, plik lub obiekt command). Polecenie select poleca wybranie wszyst­kich 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 znaj­duje 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 Re­cordset pochodzącego z biblioteki DAO, z którym pracowaliśmy w rodziale 2. Obiekty Recordset w ADO są kontrolowane przez tzw. kursor (Cursor). Przy twor­zeniu nowego zestawu rekordów (Recordset), automatycznie otwierany jest do­myś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ć re­kordy w trybie tylko do odczytu (read-only), czy też upoważniony jesteś do modyfi­kacji 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 ok­reś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. Sko­rzystaj 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 Record­set 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

  1. MarstialbptionsEnurn
    $ MoveRecordOptionsEni

  2. 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 da­ne 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 ze­stawie rekordów aż do napotkania jego końca (EOF). Po otwarciu zestawu rekordów warto sprawdzić, jaki typ obiektu Recordset został utworzony. Procedura ta wyko­rzystuje 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 od­czytu (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 pole­ceniu SQL, które wybiera wszystkich pracowników z tabeli Pracownicy w przykła­dowej bazie danych Northwind. W oknie Instrukcje bezpośrednie pojawi się imię i nazwisko pierwszego pracownika znajdującego się w tabeli. Podobnie jak w pop­rzednim 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 ko­rzysta 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ślone­go 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 znaj­dują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 (posiada­ją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 odnale­zione.

-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 odnale­zione.

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 akcepto­wana 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 do­dać 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ży­ciu metody AddNew wartości pól nie są podane, utworzony jest pusty rekord. Przy po­wtórnym użyciu metody AddNew, do tabeli dodane zostają dane dotyczące Janka Ko­walskiego. 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
jTj i"i1B5 Plus Sp. z o.o.

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


■■^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 connec­tion, 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 prawdzi­we, wówczas dany rekord jest włączony do naszego zestawu, w przeciwnym razie da­ny rekord jest z niego wyłączony. Procedura w przykładzie 3.8.G otwiera zestaw re­kordó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 re­kordó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 pro­cedurze 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 na­stępujący błąd, „The operation requested by the application is not supported by the provi­der" (Operacja nie jest wspierana przez dostawcę danych). Wyjściowy porządek sortowa­nia 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ści­woś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 za­chować 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ą pocho­dzić 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) for­mularza). 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

  1. Wstaw nowy moduł i wpisz w nim procedurę w przykładzie 3.9.C poniżej.

  2. Zachowaj formularz jako frmAgenciinfo.

  3. 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, bi­blioteka 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 zbio­ró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 po­każą 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ć no­we 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," na­stę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żytkow­nikó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żyt­kownik, 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 kiero­wać, jeżeli ustawisz uprawnienia tylko dla kont grup, następnie zaś przydzielisz użyt­kowników do określonych grup. Jak pamiętasz, uprawnienia dla danej grupy są auto­matycznie 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).

  1. 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.

  2. 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ąć.


470




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żyt­kowników i grup po uruchomieniu procedury Set_UserDbPermissions (zob. przy­kł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żytkowni­kom 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 szere­gu 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ć na­zwy stałych reprezentujących uprawnienia, musisz napisać dodatkowy kod, który roz­szyfruje 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ę da­nych, 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
HMicrosoft ActiveX Data Objects 2,6 Library
DAPS118 ,
1 ! Microsoft ActiveX Data Obiects 2,1 Librarv JL1






; 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 transak­cji. 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 przy­kł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 na­zwę 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 bi­blioteki 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ę da­nych przez osobami nieupoważnionymi, możesz zaszyfrować bazę danych. Przed przystąpieniem do szyfrowania danych, zabezpiecz bazę danych, przyznając odpo­wiednie uprawnienia użytkownika oraz grupy do obiektów bazy danych. Aby zaszy­frować 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). Re­plikacja 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 udo­stępnić zmiany wprowadzane w bazie danych innym użytkownikom.

Replikacja bazy danych zapewnia następujące korzyści:

  1. 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.

  2. 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.

  3. 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 pro­jektowania 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 bi­blioteki 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 da­nego 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ż ConflictTa­bles.

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, korzy­stają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ą in­strukcję (po zmodyfikowaniu ścieżki dostępu do pliku) w okne Instrukcje bez­pośrednie, pomijając znak podkreślenia zastosowany w tym przykładzie do przenie­sienia długiej instrukcji do następnego wiersza. Jak wiesz, w oknie Instrukcje bez­poś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 udo­stę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ęp­ny 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 procedu­ry 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 obiek­tó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

  1. 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.

  2. Import danych (jrSyncTypelmport) - wymiana uaktualnionych rekordów oraz
    obiektów następuje tylko z repliki docelowej do repliki źródłowej.

  3. 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 kom­puterze 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 dwu­kierunkowej . Jeżeli chcesz dowiedzieć się o synchronizacji replik przez Internet, mu­sisz zainstalować specjalne narzędzie o nazwie Menedżer replikacji (Replication Man­ager) i skonfigurować serwer intemetowy w celu udostępnienia replikacji. Informacje dotyczące instalacji i konfiguracji Menedżera replikacji w celu przeprowadzenia syn­chronizacji za pomocą sieci Internetu są szczegółowo opisane w następującym doku­mencie 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 re­plik, muszą być sporządzone z tego samego wzorca projektowania (Design Master). Nie wystarczy utworzyć repliki z tej samej oryginalnej (nie replikowanej) bazy da­nych. 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 skopio­wać 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.

  1. Wybierz ponownie Narzędzia => Replikacja =ś> Utwórz replikę. W polu nazwa
    pliku wpisz Replika_Francja jako nazwę nowej repliki i kliknij OK.

  2. Zamknij wzorzec projektowania Nothwind.mdb.

  3. 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.

  1. 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.

  2. Otwórz replikę wzorzec projektowania Northwind.mdb i wybierz Narzędzia =>
    Replikacja => Synchronizuj.

  3. 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

  1. W e wzorcu projektowania (Northwind.mdb) wybieiz Narzędzia =* Replikacja
    => Synchronizuj.

  2. 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 (Microso­ft 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 miej­sce, 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 da­nych 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 Ob­jects (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 da­nej 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 wy­konywaniu 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żyt­kownika 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 Langu­age), który jest komponentem strukturalnego języka zapytań (SQL - Structured Query Language).

Głównym silnikiem bazy danych, na którym opiera się aplikacja Microsoft Ac­cess 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 Stan­dards 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 dia­lektem 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 no­wych 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 Enable­Checks 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 otrzy­manej 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ę obiek­tó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 iden­tyfikują 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 podstawo­wego 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 przed­stawiony 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 za­wierają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 ko­lumny (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 podstawo­wy. 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 kweren­dę:

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
| -w

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),

  1. zmienić rozmiar pola tekstowego,

  2. 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,

  1. usunąć kolumnę, która wchodzi w skład indeksu,

  2. 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ę zapaso­wą tabeli. Polecenie alter table można użyć z klauzulą add column, aby dodać no­we 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 co­lumn 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 zdefi­niować 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:

  1. Zastosuj klauzulę drop constraint, aby usunąć indeks. Pamiętaj, żeby podać
    nazwę indeksu, który chcesz usunąć.

  2. 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 proce­dura 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 uru­chomione 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 kwa­dratowym [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ą do­daną 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ść po­czą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 utwo­rzyć 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 sko­rzystać 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 podstawo­wy 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 powta­rzanie 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 wyko­rzystują 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. proce­durę 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 specy­ficzną 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żyt­kownikó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 —
Dostępne 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 polece­nia:

[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:

  1. wykazu uprawnień, które chcemy przyznać,

  2. słowa kluczowego on z nazwą tabeli lub innego obiektu lub nazwy kontenera!
    danego obiektu (np. Tables, Forms, Reports, Modules, Scripts),

  3. 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, procedu­ry 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. Pole­cenie 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 Micro­soft Engine (MSDE), która umożliwia lokalne przechowywanie danych zgodne z programem Microsoft SQL Server 7.0. Inna, również nowa, funkcja o nazwie Pro­jekt 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 po­zwalają na użycie klauzuli order by do sortowania rekordów lub parametrów do fil­trowania 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 po­znasz 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 po­siadali dostęp do niektórych pól tabeli (np. informacji o zarobkach), możesz ograni­czyć rodzaj informacji widoczych dla użytkownika poprzez udostępnienie tzw. Wido­ku. 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, korzy­stając z utworzonego widoku TaniFracht, wykonaj następujące czynności:

t W oknie bazy danych kliknij obiekt Kwerendy i wybierz opcję Utwórz kwe­rendę w widoku projektu.

  1. Gdy pojawi się okno dialogowe Pokazywanie tabeli, kliknij przycisk Zamknij.

  2. Wybierz Widok => Widok SQL (lub naciśnij przycisk SQL na pasku narzędzi).

  3. 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 In­strukcje 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ąć. Pro­cedura 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ę przecho­wywaną, 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 proce­dura 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 execu­te, aby ją uruchomić. Procedura w przykładzie 4.7.E uruchamia procedurę przecho­wywaną 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

  1. Agata

  2. Marcin
    4. Iwona


  1. Igor

  2. 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 da­nych 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, dowie­działeś się, w jaki sposób używa się poleceń DDL do tworzenia tabel, widoków, pro­cedur 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ć. Dal­szą 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 przy­pomnieć 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, modyfiko­waniu, 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 formu­larz, 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

  1. 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.

  2. 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:


  1. Przy otwarciu (open)

  2. Przy załadowaniu (Load)

  3. Przy zmianie rozmiaru (Resize)

  4. Przy aktywowaniu (Activate)

  5. Przy bieżącym (current)

  6. Przy wejściu (Enter) - zdarzenie dotyczące obiektu formularza

  7. Przy uzyskaniu fokusu (GotFocus) - zdarzenie dotyczące obiektu formularza
    Natomiast zamknięcie formularza generuje następujące zdarzenia:

  8. Przy zakończeniu (Exit) - zdarzenie dotyczące obiektu formularza

  9. Przy utracie fokusu - zdarzenie dotyczące obiektu formularza

  10. Przy zwolnieniu (unload)

  11. Przy dezaktywowaniu (Deactivate)

  12. 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 zdarze­niami. 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 do­dawania 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 kontrol­nym 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 pierw­szego znaku w nowym rekordzie, przed utworzeniem nowego rekordu. Używaj tego zdarzenia przy spraw­dzaniu 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ścio­we 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 spo­rzą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 automa­tycznie 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 pro­cedurę 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 re­kordu, przed zapisaniem tego re­kordu w tabeli. Zdarzenie to zosta­nie spowodowane przejściem do innego rekordu lub próbą zacho­wania bieżącego rekordu. Zdarze­nie 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 utra­cie fokusu przez element kontrol­ny formularza i po zmianie da­nych w elemencie kontrolnym. Używaj zdarzenia Po aktuali­zacji w celu modyfikacji danych w elementach kontrolnych for­mularza oraz przy przemieszcza­niu 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 formu­larza). 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ć komuni­kat 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 Katego­rieProduktu 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 zanie­chaniu operacji usuwania jednego lub więcej rekor­dó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 pierw­szy 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 for­mularza zachodzi dopiero po władowaniu podfor-mularza i uaktywnieniu pierwszego elementu kon­trolnego 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 pro­cedurę 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 for­mularza i za pomocą myszy zmień wysokość formularza. Przeciąganie myszy spowo­duje wywołanie procedury obsługi zdarzenia Form_Resize i nowe rozmiary formula­rza zostaną zarejestrowane w oknie Instrukcje bezpośrednie.

Nazwa zdarzenia


Przy zwolnieniu (Unload)


Opis zdarzenia

Przykład 13


i

Zdarzenie Przy zwol­nieniu zachodzi przy pró­bie zamknięcia formularza, zanim formularz zostanie usunięty z ekranu. Jeżeli formularz zawiera podfor-mularz, to główny formu­larz jest rozładowany i zamknięty przed za­mknięciem podformularza. Po zdarzeniu Przy zwol­nieniu zachodzi zdarzenie Przy zamknięciu. Sko­rzystaj ze zdarzenia Przy zwolnieniu do przepro­wadzenia tych operacji, które należy wykonać przed zamknięciem formu­larza.

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 przy­cisk Podgląd listy produktów. Kiedy otworzy się raport, uaktywnij ponownie for­mularz 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 AliRepor­ts 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 (wszyst­kie moduły), AilTables (wszystkie tabele), AiiQueries (wszystkie kwerendy), ai-iviews (wszystkie widoki), AllDataAccessPages (wszystkie strony dostępu do da­nych), 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 for­mularz. Stosuj to zdarzenie, aby wyświetlić lub ukryć do­datkowe 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 da­nych 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 uwidocz­ni 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 obsza­rze formularza lub se­lektorze 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śla­nych 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 przedstawio­ną 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 my­szy (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 (Mo­useMove).

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łu­gi 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 uru­chom formularz Dostawcy w trybie Widoku i naciśnij klawisze wymienione w procedurze podanej powyżej. Procedura ta wyświetli komunikat po naciśnięciu jed­nego 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 kla­wisza zachodzi, gdy formularz nie zawiera przycisków lub gdy właści­wość 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łu­gi 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ści­wość formularza o nazwie Pod­gląd klawisza (KeyPreview) ustawiona jest na Tak. Zdarzenie to reaguje tylko na znaki ANSI gene­rowane przez klawiaturę. Zdarze­nie Przy naciśniętym klawi­szu 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łu­gi zdarzenia Form_KeyPress. Aby ta procedura mogła działać, należy ustawić właści­wość 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 przyci­skó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ład­ce 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 Fil­truj 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 ka­tegorii 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 zastoso­waniu filtru zachodzi przy wprowadzeniu filtru w celu ograniczenia rekordów po wybraniu opcji Zastosuj filtr/sortowanie, Filtruj we­dług wyboru lub Usuń filtr/sortowanie. Skorzystaj z tego zdarzenia, aby zmienić wygląd formula­rza przed zastosowaniem fil­tru lub w celu anulowania wprowadzonych zmian w momencie wywołania zda­rzenia Przy zastosowaniu filtru.

Argument ApplyType może być jedną z następujących stałych:

  1. acShowAllRecords

  2. acApplyFilter

  3. acCloseFilterWindow

  4. acApplyServerFilter

  5. 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 formu­larz 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 sze­regu 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 pro­duktó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 zmie­nić 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ę, wybie­rają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ź zagad­nienia 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 za­mknięciu zachodzi w czasie zamykania raportu. Skorzystaj z tego zdarzenia, aby zamknąć otwarte for­mularze 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 zda­rzeniu Przy otwarciu, zanim zajdzie zdarzenie dla pierwszej sekcji raportu. Skorzystaj z tego zdarzenia w celu wy­świetlenia na ekranie własnego paska na­rzę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 zacho­dzi przed zdrzaniem Przy zamknięciu. Skorzystaj ze zdarzenia Przy dezaktywo­waniu, 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 spo­rządziłeś w przykładzie 27. W oknie Kod programu wpisz pokaźną powyżej proce­durę 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 spo­rządziłeś w przykładzie 27. W oknie Kod programu wpisz pokaźną powyżej proce­durę 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 spo­rządziłeś w przykładzie 27. W oknie Kod programu wpisz pokaźną powyżej proce­durę 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, na­tomiast 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 zo­stanie 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 zdarze­nia 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 po­woduje 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. Dodat­kowo, 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 rapor­cie 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 ra­portu zdarzenie to zachodzi dla każdej nowej grupy. Zdarzenie Przy wydruku zachodzi tylko dla sekcji, któ­re są drukowane. Możesz sko­rzystać z argumentu Print-Count, aby sprawdzić, czy zdarzenie to zaszło więcej niż raz dla danego rekordu. Jeżeli część rekordu jest dru­kowana 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 Can­cel, aby anulować drukowa­nie 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 ry­sunek 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 zdarze­niem 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ów­nież 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 po­wrocie 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 ta­kich elementów, jak logo, tytuł raportu lub data wydru­ku. 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 ele­mentów takich, jak na­głó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 formu­larzu 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ą kon­trolę 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 pro­blem. 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 podsta­wie wybranej i wprowadzonej wartości. Na przykład po wprowadzeniu zmian w polu kombi cbositeid w sekcji informacje o szkole w przykładowym formularzu aplika­cji Zarządzanie sprzętem wykonany jest kod następującej procedury obsługi zdarze­nia:

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 ety­kietką „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ę wa­runkową 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 komu­nikatu, 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 zo­stał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 for­mularza 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 ety­kietką „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 etykiet­ką 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 for­mularzu 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.

  1. 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.

  2. Jeżeli pole kombi Nr Klasy jest puste, wpisz numer klasy.

  3. 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 do­tyczy formantów znajdujących się w raportach). Aby zobaczyć przykład tego zdarze­nia, kliknij przycisk Dodaj nowy typ sprzętu w formularzu głównym w aplikacji Za­rzą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łów­nym. 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 no­wego 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 gwa­rancji. Po kliknięciu przycisku Wpisz/Zmień w kolumnie Gwarancja użytkownik może wpisać lub zmienić termin gwarancji, opis gwarancji oraz nazwę firmy prowa­dzącej serwis gwarancyjny. Po władowaniu formularza Wprowadzanie danych: gwa­rancja (zob. poniżej) zostanie wykonana procedura obsługi zdarzenia Przy załadowa­niu (Load), która skopiuje informacje o sprzęcie z formularza głównego do formula­rza 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 kompute­rowym 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 kompute­rowym na formularzu głównym. Po pojawieniu się formularza Wprowadzanie da­nych: numery seryjne w górnej części tego formularza znajduje się informacja doty­czą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 ko­lejnego wiersza (zob. rysunek poniżej). Numerowanie wierszy umożliwia funkcja Humberit. Wymaga ona dwóch argumentów: nazwy podformulrza oraz identyfikato­ra. 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 kompu­terowym 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 zda­rzenia, 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ła­sne procedury obsługi zdarzeń w module formularza oraz raportu. Zobaczyłeś rów­nież, ż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 znaj­duje się szereg zdarzeń, które mogą zajść w tej samej chwili. Nie zniechęcaj się jed­nak. 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 we­wnę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 zainteresowa­niem. Czy chciałbyś dowiedzieć się na przykład, w jaki sposób można udostępnić in­formacje przechowywane w bazie danych Access innym osobom, tak aby mogli oni korzystać z nich bezpośrednio z przeglądarki internetowej? Wystarczy dodać do swo­ich 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 Docu­ments, Microsoft Active Server Pages, and Microsoft IIS 1-2.

Dla przykładu, aby użytkownik miał dostęp z przeglądarki internetowej do in­formacji o pracownikach bazy danych Northwind, zaznacz tabelę Pracownicy w oknie bazy danych Northwind i wybierz Plik => Eksportuj. W oknie dialogowym Ekspor­tuj 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:

  1. 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.

  2. 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ęt­ność 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 Mi­crosoft 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ę rozszerze­niem .asp. Pliki te zawierają standardowe znaczniki formatowania HTML oraz spe­cjalne 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 przygo­towane za pomocą programu Microsoft Visual InterDev 6.0, do pisania własnego ko­du możesz skorzystać z Notatnika programu Windows lub innego dowolnego edytora tekstu. Od czego zatem powinieneś zacząć? Możesz rozpocząć od zdobycia praktycz­nych 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 pol­ski 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ż dowie­dzieć 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 platfor­my, 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 roz­dział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. Znacz­niki 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 znaj­duje 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ą ob­sługiwane po stronie serwera (server-side scripts), podczas gdy interfejsem użytkow­nika 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 skryp­tu. 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 inter­netowej i służy do przetwarzania skryptów. Ponieważ nie wszystkie przeglądarki po­trafią 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 znaczni­kó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 zainstalo­wać 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ą prze­chowywane w katalogu macierzystym ani jego podkatalogach, były dostępne dla od­wiedzają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 kata­logu.

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 przechowy­wania 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 za­wierają 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 utwo­rzyć ź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 po­trzeba.

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 To­ols), następnie uruchom ikonę Źródła danych (ODBC). Jeżeli pracujesz na kompute­rze z Windows NT, Windows NT Stacja robocza, Windows 98 lub Windows 95, klik­nij 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

  1. P odaj NorthWind jako nazwę źródła danych DSN i kliknij Dalej (Next).

  2. 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 znaj­dować się nazwa utworzonego źródła danych NorthWind (zobacz poniżej).

Kliknij OK, aby zamknąć okno dialogowe ODBC Adminstrator źródta da­nych.

  1. Ustawienie początkowe powoduje, że DSN pliku przechowywane jest w folderze
    \Program Files\Common Files\ODBC\Data Sources.

  2. 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 spo­rzą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

  1. Zapisz modyfikacje w pliku i zamknij ten plik.

  2. Uruchom przeglądarkę internetową.

  3. 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.

  4. 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 da­nych. 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 trzy­ma ścieżkę dostępu do pliku bazy danych Microsoft Access. Rzuć okiem na następu­ją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 znajdu­jącą się w folderze PoznajASP na dysku C, korzystając ze sterownika Microsoft Ac­cess.

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 rodzime­go dostawcy dla Microsoft Access, którym jest Microsoft.Jet.OLEDB.4.0 (sposób ko­rzystania 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 poka­zano 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 łącz­ność z bazą danych Northwind, korzystając z ciągu połączenia OLE DB, określające­go 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:

  1. Tworzy instancję obiektu Connection w bibliotece ADO.

  2. 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).

  3. 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 instruk­cji:

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 te­mu 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>

  1. W pisz następujący adres: http: //localhost/northDB/Klienci.asp.

  2. 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, do­brze jest podzielić generowany zestaw rekordów na kilka stron. W ten sposób użyt­kownik 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 od­powiedni 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.

  1. Uruchom program Notatnik Windows i wpisz podany poniżej kod ASP.

  2. 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 wszyst­kie 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, na­leż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.

  1. 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.

  2. 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 za­wartość 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ślo­nej 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świe­tlonych 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 utwo­rzona 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 in­formacja 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)

  1. Otwórz przeglądarkę intemetową (Internet Explorer albo Netscape Navigator).

  2. Wpisz następujący adres: http://localhost/NorthDB/Kartki.asp.

  3. 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 mo­gł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.

  1. Uruchom program Notatnik Windows i wpisz podany poniżej kod ASP.

  2. 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 znacz­nikiem końcowym (</table>, </tr> oraz </td>). Tabele znacznie upraszczają for­matowanie 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)

  1. Otwórz przeglądarkę internetową (Internet Explorer albo Netscape Navigator).

  2. Wpisz następujący adres http: //localhost/NorthDB/Kartki.asp.

  3. 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).

  1. Uruchom inną stronę, klikając na odnośnik strony.

  2. 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

  1. Otwórz plik C:\PoznajASP\Klienci.asp.

  2. 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")

  1. Zachowaj wprowadzone w tym pliku zmiany.

  2. 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. Wi­dział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 Pobierz­Szybko.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 &. "&nbsp;"


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 wier­sza. Ta stała jest częścią języka VBScript, zatem nie musisz jej deklarować przed uży­ciem. Znacznik <tr> dodaje nowy rząd do tabeli. Pętla For Each...Next pobiera na­zwy 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 ko­du 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ąć Record­set 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 „&nbsp;"

(a non-breaking space - czyli spacja) w komórce tabeli, jeżeli pole zawiera war­tość Null:


currField = currField & "&nbsp;"

Powyższe polecenie dołącza znak „&nbsp;" 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 & "&nbsp;</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 wska­zuje, ż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)

  1. Otwórz przeglądarkę internetową (Internet Explorer albo Netscape Navigator).

  2. Wpisz następujący adres http: //localhost/NorthDB/PobierzSzybko.asp.

  3. Naciśnij Enter lub kliknij Go.

W przeglądarce internetowej pojawi się wykaz spedytorów pokazany w tabeli (zob. poniżej).

  1. 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ą.

  2. Zamknij tabelę Spedytorzy oraz Microsoft Access.

  3. 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. Na­stę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 Pobierz­Produkt.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 ser­werze, 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 pole­ceniu powyżej właściwość CommandTimeout obiektu Connection określa, jak długo na­leży czekać podczas wykonywania danej komendy, zanim próba połączenia zostanie anu­lowana 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 wyma­gane. 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 na­główków kolumn tabeli procedura wypełnia komórki tabeli odpowiednimi danymi. Tabela będzie zawierać tylko jeden rząd danych, ponieważ Recordset był ograniczo­ny 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 na­zwa 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 wygene­rowania formularza HTML. Formularze umożliwiają użytkownikowi wprowadzanie danych w przeglądarce i stanowią miejsce, w którym można umieścić kontrolki Ac­tiveX. 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)

  1. Otwórz przeglądarkę internetową (Internet Explorer albo Netscape Navigator).

  2. Wpisz następujący adres http: //localhost/NorthDB/PobierzProdukt.asp.

  3. 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 po­wyż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 obej­rzeć 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 ze­chcieć wyszukać więcej niż jeden produkt. Aby sprostać temu żądaniu, należy przy­gotować 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.

  1. U ruchom program Notatnik Windows i wpisz podany poniżej kod ASP.

  2. 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ą da­nych 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 polece­nia:

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 read­only (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 sformato­wany 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)

  1. nazwaTabeli jest nazwą tabeli, z której mają być pobrane rekordy,

  2. nazwaKolumny jest nazwą kolumny zawierającej wartości, które będą porównane
    z listą wartości,

  3. 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 ko­lumn 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 przechowywa­nia informacji dotyczącej jednego rekordu (rzędu), a polecenie Respon­se. 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)

  1. Otwórz przeglądarkę internetową (Internet Explorer albo Netscape Navigator).

  2. Wpisz następujący adres http://localhost/NorthDB/PobierzWiele.asp.

  3. 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ż infor­macje 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 po­la. Celem tego formularza jest umożliwienie użytkownikom dodanie nowych spedyto­ró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

  1. U ruchom program Notatnik Windows i wpisz podany poniżej kod ASP.

  2. 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 wy­sł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 po­zostawione 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 po­kazano 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, wy­stąpi błąd, gdy wartość z apostrofem zostanie użyta w poleceniu SQL. Aby temu za­pobiec, procedura korzysta z funkcji replace, która zastępuje apostrof dwoma zna­kami 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ść zmien­nych 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 rekor­du, 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 przeka­zanie wpisanych w polach tekstu danych do serwera WWW. Zwróć uwagę, że argu­ment action odnosi się do pliku ASP o nazwie wpiszDane. Kiedy użytkownik prze­każ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 prze­kazana 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" >&nbsp; 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)

  1. Otwórz przeglądarkę intemetową (Internet Explorer albo Netscape Navigator).

  2. Wpisz adres http://localhost/NorthDB/WpiszDane.asp.

  3. 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 Do­daj 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ę na­stę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 da­nych 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 zmodyfi­kować 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.



  1. Uruchom program Notatnik Windows i wpisz podany poniżej kod ASP.

  2. 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 na­wiązania łączności z bazą danych Northwind oraz utworzenia instancji obiektu Re­cordset. Pierwsze polecenie if...Then zostanie wykonane po wybraniu produktu z pola listy (po naciśnięciu przez użytkownika umieszczonego na formularzu przyci­sku). 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 znajdu­ją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 da­nych (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ła­nia 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 prze­chowywanie 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. Korzy­stają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, ozna­cza 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ł po­nownie 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 wykona­nie polecenia update na serwerze. W rezultacie tej operacji użytkownik zobaczy na­zwę zmodyfikowanego produktu oraz polecenie update, które dokonało danej mody­fikacji.

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") %>

&nbsp;(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)

  1. Otwórz przeglądarkę internetową (Internet Explorer albo Netscape Navigator).

  2. Wpisz adres http://localhost/NorthDB/ModyfikujProdukt.asp.

  3. Naciśnij Enter lub kliknij Go.

W przeglądarce pojawi się ekran z polem listy. W polu tym musisz wybrać na­zwę 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 jed­nostkowa 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 jednostko­wa oraz Stan magazynu nie są puste, na serwerze WWW zostanie wykonane polece­nie update, i zmiany zostaną naniesione w tabeli Produkty, Jako potwierdzenie ope­racji 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 dele­te. 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:

  1. 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.

  2. 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.

  3. 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 pli­kowi, 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

  1. Uruchom program Notatnik Windows i wpisz podany poniżej kod ASP.

  2. Zachowaj plik pod nazwą WymRekord.asp w katalogu C:\PoznajASP.

Fragment kodu VBScript pokazany poniżej nawiązuje łączność ze źródłem da­nych i przechowuje wartość iaspedytora w zmiennej o nazwie spedytor. Jeżeli wartość tej zmiennej nie jest pusta, to utworzona jest nowa instancja obiektu Record­set i zostaje otwarta tabela spedytorzy. Obiekt Recordset zostaje otwarty przy uży­ciu 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 poszukiwa­niach 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 po­wiadomić 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 con­nection.

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 sfor­matowany wielkimi literami przy użyciu znaczników HTML z drugiego poziomu na­głó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 utwo­rzyć 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)

  1. Otwórz przeglądarkę internetową (Internet Explorer albo Netscape Navigator).

  2. Wpisz adres http: //localhost/NorthDB/WymRekord.asp.

  3. Naciśnij Enter lub kliknij Go.

Po kliknięciu przycisku Wykonaj, gdy pole tekstu idspedytora jest puste, po­jawia 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 przedsta­wiona 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.

  1. U ruchom program Notatnik Windows i przygotuj pliki HTML podane poniżej.

  2. 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ć za­ró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 uru­chomienie 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 przy­kł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 Ac­cess 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 da­nych 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

  1. (typ danych Double), 58; 62

  2. 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 &nbsp, 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

  1. (mniejsze, operator), 111

  2. > (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.

  1. 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.

  2. Odbiorca opłaca zryczałtowane koszty wysyłki.

  3. Na życzenie wysyłamy wszystkim zainteresowanym aktualny katalog.

Aktualne ceny detaliczne naszych książek są podane na dołączonym do kata­logu 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


Wyszukiwarka

Podobne podstrony:
Nowy Prezentacja programu Microsoft PowerPoint 5
Charakterystyka programu
1 treści programoweid 8801 ppt
Programowanie rehabilitacji 2
Rola rynku i instytucji finansowych INowy Prezentacja programu Microsoft PowerPoint
Nowy Prezentacja programu Microsoft PowerPoint ppt
Szkoła i jej program
wykluczenie społ program przeciwdział
ProgrammingJavaLecture9
Nowa podstawa programowa WF (1)
Programowanie robotów przemysłowych FANUC
A3 Silnik indukcyjny pierscieniowy program
instrukcja programu wsjt222
Program 7