1 / 54

Relacyjne Bazy Danych wykład X

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

tudor
Télécharger la présentation

Relacyjne Bazy Danych wykład X

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Relacyjne Bazy Danychwykład X

  2. Język aplikacji baz danych – Visual Basic Zostaną wprowadzone podstawowe pojęcia takie jak procedura, moduł, moduł klasy, zdarzeniei obsługa błędów.

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

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

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

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

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

  8. Access Visual Basic Wartość domyślna Text String "" Number Integer, Long, Double, Single 0 Currency Currency 0 Yes/No Boolean False Date/Time Date 30.12.1899 Typy danych dla zmiennych Specjalny typ danych Visual Basic - Variant - oznacza dowolny typ wartości.

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

  10. Przykład 1 Typowym 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

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

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

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

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

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

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

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

  18. sprawdza czy dany formularzjest otwarty 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 Then DoCmd.Close acForm, "KSIAZKI" End If End Sub

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

  20. Przy odczytywaniu wartości atrybutu Text fokus (bieżący kursor) musi znajdować się na danym polu: [Nazwisko].SetFocusMsgBox "Nazwisko = "&[Nazwisko].Text

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

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

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

  24. Przykład 5 Zwróć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.DescriptionResume Exit_Przycisk_ClickEnd Sub

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

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

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

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

  29. 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].SetFocusExit_Projekty_Click:   Exit Sub Err_Projekty_Click:   MsgBox Err.Description   Resume Exit_Projekty_Click End Sub

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

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

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

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

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

  35. Private Sub PracownicyInstytucji_Click()   On Error GoTo Form_Current_Err   Dim Ins As String   Ins = "Id_inst=Forms![Instytucje]!Id"   DoCmd.OpenForm "Pracownicy",,,InsForm_Current_Exit:   Exit SubForm_Current_Err:   MsgBox Err.Description   Resume Form_Current_ExitEnd Sub

  36. 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",,,InsForm_Current_Exit:   Exit SubForm_Current_Err:   MsgBox Error$   Resume Form_Current_ExitEnd Sub

  37. 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 SubForm_Current_Err:   MsgBox Err.Description   Resume Form_Current_ExitEnd Sub

  38. Formularz – podformularz (wyskakujący) formularz główny podformularzma dane związane z formularzem głównym

  39. PROCEDURY UMOŻLIWIAJĄCE KOPIOWANIE KLUCZA GŁÓWNEGO DO PODFORMULARZA WYSKAKUJĄCEGO PRZY DOPISYWANIU DANYCH Option Compare Database Option Explicit Public 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

  40. wczytanie wartości ze zmiennej globalnej 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 podformularz

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

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

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

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

  45. 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 = TrueEnd Sub

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

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

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

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

  50. bez wstrzymywania wyjścia: Private Sub txtPass_LostFocus()   If Len(txtPass) < 8 Then     MsgBox "Podaj 8 lub więcej znaków."   End IfEnd Sub

More Related