Relacyjne Bazy Danych wykład X

Post on 04-Jan-2016

61 views 1 download

description

Relacyjne Bazy Danych wykład X. Język aplikacji baz danych – Visual Basic. Zostaną wprowadzone podstawowe pojęcia takie jak procedura , moduł , moduł klasy, zdarzenie i obsługa błędów. Procedury - PowerPoint PPT Presentation

Transcript of Relacyjne Bazy Danych wykład X

1opr. Lech Banachowski, Jan Wierzbicki

Relacyjne Bazy Danychwykład X

2opr. Lech Banachowski, Jan Wierzbicki

Język aplikacji baz danych – Visual Basic

Zostaną wprowadzone podstawowe pojęcia takie jak procedura, moduł, moduł klasy, zdarzenie i obsługa błędów.

3opr. Lech Banachowski, Jan Wierzbicki

Procedury

Procedury są podstawą programowania aplikacji bazodanowych

MS Access w ramach paradygmatu programowania

zdarzeniowego. Oto ich cechy: •Są często wiązane ze zdarzeniami interfejsu użytkownika jak: •naciśnięcie przycisku na formularzu, •zmiana wartości w polu tekstowym formularza, •otwarcie lub zamknięcie formularza, •drukowanie raportu, •początkowe otwarcie bazy danych, itd. •Każda powtarzająca się rutynowa czynność, w szczególności

każda, którą można wykonać za pomocą opcji znajdujących się

we wbudowanych menu, nadaje się do zautomatyzowania za

pomocą procedury.

4opr. Lech Banachowski, Jan Wierzbicki

Na formularzu można umieścić zbiór przycisków, po których

naciśnięciu użytkownik uzyskuje:•wyświetlenie tekstu pomocy; •wyświetlenie innego  formularza; •zamknięcie danego formularza; •wydrukowanie zawartości formularza; •wyświetlenie następnego (poprzedniego) rekordu, przejście do

pierwszego, ostatniego lub nowego rekordu; •wykonanie obliczeń i wyświetlenie wyniku w polu

niezwiązanym; •wykonanie kopii zabezpieczającej bazy danych na dyskietkę; •przeniesienie danych do Worda, Excela lub innej bazy danych.

5opr. Lech Banachowski, Jan Wierzbicki

Visual Basic for Applications (w skrócie VBA) jest

językiem programowania dla aplikacji systemu Microsoft

Office będący podzbiorem języka Visual Basic. Oto jego

cechy:•służy do powiązania obiektów bazy danych w jedną spójną

aplikację; •zawiera standardowe konstrukcje programistyczne jak If ...

Then ... Else, For, Case, procedury, zmienne; •stosuje dwa typy procedur: •funkcje (Function) - zwracające wartość; mogą być

używane w wyrażeniach jak również jako wartości

właściwości zdarzeń; •podprogramy (Sub) - nie zwracające bezpośrednio

wartości; mogą występować jako procedury zdarzeń w

formularzach i raportach.

6opr. Lech Banachowski, Jan Wierzbicki

Moduł jest zbiorem deklaracji i definicji procedur języka VBA

przechowywanych razem jako całość.•Moduł może zawierać zarówno procedury zdarzeń jak i zwykłe

nazwane procedury. •Są dwa rodzaje modułów: •moduły klas w tym: •  moduły klas obiektów MS Access jak formularze i raporty, •  moduły klas definiujące niezależne obiekty. •moduły ogólne - nie związane z żadnym obiektem. •Procedury typu Public mogą być wywoływane w dowolnym

miejscu aplikacji (opcja domyślna). •Procedury typu Private są prywatne dla danego modułu (w tym

modułu formularza i raportu) - nie można ich używać spoza

modułu - wszystkie procedury zdarzeń są prywatne.

7opr. Lech Banachowski, Jan Wierzbicki

Typy zmiennych: •lokalne dla procedury, deklarowane lokalnie w procedurze

jako Dim, •lokalne dla modułu, deklarowane jako Private w module 

(opcja domyślna), •globalne, deklarowane jako Public w module - dostęp do

nich jest możliwy w całej aplikacji.

8opr. Lech Banachowski, Jan Wierzbicki

Typy danych dla zmiennych

Access Visual BasicWartość domyślna

Text String ""

NumberInteger, Long, Double, Single 0

Currency Currency 0

Yes/No Boolean False

