relacyjne bazy danych wykład x

54
1 opr. Lech Banachowski, Jan Wierzb Relacyjne Bazy Danych wykład X

Upload: tudor

Post on 04-Jan-2016

64 views

Category:

Documents


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

Page 1: Relacyjne Bazy Danych wykład X

1opr. Lech Banachowski, Jan Wierzbicki

Relacyjne Bazy Danychwykład X

Page 2: Relacyjne Bazy Danych wykł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.

Page 3: Relacyjne Bazy Danych wykład X

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.

Page 4: Relacyjne Bazy Danych wykład X

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.

Page 5: Relacyjne Bazy Danych wykład X

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.

Page 6: Relacyjne Bazy Danych wykład X

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.

Page 7: Relacyjne Bazy Danych wykład X

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.

Page 8: Relacyjne Bazy Danych wykład X

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.

Page 9: Relacyjne Bazy Danych wykład X

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.

Page 10: Relacyjne Bazy Danych wykład X

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

Page 11: Relacyjne Bazy Danych wykład X

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.

Page 12: Relacyjne Bazy Danych wykład X

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

Page 13: Relacyjne Bazy Danych wykład X

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

Page 14: Relacyjne Bazy Danych wykład X

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

Page 15: Relacyjne Bazy Danych wykład X

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

Page 16: Relacyjne Bazy Danych wykład X

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.

Page 17: Relacyjne Bazy Danych wykład X

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.

Page 18: Relacyjne Bazy Danych wykład X

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

Page 19: Relacyjne Bazy Danych wykład X

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

Page 20: Relacyjne Bazy Danych wykład X

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

Page 21: Relacyjne Bazy Danych wykład X

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

Page 22: Relacyjne Bazy Danych wykład X

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.

Page 23: Relacyjne Bazy Danych wykład X

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

Page 24: Relacyjne Bazy Danych wykład X

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

Page 25: Relacyjne Bazy Danych wykład X

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.

Page 26: Relacyjne Bazy Danych wykład X

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"

Page 27: Relacyjne Bazy Danych wykład X

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

Page 28: Relacyjne Bazy Danych wykład X

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.

Page 29: Relacyjne Bazy Danych wykład X

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

Page 30: Relacyjne Bazy Danych wykład X

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.

Page 31: Relacyjne Bazy Danych wykład X

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.

Page 32: Relacyjne Bazy Danych wykład X

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

Page 33: Relacyjne Bazy Danych wykład X

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.

Page 34: Relacyjne Bazy Danych wykład X

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

Page 35: Relacyjne Bazy Danych wykład X

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

Page 36: Relacyjne Bazy Danych wykład X

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

Page 37: Relacyjne Bazy Danych wykład X

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

Page 38: Relacyjne Bazy Danych wykład X

38opr. Lech Banachowski, Jan Wierzbicki

Formularz – podformularz (wyskakujący)

formularz główny

podformularzma dane związane

z formularzem głównym

Page 39: Relacyjne Bazy Danych wykład X

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

Page 40: Relacyjne Bazy Danych wykład X

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

Page 41: Relacyjne Bazy Danych wykład X

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.

Page 42: Relacyjne Bazy Danych wykład X

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

Page 43: Relacyjne Bazy Danych wykład X

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

Page 44: Relacyjne Bazy Danych wykład X

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

Page 45: Relacyjne Bazy Danych wykład X

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

Page 46: Relacyjne Bazy Danych wykład X

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.

Page 47: Relacyjne Bazy Danych wykład X

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

Page 48: Relacyjne Bazy Danych wykład X

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

Page 49: Relacyjne Bazy Danych wykład X

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

Page 50: Relacyjne Bazy Danych wykład X

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

Page 51: Relacyjne Bazy Danych wykład X

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.

Page 52: Relacyjne Bazy Danych wykład X

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.

Page 53: Relacyjne Bazy Danych wykład X

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

Page 54: Relacyjne Bazy Danych wykład X

54opr. Lech Banachowski, Jan Wierzbicki

Koniec wykładu X