AC PRG1

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:

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:

  1. Użytkownik uruchamia aplikację, a makro o nazwie AutoExec automatycznie otwiera wejściowy formularz.

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

  2. Jeżeli istnieje procedura obsługująca to zdarzenie to zostaje ona wykonana.

  3. Aplikacja oczekuje na następne zdarzenie.


1.2.1. Programowanie tradycyjne kontra sterowane zdarzeniami

Tradycyjny program

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:

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.

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.


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.


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.


VBA może wykonywać operacje na kolejnych rekordach pewnego zbioru rekordów. Makro przeciwnie, w jednym momencie pracuje na całym zbiorze rekordów.

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

Istnieje kilka zadań przy projektowaniu aplikacji, które można z powodzeniem zrealizować tylko przy użyciu makro:


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

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

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 edyto­rze 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 usta­wiony na słowie kluczowym VBA (takim jak predefiniowana in­strukcja, funkcja, operator czy metoda) lub właściwości.

[F2]

Wyświetla przeglądarkę obiektów. Przeglądarka obiektów jest na­rzę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żli­wość zastosowania lub nie takich narzędzi jak:

1.4.4. Typy Modułów

Baza danych może zawierać dwa typy modułów:

Moduły standardowe

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 aplika­cji. 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 standardo­wym.


Moduły klas

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 ra­portu 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 za­wiera 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 for­mularza 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 ka­sujemy formularz czy raport ich moduły są także kasowane. W module wolno umiesz­czać 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 ro­dzaje procedur: typu Sub i typu Function. W tym podrozdziale przyjrzymy się obu ty­pom procedur. Pomimo wielu wbudowanych funkcji, czasem zachodzi potrzeba utworzenia własnej procedury.


Po co tworzyć własne 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ą proce­durę do wykonania tych działań lub obliczeń. Na przykład, wyobraźmy sobie, że musi­my 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:


1.5.1. Charakterystyka procedur typu Sub

Procedury typu Sub realizują operacje, lecz nie zwracają żadnych wartości i nie mo­gą 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 na­pisać procedurę obsługującą zdarzenie, które ustawia fokus na określony formant wte­dy, gdy użytkownik opuszcza inny formant.


Jedność kodu

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


Pobieranie argumentów

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.


Brak zwracanych wartości

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 widocz­nej zarówno przez procedurę jak i kod wywołujący. Wymaga to przesłania do procedu­ry argumentu przez wartość, co jest domyślnym sposobem przekazywania. Problem wi­doczności zmiennych jest omawiany w dalszej części podręcznika.


Wywołanie procedury Sub z okna Analizy programu

Aby wywołać procedurę Sub z okna analizy programu należy użyć pełnego odwoła­nia 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ść.


Instrukcje Function i End Function

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


Pobieranie argumentów

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.


Zwracana wartość

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


Wywołanie procedury Function z okna Analizy programu

Aby wywołać procedurę Function z okna analizy programu należy użyć pełnego od­woł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 na­zwie, 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 procedu­ry 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 .


Dlaczego używamy zmiennych?

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.


W jaki sposób Visual Basie for Application posługuje się zmiennymi?

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 po­mocą 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 utwo­rzenie nowej zmiennej o takiej nazwie. Do dobrej praktyki programowania należy jed­nak jawne deklarowanie zmiennych i jawne nadawanie im typu danych. Jawne dekla­rowanie zmiennych ułatwia proces usuwania błędów programu.


Instrukcja Option Explicit

Instrukcja Option Explicit wymusza jawne deklarowanie zmiennych w module. In­strukcja 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.


Instrukcja Dim

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. Po­nadto wartość zmiennej w procedurze jest lokalna dla tej procedury. Nie możemy uzy­skać 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 lub Preserve ReDim

Instrukcja ReDim deklaruje tabelę dynamiczną oraz rezerwuje lub zwalnia miejsce dla zmiennych dowolnego typu. Preserve ReDim również rezerwuje lub zwalnia miej­sce i dodatkowo zabezpiecza dane w tabeli.


Instrukcja Array

Zbiór elementów tego samego typu kolejno ponumerowanych. Każdy element posia­da unikalny indeks identyfikujący go. Zmiana jednego elementu tabeli nie wpływa na pozostałe elementy.