Date/Time Date 30.12.1899

Specjalny typ danych Visual Basic - Variant - oznacza dowolny typ wartości.

9opr. Lech Banachowski, Jan Wierzbicki

Domyślnie wszystkie argumenty przy wywoływaniu

procedury są przekazywane metodą przez referencję.

Dzięki temu w kodzie procedury operujemy na rzeczywistej

zmiennej, którą przekazujemy jako parametr. 

Alternatywnie można przekazywać argument przy

wywoływaniu procedury metodą przez wartość –

poprzedzając w deklaracji procedury nazwę parametru

słowem kluczowym ByVal. Przy wywołaniu oblicza się

wartość argumentu i przekazuje do kodu procedury właśnie

tę wartość. Jeśli argumentem jest zmienna, wartość tej

zmiennej nie ulega zmianie przy wykonywaniu kodu.

10opr. Lech Banachowski, Jan Wierzbicki

Przykład 1Typowym zadaniem programistycznym jest obliczanie pierwiastka kwadratowego z liczby nieujemnej. Oto jego zapis w postaci funkcji Visual Basic.

Function SquareRoot (X As Double) As Double Dim Msg As String Select Case Sgn(X) ' Oblicz znak argumentu.     Case 1 ' OK jeśli dodatni.            SquareRoot = Sqr(X)             Exit Function     Case 0 ' Powiadom użytkownika jeśli 0.            Msg = "Przekazana wartość to 0."     Case -1 ' Powiadom użytkownika jeśli mniejsze niz 0.            Msg = "Niedozwolona liczba."  End Select  MsgBox Msg ' Wyświetl komunikat MsgEnd Function

11opr. Lech Banachowski, Jan Wierzbicki

Przykład 2 Pokażemy na tym przykładzie deklaracje i definicje modułu. Opcje:

•Option Compare Database - użycie metody z bazy danych w porównaniach; •Option Explicit - wymagane jest deklarowanie zmiennych;

są zwykle domyślnie przyjmowane przez system.

12opr. Lech Banachowski, Jan Wierzbicki

Option Compare DatabaseOption Explicit------- Private licznik As Integer  'Zmienna lokalna Public pokaż As Integer 'Zmienna globalna-------- Sub Zeruj() 'Procedura globalna   licznik = 0   pokaż = licznikEnd Sub------- Sub Dodaj() 'Procedura globalna   licznik = licznik + 1   pokaż = licznik   MsgBox licznik, , "LICZNIK"End Sub

13opr. Lech Banachowski, Jan Wierzbicki

W MS Access jest dostęny edytor kodu Visual Basic (Visual

Basic Editor) – zawierający środowisko uruchamiania kodu

VBA.

Okno analizy programu (Immediate Window) – uruchamiane

przez sekwencję klawiszy CTRL-G lub z menu Widok "View

-> Immediate Window" - daje możliwość wykonywania kodu

(instrukcji, metod, funkcji i procedur) oraz sprawdzania

wartości wyrażeń, pól i właściwości – pisząc w pojedynczym

wierszu np.

? Licznik

gdzie licznik jest zmienną, której wartość chcemy wypisać.

14opr. Lech Banachowski, Jan Wierzbicki

•Jest możliwość przerwania działania funkcji lub procedury przez

ustawienie w kodzie punktu przerwania (breakpoint) – "Debug ->

Toggle Breakpoint" (F9). • Można też wyświetlić - z menu Widok (View): •nawigator po klasach bieżącego projektu (Project Explorer) oraz •nawigator po klasach zarejestrowanych bibliotek jak Access,

VBA (Object Browser).

Na ogół jednej klasie odpowiada dokładnie jeden obiekt tej klasy

(obiekt klasy – class object).

15opr. Lech Banachowski, Jan Wierzbicki

Przykład 3 Sprawdzanie, czy dany formularz jest otwarty w widoku Formularz - rozwiązanie używające standardowej funkcji SysCmd.

Function Otwarty(ByVal Mój As String) As Integer' SysCmd - czy formularz jest otwarty   Otwarty = False   If SysCmd(acSysCmdGetObjectState,acForm,Mój) <> 0 Then   ' CurrentView - czy jest otwarty w widoku Formularz      If Forms(Mój).CurrentView <> 0 Then Otwarty = True   End IfEnd Function

16opr. Lech Banachowski, Jan Wierzbicki

