1. Wprowadzenie do programowania
1.1. Czym jest Visual Basie for Application?
Visual Basic for Application (VBA) jest językiem programowania zaprojektowanym dla niektórych aplikacji pakietu Microsoft Office, w tym dla Microsoft Access 97. Używa się go podobnie jak makrodefinicji - do łączenia różnych obiektów aplikacji w jeden spójny system. Różnica pomiędzy nimi polega na tym, że VBA jest silniejszy i precyzyjniejszy w działaniu.
Visual Basic for Application jest nowoczesnym językiem programowania podobnym do większości popularnych języków programowania strukturalnego. Jeżeli programowałeś w Pascalu lub C przekonasz się, że wszystkie używane tu struktury programowe są Ci już znane. Należą do nich pętle, instrukcje wyboru (if...then...else, select case), funkcje, procedury typu Sub. Zauważysz, że konstrukcje te zawierają tylko powierzchowne różnice. VBA zachowuje składnię zbliżoną do języka angielskiego i przyjazność języka Basic.
1.2. Model programowania sterowanego zdarzeniami
Model programowania sterowanego zdarzeniami
Zdarzenie jest działaniem (np. "kliknięcie" myszką lub naciśnięcie klawisza), które może być rozpoznane przez obiekt. Obiekt może mieć zdefiniowaną reakcję na to zdarzenie. Zdarzenie może być wywołane działaniem użytkownika, instrukcją języka VBA lub może być wyzwolone przez system. Używając właściwości związanych ze zdarzeniami, możemy zaprogramować Microsoft Access tak, aby wykonał makro, wywołał funkcję VBA lub wykonał procedurę obsługi danego zdarzenia jako reakcję na to zdarzenie.
Grupy zdarzeń wg ich zadania
Zdarzenia można podzielić na grupy w zależności od typu zadania, które realizują. Oto sześć podstawowych grup:
Zdarzenia dot. danych (Data Event.s),
Zdarzenia dot. błędów i czasu (Error and Tirning Events),
Zdarzenia dot. fokusu (Fokus Events),
Zdarzeniu dot. klawiatury i myszy (Keyboard and Mouse Events),
Zdarzenia dot. drukowania (Prim Eveuts) oraz
Zdarzenia dot. okien (Window Events).
Przykładowymi zdarzeniami dot. myszki mogą być On Open, On Close i Oh Click. Wymienione zdarzenia dot. myszki spowodują reakcję w momencie otworzenia, zamknięcia czy "kliknięcia" myszką.
Jak działa aplikacja sterowana zdarzeniami
Zdarzenie jest akcją rozpoznawalną przez formularz, raport czy formant (element sterujący). W Visual Basic obiekty automatycznie rozpoznają predefiniowany zbiór zdarzeń i odpowiednio reagują na poszczególne zdarzenia. Jeżeli chcemy, aby formant (element sterujący) zareagował na zdarzenie w szczególny sposób to możemy napisać procedurę obsługi tego zdarzenia w języku VBA.
Oto co się dzieje w typowej aplikacji sterowanej zdarzeniami:
Użytkownik uruchamia aplikację, a makro o nazwie AutoExec automatycznie otwiera wejściowy formularz.
Wejściowy formularz lub formant (element sterujący) na formularzu rejestruje zdarzenie. Źródłem zdarzenia może być użytkownik (np. naciśnięcie klawisza) lub kod programu (np. zdarzenie Open pojawia się w momencie, gdy program otwiera formularz).
Jeżeli istnieje procedura obsługująca to zdarzenie to zostaje ona wykonana.
Aplikacja oczekuje na następne zdarzenie.
1.2.1. Programowanie tradycyjne kontra sterowane zdarzeniami
W tradycyjnych programach "proceduralnych" sama aplikacja, a nie zdarzenie kontroluje fragmenty wykonywanego kodu. Wykonanie rozpoczyna się w pierwszej linii kodu programu i wędruje po zdefiniowanej ścieżce przez aplikację wywołując potrzebne procedury.
Program sterowany zdarzeniami
W aplikacji sterowanej zdarzeniami działanie użytkownika lub zdarzenie systemowe wywołuje procedurę obsługującą zdarzenie. Stąd kolejność wykonania programu zależy od tego jakie pojawią się zdarzenia. To z kolei zależy od działania użytkownika. Jest to esencja graficznego interfejsu użytkownika i programowania opartego o zdarzenia: użytkownik steruje a kod programu reaguje zgodnie z jego wolą.
Przewidywanie możliwych akcji użytkownika
Ponieważ nie jesteśmy w stanie przewidzieć działania użytkownika, w kodzie programu musimy zakładać pewien stan środowiska w trakcie wykonania. Uwzględniając te założenia, możemy testować środowisko przed uruchomieniem kodu lub próbować nadać aplikacji taką strukturę, aby założenia były zawsze poprawne. Na przykład, jeżeli aplikacja zakłada, że pole tekstowe zawiera tekst zanim użytkownik naciśnie przycisk polecenia, można stworzyć kod włączający przycisk polecenia tylko przy pojawieniu się zdarzenia PrzyZmianie dla pola tekstowego.
1.3. Visual Basie for Application kontra makro
Z pomocą Microsoft Access, posługując się makrami lub interfejsem użytkownika, z powodzeniem można zrealizować wiele zadań, które w innych systemach baz danych wymagałyby napisania dodatkowych programów. Kiedy zatem używać VBA? Zależy to od tego co zamierzamy zrobić.
1.3.1. Visual Basie for Application
Oto kilka przykładów, gdzie lepiej użyć VBA niż makro:
Ułatwienie obsługi bazy danych
Ponieważ makra są obiektami zewnętrznymi w stosunku do formularzy i raportów, które z nich korzystają, baza danych zawierająca dużą liczbę makr reagujących na zdarzenia występujące w formularzach i raportach staje się kłopotliwa w obsłudze. W przeciwieństwie do makr, procedury zdarzeń języka Visual Basic są wbudowane w definicję formularza lub raportu. Przy przenoszeniu formularza lub raportu z jednej
bazy do innej, wbudowane procedury zdarzeń przenoszone są wraz z formularzem lub raportem.
Przechwytywanie błędów wykonania
VBA umożliwia testowanie sytuacji błędnych i wykonywanie specyficznych operacji w przypadku pojawienia się błędu. Ponadto umożliwia wyświetlenie własnego komunikatu o błędzie. Makro nie umożliwia przechwytywania błędów wykonania.
Tworzenie i manipulowanie obiektami
W większości przypadków, najłatwiej jest utworzyć i modyfikować obiekt w widoku Projekt tego obiektu. Lecz w niektórych sytuacjach, może zachodzić potrzeba manipulowania w kodzie definiującym obiekt (kod należy rozumieć jako instrukcje języka programowania.) Używając VBA, można manipulować wszystkimi obiektami w bazie danych, łącznie z samą bazą danych.
Realizowanie działań na poziomie systemu
Polecenie UruchomAplikację użyte w makro, służy do uruchomienia innej aplikacji środowiska Windows lub M.S-DOS z wnętrza danej aplikacji. Jednakże makro nie potrafi zbyt wiele zdziałać poza Microsoft Access. Używając VBA można sprawdzić czy w systemie istnieje dany plik zainicjować dynamiczną wymianę danych (Dynamic Data Exchange DDE) z inną aplikacją opartą na systemie Windows, np. Microsoft Excel i wywoływać funkcje z bibliotek dołączanych dynamicznie (Dynamic Link Libraries DLLs) systemu operacyjnego Windows.
Manipulowanie pojedynczymi rekordami
VBA może wykonywać operacje na kolejnych rekordach pewnego zbioru rekordów. Makro przeciwnie, w jednym momencie pracuje na całym zbiorze rekordów.
Przekazywanie argumentów do programu
Argument jest wartością niosącą dodatkową informację wymaganą przez niektóre działania. Argumenty dla działań makra są ustalane w trakcie tworzenia makra u dołu okienka projektu makra; nic można ich zmienić w trakcie wykonania makra. VBA umożliwia przesyłanie argumentów do programu w trakcie jego wykonania. Ponadto można zamiast argumentów użyć zmiennych - czego nie można uczynić w makrze. Świadczy to o dużej elastyczności sposobu wykonania kodu programu.
1.3.2. Makro
Makra są najłatwiejszym sposobem w realizowaniu podstawowych zadań, takich jak
Otwieranie i zamykanie formularza
Wywoływanie i zamykanie programów
Ukrywanie i wyświetlanie pasków narzędzi
Uruchamianie raportów
Istnieje kilka zadań przy projektowaniu aplikacji, które można z powodzeniem zrealizować tylko przy użyciu makro:
Tworzenie własnych pasków menu.
Kontrola nad rozpoczęciem aplikacji w makro AutoExec. Można użyć procedury VBA do odtworzenia środowiska aplikacji, ale trzeba ją uruchomić w makro AutoExec.
Tworzenie globalnych przypisań klawiszom
Uruchamianie własnego makro lub procedury przyciskiem na pasku narzędziowym. Do przycisku na pasku narzędziowym wolno dołączyć tylko makro, a nie procedury Visual Basic. Aby wykonać procedurę VBA należy użyć akcji UruchomKod w makrze dołączonym do paska narzędziowego.
1.3.3. Konwersja makr na kod języka Visual Basic
Program Microsoft Access może automatycznie przekształcać makra na procedury zdarzeń lub moduły języka Visual Basic, które wykonują równoważne akcje używając kodu języka Visual Basic. Przekształcane mogą być makra używane w formularzu lub raporcie bądź makra globalne, które nie są dołączone do konkretnego formularza lub raportu.
1.3.4. Ustawianie właściwości w trakcie wykonania
Przykłady składni
Forms![nazwaform]![nazwasterująca].Visible = 0 Forms![nazwaform]![nazwasterująca] - "Test" Reports![nazwaraport]![nazwasterująca].Visible = 0 Reports![nazwaraport]![nazwasterująca] - "Test"
W niektórych przypadkach użyteczną jest możliwość odwołania się do wartości formantu (elementu sterującego) w VBA. Składnia poniżej jest obowiązkowa przy odwoływaniu się do formantu w wyraźeniach:
Składnia
Forms![nazwaform]![nazwasterująca] Reports![nazwaraport]![nazwasterująca]
Nazwy obiektów należy ujmować w nawiasy. Na przykład:
Forms![Dostawcy]![Id Dostawcy] Reports![Koszty Frachtu]![Fracht]
Forms ! [Dostawcy] ! [ Id Dostawcy] odwołuje się do formantu Id Dostawcy przy otwieraniu formularza Dostawcy. Reports! [Koszt Frachtu] ! [Fracht] odwołuje się do formantu Fracht przy otwieraniu raportu Koszty Frachtu (zarówno formularz jak i raport muszą być otwarte przez Microsoft Access, aby uzyskać dostęp do ich formantów).
UWAGA Konstruktor wyrażeń umożliwia tworzenie wyrażeń odwołujących się do nazw formantów (elementów sterujących).
1.4. Moduły
W Microsoft Access moduły służą do przechowywania kodu programów napisanych w języku Visual Basic for Application. Moduły umożliwiają nam zorganizowanie procedur.
1.4.1. Co to jest Moduł?
Moduły są miejscami składowania kodu programów napisanych w VBA. Dokładniej, moduł składa się z deklaracji, instrukcji i procedur ułożonych razem pod wspólną nazwą.
Deklaracje są to niewykonywalne instrukcje, których używa się do deklarowania nazw i typów danych stałych, własnych typów danych, zmiennych i procedur. Na przykład:
Dim LiczbaZatrudnionych As Integer
Procedury obsługi zdarzeń
Procedura obsługi zdarzenia jest procedurą wykonywaną automatycznie jako reakcja na zdarzenie zainicjowane przez użytkownika, kod programu lub wyzwolone przez system.
Procedury ogólnego zastosowania są fragmentem kodu w module, posiadającym część deklaracyjną i instrukcje. Do procedur zaliczamy funkcje i procedury typu Sub.
1.4.2. Edycja kodu
Edycja kodu w module jest bardzo podobna do edycji tekstu w każdym innym edytorze tekstu. Pulsująca pionowa linia lub punkt wstawiania zaznacza miejsce na ekranie gdzie nastąpi wpisanie lub wklejenie tekstu. Jeżeli przesuniesz punkt wstawiania poza dany wiersz to VBA sprawdzi składnię tego wiersza i w przypadku błędów, wyświetli komunikat.
Okienko Moduł zawiera polecenia, takie jak Znajdź i Zmień pomocne w trakcie edycji modułu. Udostępnia również wiele użytecznych skrótów klawiszowych.
KLAWISZ |
DZIAŁANIE |
[CTRL]+[Y] |
Wycina bieżącą linię i umieszcza ją w schowku |
[CTRL] + [Strzałka w Górę] |
Wyświetla poprzednią procedurę |
[CTRL] + [Strzałka w Dół] |
Wyświetla następną procedurę |
KLAW1SZ |
DZIAŁANIE |
[Fl] |
Wyświetla tekst pomocy dla słowa, gdy punkt wstawiania jest ustawiony na słowie kluczowym VBA (takim jak predefiniowana instrukcja, funkcja, operator czy metoda) lub właściwości. |
[F2] |
Wyświetla przeglądarkę obiektów. Przeglądarka obiektów jest narzędziem umożliwiającym przeglądanie elementów biblioteki typów aplikacji. Z okna Przeglądarki obiektów można także wklejać kod do modułu wybierając metodę lub właściwość i klikając przycisk "Wklej" |
[SHIFT+[F2] |
Wykonuje skok do kodu wybranej procedury (pod warunkiem, że punkt wstawiania jest umieszczony na nazwie tej procedury). |
[CTRL]+[SHIFT]+[F2] |
Wraca do poprzednio oglądanej procedury |
Ponadto, można wybrać kilka linii i wciąć je w głąb tekstu naciskając klawisz [TAB] lub usunąć wcięcie naciskając [SHIFT]+[TAB]
Aby kod VBA był czytelniejszy istnieje możliwość zastosowania różnych kolorów dla różnych składników kodu. Ustawienia te są dostępne na zakładce Moduł w oknie Opcje.
VBA umożliwia stosowanie znaku podkreślenia (_) w celu zachowania ciągłości linii przy przejściu do nowego wiesza. Kod, który nie musi być przewijany jest czytelniejszy.
WSKAZÓWKA. Używanie małych liter podczas pisania programu jest najlepszym sposobem na kontrolę poprawności wprowadzanego kodu. Jeżeli syntaktyka i semantyka są prawidłowe, fragmenty kodu są zamieniane na duże litery i nadawany fest im właściwy kolor.
1.4.3. Zakładka Moduł
Zakładka Moduł znajdująca się w oknie dialogowym Opcje (menu Narzędzia) jest miejscem gdzie można ustawiać parametry środowiska i edycji kodu. Daje ona możliwość zastosowania lub nie takich narzędzi jak:
Automatyczne sprawdzanie składni;
Żądanie deklaracji zmiennych;
Widok całego dokumentu;
Zmianę domyślnych kolorów kodu.
1.4.4. Typy Modułów
Baza danych może zawierać dwa typy modułów:
Moduły standardowe;
Moduły klas.
Moduły standardowe tworzymy jako wyodrębnione obiekty bazy danych. Używamy ich do przechowywania kodu, który może być wykonany z dowolnego miejsca aplikacji. Procedury w modułach standardowych można wywoływać ze środka wyrażenia, makra, procedury obsługującej zdarzenie lub z procedury w innym module standardowym.
W programie Microsoft Access 97 moduły formularzy i raportów są teraz modułami klas, co oznacza, że mogą one funkcjonować jako szablony obiektów definiowanych przez użytkownika. Wszelkie procedury publiczne w module klasy formularza lub raportu stają się metodami i właściwościami formularza lub raportu przy tworzeniu nowej kopii formularza lub raportu.
1.4.5. Kod ukryty w formularzu
Każdy formularz czy raport bazy danych posiada wbudowany moduł. Moduł ten zawiera procedury obsługi zdarzeń, które mogą reagować na przewidziane w formularzu kolorów czy raporcie zdarzenia. Moduły te są tworzone automatycznie w trakcie tworzenia formularza czy raportu i są częścią projektu tego formularza czy raportu. Każdy moduł może zawierać również procedury tylko na swój użytek.
Moduł formularza czy raportu jest częścią jego projektu. Jeżeli kopiujemy formularz czy raport do innej bazy danych to jego moduł wędruje razem z nim; również gdy kasujemy formularz czy raport ich moduły są także kasowane. W module wolno umieszczać procedury obsługi zdarzeń oraz inne procedury. Procedury umieszczone w module czym formularza czy raportu są domyślnie prywatne dla (na użytek własny) formularza czy raportu - nie można ich wywoływać z innych obiektów aplikacji.
1.4.6. Składnia języka Visual Basie for Application
Niektóre z symboli umożliwiają odwoływanie się do różnych obiektów Microsoft Access. Należą do nich !, ., i [ ].
Wykrzyknik ! Należy używać wykrzyknika przed nazwami samodzielnie tworzonych obiektów. Na przykład:
Forms ! MojaNazwa;
Kropka. Należy używać kropki przed właściwościami lub metodami opatrzonymi nazwą przez Microsoft Access. Na przykład:
Forms ! MojaNazwa . enabled
Nawiasy kwadratowe Nawiasy kwadratowe [ ] służą do rozgraniczenia obiektów lub posługiwania się nazwami zawierającymi spacje. Aby uniknąć używania nawiasów nie należy używać spacji w nazwie obiektu
ODWOŁANIE DO |
UŻYCIE |
PRZYKŁAD |
Formularza |
Forms ! NazwaForm |
Forms !Pracownicy |
Właściwości formularza |
Forms!NazwaForm.właściwość |
Forms!Pracownicy.Visible |
Formantu |
Forms!NazwaForm!Formant |
Forms!Pracownicy!Adres |
Właściwości formantu w formularzu |
Forms!NazwaForm!Formant.właściwość |
Forms!Pracownicy!Adres.Visible |
Formantu w podformularzu |
Forms!NazwaForm!NazwaPodform.form!Formant |
Forms!Pracownicy!Wynagrodzenie.Form![Poczatkowe Wvnagrodzenie] |
Metoda w obiekcie |
NazwaObiektu.metoda |
[Tablica Wynikowa].MoveNext |
1.5. Procedury typu Sub i Function
Fragment programu napisanego w języku Visual Basic for Application stanowiący wyodrębnioną całość nazywamy procedurą. Procedura zawiera serie instrukcji języka VBA realizujące określone działania i wyliczające potrzebne wartości. Istnieją dwa rodzaje procedur: typu Sub i typu Function. W tym podrozdziale przyjrzymy się obu typom procedur. Pomimo wielu wbudowanych funkcji, czasem zachodzi potrzeba utworzenia własnej procedury.
W momencie, gdy odkryjemy, że wielokrotnie używamy podobnych działań i wyrażeń w formularzach, raportach czy zapytaniach to możemy napisać własną procedurę do wykonania tych działań lub obliczeń. Na przykład, wyobraźmy sobie, że musimy często obliczać datę pierwszego dnia następnego miesiąca (być może jest to termin wypłaty lub nadawania przesyłek). Taką datę oblicza następujące wyrażenie:
=DateSerial (Year (Now) , Month (Now) +1, 1)
Używając procedur możemy:
Zagwarantować, że działanie jest wykonywane w identyczny sposób za każdym razem gdy jest potrzebne, bez ryzyka popełnienia pomyłki;
Modyfikować formułę wyliczenia poprzez zmianę tylko w jednym miejscu (miejscu definicji tej funkcji), a nie w każdym miejscu użycia danego wyrażenia;
Realizować złożone operacje, takie jak warunki if...then czy pętle, które są niemożliwe do wykonania w prostych wyrażeniach;
Samodzielnie obsługiwać błędy;
Wstawiać komentarze dokumentujące skomplikowane wyrażenia.
1.5.1. Charakterystyka procedur typu Sub
Procedury typu Sub realizują operacje, lecz nie zwracają żadnych wartości i nie mogą być używanie w wyrażeniach. Procedura obsługująca zdarzenia jest procedurą typu Sub dołączaną do formularza lub raportu. Gdy Microsoft Access rozpozna pojawienie się zdarzenia w formularzu, raporcie czy w formancie, wtedy automatycznie wywołuje przypisaną do obiektu i zdarzenia procedurę obsługi zdarzenia. Na przykład można napisać procedurę obsługującą zdarzenie, które ustawia fokus na określony formant wtedy, gdy użytkownik opuszcza inny formant.
Wszystkie procedury typu Sub zaczynają się od instrukcji Sub i kończą się instrukcją End Sub. Po nazwie procedury występują zawsze nawiasy nawet jeśli nie ma argumentów.
Sub PobierzDane()
End Sub
Można przesłać informację do procedury w nawiasach występujących po nazwie procedury.
Sub PobierzDane(NazwaPliku As String)
'Nawiasy wymagane w Sub.
End Sub
Należy ustawić wartość argumentu kiedy wywołuje się procedurę:
NazwaPliku = "PLIK. DAT"
PobierzDane NazwaPliku 'Nawiasy nie wymagane w Sub.
Procedury, które używają argumentów muszą być wywoływane z innych procedur Sub lub Function: nie mogą być przywoływane z wnętrza Microsoft Access.
Procedury Sub nie zwracają wartości do instrukcji wywołującej ją. Procedura Sub może zwrócić informacje do kodu wywołującego ją poprzez wartości zmiennej widocznej zarówno przez procedurę jak i kod wywołujący. Wymaga to przesłania do procedury argumentu przez wartość, co jest domyślnym sposobem przekazywania. Problem widoczności zmiennych jest omawiany w dalszej części podręcznika.
Aby wywołać procedurę Sub z okna analizy programu należy użyć pełnego odwołania do obiektu zawierającego tę procedurę. Przykładowo aby wywołać procedurę typu Sub o nazwie Test() z Modul1 trzeba odwołać się następująco:
Test
Modul1.Test
Test x 'x jest zmienną
Modul1.Test x
UWAGA. W Microsoft Access 97 można mieć dwie procedury Sub o tej samej nazwie, jeżeli są one umieszczone w dwóch różnych modułach. Wywołując procedurę należy odwołać się do nazwy odpowiedniego modułu.
1.5.2. Charakterystyka procedur typu Function
Procedura Function ma podobne własności jak procedura Sub, różni się tym, że oprócz przeprowadzania działania zwraca wartość.
Każda procedura typu Function zaczyna się instrukcją Function, po której następuje nazwa funkcji i typ danej zwracany przez funkcję oraz kończy się instrukcją End Function. Po nazwie funkcji muszą występować nawiasy, nawet jeśli nie ma argumentów.
Function PlikOtwarty(NazwaPliku As String) As Boolean
'zwrot wartości jest opcjonalny
PlikOtwarty = Decision 'Opcjonalne określenie wartości
'zwracanej
End Function
Można przesłać informację do procedury typu Function w postaci argumentów umieszczonych w nawiasach, które występują po nazwie procedury.
'Nawiasy są konieczne w deklaracji procedury Function
Function PlikOtwarty(NazwaPliku$) As Boolean
......
End Function
Przed wywołaniem procedury Function należy określić wartość argumentów.
Procedura Function zawsze zwraca wartość. Aby funkcja zwracała kilka wartości może to wykonać poprzez zmianę przesyłanych jej argumentów lub zmianę zmiennych widocznych zarówno przez funkcję jak i kod wywołujący ją.
Dim StanOtwartegoPliku As Boolean
...
NazwaPliku$ = "PLIK. DAT"
StanOtwartegoPliku = PlikOtwarty
Aby wywołać procedurę Function z okna analizy programu należy użyć pełnego odwołania do obiektu zawierającego tę procedurę. Przykładowo aby wywołać procedurę typu Function o nazwie Test() z Modul1 trzeba odwołać się następująco:
?Test
?Modul1.Test
?Test(x) 'x jest zmienną
?Modul1.Test(x)
?Modul1.Test()
UWAGA. W Microsoft Access 97 można mieć dwie procedury Function o tej samej nazwie, jeżeli są one umieszczone w dwóch różnych modułach. Wywołując procedurę należy odwołać się do nazwy odpowiedniego modułu.
UWAGA. Każdy wykonywamy kod musi znajdować się w funkcji lub procedurze Sub. Nie można definiować funkcji czy procedury Sub wewnątrz innej funkcji czy procedury Sub.
1.5.3. Wyrażenia i instrukcje
Różnica pomiędzy wyrażeniem a instrukcją polega na tym, że wyrażenie produkuje zi wartość, podczas gdy instrukcja nie.
Przykład
X + Y = 5 `Wyrażenie to produkuje wartość
`prawdy lub fałsz.
Object.Metoda `Ta instrukcja nie wylicza żadnej wartości.
1.5.4. Deklarowanie zmiennych
W tym podrozdziale skoncentrujemy się na podstawach deklarowania i używania zmiennych, stałych i typów danych w programach napisanych w języku Visual Basic for Application .
Często chcemy zachować pośrednie wartości potrzebne do większych obliczeń. Na przykład, chcemy wyliczyć kilka wartości, porównać je i podjąć różne działaniach w zależności od wyniku porównania. Ponieważ te wartości są potrzebne tylko w czasie wykonania programu, do przechowania ich nie użyjemy tablicy. Zmienna jest sposobem na przechowanie wartości tylko na czas wykonania programu.
Visual Basie .for Application używa zmiennych do przechowywania wartości. Zmienne są podobne do pól, z tym wyjątkiem, że istnieją w ramach Visual Basie for Application, a nie w tablicy. Podobnie jak pole, zmienna posiada nazwę (słowo, za pomocą którego odwołujemy się do wartości jaką zmienna zawiera) oraz swój typ danych (określający jakiego rodzaju dane może zawierać zmienna).
1.5.5. Instrukcje deklaracji
Visual Basic for Application nie wymaga jawnego deklarowania zmiennych. W programie każda nazwa, która nie jest nazwą istniejącej zmiennej, spowoduje utworzenie nowej zmiennej o takiej nazwie. Do dobrej praktyki programowania należy jednak jawne deklarowanie zmiennych i jawne nadawanie im typu danych. Jawne deklarowanie zmiennych ułatwia proces usuwania błędów programu.
Instrukcja Option Explicit wymusza jawne deklarowanie zmiennych w module. Instrukcja ta musi pojawić się przed instrukcjami deklaracji zmiennych lub stałych (Dim, Private, Public, ReDim lub Static).
Przy próbie użycia niezadeklarowanej zmiennej, podczas kompilacji kodu pojawi się błąd.
Wymuszenie jawnego deklarowania zmiennych chroni przed użyciem niepoprawnej nazwy zmiennej oraz przed konfliktem zasięgu różnych zmiennych.
Włączenie opcji "Żądanie deklaracji zmiennych" w zakładce Moduł okienka Opcje (menu Narzędzia) wymusza automatyczne dodawanie instrukcji Option Explicit na początku każdego nowego modułu.
Zmienną deklarujemy instrukcją Dim
Dim nazwazmiennej [As typ]
Na przykład, aby zadeklarować zmienną Wynik typu Integer napiszemy
Dim Wynik As Integer
Zmienne zadeklarowane w procedurze instrukcją Dim istnieją tak długo, jak długo wykonywana jest ta procedura. Z zakończeniem procedury znika wartość zmiennej. Ponadto wartość zmiennej w procedurze jest lokalna dla tej procedury. Nie możemy uzyskać dostępu do zmiennej w danej procedurze z wnętrza innej procedury. Własność ta pozwala nam używać zmienne o tych samych nazwach w różnych procedurach bez obawy konfliktu czy przypadkowej zmiany wartości zmiennej.
Instrukcja ReDim deklaruje tabelę dynamiczną oraz rezerwuje lub zwalnia miejsce dla zmiennych dowolnego typu. Preserve ReDim również rezerwuje lub zwalnia miejsce i dodatkowo zabezpiecza dane w tabeli.
Zbiór elementów tego samego typu kolejno ponumerowanych. Każdy element posiada unikalny indeks identyfikujący go. Zmiana jednego elementu tabeli nie wpływa na pozostałe elementy.
Można stworzyć zmienną zachowującą swoją wartość po zakończeniu procedury, poprzez deklarowanie jej instrukcją Static. Zmienna, która nie jest zadeklarowana jako Static traci swoją wartość pomiędzy jej przywoływaniami. W przykładzie pokazano użycie instrukcji Static do zadeklarowania zmiennej statycznej w procedurze.
Sub DemoStatyczna ()
Static A As Integer
A = A +1: B = B + 1
MsgBox "A = " & A & " B = " & B
End Sub
Instrukcje Public i Private używane są do określenia zasięgu zmiennej lub stałej. Zmienne lub stałe zadeklarowane jako Public są widoczne w innych modułach, zaś zadeklarowane jako Private nie. Instrukcja Option Private Module może nadpisać instrukcję Public.
Pomimo, że słowo kluczowe Const nie dotyczy zmiennych to jest z nimi związane. Instrukcja Const deklaruje stałą, aby móc posłużyć się nią zamiast bezpośrednio przechowywaną w niej wartością. Stałe mogą być publiczne lub prywatne oraz dowolnego typu jak i inne obiekty.
Często się zdarza, że kod programu zawiera stałą, niezmienną wartość liczbową. Czasem kod może zależeć od liczby, która sama w sobie nie ma specjalnego znaczenia.
W tych przypadkach można w dużym stopniu zwiększyć niezawodność programu i uczynić go łatwym w utrzymaniu, używając instrukcji Const. Instrukcja ta pozwala nadać sensowną nazwę (stała symboliczna) w miejsce liczby. Pomimo, że z definicji stała przypomina zmienną to nie można zmienić jej wartości
1.5.6. Wybieranie typu danych
Definiowanie zmiennej wymaga podania właściwego typu danych. Domyślnie, zmienne Visual Basic for Application otrzymują typ Variant.
Zmienna typu Variant może przechowywać dane numeryczne, data/godzina, łańcuchy znaków oprócz typu String o stałej długości oraz typów definiowanych przez użytkownika. W tym przypadku nie trzeba wykonywać jawnie żadnych konwersji; wszystkie niezbędne konwersje wykonuje Visual Basic ,for Application. Gdy przewidujemy, że zmienna będzie przechowywać dane szczególnego typu to możemy nadać tej zmiennej ten konkretny typ danych.
Gdy wiemy, że zmienna zawsze przechowuje dane tekstowe to możemy zadeklarować ją jako zmienną typu String:
Dim S As String
Gdy wiemy, że zmienna zawsze przechowuje liczby całkowite (np. 12), bez części ° ułamkowej (np. 3,57), należy zadeklarować ją jako Integer lub Long. Operacje na zmiennych typu całkowitego są szybsze i zużywają mniej pamięci w stosunku do typu Variant. Jeżeli zmienna zawiera cześć ułamkową, należy ją zadeklarować jako Single, Double lub Currency. Typ Currency udostępnia 4 pozycje po przecinku ułamkowym i 15 pozycji przed przecinkiem, jest to typ stałoprzecinkowy, odpowiedni do przechowywania danych pieniężnych. Liczby zmiennoprzecinkowe (Single i Double) mają znacznie większe zakresy niż Currency, lecz mają tendencje do małych błędów zaokrąglenia.
W tablicy pokazano dostępne typy danych, łącznie z dopuszczalnymi zakresami ich wartości oraz rozmiarem.
TYP DANYCH |
ROZMIAR |
ZAKRES |
Byte |
1 bajt |
od 0 do 255 |
Boolean |
2 bajty |
True lub False |
Integer |
2 bajty |
od -32 768 do 32 767 |
Long (długa całkowita) |
4 bajty |
od -2 147 483 648 do 2 147 483 647 |
Single (zmiennopozycyjna pojedynczej precyzji) |
4 bajty |
od -3,402823E38 do -1,401298E-45 dla wartości ujemnych; od 1,401298E-45 do 3,402823E38 dla wartości dodatnich |
Double (zmiennopozycyjna podwójnej precyzji) |
8 bajtów |
od -1,79769313486232E308 do 4,94065645841247E-324 dla liczb ujemnych; od 4,94065645841247E-324 do 1,79769313486232E308 dla liczb dodatnich |
Currency (skalowana całkowita) |
8 bajtów |
od -922 337 203 685 477,5808 do 922 337 203 685 477,5807 |
Date |
8 bajtów |
od 1 stycznia 100 roku do 31 grudnia roku 9999 |
Object |
4 bajty |
Wskaźnik do zmiennej typu Object |
String (o zmiennej długości) |
10 bajtów + długość ciągu znaków |
od 0 do około 2 miliardów (ok. 65 400 dla Microsoft Windows w wersji 3.1 lub wcześniejszych) |
String (o stałej długości) |
Długość ciągu znaków |
od 1 do około 65 400 |
Variant (zawierające liczby) |
16 bajtów |
Wartość liczbowa o zakresie nie szerszym niż zakres typu Double |
Variant (zawierające znaki) |
22 bajtów + długość ciągu znaków |
Taki sam zakres, jak dla ciągów znaków o zmiennej długości (String) |
Definiowane przez użytkownika Liczba zależna (za pomocą instrukcji Type) |
Liczba zależna od składu i liczby elementów
|
Zakres każdego elementu odpowiada zakresowi odpowiedniego typu danych |
1.5.7. Stałe
Często się zdarza, że kod programu zawiera stałą, niezmienną wartość liczbową. Czasem kod może zależeć od liczby, która sama w sobie nie ma specjalnego znaczenia. W tych przypadkach można w dużym stopniu zwiększyć niezawodność programu i uczynić go łatwym w utrzymaniu, używając instrukcji Const. Instrukcja ta pozwala nadać sensowną nazwę (stała symboliczna) W miejsce liczby. Pomimo, że z definicji stała przypomina zmienną to nie można zmienić jej wartości.
Instrukcja Const posiada następującą składnię:
Const nazwastałej = wyrażenie
Argument nazwastałej jest poprawną nazwą symboliczną (reguły tworzenia poprawnych nazw są takie same jak dla zmiennych), wyrażenie jest złożeniem liczb lub łańcuchów i operatorów (w wyrażeniu nie można używać wywołania funkcji)
Obok stałej deklarowanej poleceniem Const, Microsoft Access automatycznie deklaruje pewną liczbę stałych wewnętrznych. Stałe te są dostępne we wszystkich modułach.
UWAGA. Do przeglądu list stałych wewnętrznych ze wszystkich dostępnych bibliotek obiektów można użyć Przeglądarki obiektów.
Ponieważ nie można dezaktywować wewnętrznych stałych, stałe, które tworzymy nie mogą mieć takiej samej nazwy jak stałe wewnętrzne. Nie można powtórnie zadeklarować lub zmienić wartości stałej wewnętrznej.
WAŻNE. Ponieważ wartości reprezentowane przez stałe wewnętrzne mogą się w przyszłych wydaniach Microsoft Access zmienić, należy raczej używać stałych niż ich wartości. Można jednak wyświetlić rzeczywistą wartość stałej wybierając stałą w oknie Przeglądarki obiektów lub wpisując polecenie ?nazwastałej w oknie Analiza programu.
Tam gdzie można używać stałych deklarowanych przez użytkownika, tam również można używać stałych wewnętrznych.
1.5.8. Przykład deklaracji zmiennych i stałych
Option Explicit `2ądanie deklaracji zmiennych
Const Rozmiar = 3.39
Dim Imie As String*15 '15 znakowy łańcuch
Dim ListaImion ( ) As Array
Dim Wiek As Integer
Dim MaAuto As Boolean
Sub PokazZmiennych
ReDim Preserve ListaImion(1 To 20)As String
Static Licznik As Integer
Dim cokolwiek `zadeklarowana jako Variant
Licznik = Licznik +1
MsgBox "Ilość wywołań procedury: " & Licznik
Imie = "Anna"
Lista Imion ( 1 ) = Imie
End
Powyższy przykład demonstruje użycie większości instrukcji deklaracji w VBA. Jeśli używa się instrukcji Option Explicit to musi się ona zawsze pojawić w pierwszej linii modułu.
1.5.9. Typy deklarowane przez użytkownika
Jeśli standardowy zestaw typów nie wyczerpuje potrzeb użytkownika, wówczas programista może zadeklarować własny typ zmiennej.
W zależności od informacji, na których operuje program, praktyczniejszym może się okazać stworzenie własnego typu danych niż użyć jednej lub wielu kombinacji standardowych typów VBA.
Type PracRecord
Imie As String * 15
Nazwisko As String * 25
Wynagrodzenie As Currency
DataStartu As Date
End Type
W przykładzie powyżej użytkownik zdefiniował typ PracRecord rekord składający się z rodzaju informacji, które powinny się znaleźć w rekordzie pracownika: imię, nazwisko, wynagrodzenie, data rozpoczęcia pracy.
Własne typy definiowane są za pomocą instrukcji Type, która powinna być umieszczona w sekcji deklaracji.
Instrukcje Type można użyć tylko na poziomie modułu.
Aby zadeklarować zmienną nowego typu należy użyć instrukcji Dim:
Dim Pracownik As PracRecord
Można zadeklarować tablicę używając dowolnego typu zdefiniowanego przez użytkownika.
1.5.10. Reguły tworzenia nazw w języku Visual Basic for Application
Mogą zawierać około 200 znaków;
Muszą zaczynać się literą;
Mogą zawierać litery, cyfry i znak podkreślenia (_);
Nie mogą zawierać znaków przestankowych ani spacji;
Nie mogą zawierać słów kluczowych języka Visual Basic.
Słowo kluczowe jest to słowo, które stanowi część języka Visual Basic. Dotyczy to zdefiniowanych instrukcji, takich jak If i Loop, funkcji, takich jak Len i Abs i operatorów, takich jak Or i Mod.
1.5.11. Zasięg i widoczność
Zasięg definiuje widoczność zmiennej, procedury lub obiektu.
W Visual Basic istnieją trzy poziomy zasięgu przedstawione poniżej
POZIOM ZASIĘGU |
WIDOCZNOŚĆ |
Lokalny |
Zmienna zadeklarowana na poziomie procedury widoczna tylko dla procedury, w której została zadeklarowana |
Modułu |
Zmienna zadeklarowana na poziomie modułu widoczna dla wszystkich procedur zawartych w module, w którym została zadeklarowana |
Publiczny |
Zmienna zadeklarowana na poziomie modułu widoczna dla wszystkich procedur zawartych w całej aplikacji. |
Decyzja o deklarowanie zmiennej na poziomie procedury lub na poziomie modułu zależy od tego czy inne procedury w aplikacji powinny widzieć tę zmienną czy nie.
W Microsoft Access’97 używa się klauzuli Public zamiast Global (klauzula Access Basic). Domyślnie wszystkie procedury są publiczne prócz tych zastrzeżonych klauzulą.
W tabeli poniżej zostały porównane zasięgi Microsoft Access 97 i poprzednich wersji Access:
ZASIĘG |
SKŁADNIA WERSJI 1.x i 2.0 |
SKŁADNIAMicrosoft Access’97 |
Procedury dostępne dla wszystkich modułów |
Function abc() |
Public Function abc() lub Function abc() |
Procedury zastrzeżone dla bieżącego modułu |
Private Function abc() |
Private Function abc() |
Zmienne statyczne w ramach procedury |
Static Function abc() |
Public Statie Function abc() lub Static Function abc() |
Zmienne dostępne tylko dla procedury |
Dim X w procedurze |
Dim X lub Private X w procedurze |
Zmienne dostępne wszystkim procedurom w module |
Dim X w Sekcji deklaracji |
Dim X lub Private X w Sekcji deklaracji |
Zmienne dostępne wszystkim procedurom we wszystkich modułach |
Global X |
Public X
|
UWAGA. Ze względu na kompatybilność wstecz nadal można używać klauzuli Global, jednakże preferowane jest użycie klauzuli Public.
1.5.12. Okno Analizy programu to
Okno Analiza programu w programie Microsoft Access dla Windows 97 składa się z dwóch okienek: okienka bezpośredniego, które działa podobnie jak w poprzednich wersjach programu Microsoft Access i z okienka Czujka. Okienko Czujka jest widoczne tylko wówczas, jeśli uprzednio zostało ustawione wyrażenie czujki.
Okno bezpośrednie jest bardzo pomocnym narzędziem podczas programowania w języku VBA i będzie ono często wykorzystywane w tym szkoleniu. W oknie bezpośrednim uruchamiamy polecenia z pojedynczego wiersza programu VBA w celu jego debugowania (testowania). Gdy otwarty jest moduł to można używać tego okienka w dowolnym momencie. Będąc w trybie Projekt, okno bezpośrednie przywołujemy poleceniem Okno Bezpośrednie z menu Widok.
Za pomocą okna bezpośredniego można wykonać zarówno funkcję jak i procedury typu Sub. Można także wyświetlać zmienne.
Aby wyświetlić wartość zmiennej w oknie Bezpośrednim należy wpisać:
?nazwazmiennej
Umożliwia przeglądanie wartości wyrażenia lub zmiennej podczas wykonywania kodu. Aby ustawić wyrażenie czujki, należy kliknąć polecenie Dodaj czujkę w menu Narzędzia.
Nowe okno Analiza programu automatycznie wyświetla status kodu. Jeśli kod nie jest wykonywany, na pasku stanu u góry okna Analiza programu, wyświetlany jest komunikat <Gotów>. Po rozpoczęciu wykonywania kodu na pasku stanu wyświetlana jest nazwa bieżącej bazy danych, moduł, w którym rezyduje wykonywana procedura i nazwa samej procedury.
1.6. Źródła uzyskiwania pomocy
Ustawienie kursora na dowolnym słowie kluczowym VBA i naciśnięcie klawisza [F1] spowoduje przywołanie pomocy dotyczącej tego słowa kluczowego. Większość haseł pomocy zawiera przykłady. Aby je zobaczyć należy kliknąć słowo Przykład. Przykład można skopiować do swojego programu.
Innymi źródłami pomocy mogą być Kreatorzy, baza danych Metody oraz etykiety narzędzi.
Microsoft Access Solution Pack jest osobnym produktem i zawiera cztery pełne aplikacje dla Access 97.
Umożliwia wymianę doświadczeń z innymi użytkownikami Microsoft Access, zasięgnięcie rady u inżynierów wspomagających Microsoft oraz skorzystanie z bazy wiedzy o produktach. W dowolnym momencie wystarczy napisać go microsoft, następnie go mskb by skorzystać z Bazy Wiedzy oraz go msaccess by uzyskać dostęp do forum Microsoft Access (rejestracja w CompuServe pod telefonem 800-848-8199, wew.519).
Sieć Informacji Technicznej Microsoft (TechNet) zawiera informacje pomocne dla administratorów sieci i baz danych, a także wdrożeniowców rozwiązań w świecie przedsiębiorczości.
Microsoft Developer Network (MSDN) jest kompendium bieżących dokumentacji, artykułów technicznych i Bazy Wiedzy Microsoft utworzonej dla projektantów.
Szczegółowy opis języka Microsoft Access (Reference)
Jest rozprowadzany razem z Microsoft Developer's Toolkit (dostępny również osoby. Znajduje się tam informacja o:
Tworzeniu i dystrybucji własnych aplikacji run-time;
Dostępie do obiektów i danych zewnętrznych;
Rozbudowywaniu aplikacji przez Kreatorów (wizards), generatory (builders) i OLE;
Tworzeniu aplikacji pracujących w architekturze klient/serwer;
Optymalizowaniu działania aplikacji.
Dyskietka zwiera kod wraz z komentarzem Kreatora Microsoft Access, dostępna również w MSDN.
2. Struktury sterujące, tablice i
2.1. Typy struktur sterujących
W języku Visual Basic for Application instrukcje sterujące decyzjami i powtórzeniami nazywamy strukturami sterującymi. Najczęściej używanymi strukturami sterującymi w języku VBA są struktura decyzyjna i struktura pętli. Struktury decyzyjnej używamy, gdy chcemy aby w zależności od wartości pewnego wyrażenia wykonała się tylko jedna albo tylko druga grupa instrukcji. Struktury pętli używamy, gdy chcemy aby grupa instrukcji została wykonana kilka razy.
Struktura decyzyjna może mieć trzy różne postaci
If...Then;
If...Then...Else;
Select Case.
Struktura Pętli może mieć dwie różne postaci
Do...Loop;
For...Next.
2.1.1. Tworzenie struktur decyzyjnych
Instrukcja If...Then powoduje wykonanie kodu zawartego pomiędzy słowami kluczowymi, gdy warunek ma wartość prawda. Jeżeli warunek jest fałszywy, sterowanie zostaje przekazane do następnej instrukcji programu.
Składnia
If warunek Then instrukcja
If warunek Then
instrukcje
End I f
Warunek jest przeważnie porównaniem, lecz może nim również być dowolne wyrażenie, którego rezultatem jest liczba. VBA interpretuje tę wartość jako Prawdę lub Fałsz; zero to Fałsz, każda inna wartość to Prawda. Jeżeli warunek jest prawdą to VBA wykonuje instrukcje po słowie kluczowym Then. Można użyć składni jednowierszowej lub wielowierszowej (poniższe przykłady są identyczne).
Przykład
If JakasData < Date() Then JakasData = Now()
If JakasData < Date() Then
JakasData = Now ( )
End If
Należy zauważyć, że składnia jednowierszowa nie używa instrukcji End If i umożliwia wykonanie tylko pojedynczej instrukcji po słowie kluczowym Then.
Przykład
If JakasData < Date() Then
JakasData = Date ( )
Notify = True 'Notify przyjmuje wartość Prawda
End If
Instrukcji lf...Then...Else używamy w celu zdefiniowania kilku bloków instrukcji, z których tylko jeden zostanie wykonany:
Składnia
If warunek1 Then
[blok-instrukcji-1]
[ElseIf warunek2 Then
[blok-instrukcji-2]]...
[Else
[blok-instrukcji-n]]
End If
Visual Basie for Application na początku testuje warunek1. Jeżeli jest fałszywy to testuje warunek2 i tak dalej, aż znajdzie warunek prawdziwy. Gdy go znajdzie zostaje wykonany odpowiedni blok instrukcji, a następnie kod znajdujący się po instrukcji End If. Opcjonalnie można użyć instrukcji Else i po niej bloku instrukcji, który się wykona, jeżeli żaden z warunków nie będzie prawdziwy.
Konstrukcja If...Then jest tylko szczególnym przypadkiem konstrukcji lf...Then...Else. Zauważmy, że można użyć dowolnej liczby klauzuli ElseIf lub żadnej. Na przykład funkcja DataWyplaty powinna zwracać datę któregoś z dni roboczych.
Jeżeli pierwszy dzień miesiąca przypada w sobotę lub niedzielę to funkcja powinna zwrócić datę następnego poniedziałku. Możemy to spowodować testując datę funkcją Weekday i dodając jeden lub dwa dni w zależności od potrzeby.
Przykład
Function DataWyplaty(ByVal JakasData As Variant) As Variant
Dim Wynik
If Not IsNull (JakasData) Then
Wynik=DateSerial(Year(JakasData),Month(JakasData) + 1,1)
If Weekday(wynik) = 1 Then 'Niedziela, dodajemy 1 dzień
DataWyplaty = Wynik +1
ElseIf Weekday(Wynik) - 7 Then
'Sobota,dodajemy dwa dni
DataWyplaty = Wynik + 2
Else DataWyplaty = Wynik
End If
Else
DataWyplaty = Null
End If
End Function
Można zauważyć, że można łatwo dodać kolejne ElseIf do struktury If...Then. Gdy porównania w warunku dotyczą tylko różnych wartości tej samej zmiennej, lepiej jest użyć struktury Select Case.
Struktura Select Case posiada jeden warunek, który jest sprawdzany tylko raz na początku. Wynik jest następnie porównywany z wartościami występującymi po każdej instrukcji Case w strukturze. Jeżeli któraś z wartości pasuje to wykonywany jest blok instrukcji związany z tą instrukcją Case.
Składnia:
Select Case wyrażenietestowe
Case listawyrażeń1
blok-instrukcji-1
Case listawyrażeń2
blok-instrukcji-2
Case Else
blok-instrukcji-n
End Select
Każda z opcji listawyrażeń jest listą składającą się z jednej lub więcej wartości. Gdy pojedyncza lista zawiera kilka wartości, są one rozdzielane przecinkami. Każdy z bloków-instrukcji zawiera zero lub więcej instrukcji. Jeżeli warunek spełnia kilka klauzuli Case, wykonywany jest blok-instrukcji związany z pierwszą klauzulą Case spełniającą ten warunek. Jeżeli warunku nie spełnia żadna z klauzuli Case, wykonywany jest blok instrukcji związany z klauzulą Case Else (która jest opcjonalna).
Przykład:
Function DataWyplatyl(ByVal JakasData As Variant) As Variant
Dim Wynik
If Not IsNull(JakasData) Then
Wynik--DateSerial(Year(JakasData),Month(JakasData) + 1, 1)
Select Case WeekDay(Wynik)
Case 1: DataWyplatyl = Wynik + 1
Case 7: DataWyplatyl - Wynik + 2
Case 6: DataWyplatyl = Wynik - 1
Case Else: DataWyplatyl = Wynik
End Select
Else
DataWyplatyl = Null
End If
End Function
Domino 1999 ~i·"~I
'Niedziela 'Sobota 'Piątek
Należy zauważyć, że struktura Select Case wylicza wartość wyrażenia tylko raz na początku struktury. Inaczej jest w strukturze If...Then...Else, gdzie każda klauzula ElseIf umożliwia wyliczenie wartości innego wyrażenia. Jeżeli we wszystkich klauzulach ElseIf obliczane są wartości tego samego wyrażenia to konstrukcję IF...Then...Else można zastąpić strukturą Select Case.
2.1.2. Tworzenie struktur pętli
Struktura pętli pozwala nam wykonywać grupę instrukcji wielokrotnie. Język VBA oferuje dwa podstawowe typy pętli: pętla Do i pętla For...Next.
Pętla Do powtarza wykonanie grupy instrukcji tak długo, jak długo prawdziwy jest warunek. Można jej używać w sytuacjach, gdy nic możemy określić konkretnej liczby powtórzeń wykonania pętli.
Przykład
Do While Day (Data () ) <> 6
MsgBox "To nie jest Piątek"
Taka funkcja będzie pozostawać w pętli, dopóki system nic zmieni daty na piątek. Jeżeli z góry znamy liczbę wykonań pętli to powinniśmy użyć instrukcji For...Next.
Istnieje kilka odmian instrukcji Do..Loop, lecz każda z nich testuje warunek w celu określenia czy kontynuować wykonanie pętli. Podobnie jak dla instrukcji If...Then, warunek musi być wyrażeniem przyjmującym wartość zero (Fałsz) lub różną od zera ( Prawda).
Ta instrukcja Do...Loop wykonuje się tak długo, dopóki jej warunek jest fałszywy:
Składnia
Do Until warunek
instrukcje
Loop
Wykonanie instrukcji Do...Loop rozpoczyna się od testowania warunku. Jeżeli warunek jest prawdziwy, wszystkie instrukcje pętli są pominięte. Jeżeli warunek jest fałszywy, instrukcje we wnętrzu pętli zostają wykonane i warunek Do Until jest sprawdzany ponownie.
Następujący przykład zlicza liczbę wystąpień podłańcucha znaków w innym łańcuchu znaków tak długo, aż podłańcuch znaków nie zostanie znaleziony.
Przykład
Pozycja = 1
Licznik = 0
Do Until InStr(Pozycja, DlugiLancuch, PodLancuch) = 0
Pozycja = InStr (Pozycja, DlugiLancuch, PodLancuch) +1
Licznik = Licznik +1
Loop
Jeżeli DlugiLancuch nie zawiera ciągu określonego przez PodLancuch to InStr zwraca wartość zero i pętla jest opuszczana.
Inna odmiana instrukcji Do...Loop wykonuje najpierw instrukcje zawarte w ciele pętli, a następnie testuje warunek decydujący o powtórzeniu pętli. Ta odmiana gwarantuje przynajmniej jedno wykonanie instrukcji w pętli.
Składnia
Do
instrukcje
Loop Until warunek
Dwie pozostałe odmiany pętli Do...Loop używają słowa kluczowego While i kontynuują powtarzanie pętli tak długo, jak długo warunek jest prawdziwy.
Instrukcje we wnętrzu pętli zostaną wykonane tylko wtedy, gdy warunek jest prawdziwy
Składnia
Do While warunek
Instrukcje
Loop
Ta odmiana konstrukcji Do...Loop gwarantuje przynajmniej jedno wykonanie instrukcji. we wnętrzu pętli
Składnia
Do
instrukcje
Loop While warunek
Struktury For...Next należy używać w przypadku, gdy znamy liczbę powtórzeń pętli. Jest tu używana zmienna-licznik pętli, której wartość z każdym powtórzeniem wykonania pętli jest zwiększana lub zmniejszana.
Składnia
For licznik=wartoscpocz To wartosckonc [Step zwiększenie]
instrukcje
Next [licznik]
Argumenty licznik, wartoscpocz, wartosckonc, zwiększenie są liczbami.
UWAGA. Argument zwiększenie może być liczbą dodatnią lub ujemną. Jeżeli jest dodatni, wartoscpoczatkowa musi być mniejsza lub równa od wartosckoncowa, w innym wypadku pętla nie zostanie wykonana. Jeżeli zwiększenie jest ujemne to wartoscpoczatkowa musi być większa lub równa wartosckoncowa, aby ciało pętli zostało wykonane. Pominięcie klauzuli Step spowoduje automatyczną inkrementację równą 1.
Visual Busic for Application w trakcie wykonania pętli For:
Nadaje zmiennej licznik wartość początkową.
Sprawdza czy licznik jest większy od wartości końcowej (przy ujemnym zwiększeniu warunek jest odwrotny).
Wykonuje instrukcje.
Zwiększa licznik o jeden lub o podaną wartość zwiększenia.
Powtarza kroki od 2 do 4.
W następującym przykładzie dwie zagnieżdżone pętle For...Next umieszczają w zmiennej Msg pięć wierszy z dużymi literami alfabetu.
Przykład
NL =- Chr(13) & Chr(10) 'Definicja nowej linii
For Rep = 5 To 1 Step -1 'Będzie 5 powtórzeń
For Indx = Asc("A") To Asc("Z")
'Konwersja znaków na liczby
Msg = Msg & Chr(Indx)
'Dołączenie kolejnych liter do łańcucha
Next Indx
Msg = Msg & NL 'Nowa linia po każdym powtórzeniu
Next Rep
Czasem zachodzi potrzeba wcześniejszego opuszczenia pętli, bez wykonywania dalszych instrukcji zawartych w tej pętli. Przykładem może być wymuszenie opuszczenia pętli w momencie, gdy pojawi się pewna wartość
Przykład
Sub Exit Demo
Do `Początek puli nieskończonej
For Indx = 1 To 1000
Num = Int (Rnd * 100) `Wygenerowanie liczby losowej
Select Case Num `Badanie liczby losowej
Case 7 . Exit For
`Gdy jest 7 wychodzimy z pętli For...Next
Case 29 . Exit Do
`Gdy jest 29 wychodzimy z pętli Do...Loop
Case 54 . Exit Sub
`Gdy jest 54 wychodzimy z procedury Sub
End Select
Next Indx
Loop
End Sub
Instrukcja Exit pozwala nam opuścić w dowolnym momencie pętle For, Do..Loop, procedurę typu Funetion i Sub. Instrukcja Exit może występować dowolną liczbę razy w pętlach For, czy Do.
Składnia
For licznik=wartoscpocz To wartosckonc [Step zwiekszenie]
[blok-instrukcji]
[Exit For]
[blok-instrukcji]
Next [licznik [,licznik]]
Do [{While I Until} warunek]
[blok-instrukcji]
[Exit Do]
[blok-instrukcji]
Loop
Instrukcja Exit Do współpracuje ze wszystkimi odmianami składniowymi pętli Do.
Instrukcje Exit For i Exit Do są wygodne w użyciu, zapobiegają dalszemu wykonywaniu pętli. Na przykład poprzednia wersja funkcji IsLoaded sprawdzała każdy formularz w kolekcji Forms, chociaż właściwy formularz został znaleziony podczas polej iteracji pętli. Efektywniejsza wersja tej funkcji powinna opuszczać pętlę w momencie odnalezienia formularza:
Przykład
Function IsLoaded (ByVal MojFormularz As String) As Integer
Dim I
IsLoaded = False
For I = 0 To Forms.count – 1
If Forms(I) .FormName = MojFormularz Then
IsLoaded = True
Exit For
'formularz znaleziony, wychodzimy z pętli
End If
Next
End Function
Instrukcja Exit przeważnie występuje w instrukcji lf...Then lub Select Case zagnieżdżonej w pętli.
2.2. Tworzenie tablic
Podobnie jak w innych językach tablica pozwala na odwoływanie się do szeregu zmiennych posiadających identyczną nazwę, rozróżnianych po indeksie. Visual Basic for Application. pozwala na utworzenie tablic trojakiego typu: zwykłe (o stałym rozmiarze), wielowymiarowe i dynamiczne.
2.2.1. Zwykłe tablice o stałym rozmiarze
W deklaracji tablicy po jej nazwie występuje jej maksymalna pojemność ujęta nawiasy półokrągłe, która musi być liczbą całkowitą.
Przykłady
Dim Liczniki (14) As Integer
'Tablica 15-elementowa z zakresu od 0 do 14
Dim Sumy (20) As Double
'Tablica 21-elementowa z zakresu od 0 do 20
Aby zadeklarować tablicę publiczną słowo Dim należy zastąpić słowem Public
Przykład
Public Liczniki (14) As Integer
Ta sama deklaracja w procedurze przy użyciu instrukcji Static będzie miała postać:
Static Liczniki (14) As Integer
2.2.2. Tablice wielowymiarowe
Maksymalny ilość wymiarów tablicy w Visual Basic for Application to 60. Następujący przykład deklaruje macierz o wymiarach 10 na 10:
Przykład
Dim MacierzA (9,9) As Double
Ta sama deklaracja z jawnie podanymi dolnymi granicami poszczególnych wymiarów
Przykład
Dim MacierzA (1 To 10, 1 To 10) As Double
Efektywne przetwarzanie tablic wielowymiarowych zapewniaj ą zagnieżdżone instrukcje For. Na przykład w ten sposób można nadać wartości początkowe elementom MacierzA, równe pozycji tych elementów w macierzy:
Przykład
Dim I As Integer, J As Integer
Dim MacierzA (1 To 10, 1 To 10) As Double
For I = 1 To 10
For J = 1 To 10
MacierzA(I,J) - I * 10 + J
Next J
Next I
Można łatwo zwiększyć liczbę wymiarów, na przykład
Dim WieloWym (3, 1 To 10, 1 To 15) As Integer
Taka deklaracja tworzy tablicę trójwymiarową o pojemności 4 na 10 na 15. Całkowita liczba elementów jest iloczynem tych trzech wielkości czyli 600.
UWAGA. Dodanie do tablicy dodatkowego wymiaru powoduje drastyczne zwiększenie zapotrzebowania na zasoby, dlatego należy postępować ostrożnie z tablicami wielowymiarowymi.
2.2.3. Tablice dynamiczne
Jeśli podczas wykonywania kodu programu zachodzi potrzeba zmiany rozmiaru tacy, to można zadeklarować tablicę dynamiczną. W deklaracji tablicy należy użyć instrukcji Static, Dim, Private lub Public, pozostawiając puste nawiasy, jak to przedstawiono w następującym przykładzie:
Dim sngArray ( ) As Single
Później, w procedurze znajdującej się w zakresie tablicy należy zastosować instrukcje ReDim, służącą do zmiany wymiarów i określenia liczby elementów oraz wartości u górnego i dolnego każdego z wymiarów. Zmiany tablicy dynamicznej przy pomocy instrukcji ReDim można dokonywać dowolną ilość razy.
Na przykład utworzymy tablicę dynamiczną Macierzl najpierw deklarując ją na poziomie modułu:
Dim Macierzl ( ) As Integer
następnie funkcja przydziela tablicy przestrzeń
Function ObliczTerazWart ( ) As Integer
...
ReDim Macierzl (19, 29)
Instrukcja ReDim przydziela tablicy macierz o wymiarach 20 na 30 elementów typu Integer (w sumie 600 elementów). Również granice wymiarów tablicy dynamicznej można określić przy pomocy zmiennych:
ReDim Macierzl (X, Y)
UWAGA. Instrukcję ReDim można wykorzystać jako niejawną deklarację tablicy w procedurze. Należy zwracać uwagę, aby nie popełnić błędu w nazwie tablicy, podawanej w instrukcji ReDim. Nawet jeśli moduł zawiera instrukcję Option Explicit, to podanie błędnej nazwy spowoduje utworzenie drugiej tablicy.
Przy każdym wywołaniu instrukcji ReDim, wszystkie wartości przechowywane w tablicy są tracone. Aby zachować istniejące dane, należy zastosować słowo kluczowe Preserve. Na przykład, następująca instrukcja powoduje zwiększenie tablicy varArray o 10 elementów, bez utraty wartości aktualnie istniejących elementów:
ReDim Preserve varArray(UBound(varArray) + 10)
Uwagi:
Jeśli dla tablicy dynamicznej zastosowano słowo kluczowe Preserve, to można zmieniać jedynie kres górny ostatniego z wymiarów;
Jeśli dla tablicy dynamicznej zastosowano słowo kluczowe Preserve, to nie wolno zmieniać liczby wymiarów.
2.2.4. Kontrola nad rozmiarem tablicy
Instrukcja Option Base pozwala nam kontrolować dolną granicę wymiaru tablicy nadawaną domyślnie przez system.
Składnia
Option Base liczba
Domyślna dolna granica wynosi zawsze 1 lub 0, w zależności od ustawienia instrukcji Option Base. Jednakże wolno użyć dowolnej wartości całkowitej jako dolnej granicy wymiaru tablicy, utworzonej przy użyciu jednej z instrukcji To, Dim, Public, ReDim czy Static.
W następnym przykładzie użyjemy instrukcji Option Base do zmiany domyślnej (0) dolnej granicy tablicy.
Przykład
Option Base 1
Dim X(10) As Single
'Tablica X ma 10 elementów od 1 do 10
Do określenia rozmiaru tablicy można użyć funkcji Lbound i Ubound. Funkcja Lbound pozwala nam odnaleźć dolną granicę wymiaru tablicy, podczas, gdy funkcja Ubound podaje największy możliwy przydział dla podanego wymiaru tablicy.
W następnym przykładzie funkcja Lbound określa dolną granicę dla dwuwymiarowej tablicy.
Przykład
A = Int(9 * Rnd +2) 'Pierwszy wymiar
B = Int(9 * Rnd +2) 'Drugi wymiar
ReDim Array (A To 20, B To 20) As Integer
'Ustalenie wymiarów
'Dolna granica pierwszego wymiaru
MsgBox "Wymiar 1 = " & LBound(Array, 1)
'Dolna granica drugiego wymiaru
MsgBox "Wymiar 2 --- " & LBound(Array, 2)
2.3. Składnia Visual Basie for Application
W rozdziale tym omówione są nowe instrukcje, struktury sterujących i słowa kluczowe, które wzbogacają możliwości VBA.
2.3.1. Instrukcja With...End With
Powoduje wykonanie serii instrukcji w odniesieniu do określonego obiektu lub typu zdefiniowanego przez użytkownika.
Składnia
With object
[statements]
End With
Parametry instrukcji With są podzielone na następujące grupy:
object określa nazwę obiektu lub typu zdefiniowanego przez użytkownika.
statements określa jedną lub wiele instrukcji do wykonania w odniesieniu do obiektu.
Instrukcja With umożliwia wykonanie serii instrukcji na określonym obiekcie bez potrzeby ciągłego podawania explicite nazwy obiektu. Na przykład jeśli trzeba zmienić kilka właściwości pojedynczego obiektu, wygodniej jest umieścić instrukcje przypisania właściwości wewnątrz struktury With odwołując się do obiektu tylko raz, a nie dla każdej właściwości osobno. Oto przykład użycia instrukcji With przy przypisywaniu wartości właściwości pojedynczego obiektu. Składniowo blok instrukcji zawarty w strukturze With...End With jest czytelniejsze ze względu na wcięcie wykonywanych na obiekcie instrukcji.
With TxtNazwa
.FontBold = True
.FontSize = 24
.Value = "Hej ! "
End With
Struktura With...End With podnosi efektywność programu ponieważ obiekt specyfikowany jest tylko raz. Eliminuje to nadmierne odwoływanie się do obiektu i przyspiesza wykonanie kodu.
Poniższy przykład ilustruje użycie struktury With aby ustawić wartości kilku właściwości tego samego obiektu:
Function InstWithEndWith
Dim f As Form
Set f = Form_Pracownicy
With f
.caption = "Pracownicy"
.scrollbars = 3
With .Szczegóły
.backcolor = 255
.height = 1440
End Witki
End With
End Function
Bloki Witki można zagnieżdżać jedne w drugich. Ponieważ jednak elementy zewnętrznych bloków With są maskowane w wewnętrznych blokach With, odwołując się obiektów z zewnętrznych bloków With trzeba podawać pełne nazwy.
UWAGA. Wewnątrz bloku With nie można zmieniać parametru object. Dlatego pojedyncza instrukcja With nie pozwala na odwoływanie się do wielu obiektów.
WAŻNE. Nie należy stosować skoków do bloku With lub z niego. Wykonanie instrukcji wewnątrz bloku With bez uprzedniego wejścia w strukturę With...End With może prowadzić do wystąpienia błędów lub nieprzewidywalnych operacji.
2.3.2. Argumenty opcjonalne
W definicji procedury argumenty opcjonalne są poprzedzane słowem kluczowym Optional. Gdy wywoływana jest procedura z argumentem opcjonalnym, istnieje możliwość wyboru, czy argument opcjonalny będzie określony, czy też nie.
Użycie opcjonalnych argumentów wymaga zachowania następujących reguł:
Deklaracja opcjonalnych argumentów musi być umieszczona na końcu, po deklaracji wymaganych argumentów.
Wszystkie argumenty opcjonalne muszą być deklarowane jako Variant
Nie można użyć Optional dla żadnego argumentu jeżeli zostało użyte słowo kluczowe ParamArray
Poniższa procedura zawiera argument opcjonalny, zmienną varCountry. Funkcja IsMissing ustala czy argument opcjonalny został przekazany do procedury.
Sub OptionalArgs(strState As String,Optional varRegion As _ Variant,
Optional varCountry As Variant)
If IsMissinq(varRegion) And IsMissing(varCountry) Then
Debug.Print strState
ElseIf IsMissing(VarCountry) Then
Debug.Print strState, VarRegion
ElseIf IsMissing(varRegion) Then
Debug.Print strState, varCountry
Else
Debug.Print strState, varRegion, varCountry
End If
End Sub
Poniższe przykłady pokazują poprawne użycie opcjonalnych argumentów:
Function PodajNazwe(Optional Imie, Optional Nazwisko)
Function PodajNazwe(Imie, Optional Nazwisko)
Function PodajNazwe(Imie As String, Optional Nazwisko)
Function PodajNazwe(Imie As String, Optional Nazwisko _ As Variant)
Poniższe przykłady pokazują niepoprawne użycie opcjonalnych argumentów:
Function PodajNazwe(Optional Imie, Nazwisko)
Function PodajNazwe(Imie As String, Optional Nazwisko _ As String)
Function PodajGodziny(Imie, Optional ParamArray _Godziny() As String)
Function PodajGodziny(ParamArray Godziny() Optional _ Nazwisko As~String)
2.3.3. Klauzula ParamArray
Aby przesłać zmienną ilość zmiennych do procedury w Microsoft Access 97, można użyć klauzuli ParamArray.
Klauzula ta używana jest tylko przy ostatnim parametrze na liście argumentów, celu wskazania że jest on opcjonalną (Optional) tablicą elementów typu Variant. Użycie słowa kluczowego ParamArray pozwala deklarować dowolną liczbę parametrów. Nie można stosować go łącznie z klauzulami ByVal, ByRef i Optional.
Poniższa funkcja pobiera dwa argumenty: nazwisko i liczbę godzin na dzień dla każdego pracownika. Używa funkcji Ubound, aby określić liczbę elementów tablicy. Sumuje wartości elementów i wyświetla wynik. Każdy pracownik może mieć różny wymiar godzin podczas okresu płatności.
Function K_ParamArray(Nazwisko As String, ParamArray ~u, po Godz iny ( ) )
Dim I As Integer
Dim Suma
For I=0 To Ubound(Godziny)
Suma = Suma + Godziny(I)
Next I
Debug.Print "Suma godzin dla " & Nazwisko & " = " & Suma
End Function
2.3.4. Pętla For Each ...Next
Instrukcja For Each...Next jest nowym elementem Microsoft Access 97. Powtarza grupę instrukcji dla każdego elementu tablicy lub kolekcji.
For Each...Next jest wygodna w pracy z obiektami i kolekcjami. Nie wymaga znajomości liczby elementów w grupie.
Poniższy przykład pokazuje jak używać For Each...Next w celu przejrzenia elementów tabeli:
Fuction ForEachLoop()
Dim ListaLiczb(3) As Integer
Dim Liczba As Variant
ListaLiczb (0) - 1
ListaLiczb(1) - 22
ListaLiczb(2) - 53
ListaLiczb(3) - I6
For Each Liczba In ListaLiczb
Debug.Print Liczba
Next
End Function
3. Usuwanie i obsługa błędów
3.1. Typy błędów
Błędy programowania można podzielić na trzy kategorie:
Błędy języka;
Błędy wykonania;
Błędy logiczne.
Błędy języka są wynikiem złej konstrukcji kodu. Na przykład błędnie zapisane skowo swe, brak zamykającego nawiasu, czy instrukcja Next bez dopełniającej ją invji For, spowodują błąd języka, który Microsoft Visual Basie ,fór Application 1 odnajdzie w momencie opuszczenia linii lub tuż przed wykonaniem programu.
wykonania ly wykonania pojawiają się i są rozpoznawane przez VBA gdy instrukcja próbuje ić operacje dla niej niedozwoloną. Dobrym przykładem jest próba odwołania się ktu, który nie może istnieć w aktualnym kontekście.
ly logiczne
tędy logiczne pojawiają się wtedy gdy program nie wykonuje tych działań dla któzostał napisany. Program może mieć poprawną składnię i wykonywać dozwolone acje lecz wyniki przez niego produkowane są błędne. Poprawę tego rodzaju błędów żliwia analiza kodu i wyników programu. Błędy logiczne mogą powodować poN'anic błędów wykonania.
Techniki wykrywania błędów
isual Ba,sic.fńr-A~~hlication posiada różnorodne narzędzia wykrywania błędów.
.2.1. Wykrywanie błędów w oknie Analizy programów
lkno Analiza programu w programie Micr°o.soft Acce.ss 97 dla Windows składa się ~óch okien: okna Bezpośredniego, które działa podobnie jak w poprzednich wer~ programu Microsoft Aoce.s.s i z okna C.ujki. Okno Czujka jest widoczne tylko -czas, jeśli uprzednio zostało ustawione wyrażenie czujki.
.' oknie bezpośrednim można monitorować wartości wyrażeń i zmiennych podczas onywania krokowo kolejnych instnikcji kodu. Okno bezpośrednie umożliwia rówzmianę wartości zmiennych i właściwości w trybie zawieszenia. W oknie bezpopim mogą być wyświetlane informacje, będące rezultatem wykrywania błędów >dzie programu, lub można samemu napisać instrukcję bezpośrednio w tym okien
'_`a przykład, podczas sprawdzania programu chcemy uruchomić procedurę, obliczyć Tażenie, lub przypisać nową wartość zmiennej czy właściwości: Wszystko można 'konać w oknie bezpośrednim.
Zasięg okna bezpośredniego jest ograniczony do aktualnej procedury. Zmienne czy aściwości poza zasięgiem nic są wyświetlane.
dotycz,rce serii "Pod lupą" sn publikowane w intcrnetowym serwale W W W' pod tulrescm: http://www.donuno.ok.putupa -41
.,~ Microsoft Access 97 programowanie
Domino I
Okno czujki wyświetla bieżącą wartość wybranych do monitorowania wyrażeń w takcie wykonywania programu. W oknie tym kolumna Kontekst określa procedurę, moduł lub moduły, w których wartość wyrażenia jest wyliczana. Okno czujki wyświetla wartość wyrażenia jeżeli bieżąca instrukcja jest we właściwym kontekście. W przeciwnym przypadku w kolumnie Wartość pojawi się informacja, że wyrażenie jest poza kontekstem.
Istnieją trzy typy czujki:
· Wyrażenie czujki;
· Przerwij, gdy wyrażenie jest prawdziwe; · Przerwij przy zmianie wyrażenia.
Po dodaniu czujki można uruchomić procedurę w oknie bezpośrednim i monitorować wybrane wyrażenie w oknie czujki.
3.2.2. Dodawanie czujki
Można dodać wyrażenie czujki przed uruchomieniem procedury jak i w trybie wstrzymania. Tryb wstrzymania ma miejsce kiedy zostanie zawieszone wykonywanie kodu w celu uruchomienia go w trybie pracy krokowej.
Dodawanie wyrażeń czujek.
Wyrażenie czujki pozwala na obserwacj ę wartości zmiennej, właściwości lub innego wyrażenia.
Aby dodać wyrażenie czujki należy:
1. Z menu Narzędzia wybrać polecenie Dodaj czujkę.
2. W oknie Wyrażenie wprowadzić wyrażenie, które ma być wyliczane.
3. W oknie Kontekst określić zasięg wyrażenia czujki, wybrać odpowiednią procedurę i moduł.
4. W oknie Typ czujki wybrać właściwy typ czujki. 5. Kliknąć OK
Dodanie Szybkiej Czujki powoduje, że okno dialogowe wyświetla wartość zaznaczonego wyrażenia.
Aby dodać szybką czujkę należy:
1. W oknie kodu zaznaczyć wybrane wyrażenie.
2. Z menu Narzędzia wybrać polecenie Szybka czujka (lub odpowiedni przycisk na pasku narzędzi)
3. Kliknąć przycisk Dodaj
3.2.3. Narzędzia do wykrywania błędów
Na pasku narzędziowym umieszczono cztery najczęściej używane funkcje do wykrywania błędów.
PRZYCISK I FUNKCJA I I
Informacje dotyczące serii "Pod lupą" są publikowane w internetowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa
-42
~~,min~> l0 3. Usuwanie i obsługa błędów
wyrażeń g FUNKCJA KLAWISZ
~rocedurę, erwania Tworzy lub usuwa punkt przerywający. Punkt przerwa- [F9]
wyświetla nia to miejsce w programie, które powoduje przerwanie
tekście.
w konania roaramu
-rażenie
- zujka Wyświetla bieżącą wartość wybranego wyrażenia [Shift] +
i ozwala na dodanie rażenia do okna czu~ki. [F9]
Wykonuje następną linię kodu. Jeżeli w następnej linii [F8]
jest wywołanie procedury to przenosimy się do tej pro-
cedury i kolejne kroki będą wykonywane w tej proce-
f durze aż do 'e' końca.
Wykonuje następną linię kodu. Jeżeli w następnej linii [SHIFT] +
-torować iem znajduje się wywołanie procedury procedura zostanie [F8]
w konana w ~edn m kroku.
'a Wyświetla listę aktywnych wywołań procedur zaczy- [Ctrl] + [L]
nając od ostatnio wywołanej, można prześledzić kolej-
ność w wołań.
trybie lizy pro- Wyświetla Okno Analizy programu (okno bezpośred- [Ctrl] +[G]
ywanie nie).
Kończy wykonywanie procedury Visual Basie [SHIFT] +
i w cz szcza wsz stkie ubliczne i r watne zmienne. [FS]
- i Kontvnuuie wykonanie kodu no zawieszeniu fF51
ornego
Kończy wykonywanie procedury Visual Basie
i wyczyszcza wszystkie prywatne zmienne, ale zachowuie publiczne zmienne.
4. Zawieszenie wykonania programu
zawieszenia zatrzymuje wykonanie programu daj ąc obraz warunków w danym
Basie przechodzi do trybu zawieszenia, jeżeli wystąpi jedno z następujących
aczo- cie wykonania natrafiono na linie z punktem przerwania; cie wykonania natrafiono na instrukcj ę Stop;
lenie dialogowym Dodaj Czujkę (menu Narzędzia) zostało zdefiniowane 'enie, które w zależności o wartości może przerywać wykonywanie kodu;
cja wygeneruje nie wykryty wcześniej błąd wykonania;
~ak na a przerwać wykonywanie kodu z klawiatury wciskając klawisz [Esc] lub ]+[Break].
anie wykonania programu
mnie programu zostanie wstrzymane, w momencie gdy VBA wykryje jeden ów powodujących jego przejście do trybu zawieszenia. Po wstrzymaniu wykowy programu pojawi się okno analizy programu.
VtfiS~
~iom~ _ ą publikowane w internetowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa -43
Microsoft Access 97 pro
~O Domino I
Zachowanie stanu zmiennych i właściwości
W trybie zawieszenia stan zmiennych i właściwości jest zachowany zatem można:
Oglądać wartości zmiennych, właściwości i instrukcji; Zmieniać wartości zmiennych i właściwości.
3.2.5. Używanie Debug.Print
We własnych programach można używać metody Print obiektu Debug w celu skierowania wyjścia do okna bezpośredniego. Technika ta tworzy w oknie bezpośrednim historię wartości jakie przyjmowała zmienna czy właściwość. Po zakończeniu wykonania można obejrzeć umieszczone tam informacje.
Na przykład poniższa instrukcja wyświetla w oknie bezpośrednim wartość wyucrgrod~erzie, za każdym wykonaniem instrukcji
Debug.Print "Wynagrodzenie = " & Wynagrodzenie
Ta technika daje najlepsze wyniki, gdy użyjemy jej w miejscu gdzie jest modyfikowana zmienna, np. w pętli.
Znak zapytania (?) jest użytecznym skrótem metody Print. Znak zapytania oznacza to samo co Print i może być używany wszędzie tam gdzie używa się Print.
3.2.6. Używanie pola dialogu wywołania
Aby wyświetlić pole dialogu wywolania należy:
· Zawiesić wywołanie swojego programu (tylko wtedy możliwe jest wyświetlenie pola dialogu wywołania);
· Kliknąć przycisk Wywołania z paska narzędziowego (lub z menu Narzędzia).
Pola dialogu wywołania używamy do śledzenia operacji wykonywanych przez kolejne procedury aplikacji. Jest ono szczególnie użyteczne, gdy śledzimy zagnieżdżone procedury. Pole dialogu wywołania wyświetla listę wszystkich aktywnych (wywołanych) procedur. Na końcu listy są procedury wywołane jako pierwsze, na szczycie listy procedury wywołane ostatnio. Informacja o procedurze zawiera nazwę modułu w którym występuje i nazwę samej procedury.
3.3. Obsługa błędów
Programowa obsługa typowych błędów - bez przerywania wykonania programu lub wyświetlania niepotrzebnych komunikatów o błędach - to cecha profesjonalnej aplikacji.
3.3.1. Wychwytywanie błędów wykonania
Źródła powstawania błędów często nie są znane i wymagają wykonania pewnej liczby testów, aby je znaleźć. Program może działać poprawnie w normalnych warunkach, a dopiero wprowadzenie danej o złym typie może spowodować wystąpienie błędu.
Co się dzieje podczas błędu wykonania ?
Błąd wykonania powstaje wtedy, gdy Visual Bc~sic,for Application nie będzie potrańł wykonać zadanej mu operacji, np.. dzielenia przez zero.
Inforn~acje dotyczące serii "Pod lupą" są publikowane w internetowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa
-44
O Domino 19
3. Usuwanie i
błędów
d wykonania powoduje zatrzymanie wykonania programu, pojawienie się okna
n można: owego informującego o powstaniu błędu.W tym momencie możemy: trzymać wykonanie;
ontynuować wykonanie (jeżeli rozwiążemy problem w oknie Modułu); eglądać okienko modułu podświetlające linię kodu zawierającą błąd; ejść bezpośrednio do linii, która spowodowała błąd;
w celu skie- ięgnąć pomocy dotyczącej błędu. >średnim hi
~ wykonania przechwytywać błędy wykonania ?
przez przechwytywanie błędów wykonania, możemy uczynić naszą aplikacją barm wartość tolerującą typowe błędy jakie mogą się zdarzyć.
worzymy bardziej odporne aplikacje - aplikacje, które przechwytuj ąc błędy konania, mogą obsłużyć typowe błędy użytkownika bez przerywania aplikacji. modyfiko- y likacje są mniej skłonne do awarii.
możliwiamy eleganckie zakończenie aplikacji - w wypadku, gdy obsługa błędu zia oznacza ykonania nie jest w stanie rozwiązać problemu, procedura ta może wykonać dzo istotne operacje tak jak zamknięcie wszystkich otwartych zbiorów danych
zachowuj ąc przy okaz] i dane, które w innym wypadku byłyby stracone)
3.2. Programowa obsługa błędów
Start
a~_ °świetlenie
On Error Go To...
ia). Akcja 1 (błąd) Resume
przez kolej-
Akcja 2
żdżOne pro- Obsługa Resume Next
-wołariych~ GoHere: Akcja 3 Błędu
listy proce- Resume GoHere
ktt>rym wy- Koniec
Większość procedur obsługi błędów posługuje się podobną logiką.
gramu lub CTdY VBA rozpozna błąd wykonania, poszukuje instrukcji On Error Go To. Jeżeli zej aplika- j~ie ją, to błąd zostaje obsłużony i wykonanie zostaje wznowione, od tej samej incji co spowodowała błąd lub od innej instrukcji.
Jeżeli VBA nie potrafi odnaleźć instrukcji On Error Go To, wykonanie zostaje prze~-ane i zostaje wyświetlona informacja o błędzie.
"-nej lit;- ~ 3.3.3. Instrukcje i funkcje zwiazane z błędami warunkach,
potrafił
Jest osiem standardowych funkcji i instrukcji związanych z obsługą błędów.
UKCJA LUB ~.JA
>rCoTo
OPIS
Zezwala na
i określa mieisce tei ob
P~/~t~h~ ~ormacje dotyczące serii "Pod lupą" są publikowane w internetowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa
-45
Microsoft Access 97 programowanie ~ n"~r,;na ,
sługi w programie; może również zabronić programowej obsługi błędów
Err Instrukcja: Przypisuje konkretną wartość do Err Funkc'a: Zwraca numer błędu
Error Instrukcja: Symuluje pojawienie się błędu
Funkcja: Zwraca informację o błędzie odpowiadającą podanemu numerowi błedu
Resutnc Wznawia wykonanie od instrukcji, która spowodowała błąd, po ro ramowe' obsłudze błędu
Resullle Next Wznowienie wykonania od instrukcji następującej po instrukcji, która s owodowała błąd , o ro ramowe' obsłudze błędu Resume linia Wznowienie wykonania od podanej etykiety lub numeru linii, po
ro ramowe' obsłudze błędu.
CVErr Służ do enerowania błędów zdefiniowan ch rzez uż kownikó IsError Służy do sprawdzenia czy sprawdzane wyrażenie liczbowe odpo
wiada numerowi błedu. któtv wvstanił
3.3.4. Obiekt Err (Microsoft Access)
Przekazuje informacje o błędach czasu wykonania. Kiedy pojawi się błąd czasu wykonania właściwości obiektlt Err przechowują informacje pozwalające na identyfikację i przechwycenie błędu.
Kiedy pojawi się błąd czasu wykonania właściwości obiektu Err stają się zbiorem wartości odpowiadającym przyczynie błędu. Przyczyną błędu może być błąd Vi.sual Bcz.sic, OLE obiekt lub programista.
Poniższa tabelka przedstawia właściwości obiektu Err:
WŁAŚCIWOŚĆ OPIS
Number Zwraca numer błędu, 'est to dom ślna właściwość Descri tion O is błędu od owiada'ąe właściwości Number)
Source Wyrażenie łańcuchowe wskazujące obiekt lub aplikację, która wała błąd.
HelpFile Ścieżka dostenu do Pomocv VBA
WŁAŚCIWOŚĆ OPIS
HelpContext Indeks do informacji w Pomocy VBA dotyczącej błędu wskazywanego rzez właściwość Number.
LastDLLError (Dotyczy tylko 32 bitowych systemów operacyjnych Windows.) Przechowuje kod błędu systemowego związanego z ostatnim wywołaniem biblioteki d namiczne'.
Poniższa tabelka przedstawia metody obiektu Err.
Informacje dotyczące serii "Pod lupy' są publikowane w internetowym serwisie WWW pod adresem: http:llwww.dominn.ok.plllupa
-46
o r~om~no 1 ~~ 3. Usuwanie i obsługa błędów
~owęj obsługi SPIS
Cz ści wsz stkie właściwości obiektu Err. Jest od owiednikiem instrukcji Err = 0.
Generuje błąd czasu wykonania bazując na obiekcie Err lub błędzie zdefiniowanym
przez użytkownika. (Instrukcja Error nadal może być używana ze względu na
wsteczną kom a bitność
_ podanemu
CopyFile (SourceFile As String, DestinationFile As
= i n g )
a bł ąd, po On Error GoTo ErrHand
FileCopy SourceFile, DestinationFile
instrukcji, MsgBox "File was copied.".
błędu Proc : ' Linia etykiety
ru linii, po Exit Sub
rHand: ' Tu zaczyna sil obsługa bl~du
Jrr.Number = 53 Then
L l
u' kow
ik
n ~'_sgBox SourceFile & " does not exist.No file was copied."
bowe odpo- ~_esume ExitProc
Else
' Wymuszenie by Access wyświetlił błąd
' jeśli wystąpił inny niż oczekiwany
Err.Raise Err.Number
If
Sub
czasu wy-
tyfikację
CopyFile2(SourceFile As String, DestinationFile As
_ zbiorem =ng)
~istrc~l Bcr- Error Resume Next ' Ignoruj wszystkie błędy.
-eCopy SourceFile, DestinationFile
Err.Number -- 53 Then
' Sprawdzenie czy wystąpił błąd.
~'_sgBox SourceFile & " does not exist.No file was copied."
lseIf Err.Number <> 0 Then
' Zmuszenie Accessa do wyświetlenia bł~du
' jeśli wystąpił inny niż oczekiwany
Err.Raise Err.Number
ra spowod
- S e
MsgBox "File was copied."
~ If
Sub
cmdOpenFile_Click()
anegu Dim temperr As Integer
On Error Resume Next
ws.)Prze- Open "C:\NEWORDER.TXT" For Input As #1
Select Case Err.Number
'~~~ołaniem
Case 0 : ' Nic się nie wykonuj e .
Case 53: 'Nie odnaleziono pliku.
'Kod informujący o bł~dzie.
Case 55: ' Plik już jest otwarty
' Kod usuwający źródło bł~du
-' ok.pl/lup<< dotyczące serii "Pod lupą" są publikowane w internetowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa
_47_
Microsoft Access 97 programowanie
Case Else
tempery = Err.Number On Error GoTo 0 Err.Raise tempery End Select
Err.Clear ' Wyczyszczenie numeru bł~du. Open "C:\NEWORDER.TXT " For Input As #2 End Sub
Sub ValidateName(strUName As String) Dim vntReturnvalue As Variant
If strUName = CurrentUser Then
vntReturnvalue = "You Are the Current User"
Domino '411
Else vntReturnvalue = CVErr(56515) End If
' Sprawdzenie czy wystąpił właściwy błąd. If IsError(vntReturnvalue) Then
Debug.Print "Wartość zmiennej: " & CStr(vntReturnvalu Debug.Print "Typ zmiennej: " & VarType(vntReturnvalue Debug.Print "Numer bł~du zdefiniowanego przez"&
"użytkownika:"&CLng(vntReturnvalue) Debug.Print "Wiadomość dla użytkownika:"&_ "Niepoprawna nazwa"
Else MsgBox vntReturnvalue End If
End Sub
Poniższy przykład pokazuje wykorzystanie metody Raise obiektu Err do ponownego wygenerowania błędu w procedurze zagnieżdżonej w celu przekazania obsługi błędu do procedury wywołulącej.
Function WywołanieBłędu()
' Deklaracja stałej reprezentującej błąd Const stala As Integer = 13
On Error GoTo wywołaj_błąd
' kod generujący błąd
Wyjście_z_procedury: Exit Function
Wywołaj_błąd: ' Sprawdzenie właściwości obiektu Err If Err = stała Then
' kod obsługujący błąd
Else ' Wygenerowanie pierwotnego błędu Dim NumerBł~du As Integer NumerBł~du = Err
Err.Clear Err.Raise NumerBłędu End If
h,fonnacje dotyczące serii "Pod lupą" są publikowane w internetowym serwisie WWW pod adresem: http://www.dornino.ok.pl/lupa
-48
Domino
6 y- n
3. Usuwanie i
resume Wyjście_z_procedury unction
lekcja Errors (DAO)
błędów
:ra wszystkie zachowane obiekty Error Każda operacja używająca obiekty iże generować jeden lub więcej błędów. Kiedy błąd się pojawi aparat obsługi ch (Jat) przechowuje obiekty Error w kolekcji Errors obiektu DBEngine.
,cja Errors posiada następujące metody i właściwości: ;siwości: Count
Refresh tabelka przedstawia właściwości obiektu Error:
OPIS
Opis n~ęau ~rancucn~
Indeks (zmienna tupu LonQ) informacji w pliku Pomocy Microsoft Windows
~vrnvaluE 'rnvalue) "_
ue )
Numer identyfikujący błąd.
Zwraca nazwa obiektu lub aplikacji, która spowodowała bł
. Obiekt Error nie posiada metod.
rzenie programu obsługi błędu
programów obsługi błędów składa się z trzech kroków:
nownego błędu do
wianie przechwytywania błędu; Lsanie procedury obsługuj ącej błąd;
ście z procedury.
~rvienie przechwytywania błędu (trap)
żeli procedura ma mieć zdolność przechwytywania błędów musi zawierać instrukIn Error, informującą Visual Basic gdzie szukać procedury obsługi błędu. InstrukIn Error musi zawierać etykietę lub numer linii odwołuj ącej się do linii kodu w tej ~ procedurze; instrukcja po etykiecie może się już odwoływać do innych procedur.
unie procedury obsługującej bład
sowa procedura obshzgi błędu składa się z instrukcji Sełect Case rozpoznających numery Err i sposoby ich obsługi.
ie z procedury
rży używać jednej z instrukcji Resume aby opuścić procedurę obsługi błędów nuować wykonanie programu, a gdy procedura obsługi nie może poradzić sobie m, do wyjścia z aplikacji.
lieiino.ok.pl/lupa je dotyczące serii "Pod lupą" są publikowane w internatowym serwisie W W W pod adresem: http://www.domino.ok.pl/lupa
-49
Microsoft Access 97 programowanie © Domino ly~,.,"~""
3.5.1. Inne metody obsługi błędów
Może się zdarzyć, że chcemy wyłączyć lub ograniczyć obsługiwanie błędów, np. przy prototypie, który zawiera jeszcze wiele błędów.
OSTRZEŻENIE. Obydwie techniki wyłączają możliwość obsługi błędów w procedurze; należy się upewnić, że zostaną usunięte przed wydaniem gotowej aplikacji. _.._
Wyłączenie obsługi błędów w procedurze
Następująca instrukcja na początku procedury wyłącza obsługę błędów w tej procedll~ZG:
On Error Go To 0
Obsługa błędów w linii
Można polecić aby Vi.st-~al Basie pominął linię w której wystąpił błąd instrukcją umieszczoną na początku modułu:
On Error Resume Next
Należy zauważyć, że technika ta może spowodować pominięcie wielu błędów. Jeżeli błąd pojawi się przy otwarciu pliku danych, konsekwentnie będzie się pojawiał przy innych działaniach na tym pliku i wszystkie te błędy zostaną ignorowane. Błędy będą niewidoczne bez jakiegoś sposobu ich rejestrowania.
UWAGA. Na zakładce Moduł (menu Narzędzia/opcje) musi być wyłączona opcja Przerywanie przy każdym błędzie aby przechwytywanie błędów pracowało popraw
mc.
Która obsługa błędów
W momencie gdy Visuczl 13c~.sic rozpozna błąd wykonania, poszukuje aktywnej obsługi błędów w:
· Bieżącej procedurze;
· Procedurach wymienionych na liście Wywołania (rozpoczynającej się od ostatnio wywołanej procedury);
· Obsh~dze błędów w ramach Vi.sual Basie, która przerywa wykonanie programu i wyświetla dialog z obsługą błędu.
3.5.2. Centralizacja obsługi błędów
Można scentralizować podstawową obsługę błędów aplikacji poprzez utworzenie głównej funkcji obsługującej błędy, informującej procedurę jak obsługiwać błąd.
Instrukcje Resume mówią procedurze jak powrócić z błędu. Jednakże ze względu na to, że instrukcje Resume mogą się pojawić tylko w procedurze zawierającej instrukcję On Error, trochę kodu obsługi błędów musi pozostać w każdej z procedur, tam, gdzie obsługa błędów jest konieczna.
Przykłady
Informacje dotyczące serii "Pod lupą" są publikowane w internatowym serwisie WWW pod adresem: http://www.domino.ok.pl/l~pa
-50
U Domino I 1999
3. Usuwanie i
błędów
~:b KodZObsługąbłędów ( )
On Error GoTo ObslBled
błędów, np. . , - Kod Procedury . . .
slBled .
'"ypBledu = Obsluga Blad(Err) 'wywołanie funkcji
ug i
bł
dów
ę 'obsługującej błąd
towej aplika-
Select Case TypBledu
Case 1
'Kod wznawiający wykonanie od tej samej linii która
'spowodowała błąd
w tej proce- - - -
Resume
Case 2
'Kod wznawiający wykonanie od nastypnej linii
Resume Next
Case 3
d instrukcją '
Kod wznawiaj ący wykonanie od konkretnej etykiety
Resume Etykieta 'zakładamy że etykieta ma
idów. Jeżeli nazwę "'Etykieta"
~-iał przy in- Case 4
Błędy będą ' Kod umożliwiaj ący eleganckie wyj ście z aplikacj i
- .d Select
vzona opcja ~ Sub
cło popraw
_ction Obsluga_Blad (Numer blady As Integer . wartość As Integer
lect Case Numer_Blad
ob- Case 11 'Dzielenie przez zero
'Dodatkowy kod niezbędny aby rozwiązać ten warunek
od ostatnio wartość -- 1
Case 53 ' Plik nie zost ał znaleziony
'Dodatkowy kod niezbędny aby rozwiązać ten warunek
programu
wartość -- 2
Case 71 'Dyskietka nie gotowa
'Dodatkowy kod niezbędny aby rozwiązać ten warunek
utworzenie wartość = 3
ąd.
Case Else 'Pozostałe przypadki
względu na 'Dodatkowy kod niezb~dny aby rozwiązać ten warunek
- instrukcję . . .
J
tam, gdzie wartość = 4
.d Select
sluga_Blad = wartość
Function
,mino.ok.pl/lupa ' dotyczące serii "Fod lupą" są publikowane w internetowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa
-51-
4. Programowanie obiektowe
finicje obiektu i kolekcji
sual Basie for Application obiekt jest to pewna całość, którą można sterować. m steruje się za pomocą jego atrybutów i akcji lub jego właściwości i metod. iowe obiekty to: Form, Report, Database.
I Basie for Application może odwoływać się do grupy podobnych obiektów śnie. W Microsoft Acce,ss kolekcja jest to zbiór powiązanych obiektów - np. e otwarte formularze.
~ zawierają zero lub więcej kolekcji różnych typów
;ty i kolekcje są powiązane ze sobą w następujący sposób. Kolekcje zawierają więcej obiektów tego samego typu. Obiekty zawierają zero lub więcej kolekcji typów.
ściwości i metody
1. Definicje właściwości i metody
imienie koncepcji właściwości i metod jest ważne, ponieważ jest to zasadnicza pracy z obiektami w kodzie Visual Basic,for Application. Właściwości dotyczą Tego co odnosi się do stanu obiektu. Metody są to akcje, które obiekt może
rystkie obiekty mają swoje właściwości. Właściwości opisują stan obiektu. Właici są podobne do pól w strukturze danych: zawsze posiadaj ą tylko jedną wartość. i`vości mogą być: tylko-do-odczytu, odczyt-zapis, tylko-do-zapisu. Właściwości mieć różne typy danych: zwykle są to łańcuch, liczba.
iana wartości własności narusza stan obiektu. Na przykład ustawiaj ąc własność formularza można uczynić go widocznym lub ukrytym:
s!NazwaFormularza.Visible = True / False
Mody wykonują pewne działanie na obiektach lub kolekcjach. Każdy obiekt ma metod, którymi potrafi się posługiwać. Metody te są jedynym sposobem oddzia~ia na obiekty.
~iekty zewnętrzne nie mogą bezpośrednio zmienić właściwości obiektu. Mogą tyl~.vołać metodę tego obiektu co oznacza zamiar zmiany tego obiektu.
~ms!NazwaFormularza.Recalc
dotyczące serii "Pod lupą" są publikowane w internetowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa -55
Microsoft Access 97
wanle
C Donuno
4.2.2. Właściwości i metody kolekcji
Obiekty zawarte w innych obiektach są pogrupowane w kolekcje. Większość kolekcji jest obiektami tak samo jak regały są obiektami zawierającymi książki. Ponieważ kolekcja jest obiektem, każda kolekcja w Microsoft Access posiada własne właściwości i metody. Każda kolekcja posiada dokładnie jedną właściwość Count. Właściwość ta określa liczbę obiektów zawartych w kolekcji. Natomiast metody mogą być różne dla różnych kolekcji.
Przykładowe metody:
· Append-dodaje obiekt do kolekcji; · Delete-usuwa obiekt z kolekcji
· Refresh-aktualizuje kolekcję i wszystkie zmiany wprowadzone do członków kolekcji
4.3. Model obiektów Microsoft Access
Rozdział ten omawia model obiektów programu Micr~~.snft Acce.s.s oraz wyjaśnia ich strukturę. Szczególna uwaga jest poświęcona obiektowi Applicatiort oraz jego właściwościom i metodom.
4.3.1. Struktura obiektów
Hierarchiczna struktura obiektów i kolekcji
Microsoft Access łączy ze sobą obiekty i kolekcje w hierarchiczną strukturę. Obiekty Microsoft Access reprezentują w kodzie elementy aplikacji, które zazwyczaj sterowane są przez użytkownika jako interfejs użytkownika. Hierarchia obiektów określa, które obiekty mogą zawierać inne obiekty.
Ubiekt Applieation jest najwyższym obiektem w hierarchii i zawiera wszystkie pozostałe obiekty i kolekcje.
Obiekt Applicalion odnosi się do całej aktywnej aplikacji Microso/t Access. Używa się obiektu Applicationz aby odwołać się do metod lub ustawienia właściwości całej aplikacji. Np. można użyć właściwości Menul3ar aby ustalić własny pasek menu dla całej aplikacji. Można również użyć metody SetOption aby ustawić parametry aplikacji w okienku dialogowym Opcje.
Przykład
Application.SetOption "Pokaż Pasek Stanu", True
4.3.2. Właściwości i metody obiektu Application
Poniższy przykład ustawia filtr dla formularza. Filtr ten pozwala użytkownikowi wybrać z tabeli Product.s rekordy spełniające określone kryteria.
Informacje dotyczące serii "Pod lupą'' są publikowane w internatowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa
-56
Domino ~ 4. Programowanie obiektowe
SetFilter() ~m frm As Form, strMsg As String
ększość kolek- im strInput As String, strFilter As String ~ki. Ponieważ Cmd.OpenForm "Products"
e właściwości t frm = Forms ! Products
«-łaściwość ta rMsg = "Wprowadź jedną lub więcej liter nazwy" _ być różne dla & "produktu zakończonych gwiazdką. " ~.rInput = InputBox(strMsg) trFilter=BuildCriteria("ProductName", dbText, strInput) rm.Filter = strFilter
rm.FilterOn = True Sub
~do członków ~iższa tabela przedstawia właściwości obiektu Application:
- I ATRYBUTY I OPIS
wyjaśnia ich ~eotName read-onl Zwraca nazwę ak ne o obiektu baz dan ch.
jego właści- ~ectT e read-onl Zwraca t akt wne o obiektu baz dan ch
read/write Określa pasek menu lub makro paska menu, które
uruchomione wyświetla pasek menu użytkownika
dla baz dan ch.
rcad-onl Re rezentu'e Microsoft Jet database en ine.
'ższa tabela przedstawia metody obiektu Application:
ę. Obiekty
j sterowane METODY OPIS
eśla
któ
,
re '
e
Zwraca bieżącąwartośe arametru z okna dialo owe o O c
z Ustawia bieżącą wartość parametru z okna dialogowego Opcje
~ stkie po-
_ eria Pozwala łatwo skonstruować kryterium filtra na podstawie danych
e.v.s. Uiywa wejściowych użytkownika. Wyrażenie analizowane jest tak samo
-ości całej jakby było ustawione w siatce zapytań lub w filtrze w widoku for-
mularza
menu dla .
_- aplikacji entDatabase Zamyka bieżącą bazę danych z innej aplikacji, która otworzyła tą
bazę o rzez mechanizm automat zac~i automat zaca OLE .
entDatabase Otwiera istniejącą bazę danych jako bieżącą. Można ją użyć aby
otworzyć bazę z innej aplikacji, która steruje Micro.softAcces.s po-
rzez mechanizm automat zac~i (automat zaca OLE ).
entDatabase Tworzy nową bazę danych w oknie Microsoft Access. Można ją
użyć aby utworzyć nowąbazę z innej aplikacji, która steruje
Microsoft Access poprzez mechanizm automatyzacji (automatyza-
ikowi wy- c'a OLE ),
WorkspaceClone Tworzy nowy obiekt Workspace bez konieczności ponownego lo-
owania uż tkownika do nie'.
A METODY OPIS
Określa czy Microsoft Access odświeża lub aktualizuje ekran kom-
utera
~iino.ok_pl/lupa eje dotvezące serii ..Pod lupą" są publikowane w internetowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa
-57-
Microsoft Access 97 programowanie © D~mino - ".
Quit Wyjście z Microsoft Access. Przed wyjściem można zastosować ~edną z kilku o c~i za isania baz dan ch.
RefreshTitleBar Odświeża pasek tytułowy Microsoft Access po zmianie ustawieni właściwości A Title lub A Icon w kodzie Visual Basie.
Run Uruchamia procedurę Sub lub Function Microsoft Access lub użw kownika. Metoda ta jest używana do sterowania Mierosoft Acces~ z poziomu innei aplikach poprzez mechanizm automatyzacji.
4.4. Model obiektów DAO
Dodatkowo, prócz obiektów zdefiniowanych w Microsoft Acce,s.s, Micrn.sott Jet databa.se c:n~line definiuje oddzielne obiekty kontroluj ące pracę elementów aplikacji zarządzających danymi, takich jak: tabele, kwerendy, relacje, indeksy.
4.4.1. Idea modelu DAO
System obiektów dostępu do danych (Data Access Objects, DAO) pozwala na stosowanie języka programowania w celu uzyskiwania dostępu i manipulowania danymi zawartymi w lokalnych lub zdalnych bazach danych oraz w celu zarz ądzania bazami danych, ich obiektami i strukturą. Model DAO składa się z hierarchicznie zorganizowanych kolekcji i obiektów oraz powiązanych z nimi metod i właściwości.
Obiekty DAO najczęściej wykorzystane są do:
· Manipulowania danymi;
· Przeprowadzania transakcji; · Ustawiania uprawnień;
· Do tworzenia nowego obiektu dostępu do danych.
Terminologia Przy programowaniu w Micrn.soft Acces.s istotnym jest zrozumienie idei
i terminologii obiektowego dostępu dodanych. Oto najważnięjsze terminy:
· Databa.se Engine (Aparat Obslugi Baz Danych): Jest to aparat obsługi baz danych używany przez Mice°n.snft Access 97 i Microsnft Vi.sual Ba.sic 4.0.
· System Bai. Danych: Składa się przynajmniej z aparatu obsługi baz danych, systemowej bazy danych i bazy danych użytkownika.
· Użytkownik: Użytkownik DAO to projektant tworzący kod przy pomocy DAO. Istnieje również obiekt o nazwie User opisany w tym module, który odnosi się do wszystkich zarejestrowanych w systemie bazy danych osób.
Informacje dotyczące serii "Yod lupą" są publikowane w internatowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa
-58
Domino 1~
na zastosować ~.4.2. Struktura hierarchiczna DAO
ugnie ustawi ~l Basie. Access lub i ~crosoft Acc rnatyzacii.
licrosoft Jet aplikacji za
a na stosodanymi zabazami darąanizowa
3999
4.
ie obiektowe
unrnri~e
WorkSpases
Databases QuehDets C
Irxiexes Rekk Pararreters Rlds
rn~rs Recordsets Relatiors Corrtainers
Felds Fel Docttrerrts
Users ~ ~ Gros
GrouFs ~ ~ Users
ura kontenerowa
;kty mogą zawierać inne obiekty. Na przykład, baza danych zawiera tabele. er bazuje na strukturze kolekcji obiektów, związanych z obiektem nadrzędnym.
a aplikacja, będąca w tym środowisku Aparatem obsługi bazy dahych jest najj zewnętrznym obiektem. Jest to jedyny obiekt, którego nie zawiera żaden inny Czasami aplikacja może służyć jako miejsce przechowywania wszystkich glos właściwości i obiektów. Inicjalizacja Aparatu obsługi bazy danych ivvości systemowe są związane z obiektem aplikacji DBEngine.
-ginie idei wą formą jest nawigacja z jednego poziomu hierarchii na sąsiedni. Rozpoczyokreślenia obiektu kontenera (na przykład bazy danych), następnie musimy
danych jedną z jego zawartości (czyli definicji tablicy TableDe,~. Znakiem nawigacji Basie: jest kropka '.'. Stąd, jeżeli db jest nazwą bazy danych to leDefs ( "Moj aTablica" ) jest tablicą o nazwie MojaTablica przechowydanych, tej bazie danych.
używamy kropki w celu dostępu do członków kolekcji i nie podamy żadnej koy DAO. onsultowana jest wtedy kolekcja Properties (właściwości). Na przykład, jeżeli si się do łaściwość Nazwa i pole Nazwa, następujący kod zwróci zawsze wartość wła-Nazwa
swartosc$ = MojeRekordy.Nazwa
n przykładzie, jest zwracana wartość właściwości Nazwa, ponieważ operator ze zmusza obiekt do sprawdzenia danej nazwy członka najpierw w kolekcji
ok.pl/lopa yczącc serii "Pod lupą" są publikowane w internetowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa
-59
<O Dominc 4W Mierosoft Access 97 programowanie
4.5. DAO: obiekty wysokiego poziomu
W hierarchii DAO obiektami i kolekcjami najwyższego poziomu są: DBEngine. Workspaces, i Databases. DBEngine jest najbardziej zewnętrznym obiektem, zawierającym wszystkie inne obiekty. Obiekt Workspace odnosi się do sesji aparatu obsługi bazy danych i jest jedynym obiektem stworzonym przez DBEngine. Obiekt Database reprezentuje dowolną otwartą bazę danych i jest stworzony przez Workspaces.
4.5.1. Obiekt DBEngine
Obiekt DBEngine reprezentuje aparat obsługi bazy danych Microso/~t Jet i jest obiektem najwyższego poziomu w hierarchii DAO. Jako obiekt najwyższego poziomu w hierarchii DAO, zawiera i kontroluje wszystkie inne obiekty w hierarchii. Obiekt DBEngine nie jest elementem żadnej z kolekcji.
Obiekt DBEngine służy do kontroli nad aparatem obsługi bazy danych, manipulowania jego właściwościami i ustawiania domyślnego obiektu Workspace (obszar roboezy). Obiekt DBEngine jest obiektem predefiniowanym i nie można stworzyć dodatkowego obiektu DBEngine.
Aby odwołać się do kolekcji obiektu DBEngine lub aby odwołać się do jego metody lub właściwości , należy użyć następującej składni:
DBEngine.[kolekcjalmetodalwłaściwość]
Właściwości DBEngine
Każdy obiekt DAO posiada kolekcj ę Properties. Właściwości mogą być definiowane przez użytkownika, lub przez poszczególne obiekty DAO. Właściwości DAO są zawsze
obecne jako domyślne i nie mogą być zmieniane. Ze względu na to że DBEngine jest obiektem najwyższego poziomu i nie ma reprezentacji na dysku, to właściwości ustawiane przez użytkownika nie mąją tu zastosowania.
Właściwości obiektu DBEngine
NAZWA ATRYBUTY OPIS
Version read-only Identyfikuje wersję produktu uruchomionego aparatu obsługi bazy danych Microsoft Jet
~stemDB I read/write ~ Zwraca i ustawia ścieżkę do pliku bieżącej systemowej bazy.
Metody obiektu DBEngine
NAZWA OPIS
Idle Zawiesza przetwarzanie danych, umożliwiając aparatowi obsługi bazy da nych zakończenie oczekujących zadań. Właściwość używana głównie do blokad.
Com actDatabase DefraQmentu~e baz dan ch Microsoft Access R~airDatabasc Na rawia bazę dan ch Microsoft Access
RegisterDatabasc Wprowadza informacje dotyczące połączenia dla źródła danych typu OD do liku ODBC.INI.
CreateWorksoace Otwiera nowy obiekt Worksbace.
lnPormacje dotyczące serii "Pod lupą" sąpubhkowane w internetowyrn serwisie WWW pod ztdresem: http://www.domino.ok.pl/lupa
O Domino 1999
4. Pro
ie obiektowe
stałe kolekcje DBEngine
iekt DBEngine posiada również kolekcje Workspaces i Errors. Domyślną koleksą: DBEngine, BEngine jest Workspaces. Poniższy fragment kodu pozwala na dostęp do domyślktem, zawiera- estrzem roboczej (Workspace). Indeksowanie elementów w kolekcji rozpoczyna aparatu obsługi Q nie 1. Zerowy element określa najwcześniej otwarty obiekt Workspace.
iekt Database
races. ' m Moj aWorkSp As Workspace
t MojaWorkSp = DBEngine.Workspaces(0)
ając metody CreateWorkspace obiektu DBEngine można utworzyć nowy Workspace. Przykładowy kod tworzy nowy obiekt Workspace o nazwie Nowa~soft Jet i jest rzen i ustawia właściwość UserName na gue s t z pustym hasłem.
czego poziomu
rarchii. Obiekt WSp As Workspace Sp=DBEngine.CreateWorkspace("NowaPrzestrzen","guest","") ch, manipul o
~'obsZar r°b°- 5.2. Kolekcja Workspaces ss-orzyć dodat
estrzeń robocza (Workspace) definiuje sesję Micro.soft Access. Każda przestrzeń o jego metody oddzielnego użytkownika i hasło. Dodatkowo, transakcje w każdej przestrzeni zależne. Kolekcja Workspaces zawiera wszystkie aktywne, nieukryte obiekty
cja Workspaces posiada następujące metody i właściwości: tody:Append, Refresh;
'ć definiowane aściwości: Count. AO są zawsze
)BEngine jest ślna przestrzeń robocza 5~ciwości Lista
myślna przestrzeń robocza jest to sesja, którą rozpoczyna automatycznie Microet kiedy po raz pierwszy ma odwołanie do obiektowego dostępu do danych hormonym kodzie. Można jawnie określić użytkownika i hasło ustawiając odpo-o własności UserName i Password. Jeśli nie określi się użytkownika wówczas
' databa.se erZgine inicjalizuje sesje z ustawieniami: UserName=Admin, ord=N u 11.
paratu obsługi
żna stworzyć listę obiektów Workspace przeglądając kolejno kolekcję paces.
emowcj baz .
I -- 0 To DBEngine.Workspaces.Count -1 Debug.Print DBEngine.Workspaces(I).Name xt I
tsługi bazy da workspace la głównie do
iekt Workspace nieprzerwanie odgrywa rolę kontenera względem otwartych baz h i rejestruje wszystkie transakcje, identyfikując bezpieczeństwo operacji na bazie h we wszystkich używanych kontekstach.
vch typu OD ~żej znajduje się tabelka zbierająca właściwości związane z obiektem - pace:
~mino.ok.pl/lupa e dotyczące serii "Pod lupą" są publikowane w internatowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa
-61
Microsoft Access 97 programowanie © Domin Wir.
WŁAŚCIWOŚĆ NOWY WORKSPACE OPIS
WORKSPACE
Name odczyt-zapis tylko-do-odczytu Wyrażenie łańcuchowe, jednoznac~
nie iden fiku'ące Works ace
UserName odczyt-zapis tylko-do-odczytu Wyrażenie łańcuchowe określające
nazwę użytkownika, dla którego zo
stanie skonstruowan Works ace
lsolateODBC- odczyt-zapis odczyt-zapis Zawiera wartość logiczną decydują
Trans o izolowaniu kolejnych transakcji
korzystających z tej samej bazy da-
nych ODBC.
Poniższa tabelka wymienia niektóre metody obiektu Workspace
METODA OPIS
Clone Zakończenie ses'i obszaru robocze o
O enDatabase Otwiera bazę dan ch i doda'e 'ą do kolekc'i Databases CreateDatabase Tworz nową bazę dan ch.
BeginTrans Początek transakcji w obszarze robocz m
CommitTrans ~ Zatwierdzenie zmiany w obszarze roboczym
Tworzenie dodatkowych baz danych (Databases)
Obiekt Workspace pozwala tworzyć dodatkowe obiekty baz danych (Database) Można otworzyć lub utworzyć dodatkowe obiekty baz danych (Database) z obiektu Workspace Każda dodatkowa baza danych jest dostępna tylko poprzez kod. Jest ona niedostępna poprzez interfejs użytkownika Microsoft Acce.s.s. Daje to większą elastyczność twórcom aplikacji.
Poniższy kod pokazuje jak stworzyć bazę danych:
Dim WS As Workspace Dim DB As Database
Set WS = DBEngine.Workspaces(0)
Set DB = WS.CreateDatabase("new.mdb",dbLangGeneral)
UWAGA. Stała dbLnn~General przekazująca wartość dla argumentu miejsce (locale) i określająca porządek sortowania dla tworzonej bazy danych. Trzeba podać ten argument, albo pojawi się błąd. __
4.5.3. Kolekcja Databases
Kolekcja Databases zawiera wszystkie otwarte bazy danych w sesji aparatu obsługi baz danych. W Microsoft Access obiekt zerowy (0) jest zawsze bieżącą bazą danych. Zamknięcie bazy danych usuwa ją z kolekcji.
UWAGA. Należy zauważyć, że kolekcja jest upakowana aby wypełnić miejsce po usuniętym elemencie, zatem nie jest możliwe odwołanie się do usuniętego elementu. Próba odwołania się wywoła błąd InValid Object. Domyślną kolekcją obiektu Workspace jest kolekcja Databases.
Informacje dotyczące serii "Pod lupą" są publikowane w internetowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa
-62
O I7ornino
4. Programowanie obiektowe
posiada następujące właściwości i metody:
i: Count.
kład tworzy listę nazw baz danych w kolekcji Databases.
DBEngine.Worspaces(0).Databases.Count -1 :g.Print DBEngine.Worspaces(O).Databases(I).Name
~ase reprezentuje otwartą bazę danych i jest tworzony za pomocą metose w obiekcie Workspace. Przy użyciu metod i właściwości można ma~~artej bazie danych. W obiekcie Database można sprawdzać kolekcje, :ormacje o tabelach, kwerendach, relacjach, formularzach i raportach. uźyć tych kolekcji do modyfikowania lub tworzenia nowych tablic, za
e służy do usuwania obiektu Database z kolekcji Databases bez usuwanie z dysku. Poprzez Database ( 0 ) odwołujemy się do bieżącej bazy :ostałych baz danych, które stworzyliśmy i chcemy otworzyć, odwołuz właściwość Name w następujący sposób:
("Nazwa") _· odwoływać się również poprzez indeks: (0)
(1) (x)
u Database
ATRYBUT OPIS
Tylko-do-Odczytu Przy porównywaniu lub sortowaniu łańcuchów, okre-
śla wa i oszcze óln eh znaków w tekście
Tylko-do-Odczytu Podaje informację o źródle danych, którym może być
otwarta baza danych, wynik zapytania z bazy danych,
'c~cale) załączona tablica
arg u-
T lko-do-Odcz tu Nazwa bazy danych
odczyt-zapis Ustawia lub zwraca wartość określającą liczbę sekund
oczekiwania przez Aparat bazy danych Microsoft Jet
przed wystąpieniem błędu przekroczenia limitu czasu
bsługi w konania kwerend w bazie ODBC.
m
ch
y
.
ATRYBUT OPIS
Tylko-do-Odczytu Zwraca wartość określającą, czy obiekt obsługuje
1 usu- i transakcje (rollback, commit)
Próba ' T~-lko-do-Odczytu Określa, kiedy obiekt Database może być modyfiko-
iiektu
wan
_p,? lupa aga ~W lupą ~ są publikowane w internetowym serwisie WW W pod adresem: l,ttp:~IWWW.dOTT,Ino.Ok.plIlLlpa
-63-
Microsoft Access 97
Tamowanie
~O Domino
Version T lko-do-Odcz tu Określa wers~ę formatu dan ch otwarte ba dan~ AccessVersion Tvlko-do-Odczytu Określa wersie JET, w którei utworzono baze dan
Metody obiektu Database
nnrooa loes
Clone Execute OpenRec ordset CreateProperty CreatcRelation CreateTableDef CreateQueryDef
Zamknięcie bazy danych Wykonanie zapytania
Otworzenie nowego zbioru rekordów Utworzenie nowego obiektu Property Utworzenie nowego obiektu Relation Utworzenie nowego obiektu TableDef Utworzenie nowego obiektu QueryDef
Pełną listę wlaściwości i metod można odnaleźć w pomocy podręcznej. Oto przykład tworzenia tabeli w kodzie.
Dim MojaDB As Database Dim MojaTbl As TableDef
Set MojaDB = DBEngine.Workspaces(0).DataBases(0) Set MojaTbl = MojaDB.CreateTableDef("NowaTabela")
4.6. Praca z tabelami, polami i indeksami
Rozdział ten dotyczy obiektów i kolekcji, które pozwalają na manipulowanie tabelami, polarni i indeksami z poziomu kodu.
4.6.1. Kolekcja TabIeDefs
W kolekcji TableDefs znajdują się wszystkie tabele zawarte w bazie danych (obiekty TebleDef) oraz kolekcje Pields i Indexes. Database jest obiektem wysokiego poziomu, który zawiera w sobie kolekcję TableDefs.
Kolekcja ta posiada następujące metody i właściwości: · Metody: Append, Delete, Refi-esh;
· Właściwości: Connt.
Liczenie obiektów TabIeDef w kolekcji TabIeDefs
Właściwość Count kolekcji TableDefs podaje liczbę tabel w bazie danych.
Dim MojaDb As Database
Set MojaDb = DBEngine.Workspaces(0).Databases(0) Debug.Print MojaDb.TableDefs.Count
Inlorrnacje dotyczące serii "Pod lupą" są publikowane w internetowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa
-64
Domino
4. Programowanie obiektowe
baz dan .2. Obiekt TabIeDef
bazę dan ' kt TableDef definicje struktury tabeli. Reprezentuje on zapisaną definicję tabeli -owej albo tabeli przyłączonej. Można manipulować definicją tabeli używając TableDef, jego właściwości i metod.
niektóre z wlaściwości obiektu TableDef:
NOWY ( ISTNIEJAt
CY Odczyt-zapis Tylko-do
odcz tu Odczyt-zapis Odczyt-zapis
Na- Odczyt-zapis Tylko-doodcz tu
TRUE Tylko-doodczytu
ZAŁĄCZONY
Odczyt-zapis
Tylko-doodczytu Odczyt-zapis
FALSE
ule Odczyt-zapis Odczyt-zapis Tylko-doodezytu
z rnctod obiektu TableDef:
~ manipulowa
OPIS
OPIS
Źródło załączonej tabeli
Nazwa tabeli lub zalącze nia
Nazwa tabeli źródłowej w tablicach załączonych
Określenie możliwości zmiany definicji tabeli obiektu TableDef
Określa wyrażenie, które musi być prawdziwe aby zakońezvć metode UDdatt
Uruchomienie kwerebdy, lub otwarcie bazy dan Utworzenie-pustego obiektu Field
Utworzenie pustego obiektu Propert Utworzenie buste~o obiektu Index
i-ch (obiekty
~ą0 pOZlOrllu,
lnie indeksów
utworzyć pola indeksowane najpierw trzeba mieć dostęp do obiektu TableDef nie postępować zgodnie z podanymi krokami:
metody Createlndex aby stworzyć indeks;
iczyć pole do indeksu używając metody CreateField do stworzenia pola dla ktu Index;
iczyć pole do kolekcji pól Fields obiektu Index; oczyć indeks do kolekcji Indexes obiektu TableDef. miższym przykladzie tworzony jest indeks z pola tablicy:
NowyIndeks ()
dbs As Database, tdf As TableDef, idx As Index
-~ ych
dbs = CurrentDb
tdf = dbs.TableDefs!Pracownicy
m zla ~s riela
stawienie wskaźnika obiektu Database na bieżącą bazę
.ok.pl/lupa dotyczące serii "Pod lupek' są publikowane w internetowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa
Microsoft Access 97
wanie
~O Domine
Set idx = tdf.CreateIndex("Indeks Nazwisko") Set fld = idx.CreateField("Nazwisko") idx.Fields.Append fld
tdf.Indexes.Append idx End Sub
Tworzenie właściwości pola przez użytkownika
W poniższym przykładzie tworzona jest nowa właściwość, ustawiana jej wartość początkowa oraz dodana do kolekcji Properties obiektu TableDef.
Sub NowaWłaściwość
Dim dbs As Database, tdf As TableDef, prp As Property 'Ustawienie wskaźnika obiektu Database na bieżącą baztr danych
Set dbs = CurrentDb
Set tdf = dbs.TableDefs!Zamówienia
'Tworzenie nowej właściwości, określenie typy: 'i ustawienie wartości początkowej
Set prp = tdf.CreateProperty("OstatnioZachowane", dbText,"Nowa") 'Dodanie do kolekcji Properties obiektu TableDef tdf.Properties.Append prp
End Sub
4.6.3. Przykłady użycia obiektu TabIeDef
Poniższe przykłady przedstawiaj ą różne możliwości wykorzystania obiektu TableDef.
Tworzenia nowej tablicy z poziomu kodu
T7odawana jest tabela NnwaTa>7ela wraz z polem Nazwisko.
Function TworzenieTbl ()
Dim MyDb As Database, Dim MyTbl As TableDef Dim I As Integer
Set MyDb = DBEngine ( 0 ) ( 0 )
Set MyTbl = MyDb.CreateTableDef("NowaTabela") Set MyFld = MyTbl.CreatField("Nazwisko", dbText) MyTbl.Fields.Append MyFld
MyDb.TableDefs.Append MyTbl End Function
Przeglądanie tabel niesystemowych w bazie Function NieSystemoweTabele()
Dim MyDb As Database, I As Integer Set MyDb = DBEngine(0)(0)
For I = 0 To MyDb.TableDefs.Count -1
If Left(MyDb.TableDefs(I).Name, 4) <> "msys" Then Debug.Print MyDb.TableDefs(I).Name
End If
Informacje dotyczące serii "Pod lupą" są publikowane w internetowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa
-66
Domino
4. Programowanie obiektowe
~ion
li z bazy poprzez kod
przykładzie usuwana jest tabela o nazwie Tablical: UsunTabele ( )
'~~ej wartość po B As Database = Integer
B = DBEngine(0)(0) MyDB.TableDefs.Count - 1 To 0 Step -1 '=operty MyDB.TableDefs(I).Name = "Tabelal" Then
eżącą bazi MyDB.TableDefs.Delete MyDB.TableDefs(I).Name Exit Function
ei I f typu tion
- olekcja Fields
ields zawiera wszystkie przechowywane obiekty typu Field należące do erend, zestawów rekordów oraz tabel. Kolekcja Fields należąca do Index, QueryDef, Relation i TableDef zawiera wszystkie specyfikacje ów. Kolekcja Fields obiektu typu Recordset reprezentuje obiekty typu danych.
obiektu posiada następujące metody i właściwości: pend, Delete, Refresh;
liści: Count.
prrykład kodu powoduje wyświetlenie w oknie bezpośrednim liczbę pól
r. LiczbaPol ( ) DB As Database As Integer
As Integer
) DB = CurrentDb
- 0 To MyDB.TableDefs.Count - 1
Bebug.Print "Table: " & MyDB.TableDefs(I).Name Debug.Print MyDB.TableDefs(I).Fields.Count .ction
Obiekt Field
~" Then
s;
używane właściwości obiektu Field:
ok.pl/lupa _ czące serii "Pod lupą" s~ publikowane w internetowym serwisie W W W .pod adresem: http://www.domino.ok.pl/lupa 67
.~ Microsoft Access 97 programowanie
Domin;
· DataUpdatable; · OrdinalPosition.
Nu~cztścao~ uż3-wunc metody vb~cKtu F3Gld:
· AppendChunk; · CreateProperty; · FieldSize;
· GetChunk.
Kompletne listy właściwości i metod obiektu Field można znaleźć w Pomocy hasłem Field-obiekt.
Następująca funkcja wyświetla nazwy wszystkich pól każdej tabeli w bazie: Function NazwyPol()
Dim MyDB As Database Dim I As Integer Dim J As Integer
Set MyDB = CurrentDb
For I = 0 To MyDB.TableDefs.Count - 1
For J = 0 To MyDB.TableDefs(I).Fields.Count - 1 Debug.Print MyDB.TableDefs(I).Fields(J).Name Next J, I
End Function
4.6.6. Kolekcja Indexes
Kolekcja Indexes zawiera przechowywane obiekty typu Index , po jednym dla każdego indeksu zdefiniowanego w tabeli. Nie ma żadnego predefiniowanego porządku przechowywania członków kolekcji. Można dodawać, usuwać i modyfikować jeśli właściwośe Updatable obiektu TableDef jest ustawiona na True.
Kolekcja Indexes posiada następujące metody i właściwości:
· Metody: Append, Delete, Refresh; · Właściwości: Count.
Wykaz indeksów w tabeli
Poniższy przykład wyświetla listę indeksów tabeli:
Function Indeksy() Dim MyDB As Database Dim MyTbl As TableDef Dim I As Integer
Set MyDB = CurrentDb
Set MyTbl = MyDB.TableDefs("Tabela2") For I = 0 To MyTbl.Indexes.Count - 1 Debug.Print MyTbl.Indexes(I).Name Next I
End Function
Informacje dotyczące serii "Yod lupą" są publikowane w internetowym serwisie W W W pod adresem: http://www.domino.ok.pl/lupa
-68
~O Domino
4. Programowanie obiektowe
Obiekt Index
ex określa porządek ułożenia rekordów otrzymanych z tabeli bazy danych czy baza akceptuje duplikaty czy nie. Obiekt Index również przyspiesza vch.
d funkcji tworzącej indeks w istniejącej tabeli Tabela2
_ NowyIndeks ( )
3 As Database, MyTbl As TableDef Mld As Field, MyInd As Index
DB = CurrentDb
mocy pod ~bl = MyDB.TableDefs ("Tabela2")
=~d = MyTbl . CreateIndex ("PrimaryKey" ) r-imary = True
Fcequired = True
l:'ld = MyInd.CreateField("ww", dbText) ~'ields.Append MyFld
iadexes.Append Mylnd ction
Kolekcja Properties i obiekt Property .Name
- kt DAO posiada kolekcję właściwości. Właściwości mogą być zdefiniokownika lub DAO (wbudowane). Można użyć kolekcji Properties aby
dowane właściwości obiektu i zdefiniowane przez użytkownika. Właśeii dla każ- są zawsze prezentowane jako domyślne i nie mogą być zmieniane. porządku
jeśli wła- rty
operty reprezentuje wbudowany lub zdefiniowany przez użytkownika DAO. Następująca tabelka przedstawia właściwości obiektu Property O, dla których można definiować własne właściwości:
OBSŁUGIWANA PRZEZ Database
lndex
QueryDef TableDef Field obiekt w kolekcji Fields obiektów TableDef i OuervDef
a z kwerendami, kontenerami i relacjami
~drozdział opisuje kolekcje i obiekty, które generalnie towarzyszą pracy ami, kontenerami i relacjami. Tak jak i w poprzednim podrozdziale najpierw jest kolekcja a potem jej obiekty.
bntino.ok.pl/lupa _ czące serii "Pod lupą" są publikowane w internetowym serwisie WWW pod adresem: http://www.dornino.ok.pl/lupa
-69
Microsoft Access 97 programowanie © Domin -. C.
4.7.1. Kolekcja QueryDefs i obiekt QueryDef
Kolekcja QueryDefs zawiera wszystkie obiekty QueryDef w obiekcie Database. gdzie obiekt QueryDef definiuje kwerendę w bazie danych.
Każdy obiekt kolekcji QueryDefs zawiera kolekcje Fields, Parameters, Properties. Kolekcja Fields opisuje zbiór obiektów Field , jeden obiekt dla każdego pola w kwerendzie. Porządek sortowania członków kolekcji jest zgodny z wartością własności OrdirtalPosition każdego obiektu Field.
Kolekcja Parameters opisuje zbiór obiektów Parameter, jeden członek dla każdego parametru w kwerendzie. Jest to kolekcja tylko-do-odczytu. Kolekcja Parameters jest domyślną kolekcją obiektu QueryDef.
Kolekcja Properties dotyczy kolekcji właściwości dla obiektu QueryDef Obiekt QueryDef obsługuje właściwości zdefiniowane przez użytkownika.
Obiekt QueryDef odpowiada przechowywanej w bazie danych definicji kwerendy. Zapisana kwerenda jest skompilowana do postaci instrukcji j ęzyka SQL. Instrukcja SQL dla nowej kwerendy nie jest skompilowana dopóki nie jest zapisana lub choć raz uruchomiona. Można czytać i modyfikować instrukcję SQL, ustawiać parametry obiektu QueryDef i uruchamiać kwerendę.
Poniższa tabelka przedstawia właściwości obiektu QueryDef:
NAZWA ISTNIEJ C Typc Tylko-do
odcz tu SQL Odczyt/lapis
NOWY C OPIS
Tylko-do- Typ kwerendy (wybierająca, aktualizująodcz tu ca, ...).
Odczyt/lapis Określa instrukcję SQL definiującąkwe
Updatable Tylko-do- TRUE ~ Określa czy definicja kwerendy jest mody odczytu fikowalna
Poniższa tabelka przedstawia metody obiektu QueryDef:
NAZWA
Close OpenRecordset
Execute
OPIS Zamyka obiekt OuervDef
Tworzy nowy obiekt Recordset i dołącza go do kolekcji Recordsets zgodnie z instrukcja SOL.
Uruchamia kwerendę funkcjonalną lub wykonuje instrukcję SQL w stosunku do obiektu Database.
Przykład procedury tworzącej nowe zapytanie o danej instrukcji SQL i nazwie:
Sub NoweZapytanie()
Dim MyDB As Database, MyQuery As QueryDef Dim Nazwa As String, SQL As String
Nazwa = "Stan magazynowy przypraw" SQL = "SELECT
Produkty.NazwaProduktu,Produkty.StanMagazynu EROM Produkty" & " WHERE Produkty.IDkategorii=2"
Set MyDB = DBEngine(0)(0)
Set MyQuery = MyDB.CreateQueryDef(Nazwa, SQL)
Informacje dotyczące serii "Pod lupą" są publikowane w internatowym serwisie WWW pod adresem: http:l/www.domino.ok.pl/lupa
O Domino
4. Pro
.~IOS2
enQuery Nazwa Database
obiektowe ,
. Properties. lekcja Containers i obiekt Container każdego pol
:ością własno- iners dotyczy kolekcji wszystkich zapisanych obiektów zdefiniowaych, zaś obiekt Container kolekcjonuje informacje o bazie danych iektu, który ona zawiera.
dla każdego
~ameters jest gine obsługuje różne kontenery zawierające relacje, formularze, kwe~uje swoje własne kontenery, które rezyduj ą w oknie bazy danych . itd.). Kontenery przechowuj ą obiekty Document.
yDef. Obiekt
posiada następujące metody i własności: - ji kwerendy.
L. Instrukcja
lub choć raz Count.
ć parametry ers zawiera kolekcje Documents i Properties.
ents dotyczy kolekcji wszystkich logicznie pogrupowanych ~w dokumentów. Na przykład kontener Forms grupuje wszystkie
aktualizują- posiada następujące metody i własności: iującą kwe
Count. Iy jest mod rties dotyczy kolekcji właściwości związanych z obiektem - ktu Container nie można definiować własnych właściwości. przedstawia właściwości obiektu Container:
OPIS Określa nazwę kontenera.
ordsets zgo is Określa nazwę właściciela kontenera. Właściciel może być zmienion o rzez zmianę te~ właściwości.
SQL is Reprezentuje użytkownika lub grupę użytkowników podczas ustawiania praw dostenu obiektu Container.
e
Ustanawia uprawnienia dla użytkownika lub grupy identyfikowanych przez własność UserName obiektu Container lub Document.
Przyjmuję wartość typu Boolean, która jeśli ustawiona oznacza, że każdy nowy obiekt tworzony w tym kontenerze będzie dziedziczył uprawnienia ustawione dla nowelo dokumentu.
Al/lupa - ~,Pc~3 h~ą" są publikowane w internetowym serwisie WWW pod adresem: http:l/www.domino.ok.pl/lupa - %1
Microsoft Access 97
wanie
Domin..
Obiekt Container kolekcjonuje informacje o bazie danych lub każdym typie jęv obiektu: wszystkie jej zachowane formularze, makra, moduły, relacje, raporty lub tabele (włączając kwerendy).
Każdy obiekt Database posiada pojedynczą kolekcję kontenerów. Kontenery pracują w połączeniu z obiektami Doczement aby wyliczyć wszystkie przechowywane w baziz obiekty, włączając w to obiekty zdefiniowane przez aplikacje typu klient. Na przykład MS Aceess definiuje kilka kontenerów: formularze, raporty, moduły. Jet database engine też definiuje swoje własne kontenery jak tabele, relacje.
Obiekty Docurrzent i C'orztainer wykorzystywane są głównie do wyliczania wszystkich obiektów (definiowanych przez aplikacje i .fet database eyzgir~e) przechowywanych w bazie i ustawienie uprawnień użytkowników i właścicieli. Nic można stworzyć lub usunąć Containers czy Documents.
Jet database erigine definiuje kilka obiektów Containers. M,S' Access definiuje kilka dodatkowych obiektów Container. Poniższa tabela przedstawia każdy z tych obiektów:
NAZWA POCHODZENIE OPIS
Database Jet database en ine Za isane baz dan ch.
For~ns MS Access Za isane formularze
Modules MS Access Za isane moduł
Rclationshi Jet database enQine Za isane relac~e
Re orts MS Access Za isane ra ort
Scri ts MS Access Za isane makra
Tables Jet database en~ine Za isane tabele i kwerend
MS Access również definiuje i używa inny obiekt typu Container, SysRel aby zdefi
niować układ w systemowym oknie relacji. Zwykle nie jest używany ani modyfikowany.
4.7.3. Kolekcja Relations i obiekt Relation
Kolekcja Relations zawiera przechowywane obiekty Relation, włączając kolekcje Fields i Properties.
Kolekcja Fields przechowuje wszystkie zachowane obiekty Field należące do obiektów: Index, QueryDęf, Recordset, Relation i TableDęf.
Kolekcja Fields posiada następujące metody i właściwości:
· Metody: Append, Delete, Refresh; · Właściwości: Count.
Kolekcja Properties dotyczy kolekcji wszystkich obiektów Property dla istniejących egzemplarzy danego obiektu. Kolekcja Properties posiada te same metody i właściwości co kolekcja Fields.
Każdy obiekt Databa.se posiada pojedynczą kolekcję obiektów Relation. Obiekt Relation jest używany do informowania Jet database engine o istniejącej relacji pomiędzy polami dwóch obiektów typu TableDef .
lnformac_je dotyczące serii "Pud lupą" są publikowane w internetowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa
-%2
<·~ D«rnino 4. Programowanie obiektowe ;
.,
~zn typie je żliwośe wymuszenia pewnych uaktualnień lub usunięć danych powiąza-
try lub tabele - relacji (więzy integralności). Nazywa się to wymuszonąrelacjąponieważ
~ngine sam wymusza te zasady.
ery pracuj -nież zdefiniować relacje pomiędzy QueryDefs (lub połączenia do
e w bazi bazie danych), nie wymuszają one więzów integralności. Relacje takie są
-a przykła połączeniach omijających porządek bazy danych.
ba,se ergi- Lka przedstawia właściwości obiektu Relation.
'a wsz
st
y ISTNIEJ CY OPIS
wywanych
orzyć lub zyt/Zapis Tylko-do- Nazwa odwołania. Umożliwia zmianę nazwy
odcz tu relac'i.
iuje kilka zydZapis Tylko-do- Nazwa tabeli podstawowej (odwołującej).
obiektów: odez tu
v_ t/Zapis Tylko-do- Nazwa tabeli obcej (odwoływanej)
odcz tu
zwt/Zapis Tylko-do- Zawiera informacje o typie relacji
właściwości są tylko-do-odczytu, kiedy są przechowywane w relacji. Aby Relation trzeba usunąć ten obiekt z bazy danych i odtworzyć go na no
ktu Relation - CreateField - tworzy każdy pusty obiekt Field. procedury wyświetlającej wszystkie relacje w bazie i ich właściwości aby zdefi- ~ j e 1 ( )
yfikowa- As Database,MyRel As Relation,MyProp As Property Integer, J As Integer
DB = DBEngine(0)(0)
- 0 To MyDB.Relations.Count - 1 Ecel = MyDB . Relations ( I )
kolekcje .Tint , MyRel.Name
- 0 To MyRel.Properties.Count - 1 żące do et MyProp = MyRel . Properties (J) ebug.Print MyProp.Name, MyProp.Value J, I
~iejących metody
Obiekt pomię
1~'-uk.pl/lupa _-czące serii "Pod lupą" sąpuhlikowane w internetowynt serwisie WWW pod adresem: http://www.domino.ok.pl/lupa
- 73 4. Programowanie obiektowe
Next I
End Function
suwanie tabeli z bazy poprzez kod
W poniższym przykładzie usuwana jest tabela o nazwie Tablical:
1 Po
fzę
Function UsunTabele() Dim MyDB As Database Dim I As Integer
Set MyDB = DBEngine(0)(0)
For I = MyDB.TableDefs.Count If MyDB.TableDefs(I).Name MyDB.TableDefs.Delete Exit Function
End If Next I
End Function
4.6.4. Kolekcja Fields
1 To 0 Step -1 - "Tabelal" Then
MyDB.TableDefs(I).Name
Kolekcja Fields zawiera wszystkie przechowywane obiekty typu Field należące do leksów, kwerend, zestawów rekordów oraz tabel. Kolekcja Fields należąca do iektów typu Index, QueryDef, Relation i TableDef zawiera wszystkie specyfikacje l tych obiektów. Kolekcja Fields obiektu typu Recordset reprezentuje obiekty typu Mld wiersza danych.
Fieids posiada następujące metody i właściwości:
Metody: Append, Delete, Refresh; Właściwości: Count.
Poniższy przykład kodu powoduje wyświetlenie w oknie bezpośrednim liczbę pól idei tabeli:
Function LiczbaPol() Dim MyDB As Database Dim I As Integer Dim J As Integer
Set MyDB = CurrentDb \
For I = 0 To MyDB.TableDefs.Count - 1
Debug.Print "Table: " & MyDB.TableDefs(I).Name Debug.Print MyDB.TableDefs(I).Fields.Count Next I
End Function
4.6.5. Obiekt Field
Najczęściej używane właściwości obiektu Field:
· Attributes;
· Name;
Sub Relacje2 ( )
Dim MojaRelacja As Relation Dim MojaBD As Database
Dim MojePole As Field
Set MojaBD = DBEngine(0)(0)
' Utworzenie nowego obiektu Relation.
Set MojaRelacja=MojaBD.CreateRelation("Praczam") MojaRelacja.Table = "Pracownicy" MojaRelacja.ForeignTable = "Zamówienia"
Set MojePole=MojaRelacja.CreateField("IDpracownika" MojePole.ForeignName = "IDpracownika"
'Zachowanie definicji pola przez dołączenie go 'kolekcji Relations.
MojaRelacja.Fields.Append MojePole
'Zachowanie definicji relacji przez dołączenie jej 'kolekcji Relations
MojaBD.Relations.Append MojaRelacja End Sub
do
do
5. Praca- z
1. Definicja kolekcji Recordsets
ią Recordsets
Rozdział ten poświęcony jest użyciu obiektów typu Recordset w kodzie do pracy danymi.
5.1.1. Obiekty Recordset w hierarchii DAO
Omówiona w tym miejscu będzie pozycja kolekcji Recordsets i obiektów Recordset v hierarchii DAO oraz właściwości i metody obiektów Recordset.
Kolekcja Recordsets zawiera obiekty Recordset i posiada następujące metody właściwości:
Metody: Refresh; Właściwości: Count.
Obiekt Recordset reprezentuje rekordy tabeli podstawowej lub rekordy będące wyniiem uruchomionej kwerendy. Obiekt Recordset zawiera kolekcję Fields.
Recordset ma następujące właściwości:
AbsolutePosition ustawia lub zwraca względny numer rekordu dla bieżącego obiektu Recordset.
Sort ustawia lub zwraca porządek sortowania dla rekordów w obiekcie Recordset.
Recordset posiada następujące metody:
GetRows pobiera wiele wierszy Recordset do tablicy.
Requery odświeża dane w obiekcie Recordset poprzez ponowne uruchomienie kwerendy, na której obiekt jest oparty.
W poniższym przykładzie tworzony jest Recordset nazwany Dostawcy sortowany według pola NazwaFirmy:
UtworzZestaw ( )
Dim db As Database, rst As Recordset, Set db = CurrentDb
Set rst = db.OpenRecordset("Dostawcy", rst.Sort = "NazwaFirmy"
Set rstSort = rst.OpenRecordset() Sub
5.1.2. Co to jest obiekt Recordset
Omówiona jest tu definicja obiektu Recordset, który w rzeczywistości jest zbiorem :ordów zachowującym się jak obiekt. Korzystając z obiektów DAO, do manipulowa. danymi w tabelach bazy danych. używa się przede wszystkim zestawów danych
Obiekt Recordset reprezentuje rekordy tabeli bazowej lub wynik uruchomionej kweidy. Może również odwoływać się do niektórych lub wszystkich pól lub rekordów innym obiekcie Recordset lub może być wynikiem wykonania instrukcji SQL.
rstSort As Recordset
dbOpenDynaset)
Microsoft Jet database engine konstruuje wszystkie obiekty Recordset używając rekordów (wierszy) i pól (kolumn).
Domyślną kolekcją obiektu Recordset jest kolekcja Fields i domyślną właściwością obiektu Field jest właściwość Value. Można uprościć kod używając tych domyślnych elementów. Na przykład we wszystkich poniższych liniach kodu ustawiana jest wartość pola PubID w bieżącym rekordzie obiektu Recordset:
'~i
rstPublisher!PubID = 99 rstPublisher("PubID") - 99 rstPublisher.Fields("PubID").Value = 99
5.1.3. Typy obiektów Recordset
Omówione są tu trzy typy obiektów Recordset: Table (tabela), Dynaset (dynamiczny zestaw) i Snapshot (zestaw utrwalony) - oraz opisane różnice pomiędzy nimi, jak również sytuacje kiedy użyć każdy z typów.
· Table (tabela) Obiekt Recordset typu table reprezentuje w kodzie podstawową tabelę, którą można użyć do dodawania, zmieniania, usuwania rekordów z pojedynczej tabeli bazy danych;
· Dynaset (dynamiczny zestaw rekordów) Obiekt Recordset typu dynaset jest to wynik kwerendy, który może zawierać aktualizowalne rekordy. Obiekt Recordset typu zestaw dynamiczny jest dynamicznym zestawem rekordów, który można stosować do dodawania, zmiany lub usuwania rekordów z określonej tabeli lub tabel bazy danych. Obiekt Recordset typu zestaw dynamiczny może zawierać pola jednej lub więcej tabel bazy danych;
· Snapshot (utrwalony zestaw rekordów) Obiekt Recordset typu snapshot jest to statyczna kopia zestawu rekordów, którą można stosować do wyszukiwania danych lub generowania raportów. Obiekt Recordset typu utrwalonego może zawierać pola jednej lub więcej tabel bazy danych, nie może jednak być uaktualniany.
Praca z zestawem utrwalonym jest często szybsza niż z tabelą lub zestawem dynamicznym, ponieważ zawiera on tylko statyczną kopię zestawu rekordów takich jakimi były one w momencie tworzenia utrwalonego zestawu. Operacje typu sortowanie i indeksowanie wykorzystują procesor znacznie więcej niż przeglądanie utrwalonego zestawu rekordów.
UWAGA. Obiekt Recordset typu utrwalony zestaw rekordów zawiera całe dane (wszystkie pola) podczas gdy obiekt Recordset typu zestaw dynamiczny tworzy tylko zbiór kluczy. Dlatego też Recordset, który zawiera dużą liczbę rekordów zwiększa zużycie procesora.
Użycie odpowiedniego typu obiektu Recordset zależy od celu: czy dane mają być modyfikowane czy tylko przeglądane:a
5. Praca z kolekcją Recordsets
izować rekordy bazuj ąc na wybranej kwe
vac z potączoną >;anelą
przeglądać lub skopiować zestaw rekordów zv to lokalnych iak i nołaczonvch tabel)
UŻYWA SIF RECORDSET Dynaset (Dynamiczny zestaw)
Dynaset (Dynamiczny zestaw Snapshot (Utrwalony zestaw)
skot (Utrwalony zestaw
.2. Tworzenie obiektów Recordset
W rozdziale tym omawiane są różne sposoby tworzenia obiektów Recordset.
5.2.1. Metoda OpenRecordset
Aby użyć obiektu Recordset należy najpierw stworzyć zmienną typu obiekt Recordset.
Tworzenie zmiennej typu obiekt Recordset
Aby utworzyć zmienną typu obiekt Recordset używa się metody OpenRecordset obiektu Recordset. Aplikacja może zawierać tyle zmiennych typu obiekt Recordset ile potrzebuje.
Metoda OpenRecordset jest również wykorzystywana przez następujące obiekty:
· Database; · TableDef;
QueryDef.
Aby stworzyć zmienną typu obiekt Recordset należy: Zadeklarować zmienną typu Recordset;
· Ustawić zmienną na obiekt zwracany przez metodę OpenRecordset. Składnia metody OpenRecordset dla wszystkich obiektów jest następująca:
Set zmienna = obiekt.OpenRecordset([typ[,opcje]])
Przykład składni dla obiektów Database
Set zmienna = database.OpenRecordset(źródło,[typ[,opcje]])
Argument typ metody OpenRecordset jest to wewnętrzna stała pozwalająca zaprojektować typ obiektu Recordset. Jeśli typ nie jest określony, Microsoft Jet databa.se engine wybiera, jeden z typów w następującej kolejności:
1. Tabela;
2. Zestaw dynamiczny; 3. Zestaw utrwalony.
W metodzie OpenRecordset dozwolone są następujące stałe:
· dbOpenTable;
· dbOpenDynaset;
· dbOpenSnapshot;
· dbOpenForwardOnly.
Argument opcje pozwala sterować wielodostępnością obiektu Recordset. Może być pusty lub zawierać jedną z następujących stałych:
ARGUMENT OPIS
DbAppendOnly Pozwala użytkownikom na dołączanie nowych rekordów do obiektu Reeordset, uniemożliwiając im jednak edycję lub usuwanie istniejących rekordów (dotyczy tylko obiektów Recordset typu zestaw d amiczn obsłu iwan ch rzez a arat Microsoft Jet).
DbForwardOnly Tworzy obiekt Recordset typu progresywnego (dotyczy tylko obiektów Recordset typu utrwalonego aparatu Microsoft Jet). Opcja ta jest dostępna tylko dla zachowania zgodności
z poprzednimi wersjami; zamiast niej w argumencie typ należy stosować stałą db0 enForwardOnl .
DbSQLPassTrought Przekazuje instrukcję SQL do przetwarzania w źródle danych ODBC dołączonym do aparatu (dotyczy tylko obiektów Recordset t u utrwalone o obsłu Iwan ch rzez a arat Microsoft Jet).
DbSeeChanges Powoduje pojawienie się błędu wykonania, jeśli jeden użytkownik zmienia dane, które są już poddawane edycji przez innego użytkownika (dotyczy tylko obiektów Recordset typu zestaw dynamiczny obsługiwanych przez aparat Microsoft Jet). Jest to przydatne w aplikacjach, w których wielu użytkowników ma jednocześnie dostę do ch sam ch dan ch w tr bie za isu i odcz tu.
DbDenyWrite Zabezpiecza przed modyfikowaniem lub dodawaniem rekordów przez innych użytkowników (dotyczy tylko obiektów Recordset a aratu Microsoft Jet).
DbDenyRead Zabezpiecza przed czytaniem danych w tabeli przez innych użytkowników (dotyczy tylko obiektów Recordset typu tabela aparatu Microsoft Jet).
DbReadOnly Zabezpiecza przed wprowadzaniem przez użytkowników zmian do obiektu Recordset (tylko aparat Microsoft Jet). Stała dbReadOnly jako argument blokada zastępuje tę opcję; jest ona dostępna tylko dla zachowania z odności z o rzednimi wersami.
DbInconsistent Dopuszcza uaktualnienia niespójne (dotyczy tylko obiektów Recordset typu zestaw dynamiczny i utrwalonego obsługiwanych rzez Microsoft Jet).
DbConsistent Dopuszcza tylko uaktualnienia spójne (dotyczy tylko obiektów Recordset typu zestaw dynamiczny i utrwalonego obsługiwanych rzez Microsoft Jet).
Microsoft Jet database engine (aparat bazy danych Microsoft Jet) przechowuje dynamiczne i utrwalone obiekty Recordset w lokalnej pamięci operacyjnej. Jeśli nie ma dość miejsca w pamięci aby przechowywać dane, aparat bazy danych p~zechoa-uje dodatkowe dane na dysku Jeśli miejsca na dysku jest zbyt mało pojawi się bid
UWAGA. Jeśli używa się zmiennej do reprezentacji obiektu R~caor~set i obiektu Database, który zawiera Recordset należy zapewnić tym zmie»ym »e same zasięgi
Ją ą P zY użyć słowa kluczowego
Przykład zestawy ~ ap~ttego na tabeli Zamówienia:
3 Praca z kolekcją Recordsets
i żywotność. Na p _ się zmienną publiczną do reprezentowania ,;,
obiektu Recordset ' publicznej do reprezentowania bazy danych, która ten Recordsti ~ 'e deklaru' c zmienn w rocedurze nale
Dim MyDB As Database, rstZamowienia As Recordset Set MyDB = CurrentDB
Set rstZomowienia = MyDB.OpenRecordset("Zamówienia")
5.2.2. Przykłady różnych obiektów Recordset
Obiekt Recordset można utworzyć z tabeli, kwerendy oraz formularza. Rodzaj tworzonego obiektu Recordset zależy od działań jakie mają być wykonywane na danych. Przedstawione zostaną tu dwa przykłady różnych sposobów tworzenia obiektu Recordset. Pierwszy używa zachowanej kwerendy do utworzenia obiektu Recordset, drugi używa już istniejącego obiektu Recordset jako bazy nowego Recordset.
Poniższy przykład kodu tworzy obiekt Recordset, który zwraca wiersze oparte na zachowanej kwerendzie:
Dim Db As Database Dim Rst As Recordset Set Db = CurrentDB
Set Rst = Db.OpenRecordset("qryKlienci")
Obiekt Recordset oparty na istniejącym obiekcie Recordset
Czasami jest słusznym utworzyć obiekt Recordset oparty na innym obiekcie Recordset. Na przykład w sytuacji kiedy użytkownicy mają różne prawa dostępu i trzeba umożliwić niektórym przeglądanie danych bez możliwości wprowadzania zmian. W takiej sytuacji można z istniejącego dynamicznego zestawu utworzyć zestaw utrwalony dla tych użytkowników.
Ponieważ źródło danych jest już określone nie trzeba określać go ponownie przy tworzeniu obiektu Recordset opartego na istniejącym obiekcie, jak to pokazano w poniższym przykładzie:
Set Db = CurrentDB
Set Rstl = Db.OpenRecordset("Klienci",DbOpenDynaset) Rstl.Sort = "Kraj"
Set Rst2 = Rstl.OpenRecordset(DbOpenSnapshot)
Można używać właściwości Sort zarówno z zestawami dynamicznymi jak i utrwalonymi. Posortowanie ukaże się kiedy zostanie utworzony kolejny obiekt Recordset. W powyższym przykładzie Rst2 jest obiektem Recordset, który jest posortowany. Właściwość Sort ustawiona jest dla Rstl a Rst2 jest obiektem Recordset utworzonym z Rstl.
UWAGA. Często szybciej jest utworzyć nowy obiekt Recordset opierając się na instrukcji SQL z klauzulą Order niż sortować istniejący używając właściwości Sort. Na przykład: SQL = "SELECT * FROM Pracownicy ORDER BY Miasto" .
5.2.3. Tworzenie obiektu Recordset z użyciem SQL
Omówiony tu będzie sposób tworzenie obiektów Recordset pyry użyciu łańcucha SQL (Structured Query Language). Łańcuch SQL używa się do tworzenia obiektów Reeordset w sytuacjach gdy tworzone są tymczasowe kwerendy lub gdy kryteria kwerend zmieniają się w zależności od wyborów na formularzu.
Poniższym przykładzie tworzony jest obiekt Reeordset na bazie instrukcji SQL.
Dim Db As Database Dim Rst As Recordset Dim SQLStr As String Set Db = CurrentDB
SQLStr = "SELECT * FROM Pracownicy ORDER BY Mias_o" Set Rst = Db.OpenRecordset(SQLStr)
5.3. Manipulowanie obiektami Recordset
Mając utworzony obiekt Recordset można na różne sposoby manewrować i manipulować rekordami w bazie danych.
5.3.1. Sortowanie i filtrowanie rekordów
Omówione będą tu procesy sortowania i filtrowania przeprowadzane na zestawach rekordów przy użyciu Visual Ba.sic. Procesy sortowania i filtrowania można przeprowadzić tylko na zestawach dynamicznych i utrwalonych.
Należy albo określić porządek sortowania lub ustawić filtr na obiekcie Recordset aby zapewnić określony porządek ułożenia lub właściwy wybór podzbioru rekordów.
Sortowanie Najbardziej wydajnym sposobem sortowania i filtrowania rekordów w obiekcie Recordset jest:
· Otworzenie Recordset z obiektu QueryDef lub przechowywanej kwerendy;
· Użycie nowej instrukcji SQL jako źródła Recordset. wykorzystując słowa kluczowe SQL WHERE i ORDER BY.
W poniższym przykładzie użyto instrukcji SQL aby otrzymać i uporządkować rekordy:
Sub WybierzSortuj()
Dim db As Database, rst As Recordset Set db = CurrentDb
Set rst = db.OpenRecordset("SELECT Nazwisko, Imię FROM Pracownicy WHERE Tytuł='Manager' ORDER BY Nazwisko") End Sub
Właściwość Sort pozwala ustawić porządek posortowania rekordów w obiekcie Recordset. Właściwość ta ma zastosowanie tylko do zestawów dynamicznych i utrwalonych. Domyślnie rekordy posortowane są rosnąco.
UWAGA. Samo ustawienie właściwości Sort nie powoduje uporządkowania rekordów. Dopiero przy tworzeniu nowego Recordset kryterium to zostanie wykorzystane.
Informacje dotyczące serii "Pod lupą" są publikowane w internetowym serwisie WWW pod adresem: httpv!!wwH.domino.ok.pl/lupa
-82
> 1999 ~ Domino 1999 5. Praca z kolekcją Recordsets
Filtrowanie
Filtrowanie rekordów jest podobne do ich sortowania. Filtrowanie wymaga określenia kryterium, które ogranicza rekordy będące częścią obiektu Recordset.
Poniższy przykład pokazuje jak użyć właściwość Filter aby otrzymać rekordy klientów, którzy mieszkają w określonym mieście, w tym przypadku w Londynie:
Rst.Filter = "[Miasto] - 'Londyn "' Set RstWybrany = Rst.OpenRecordset
5.3.2. Określanie granic obiektów Recordset
Każdy Recordset obsługuje dwie właściwości BOF i EOF, które określają czy bieżący rekord jest na końcu (EOF), czy na początku (BOF). Określenie granic Recordset jest ważne, ponieważ przy próbie przekroczenia granicy wywoływany jest błąd wykonywania. Używając właściwości BOF i EOF można przechwycić błąd korzystając z procedur obsługi błędów.
Określanie początku i końca zestawu rekordów
Przy kolejnym przeglądaniu wszystkich rekordów w Recordset można użyć właściwości BOF i EOF do programowego sprawdzania końca i początku obiektu Recordset. Po utworzeniu obiektu Recordset bieżącym rekordem jest pierwszy rekord, jeśli są jakieś rekordy w zestawie. Jeśli nie ma rekordów właściwość RecordCount ustawiona jest na 0 oraz właściwości BOF i EOF ustawione są na True.
W następującym przykładzie drukowane są w oknie Analiza programu wszystkie wartości IDKategorii z tabeli Kategorie:
Sub Wydruk()
Dim rst As Recordset Dim db As Database Set db = CurrentDb
Set rst = db.OpenRecordset("Kategorie") Do While Not rst.EOF
Debug.Print rst![IDkategorii] rst.MoveNext
Loop rst.Close
End Sub
5.3.3. Poruszanie się w Recordset
Kiedy jest już stworzony obiekt Recordset Aparat obsługi baz danych (Microsoft Jet database engine) dostarcza kilku metod umożliwiających nawigację między wierszami, tzn.: MoveNext, MovePrevious, MoveFirst oraz MoveLast. Metody te zmieniają pozycję wskaźnika rekordu.
Sub Nawigacj a ( )
Dim db As Database Dim rst As Recordset Set db = CurrentDb
Set rst = db.OpenRecordset("qryKlienci")
Informacje dotyczące serii "Pod lupą" są publikowane w internetowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa
-83
Microsoft Access 97 programowanie © Domino ~
If rst.RecordCount > 0 Then rst.MoveLast Do While Not rst.BOF
Debug.Print rst![NazwaFirmy] rst.MovePrevious
Loop End If
End Sub
Właściwość RecordCount obiektu Recordset nie zwraca rzeczywistej liczby wierszy w Recordset. Zwraca liczbę rekordów w obiekcie Recordset, do których został wykonany dostęp. W przypadku obiektu Recordset typu tabela i obiektu TableDef zwraca całkowitą liczbę rekordów.
Aby znaleźć rzeczywistą liczbę wierszy w Recordset (który nie jest typu tabela) należy użyć metody MoveLust przed sprawdzeniem wartości właściwości RecordCount. Jeśli nie przesunie się wskaźnika do ostatniego wiersza właściwość RecordCount
przyjmuje wartość 0 jeśli nie ma żadnych wierszy lub liczbę wierszy, do których był wykonany już dostęp. Na przykład jeśli jest 200 rekordów w Recordset i dostęp był wykonany tylko do 5 to RecordCount zwraca wartość 5. Dlatego też by otrzymać poprawną liczbę rekordów należy wykonać metodę MoveLast przed sprawdzeniem właściwości RecordCount.
Istnieje możliwość utworzenia Recordset, który nie zwraca żadnych wierszy co może mieć wpływ na dalsze operacje wykonywane na tym obiekcie. Należy użyć poniższego wyrażenia aby sprawdzić czy Recordset jest pusty:
If rst.RecordCount = 0
5.3.4. Szukanie rekordów
Sposób szukania specyficznych danych w Recordset zależy od typu Recordset. Recordset typu tabela używa indeksów do szukania, ale dynamiczne i utrwalone zestawy nie mogą ich używać. Jednak Aparat obsługi baz danych (Microsoft Jet database engine) pozwala na dużo bardziej dogodne wyszukiwania w dynamicznych i utrwalonych zestawach. Cztery rożne metody typu Find (FindFirst, FindNext, FindPrevious, FindLast) pozwalają zoptymalizować przeszukiwania najmniejszej liczby rekordów aby znaleźć potrzebne dane.
Metody FindFirst, FindNext, FindPrevious, FindLast używane w dynamicznych i utrwalonych zestawach Recordset pozwalają zlokalizować rekord spełniający określone kryteria. Jeśli Aparat obshxgi baz danych nie znajdzie odpowiedniego rekordu to ustawia wartość właściwości NoMatch na True. Dla Recordset typu tabela rekordy można przejrzeć używając metody Seek.
Metody typu Find pozwalają zoptymalizować przeszukiwania najmniejszej liczby rekordów aby znaleźć potrzebne dane. Używając metody FindNext nie trzeba wracać do początku zestawu aby znaleźć następny rekord spełniający kryteria.
Dla wszystkich metod Find używa się tej samej składni:
Recordset.FindFirst kryterium
gdzie Recordset jest zmienną typu Recordset reprezentującą otwarty dynamiczny lub utrwalony zestaw a kryterium jest klauzulą WHERE w takiej postaci jak wyrażenie
Informacje dotyczące serii "Pod lupą" są publikowane w internetowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa
-84
y ,~~n ~ 999 5. Praca z kolekty Recordsets
SQL z klauzulą WHERE. Na przykład poniższy fragment kodu poszukuje rekordów, w których pole Nazwisko przyjmuje wartość Smith:
rst.FindFirst "[Nazwisko]='Smith "'
W poniższym przykładzie procedura otwiera obiekt Recordset, lokalizuje każdy remd dla którego pole Stanowisko spełnia określone kryterium i kopiuje go do bufora. astępnie rekord jest edytowany, zmieniana jest wartość pola Stanowisko oraz zmiany Ichowywane są przy pomocy metody Update.
Stanowiska() Dim dbN As Database, rstP As Recordset Dim strK As String, strNoweStan As String 'Ustawienie kryterium
strK = "Stanowisko ='Przedstawiciel handlowy "' 'Ustawienie nowego stanowiska
strNoweStan = "Zarzadca"
Set dbN = DBEngine(0).OpenDatabase("C:\Northwind.mdb") 'Stworzenie zestawu
Set rstP = dbN.OpenRecordset("Pracownicy", dbOpenDynaset) rstP.FindFirst strK 'szukanie pierwszego pasującego 'Przeglądanie aż do nie pasujacego rekordu
Do Until rstP.NoMatch With rstP
.Edit 'Umożliwienie edycji
.Stanowisko = strNoweStan 'Zmiana stanowiska .Update 'Zachowanie zmian
.FindNext strK 'Znalezienie następnego
suj ącego
End With Loop
d Sub
Użycie kwerendy aktualizującej do zmiany wartości pola Stanowisko jest bardziej :ktywne. Na przykład użycie następującego kodu:
ich
strSQL = "Update Prosownicy Set Stanowisko = 'Zarządca "' & "WHERE Stanowisko = 'Przedstawiciel handlowy "'
Użycie metody Seek
Aby zlokalizować określony wiersz w utworzonym obiekcie Recordset typu tabela można użyć metody Seek. Metoda Seek pozwala na wykorzystanie indeksów co przyspiesza proces szukania danych. Próba użycia metody Seek do innych Recordset niż tabela powoduje wygenerowanie błędu numer 3219 (Invalid Operation).
Aby użyć metody Seek do szukania danych należy:
· Ustawić właściwość Index dla obiektu Recordset.Informuje to MS Access, który indeks będzie wykorzystany do poszukiwań. Aby użyć klucza podstawowego trzeba znać jego nazwę;
· Podać operator wyszukiwania i jedną lub więcej wartości, które są szukane.
Informacje dotyczące serii "Pod lupą" są publikowane w internetowym serwisie W W W pod adresem: http://www.domino.ok.pl/lupa
-85
Microsoft Access 97 programowanie
Operator wyszukiwania to jeden z następujących _- jak MS Access ma przeszukiwać rekordy: <, <_, _, >_, >. Dla ~ aparat bazy danych szuka od początku obiektu Recordset. W innym pni ska od końca i cofa się. Należy określić dla MS Access kryteria szukaj ~r~i~ć jodną lub kilka wartości odpowiadających kluczom we wskazanym inde~c.
Aby sprawdzić czy rzeczywiście został znaleziony wiesz ~ właściwości NoMatch obiektu Recordset.
Poniższa procedura demonstruje szukanie przy pomocy SetJt pierwszej firmy, której nazwa zaczyna się na B
Sub Szukanie()
Dim db As Database, rst As Recordset Set db = CurrentDb
Set rst = db.OpenRecordset("Dostawcy") rst.Index = "NazwaFirmy"
rst.Seek ">_", "B" If rst.NoMatch Then
MsgBox "Nie można znaleźć" Else
MsgBox "Nazwa firmy: " & rst![NazwaFirmy] End If
End Sub
5.4. Aktualizowanie obiektów Recordset
Aplikacje typu bazy danych muszą umożliwiać dodawanie, aktualizowanie oraz usuwanie danych. Aparat obsługi baz danych (Microsoft Jet database engine) dostarcza metody do wykonania każdego z tych zadań. W rozdziale tym zostaną omówione różne metody pozwalające na manipulowanie danymi.
5.4.1. Dodawanie rekordów
Omówiony tu będzie proces dodawania rekordów do obiektów Recordset typu tabele i dynamiczny zestaw danych. Nie można dodawać, modyfikować i usuwać rekordów w utrwalonych zestawach obiektu Recordset.
Możliwość dodawania rekordów do tabeli poprzez kod daje większą elastyczność w rozbudowie aplikacji.
Dodawanie wierszy do Recordset wymaga wykonania następujących kroków:
· Użycie metody AddNew aby dodać rekord.Wartości wszystkich pól ustawione są na Null.
· Ustawienie właściwych wartość dla pól.
· Użycie metody Update aby zachować nowy rekord.Jeśli pominie się przywołanie metody Update przed opuszczeniem bieżącego rekordu aparat bary danych odrzuci wszystkie zmiany a tym samym nie doda nowego rekordu.
Kiedy użyje się metody AddNew bieżącym rekordem jest rekord, który był bieżący przed dodaniem nowego rekordu. Aby nowy rekord stał si ę rekordem bieżącym trzeba użyć metody Move, określając jako jej argument wskaźnik zwracany przez właściwość LastModi~ed obiektu Recordset.
Informacje dotyczące serii "Pod lupą" są publikowane w internetowym serwisie WWW pod :i~~~ _,~~a~ino.ok.pl/lupa
-86
I9~u
D Domino 1999 5. Praca Z kolekcją Recordsets Poniższa procedura tworzy nowy rekord w tabeli Pracownicy, wprowadza wartości
i pyta się użytkownika czy zachować zmiany. Jeśli użytkownik nie chce zachowywać zmian metoda Update jest anulowana.
Sub NowyRekord()
Dim db As Database, rst As Recordset
Set db = CurrentDb
Set rst = db.OpenRecordset("Pracownicy")
With rst
'Dodanie nowego rekordu na końcu obiektu Recordset .AddNew
.[Nazwisko] - "Krzysztof" .[Imię] - "Kowalski"
. [DataUrodzenia] - DateSerial (1969, 3, 4) End With
'Pytanie użytkownika o zachowani zmian
If MsgBox("Czy zachować zmiany?", vbYesNo) - vbNo Then 'Użytkownik wybrał Nie, anulowanie zmian rst.CancelUpdate
Else
'Użytkownik wybrał Tak, zachowanie zmian
rst.Update End If
db.Close End Sub
Obiekt Recordset typu zestaw dynamiczny inaczej traktuje nowe rekordy niż obiekt Recordset typu tabela. Poniższa tabela przedstawia różnice pomiędzy tymi dwoma typami obiektów Recordset.
TYPU TABELA
RECORDSET TYPU ZESTAW DYNAMICZNY
obsługi baz danych umieszcza nowy w odpowiednim miejscu w indeksie.
la to, że właściwość Index będzie zmie
nie mogą zobaczyć nowych rei nie odświeżą rekordów.
Aparat obsługi baz danych umieszcza nowy rekord zawsze na końcu Recordset.
Aparat obsługi baz danych umieszcza nowy rekord do nodstawowei tabeli.
5.4.2. Edycja rekordów
Proces zmieniania rekordów jest podobny do dodawania rekordów do obiektu Recordset typu zestaw dynamiczny. Przemieszcza się do lub dodaje żądany wiersz, edytuje dane lub dodaje wartości do pól rekordów oraz używa metody Update aby zachować zmiany.
Modyfikacja rekordów
Należy wykonać wszystkie poniższe kroki kiedy modyfikuje się Recordset w, przeciwnym razie można otrzymać niepożądane wyniki. Najważniejszym krokiem jest krok 4. Jeśli wykona się zmiany w rekordu, a ominie wywołanie metody Update
Informacje dotyczące serii "Pod lupą" są publikowane w internatowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa
Microsoft Access 97 programowanie © Domino ~ ~~~
aby zachować zmiany, aparat obsługi baz danych potraktuje wiersz tak jakby w nim nie dokonano żadnych zmian.
Aby zmienić dane w modyfikowalnym Recordset należy:
· Przej ść do rekordu, który ma być zmieniany;
· Użyć metody Edit aby ustawić bieżący rekord w trybie edycji;
· Wykonać żądane zmiany;
· Użyć metody Update aby zachować zmiany.
Poniższa procedura zamienia w tabeli Klienci wszystkie wystąpienia wartości Londyn na Rzym w kolumnie Miasto.
Sub Zmiany()
Dim db As Database, rst As Recordset Set db = CurrentDb
Set rst = db.OpenRecordset("Klienci") rst.Index = "Miasto"
rst.Seek "_", "Londyn" Do While Not rst.NoMatch rst.Edit rst!Miasto = "Rzym" rst.Update rst.Seek "_", "Londyn"
Loop rst.MoveFirst Do While Not rst.EOF
Debug.Print rst![Przedstawiciel], rst!Miasto rst.MoveNext
Loop End Sub
5.4.3. Kasowanie rekordów
Kasowanie rekordów jest nieodwracalną operacją bez ostrzeżeń i potwierdzeń użytkownika - chyba, że wykonane w ramach procesu transakcji. W tym przypadku można cofnąć transakcje aby odzyskać skasowane wiersze.
Za pomocą metody Delete można skasować istniejący w obiekcie Recordset typu tabela lub dynamiczny zestaw rekordów. Nie można skasować rekordów z obiektu Recordset typu zestaw utrwalony.
Aby skasować rekord z Recordset należy:
· Przej ść do rekordu, który ma być skasowany;
· Użyć metody Delete aby go skasować.W przeciwieństwie do innych metod modyfikujących rekordy nie trzeba używać metody Update podczas kasowania rekordów.
UWAGA. Po skasowaniu rekordu jest on nadal bieżącym rekordem. Poprzedni rekord jest nadal poprzednim a następny rekord jest nadal następnym. Należy użyć metody MoveNext aby przejść do następnego rekordu jeśli ma on być bieżącym rekordem.
Informacje dotyczące serii "Pod lupą" są publikowane w intemetowym serwisie WWW pod adresem: http:i/w~~a.domino.ok.pl/lupa _ gg _
Domino 1999 5. Praca z kolekcją Recordsets
Poniższa procedura usuwa rekordy pracowników z miasta Londyn w tabeli Pracownicy:
Sub Kasowanie ( )
Dim db As Database, rst As Recordset Set db = CurrentDb
Set rst = db.OpenRecordset("Pracownicy") rst.MoveFirst
Do Until rst.EOF
If rst!Miasto = "Londyn" Then rst.Delete
End If rst.MoveNext
Loop rst.Close db.Close End Sub
5.5. Proces transakcji
Transakcja jest efektywną metodą do przeprowadzenia zmian w obiekcie Recordset. Umożliwia ona aparatowi baz danych zgromadzenie wielu zmian i zapisanie ich w jednej partii (batch) przetwarzania danych.
Wymuszenie integralności danych
Często aby zapewnić integralność danych trzeba rozpatrywać zbiór operacji jako jedną całość. Na przykład przepływ kapitału z jednego konta banku do drugiego składa się z dwóch operacji: zmniejszenie kapitału na jednym koncie i zwiększenie na drugim. W praktyce obie operacje muszą zakończyć się poprawnie lub żadna z nich nie powinna być wykonana.
Pozwala na szybkie wsadowe (całościowe) modyfikowanie, dodawanie i usuwanie. Każda operacja na zestawie rekordów, która zmienia dane mo że przynieść wiele korzyści jeśli użyje się transakcji. Transakcje używa się przede wszystkim aby móc wycofać lub przekazać całość zmian na danych, ale ponieważ transakcje czytają i zapisują buforowane dane można użyć ich do przyspieszenia operacji modyfikacji, dodawania i kasowania.
UWAGA. Transakcja musi być częścią jednej procedury. Nie można jej podzielić.
Transakcje rozpoczyna się po otwarciu zestawu rekordów ale przed wykonaniem j akichkolwiek zmian. Kończy się transakcje po wykonaniu wszystkich zmian ale przed zamknięciem zestawu. Trzy metody transakcji, które DAO obsługuje są metodami obiektu Workspace.
Metody transakcji:
· BeginTrans rozpoczyna nową transakcj ę;
· CommitTrans zatwierdza wszystkie zmiany wykonane na danych od ostatniego wywołania metody BeginTrans;
· Rollback wycofuje lub anuluje wszystkie zmiany wykonane na danych od ostatniego wywołania metody BeginTrans.
Informacje dotyczące seńi "Pod lupą" są publikowane w internetowym serwisie W W W pod adresem: http://www.domino.ok.pl/lupa
-89
Microsoft Access 97 programowanie © Domino n~~~~
Poniższy kod używa transakcji do przyspieszenia usuwania wierszy. Transakcja zaczyna się przed zmianą pierwszego wiersza a kończy się po zmianie ostatniego wiersza.
Dim wrk As Workspace, db As Database, rst As Recordset Set wrk = DBEngine(0)
Set db = wrk(0)
Set rst = db.OpenRecordset(strTabela) 'Jeśli jest określona transakcja to
' tu się zacznie
If fTransakcja Then wrk.BeginTrans rst.MoveFirst
Do While Not rst.EOF rst.Delete
'Bez użycia metody MoveNext aparat baz danych bedzie 'próbował kasować ten sam wiersz (pierwszy) rst.MoveNext
Loop If fTransakcja Then wrk.CommitTrans rst.Close
End If
lntormac~e dotyczące serii "Pod lupą" są publikowane w internetowym serwisie WWW pod adn~~ar "yYc~-,_ o ~;.p~yupa
Co to jest klasa
6. Moduly klas
Klasa jest formalną definicją obiektu. Klasa działa jak szablon, z którego tworzone są stancje obiektu podczas czasu wykonywania. Klasa definiuje właściwości obiektu i Mody używane do sterowania zachowaniem się obiektu. Obiekt jest instancją klasy, Sra ma właściwości i metody. Na przykład rozważmy schemat (obwodowy diagram) efonu jako klasa a telefon jako obiekt.
Moduły klas w MS Access
6.2.1. Co to jest moduł klasy
Każda klasa działa jak odbitka dla obiektu. Innymi słowy każda klasa definiuje jeden p obiektu. Można mieć kilka modułów klas w aplikacji. Podczas uruchamiania two~ny jest obiekt poprzez tworzenie instancji klasy.
Moduł klasy jest to moduł, który zawiera definicj ę nowego obiektu użytkownika. iefiniowane przez użytkownika w module klasy procedury mogą stać się metodami ~iektu użytkownika. Można zdefiniować nową instancję tego obiektu i sterować nim .przez zdefiniowane w procedurach modułu klasy właściwości i metody.
W MS Access 97 moduły klas istnieją w powiązaniu z formularzem lub raportem a sże na karcie Moduły okna bazy danych.
6.2.2. Nazwy klas
Nazwa klasy jest nazwą używaną przy odwoływaniu się do modułu klasy.
entyfikacja Obiektów Form i Report
Aby rozróżnić moduły formularzy i raportów nazwa klasy zaczyna od znacznika tyi. Na przykład nazwa klasy dla modułu związanego z formularzem Kategorie będzie ~rm Kategorie, a dla modułu związanego z raportem Podsumowania będzie 'Port Podsumowania. Poniższy przykład pokazuje wykorzystanie Form_ jako predeiiowanego identyfikatora dla nazwy formularza:
inction Identyfikator () Dim frm As Form
Set frm = Form_Kategorie frm.Caption = "To jest nowy tytuł" zd Function
ormacje dotyczące serii "Pod lupą są publikowane w internetowym serwisie W W W pod adresem: http://www.domino.ok.pl/lupa
-93
Domino 1999
Microsoft Access 97 programowanie
ODomino I~>
·. v
Użycie słowa kluczowego New
Dim MyForm As New _ Form_Kategorie ~ VBA zakłada, że istnieje instancja formularza.
VBA automataycznie tworzy instancję formularza. Formularz staje się elementem kolekcji Forms w momencie odwołania do jakiejkolwiek jego właściwości np. MyForm.Visible = True
Zmienna MyForm nie może być zwolniona poprzez ustawienie iei na wartość Nothin~
Dim MyForm As New _ Form_Kategoerie ~ VBA zakłada, że istnieje instancja formularza.
Set MyForm = Form_Kategorie VBA automataycznie tworzy instancję formularza. Zmienna MyForm nie może być zwolniona po
rzez ustawienie 'e' na wartość Nothin
Dim MyForm As Form VBA wygeneruje błąd jeśli formularz Kategorie Set MyForm = Forms("Kategorie") nie jest załadowany
Dim MyForm As Form
Set MyForm = Form_Kategorie
Dim MyForm As New Form
Set MyForm = Forms("Kategorie")
VBA otwiera instancję formularza, ponieważ użyto predefiniowanego identyfikatora. Formularz jest otwierany z właściwością Visible ustawioną na wartość False.
Aby zwolnić zmienną można ustawić jej wartość na Nothing
Set MyForm = Nothing
Jednak formularz pozostanie nadal otwarty. Można również ustawić zmienną MyForm na inny obiekt używając instrukcji
Set MyForm = Form_Pracownicy
W tym przypadku oba formularze pozostaną załadowane.
VBA nie otworzy instancji formularza , ponieważ słowo kluczowe New nie odnosi się do konkretnego obiektu, a tylko do klasy formularza. Jeśli formularz nie został wcześniej otwary, zostanie
Informacje dotyczące serii "Pod lupą" są publikowane w internetowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa
-94
no 1999 J Domino 1999
a.. ulaciek ~e
ta. ala
Po
~ne s"
1 MyForm As New Form MyForm = Form_Kategorie
~ OPIS
6. Moduły klas
VBA tworzy instancję formularza i ustawia jego właściwość Visible na wartość False
Aby zwolnić zmiennąMyForm, rLależy ustawić ją na wartość Nothing, jednak formularz pozostanie nadal otwarty ponieważ został automatycznie dodany do kolekcji Forms.
Ponieważ słowo kluczowe New odnosi się do klasy formularza a nie do konkretnego obiektu, można ustawić zmienną MyForm na inny obiekt
Set MyForm = Form Pracownicy
Oba formularze pozostaną załadowane.
Tworzenie wielu instancji formularza używając tablicy
Można zadeklarować tablice formularzy używając słów kluczowych Private, Dim, ReDim, Static, Public tak jak tablice dowolnego innego typu. Kiedy deklarowana jest tablica ze słowem kluczowym New, VBA automatycznie tworzy nową instancję formularza dla każdego elementu tablicy.
W poniższym przykładzie tworzonych jest pięć instancji formularza i tytuł każdego ustawiany jest na nazwę formularza i numer instancji:
'W sekcji deklaracji:
Dim MyForm() As New Form_Kategorie Function TworzenieFormularzy()
Dim X As Integer ReDim MyForm(5) For X = 0 To 4
MyForm(X).Caption = "Kategorie: " & X MyForm (X) . Visible = True
Next X End Function
!waż W obrębie kolekcji Forms nie można odwoływać się do niedomyślnej instancji for~t- mularza poprzez nazwę. Można odwołać się jedynie poprzez numer indeksu. Kiedy
tworzy się wiele niedomyślnych instancji formularza każda z nich będzie miała tą samą nazwę. Dlatego też można mieć więcej niż jeden formularz z tą samą nazwą w kolekcji Forms, bez innej możliwości rozróżniania jak tylko przez numer indeksu.
Poniższy przykład pokazuje jak zamknąć jedną szczególną instancję formularza ze zbioru wielu instancji tego formularza. Użyta jest metoda DoCmd.Close aby odwołać się do pojedynczej instancji.
DoCmd.Close acForm, Forms(1).Name
UWAGA. Ten przykład jest poprawny gdy dotyczy jednej klasy formularza.
6.3. Zasięg modułu klasy
Zasięg definiuje widoczność procedury, zmiennej, obiektu, modułu klasy.
Informacje dotyczące serii "Pod lupą" s~ pobWtovvane w internetowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa
-95
Microsoft Access 97 programowanie ~O Domino ~ ~u~
Poniższa lista przedstawia zasady rządzące zasięgiem modułów klas:
· Procedury tworzone w module klasy domyślnie są typu Public. Procedura Pubłic jest dostępna dla innych modułów klas oraz modułów standartowych. Umożliwia to docieranie do nich z zewnątrz ich modułów. Można użyć słowa kluczowego Pubłic, ale to nie jest konieczne;
· Zmienne tworzone w sekcji deklaracji są domyślnie typu Pubłic. Można użyć słowa kluczowego Pubłic, ale to nie jest konieczne;
· Kiedy MS Access wstawia procedurę zdarzenia dodaje słowo kluczowe Private domyślnie. Wszystkie procedury zdarzenia zadeklarowane jako Public są metodami klasy;
· Procedury zadeklarowane w module klasy jako Pubłic stają się metodami klasy. Można wywołać taką procedurę z dowolnego miejsca aplikacji poprzez nazwę klasy i procedury;
· Tylko procedury umieszczone w szczególnym module klasy mogą wywoływać procedurę typu Private. Aby zadeklarować procedurę jako Private należy użyć słowa kluczowego Private;
· Zmienne zadeklarowane w module klasy jako Public, stają się właściwościami klasy.
Istnieją trzy typy procedur związanych z właściwościami:
Property Get: zwraca wartość własności;
· Property Set: ustawia odwołanie do obiektu; · Property Let: ustawia wartość właściwości.
UWAGA: Zmienne i procedury na poziomie klasy nie mogą mieć takich samych nazw jak właściwości formularza (np. BackColor) lub formant na formularzu. W przypadku zadeklarowania takiego elementu Access wygeneruje błąd kompilacji. Dotyczy to elementów tvnu Pubłic i Private.
Procedury z innych modułów mogą wywoływać i odwoływać się do publicznych procedur i zmiennych formularzy i raportów.
UWAGA. Można użyć Przeglądarki obiektów aby przejrzeć metody klas (publiczne procedury).
6.3.1. Tworzenie procedur typu Property
Procedura właściwości pozwala utworzyć własną właściwość typu run-time, która zwraca wartość i uruchamia akcję jeśli zostaną ustawione wartości. Dzięki temu można lepiej dopasowywać do aktualnych potrzeb moduły klas i aplikacje.
Istnieją trzy procedury właściwości:
· Property Get jest używana do definiowania procedury właściwości. która zwraca wartość właściwości obiektu zdefiniowanego przez użytkownika;
Informacje dotyczące serii "Pod lupą" są publikowane w internetowym serwisie W W W pod adresem he~= ~~-~ amino-ok.pl/lupa
-96
.1999
© Domino 1999 6. Moduly klas
· Property Let jest używana do definiowania procedury, która ustawia wartość właściwości obiektu zdefniowanego przez użytkownika. Zwykle instrukcjc Property Get i Property Let używane są razem do stworzenia właściwości obiektu;
· Property Set używa się do stworzenia właściwości typu run-time, która ustawia odwołania do obiektu.
Każda instrukcja Property Set musi definiować przynajmniej jeden argument dla procedury, którą definiuje. Argument ten (lub ostami jeśli jest więcej niż jeden) zawiera rzeczywiste obiektowe odwołanie dla właściwości kiedy program wywołuje procedurę zdefiniowaną poprzez instrukcję Property Set. Dlatego też ostatni argument w procedurze Property Set musi być zadeklarowany jako obiekt.
Aby stworzyć własną właściwość typu run-time, która zwraca wartość należy utworzyć dwie procedury o tych samych nazwach. Jedna z nich powinna wykorzystywać Property Let aby ustawić właściwość, druga powinna wykorzystywać Property Get aby pobrać wartość właściwości.
W poniższym przykładzie tworzona jest właściwość, która zwraca kolor auta i, która zmienia kolor auta:
Public Property Get [instrukcje kodu]
End Property Public Property Let [instrukcje kodu]
End Property
AutoKolor As String
AutoKolor As String
Kiedy używa się procedury Property Get wraz z procedurą Property Let, nazwa i typ danych każdego argumentu w procedurze Property Get muszą być takie jak w procedurze PropertyLet. Jednak procedura Property Let musi mieć dodatkowy argument, który jest przesyłany w wartości własności.
Public Property Get CustomProp() As String
Public Property Get CustomProp(x as String, y as Integer,_ z as String) As String
Zmienna z przechowuje rzeczywistą wartość zdefiniowanej właściwości run-time. Zmienne x, y można użyć jako dodatkowe argumenty.
6.3.2. Tworzenie metod
Tak jak można tworzyć własne właściwości swoich modułów klas tak też i można tworzyć własne metody dla swoich modułów klas. Czyni się to poprzez stworzenie publicznych procedur typu Sub w swoich modułach klas.
Poniższy przykład przedstawia metodę użytkownika dla modułu klasy. Kod zmienia wartość właściwości Visible na True i ustawia wartość właściwości Caption formularza na wartość przekazywanej zmiennej typu String:
Public Sub ZmienForm(strCaption As String) Me.Visible = True
Me.Caption = strCaption End Sub
Informacje dotyczące serii "Pod lupą" są publikowane w internetowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa
-97
Microsoft Access 97 programowanie
6.4. Narzędzia do pracy z o
Środowisko pracy VBA zawiera dwa narzędzia, Przeglądarkę obiektów i okno dialogowe Odwołania, które są użyteczne przy pracy z obiektami.
6.4.1. Okno dialogowe Odwołania
Okno dialogowe Odwołania zawiera listę bibliotek obiektów (*.DLL, *.OLB, *.TLB) i bibliotek baz danych (*.MDA) dostępnych w bieżącej bazie danych. Przykładem biblioteki obiektów jest Microsoft DAO 3.0 Object Librar_v, która po
zwala odwoływać się do obiektów modelu DAO.` Przykładem biblioteki bazy danej jest plik WZLIB.MDA
UWAGA. Domyślnie MS Access 97 ładuje następujące typy bibliotek jako odwołania: Visual Basic. for Aplicatinn, Microsoft Acce.s.s 8.0 Ohject Library, i Microsoft DAO 3.5 Object Library.
Aby wyświetlić okno dialogowe Odwołania należy kliknąć na poleceniu Odwołania w menu Narzędzia kiedy moduł Visual Busic jest otwarty.
W poniższej tabelce opisane jest działanie poszczególnych elementów okienka dialogowego:
ELEMENT OPIS DZIAŁANIA
Dostępne odwoła- Obok każdego elementu na liście dostępnych odwołań znajduje się pole nia wyboru, które określa czy lub nie bieżąca baza danych (lub projekt) odwołuje się do tego elementu. Można dodawać lub usuwać odwołanie
o rzez zaznaczanie lub odznaczanie ola w boru.
Wynik Kiedy jest wybrane odwołanie z listy Access wyświetla pełną ścieżkę i język dla wybranej biblioteki lub projektu niezależnie czy jest czy nie dołączona do bieżące' ba dan ch ro'ektu .
Przyciski Priorytet Strzałki w górę i w dół Priorytetu pozwalają zmienić kolejność w jakiej Visual Basic próbuje podłączać zaznaczone biblioteki. Nie można użyć strzałek do zmiany kolejności podłączania domyślnych bibliotek obiektow ch VBA i MS Access.
Przycisk Przeglą- Przycisk Przeglądaj pozwala wybrać pliki, których nie ma jeszcze na daj liście Dostępnych odwołań. Do odwołań dostępnych sieciowo należy uż ć konwenc'i UNC naz ania ścieżek.
6.4.2. Przegl~,darka obiektów
Micros~ft Access obsługuje taką samą Przeglądarkę obiektów jak inne aplikacje pakietu Microsft Office.
Przeglądarka obiektów jest modalnym oknem, które pozwała p~aegia~ ~,~-szystkie procedury, metody i właściwości dostępne w bieżącej bazie danych (projekcie). Jest dostępna z menu Widok lub paska narzędzi gdy moduł jest w wido~peojdd~.
Przeglądarki obiektów używa się aby:
· Poznać różne óbiekty dostępne w bibliotekach MS Access 97, ~'isrnJ Ba.sic i innych;
Informacje dotyczące serii "Pod lupą" są publikowane w internetowym serwisie WWW pod 2~.~I~^~vs^r~ .a~.-!~>~.1·k.pl/lupa
-98
a 1999 ~~ Domino 1999
6. Moduly klas
· Przeglądać procedury, metody i właściwości dostępne w obiektach i bibliotekach;
· Wybrać procedury, metody i właściwości oraz przesłać składnie bezpośrednio do kodu.
ile id
ie~ yć
Informacje dotyczące serii "Pod lapy s~pubi~owvaoe w internetowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa
-99
© Domino 1999 7. Wykorzystanie plików wejścia i wyjścia
Dlaczego używamy plików Wejścia i Wyjścia
Podstawowym zastosowaniem plików WejścialWyjścia jest import i eksport plików tekstowych w niestandardowym formacie. Pliki te mogą pochodzić z raportu wydrukowanego do pliku.
Innym zastosowaniem pliku wej ścia i wyj ścia jest zapisywanie do pliku w formacie ASCII.
1. Typy dostępu do danych
Istnieją trzy typy dostępu do danych
· Sekwencyjny; · Swobodny; · Binarny.
Dostęp sekwencyjny
Zakłada się, że plik jest czystym plikiem tekstowym i zawiera tylko znaki. Odczyt sekwencyjny ułatwia wczytywanie i modyfikowanie różnych plików wytwarzanych przez procesory tekstu - pliki, które nie są podzielone na serie oddzielnych rekordów.
Dostęp swobodny
Ułatwia pracę z plikami zawieraj ącymi rozróżnialne rekordy, wszystkie o takiej samej budowie i długości lecz zawieraj ące indywidualne dane.
Dostęp binarny
Używa podobnych poleceń jak przy dostępie swobodnym i sekwencyjnym lecz nie zakłada żadnej reprezentacji zawartych w nim bajtów. Mogą one zawierać cokolwiek od znaków ASCII po serię rekordów, czy też fragment wykonywalnego programu.
Kroki dostępu do pliku
· Przypisz numer pliku; · Otwórz plik;
· Przetwarzaj dane; · Zamknij plik.
Każda technika dostępu używa innych instrukcji do przetwarzania danych w pliku, chociaż wymaga tych samych kroków aby pracować z plikiem.
.2. Funkcje związane z plikiem
Uchwyt pliku
Każdy plik aby go otworzyć wymaga unikatowego uchwytu pliku. Uchwyt pliku to liczba całkowita, której używa system, gdy chce się odwołać do danego pliku. Aby odnaleźć następny wolny uchwyt pliku należy użyć funkcji FreeFile.
Dim Fhandle As Integer
Informacje dotyczące serii "Pod lupą" są publikowane w internetowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa
- 103
Microsoft Access 97 programowanie
Fhandle = FreeFile
Funkcja EOF zwraca wartość informującą czy osiągnięto koniec pliku.
Open "PLIKTEST" For Input As #1
`Otworzenie pliku do wprowadzania Do While Not EOF(1)
`Dopóki nie osiągnięto końca pliku
Input #1, Zmienna Test `Odczyt Danej z pliku Loop
Close #1 `Zamknięcie pliku danych
Instrukcje Open i Close
Zanim otworzymy plik należy znaleźć wolny uchwyt pliku za pomocą funkcji FreeFile.
Dim NazwaPlik As String Dim Fhandle As Integer Fhandle = FreeFile
lnstrukcja Open otwiera plik i określa sposób użycia tego pliku. Oto przykład otwarcia pliku z dostępem sekwencyjnym do danych.
Open NazwaPlik For Input As Fhandle Open NazwaPlik For Output As Fhandle
Instrukcja Close zamyka plik.
Instrukcje Input # i Write #
Instrukcja Input # odczytuje dane z otwartego pliku sekwencyjnego i przypisuje dane`d~ zmiennej.
Dim PlikDanych As Variant
Open "MOJEDANE.DAT" For Output As #1
`Plik otwarty do odczytu
Do While Not EOF(1) `Kontynuuj do końca pliku danych Input #1, PlikDanych `Odczyt linii danych MsgBox PlikDanych `Wyświetlenie linii danych na ekranie Loop
Close #1 `Zamknięcie pliku danych
Instrukcja Write # zapisuje dane do pliku sekwencyjnego.
Open "PLIKTEST" For Output As #1
`Plik otwarty do wprowadzania NazwaU = InputBox("Podaj swoje imi~.")
`Pobranie nazwy użytkownika Wieku = InputBox("Podaj swój wiek.") `Pobranie wieku użytkownika
Write #1, NazwaU, Wieku `Zapis danych do pliku Close #1 `Plik zamkni~ty
Informacje dotyczące serii "Pod lupą" są publikowane w internetowym serwisie WWW pod adresym t. ~ =..~unino.ok.pl/lupa
- 104
.1999
O Domino 1999 7. Wykorzystanie plików wejścia i wyjścia
7.3. Przykład pliku Wejścia/wyjścia
W poniższym przykładzie wykorzystano sekwencyjne Wejście/wyjście w celu wczytania pliku do wielowierszowego pola tekstowego.
Sub Button0_Click ()
Dim fhandle As Integer Dim FileName As String fhandle = FreeFile filename = "C:\MOJPLIK.TXT"
Open Filename For Input As fhandle If LOF (fhandle) > 32000 Then
MsgBox "Ten plik jest zbyt duży do edycji " Exit Sub
Else Forms!forml!textl End If
`Po odczytaniu tekstu Close fhandle
End Sub
- Input (LOF (fhandle) , fhandle)
zamykamy plik
Sub Buttonl_Click () Dim fhandle As Integer Dim FileName As String `Pobranie numeru pliku fhandle = FreeFile filename = "C:\MOJPLIK.TXT"
`Otwarcie pliku do wyprowadzania Open Filename For Output As fhandle `Umieszczenie tekstu w pliku i zamknijcie Write #fhandle, Forms!forml!textl
Close fhandle End Sub
pliku
Informacje dotyczące serii "Pod lupą" są publikowane w internetowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa
- 1~5
Na potrzeby tego laboratorium nie przygotowano żadnych plików. W trakcie jego trwania utworzysz nową bazę danych w katalogu C:\PST\LABS\LAB01.
W celu uniknięcia problemów wynikających z błędnych nazw zmiennych wskazane jest wprowadzenie instrukcji Option Explicit do sekcji deklaracji każdego tworzonego modułu. Jednym z najbardziej powszechnych źródeł błędów jest niepoprawne wpisania nazwy zmiennej. Instrukcja Option Explicit wymusza jawną deklarację wszystkich zmiennych znajdujących się w module. Jeśli Visual Basic for Application wykryje nazwę, która nie została jawnie zadeklarowana jako nazwa zmiennej, następuje wyświetlenie komunikatu o błędzie. Włączenie opcji "Żądanie deklaracji zmiennych" w menu Narzędzia automatycznie wprowadzi instrukcję Option Explicit do sekcji deklaracji każdego tworzonego modułu.
W czasie tego laboratorium utworzysz i uruchomisz kilka różnych procedur typu Sub i Function. Będziesz także deklarował i wykorzystywał różne typy zmiennych. Większość procedur, które utworzysz w ramach tego laboratorium, będzie prosta i o niewielkich rozmiarach; ale nabyte przy tym umiejętności będą przydatne także przy tworzeniu złożonych procedur.
1.1. Ćwiczenie 1
W tym ćwiczeniu utworzysz nową procedurę typu Sub, która będzie korzystać ze zmiennych.
UWAGA. Pamiętaj o użyciu instrukcji Option Explicit w sekcji deklaracji każdego z tworzonych modułów.
Utwórz nową bazę danych w podanym katalogu i nazwij ją LAB01.MDB.
W oknie Baza danych wybierz zakładkę Moduły oraz przycisk Nowy, aby utworzyć nowy moduł.
Utwórz procedurę typu Sub o nazwie TestSubOne o zasięgu publicznym. Zadeklaruj w procedurze TestSubOne zmienną o nazwie MyText typu String. Przypisz zmiennej MyText tekst: To jest pierwsza procedura testowa. Wpisz poniższy kod:
Powoduje on wyświetlenie zawartości zmiennej MyText w oknie dialogowym. Funkcja MsgBox opisana jest dokładniej w następnych laboratoriach.
Twoja procedura powinna być podobna do poniższej:
Public Sub TestSubOne()
Dim MyText As String
MyText = "To jest pierwsza procedura testowa"
MsgBox MyText
End Sub
Uruchom procedurę przez wprowadzenie jej nazwy w Oknie Analiza programu (bezpośrednim) . Spowoduje to wyświetlenie poniższego okna dialogowego:
Zachowaj moduł jako Ćwiczeniel.
1.2. Ćwiczenie 2
W tym ćwiczeniu zapoznasz się ze sposobem wywołania procedury typu Sub.
1. Utwórz nowy moduł, a następnie w oknie modułu, procedurę typu Sub o nazwie TestSubTwo.
Wywołaj procedurę TestSubOne z wnętrza procedury TestSubTwo.
Twoja procedura powinna być podobna do poniższej:
Public Sub TestSubTwo()
End Sub
Zmodyfikuj procedurę TestSubOne, tak by przyjmowała argument o nazwie MyText.
Zmodyfikuj procedurę TestSubTwo, tak by wywoływała procedurę TestSubOne i przekazywała jej argument Wywołana przez drugą procedurę testową.
Twoje procedury powinny być podobne do poniższych (znajdować się one będą w dwóch oddzielnych modułach, a nie obok siebie, jak to pokazano poniżej):
Public Sub TestSubOne(MyText As String)
MsgBox MyText
End Sub
Public Sub TestSubTwo()
TestSubOne "Wywołana przez drugą procedurę testową"
End Sub
Przetestuj procedurę TestSubTwo i zachowaj ten moduł jako Ćwiczenie2. Zachowaj moduł Ćwiczenie1 wraz z wprowadzonymi w nim zmianami.
1.3. Ćwiczenie 3
W tym ćwiczeniu będziesz badał zasięg zmiennych w zależności od miejsca i sposobu ich deklaracji.
1 . Utwórz nowy moduł i wpisz poniższy kod w jego sekcji deklaracji.
' Domyślnie stałe mają zasięg lokalny.
Const MyVar = 459
' Deklaracja stałej o zasięgu publicznym.
Public Const MyString = "POMOC"
' Deklaracja wielu stałych w jednym wierszu.
Const MyStr = "Witaj", MyDouble = 3.4567
2 . W tym samym module utwórz nową procedurę typu Sub i wprowadź poniższy kod:
Public Sub TestScopeOne()
MsgBox MyString
MsgBox MyStr
End Sub
3. Uruchom powyższy kod w celu przetestowania. Zamknij i zachowaj powyższy moduł jako Ćwiczenie3a.
4. Utwórz nowy moduł, a w nim poniższą procedurę:
Public Sub TestScopeTwo()
MsgBox MyString
MsgBox MyStr
End Sub
Uruchom kod. Co się stało? Dlaczego?
Zmień stałą MyStr na stałą Public, aby zlikwidować przyczynę błędu, a następnie ponownie uruchom kod.
Zamknij i zachowaj powyższy moduł jako Ćwiczenie3b.
1.4. Ćwiczenie 4
W tym ćwiczeniu utworzysz i wywołasz procedurę typu Function. Możesz odwoływać się do takiej procedury podobnie jak do procedury typu Sub, z tą tylko różnicą, że zwraca ona wartość do procedury, z której została wywołana.
1. Utwórz nowy moduł, a w nim procedurę typu Function, o nazwie DodajPodatek, która przyjmuje argument o nazwie Kwota typu Currency i zwraca wartość typu Currency.
Funkcja DodajPodatek powinna zwracać jako rezultat wartość Kwota * 1.08.
Twoja funkcja powinna być podobna do poniższej:
Public Function DodajPodatek (Kwota As Currency) As
Currency
DodajPodatek = Kwota * 1.08
End Function
Sprawdź działanie funkcji w oknie bezpośrednim, wprowadzając ?Dodaj Podatek (100).
Zwróć uwagę, że zwracana wartość jest wyświetlana w oknie bezpośrednim.
W tym samym module utwórz nową procedurę typu Sub.
Public Sub WyświetlPodatek ()
MsgBox "Kwota z podatkiem wynosi: " &
DodajPodatek(100)
End Sub
Wywołaj procedurę wpisując w oknie bezpośrednim WyświetlPodatek.
Zmodyfikuj procedurę, tak by pytała się użytkownika o wartość kwoty.
Public Sub WyswietlPodatek ()
Dim Kwota As Currency
Kwota = InputBox("Wprowadź kwotę")
MsgBox "Kwota z podatkiem wynosi: " &
DodajPodatek(Kwota)
End Sub
Wywołaj procedurę wpisując w oknie bezpośrednim WyświetlPodatek.
Zachowaj moduł jako Ćwiczenie4.
1.5. Ćwiczenie 5
W tym ćwiczeniu utworzysz i wykorzystasz własne funkcje w module formularza. Wykonasz to ćwiczenie wykorzystując doświadczenie zdobyte w trakcie wykonywania poprzednich ćwiczeń.
1. Utwórz nowy, pusty formularz i wyłącz przycisk Kreatorzy formantów.
2. Dodaj do formularza przycisk polecenia, a w oknie jego właściwości wybierz właściwość zdarzenia Przy kliknięciu.
3. Korzystając z okna właściwości uruchom Konstruktor kodu.
UWAGA. Jeśli klikniesz prawym przyciskiem myszy w polu właściwości Przy kliknięciu, to pojawi się menu kontekstowe. Jeśli z tego menu wybierzesz polecenie Buduj..., to na ekranie pojawi się okno dialogowe Wybierz konstruktora. W oknie tym wybierz Konstruktor kodu i kliknij na OK. Na ekranie pojawi się w tym momencie okno modułu formularza.
4. Wprowadź do procedury instrukcję MsgBox wyświetlającą zdanie Gdzie jestem.
5. Sprawdź działanie przycisku.
6. Wróć do widoku projektu formularza i zmień jego właściwość Nazwa na Gdzie jestem.
7. Sprawdź działanie przycisku. Dlaczego nie chce on działać?
8. Otwórz moduł formularza i znajdź kod poprzedniej procedury.
9. Popraw procedurę, tak by jej kod działał poprawnie.
1.6. Ćwiczenie dodatkowe
W tym ćwiczeniu utworzysz nową, zdefiniowaną przez użytkownika, funkcję.
1. Utwórz zdefiniowaną przez użytkownika funkcję o nazwie ReverseName, która odczytuje tekst i przestawia go względem znajdującego się w tekście przecinka, jak to pokazano poniżej. Uruchom tę funkcję w oknie bezpośrednim.
2.1. Ćwiczenie 1
W tym ćwiczeniu wykorzystasz podstawową strukturę sterującą, dzięki której jeśli określony warunek jest spełniony, to procedura może wykonać pewne określone zadanie.
If... Then... End If;
If... Then... Else... End If;
If... Then... ElseIf... Else... End If.
2.1.1. Realizacja zadania przy istnieniu warunku
W tym przykładzie utworzysz prostą strukturę sterującą If... Then... End If do sprawdzania pojedynczego warunku i podejmowania określonych działań, jeśli testowany warunek jest spełniony. Warunek może przyjmować wartości Prawda lub Fałsz. Instrukcja taka może być odczytana w następujący sposób: "Jeśli warunek jest spełniony, to wykonaj określone działanie, po czym zakończ instrukcję warunkową".
UWAGA. Pamiętaj o użyciu instrukcji Option Explicit w sekcji deklaracji każdego z tworzonych modułów.
1. Utwórz bazę danych w katalogu ...\LAB02 i nazwij ją PrgFun.MDB.
Utwórz moduł. Wprowadź poniższy kod:
Sub Cwicz_1a ( )
Dim WarunekTestowy$
WarunekTestowy$ = "Pies"
If WarunekTestowy$ = "Pies" Then
MsgBox "Warunek jest spełniony!"
End If
End Sub
Uruchomienie procedury Cwicz_1 a()
1. Uruchom procedurę, wprowadzając jej nazwę w Oknie bezpośrednim.
Zmienna WarunekTestowy$ zawiera ciąg znaków Pies, który jest porównywany z ciągiem znaków Pies, z prawej strony znaku równości. Dzięki temu warunek ma wartość Prawda i instrukcja znajdująca się po Then jest wykonywana - pojawia się okno komunikatu.
2.1.2. Realizacja zadania w zależności od tego który warunek jest spełniony
W tej części ćwiczenia dowiesz się jak określić, który przycisk został wybrany w oknie komunikatu.
Wykorzystaj funkcję MsgBox do dostarczenia wartości, którą można wykorzystać w strukturze If... Then... Else... End If.
I . Utwórz nową procedurę typu Sub o nazwie Cwicz_1 b
Sub Cwicz_lb
Dim PrzyciskiTakNie%, Odpowiedz
PrzyciskiTakNie = 4
Odpowiedz = MsgBox("Wybierz przycisk Tak lub Nie.",
PrzyciskiTakNie)
If Odpowiedz = 6 Then
MsgBox "Wybrałeś Tak!"
Else
MsgBox "Wybrałeś Nie!"
End If
End Sub
2. Uruchom procedurę.
UWAGA. Niektóre funkcje zawracają wartość 1 jako Prawda, a niektóre wartość -1. Pamiętaj, że zero to Fałsz, a nie zero to Prawda..
2.1.3. Wielokrotne sprawdzanie warunku
Tym razem użyjesz bardziej złożonej wersji podstawowej instrukcji If... Then. Jeśli pierwszy warunek nie jest spełniony możesz ponownie sprawdzić ten sam lub inny warunek i podjąć w związku z tym odpowiednie działania. Istnieje moźliwość zagnieżdżenia kilku bloków EIseIf wewnątrz zewnętrznej struktury If... Then... End If. Możesz także wprowadzić końcową instrukcję Else, która jest realizowana w przypadku, gdy żaden z wcześniejszych warunków nie zostanie spełniony.
Wykorzystanie instrukcji If... Elself... Else... End If
1. Utwórz nową procedurę o nazwie Cwicz_ 1 c.
Sub Cwicz 1c ()
Dim PrzyciskiTakNieAnuluj~, ZnakZapytania~, Odpowiedz PrzyciskiTakNieAnuluj - 3
ZnakZapytania =32
Odpowiedz = MsgBox("Wybierz Anuluj.", _
PrzyciskiTakNieAnuluj If Odpowiedz = 6 Then
przycisk Tak, Nie lub
+ ZnakZapytania)
MsgBox " Wybrałeś Tak!"
Informacje dotyczące serii "Pod lupą" są publikowane w internetowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa
- l ls
7 Domino 1999
Laboratorium 2 f .
ElseIf Odpowiedz = 7 Then MsgBox " Wybrałeś Nie!"
ElseIf Odpowiedz = 2 Then
MsgBox " Wybrałeś Anuluj, albo nacisnąłeś przycisk" &
" Esc, lub też zamknąłeś okno komunikatu używając" & _ " pola menu sterowania!"
End If
' Inne instrukcje mogą zostać umieszczone w tym miejscu End Sub
2. Uruchom kilkakrotnie powyższą procedurę, wybierając różne przyciski i obserwując rezultaty.
Jak można zauważyć, wybór każdego z przycisków w pierwszym oknie zwraca inną wartość . Przykładowo, przycisk Anuluj zwraca wartość 2.
Zachowaj moduł jako Ćwiczeniel.
.2. Ćwiczenie 2
Wykorzystanie struktury sterującej Select Case
W ćwiczeniu tym dowiesz się jak tworzyć instrukcje z Select Case.
Sprawdzanie wartości zmiennej tekstowej przy użyciu Select Case Utwórz nowy moduł i wprowadź poniższy kod:
Sub Cwicz 2a ( )
Dim NazwaProcedury$, Odpowiedz$ NazwaProcedury = "Przykład z Select Case" Odpowiedz = InputBox$("Wpisz Tak lub Nie", NazwaProcedury$)
Select Case Odpowiedz$ Case "Tak"
MsgBox "Wpisałeś Tak!" Case "Nie"
MsgBox "Wpisałeś Nie!" Case Else
MsgBox "Spróbuj jeszcze raz!" End Select
End Sub
Uruchomienie procedury Ćwicz 2a
1. Uruchom procedurę.
W oknie dialogowym wpisz Tak.
Uruchom procedurę jeszcze raz, wpisując w oknie dialogowym Nie. Uruchom procedurę po raz trzeci i tym razem wpisz B r a k de c y z j i .
Zwróć uwagę na wyniki.
Informacje dotyczące serii "Pod lupą" są publ~cowane w intemetowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa
- 119
Microsoft Access 97 programowanie © Domin, .
Jeśli wpiszesz cokolwiek innego niż Tak lub Nie, albo pozostawisz okno dialogowe puste, to instrukcja Case Else przyjmuje wartość Prawda i wyświetlane jest okno z komunikatem Spróbuj j eszcze raz. W tym przykładzie musisz wpisywać tekst dokładnie aby otrzymać odpowiedni ą odpowiedź.
Użycie instrukcji Case Else nie jest w procedurze konieczne, jeśli zachodzi pewność, że zawsze któryś z warunków Case będzie przyjmował wartość Prawda.
WSKAZÓWKA. Lepiej wprowadzać jest wiersz Case Else w każdej użytej strukturze Select Case.
Instrukcja Case w formie bardziej uniwersalnej
Aby instrukcja Case przyjęła wartość Prawda wystarczy spełnić jeden z kilku warunków, co czyni tę strukturę bardziej elastyczną.
1. Wprowadź poniższy kod:
Sub Cwicz 2b ( ) Dim Odpowiedz$
Odpowiedz$ = InputBox$("Wpisz Tak lub Nie")
Select Case Odpowiedz$ Case "Tak" "t"
MsgBox "Wpisałeś Tak, Case "Nie" "n"
MsgBox "Wpisałeś Nie, Case Else
TAK, tak, T lub t!"
NIE, nie, N lub n!"
MsgBox "Spróbuj jeszcze raz!" End Select
End Sub
Uruchom procedurę i sprawdź jej działanie przy różnych odpowiedziach wpisywanych do okna dialogowego.
Jak pokazano powyżej, możliwe jest sprawdzanie kilku warunków w jednej instrukcji Case.
Testowanie zmiennej numerycznej przy pomocy Select Case
Poniższy przykład wykorzystuje strukturę sterującą Select Cale do badania wartości zmiennej numerycznej.
Sub Cwicz 2c()
Dim Odpowiedz
Odpowiedzi = 9 'Wybierz liczbę pomi~dzy 1 a 10 Select Case Odpowiedz
Case 1, 2, 3
MsgBox "Twoja liczba jest między 1 i 3!" Case 3 * 3
MsgBox "Czy Twoją liczbą jest 3 do kwaratu?" Case 4 To 10
MsgBox "Wiem, że jest ona rdzy 4 i 10." Case Else
Informacje dotyczące serii "Pod lupą" są publikowane w internetowym serwisie WW`~ ~si~ lei ~w W .domino.ok.pl/lupa
- 120
ino 1999 © Domino 1999
we no kst
ść,
ze
ra
End Select End Sub
Laboratorium 2
1. Uruchom procedurę Cwicz_2c.
Zauważ, że zarówno druga jak i trzecia instrukcja Case przyjmuje wartość Prawda, ale ponieważ druga instrukcja jest przed trzecią, to druga jest jedyną, która zostaje wykonana i wyświetlony zostaje jedynie komunikat 3 do kwadratu.
Uruchom procedurę Cwicz 2c jeszcze kilka razy, zmieniając za każdym razem wartość zmiennej Odpowiedz i obserwując wyniki.
Zamknij moduł i zachowaj go pod nazwą Ćwiczenie2.
2.3. Ćwiczenie 3
Zmienne tablicowe
W tym punkcie będziesz ćwiczył określanie rozmiarów i deklarowanie zmiennych tablicowych. Zmienne, których używałeś do tej pory mogły przechowywać tylko jedną wartość, tekstową bądź numeryczną. Zmienne tablicowe mogą przechowywać wiele wartości.
Deklarowanie dwukolumnowej tablicy do przechowywania trzech elementów
1. Utwórz nowy moduł i zadeklaruj dwukolumnową tablicę do przechowywania trzech elementów.
2. W sekcji deklaracji globalnych modułu, po instrukcjach
Option Compare Database Option Explicit
ich
wpisz
Dim MojaPierwszaTablica$(2,1)
UWAGA. Numerowanie elementów tablicy zaczyna się od zera. Trzyelementowa tablica zawiera elementy 0, 1 oraz 2 (dlatego pierwszym argumentem jest 2), pierwsza kolumna ma numer 0, a druga 1 (dlatego drugim argumentem jest 1 ). Aby utworzyć tabl icę jednokolumnową należy opuścić drugi argument.
3. Przypisz ciągi znaków do każdego elementu tablicy z pierwszej (o numerze zero) kolumny.
Utwórz nową procedurę typu Sub o nazwie Cwicz 3a i wpisz poniższy kod: MojaPierwszaTablica$(0,0) - "Wiersz zero, kolumna zero - pies" MojaPierwszaTablica$(1,0) - "Wiersz jeden, kolumna zero - giez" MojaPierwszaTablica$(2,0) - "Wiersz dwa, kolumna zero - bies"
Przypisz ciągi znaków do każdego elementu tablicy z drugiej (o numerze jeden) kolumny. Po
MojaPierwszaTablica$(2,0) - "Wiersz dwa, kolumna zero - bies" wpisz:
Informacje dotyczące serii "Pod lupą" s$pnbllrowane w internetowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa
- 121
Microsoft Access 97 programowanie © Domino ~ ~~~
MojaPierwszaTablica$(0,1) - "Wiersz zero, kolumna jeden - k, MojaPierwszaTablica$(1,1) - "Wiersz jeden,kolumna jeden - p MojaPierwszaTablica$(2,1) - "Wiersz dwa, kolumna jeden - mł
4. Utwórz okno komunikatu, wyświetlające zawartość jednego z elementów tablicy. Po MojaPierwszaTablica$(2,1) - "Wiersz dwa, kolumna jeden - młc
wpisz MsgBox MojaPierwszaTablica$(2,0) End Sub
5. Uruchom procedurę Cwicz 3a i zaobserwuj rezultat jej działania.
Zmiana wartości argumentu
1. Zmień wartości w argumencie MojaPierwszaTablica.$ instrukcji wyświetlającej okno dialogowe. Zastąp:
MsgBox MojaPierwszaTablica$(2,0)
instrukcj ą
MsgBox MojaPierwszaTablica$(2,1)
2. Uruchom procedurę Cwicz-3a. Zmieniając numer wiersza i kolumny możesz oglą dać różne elementy tablicy.
3. Ponieważ będziesz potrzebował powyższej procedury w następnym ćwiczeniu, zachowaj ją pod nazwą Cwicz-3a.
2.4. Ćwiczenie 4
Realizacja pętli przy pomocy For. . . Next
Konstrukcję pętli For...Next stosuje się w sytuacji, gdy zachodzi konieczność wykonania pewnych operacji ściśle określoną ilość razy. Procedura może realizować serię poleceń przy każdym "przebiegu" przez pętlę.
Praca z pętlami For...Next
W pierwszym przykładzie napiszesz prostą pętlę, która będzie wyświetlać okno komunikatu przy każdym przebiegu procedury przez tę pętlę. Okno komunikatu będzie informować, który raz pętla została wykonana. W ćwiczeniu tym będziesz określał, ile razy pętla ma zostać wykonana, poprzez ustawianie odpowiednich warto ści zmiennych występujących w procedurze.
4. Wprowadź poniższy kod do tego samego moduhz, którego używałeś w poprzednim ćwiczeniu:
Sub Cwicz_4a NumerPoczatkowy = 1 NumerKoncowy = 10 WielkoscKroku = 2
TytulProcedury$ _ "Licznik puli"
For i = NumerPoczatkowy To NumerKoncowy Step WielkoscKroku MsgBox "Licznik pętli ma wartość " + Str$(i), 0, _ TytulProcedury$
Infórmacje dotyczące serii "Yod lupą" są publikowane w internetowym serwisie WWW pOd adt~en~ ńrsp-_''u~,v.domino.ok.pl/lupa
- 122
Domino 1999
Laboratorium 2 Next i
End Sub
5. Uruchom procedurę Cwicz 4a.
Przy każdym przebiegu przez pętlę klikaj w oknie komunikatu na przycisku OK. i obserwuj rezultaty.
Pętla licząca wstecz
6. Ustaw wartości zmiennych w następujący sposób:
NumerPoczątkowy = 21 NumerKoncowy = 1 WielkoscKroku = -3
Ponownie uruchom procedurę i obserwuj rezultaty. Zauważ, że tym razem pętla liczy wstecz, od 21 do 3.
Wyświetlenie wszystkich elementów tablicy
Dowiedziałeś się już, że jedna zmienna tablicowa może przechowywać kilka wartości w wierszach i kolumnach tabeli. Pętla bardzo dobrze nadaje się do wykonywania różnych operacji na tablicy.
1. Otwórz procedurę Cwicz_3a, którą utworzyłeś w poprzednim ćwiczeniu.
2. Utwórz pętlę, która wyświetli wszystkie trzy elementy z kolumny 1 zmiennej MojaPierwszaTablica$. Zastąp:
MsgBox MojaPierwszaTablica$(2,1)
instrukcj ą
For i = 0 To 2
MsgBox MojaPierwszaTablica$(i,1) Next i
3. Uruchom procedurę Cwicz3a i obserwuj rezultaty.
Pętla w tym przykładzie jest tak ustawiona, by wykonała się trzy razy (taka jest ilość pozycji w tablicy). Liczbę, od której rozpocznie się odliczanie pętli, możesz określić przypisując zmiennej, w tym przypadku i, odpowiednią wartość. Ponieważ pierwszy wiersz tabeli oznaczony jest indeksem 0, zmiennej i przypisano wartość 0. Każda iteracja pętli odpowiada jednemu wierszowi tabeli. Przy pierwszym przebiegu pętli i ma wartość 0, przy drugim 1, a przy ostatnim 2.
2.5. Ćwiczenie 5
Pętle While...Wend
Jeśli nie jesteś w stanie dokładnie określić, ile razy ma zostać wykonane określone działanie, to nie możesz zastosować wykorzystywanej w ostatnim ćwiczeniu pętli For...Next. Musisz skorzystać z pętli While...Wend. Z konstrukcji tej korzysta się w sytuacji, gdy realizacja określonych akcji ma być kontynuowana tak długo, jak długo odpowiedni warunek lub warunki są spełnione.
Informacje dotyczące serii "Y~ud l~p~ ~pabl~owa~ w internetowym serwisie W W W pod adresem: http://www.domino.ok.pl/lupa
-123
Microsoft Access 97 programowanie © Domino ~ ~~~ Praca z pętlami While...Wend
W tym przykładzie na ekranie będzie wyświetlane okno dialogowe do momentu wpisania właściwego tekstu.
1. Utwórz nową procedurę o nazwie Cwicz_Su. 2. Wpisz poniższy kod:
Sub Cwicz_5a Klucz$ _ "Klucz"
While Not Haslo$ = Klucz$
Haslo$ = InputBox$("Jakie jest tajne słowo?", "Sprawdź " _ & Klucz)
Wend End Sub
3. Uruchom procedurę.
Jeśli nie wpiszesz nic do zmiennej KlucZ$, to okno dialogowe będzie się wciąż pokazywać. Wybór przycisku Anuluj lub klawisza [Esc] nie da możliwości opuszczenie pętli, ponieważ procedura ignoruje wszystkie błędy. Tylko wpisanie poprawnego hasła powoduje, że warunek przy While przyjmuje wartość Farsz i następuje zatrzymanie pętli.
UWAGA. Tworząc pętle, upewnij się zawsze, czy przypadkiem nie stworzyłeś pętli nieskończonej. Jeśli warunek po While zawsze będzie spełniony, to pętla nigdy się nie zatrzyma, chyba że przerwiesz działanie programu.
2.6. Ćwiczenie dodatkowe Wyświetlanie elementów tablicy
?~tnodyfikuj procedurę Cwicz_3a, umieszczając w niej dodatkową pętlę, tak by wyśv~riet»i w oknie komunikatu wszystkie elementy tablicy.
Informacje dotyczące scrii "Pod lupą" są publikowane w internetowym serwisie WWW pod adresem: ht~J/w-ww.domino.ok.pl/lupa
- 124
© Domino 1999
Laboratorium 3 ,
Przygotowanie laboratorium
Na potrzeby tego laboratorium nie przygotowano żadnych plików. W trakcie jego trwania utworzysz nową bazę danych w katalogu ~LABS~L,AB03.
Informacje dodatkowe
Dodatkowe informacje na temat wszystkich funkcji wykorzystywanych w tych ćwiczeniach możesz znaleźć w pliku pomocy lub Konstruktorze wyrażeń.
3.1. Ćwiczenie 1
Lokalna obsługa błędów
W ćwiczeniu tym będziesz przechwytywał błędy bez wykorzystywania procedury obsługi błędów.
UWAGA. Pamiętaj o użyciu instrukcji Option Explicit w sekcji deklaracji każdego z tworzonych modułów.
Utworzenie formularza
1. Utwórz w katalogu ~I,ABS~L,AB03 nową bazę danych o nazwie Bledy.mdb. 2. Utwórz nowy formularz.
3. Wyłącz kreatora formantów i umieść na formularzu przyciski poleceń, jak to pokazano na poniższym rysunku.
Utworzenie procedury zdarzenia
1. Utwórz procedurę zdarzenia Przy kliknięciu dla przycisku "Uruchom program 1 ", uruchamiając Konstruktor kodu dla właściwości przy kliknięciu.
2. W procedurze tej umieść kod, który umożliwi użytkownikowi uruchomienie aplikacji poprzez wprowadzenie_jej nazwy w oknie dialogowym. Kod taki jak pokazano poniżej
Uruchom programl = Shell(InputBox("Podaj nazwę programu."), 1) 3. Przełącz się do widoku formularza i sprawdź działanie procedury zdarzenia.
4. W oknie dialogowym wprowadź nazwę aplikacji, na przykład Calc (Kalkulator).
Informacje dotyczące serii Ybd iap~ s;p~bó~towaoe w internetowym serwisie WW W pod adresem: http://www.domino.ok.pl/lupa
- 127
Microsoft Access 97 programowanie © Domina ~ ~~~
5. Uruchom procedurę ponownie i wprowadź błędną nazwę aplikacji, na przykład XYZ. Powinno to spowodować wystąpienie błędu wykonania.
Kod lokalnej obsługi błędu
Na początku wykonanej w poprzednim punkcie procedury zdarzenia dodaj instrukcj ę On Error Resume Next żeby powstrzymać Microsoft Access przed wywołaniem wyjątku przy wystąpieniu błędu.
2. Sprawdź po instrukcji Shell, czy wystąpił błąd poprzez sprawdzenie wartości liczbowej zwracanej przez funkcj ę Err.
3. Jeśli błąd wystąpił, zawiadom o tym użytkownika przy pomocy instrukcji MsgBox. 4. Sprawdź działanie aplikacji.
3.2. Ćwiczenie 2
Utworzenie procedury obsługi błędu
W tym ćwiczeniu będziesz przechwytywał błędy w procedurze zdarzenia wykorzystując procedurę obsługi błędów.
Utworzenie procedury zdarzenia
1. Utwórz procedurę zdarzenia Przy kliknięciu dla przycisku Uruchom program 2.
2. W procedurze tej dodaj kod (taki jak poprzednio), który pozwoli użytkownikowi uruchomić aplikację poprzez wprowadzenie jej nazwy w oknie dialogowym, jak to pokazano poniżej:
Uruchom program2 = Shell(InputBox("Wprowadź nazwę programu."), I
3. Przełącz się do widoku formularza i sprawdź działanie procedury zdarzenia.
4. W oknie dialogowym wprowadź błędną nazwę aplikacji, na przykład MojProg. Gdy pojawi się komunikat o błędzie zapisz numer błędu wykonania.
5. Uruchom procedurę zdarzenia jeszcze raz i nie wprowadź nazwy programu. Gdy pojawi się komunikat o błędzie zapisz numer błędu wykonania.
Utworzenie procedury obsługi błędu
1. Uaktywnij obsługę błędów przez użytkownika wykorzystuj ąc instrukcj ę On Error. 2. Utwórz procedurę obsługi błędów.
3. W procedurze obsługi błędów wprowadź kod sprawdzający rodzaj zarejestrowanego błędu, a także pozwalający użytkownikowi na ponowną próbę uruchomienia programu. Przykładowo, jeśli użytkownik wpisze:
Informacje dotyczące serii "Pod lupą" są publikowane w internatowym serwisie WWw' pod 7~ =u.domino.ok.pl/lupa
- 128
~ Domino 1999
to uzyska odpowiedź:
Laboratorimrc 3
t ~.
~~'~~ ru 53: Ten plik nie istnieje: flesz ~próbc~ac jeszcze raz?
Tak~~ Nie
4. Jeśli użytkownik nie wpisze nazwy programu to uzyska odpowiedź:
5. Sprawdź działanie aplikacji.
3.3. Ćwiczenie 3
Funkcja z obsługą błędów
W tym ćwiczeniu utworzysz funkcję uruchamiającą aplikacje. Funkcja ta będzie dodatkowo zwracać wartość Prawda, jeśli uruchomienie aplikacji się powiedzie, a wartość Falsz w przeciwnym przypadku.
Utworzenie procedury zdarzenia
1. Utwórz procedurę zdarzenia Przy kliknięciu dla przycisku Uruchom program 3.
2. W procedurze tej wprowadź kod wywołujący funkcję o nazwie MyShell, pokazany poniżej
Dim NazwaProgramu As String Dim Wynik As String
NazwaProgramu = InputBox("Wprowadź nazwę programu.") Wynik = MyShell(NazwaProgramu)
MsgBox Wynik
Informacje dotyc~e sali ,.Pbd Y~ol s~ pab~~kaaane w internetowym serwisie W W W pod adresem: http://www.domino.ok.pl/lupa
- 129
Microsoft Access 97 programowanie O Domino ~ ~~ 3. W module formularza utwórz nową funkcję o nazwie MyShell.
4. W funkcji tej wprowadź kod realizujący następujące zadania:
· Obsługuje błędy wykonania wykorzystując albo lokalną obsługę błędów, albo procedurę obshalgi błędów;
· Zwraca wartość Prawda, jeśli działanie funkcji Shell zakończy się sukcesem, a wartość Fałsz w przypadku wystąpienia błędu.
5. Sprawdź działanie procedury.
3.4. Ćwiczenie dodatkowe
Scentralizowany system obsługi błędów
W tym ćwiczeniu przygotujesz centralną funkcję obsługi błędów, która będzie mogła być wykorzystana w wielu procedurach.
Utworzenie aplikacji z kontrolą błędów 1. Utwórz formularz podobny do poniższego:
2. Utwórz procedury zdarzenia Przy kliknięciu dla przycisków Wywołanie błędu nr 7 i Wywołanie błędu nr 61, które wykorzystają instrukcję Error do generowania odpowiedniego błędu wykonania.
3. Utwórz procedurę typu Sub, która będzie obsługiwać te błędy.
4. Dodaj do procedur zdarzenia Przy kliknięciu instrukcje uruchamiające obsługę błędów, które będą wywoływać funkcję obsługi błędów i podejmować działania uzależnione od wyników dostarczonych przez tę funkcję.
5. Sprawdź działanie aplikacji.
Informacje dotyczące serii "Pod lupą" są publikowane w internetowym serwisie W W W pod adresem: http://www.domino.ok.pl/lupa
- 130
Domino 1999
Laboratorium 4 ..
Przygotowanie laboratorium
Na potrzeby tego laboratorium nie przygotowano żadnych plików. W trakcie jego trwania utworzysz nową bazę danych w katalogu \LABS\L,AB04.
4.1. Ćwiczenie 1
Praca z obiektami aplikacji
W ćwiczeniu tym przygotujesz kod, który będzie włączał i wyłączał wyświetlanie paska menu i pasków narzędzi. Dodatkowo przeprowadzisz defragmentację bazy danych z poziomu kodu.
UWAGA. Pamiętaj o użyciu instrukcji Option Explicit w sekcji deklaracji każdego z tworzonych modułów.
Przełączanie paska menu
1. Skopiuj do \LABS plik Northwind.mdb oraz Metody.mdb znajdujące się w katalogu \Program Files\Microsoft O~ce\O~ce\Przykldy.
2. Utwórz w katalogu \LABS\LAB04mową bazę danych o nazwie Dao.mdb.
3. Zaimponuj wszystkie tabele (struktura i dane) z pliku \LABS\Northwind.mdb
4. Z tego samego pliku zaimponuj kwerendy Sprzedaż wg pracowników i krajóvr oraz Podsumowania zamówień.
5. Utwórz makro i zachowaj je pod nazwą Puste makro.
UWAGA. Nie wprowadzaj NICZEGO do kolumny Akcja makra. Kolumna Komentarz może także pozostać pusta.
6. Utwórz nowy pusty formularz.
7. Utwórz przycisk polecenia i zmień j ego tytuł na P r z e ł ąc z p a s e k me nu.
8. Dodaj następujący kod do zdarzenia Przy kliknięciu tego przycisku: If Application.menubar = "Puste makro" Then
Application.menubar = "" Else
Application.menubar = "Puste makro" End If
9. Zachowaj formularz jako Ćwiczenie I i przełącz go do widoku Formularz. 10. Kliknij kilkukrotnie na przycisku Przełącz pasek menu. Co się dzieje?
Przełączanie pasków narzędzi
1. Dodaj kolejny przycisk polecenia do formularza Ćwiczenie I i zmień jego tytuł na Przełącz pasek narzędzi.
2. Dodaj następujący kod do zdarzenia Przy kliknięciu tego przycisku:
If Application.GetOption("Dost~pne wbudowane paski narzędzi") Then
Application.SetOption °Dost~pne wbudowane paski narzędzi", False
Informacje doly~ot w' int~netowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa
- 133
Microsoft Access 97 programowanie © oomin~ l~m
Else Application.SetOption "Dostępne wbudowane paski narzędzi", True
End If
3. Zachowaj formularz i przełącz go do widoku Formularz.
4. Kliknij kilkukrotnie na przycisku Przelącz pasek narzędzi. Co się dzieje?
Defragmentacja bazy danych z poziomu kodu
1. Dodaj kolejny przycisk polecenia do formularza Ćwiczenie 1 i zmień jego tytuł na Defragmentuj Metody.mdb.
2. Dodaj następujący kod do zdarzenia Przy kliknięciu tego przycisku:
DoCmd.Hourglass True
DBEngine.CompactDatabase "C:\LABS\Metody.MDB""C:\LABS\LAB04\Metody.New" MsgBox "Defragmentacja zakończona!" DoCmd.Hourglass False
3. Zachowaj formularz i przełącz go do widoku Formularz.
4. Kliknij na przycisku polecenia i poczekaj aż pojawi się okno komunikatu.
5. Uruchom Eksploratora Windows, aby stwierdzić, czy zdefragmentowany plik istnieje.
4.2. Ćwiczenie 2
Tworzenie przestrzeni roboczej z poziomu kodu
W ćwiczeniu tym przygotujesz funkcj ę, która będzie tworzyła nową przestrzeń roboczą i dodawała ją do bieżącej kolekcji. Kod ten dołączysz do przycisku polecenia nowego formularza.
1. Otwórz bazę danych \LABS\LAB04\Dao.mdb. 2. Utwórz nowy, pusty formularz.
3. W dowolnym miejscu formularza utwórz przycisk polecenia i zmień jego właściwość Tytul na Utwórz przestrzeń roboczą.
4. Dodaj poniższy kod do formularza dla zdarzenia Przy kliknięciu utworzonego przycisku:
Dim MojaPrzesterzen As WorkSpace Dim i As Integer
'Początkowa ilość przestrzeni roboczych w kolekcji MsgBox Str(DBEngine.workspaces.Count) &
" - Początkowa ilość przestrzeni."
'Utworzenie nowej przestrzeni i dodanie jej do kolekcji. Set MojaPrzesterzen =
DBEngine.CreateWorkspace("NowaPrzestrzeń", _ "r_d_Tnin", "") DBEngine.workspaces.Append MojaPrzesterzen
'Końcowa ilość przestrzeni roboczych w kolekcji
Informacje dotyczące serii "Pod lupą" są publikowane w intemetowym serwisie WWW pod a~ 1~~=r ~r-~w.domino.ok.pl/lupa
- 134
·O Domino 1999
Laboratorium 4
MsgBox Str(DBEngine.workspaces.Count) & _
" - Końcowa ilość przestrzeni." 'Wyświetlenie nazw przestrzeni roboczych w kolekcji For i = 0 To DBEngine.workspaces.Count - 1
MsgBox "PrzestrzenieRobocze(" & i & ").Nazwa: " & _ DBEngine.workspaces(i).Name Next
5. Zachowaj formularz jako Ćwiczenie 2 i przełącz go do widoku Formularz. 6. Kliknij na przycisku polecenia aby przetestować funkcj ę.
4.3. Ćwiczenie 3
Wyświetlenie numeru wersji aparatu obsługi baz danych oraz systemu
W tym ćwiczeniu utworzysz procedurę, która umożliwi określenie numeru wersji bazy danych. Jest to użyteczne, gdy chcesz mieć pewność, że pracujesz z najbardziej aktualną wersją bazy danych.
1. Otwórz bazę danych \LABS\LAB04\Dao.mdb. 2. Utwórz nowy, pusty formularz.
3. W dowolnym miejscu formularza utwórz przycisk polecenia i zmień jego właściwość Tytus na Wyświetl wers] e.
4. Dodaj poniższy kod do formularza dla zdarzenia Przy kliknięciu utworzonego przycisku:
Dim MojaBD As Database
Dim WerAp As String, WerBD As String
Set MojaBD = DBEngine.Workspaces(0).Databases(0) WerAp = DBEngine.Version
WerBD = MojaBD.Version
MsgBox "Wersja aparatu obsługi: " & WerAp MsgBox "Wersja bazy danych: " & WerBD
5. Zachowaj formularz jako Ćwiczenie 3 i przełącz go do widoku Formularz. 6. Kliknij na przycisku polecenia i poczekaj, aż pojawi się okno komunikatu. 7. Jakie informacje wyświetla okno komunikatu?
4.4. Ćwiczenie 4 Modyfikacja nazw tabel
W tym ćwiczeniu utworzysz procedurę, która będzie z poziomu kodu zmieniać nazwę tabeli.
1. Otwórz bazę danych ~LABS~LAB04\Dao.mdb. 2. Utwórz nowy, pusty formularz.
Intormacje dotyczące serii "l~Od 1~'s~es~a~towym serwisie W W W pod adresem: http://www.domino.ok.pl/lupa
- 135
Microsoft Access 97 programowanie © Domin~> ~ ~~
3. W dowolnym miejscu formularza utwórz przycisk przełącznika i zmień jego właściwość Tytulna Zmień nazwę tabeli.
4. Zmień właściwość Nazwa przycisku na ZmienNazweTabeli.
5. Dodaj poniższy kod do formularza dla zdarzenia Przy kliknięciu utworzonego przycisku:
Dim MojaBD As Database
Set MojaBD = DBEngine(0)(0)
'Jeśli przycisk jest wciśnięty to zmień nazwę na AAA If Me!ZmienNazweTabeli = -1 Then
MojaBD.TableDefs("Klienci").name = "AAA" Else
MojaBD.TableDefs("AAA").name = "Klienci" End If
'Odśwież kolekcję TableDefs MojaBD.TableDefs.Refresh RefreshDatabaseWindow
6. Zachowaj formularz jako Ćwiczenie 4 i przełącz go do widoku Formularz.
7. Kliknij na przycisku Zmień nazwę tabel".Zauważ, że w kontenerze bazy danych nazwa tabeli Klienci zmieniła się na AAA.
8. Kliknij na przycisku Zmień nazwę tabeli po raz drugi.Zauważ, że w kontenerze bazy danych nazwa tabeli AAA zmieniła się na Klienci.
4.5. Ćwiczenie 5
Wyświetlenie instrukcji SQL kwerendy
W tym ćwiczeniu przygotujesz procedurę, która będzie odczytywać instrukcję SQL istniejącej kwerendy.
1. Otwórz bazę danych \LABS\LAB04\Dao.mdb. 2. Utwórz nowy, pusty formularz.
3. W dowolnym miejscu formularza utwórz przycisk polecenia i zmień jego właściwość Tytuł na "Tekst instrukcji SQL".
4. Dodaj poniższy kod do formularza dla zdarzenia Przy kliknięciu utworzonego przycisku:
Dim MojaBD As Database Dim TekstSQL As String
Set MojaBD = DBEngine(0).OpenDatabase("C:\LABS\Northwind.mdb") TekstSQL = MojaBD.QueryDefs("Faktury").SQL
MsgBox TekstSQL
5. Zachowaj formularz jako Ćwiczenie 5 i przełącz go do widoku Formularz.
6. Kliknij na przycisku Tekst instrukcji SQL. Co pojawiło się w oknie komunikatu`?
Informacje dotyczące serii "Pod lupą" są publikowane w internetowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa
- 136
Domino 1999
4.6. Ćwiczenie 6
Laboratorium 4 ,
Praca z obiektami typu Recordset
W tym ćwiczeniu przygotujesz funkcję, która będzie przeglądać Recordset w bazie danych, zwracając każdy dziesiąty rekord tego obiektu. Napiszesz także kod, który będzie otwierał Recordset i podawał ile jest w nim rekordów.
Odczyt wybranych rekordów
I . Otwórz bazę danych ~L,ABS~L,AB04~Dao.mdb.
2. Utwórz nowy, pusty formularz.
3. W dowolnym miejscu formularza utwórz przycisk polecenia i zmień jego właściwość Tytuł na Pokaż każdy dziesiąty rekord.
4. Dodaj poniższy kod do formularza dla zdarzenia Przy kliknięciu utworzonego przycisku:
MojZestaw.Move 10 i = i + 10
Dim MojaBD As Database, MojZestaw As Recordset, Dim Nazwa As String, i As Integer
Set MojaBD = DBEngine.Workspaces(0).Databases(0)
Set MojZestaw = MojaBD.OpenRecordset("Klienci", DbOpenTable) MojZestaw.MoveFirst
i = 1
Do Until MojZestaw.EOF
Nazwa = MojZestaw![NazwaFirmy] MsgBox i & " - " & Nazwa
Loop MojZestaw.Close 5. Zachowaj formularz jako Ćwiczenie 6 i przełącz go do widoku Formularz.
6. Kliknij na przycisku Pokaż każdy dziesiąty rekord. Czy rzeczywiście zobaczyłeś każdy dziesiąty rekord?
Otwarcie obiektu Recordset i odczytanie ilości rekordów
1. Otwórz bazę danych ~L,ABS~LAB04~Dao.mdb.
2. Otwórz formularz Ćwiczenie 6 w widoku projektu.
3. W dowolnym miejscu formularza utwórz przycisk polecenia i zmień jego właściwość Tytuł na Policz rekordy.
4. Dodaj poniższy kod do formularza dla zdarzenia Przy kliknięciu utworzonego przycisku:
Dim MojaBD As Database, MojZestaw As Recordset, _ Ilosc As Integer
Set MojaBD = DBEngine(0)(0)
Set MojZestaw = MojaBD.OpenRecordset( _
"SELECT * EROM [Klienci] WHERE [Miasto] - 'Londyn "') MojZestaw.MoveLast
Ilosc = MojZestaw.Recordcount
Informacje dotyczące serii "Pod lupą" są publikowane w internetowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa
- 137
~, Microsoft Access 97 programowanie
Domina
MojZestaw.Close
MsgBox "Ilość rekordów = " & Ilosc
5. Zachowaj formularz i przełącz go do widoku Formularz.
6. Kliknij na przycisku Policz rekordy. Jak wielu klientów mieszka w Londynie?
4.7. Cwiczenie 7
Odczytywanie nazw i właściwości obiektów typu Container
W ćwiczeniu tym stworzysz pętlę przeglądającą kolejne obiekty typu container, zwracając nazwę i właściwości każdego z obiektów.
1. Otwórz bazę danych \LABS\LAB04\Dao.mdb. 2. Utwórz nowy, pusty formularz.
3. W dowolnym miejscu formularza utwórz przycisk polecenia i zmień jego właściwość Tytuł na Lista obiektów Container i ich właściwości.
4. Dodaj poniższy kod do formularza dla zdarzenia Przy kliknięciu utworzonego przycisku:
Dim MojaBD As Database
Dim c As Container, p As Proparty Dim i As Integer, j As Integer
Set MojaBD = DBEngine(0)(0)
For i = 0 To MojaBD.Containers.Count - 1 Set c = MojaBD.Containers(i) Debug.Print "CONTAINER: " & c.Name For j - 0 To c.Properties.Count - 1
Set p = c.Properties(j)
Debug.Print , p.Name & ":", p.Value Next j
Next i
MsgBox "zrobione! Rezultaty zobaczyć możesz w oknie bezpośrednim."
5. Zachowaj formularz jako Ćwiczenie 7 i przełącz go do widoku Formularz. 6. Kliknij na przycisku Lista obiektów Coy~taireer i ich wlaściwości.
7. Obejrzyj zawartość okna bezpośredniego.
4.8. Ćwiczenie 8
Wykorzystanie DAO do pracy z tabelami
W tym ćwiczeniu wykorzystasz DAO do manipulowania niektórymi podstawowymi parametrami tabel, takimi jak relacje między tabelami, pola i indeksy.
1. Otwórz bazę danych \LABS\LAB04\Dao.mdb.
Informacje dotyczące serii "Pod lupą" są publikowane w internatowym scrwisic W W W pod adresem: http://www.domino.ok.pl/lupa
- 138
Laboratorium 4
2. Otwórz okno Relacje i zauważ, jeżeli pomiędzy tabelami Pracownicy i Zamówienia jest relacji usuń ją.
3. Utwórz nowy, pusty formularz.
4. W dowolnym miejscu formularza utwórz przycisk polecenia i zmień jego właściwość Tytul na Utwórz relacj ~.
5. Dodaj poniższy kod do formularza dla zdarzenia Przy kliknięciu utworzonego przycisku:
Dim MojaRelacja As Relation Dim MojaBD As Database
Dim MojePole As Field
O Domino 1999
Set MojaBD = DBEngine(0)(0)
' Utworzenie nowego obiektu Relation.
Set MojaRelacja = MojaBD.CreateRelation("PracownicyZamówienia")
MojaRelacja.Table = "Pracownicy" MojaRelacja.ForeignTable = "Zamówienia"
Set MojePole = MojaRelacja.CreateField("IDpracownika") MojePole.ForeignName = "IDpracownika"
' Zachowanie definicji pola przez dołączenie go do kolek~;= ' Relations.
MojaRelacja.Fields.Append MojePole
' Zachowanie definicji relacji przez dołączenie jej do ' kolekcji Relations
MojaBD.Relations.Append MojaRelacja
MsgBox "Relacja została utworzona - sprawdź to w oknie Relacja."
6. Zachowaj formularz jako Ćwiczenie 8 i przełącz go do widoku Formularz. 7. Kliknij na przycisku Utwórz relację.
8. Otwórz okno Relacje i zauważ, że pomiędzy tabelami Pracownicy i Zamówienia pojawiła się nowa relacja.
Lista indeksów tabeli Pracownicy
1. Otwórz formularz Ćwiczenie 8 w widoku projektu.
2. W dowolnym miejscu formularza utwórz przycisk polecenia i zmień jego właściwość Tytuł na Lista indeksów.
3. Dodaj poniższy kod do formularza dla zdarzenia Przy kliknięciu utworzonego przycisku:
Dim MojaBD As Database, MojaTabela As TableDef
Dim i As Integer, MojePola As String, MojaNazwa As String
Set MojaBD = DBEngine(0)(0)
Informacje dotyczące serii "Pod lupą" są publikowane w internetowym serwisie WWW pod adresem: http://www.domino.ok.pUlupa
- 139
~^ "'~ O Domino 1999
Laboratorium 4
2. Otwórz okno Relacje i zauważ, jeżeli pomiędzy tabelami Pracownicy i Zamówienia jest relacji usuń ją.
3. Utwórz nowy, pusty formularz.
4. W dowolnym miejscu formularza utwórz przycisk polecenia i zmień jego właściwość Tytuł na Utwórz relacj ę.
5. Dodaj poniższy kod do formularza dla zdarzenia Przy kliknięciu utworzonego przycisku:
Dim MojaRelacja As Relation Dim MojaBD As Database
Dim MojePole As Field
Set MojaBD = DBEngine(0)(0)
' Utworzenie nowego obiektu Relation.
Set MojaRelacja = MojaBD.CreateRelation("PracownicyZamówienia")
MojaRelacja.Table = "Pracownicy" MojaRelacja.ForeignTable = "Zamówienia"
Set MojePole = MojaRelacja.CreateField("IDpracownika") MojePole.ForeignName = "IDpracownika"
' Zachowanie definicji pola przez dołączenie go do kolekcji ' Relations.~
MojaRelacja.Fields.Append MojePole
' Zachowanie definicji relacji przez dołączenie jej do ' kolekcji Relations
MojaBD.Relations.Append MojaRelacja
MsgBox "Relacja została utworzona - sprawdź to w oknie Relacja."
6. Zachowaj formularz jako Ćwiczenie 8 i przełącz go do widoku Formularz. 7. Kliknij na przycisku Utwórz relację.
8. Otwórz okno Relacje i zauważ, że pomiędzy tabelami Praco~~icw_ i Zamó~.-ienia pojawiła się nowa relacja.
Lista indeksów tabeli Pracownicy
1. Otwórz formularz Ćwiczenie 8 w widoku projektu.
2. W dowolnym miejscu formularza utwórz przycisk polecenia i zmień jego właściwość Tytuł na Lista indeksów.
3. Dodaj poniższy kod do formularza dla zdarzenia Przy kliknięciu utworzonego przycisku:
Dim MojaBD As Database, MojaTabela As TableDef
Dim i As Integer, MojePola As String, MojaNazwa As String
Set MojaBD = DBEngine(0)(0)
Informacje dotyczące sera "Pod lupą" są publikowane w internetowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa
- 139
Microsoft Access 97 programowanie © Domino I y~~~~ Set MojaTabela = MojaBD.TableDefs("Pracownicy")
For i = 0 To MojaTabela.Indexes.count - 1 MojaNazwa = MojaTabela.Indexes(i).Name MojePola = MojaTabela.Indexes(i).Fields
MsgBox "Nazwa indeksu: " & MojaNazwa & Chr(13) & Chr(10) & "Pola: " & MojePola
Next 4. Zachowaj formularz i przełącz go do widoku Formularz.
5. Kliknij na przycisku Lista indeksów. Co pojawiło się w oknie komunikatu?
Lista pól tabeli Kategorie
1. Otwórz formularz Ćwiczenie 8 w widoku projektu.
W dowolnym miejscu formularza utwórz przycisk polecenia i zmień jego właściwość Tytul na Lista pól.
Dodaj poniższy kod do formularza dla zdarzenia Przy kliknięciu utworzońego przycisku:
Dim MojaBD As Database, MojaTabela As TableDef
Dim i As Integer, MojaNazwa As String, MojTyp As Integer
Set MojaBD = DBEngine(0)(0)
Set MojaTabela = Moja»D.TableDefs("Kategorie")
For i = 0 To MojaTabela.Fields.count - 1 MojaNazwa = MojaTabela.Fields(i).Name MojTyp = MojaTabela.Fields(i).Type
MsgBox "Nazwa pola: " & MojaNazwa & Chr(13) & Chr(10) & "Typ: " & MojTyp
Next 6. Zachowaj formularz i przełącz go do widoku Formularz.
7. Kliknij na przycisku Lista pól. Jakie nazwy i typy pól zostały wyświetlone? Co oznaczają poszczególne numery typów? Jakie stałe języka VBA odpowiadają tym typom?
4.9. Ćwiczenie 9
Lista parametrów kwerendy
W tym ćwiczeniu utworzysz funkcj ę, która będzie wyświetlała listę parametrów zapytania.
1. Otwórz bazę danych \LABS\LAB04\Dao.mdb. 2. Utwórz nowy, pusty formularz.
3. W dowolnym miejscu formularza utwórz przycisk polecenia i zmień jego właściwość Tytuł na Lista parametrów.
4. Dodaj poniższy kod do formularza dla zdarzenia Przy kliknięciu utworzonego przycisku:
Dim MojaBD As Database, MojeZapytanie As QueryDef
Dim i As Integer, MojaNazwa As String, MojTyp As Integer
Informacje dotyczące scrii "Pod lupą" są publikowane w internetowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa
- 140
© Domino 1999
Laboratorium 4 , a
~;
Set MojaBD = DBEngine(0)(0)
Set MojeZapytanie = MojaBD.QueryDefs("Sprzedaż wg pracowników i krajów")
For i = 0 To MojeZapytanie.Parameters.count - 1 MojaNazwa = MojeZapytanie.Parameters(i).Name MojTyp = MojeZapytanie.Parameters(i).Type
MsgBox "Nazwa parametru: " & MojaNazwa & Chr(13) & Chr(10) & "Typ: " & MojTyp
Next 5. Zachowaj formularz jako Ćwiczenie 9 i przełącz go do widoku Formularz. 6. Kliknij na przycisku Lista parametrów.
4.10. Ćwiczenie dodatkowe 1
Właściwość tworzona przez użytkownika
W tym ćwiczeniu utworzysz właściwość zdefiniowaną przez użytkownika. Po wykonaniu tej procedury nie zauważysz właściwie żadnych efektów. Dlatego możesz wykonując tę funkcję wykorzystać pracę krokową.
1. Otwórz bazę danych ~LABS~L,AB04~Dao.rrcdb i utwórz nowy, pusty formularz.
2. W dowolnym miejscu formularza utwórz przycisk polecenia i zmień jego właściwość Tytul na Utwórz właściwość zdefiniowaną przez użytkownika.
3. Dodaj poniższy kod do formularza dla zdarzenia Przy kliknięciu utworzonego przycisku:
Dim MojaBD As Database
Dim MojaWlasciwosc As Property
Set MojaBD = DBEngine.Workspaces(0).Databases(0)
Set MojaWlasciwosc = MojaBD.CreateProperty("Ostatnio0twarty")
'Ustawienie typu danych i wartości nowej właściwości MojaWlasciwosc.Type = DB-DATE
MojaWlasciwosc.value = Now
'Dodanie właściwości do kolekcji Properties. MojaBD.properties.Append MojaWlasciwosc
MsgBox "Dodano właściwość użytkownika Ostatnio0twarty"
4. Zachowaj formularz jako Ćwiczenie dodatkowe 1 i przełącz go do widoku Formularz.
5. Kliknij na przycisku Utwórz właściwość zdefiniowaną przez użytkownika.
Informacje dot~oe~aa "Pod lupą" są publikowane w internetowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa
-141
Microsoft Access 97 programowanie © Domino ~ ~~~~
4.11. Ćwiczenie dodatkowe 2
Odczytywanie informacji o obiektach bazy danych
Wykorzystując VBA, utwórz procedurę wyświetlającą w oknie bezpośrednim listę wszystkich tabel, zapytań, formularzy, raportów i modulów bazy danych NorthWind.
4.12. Ćwiczenie dodatkowe 3
Programowe tworzenie relacji
Użyj przycisku polecenia do utworzenia relacji jedendowielu pomiędzy tabelami Pracownicy oraz Zamówienia z poziomu VBA. Dodaj drugi przycisk polecenia do kasowania relacji.
Informacje dotyczące serii "Pod lupą" są publikowane w internetowym serwisie WWW pod adresem: http://www.domino.ok.pl/lopa
- 142
O Domino 1999
Laboratorium 5 .
Przygotowanie laboratorium
Na potrzeby tego laboratorium przygotowany zostal plik LabOS.mdb, który znajduje się w katalogu \LABS\LABOS. Plik ten powinien być używany we wszystkich ćwiczeniach tego laboratorium.
5.1. Ćwiczenie 1
Tworzenie zestawu rekordów w oparciu o instrukcję SQL
W ćwiczeniu tym utworzysz obiekt Recordset w oparciu o instrukcję SQL. Kryteria wykorzystywane w tej instrukcji będą dostarczane jako argument funkcji.
UWAGA. Pamiętaj o użyciu instrukcji Option Explicit w sekcji deklaracji każdego z tworzonych modułów.
Utworzenie funkcji i deklaracja zmiennych
1. Otwórz bazę danych LabOS.mdb z katalogu \LABS\LABOS.
2. W oknie bazy danych wybierz zakładkę Moduły i kliknij na przycisku Nowy, aby utworzyć nowy moduł.
3. Utwórz funkcję o nazwie BudujSQL. Funkcja powinna akceptować argument Kr_werium typu String.
4. Zadeklaruj zmienne zgodnie z poniższą tabelą.
ZMIENNA TYP DANYCH M DB Database
M RecSet Recordset TekstSQL String
Określenie kryterium dla instrukcji SQL i otwarcie zestawu rekordów
1. Korzystając z zadeklarowanej wcześniej zmiennej typu String, przypisz jej następującą instrukcję SQL:
TekstSQL = "SELECT * EROM Kategorie WHERE [IDkategorii]>=" _ & Kryterium
2. Poprzez użycie metody OpenRecordset otwórz zestaw rekordów, używając zmiennej typu String jako argumentu.
Przegląd rekordów spełniających kryteria
· Używając pętli While i instrukcji Debug.Print, wyświetl zawartość pól IDkategorii oraz NazwaKategorii.
UWAGA. Więcej informacji na temat właściwości EOF można znaleźć w pliku pomocv nod hasłem EOF.
Informacje dotyc~oe sari "POd IupPE' są publikowane w internetowym serwisie WWW pod adresem: http:ffwww.domino.ok.plllupa
- 145
Microsoft Access 97 programowanie © Domino l~yo
Twoja funkcja powinna być podobna do poniższego przykładu.
Public Function BudujSQL(Kryterium As String) Dim TekstSQL As String
Dim MyDb As Database
Dim MyRecSet As Recordset
TekstSQL = "SELECT * FROM Kategorie WHERE _ [IDkategorii] >_ "&~ Kryterium
Set MyDb = CurrentDb()
Set MyRecSet = MyDb.OpenRecordset(TekstSQL) MyRecSet.MoveFirst
Do While Not MyRecSet.EOF
Debug.Print "ID: " & MyRecSet![IDkategorii] & " Nazwa: " _ & MyRecSet![NazwaKategorii] MyRecSet.MoveNext
Loop
End Function
Testowanie kompletnej funkcji
1. Dokonaj kompilacji modułu i zapisz go pod nazwą Ćwiczenie 1.
Uruchom funkcję wpisując w oknie analizy programu ?Buduj SQL ( "4" ) .
Czy funkcja wyświetliła rekordy, których IDkategorii jest mniejszy niż 3? Wpisz odpowiedź poniżej.
Co powinieneś zrobić, aby uzyskać wszystkie rekordy? Wpisz odpowiedź poniżej.
5.2. Ćwiczenie 2
Usuwanie błędów wykonania
W tym ćwiczeniu będziesz poprawiać błąd wykonania, jaki pojawia się przy użyciu w stosunku do obiektu metody, której on nie obsługuje. Najpierw uruchomisz kod z błędem, a następnie skorzystasz z systemu pomocy w celu jego usunięcia.
Sprawdź działanie przykładowego kodu. Zwróć uwagę na to, że kod próbuje otworzyć obiekt Recordset typu utrwalonego (snapshot).
1. Utwórz nowy moduł i wpisz poniższy kod:
Public FunCtion CatchError()
Dim MyDb As DATABASE, MySnap As Recordset
Set MyDb = CurrentDb
Set MySnap - MyDb.OpenRecordset("SELECT * EROM Categories", _ dbOpenSnapshot, dbForwardOnly)
Informacje dotyczące serii "Pod lupą" są publikowane w internetowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa
- 146
Domino 1999 Laboratorium 5
MySnap.MoveLast Debug.Print MySnap.RecordCount End Function
2. Przed uruchomieniem kodu zapisz moduł jako Ćwiczenie 2.
3. Uruchom kod. Po uruchomieniu kodu przeczytaj w systemie pomocy opis błędu o numerze 3078. Popraw błąd w oparciu o uzyskane informacje. Ponownie uruchom kod.
4. Po uruchomieniu kodu przeczytaj w systemie pomocy opis błędu o numerze 3'' 19.
5. Popraw błąd w oparciu o informacje znalezione w Pomocy.Problem może być rozwiązany przez usunięcie z kodu linii MySnap . MoveLast. Lepiej jednak wykonać poniższą poprawkę:
Set MySnap = MyDb.OpenRecordset("SELECT * FROM Kategorie", _ dbOpenSnapshot)
6. Uruchom kod jeszcze raz, tym razem w poprawnej wersji.
5.3. Ćwiczenie 3
Użycie metody Find do wyszukiwania rekordów
W tym ćwiczeniu będziesz lokalizować rekordy wykorzystuj ąc metodę Find. Przypominam, że metoda Find może być stosowana tylko do obiektów Recordset r`'pu d~_-namicznego (dynaset) i utrwalonego (snapshot).
Utworzenie funkcji i otwarcie zestawu rekordów typu dynamicznego
1. Utwórz funkcję o nazwie ZnajdzRekord.
2. Zadeklaruj zmienne zgodnie z poniższą tabelą.
NNA ' TYp DANYCH M DB Database
M Rec Recordset Kryteria ~ String
3. Otwórz obiekt Recordset typu dynamicznego, wykorzystuj ąc tabelę Kategorie.
Utworzenie kryterium wyszukiwania
Ograniczysz wyszukiwanie tylko do tych rekordów, których warto ść w polu NazwaKategorii zaczyn się od litery "P".
4. Dodaj następującą linię kodu do funkcji:
Kryteria = "NazwaKategorii Like 'P*"'
Wykorzystanie właściwości NoMatch
1. Użyj metody FindFirst do lokalizacji pierwszego rekordu, spełniaj ącego kryterium.
2. Wykorzystując pętlę Do w raz z właściwością NoMatch obiektu Recordset, przejrzyj cały zestaw rekordów.
3. Wyświetl rekordy spełniaj ące kryterium wykorzystuj ąc instrukcj ę Debug.Print
Informacje dotyczące serii "Pod lupą" są publikowane w internetowym serwisie W W W pod adresem: http://www.domino.ok.pl/lupa
- 147
Microsoft Access 97 programowanie © Domino ~ 9~~
4 . Zastosuj to samo kryterium do metody FindNext obiektu Recordset w celu lokalizaeji kolejnego rekordu przed powrotem na początek pętli. W tym momencie Twój kod powinien być podobny do poniższego przykładu.
Public Function ZnajdzRekord()
Dim MyDb As Database Dim MyRec As Recordset Dim Kryteria As String
Set MyDb = CurrentDb()
Set MyRec = MyDb.OpenRecordset("Kategorie",dbOpenDynaset) Kryteria = "NazwaKategorii Like 'P*"'
MyRec.FindFirst Kryteria Do Until MyRec.NoMatch
Debug.Print MyRec![IDkategorii] Debug.Print MyRec![NazwaKategorii] MyReC.FindNext Kryteria
Loop End Function
5.4. Ćwiczenie 4
Użycie metody Seek do wyszukiwania rekordów
W tym ćwiczeniu będziesz lokalizować rekordy wykorzystuj ąc metodę Seek. Przypominam, że metoda Find może być stosowana tylko do obiektów Recordset typu tabela.
Utworzenie funkcji, deklaracja zmiennych i otwarcie zestawu rekordów 1. Utwórz funkcję o nazwie SzukajRekord.
2. Zadeklaruj zmienne zgodnie z poniższą tabelą.
ZMIENNA TYP DANYCH M DB Database MyRec Recordset
3. Otwórz obiekt Recordset typu tabela, wykorzystuj ąc tabelę Kategorie.
4. Ustaw właściwość Index
MyRec.Index = "PrimaryKey"
5. Wykorzystaj metodę Seek w celu znalezienia wszystkich rekordów, w których IDkategorii równe jest 3
MyRec.Seek "_", 3
Wykorzystanie instrukcji warunkowej w celu lokalizacji rekordu
1. Używając właściwości NoMatch i instrukcji If...Then...Else określ, czy rekord został znaleziony. Jeśli rekord zostanie znaleziony, wyświetl zawartość pól IDkutegorii oraz NazwuKutegorii. Jeśli rekord nie zostanie znaleziony, wyświetl okno komunikatu in
Informacje dotyczące serii "Pod lupą" są publikowane w internetowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa
- 148
© Domino 1999
Laboratorium 5
formujące użytkownika o tym fakcie. W tym momencie Twój, kod powinien być podobny do poniższego przykładu.
Public Function SzukajRekord() Dim MyDb As Database
Dim MyRec As Recordset Set MyDb = CurrentDb()
Set MyRec = MyDb.OpenRecordset("Kategorie", dbOpenTable) MyRec.Index = "PrimaryKey" ' Definiuje bieżący indeks. MyRec.Seek "_", 3 ' Wyszukuje rekord.
If MyRec.NoMatch Then
MsgBox "Taki rekord nie istnieje" Else
MsgBox "ID kategorii: " & MyRec![IDkategorii] & Chr(13) & Chr(10) & "Nazwa kategorii: " & MyRec![NazwaKategorii] End If
End Function
2 . Uruchom i przetestuj funkcj ę.
5.5. Ćwiczenie 5
Implementacja przetwarzania transakcji
W tym ćwiczeniu wykorzystasz przetwarzanie transakcji do przeprowadzenia masowych modyfikacji w obiekcie Recordset. Będziesz pracował z tabelą Pracownicy bazy danych w celu zmiany wartości pola Stanowisko z Przedstawiciel handlowy na Szef rachunkowości. Transakcje możesz realizować w oparciu o obiekt Workspace. Więcej informacji na temat przetwarzania transakcji możesz znaleźć w Pomocy pod hasłami BeginTrans, CommitTrans oraz RoldBack.
Utworzenie procedury Sub, deklaracja zmiennych i otwarcie obiektu Workspace
Wykorzystując obiekt Workspace otwórz bazę danych i utwórz obiekt Recordset w oparciu o tabelę Pracownicy.
1. W bazie LabOS.mdb utwórz nowy moduł, a w nim procedurę typu Sub o nazwie ZmienStanowisko.
2. Zadeklaruj zmienne zgodnie z poniższą tabelą.
~A~iENNA strNazwisko strKomunikat strPytanie wspDefault dbsNorthwind rstPracownicy
TYP I)ANYCI String
String String Workspace Database Recordset
Otwarcie obiektów Workspace, Database oraz Recordset Przypisz zmiennej Workspace bieżący obiekt Workspace.
Informacje datye~oe sau .,Pod lupą" są publikowane w internetowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa
- 149
Microsoft Access 97 programowanie © Domin,
2. Przypisz zmiennej Database bazę danych Northwind.mdb
3. Otwórz zestaw rekordów w oparciu o tabelę Pracownicy. Twój kod powinien być podobny do poniższego.
Set wspDefault = DBEngine.Workspaces(0)
Set dbsNorthwind = wspDefault.OpenDatabase("Northwind.mdb") Set rstPracownicy = dbsNorthwind.OpenRecordset("Pracownicy", _ dbOpenTable)
Rozpoczęcie transakcji w bieżącym obszarze roboczym i lokalizacja określonych rekordów
1. Użyj metody BeginTrans w celu rozpoczęcia transakcji w obszarze roboczym.
2. Zastosuj pętlę Do w celu znalezienia wszystkich rekordów, w których pole Stanowisko ma wartość Przedstawiciel handlowy.
3. Zapytaj użytkownika o potwierdzenie przed dokonaniem zmiany zawarto ści pola Stanowisko na Szef rachunkowości. Jeśli użytkownik wybierze przycisk Tak, zmodyfikuj rekord, jeśli użytkownik wybierze przycisk Nie, przejdź do kolejnego rekordu i zapytaj użytkownika ponownie.
4 . Po przeglądzie całego zestawu rekordów, zapytaj użytkownika czy akceptuje, czy też odrzuca wszystkie zmiany. Jeśli użytkownik wybierze przycisk Tak, zaakceptuj zmiany poprzez użycie metody CommitTrans,jeśli użytkownik wybierze przycisk Nie, anuluj zmiany poprzez użycie metody RollBack. Twoja procedura Sub powinna być podobna do poniższego przykładu:
Public Sub ChangeTitle()
Dim strNazwisko As String, strKomunikat As String, strPytanie _ As String
Dim wspDefault As Workspace, dbsNorthwind As Database Dim rstPracownicy As Recordset
strPytanie = "Zmienić stanowisko na Szef rachunkowości?" Set wspDefault = DBEngine.Workspaces(0) 'Użyj bieżącego ' Użyj bazy danych Northwind.mdb.
Set dbsNorthwind = wspDefault.OpenDatabase("Northwind.mdb") ' Otwórz tabelę.
Set rstPracownicy = dbsNorthwind.OpenRecordset("Pracownicy", _ dbOpenTable) wspDefault.BeginTrans ' Początek transakcji. rstPracownicy.MoveFirst
Do Until rstPracownicy.EOF
If rstPracownicy![Stanowisko] - _ "Przedstawiciel handlowy" Then strNazwisko = rstPracownicy![Nazwisko] & _
" " & rstPracownicy![Imi~]
strKomunikat = "Pracownik: " & strNazwisko & _ vbCrLf & vbCrLf
If MsgBox(strKomunikat & strPytanie, vbQuestion _ + vbYesNo, "Zmiana stanowiska") - vbYes Then rstPracownicy.Edit ' Rozpoczęcie edycji. rstPracownicy![Stanowisko] - _
"Szef rachunkowości"
Informacje dotyczące serii "Pod lupą" są publikowane w internetowym serwisie W W W pod adresem: http://www.domino.ok.pl/lupa - 15~ - ~
O Domino 1999
Laboratorium 5
rstPracownicy.Update ' Zapisanie zmian. End If
End If
rstPracownicy.MoveNext ' Pezejście do następnec~ ' rekordu.
Loop If MsgBox("Zapisać zmiany?", vbQuestion + vbYeslc, _
" Zapis zmian") - vbYes Then wspDefault.CommitTrans ' Przyjęcie zmian. Else
wspDefault.Rollback ' Wycofanie zmian. End If
rstPracownicy.Close ' Zamknięcie tabeli. dbsNorthwind.Close
End Sub
4. Uruchom i przetestuj swoj ą procedurę Sub.
5.6. Ćwiczenie dodatkowe
Tworzenie zestawu rekordów w oparciu o instrukcję SQL
W ćwiczeniu tym rozbudujesz funkcję, którą utworzyłeś w Ćwiczeniu l, poprzez użycie opcjonalnych argumentów i technikę konkatenacji.
Ćwiczenie to zawiera znacznie mniej szczegółowych instrukcji w porównaniu z większością ćwiczeń w tym laboratorium. Możesz wykorzystać to ćwiczenie w celu sprawdzenia, czy rozumiesz techniki wykorzystywane w tym module.
1. Zmodyfikuj Ćwiczenie 1 tak, aby funkcja akceptowała Kryterium jako argument opcjonalny. Jeśli parametr Kryterium nie zostanie podany, funkcja powinna wyświetlać wszystkie rekordy.
Zmodyfikuj instrukcję SQL w Ćwiczeniu l, używając zmiennej dla podania nazwy tabeli.
UWAGA. Wymaga to konkatenacji zmiennej w miejscu użycia określonej nazwy tabeli.
Informacje dotyczące serii "Pod lupą" są publikowane w internetowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa
- 151
Domino 1999
Laboratorium 6
Przygotowanie laboratorium
Na potrzeby tego laboratorium przygotowany został plik Lab0ó.mdb, który znajduje się w katalogu ~L,ABS~L,AB06. Plik ten powinien być używany we wszystkich ćwiczeniach tego laboratorium.
6.1. Cwiczenie 1
Użycie procedur Property
W tym ćwiczeniu będziesz pracować z procedurami właściwości. Wykorzystasz instrukcje Property Set, Property Get oraz Property Let w celu odczytania aktualnej nazwy formularza i wskazania go jako formularza aktywnego.
Utworzenie modułu i deklaracja zmiennych 1. Utwórz standardowy moduł.
2. W sekcji deklaracji modułu zadeklaruj zmienne, zgodnie z poniższą tabelą.
Użycie procedury Property Set
1. W module, poniżej sekcji deklaracji wpisz poniższy kod.
Public Property Set currentform(frm As Object)
End Property
2. Przypisz zmiennej cform wartość zmiennej obiektowej frm.
3. Przypisz właściwości Caption (Tytuł) obiektu Form wartość B i e ż ąc y f o rmularz.
4. Uaktywnij obiekt Form (ustaw fokus). Twój kod powinien być podobny do poniższego przykładu.
Public cForm As Form
Public Property Set currentform(frm As Object) Set cForm = frm
frm.Caption = "current form" frm.SetFOCUs
End Property
Użycie procedury Property Get
1. W module, poniżej procedury Property Set, wpisz poniższy kod.
Public Property Get currentform() As Variant
End Property
Informacje dotyczące serii "Pod lupą" są publikowane w internetowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa
-155
Microsoft Access 97 programowanie o Domino n~~~ __M,
2. Przypisz właściwości currentform wartość wskazującą obiekt cform. Twój kod powinien być podobny do poniższego przykładu.
Public Property Get currentform() As Variant currentform = cform.Name
End Property
Użycie procedury Property Let
1. W module, poniżej procedury Property Get, wpisz następujący kod.
Public Property Let ToolbarOn(Opcja As Integer)
End Property
2 . Używając metody SetOption obiektu Application przypisz opcji Dost~pne wbudowane paski narzędzi wartość False, gdy argument procedury ma wartość 0. W przeciwnym przypadku przypisz wartość True. Twój kod powinien być podobny do poniższego przykładu.
Public Property Let ToolbarOn(Opcja As Integer)
Select Case Opcja Case 0
Application.SetOption
Case Else Application.SetOption
"Dost~pne wbudowane paski narz~dzi", _ False
"Dostępne wbudowane paski narzędzi", _ True
End Select End Property
3. Zapisz moduł pod nazwą Cwiczenie 1. Przed rozpoczęciem testowania procedur właściwości należy otworzyć formularz Kategorie.
4. W oknie analizy programu wpisz poniższe polecenia, w celu przetestowania własnych procedur właściwości.
set currentform = forms!kategorie
5. Wciśnij [Enter]. Formularz Kategorie powinien pojawić się z tytułem Bieżący formularz.
6. Wpisz ?currentform i wciśnij [Enter].
7. Wpisz ToolbarOn - 0, w celu przetestowania ostatniej procedury właściwości. Wciśnij [Enter].
8. Wpisz ToolbarOn - l, w celu przetestowania ostatniej procedury właściwości. Wciśnij [Enter].
6.2. Ćwiczenie 2
Tworzenie uniwersalnych kodów
W tym ćwiczeniu wykorzystasz właściwość CbdeContextObject w celu utworzenia uniwersalnego kodu. Właściwość ta jest rozszerzeniem właściwości Me, która była dostępna w Micrn.snft A ccess 2. 0. CodeContextObject może być wykorzystana
Informacje dotyczące serii "Pod lupą" są publikowane w intemetowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa
- 156
O Domino 1999
Laboratorium 6 ,
W
w modułach standardowych, podczas gdy właściwość Me jest dostępna tylko w modułach klas. (Moduły klas odpowiadają modułom formularzy w Microsoft Access 2.0)
Utworzenie funkcji z uniwersalnym kodem
Utwórz nowy moduł, a w nim funkcję o nazwie BardzoUniwersalna.
2 . Użyj właściwości CodeContextObject do przypisania wartości właściwościom CaBtion (Tytuł) oraz BackColor (KolorTła) formularza. Twoja funkcja powinna być podobna do poniższej.
Public Function BardzoUniwersalna() CodeContextObject.Caption = "To jest bardo elastyczne" CodeContextObject.Section(0).BackColor = 12323
End Function
3. Zapisz moduł jako Ćwiczenie 2
Test funkcji wewnątrz formularza
1. Utwórz nowy, pusty formularz. Umieść na nim przycisk polecenia. Zaznacz przycisk i wyświetl jego arkusz właściwości.
2. W procedurze zdarzenia Przy kliknięciu umieść wywołanie funkcji BardzoUniwersalna
3. Przełącz formularz do widoku formularza i kliknij na przycisku. Kiedy klikniesz na przycisku zauważysz, że zmienił się tytuł formularza, a także jego kolor tła.
Utworzenie nowej funkcji, przeglądającej wszystkie formanty formularza Użyjesz pętli For...Each do przejrzenia formantów w dowolnym formularzu.
1. W tym samym module utwórz nową funkcję, o nazwie ListaFormantow. 2. Zadeklaruj zmienne, zgodnie z poniższą tabelą.
ZMIENNA TYP DANYCH frm Fonu Ctl Control
3. Przypisz zmiennej frm wartość wskazującą na formularz Kategorie. 4. Przejrzyj formanty poprzez użycie pętli For...Each.
5. Wyświetl nazwy formantów, używając metody Debug.Print. 6 . Twoja funkcja powinna być podobna do pokazanej poniżej.
Public Function ListaFormantow() Dim Frm As Form
Dim Ctl As Control
Set Frm = Forms!Kategorie For Each Ctl In Frm.Controls
Debug.Print Ctl.Name Next Ctl
End Function
Informacje dotyczące serii "Pod lupą" są publikowane w internatowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa
- 157
Microsoft Access 97 programowanie © Domino 1999
7. Uruchom i przetestuj funkcję.
6.3. Ćwiczenie dodatkowe Użycie funkcji CreateForm
W ćwiczeniu tym utworzysz w sposób dynamiczny formularz, przy pomocy którego będziesz mógł dodawać, edytować i kasować rekordy.
Ćwiczenie to zawiera znacznie mniej szczegółowych instrukcji w porównaniu z większością ćwiczeń w tym laboratorium. Możesz wykorzystać to ćwiczenie w celu sprawdzenia, czy rozumiesz techniki wykorzystywane w tym module.
UWAGA. Więcej informacji na temat funkcji CreateForm oraz CreateControl można znaleźć w pliku pomocy.
1. Utwórz w sposób dynamiczny formularz, wykorzystując funkcję CreateForm. 2. Jako źródło rekordów wskaż tabelę Pracownicy.
3. Utwórz w formularzu trzy formanty typu pole tekstowe.
4. Przypisz właściwościom ControlSource pól tekstowych wartości wskazujące na pola IDpracownika, Imię oraz Nazwisko tabeli Pracownicy.
5. Przełącz formularz na widok formularza. Powiniene ś być w stanie dodawać, edytować i kasować rekordy przy pomocy tego formularza.
Informacje dotyczące serii "Pod lupą" są publikowane w internetowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa
- 158
C~) Domino I ~l9il
Laboratorium 7 ~ -:_
_.
Przygotowanie laboratorium
Na potrzeby tego laboratorium przygotowano odpowiednie pliki (katalog LABS\LABS07). W trakcie jego trwania utworzysz nową bazę danych w katalogu \LABS\LAB07.
Informacje dodatkowe
Dodatkowe informacje na temat wszystkich funkcji wykorzystywanych w tych ćwiczeniach możesz znaleźć w pliku pomocy.
7.1. Ćwiczenie 1
Odczyt plików tekstowych ASCII
W tym ćwiczeniu wykorzystasz odpowiednie funkcje w celu otwarcia i odczytu pliku tekstowego ASCII.
Uwaga. Pamiętaj o użyciu instrukcji Option Explicit w sekcji deklaracji każdego z tworzonych modułów.
Utworzenie formularza
1. Utwórz w katalogu \LABS\LAB07 nową bazę danych o nazwie Fio.mdh. 2. Utwórz nowy formularz.
3. Umieść na formularzu elementy steruj ące, zgodnie z poniższym rysunkiem jedno pole tekstowe z etykietą oraz dwa przyciski poleceń.
Config.Lab:
t~dczt ~~,plf Konlic
Procedura odczytu pliku
Dla właściwości Przy kliknięciu przycisku Odczyt utwórz procedurę, która będzie odczytywać zawartość pliku C cmj~~.l~~i~, znajdującego się w katalogu \LABS\LAB07 i wyświetlać jego zawartość w polu tcl;sto~ y m na formularzu.
Do otwarcia pliku wykorzystaj instrukcj ę ()pcn.
2. Rozpocznij od odczytu pierwszej linii pliku Corcfig.lab, a do odczytu wszystkich utwórz pętlę. Do odczytu zawartości pliku inożesz~użyć instrukcję Input.
lnformacjc duty.;zą.;c serii "Pod lupą' s~ puhiikowane w internetowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa
-161
Microsoft Access 97 programowanie © Domino ,9y~, _..:.
7.2. Ćwiczenie 2
Zapis wartości do pliku tekstowego ASCII
W tym ćwiczeniu wykorzystasz odpowiednie funkcje w celu otwarcia i zapisu do pliku tekstowego ASCII.
1. Wykorzystaj formularz utworzony w poprzednim ćwiczeniu.
2. Kliknij na przycisku Odczyt w celu wypełnienia pola tekstowego.
3. Dokonaj modyfikacji zawartości pola tekstowego poprzez dodanie na końcu nowej linii:
Buffers=20
4. Dla właściwości Przy kliknięciu przycisku Zapis utwórz procedurę, która zmiany dokonane w polu tekstowym wprowadzi do pliku Config.lab.
WSKAZÓWKA. Skopiuj procedurę z poprzedniego ćwiczenia i zmodyfikuj ją.
5. Aby zapisać informacje do pliku tekstowego powinieneś użyć instrukcji Write oraz Open for Output. Procedury dla przycisków Odczyt i Zapis powinny być zbliżone do poniższych.
Private Sub Odczyt_Click()
Dim FileData As String, Dim Display As String Open "\LABS\LABS07\config.lab" For Input As #1 Do While Not EOF(1)
Input #1, FileData
Display = Display & FileData + Chr(13) + Chr(10) Loop
FieldO = Display Close #1
End Sub
Private Sub Zapis_Click()
Dim FileData As String, Dim Display As String Open "\LABS\LABS07\config.lab" For Output As #1 write #1, FieldO
Close #1 End Sub
7.3. Ćwiczenie 3
Import pliku tekstowego ASCII do tabeli
W tym ćwiczeniu przeprowadzisz import pliku tekstowego ASCII do tabeli, przy czym plik ten nie będzie miał standardowego formatu rozdzielanego lub o stałej szerokości. Plik ten znajdziesz w katalogu \LABS~L,AB07, nazywa się on Poczta.txt.
Utworzenie tabeli do przechowywania importowanych danych
1. Obejrzyj zawartość pliku Poczta.txt przy pomocy Notatnika, albo innego edytora tekstu. Plik ten zawiera etykiety adresowe o standardowej postaci, przeznaczonej do wydruku.
Informacje dotyczące serii "Pod lupą" są publikowane w internetowym serwisie WWW pod adresem: http://www.domino.ok.pUlupa
- 162
C~)Dc,rninol`)09 - Lll!hOY(ltOYl.lll~? % ?. Utwórz tabcl4 do przechowania impmtmi..:-w-cti danych.
3. Tabela ta powinna zawierać następujące psia: · Imię;
· N1GWIS);O;
· Adres; · Miasto; · Region;
· Kod pocztowy.
Utworzenie procedury importującej dane do tabeli 1. Utwórz pusty formularz.
2. Dla właściwości Przy kliknięciu przycisku Importuj Mail.txt utwórz procedurę odczytującązawartość pliku Poczta.txr.
3. Wykorzystaj DAO do utworzenia uhickm Recordset i dodania danych do tabeli. 4. Zachowaj formularz i spraw~~ii sypu cillVl~llllc.
Private Sub Button0_"~ick()
Dim db As Databa~ , ~ R.~ :,or ~I:~- ~ , s As String
Do
Set db = DBEngine(G)(u)
Set r = db.OpenRecordset ("POC;2TA" )
Open "C:\LABS\LABS~~\POCZTA.TXT" F~r Tnr~,~t As #I
r.Update If Not EOF(~l Tr.Pn Line Inp~_~t
Fnd T~
Loop U1~~ i L " ' ( l Clo:,~~ if
r.'' . db.Cloae
r(~~Mias'--r~~ _ rr._~;t-rl , ~ " , r("Reąi.. =_`' .:;: .
-, , r("Kod pocztowy") , lrStr(:, ' ", ~ ~)
Line Input #_, r.AddNew r("Imię") _ Mid(.,, c.~~, ,.,, , . 1/ r("Nazwisko"1 ' Line In~~-~,'
r("Adres") Line Input ,
End Sub
Iniimmacje dntvc~.lce serii "P«d lupo" są puhlikowane w internetowvm verwisie WWW pod aidresem: http://www.domino.ok.pl/lupa - 1
Microsoft Access 97 programowanie © Domino 199u _.
7.4. Cwiczenie dodatkowe
Import danych z pliku tekstowego ASCII
W tym ćwiczeniu przeprowadzisz import pliku tekstowego ASCII do tabeli, przy czym plik ten nie będzie miał standardowego formatu rozdzielanego lub o stałej szerokości. Plik ten znajdziesz w katalogu ~L,ABS~L,AB07, nazywa się on Dodatek.txt.
Przygotowanie importu pliku
1. Obejrzyj zawartość pliku Dodatek.txt przy pomocy Notatnika, albo innego edytora tekstu. Ćwiczenie to jest podobne do poprzedniego, z wyjątkiem tego, że niektóre adresy zawierają numer mieszkania w dodatkowym wierszu.
2. Dodaj do tabeli pole Nr mieszkania.
3. Zmodyfikuj procedurę przygotowaną w poprzednim ćwiczeniu, tak by wiersz z numerem mieszkania przeniesiony został z pliku tekstowego do tabeli.
Informacje dotyczące serii "Pod lupą" są publikowane w internetowym serwisie WWW pod adresem: http://www.domino.ok.pl/lupa
- 164