Instrukcja Static

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


Instrukcja Public/Private

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ś za­deklarowane jako Private nie. Instrukcja Option Private Module może nadpisać instrukcję Public.


Instrukcja Const

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.


String

Gdy wiemy, że zmienna zawsze przechowuje dane tekstowe to możemy zadeklarować ją jako zmienną typu String:

Dim S As String


Numeric

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 przecho­wywania danych pieniężnych. Liczby zmiennoprzecinkowe (Single i Double) mają znacznie większe zakresy niż Currency, lecz mają tendencje do małych błędów za­okrą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 ele­mentów


Zakres każdego elementu odpowiada zakresowi odpowiedniego typu danych



1.5.7. Stałe


Stałe symboliczne

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 popraw­nych nazw są takie same jak dla zmiennych), wyrażenie jest złożeniem liczb lub łańcu­chów i operatorów (w wyrażeniu nie można używać wywołania funkcji)


Stała wewnętrzna

Obok stałej deklarowanej poleceniem Const, Microsoft Access automatycznie dekla­ruje 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 pro­gramista może zadeklarować własny typ zmiennej.


Grupowanie wielu zmiennych w jedną strukturę

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ę, na­zwisko, wynagrodzenie, data rozpoczęcia pracy.


Instrukcja Type

Własne typy definiowane są za pomocą instrukcji Type, która powinna być umiesz­czona w sekcji deklaracji.

Instrukcje Type można użyć tylko na poziomie modułu.


Instrukcja Dim

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żyt­kownika.


1.5.10. Reguły tworzenia nazw w języku Visual Basic for Application


Nazwy procedur, zmiennych i stałych ·

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ŁADNIA

Microsoft 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 widocz­ne tylko wówczas, jeśli uprzednio zostało ustawione wyrażenie czujki.


Okienko Bezpośrednie

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 po­leceniem 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


Okienko Czujka

Umożliwia przeglądanie wartości wyrażenia lub zmiennej podczas wykonywania ko­du. Aby ustawić wyrażenie czujki, należy kliknąć polecenie Dodaj czujkę w menu Na­rzę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


Pomoc on-line w Microsoft Access

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 na­rzędzi.


Pakiet gotowych rozwiązań

Microsoft Access Solution Pack jest osobnym produktem i zawiera cztery pełne apli­kacje dla Access 97.


Forum CompuServe

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 fo­rum Microsoft Access (rejestracja w CompuServe pod telefonem 800-848-8199, wew.519).


Pomoc techniczna i projektowa na CD

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ż osob­y. Znajduje się tam informacja o:


Pliki kreatorów opatrzone komentarzem

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ży­wamy, gdy chcemy aby w zależności od wartości pewnego wyrażenia wykonała się tyl­ko jedna albo tylko druga grupa instrukcji. Struktury pętli używamy, gdy chcemy aby grupa instrukcji została wykonana kilka razy.


Struktura decyzyjna

Struktura decyzyjna może mieć trzy różne postaci


Struktura pętli

Struktura Pętli może mieć dwie różne postaci


2.1.1. Tworzenie struktur decyzyjnych


If...Then

Instrukcja If...Then powoduje wykonanie kodu zawartego pomiędzy słowami klu­czowymi, 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



If...Then...Else

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 te­stuje 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.


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 instrukc­ji Case w strukturze. Jeżeli któraś z wartości pasuje to wykonywany jest blok instrukc­ji 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, wykonywa­ny 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 klauzu­lach 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ętle Do

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, wa­runek 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 wa­runek 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 spraw­dzany ponownie.

Następujący przykład zlicza liczbę wystąpień podłańcucha znaków w innym łańcu­chu 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 gwaran­tuje 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.



Składnia

Do While warunek

Instrukcje

Loop



Składnia

Do

instrukcje

Loop While warunek


For .Next

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 wykona­nia 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 do­datni, wartoscpoczatkowa musi być mniejsza lub równa od wartosckoncowa, w innym wypadku pętla nie zostanie wykonana. Jeżeli zwiększenie jest ujemne to wartoscpo­czatkowa musi być większa lub równa wartosckoncowa, aby ciało pętli zostało wyko­nane. Pominięcie klauzuli Step spowoduje automatyczną inkrementację równą 1.