Zwróćmy uwagę na to, że odróżniamy klasę danego

formularza łącznie z arkuszem jego właściwości od

konkretnych jego wcieleń widocznych na ekranie, na

których możemy wykonywać operacje w kodzie VBA.

Wcielenie to nazywamy obiektem danego formularza lub w

skrócie po prostu formularzem. Możemy więc powiedzieć,

że otwarte formularze są obiektami klas swoich formularzy.

Do obiektu formularza o nazwie Pracownicy można się

odwoływać w następujący sposób:•Forms![Pracownicy] •Forms("Pracownicy") •Forms(numer) gdzie numer jest numerem

przyporządkowanym danemu formularzowi w sesji.

17opr. Lech Banachowski, Jan Wierzbicki

Używając dostępu kropkowego możemy odwoływać się do

właściwości obiektu formularza a także do jego metod np.•Forms![Pracownicy].Caption zwraca tytuł formularza, •Forms![Pracownicy].SetFocus jest metodą, której

wykonanie przenosi fokus do tego formularza.

Wykrzyknik ! oznacza wybór elementu z kolekcji. Np. •Forms![Pracownicy] - wybór formularza z kolekcji

wszystkich formularzy, •Forms![Pracownicy]![Nazwisko] - wybór pola Nazwisko z

kolekcji wszystkich obiektów związanych z formularzem

Pracownicy.

18opr. Lech Banachowski, Jan Wierzbicki

PROCEDURA ZAMYKAJĄCA AUTOMATYCZNIE PRZY ZAMYKANIU DANEGO FORMULARZA DRUGI OTWARTY FORMULARZ, np. formularz Książki Private Sub Form_Close()If SysCmd(acSysCmdGetObjectState, acForm, "KSIAZKI") <> 0 ThenDoCmd.Close acForm, "KSIAZKI"End IfEnd Sub

sprawdza czy dany formularzjest otwarty

19opr. Lech Banachowski, Jan Wierzbicki

Reasumując:•wykrzyknik oznacza wybór elementu z kolekcji

elementów, •kropka oznacza wybór właściwości obiektu lub kolekcji.

Zapis Forms![Pracownicy]![Nazwisko] oznacza także

domyślnie wartość pola tekstowego Nazwisko czyli

konkretne nazwisko – alternatywnie można używać pełnej

notacji:

Forms![Pracownicy]![Nazwisko].Value

Przy wpisywaniu do pola tekstowego lub listowego,

bieżącą wartość – jeszcze nie zapisaną do bazy danych –

uzyskuje się przy użyciu:

Forms![Pracownicy]![Nazwisko].Text

20opr. Lech Banachowski, Jan Wierzbicki

Przy odczytywaniu wartości atrybutu Text fokus (bieżący

kursor) musi znajdować się na danym polu:

[Nazwisko].SetFocus

MsgBox "Nazwisko = "&[Nazwisko].Text

21opr. Lech Banachowski, Jan Wierzbicki

Sprawdzenie czy formularz jest otwarty (w widoku Projekt lub Formularz)  można zrealizować jeszcze w inny sposób – przeglądając kolekcję wszystkich otwartych formularzy i sprawdzając ich nazwy.

  Function Otwarty1 (ByVal Mój As String) As Integer' Zwraca True, jeśli podany formularz jest otwarty w widoku projekt lub formularz.   Dim I As Integer   Otwarty1 = False   ' Forms.Count to liczba obiektów w kolekcji Forms   For I = 0 To Forms.Count - 1     If Forms(I).Name = Mój Then              Otwarty1 = True        Exit For     End If   Next IEnd Function

22opr. Lech Banachowski, Jan Wierzbicki

Jest możliwość tworzenia instancji klasy formularza w

kodzie VBA:

      Dim Kopia As New Form_Osoby

i wykonywanie na niej operacji jak na obiekcie. Instancja

ta nie jest widoczna na ekranie.

23opr. Lech Banachowski, Jan Wierzbicki

Przykład 4

Kolejna procedura specyfikuje reakcję na zdarzenie

naciśnięcia lewego przycisku myszy (obiekt: przycisk Witaj,

zdarzenie: Przy kliknięciu).

Private Sub Witaj_Click()

   [Pole] = "Witaj w klubie VBA"

End Sub

24opr. Lech Banachowski, Jan Wierzbicki

Przykład 5Zwróćmy uwagę na procedurę, jaką tworzy kreator przycisków w celu zrealizowania zadania otwarcia formularza o nazwie Osoby:

Private Sub Przycisk_Click()   On Error GoTo Err_Przycisk_Click   Dim stDocName As String   Dim stLinkCriteria As String   stDocName = "Osoby"   DoCmd.OpenForm stDocName, , , stLinkCriteria   Exit_Przycisk_Click:   Exit Sub   Err_Przycisk_Click:   MsgBox Err.Description   Resume Exit_Przycisk_ClickEnd Sub

25opr. Lech Banachowski, Jan Wierzbicki

•Instrukcja DoCmd.OpenForm "Osoby" zawierająca wywołanie

metody OpenForm wbudowanego obiektu o nazwie DoCmd,

powoduje otwarcie formularza Osoby. •W procedurze tej występuje obsługa błędów. Kreator przycisków

tworząc procedurę zdarzenia Przy kliknięciu standardowo

realizuje następującą strategię: •W przypadku wystąpienia błędu - to jest niemożliwości otwarcia

formularza Osoby - przerwij obliczenia i przejdź do sekcji obsługi

błędów przy etykiecie Err_Przycisk_Click. •Wypisz informację o błędzie korzystając z metody Description

specjalnego obiektu Err. •Zakończ wykonywanie procedury.

26opr. Lech Banachowski, Jan Wierzbicki

W opisanej procedurze można byłoby standardowy tekst

błędu Err.Description zastąpić własnym tekstem

skierowanym do użytkownika aplikacji:

MsgBox "Błąd aplikacji. Skontaktuj się z administratorem

aplikacji"

27opr. Lech Banachowski, Jan Wierzbicki

Korzystając z obsługi błędów napiszmy funkcję sprawdzającą czy formularz o nazwie będącej argumentem procedury jest otwarty (w widoku Projekt lub Formularz).

Function czy(ByVal formularz As String) As Boolean   On Error GoTo Nie   Dim s As String   s = Forms(formularz).Name   czy = True   Exit FunctionNie:   czy = FalseEnd Function

28opr. Lech Banachowski, Jan Wierzbicki

Synchronizacja dwóch formularzy

Przykład 6

Otwarcie formularza może być bardziej skomplikowane, aby

mogło wystarczyć użycie samego kreatora przycisków np.

procedura otwierająca formularz Uczestnictwo w projektach w

oparciu o wartość znajdującą się w polu Numer będącym częścią

podformularza przy czym sam przycisk Projekty znajduje się w

głównym formularzu Departament.

29opr. Lech Banachowski, Jan Wierzbicki

Procedura otwiera formularz Uczestnictwo w projektach w celu pokazania uczestnictwa w projektach wybranej aktualnie osoby (w podformularzu):

Private Sub Projekty_Click()   On Error GoTo Err_Projekty_Click   Dim stDocName As String   Dim stLinkCriteria As String    stDocName = "Uczestnictwo w projektach"   stLinkCriteria = "Numer=Forms![Departament]![Osoba Subform].Form![Numer]"

   DoCmd.OpenForm stDocName, , , stLinkCriteria   Forms![Departament].SetFocus   Forms![Departament]![Osoba Subform].SetFocus

Exit_Projekty_Click:   Exit Sub Err_Projekty_Click:   MsgBox Err.Description   Resume Exit_Projekty_Click End Sub

30opr. Lech Banachowski, Jan Wierzbicki

Przykład 7 

Formularz wyskakujący  Uczestnictwo w projektach powinien

pokazywać dane o aktualnie rozpatrywanym pracowniku z

podformularza w formularzu Departament. Uaktualnienie

wartości następuje przy pojawieniu się nowego rekordu w

podformularzu czyli jako reakcja na zdarzenie Przy bieżącym.

Przy czym to uaktualnienie ma sens, tylko wtedy gdy użytkownik

wcześniej otworzył formularz wyskakujący Uczestnictwo w

projektach naciskając przycisk Projekty. Z kolei naciśnięcie

przycisku Projekty ma sens tylko wtedy, gdy pole Numer w

podformularzu jest niepuste.

31opr. Lech Banachowski, Jan Wierzbicki

W procedurze występują dwie nowe właściwości, których

wartościami są obiekty:•Me – formularz lub raport, którego procedura jest

wykonywana; •Parent – formularz lub raport nadrzędny względem