Visual Busic for Application w trakcie wykonania pętli For:

  1. Nadaje zmiennej licznik wartość początkową.

  2. Sprawdza czy licznik jest większy od wartości końcowej (przy ujemnym zwiększe­niu warunek jest odwrotny).

  3. Wykonuje instrukcje.

  4. Zwiększa licznik o jeden lub o podaną wartość zwiększenia.

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


Opuszczanie pętli

Czasem zachodzi potrzeba wcześniejszego opuszczenia pętli, bez wykonywania dal­szych 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 for­mularz w kolekcji Forms, chociaż właściwy formularz został znaleziony podczas po­lej 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 za­gnież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 rozmia­rze), 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 wymia­rów

Przykład

Dim MacierzA (1 To 10, 1 To 10) As Double


Efektywne przetwarzanie tablic wielowymiarowych zapewniaj ą zagnieżdżone in­strukcje 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łko­wita 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 wielowy­miarowymi.


2.2.3. Tablice dynamiczne

Jeśli podczas wykonywania kodu programu zachodzi potrzeba zmiany rozmiaru ta­cy, to można zadeklarować tablicę dynamiczną. W deklaracji tablicy należy użyć in­strukcji Static, Dim, Private lub Public, pozostawiając puste nawiasy, jak to przedstawio­no 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 po­ziomie 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, poda­wanej w instrukcji ReDim. Nawet jeśli moduł zawiera instrukcję Option Explicit, to podanie błędnej nazwy spowoduje utworzenie drugiej tablicy.


Zachowywanie wartości w tablicach dynamicznych

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:


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 grani­cy wymiaru tablicy, utworzonej przy użyciu jednej z instrukcji To, Dim, Public, Re­Dim 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 dwuwymiaro­wej 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 klu­czowe, 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:


Łatwiejszy zapis i odczyt kodu

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 specyfikowan­y 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śc­i 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


Możliwość zagnieżdżania instrukcji With

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 poje­dyncza 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 in­strukcji 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ł:


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ę parame­tró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. Su­muje wartości elementów i wyświetla wynik. Każdy pracownik może mieć różny wy­miar 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 zna­jomości liczby elementów w grupie.

Poniższy przykład pokazuje jak używać For Each...Next w celu przejrzenia elemen­tó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 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ą in­vji 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ć po­N'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ów­zmianę wartości zmiennych i właściwości w trybie zawieszenia. W oknie bezpo­pim 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ść zaznaczo­nego 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 wy­krywania 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 zacho­wuie 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 wyko­wy 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 skie­rowania wyjścia do okna bezpośredniego. Technika ta tworzy w oknie bezpośrednim hi­storię 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 modyfiko­wana 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 kolej­ne procedury aplikacji. Jest ono szczególnie użyteczne, gdy śledzimy zagnieżdżone pro­cedury. 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 proce­dury wywołane ostatnio. Informacja o procedurze zawiera nazwę modułu w którym wy­stę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 aplika­cji.

3.3.1. Wychwytywanie błędów wykonania

Źródła powstawania błędów często nie są znane i wymagają wykonania pewnej licz­by 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ą bar­m 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 in­cji 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 wy­konania 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.) Prze­chowuje 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ć instruk­In Error, informującą Visual Basic gdzie szukać procedury obsługi błędu. Instruk­In 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 aplika­cji. _.._

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 proce­dll~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 in­nych 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 ob­sł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

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ła­ici 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ść kolek­cji 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ści­woś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 po­został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 wy­brać 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 za­rzą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 stoso­wanie języka programowania w celu uzyskiwania dostępu i manipulowania danymi za­wartymi w lokalnych lub zdalnych bazach danych oraz w celu zarz ądzania bazami da­nych, ich obiektami i strukturą. Model DAO składa się z hierarchicznie zorganizowa­nych 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 stoso­danymi za­bazami da­rą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 naj­j zewnętrznym obiektem. Jest to jedyny obiekt, którego nie zawiera żaden inny Czasami aplikacja może służyć jako miejsce przechowywania wszystkich glo­s 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. Rozpoczy­okreś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 przechowy­danych, tej bazie danych.