danego formularza lub raportu.

32opr. Lech Banachowski, Jan Wierzbicki

Private Sub Form_Current()   On Error GoTo Err_Form_Current

   If IsNull(Me![Numer]) Then      Me.Parent![Projekty].Enabled = False   Else      Me.Parent![Projekty].Enabled = True      If Otwarty("Uczestnictwo w projektach") Then          Dim Projekt As String          Projekt = "[Numer]="& Me![Numer]          DoCmd.OpenForm "Uczestnictwo w projektach", , , Projekt          Forms![Departament].SetFocus          Forms![Departament]![Osoba Subform].SetFocus      End If   End If Exit_Form_Current:   Exit SubErr_Form_Current:   MsgBox Err.Description   Resume Exit_Form_CurrentEnd Sub

33opr. Lech Banachowski, Jan Wierzbicki

Uaktualnienie formularza wyskakującego jest konieczne nie

tylko, gdy fokus w podformularzu przejdzie do nowego

rekordu, ale również gdy w bieżącym rekordzie zmieni się

wartość pola Numer.

Realizuje to procedura zdarzenia Po aktualizacji dla pola

Numer - jej kod jest analogiczny do procedury zdarzenia Przy

bieżącym.

34opr. Lech Banachowski, Jan Wierzbicki

Utwórzmy dwie tabele Instytucje i Pracownicy połączone związkiem jeden do wiele. Każda instytucja zatrudnia wielu pracowników; każdy pracownik jest zatrudniony w jednej instytucji. Utwórzmy dwa formularze: „Instytucja”, na którym są wyświetlane dane o instytucjach, oraz „Pracownicy” na którym są wyświetlane dane o pracownikach. Chcemy, aby na życzenie użytkownika poprzez naciśnięcie przycisku „Pracownicy instytucji” na formularzu „Instytucja” otwierał się formularz wyświetlający pracowników danej instytucji. Chcemy aby przy chodzeniu po rekordach formularza „Instytucja” aktualizowały się dane o pracownikach zatrudnionych w danej instytucji – oczywiście o ile wcześniej użytkownik otworzył stowarzyszony formularz „Pracownicy”.

35opr. Lech Banachowski, Jan Wierzbicki

Private Sub PracownicyInstytucji_Click()   On Error GoTo Form_Current_Err   Dim Ins As String   Ins = "Id_inst=Forms![Instytucje]!Id"   DoCmd.OpenForm "Pracownicy",,,Ins

Form_Current_Exit:   Exit Sub

Form_Current_Err:   MsgBox Err.Description   Resume Form_Current_ExitEnd Sub

36opr. Lech Banachowski, Jan Wierzbicki

Sub Form_Current()   On Error GoTo Form_Current_Exit   Dim s As String   s = Forms("Pracownicy").Name

   On Error GoTo Form_Current_Err   Dim Ins As String   Ins = "Id_inst=Forms![Instytucje]!Id"   DoCmd.OpenForm "Pracownicy",,,Ins

Form_Current_Exit:   Exit Sub

Form_Current_Err:   MsgBox Error$   Resume Form_Current_ExitEnd Sub

37opr. Lech Banachowski, Jan Wierzbicki

Czy rozwiązanie umożliwia wprowadzanie pracowników do

otwieranego z formularza Instytucje formularza Pracownicy?

Private Sub Form_BeforeInsert(Cancel As Integer)   On Error GoTo Form_Current_Exit   Dim num As Integer   num = Forms("Instytucje").id

   On Error GoTo Form_Current_Err   Id_inst = numForm_Current_Exit:   Exit Sub

Form_Current_Err:   MsgBox Err.Description   Resume Form_Current_ExitEnd Sub

38opr. Lech Banachowski, Jan Wierzbicki

Formularz – podformularz (wyskakujący)

formularz główny

podformularzma dane związane

z formularzem głównym

39opr. Lech Banachowski, Jan Wierzbicki

PROCEDURY UMOŻLIWIAJĄCE KOPIOWANIE KLUCZA GŁÓWNEGO DO PODFORMULARZA WYSKAKUJĄCEGO PRZY DOPISYWANIU DANYCH Option Compare DatabaseOption ExplicitPublic klas As String___________________________________________Private Sub uczniow_Click()On Error GoTo Err_uczniow_Click  Dim stDocName As String Dim stLinkCriteria As String  stDocName = "uczniowie_pdf" klas = Me![id_klasy] stLinkCriteria = "[id_klasa]=" & Me![id_klasy] DoCmd.OpenForm stDocName, , , stLinkCriteria Exit_uczniow_Click: Exit Sub Err_uczniow_Click: MsgBox Err.Description Resume Exit_uczniow_Click End Sub 

zmienna globalna

przypisanie wartości zmiennejglobalnej

formularz główny

40opr. Lech Banachowski, Jan Wierzbicki

Private Sub nowy_rec_Click()On Error GoTo Err_nowy_rec_Click   DoCmd.GoToRecord , , acNewRec [id_klasa] = Form_klasa_gl.klas

Exit_nowy_rec_Click:

Exit Sub Err_nowy_rec_Click: MsgBox Err.Description Resume Exit_nowy_rec_Click End Sub

wczytanie wartości ze zmiennej globalnej

podformularz

41opr. Lech Banachowski, Jan Wierzbicki

Zdarzenia

Rozważymy kolejno zdarzenia dla obiektów interfejsu

użytkownika (formularzy, raportów, elementów dialogowych) -

które najczęściej są oprogramowywane przy pomocy procedur

zdarzeń.• Przy otwarciu - Open (formularza, raportu) - po otwarciu

formularza (raportu) ale przed wyświetleniem pierwszego rekordu

(przed zdarzeniem Load). Można: •zamknąć inne okno, •ustawić fokus na konkretnym elemencie, •spytać użytkownika jakie rekordy mają się pojawić na

formularzu, •spytać użytkownika o wymagane hasło i odwołać otwieranie

formularza, gdy użytkownik nie potrafi podać poprawnego hasła.

42opr. Lech Banachowski, Jan Wierzbicki

Private Sub Form_Open(Cancel As Integer)   Dim strPass as String   strPass = InputBox("Podaj hasło: ")   If strPass<>"KochamVB" Then      MsgBox "Niepoprawne hasło"      Cancel = True   End IfEnd Sub

43opr. Lech Banachowski, Jan Wierzbicki

Przy załadowaniu - Load (formularza) - po otwarciu

formularza i wyświetleniu jego rekordów: •określa się domyślne ustawienia dla elementów formularza, •wyświetla się okienka informacyjne oraz pola wyliczane w

oparciu o inne dane na formularzu.

Private Sub Form_Load()

   Dim StrName As String

   MsgBox "Formularz za chwilę pojawi się na ekranie!"

End Sub

44opr. Lech Banachowski, Jan Wierzbicki

Przy bieżącym - Current (formularza) - przy pojawieniu się

pierwszego i każdego kolejnego rekordu (przy nawigacji po

rekordach), również przy usuwaniu rekordu i po odświeżeniu

formularza. Można: •wyświetlać komunikat przy przejściu do nowego rekordu, •wyświetlać  powiązane informacje, •zmieniać właściwości elementów np. chowając lub

odkrywając pewne elementy lub zmieniając wyświetlony tytuł

Caption na formularzu.

Private Sub Form_Current()

   Forms!Pracownik.Caption = Me![Nazwisko]

End Sub

45opr. Lech Banachowski, Jan Wierzbicki

Przy usunięciu - Delete (formularza) - moment zanim

rekord zostanie usunięty. •Można uzyskać potwierdzenie, że naprawdę chodzi

użytkownikowi o usunięcie bieżącego rekordu.

Private Sub Form_Delete(Cancel As Integer)

   If MsgBox("Czy na pewno usunąć?", vbYesNo) =

vbNo Then Cancel = True

End Sub

46opr. Lech Banachowski, Jan Wierzbicki

•Przy zwolnieniu - Unload (formularza) - można: •uzyskać potwierdzenie, że naprawdę chodzi użytkownikowi o

zamknięcie formularza, •wykonać dodatkowe akcje jak zapisanie informacji do dziennika

(logu). •Przy zamknięciu - Close (formularza, raportu) - po zamknięciu

formularza (raportu) i usunięciu go z ekranu. •Można użyć metody OpenForm aby otworzyć kolejny formularz. •Po wstawieniu - After Insert (formularza) - po dodaniu nowego

rekordu do bazy danych. •Jest możliwość odświeżenia danych. •Przed aktualizacją - BeforeUpdate (formularza, elementu

dialogowego) •Jest możliwość sprawdzenia poprawności i cofnięcia aktualizacji.