używamy kropki w celu dostępu do członków kolekcji i nie podamy żadnej ko­y 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, zawiera­ją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, manipulo­wania jego właściwościami i ustawiania domyślnego obiektu Workspace (obszar robo­ezy). Obiekt DBEngine jest obiektem predefiniowanym i nie można stworzyć dodat­kowego 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 usta­wiane 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ą kolek­są: DBEngine, BEngine jest Workspaces. Poniższy fragment kodu pozwala na dostęp do domyśl­ktem, 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 Micro­et 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ą elastycz­ność 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 argu­ment, 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 usu­nię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ą meto­se 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 usuwa­nie z dysku. Poprzez Database ( 0 ) odwołujemy się do bieżącej bazy :ostałych baz danych, które stworzyliśmy i chcemy otworzyć, odwołu­z 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 manipulowa­nie 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-do­odcz tu

TRUE Tylko-do­odczytu

ZAŁĄCZO­NY

Odczyt-zapis

Tylko-do­odczytu Odczyt-zapis

FALSE

ule Odczyt-zapis Odczyt-zapis Tylko-do­odezytu

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ść po­czą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ć zdefinio­kownika lub DAO (wbudowane). Można użyć kolekcji Properties aby

dowane właściwości obiektu i zdefiniowane przez użytkownika. Właśei­i 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 zgod­nie 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 zdefiniowa­ych, 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 identyfi­kowanych przez własność UserName obiektu Container lub Document.

Przyjmuję wartość typu Boolean, która jeśli ustawiona ozna­cza, ż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 engi­ne też definiuje swoje własne kontenery jak tabele, relacje.

Obiekty Docurrzent i C'orztainer wykorzystywane są głównie do wyliczania wszyst­kich 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 modyfikowa­ny.

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 wyni­iem 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 kwe­idy. 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 re­kordó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ów­nież 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 dyna­micznym, 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 zapro­jektować 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 usuwa­nie 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żyt­kownika (dotyczy tylko obiektów Recordset typu zestaw dyna­miczny obsługiwanych przez aparat Microsoft Jet). Jest to przy­datne 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żyt­kownikó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 dy­namiczne 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 do­datkowe 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 two­rzonego 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 za­chowanej 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 posor­towany. Właściwość Sort ustawiona jest dla Rstl a Rst2 jest obiektem Recordset utwo­rzonym z Rstl.

UWAGA. Często szybciej jest utworzyć nowy obiekt Recordset opierając się na in­strukcji 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 kwe­rend 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 przeprowa­dzić 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ć rekor­dy:

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śle­nia 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 wyko­nywania. 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ści­woś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ą ja­kieś 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ą pozy­cję 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ł wyko­nany 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) na­leż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ć po­prawną 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 zesta­wy 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 licz­by 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ślo­ne 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 re­md 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 przy­spiesza proces szukania danych. Próba użycia metody Seek do innych Recordset niż ta­bela 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 kil­ka 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 fir­my, 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 ty­pami obiektów Recordset.

TYPU TABELA

RECORDSET TYPU ZESTAW DY­NAMICZNY

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 re­i nie odświeżą rekordów.

Aparat obsługi baz danych umieszcza nowy rekord zawsze na końcu Record­set.

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 za­chować 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żyt­kownika - 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 ta­bela 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 ko­rzyści jeśli użyje się transakcji. Transakcje używa się przede wszystkim aby móc wyco­fać 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 a­kichkolwiek 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 za­czyna 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 ty­i. 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 prede­iiowanego 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ę formula­rza. 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 po­przez 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ę formula­rza. 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. Formu­larz jest otwierany z właściwością Visible usta­wioną 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 konkret­nego 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.. ula­ciek ~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ę for­mularza 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 ele­mentó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 proce­durze Property Set musi być zadeklarowany jako obiekt.