47opr. Lech Banachowski, Jan Wierzbicki

Po aktualizacji - AfterUpdate (formularza, elementu

dialogowego) - po aktualizacji zmienionych danych w

rekordzie lub elemencie dialogowym. Można: •zastosować filtr, •odświeżyć dane.

Przy kliknięciu - Click (formularza, elementu dialogowego) -

przy naciśnięciu i zwolnieniu lewego przycisku myszy. Np.

naciśnięcie przycisku.

Private Sub cmdClickMe_Click()

   MsgBox "Czego chcesz ode mnie?"

End Sub

48opr. Lech Banachowski, Jan Wierzbicki

Przy naciśniętym klawiszu - KeyPress - gdy wprowadza się

znak przez naciśnięcia klawisza. Można sprawdzić ten

znak, ewentualnie całą zawartość pola dostępną na

atrybucie Text - bez tego ostatniego znaku.

 Uzyskanie fokusu - GotFocus - gdy element uzyskuje

fokus. Element musi być widoczny (visible) i włączony

(enabled). Np. •ustawienie etykiety dla pola tekstowego:

Private Sub Nazwisko_GotFocus()

   [lblNazwisko].Caption = "Rozpatrywany w tej chwili klient"

End Sub

49opr. Lech Banachowski, Jan Wierzbicki

Opuszczanie elementu dialogowego tworzą zdarzenia:

Przed aktualizacją - BeforeUpdate, Po aktualizacji -

AfterUpdate, Wyjście - Exit, Utrata fokusu - LostFocus.

Używa się do: • weryfikacji wprowadzonych danych (w wymienionych

zdarzeniach oba atrybuty Text i Value mają już tę samą

wartość), • zmiany ustawień dla opuszczanego pola.

Private Sub txtPass_Exit(Cancel As Integer)

     If Len(txtPass) < 8 Then

        MsgBox "Podaj 8 lub więcej znaków."

        Cancel = True

   End If

End Sub

50opr. Lech Banachowski, Jan Wierzbicki

bez wstrzymywania wyjścia:

Private Sub txtPass_LostFocus()

   If Len(txtPass) < 8 Then

     MsgBox "Podaj 8 lub więcej znaków."

   End If

End Sub

51opr. Lech Banachowski, Jan Wierzbicki

Funkcja DLookUp

Funkcja DLookUp umożliwia sprowadzenie z bazy danych

pojedynczej wartości. Np.•jeśli w formularzu Osoba opartym na tabeli Osoba jest potrzebna

nazwa departamentu zapisana  w tabeli Departament, to można

dodać pole wyliczane:

=DLookUp("[Nazwa]";"[Departament]";"[Id]=Forms![Osoba]![Id]")

Ten sam efekt można byłoby uzyskać opierając formularz na

kwerendzie złączającej zamiast na tabeli.

52opr. Lech Banachowski, Jan Wierzbicki

Za pomocą funkcji DLookUp można do pola formularza

wprowadzać wartości obliczane przez kwerendę

wybierającą - wystarczy najpierw zdefiniować taką

kwerendę np.

Zap_max  jako

SELECT IIf(IsNull(Max([Numer])),1,Max([Numer])+1) AS

Maks FROM Osoba;

a następnie użyć kwerendy jako źródła dla pola na

formularzu:

=DLookUp("[Maks]"; "Zap_max")

Metodę tę można zastosować więc do generowania

jednoznacznych numerów dla kluczy.

53opr. Lech Banachowski, Jan Wierzbicki

procedura - podstawowa jednostka kodu języka

programowania Visual Basic for Applications (VBA). Są dwa

rodzaje procedur: podprogramy (Sub) i funkcje (Function).

moduł - zbiór deklaracji i definicji procedur języka VBA

przechowywanych razem jako całość. Są dwa rodzaje

modułów: moduły klas obiektów i moduły ogólne.

zdarzenie - sytuacja jaka może wystąpić w trakcie realizacji

aplikacji, dla której programista może przygotować

specjalną obsługę np. w postaci  procedury zdarzenia.

DLookUp - funkcja DLookUp umożliwia sprowadzenie z

bazy danych pojedynczej wartości lub wykonanie zapytania

zwracającego pojedynczą wartość.

54opr. Lech Banachowski, Jan Wierzbicki

Koniec wykładu X