Aby stworzyć własną właściwość typu run-time, która zwraca wartość należy utwo­rzyć 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 pro­cedurze 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 pu­blicznych 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 dialo­gowe 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 dia­logowego:

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) od­woł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 obiek­tow 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 pa­kietu 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 do­stę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 wydruko­wanego 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 sa­mej 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 od­naleźć 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 otwar­cia 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 da­ne`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 ­

Laboratorium 1

Przygotowanie laboratorium

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 na­zwę, która nie została jawnie zadeklarowana jako nazwa zmiennej, następuje wyświe­tlenie 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.


Scenariusz

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ęk­szość 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

Wykorzystanie zmiennych i procedur typu Sub

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:


MsgBox MyText


Powoduje on wyświetlenie zawartości zmiennej MyText w oknie dialogowym. Funk­cja 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 (bez­pośrednim) . Spowoduje to wyświetlenie poniższego okna dialogowego:


Zachowaj moduł jako Ćwiczeniel.


1.2. Ćwiczenie 2

Wywołanie procedury typu Sub


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

TestSubOne

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ę testo­wą.

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

Testowanie zasięgu zmiennych

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 po­nownie uruchom kod.

Zamknij i zachowaj powyższy moduł jako Ćwiczenie3b.





1.4. Ćwiczenie 4

Tworzenie procedury typu Function

W tym ćwiczeniu utworzysz i wywołasz procedurę typu Function. Możesz odwoły­wać 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

Tworzenie kodu w module formularza

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

Utworzenie nowej procedury typu Function

W tym ćwiczeniu utworzysz nową, zdefiniowaną przez użytkownika, funkcję.

1. Utwórz zdefiniowaną przez użytkownika funkcję o nazwie ReverseName, która od­czytuje 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.


Laboratorium 2

Przygotowanie laboratorium


2.1. Ćwiczenie 1

Sprawdzanie warunków przy pomocy instrukcji If

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 zada­nie.


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 testo­wany 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.


Utworzenie procedury sprawdzającej jeden warunek

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 waru­nek jest spełniony

W tej części ćwiczenia dowiesz się jak określić, który przycisk został wybrany w oknie komunikatu.

Utworzenie procedury sprawdzającej dwa warunki

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 wa­runek i podjąć w związku z tym odpowiednie działania. Istnieje moźliwość zagnieżdże­nia 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 re­zultaty.

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 wa­runkó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 instruk­cji 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 elemen­tó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 tabli­ca zawiera elementy 0, 1 oraz 2 (dlatego pierwszym argumentem jest 2), pierwsza ko­lumna ma numer 0, a druga 1 (dlatego drugim argumentem jest 1 ). Aby utworzyć tabl i­cę 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) ko­lumny. 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, za­chowaj 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ść wy­konania 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 ko­munikatu przy każdym przebiegu procedury przez tę pętlę. Okno komunikatu będzie in­formować, który raz pętla została wykonana. W ćwiczeniu tym będziesz określał, ile ra­zy 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 itera­cja 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 wpi­sania 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ąż poka­zywać. 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 ćwi­czeniach 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 poka­zano na poniższym rysunku.

Utworzenie procedury zdarzenia

1. Utwórz procedurę zdarzenia Przy kliknięciu dla przycisku "Uruchom program 1 ", uru­chamiając Konstruktor kodu dla właściwości przy kliknięciu.

2. W procedurze tej umieść kod, który umożliwi użytkownikowi uruchomienie aplika­cji 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 wy­jątku przy wystąpieniu błędu.

2. Sprawdź po instrukcji Shell, czy wystąpił błąd poprzez sprawdzenie wartości licz­bowej 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 wykorzy­stują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 pro­gramu. 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 do­datkowo 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 od­powiedniego 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 uza­leż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 da­nych 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 De­fragmentuj 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 ist­nieje.

4.2. Ćwiczenie 2

Tworzenie przestrzeni roboczej z poziomu kodu

W ćwiczeniu tym przygotujesz funkcj ę, która będzie tworzyła nową przestrzeń robo­czą i dodawała ją do bieżącej kolekcji. Kod ten dołączysz do przycisku polecenia nowe­go 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ści­wość Tytul na Utwórz przestrzeń roboczą.

4. Dodaj poniższy kod do formularza dla zdarzenia Przy kliknięciu utworzonego przy­cisku:

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 ba­zy danych. Jest to użyteczne, gdy chcesz mieć pewność, że pracujesz z najbardziej aktu­alną 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ści­wość Tytus na Wyświetl wers] e.

4. Dodaj poniższy kod do formularza dla zdarzenia Przy kliknięciu utworzonego przy­cisku:

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ć na­zwę 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 przy­cisku:

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 na­zwa 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ści­wość Tytuł na "Tekst instrukcji SQL".

4. Dodaj poniższy kod do formularza dla zdarzenia Przy kliknięciu utworzonego przy­cisku:

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ści­wość Tytuł na Pokaż każdy dziesiąty rekord.

4. Dodaj poniższy kod do formularza dla zdarzenia Przy kliknięciu utworzonego przy­cisku:

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ści­wość Tytuł na Policz rekordy.

4. Dodaj poniższy kod do formularza dla zdarzenia Przy kliknięciu utworzonego przy­cisku:

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ści­wość 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 przy­cisku:

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ści­wość Tytul na Utwórz relacj ~.

5. Dodaj poniższy kod do formularza dla zdarzenia Przy kliknięciu utworzonego przy­cisku:

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ści­wość Tytuł na Lista indeksów.

3. Dodaj poniższy kod do formularza dla zdarzenia Przy kliknięciu utworzonego przy­cisku:

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ści­wość Tytuł na Utwórz relacj ę.

5. Dodaj poniższy kod do formularza dla zdarzenia Przy kliknięciu utworzonego przy­cisku:

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ści­wość Tytuł na Lista indeksów.

3. Dodaj poniższy kod do formularza dla zdarzenia Przy kliknięciu utworzonego przy­cisku:

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 przyci­sku:

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 za­pytania.

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ści­wość Tytuł na Lista parametrów.

4. Dodaj poniższy kod do formularza dla zdarzenia Przy kliknięciu utworzonego przy­cisku:

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 wy­konaniu tej procedury nie zauważysz właściwie żadnych efektów. Dlatego możesz wy­konują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ści­wość Tytul na Utwórz właściwość zdefiniowaną przez użytkow­nika.

3. Dodaj poniższy kod do formularza dla zdarzenia Przy kliknięciu utworzonego przy­cisku:

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 Formu­larz.

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 tabela­mi 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 ćwicze­niach 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_we­rium 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 zmien­nej 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 pomo­cv 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 od­powiedź 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 otwo­rzyć 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ć roz­wią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. Przy­pominam, ż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, przej­rzyj 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 lokaliza­eji 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. Przy­pominam, że metoda Find może być stosowana tylko do obiektów Recordset typu ta­bela.

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 ID­kategorii 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ć po­dobny 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 maso­wych 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 Stanowi­sko 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 re­kordu 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 zmia­ny 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świe­tlać wszystkie rekordy.

Zmodyfikuj instrukcję SQL w Ćwiczeniu l, używając zmiennej dla podania nazwy ta­beli.

UWAGA. Wymaga to konkatenacji zmiennej w miejscu użycia określonej nazwy tabe­li.

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 ćwicze­niach tego laboratorium.

6.1. Cwiczenie 1

Użycie procedur Property

W tym ćwiczeniu będziesz pracować z procedurami właściwości. Wykorzystasz in­strukcje 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 rmu­larz.

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 po­winien 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 wbudo­wane 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 do­stę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 CaB­tion (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 BardzoUniwer­salna

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ć, edyto­wać 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 ćwi­czeniach 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 szero­koś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 tek­stu. Plik ten zawiera etykiety adresowe o standardowej postaci, przeznaczonej do wy­druku.

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ę od­czytują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 szero­koś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 ad­resy 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 ­



Wyszukiwarka

Podobne podstrony:
Gor±czka o nieznanej etiologii
020 AC CA
2095 ac
4533 ac id 38899 Nieznany (2)
499 ac
PN EN 1990 2004 AC Podstawy projektowania konstrukcji poprawka
2113 ac
431 ac
4063 ac
ac
437 ac
AC V rok
Jak?ać o codzienną higienę jamy ustnej
403 ac
2007 ac
4059 ac
(1 1)Fully Digital, Vector Controlled Pwm Vsi Fed Ac Drives With An Inverter Dead Time Compensation
444 ac
Chramiec Bartosik, KARTA AC SPRAWKO