Rzut oka na książkę O autorach ....................................................................................................... 25 Wprowadzenie ................................................................................................. 27
Część I. Komponenty Accessa ....................................................... 33 Rozdział 1. Wprowadzenie do projektowania baz danych ............................. 35 Rozdział 2. Wprowadzenie do Accessa ............................................................ 51
Część II. Tabele Accessa ................................................................. 63 Rozdział 3. Tworzenie tabel ............................................................................. 65 Rozdział 4. Relacje między tabelami .............................................................. 117 Rozdział 5. Praca z tabelami ........................................................................... 155 Rozdział 6. Importowanie i eksportowanie danych ..................................... 191 Rozdział 7. Dołączanie danych zewnętrznych ............................................... 221
Część III. Kwerendy Accessa ........................................................ 245 Rozdział 8. Pobieranie danych za pomocą kwerend ..................................... 247 Rozdział 9. Stosowanie operatorów i wyrażeń ............................................. 277 Rozdział 10. Poza kwerendy wybierające ...................................................... 317
Część IV. Analizowanie danych w Accessie ................................ 349 Rozdział 11. Przekształcanie danych ............................................................. 351 Rozdział 12. Obliczenia i daty ......................................................................... 371 Rozdział 13. Analizy warunkowe .................................................................... 393 Rozdział 14. Podstawy SQL-a w Accessie ....................................................... 409 Rozdział 15. Podkwerendy i funkcje agregujące domeny ............................ 427 Rozdział 16. Statystyki opisowe ..................................................................... 447
6
Access 2013 PL. Biblia
Część V. Formularze i raporty Accessa ....................................... 461 Rozdział 17. Tworzenie prostych formularzy ................................................ 463 Rozdział 18. Praca z danymi w formularzach ................................................ 499 Rozdział 19. Praca z formantami formularzy ................................................ 529 Rozdział 20. Prezentowanie danych za pomocą raportów .......................... 561 Rozdział 21. Raporty w Accessie — techniki zaawansowane ....................... 613
Część VI. Podstawy programowania w Accessie ....................... 653 Rozdział 22. Korzystanie z makr programu Access ....................................... 655 Rozdział 23. Podstawy programowania w języku VBA ................................. 689 Rozdział 24. Typy danych i procedury w języku VBA .................................... 727 Rozdział 25. Model zdarzeń ............................................................................ 767 Rozdział 26. Debugowanie aplikacji Accessa ................................................. 789
Część VII. Zaawansowane techniki programowania w Accessie ................................................................... 817 Rozdział 27. Dostęp do danych za pomocą kodu VBA ................................... 819 Rozdział 28. Zaawansowany dostęp do danych z wykorzystaniem kodu VBA ................................................... 859 Rozdział 29. Integrowanie baz SQL Server i Access ....................................... 875 Rozdział 30. Dostosowywanie wstążek ......................................................... 915 Rozdział 31. Dystrybucja aplikacji Accessa .................................................... 949
Część VIII. Access i Windows SharePoint Services ...................... 991 Rozdział 32. Wprowadzenie do programu Windows SharePoint Services .... 993 Rozdział 33. Integrowanie Accessa z SharePointem ..................................... 999 Rozdział 34. Wprowadzenie do usług Access Services ................................ 1013 Rozdział 35. Instalowanie aplikacji Accessa w SharePoincie ...................... 1023 Rozdział 36. Makra danych ........................................................................... 1039
Dodatki ..................................................................................... 1057 Dodatek A. Specyfikacja Accessa 2013 ........................................................ 1059 Dodatek B. Optymalizowanie aplikacji Accessa .......................................... 1065 Dodatek C. Wydajność kwerend i uszkodzenia baz danych ....................... 1087 Dodatek D. Przegląd funkcji dla analityków danych .................................. 1095 Skorowidz ................................................................................................... 1127
Spis treści O autorach ....................................................................................................... 25 Wprowadzenie ................................................................................................. 27
Część I. Komponenty Accessa ....................................................... 33 Rozdział 1. Wprowadzenie do projektowania baz danych ............................. 35 Terminologia związana z bazami danych występująca w Accessie ....................................................35 Bazy danych .................................................................................................................................36 Tabele ...........................................................................................................................................37 Rekordy i pola ..............................................................................................................................38 Wartości .......................................................................................................................................38 Relacyjne bazy danych .......................................................................................................................38 Obiekty baz danych Accessa ..............................................................................................................39 Arkusze danych ............................................................................................................................40 Kwerendy .....................................................................................................................................40 Formularze do wprowadzania danych i ich wyświetlania ............................................................40 Raporty .........................................................................................................................................41 Obiekty bazy danych ....................................................................................................................41 Pięcioetapowa metoda projektowania .................................................................................................42 Krok 1.: Ogólny projekt systemu — od koncepcji do rzeczywistości ..........................................42 Krok 2.: Projektowanie raportów ..................................................................................................43 Krok 3.: Projektowanie danych ....................................................................................................43 Krok 4.: Projektowanie tabel ........................................................................................................45 Krok 5.: Projektowanie formularzy ..............................................................................................48 Rozdział 2. Wprowadzenie do Accessa ............................................................ 51 Ekran powitalny ..................................................................................................................................51 Tworzenie pustej bazy danych dla komputerów stacjonarnych ..........................................................53 Interfejs Accessa 2013 ........................................................................................................................54 Okienko nawigacji ........................................................................................................................55 Wstążka ........................................................................................................................................58 Pasek narzędzi Szybki dostęp .......................................................................................................58
8
Access 2013 PL. Biblia
Część II. Tabele Accessa ................................................................. 63 Rozdział 3. Tworzenie tabel ............................................................................. 65 Rodzaje tabel ......................................................................................................................................65 Tabele obiektów ...........................................................................................................................66 Tabele transakcyjne ......................................................................................................................66 Tabele łączące ..............................................................................................................................66 Tworzenie nowej tabeli .......................................................................................................................66 Projektowanie tabel ......................................................................................................................68 Posługiwanie się zakładką Projektowanie ....................................................................................72 Praca z polami ..............................................................................................................................74 Tworzenie tabeli klientów ..................................................................................................................82 Korzystanie z pól typu Autonumerowanie ...................................................................................82 Kończenie definicji tabeli tblCustomers .......................................................................................82 Zmiana projektu tabeli ........................................................................................................................83 Wstawianie pola ...........................................................................................................................83 Usuwanie pola ..............................................................................................................................83 Zmiana położenia pola ..................................................................................................................84 Zmiana nazwy pola .......................................................................................................................84 Zmiana rozmiaru pola ...................................................................................................................84 Problemy konwersji danych .........................................................................................................84 Przypisywanie właściwości pól ....................................................................................................85 Właściwości pól tabeli tblCustomers ................................................................................................101 Określanie klucza głównego .............................................................................................................103 Wybór klucza głównego .............................................................................................................103 Tworzenie klucza głównego .......................................................................................................104 Tworzenie złożonych kluczy głównych ......................................................................................105 Indeksowanie tabel ...........................................................................................................................106 Ważność stosowania indeksów ...................................................................................................107 Indeksy złożone z wielu pól .......................................................................................................108 Kiedy należy indeksować tabele? ...............................................................................................110 Drukowanie struktury tabeli .............................................................................................................111 Zapisywanie ukończonej tabeli .........................................................................................................112 Operacje na tabelach .........................................................................................................................113 Zmiana nazwy tabel ....................................................................................................................113 Usuwanie tabel ...........................................................................................................................113 Kopiowanie tabel w obrębie bazy danych ..................................................................................113 Kopiowanie tabel do innej bazy danych .....................................................................................114 Dodawanie rekordów do tabeli bazy danych ....................................................................................115 Posługiwanie się polami typu Załącznik ...........................................................................................116 Rozdział 4. Relacje między tabelami .............................................................. 117 Tworzenie kuloodpornych baz danych .............................................................................................118 Normalizacja i denormalizacja danych .............................................................................................120 Pierwsza postać normalna ..........................................................................................................120 Druga postać normalna ...............................................................................................................123 Trzecia postać normalna .............................................................................................................128 Denormalizacja ...........................................................................................................................130
Spis treści
9
Relacje między tabelami ...................................................................................................................131 Wiązanie danych ........................................................................................................................132 Jeden do jednego ........................................................................................................................134 Jeden do wielu ............................................................................................................................135 Wiele do wielu ............................................................................................................................137 Reguły integralności .........................................................................................................................138 Klucz główny nie może mieć wartości null ................................................................................140 Wszystkim wartościom kluczy obcych muszą odpowiadać klucze główne ................................141 Klucze ...............................................................................................................................................142 Określanie klucza głównego .......................................................................................................143 Korzyści wynikające ze stosowania kluczy głównych ...............................................................144 Wybór klucza głównego .............................................................................................................145 Tworzenie relacji i wymuszanie przestrzegania integralności odwołań .....................................147 Przeglądanie wszystkich relacji ..................................................................................................152 Usuwanie relacji .........................................................................................................................153 Reguły integralności specyficzne dla aplikacji ...........................................................................153 Rozdział 5. Praca z tabelami ........................................................................... 155 Arkusze danych ................................................................................................................................156 Okno arkusza danych ........................................................................................................................157 Poruszanie się po arkuszu danych ..............................................................................................157 Korzystanie z przycisków nawigacyjnych ..................................................................................158 Wstążka arkusza danych .............................................................................................................159 Otwieranie arkusza danych ...............................................................................................................160 Wpisywanie nowych danych ............................................................................................................161 Zapisywanie rekordu ..................................................................................................................162 Automatyczne sprawdzanie poprawności typów danych ............................................................163 W jaki sposób właściwości wpływają na wprowadzanie danych? ..............................................164 Poruszanie się między rekordami w arkuszu danych ........................................................................167 Poruszanie się między rekordami ...............................................................................................167 Wyszukiwanie określonej wartości ............................................................................................168 Modyfikowanie wartości w arkuszu danych .....................................................................................170 Ręczne zamienianie istniejących wartości ..................................................................................170 Modyfikacja istniejącej wartości ................................................................................................171 Używanie funkcji Cofnij ...................................................................................................................172 Kopiowanie i wklejanie wartości ......................................................................................................172 Zastępowanie wartości ......................................................................................................................173 Dodawanie nowych rekordów ..........................................................................................................174 Usuwanie rekordów ..........................................................................................................................174 Wyświetlanie rekordów ....................................................................................................................175 Zmiana kolejności pól ................................................................................................................175 Zmiana szerokości wyświetlanych pól .......................................................................................176 Zmiana wysokości wyświetlanych rekordów .............................................................................177 Zmiana czcionki .........................................................................................................................178 Wyświetlanie linii oddzielających komórki i różne kolory wierszy ...........................................179 Wyrównywanie danych w kolumnach ........................................................................................181 Ukrywanie i odkrywanie kolumn ...............................................................................................181 Blokowanie kolumn ....................................................................................................................182 Zapisywanie zmienionego układu arkusza .................................................................................182 Zapisywanie rekordu ..................................................................................................................182
10
Access 2013 PL. Biblia Sortowanie i filtrowanie rekordów w arkuszu danych ......................................................................182 Korzystanie z funkcji szybkiego sortowania ..............................................................................183 Używanie filtrowania według wyboru ........................................................................................183 Używanie filtrowania według formularza ..................................................................................185 Agregowanie danych ........................................................................................................................186 Drukowanie rekordów ......................................................................................................................188 Drukowanie arkusza danych .......................................................................................................188 Korzystanie z podglądu wydruku ...............................................................................................189 Rozdział 6. Importowanie i eksportowanie danych ..................................... 191 Access i dane zewnętrzne .................................................................................................................191 Typy danych zewnętrznych ........................................................................................................192 Metody pracy z danymi zewnętrznymi .......................................................................................192 Typy importu i eksportu ...................................................................................................................195 Importowanie zewnętrznych danych ................................................................................................196 Importowanie z innej bazy danych Accessa ...............................................................................197 Importowanie danych z arkusza kalkulacyjnego Excela .............................................................199 Importowanie list SharePointa ....................................................................................................203 Importowanie danych z plików tekstowych ................................................................................203 Importowanie i eksportowanie dokumentów XML ....................................................................208 Importowanie i eksportowanie dokumentów HTML ..................................................................212 Importowanie obiektów Accessa innych niż tabele ....................................................................214 Importowanie folderu Outlooka .................................................................................................215 Eksportowanie do formatów zewnętrznych ......................................................................................217 Eksportowanie obiektów do innych baz danych Accessa ...........................................................217 Eksportowanie do programu Word .............................................................................................218 Publikowanie w formacie PDF lub XPS .....................................................................................219 Rozdział 7. Dołączanie danych zewnętrznych ............................................... 221 Dołączanie danych zewnętrznych .....................................................................................................222 Identyfikowanie tabel połączonych ............................................................................................223 Ograniczenia dotyczące dołączonych danych .............................................................................225 Dołączanie tabel z innych baz danych Accessa ..........................................................................226 Łączenie ze źródłami danych ODBC ..........................................................................................228 Dołączanie danych, które nie są bazami .....................................................................................229 Praca z tabelami połączonymi ..........................................................................................................235 Ustawianie właściwości widoku .................................................................................................235 Ustawianie relacji .......................................................................................................................236 Optymalizowanie tabel połączonych ..........................................................................................236 Usuwanie odwołania do tabeli połączonej ..................................................................................237 Przeglądanie lub zmienianie informacji o tabelach połączonych ...............................................237 Odświeżanie zawartości tabel połączonych ................................................................................238 Dzielenie baz danych dla dostępu sieciowego ..................................................................................239 Zalety dzielenia baz danych ........................................................................................................239 Jak podzielić obiekty? ................................................................................................................242 Korzystanie z dodatku Rozdzielacz bazy danych .......................................................................242
Spis treści
11
Część III. Kwerendy Accessa ........................................................ 245 Rozdział 8. Pobieranie danych za pomocą kwerend ..................................... 247 Wprowadzenie w tematykę kwerend ................................................................................................248 Czym są kwerendy? ....................................................................................................................248 Co można robić za pomocą kwerend? ........................................................................................249 Co zwracają kwerendy? ..............................................................................................................250 Tworzenie kwerendy ........................................................................................................................250 Dodawanie pól ............................................................................................................................253 Uruchamianie kwerend ...............................................................................................................255 Praca z polami ..................................................................................................................................256 Zaznaczanie pola w obszarze siatki QBE ...................................................................................256 Zmiana kolejności pól ................................................................................................................257 Zmiana rozmiaru kolumn w obszarze siatki QBE ......................................................................257 Usuwanie pól ..............................................................................................................................258 Wstawianie pól ...........................................................................................................................258 Ukrywanie pól ............................................................................................................................258 Zmiana kolejności sortowania ....................................................................................................259 Dodawanie kryteriów do kwerend ....................................................................................................260 Kryteria wyboru rekordów .........................................................................................................260 Definiowanie prostych kryteriów tekstowych ............................................................................261 Definiowanie prostych kryteriów innych typów .........................................................................262 Drukowanie zbiorów wynikowych kwerend .....................................................................................263 Zapisywanie kwerendy .....................................................................................................................264 Tworzenie kwerend bazujących na wielu tabelach ...........................................................................264 Przeglądanie nazw tabel .............................................................................................................265 Dodawanie wielu pól ..................................................................................................................266 Ograniczenia dla kwerend bazujących na wielu tabelach ...........................................................266 Obchodzenie ograniczeń dotyczących kwerend .........................................................................267 Obszar tabel ......................................................................................................................................268 Linie sprzężeń .............................................................................................................................268 Przesuwanie tabel .......................................................................................................................269 Usuwanie tabel ...........................................................................................................................269 Dodawanie kolejnych tabel .........................................................................................................270 Tworzenie sprzężeń w kwerendach i ich obsługa .............................................................................270 Wprowadzenie do sprzężeń ........................................................................................................270 Wykorzystywanie sprzężeń ad hoc .............................................................................................272 Określanie typu sprzężenia .........................................................................................................273 Usuwanie sprzężeń .....................................................................................................................274 Rozdział 9. Stosowanie operatorów i wyrażeń ............................................. 277 Wprowadzenie w tematykę operatorów ............................................................................................277 Typy operatorów ........................................................................................................................278 Priorytety operatorów .................................................................................................................289 Stosowanie operatorów i wyrażeń w kwerendach ............................................................................291 Używanie operatorów porównania w kwerendach .....................................................................292 Tworzenie złożonych kryteriów .................................................................................................292 Używanie funkcji w kwerendach wybierających ........................................................................296 Odwoływanie się do pól w kwerendach wybierających .............................................................296
12
Access 2013 PL. Biblia Wpisywanie kryteriów jednowartościowych ....................................................................................296 Wprowadzanie kryteriów znakowych (Krótki tekst lub Długi tekst) ..........................................297 Operator Like i symbole wieloznaczne .......................................................................................298 Określanie wartości niepasujących .............................................................................................301 Wprowadzanie kryteriów liczbowych ........................................................................................302 Wprowadzanie kryteriów logicznych (Prawda/Fałsz) ................................................................303 Wprowadzanie kryterium dla obiektu OLE ................................................................................303 Wprowadzanie wielu kryteriów w kwerendzie .................................................................................304 Operacja Or ................................................................................................................................304 Określanie wielu wartości pola za pomocą operatora Or ............................................................304 Używanie komórki Lub: na siatce projektu (QBE) .....................................................................305 Używanie listy wartości w połączeniu z operatorem In ..............................................................306 Wykorzystanie operatora And do zdefiniowania zakresu ...........................................................306 Stosowanie operatora Between...And .........................................................................................307 Wyszukiwanie danych o wartości Null .......................................................................................308 Wprowadzanie kryteriów w wielu polach .........................................................................................310 Stosowanie operacji And i Or w polach kwerendy .....................................................................310 Określanie kryteriów Or w wielu polach kwerendy ...................................................................311 Stosowanie operacji And i Or na różnych polach .......................................................................313 Kwerenda złożona w wielu wierszach ........................................................................................313 Rozdział 10. Poza kwerendy wybierające ...................................................... 317 Kwerendy podsumowujące ...............................................................................................................317 Tworzenie kwerendy podsumowującej .......................................................................................318 Funkcje agregujące .....................................................................................................................320 Kwerendy funkcjonalne ....................................................................................................................325 Kwerendy tworzące tabele ..........................................................................................................325 Kwerendy usuwające ..................................................................................................................327 Kwerendy dołączające ................................................................................................................329 Kwerendy aktualizujące .............................................................................................................334 Kwerendy krzyżowe .........................................................................................................................337 Używanie kreatora kwerend krzyżowych ...................................................................................338 Ręczne tworzenie kwerend krzyżowych .....................................................................................342
Część IV. Analizowanie danych w Accessie ................................ 349 Rozdział 11. Przekształcanie danych ............................................................. 351 Wyszukiwanie i usuwanie powtarzających się rekordów .................................................................352 Czym są powtarzające się rekordy? ............................................................................................352 Wyszukiwanie duplikatów .........................................................................................................353 Usuwanie powtarzających się rekordów .....................................................................................355 Typowe zadania z zakresu przekształcania danych ..........................................................................358 Uzupełnianie pustych pól ...........................................................................................................358 Scalanie łańcuchów znaków .......................................................................................................359 Zmiana wielkości liter ................................................................................................................361 Usuwanie początkowych i końcowych spacji z łańcuchów znaków ...........................................362 Wyszukiwanie i zastępowanie określonego tekstu .....................................................................363 Dodawanie własnego tekstu w określonych miejscach łańcucha znaków ..................................364 Przetwarzanie łańcuchów znaków na podstawie znaczników ....................................................367
Spis treści
13
Rozdział 12. Obliczenia i daty ......................................................................... 371 Korzystanie z obliczeń w analizach ..................................................................................................371 Typowe scenariusze związane z obliczeniami ............................................................................372 Tworzenie obliczeń za pomocą konstruktora wyrażeń ...............................................................375 Typowe błędy w obliczeniach ....................................................................................................379 Używanie dat w analizach ................................................................................................................382 Proste obliczenia na datach .........................................................................................................382 Zaawansowane analizy z wykorzystaniem funkcji .....................................................................382 Rozdział 13. Analizy warunkowe .................................................................... 393 Stosowanie kwerend z parametrami .................................................................................................393 Jak działają kwerendy z parametrami? .......................................................................................395 Podstawowe zasady dotyczące kwerend z parametrami .............................................................395 Używanie kwerend z parametrami .............................................................................................395 Stosowanie funkcji warunkowych ....................................................................................................400 Funkcja IIf ..................................................................................................................................401 Funkcja Switch ...........................................................................................................................405 Porównanie funkcji IIf i Switch ..................................................................................................406 Rozdział 14. Podstawy SQL-a w Accessie ....................................................... 409 Podstawy SQL-a ...............................................................................................................................409 Instrukcja SELECT ....................................................................................................................410 Klauzula WHERE ......................................................................................................................411 Sprzężenia ..................................................................................................................................412 Zaawansowane instrukcje SQL-a ......................................................................................................413 Rozbudowywanie wyszukiwania za pomocą operatora Like ......................................................413 Pobieranie unikatowych wartości i wierszy bez grupowania ......................................................415 Grupowanie i agregowanie danych za pomocą klauzuli GROUP BY ........................................415 Określanie kolejności sortowania za pomocą klauzuli ORDER BY ...........................................416 Tworzenie aliasów za pomocą klauzuli AS ................................................................................416 Wyświetlanie tylko pierwszych elementów (instrukcje SELECT TOP i SELECT TOP PERCENT) ..........................................................416 Wykonywanie kwerend funkcjonalnych za pomocą instrukcji SQL-a .......................................419 Tworzenie kwerend krzyżowych za pomocą instrukcji TRANSFORM .....................................419 Kwerendy charakterystyczne dla SQL-a ...........................................................................................420 Scalanie zbiorów danych za pomocą operatora UNION ............................................................420 Tworzenie tabeli za pomocą instrukcji CREATE TABLE .........................................................422 Manipulowanie kolumnami za pomocą instrukcji ALTER TABLE ...........................................422 Tworzenie kwerend przekazujących ...........................................................................................424 Rozdział 15. Podkwerendy i funkcje agregujące domeny ............................ 427 Wzbogacanie analiz za pomocą podkwerend ....................................................................................428 Po co stosować podkwerendy? ...................................................................................................429 Podstawowe zasady dotyczące podkwerend ...............................................................................429 Tworzenie podkwerend bez pisania instrukcji SQL-a ................................................................429 Używanie operatorów IN i NOT IN w podkwerendach .............................................................432 Używanie podkwerend z operatorami porównania .....................................................................432 Stosowanie podkwerend jako wyrażeń .......................................................................................433 Stosowanie podkwerend skorelowanych ....................................................................................434 Używanie podkwerend w kwerendach funkcjonalnych ..............................................................436
14
Access 2013 PL. Biblia Funkcje agregujące domeny .............................................................................................................438 Różne funkcje agregujące domeny .............................................................................................440 Składnia funkcji agregujących domeny ......................................................................................441 Stosowanie funkcji agregujących domeny ..................................................................................442 Rozdział 16. Statystyki opisowe ..................................................................... 447 Podstawowe statystyki opisowe ........................................................................................................448 Obliczanie statystyk opisowych za pomocą kwerend podsumowujących ..................................448 Określanie rankingu, wartości modalnej i mediany ....................................................................449 Pobieranie losowej próbki ze zbioru danych ..............................................................................454 Zaawansowane statystyki opisowe ...................................................................................................455 Obliczanie percentyli ..................................................................................................................455 Ustalanie kwartyla dla rekordu ...................................................................................................457 Tworzenie rozkładu częstości .....................................................................................................458
Część V. Formularze i raporty Accessa ....................................... 461 Rozdział 17. Tworzenie prostych formularzy ................................................ 463 Tworzenie formularzy ......................................................................................................................464 Tworzenie nowego formularza ...................................................................................................465 Specjalne typy formularzy ..........................................................................................................469 Zmiana rozmiaru obszaru formularza .........................................................................................474 Zapisywanie formularza .............................................................................................................474 Formanty formularza ........................................................................................................................475 Typy formantów .........................................................................................................................475 Dodawanie formantów ...............................................................................................................477 Zaznaczanie i anulowanie zaznaczenia formantów ....................................................................482 Wykonywanie operacji na formantach .......................................................................................483 Właściwości ......................................................................................................................................492 Wyświetlanie arkusza właściwości .............................................................................................493 Korzystanie z arkusza właściwości .............................................................................................494 Zmiana ustawień właściwości formantu .....................................................................................494 Nadawanie nazw i tytułów formantom .......................................................................................496 Rozdział 18. Praca z danymi w formularzach ................................................ 499 Używanie widoku formularza ...........................................................................................................500 Zakładka NARZĘDZIA GŁÓWNE ...........................................................................................501 Nawigacja między polami ..........................................................................................................504 Nawigacja między rekordami w formularzu ...............................................................................504 Modyfikowanie wartości w formularzu ............................................................................................505 Formanty, których nie można modyfikować ..............................................................................506 Praca z obrazami i obiektami OLE .............................................................................................506 Wprowadzanie danych w polu typu Długi tekst .........................................................................507 Wprowadzanie danych w polu typu Data ...................................................................................507 Używanie grup opcji ...................................................................................................................508 Używanie pól kombi i list ...........................................................................................................509 Przełączanie się do widoku arkusza danych ...............................................................................510 Zapisywanie rekordu ..................................................................................................................510
Spis treści
15
Drukowanie formularzy ....................................................................................................................510 Praca z właściwościami formularza ..................................................................................................511 Modyfikacja tekstu na pasku tytułu za pomocą właściwości Tytuł ............................................513 Tworzenie formularza związanego .............................................................................................514 Określanie sposobu wyświetlania formularza .............................................................................514 Usuwanie paska selektora rekordów ...........................................................................................515 Inne właściwości formularzy ......................................................................................................515 Dodawanie nagłówka lub stopki formularza .....................................................................................522 Korzystanie z właściwości sekcji ......................................................................................................522 Właściwość Widoczny ...............................................................................................................522 Właściwość Wysokość ...............................................................................................................522 Właściwość Kolor tła .................................................................................................................522 Właściwość Efekt specjalny .......................................................................................................523 Właściwość Kiedy wyświetlać ...................................................................................................523 Właściwości związane z drukowaniem ......................................................................................523 Zmiana układu formularza ................................................................................................................523 Modyfikacja właściwości formantów .........................................................................................524 Określanie kolejności dostępu ....................................................................................................524 Modyfikowanie formatu tekstu w formancie ..............................................................................525 Używanie narzędzia Lista pól do dodawania formantów ...........................................................526 Przekształcanie formularza w raport .................................................................................................527 Rozdział 19. Praca z formantami formularzy ................................................ 529 Ustawianie właściwości formantów ..................................................................................................530 Modyfikowanie właściwości domyślnych ..................................................................................531 Często używane formanty i właściwości ....................................................................................532 Tworzenie formantów obliczeniowych .............................................................................................537 Praca z podformularzami ..................................................................................................................537 Wskazówki z zakresu projektowania formularzy .............................................................................539 Wykorzystanie właściwości Tab Stop ........................................................................................539 Zliczanie pól wyboru ..................................................................................................................539 Szybsze odświeżanie z użyciem SQL-a ......................................................................................539 Techniki związane z polami kombi i polami list ........................................................................540 Techniki zaawansowane ...................................................................................................................542 Formanty numeru strony i daty/godziny .....................................................................................542 Stosowanie formantu Obraz .......................................................................................................543 Morfing formantów ....................................................................................................................543 Malarz formatów ........................................................................................................................544 Dodatkowa pomoc dla użytkowników ........................................................................................545 Dodawanie obrazów tła ..............................................................................................................545 Ograniczanie liczby rekordów wyświetlanych w formularzu .....................................................547 Korzystanie z formantu Karta ...........................................................................................................548 Pobieranie informacji za pomocą okien dialogowych ......................................................................550 Projektowanie kwerend ..............................................................................................................551 Konfigurowanie przycisków poleceń .........................................................................................552 Wybór przycisku domyślnego ....................................................................................................552 Konfiguracja przycisku Anuluj ...................................................................................................553 Usunięcie menu sterowania ........................................................................................................553
16
Access 2013 PL. Biblia Projektowanie formularza od podstaw ..............................................................................................553 Tworzenie prostego formularza ..................................................................................................553 Tworzenie podformularza ...........................................................................................................554 Dodawanie podformularza .........................................................................................................555 Modyfikowanie działania formularza .........................................................................................557 Modyfikowanie wyglądu formularza ..........................................................................................559 Rozdział 20. Prezentowanie danych za pomocą raportów .......................... 561 Podstawowe informacje o raportach .................................................................................................561 Dostępne typy raportów ..............................................................................................................562 Różnice między raportami a formularzami .................................................................................565 Tworzenie raportu od podstaw ..........................................................................................................565 Zdefiniowanie układu raportu .....................................................................................................565 Gromadzenie danych ..................................................................................................................565 Tworzenie raportu za pomocą kreatora .......................................................................................566 Drukowanie lub wyświetlanie raportu ........................................................................................579 Zapisywanie raportów ................................................................................................................581 Zagadnienia związane z raportami typu pasmowego ........................................................................581 Sekcja nagłówka raportu ............................................................................................................583 Sekcja nagłówka strony ..............................................................................................................584 Sekcja nagłówka grupy ...............................................................................................................584 Sekcja szczegółów ......................................................................................................................585 Sekcja stopki grupy ....................................................................................................................585 Sekcja stopki strony ....................................................................................................................585 Sekcja stopki raportu ..................................................................................................................585 Tworzenie raportu od podstaw ..........................................................................................................586 Tworzenie nowego raportu i wiązanie go z kwerendą ................................................................587 Definiowanie rozmiaru i układu strony raportu ..........................................................................589 Umieszczanie formantów na raporcie .........................................................................................590 Zmiana rozmiaru sekcji ..............................................................................................................590 Praca z polami tekstowymi .........................................................................................................592 Zmiana właściwości etykiet i pól tekstowych .............................................................................598 Powiększanie i zmniejszanie pól tekstowych .............................................................................599 Sortowanie i grupowanie danych ................................................................................................601 Sortowanie danych w obrębie grup ............................................................................................603 Wprowadzanie podziału na strony ..............................................................................................605 Dopracowywanie wyglądu raportu ...................................................................................................606 Modyfikowanie nagłówka strony ...............................................................................................607 Tworzenie wyrażenia w nagłówku grupy ...................................................................................608 Tworzenie nagłówka raportu ......................................................................................................609 Rozdział 21. Raporty w Accessie — techniki zaawansowane ....................... 613 Grupowanie i sortowanie danych ......................................................................................................614 Alfabetyczne grupowanie danych ...............................................................................................614 Grupowanie według przedziałów czasowych .............................................................................619 Ukrywanie powtarzających się informacji ..................................................................................620 Ukrycie nagłówka strony ............................................................................................................623 Nowa numeracja strony dla każdej grupy ...................................................................................624
Spis treści
17
Formatowanie danych .......................................................................................................................624 Tworzenie list numerowanych ....................................................................................................625 Dodawanie znaków wypunktowania ..........................................................................................628 Dodawanie wyróżnienia w czasie wykonywania programu .......................................................630 Unikanie pustych raportów .........................................................................................................632 Dodawanie linii pionowych pomiędzy kolumnami ....................................................................633 Dodawanie pustego wiersza co n rekordów ................................................................................634 Drukowanie stron nieparzystych i parzystych ............................................................................636 Używanie różnych formatów w tym samym polu tekstowym ....................................................638 Centrowanie tytułu .....................................................................................................................639 Łatwe wyrównywanie etykiet formantów ..................................................................................639 Precyzyjne przemieszczanie formantów .....................................................................................639 Dodawanie danych ............................................................................................................................640 Dodawanie innych informacji do raportu ...................................................................................640 Dodanie nazwiska użytkownika do raportu związanego ............................................................640 Inne techniki .....................................................................................................................................642 Wyświetlanie wszystkich raportów w polu kombi .....................................................................642 Szybkie drukowanie danych z kwerendy ....................................................................................643 Używanie dwóch i więcej kolumn w raporcie ............................................................................644 Wykorzystanie dwuprzebiegowego przetwarzania raportów ......................................................650 Przypisywanie unikatowych nazw do formantów .......................................................................652
Część VI. Podstawy programowania w Accessie ....................... 653 Rozdział 22. Korzystanie z makr programu Access ....................................... 655 Wprowadzenie do makr ....................................................................................................................656 Tworzenie makr ..........................................................................................................................656 Przypisanie makra do zdarzenia .................................................................................................658 Makra a bezpieczeństwo ...................................................................................................................659 Centrum zaufania ........................................................................................................................662 Makra z wieloma akcjami .................................................................................................................663 Podmakra ..........................................................................................................................................666 Korzystanie z warunków ..................................................................................................................670 Otwieranie raportów za pomocą warunków ...............................................................................670 Wiele akcji w warunku ...............................................................................................................672 Korzystanie ze zmiennych tymczasowych ........................................................................................673 Rozszerzanie utworzonego makra ..............................................................................................673 Upraszczanie makr za pomocą zmiennych tymczasowych .........................................................675 Korzystanie ze zmiennych tymczasowych w kodzie VBA .........................................................677 Obsługa błędów i debugowanie makr ...............................................................................................678 Akcja PrzyBłędzie ......................................................................................................................679 Obiekt MacroError .....................................................................................................................681 Debugowanie makr .....................................................................................................................682 Makra osadzone ................................................................................................................................683 Makra kontra kod VBA ....................................................................................................................685 Makra czy VBA? ........................................................................................................................686 Konwersja istniejących makr na kod VBA .................................................................................687
18
Access 2013 PL. Biblia Rozdział 23. Podstawy programowania w języku VBA ................................. 689 Wprowadzenie do języka Visual Basic for Applications ..................................................................690 Terminologia związana z językiem VBA .........................................................................................691 Wprowadzenie do pisania kodu w języku VBA ...............................................................................692 Tworzenie programów w języku VBA .............................................................................................693 Moduły i procedury ....................................................................................................................694 Korzystanie z okna kodu ............................................................................................................700 Konstrukcje sterujące języka VBA ...................................................................................................705 Instrukcje warunkowe .................................................................................................................705 Pętle ............................................................................................................................................711 Obiekty i kolekcje .............................................................................................................................714 Wprowadzenie do obiektów .......................................................................................................714 Metody i właściwości .................................................................................................................715 Instrukcja With ...........................................................................................................................716 Instrukcja For Each .....................................................................................................................718 Przegląd edytora VBE ......................................................................................................................719 Okno Immediate .........................................................................................................................719 Project Explorer ..........................................................................................................................720 Object Browser ...........................................................................................................................721 Opcje edytora VBE .....................................................................................................................722 Rozdział 24. Typy danych i procedury w języku VBA .................................... 727 Zmienne ............................................................................................................................................728 Nazewnictwo zmiennych ............................................................................................................729 Deklarowanie zmiennych ...........................................................................................................730 Typy danych .....................................................................................................................................735 Porównanie niejawnego i jawnego deklarowania zmiennych .....................................................737 Wymuszanie jawnego deklarowania zmiennych ........................................................................738 Stosowanie konwencji nazewniczej ............................................................................................739 Zasięg i czas życia zmiennych ....................................................................................................741 Stosowanie stałych .....................................................................................................................745 Stosowanie tablic ........................................................................................................................747 Procedury Sub i funkcje ....................................................................................................................753 Gdzie można utworzyć procedurę? .............................................................................................755 Wywoływanie procedur w języku VBA .....................................................................................755 Tworzenie procedur Sub .............................................................................................................756 Tworzenie funkcji .............................................................................................................................759 Obsługa przekazywanych parametrów .......................................................................................760 Wywoływanie funkcji i przekazywanie parametrów ..................................................................761 Tworzenie funkcji wyznaczającej kwotę podatku ......................................................................762 Upraszczanie kodu za pomocą argumentów identyfikowanych przez nazwę ...................................765 Rozdział 25. Model zdarzeń ............................................................................ 767 Programowanie zdarzeń ....................................................................................................................768 W jaki sposób zdarzenia uruchamiają kod VBA? .......................................................................769 Tworzenie procedur zdarzeń .......................................................................................................770 Często używane zdarzenia ................................................................................................................771 Procedury zdarzeń formularza ....................................................................................................772 Procedury obsługi zdarzeń formantów .......................................................................................775
Spis treści
19
Procedury zdarzeń związane z raportami ...................................................................................777 Procedury zdarzeń dotyczących sekcji raportów ........................................................................778 Kolejność zdarzeń .............................................................................................................................780 Często występujące sekwencje zdarzeń ......................................................................................780 Pisanie prostych procedur obsługi zdarzeń formularzy i formantów ..........................................782 Rozdział 26. Debugowanie aplikacji Accessa ................................................. 789 Porządkowanie kodu VBA ...............................................................................................................790 Testowanie aplikacji .........................................................................................................................791 Testowanie funkcji .....................................................................................................................792 Kompilowanie kodu VBA ..........................................................................................................795 Tradycyjne techniki debugowania ....................................................................................................797 Używanie instrukcji MsgBox .....................................................................................................797 Korzystanie z instrukcji Debug.Print ..........................................................................................798 Korzystanie z mechanizmów debugowania Accessa ........................................................................801 Uruchamianie kodu w oknie Immediate .....................................................................................801 Wstrzymywanie wykonywania kodu z wykorzystaniem pułapek ...............................................802 Podgląd zmiennych w oknie Locals ...........................................................................................807 Ustawianie czujek w oknie Watches ..........................................................................................808 Czujki warunkowe ......................................................................................................................810 Używanie stosu wywołań ...........................................................................................................811 Przechwytywanie błędów w kodzie ..................................................................................................812 Na czym polega przechwytywanie błędów? ...............................................................................812 Obiekt Err ...................................................................................................................................815 Dodawanie obsługi błędów do procedur .....................................................................................815
Część VII. Zaawansowane techniki programowania w Accessie ................................................................... 817 Rozdział 27. Dostęp do danych za pomocą kodu VBA ................................... 819 Praca z danymi ..................................................................................................................................819 Wprowadzenie do obiektów ADO ....................................................................................................823 Obiekt Connection w ADO ........................................................................................................824 Obiekt Command w ADO ..........................................................................................................827 Obiekt Recordset w ADO ...........................................................................................................829 Obiekty DAO ....................................................................................................................................835 Obiekt DBEngine w DAO ..........................................................................................................836 Obiekt Workspace w DAO .........................................................................................................836 Obiekt Database w DAO ............................................................................................................837 Obiekt TableDef w DAO ............................................................................................................837 Obiekty typu QueryDef w DAO .................................................................................................839 Obiekty typu Recordset w DAO .................................................................................................840 Obiekty typu Field (ze zbiorów rekordów) w DAO ...................................................................841 Pisanie kodu VBA do aktualizowania tabeli .....................................................................................843 Aktualizacja pól rekordu z zastosowaniem ADO .......................................................................844 Aktualizacja pola obliczeniowego w rekordzie ..........................................................................848 Wstawienie nowego rekordu ......................................................................................................853 Usuwanie rekordu .......................................................................................................................854 Usuwanie powiązanych rekordów znajdujących się w kilku tabelach ........................................855
20
Access 2013 PL. Biblia Rozdział 28. Zaawansowany dostęp do danych z wykorzystaniem kodu VBA ................................................... 859 Wyszukiwanie danych w formularzach za pomocą niezwiązanych pól kombi .................................860 Wykorzystanie metody FindRecord ...........................................................................................862 Wykorzystywanie zakładek ........................................................................................................863 Filtrowanie danych formularza .........................................................................................................866 Filtrowanie za pomocą kodu .......................................................................................................867 Wykorzystanie kwerend .............................................................................................................868 Rozdział 29. Integrowanie baz SQL Server i Access ....................................... 875 Wprowadzenie do serwera SQL Server Express ...............................................................................876 Typy danych w bazach SQL Server ..................................................................................................878 Instalowanie serwera SQL Server Express .......................................................................................881 Instalowanie silnika bazy danych ...............................................................................................882 Instalowanie przykładowej bazy danych ....................................................................................885 Wprowadzenie do narzędzia Management Studio ......................................................................887 Posługiwanie się wierszem poleceń ............................................................................................891 Podłączanie się do serwera SQL Server ............................................................................................893 Tworzenie źródła danych ............................................................................................................893 Łączenie serwera SQL Server z Accessem .................................................................................897 Używanie ADO do baz SQL Server ...........................................................................................899 Praca z obiektami serwera SQL Server .............................................................................................905 Używanie tabel z serwera SQL Server w Accessie ....................................................................905 Widoki ........................................................................................................................................910 Procedury składowane ................................................................................................................911 Wyzwalacze ................................................................................................................................913 Rozdział 30. Dostosowywanie wstążek ......................................................... 915 Hierarchia wstążki ............................................................................................................................916 Formanty dla wstążek .................................................................................................................916 Specjalne mechanizmy wstążki ..................................................................................................919 Modyfikowanie domyślnej wstążki ..................................................................................................921 Praca z paskiem narzędzi Szybki dostęp ...........................................................................................923 Tworzenie niestandardowych wstążek ..............................................................................................925 Proces tworzenia wstążki ............................................................................................................926 Korzystanie z wywołań zwrotnych w języku VBA ....................................................................926 Tworzenie niestandardowej wstążki .................................................................................................928 Krok 1.: Projektowanie wstążki i rozwijanie kodu w XML-u ....................................................928 Krok 2.: Pisanie procedur wywołań zwrotnych ..........................................................................930 Krok 3.: Tworzenie tabeli USysRibbons ....................................................................................931 Krok 4.: Dodawanie kodu w XML-u do tabeli USysRibbons ....................................................932 Krok 5.: Określenie niestandardowych właściwości wstążki użytkownika ................................933 Podstawowy XML-owy kod wstążki ................................................................................................934 Dodawanie formantów do wstążki ....................................................................................................937 Określanie atrybutu imageMso ...................................................................................................937 Formant etykiety .........................................................................................................................938 Przycisk ......................................................................................................................................939 Separator .....................................................................................................................................940 Pola wyboru ................................................................................................................................940
Spis treści
21
Formant Lista rozwijana .............................................................................................................941 Przycisk rozdzielenia ..................................................................................................................944 Wiązanie wstążek z formularzami i raportami ..................................................................................945 Całkowite usuwanie wstążek ............................................................................................................946 Rozdział 31. Dystrybucja aplikacji Accessa .................................................... 949 Definiowanie opcji bieżącej bazy danych .........................................................................................950 Opcje aplikacji ............................................................................................................................951 Opcje nawigacji ..........................................................................................................................955 Opcje wstążki i paska narzędzi ...................................................................................................956 Opcje autokorekty nazw .............................................................................................................957 Tworzenie aplikacji ..........................................................................................................................957 Budowanie aplikacji zgodnie ze specyfikacją ............................................................................958 Dokumentacja aplikacji ..............................................................................................................960 Testowanie aplikacji przed dystrybucją ......................................................................................961 Dopracowywanie aplikacji ...............................................................................................................963 Nadanie aplikacji spójnego wyglądu i wrażenia .........................................................................963 Dodawanie popularnych, profesjonalnych komponentów ..........................................................964 Ułatwienie uruchamiania aplikacji .............................................................................................973 Dodatkowa ochrona aplikacji ...........................................................................................................975 Przechwytywanie błędów wszystkich procedur języka Visual Basic .........................................975 Oddzielanie tabel od pozostałej części aplikacji .........................................................................979 Tworzenie formularzy odpornych na błędy ................................................................................979 Sprawdzanie poprawności danych wprowadzanych przez użytkownika ....................................980 Korzystanie z opcji /runtime .......................................................................................................980 Szyfrowanie i kodowanie bazy danych .......................................................................................982 Zabezpieczanie kodu Visual Basica ...........................................................................................983 Zabezpieczanie środowiska ..............................................................................................................986 Ustawianie opcji startowych w kodzie .......................................................................................986 Blokada omijania opcji startowych .............................................................................................987 Ustawianie wartości właściwości ...............................................................................................988 Pobieranie wartości właściwości ................................................................................................989
Część VIII. Access i Windows SharePoint Services ...................... 991 Rozdział 32. Wprowadzenie do programu Windows SharePoint Services .... 993 Wprowadzenie do SharePointa .........................................................................................................993 Przegląd typów witryn SharePointa ..................................................................................................994 Witryny SharePointa .........................................................................................................................995 Dokumenty SharePointa .............................................................................................................995 Listy SharePointa ........................................................................................................................996 Omówienie podstaw integrowania Accessa z SharePointem ............................................................997 Rozdział 33. Integrowanie Accessa z SharePointem ..................................... 999 Współużytkowanie danych Accessa z SharePointem .....................................................................1000 Dołączanie list SharePointa ......................................................................................................1000 Importowanie list SharePointa ..................................................................................................1003 Eksportowanie tabel Accessa do SharePointa ..........................................................................1004 Przenoszenie tabel Accessa do SharePointa .............................................................................1006 Korzystanie z szablonów SharePointa ............................................................................................1009
22
Access 2013 PL. Biblia Rozdział 34. Wprowadzenie do usług Access Services ................................ 1013 Aplikacje zarządzane ......................................................................................................................1013 Publikowanie w internecie za pomocą Accessa ..............................................................................1015 Dlaczego SharePoint? ...............................................................................................................1016 Wykorzystanie funkcji SharePointa ..........................................................................................1016 Usługi Access Services ...................................................................................................................1017 Ograniczenia aplikacji internetowych Accessa ...............................................................................1018 Limity w usługach Access Services ..........................................................................................1019 Limity w zakresie transakcji .....................................................................................................1019 Rozdział 35. Instalowanie aplikacji Accessa w SharePoincie ...................... 1023 Publikowanie niestandardowej aplikacji Accessa w SharePoincie .................................................1024 Przygotowywanie modelu danych Accessa ..............................................................................1024 Inicjowanie i konfigurowanie niestandardowej aplikacji sieciowej ..........................................1026 Uruchamianie aplikacji sieciowej i zarządzanie nią .................................................................1034 Rozdział 36. Makra danych ........................................................................... 1039 Wprowadzenie do makr danych ......................................................................................................1040 Zdarzenia tabel ...............................................................................................................................1041 Zdarzenia „przed” .....................................................................................................................1041 Zdarzenia „po” .........................................................................................................................1042 Używanie edytora makr do tworzenia makr danych .......................................................................1043 Posługiwanie się wykazem akcji ....................................................................................................1045 Przepływ sterowania w programie ............................................................................................1046 Bloki danych .............................................................................................................................1046 Akcje danych ............................................................................................................................1047 Tworzenie pierwszego makra danych .............................................................................................1049 Zarządzanie elementami makr ........................................................................................................1052 Zwijanie i rozwijanie elementów makr .....................................................................................1052 Przenoszenie elementów makr .................................................................................................1052 Zapisywanie makr w plikach XML ..........................................................................................1053 Ograniczenia makr danych .............................................................................................................1054
Dodatki ..................................................................................... 1057 Dodatek A. Specyfikacja Accessa 2013 ........................................................ 1059 Specyfikacje dotyczące baz danych Accessa ..................................................................................1060 Specyfikacja bazy danych Microsoft SQL Server Express .............................................................1063 Dodatek B. Optymalizowanie aplikacji Accessa .......................................... 1065 Ładowanie modułu na żądanie ........................................................................................................1066 Organizowanie modułów ..........................................................................................................1066 Przycinanie drzewa wywołań ...................................................................................................1066 Dystrybucja plików .accde ..............................................................................................................1068 Czym jest stan skompilowany? .......................................................................................................1070 Przekształcenie kodu aplikacji na postać skompilowaną ..........................................................1071 Utrata stanu skompilowanego ...................................................................................................1071
Spis treści
23
Poprawianie szybkości działania aplikacji ......................................................................................1072 Dostrajanie systemu ..................................................................................................................1073 Optymalne wykorzystanie tabel ...............................................................................................1073 Optymalne wykorzystanie kwerend ..........................................................................................1075 Optymalne wykorzystanie formularzy i raportów ....................................................................1076 Optymalne wykorzystanie modułów ........................................................................................1078 Zwiększenie wydajności działania w sieci ...............................................................................1083 Praca z dużymi bazami danych Accessa .........................................................................................1083 Jak zwiększa się rozmiar baz danych? ......................................................................................1084 Ograniczenie się do kompilowania i scalania może nie wystarczyć .........................................1084 Wprowadzanie małych zmian w dużych bazach danych ..........................................................1086 Dodatek C. Wydajność kwerend i uszkodzenia baz danych ....................... 1087 Optymalizowanie wydajności kwerend ..........................................................................................1087 Normalizowanie projektu bazy danych ....................................................................................1087 Stosowanie indeksów dla odpowiednich pól ............................................................................1088 Optymalizowanie kwerend przez ulepszenie ich projektu ........................................................1089 Regularne kompaktowanie i naprawianie bazy danych ............................................................1090 Radzenie sobie z uszkodzeniami baz danych ..................................................................................1090 Wykrywanie uszkodzonych baz danych ...................................................................................1091 Przywracanie uszkodzonej bazy danych ...................................................................................1092 Zapobieganie uszkodzeniom baz danych ..................................................................................1092 Dodatek D. Przegląd funkcji dla analityków danych .................................. 1095 Skorowidz ................................................................................................... 1127
24
Access 2013 PL. Biblia
O autorach Michael Alexander posiada certyfikat MCAD (ang. Microsoft Certified Application Developer) i jest autorem kilku książek poświęconych zaawansowanym analizom biznesowym z wykorzystaniem programów Microsoft Access i Microsoft Excel. Ma ponad 15 doświadczenia w zakresie doradztwa i tworzenia rozwiązań opartych na pakiecie Microsoft Office. Ponadto uzyskał tytuł Microsoft MVP za nieustający wkład w życie społeczności użytkowników Excela. W wolnym czasie prowadzi witrynę z bezpłatnymi samouczkami, http://www.datapigtechnologies.com, gdzie udostępnia wskazówki dotyczące Excela i Accessa. Dick Kusleika otrzymywał nagrodę Microsoft MVP przez 12 kolejnych lat, a z pakietem Microsoft Office pracuje od ponad 20 lat. Rozwija dla swoich klientów rozwiązania oparte na Accessie i Excelu, a także prowadzi w Stanach Zjednoczonych i Australii szkolenia dotyczące produktów z pakietu Office. Pisze też na popularnym blogu poświęconym Excelowi — http://www.dailydoseofexcel.com.
26
Access 2013 PL. Biblia
Wprowadzenie Witaj na stronach książki Access 2013 PL. Biblia — Twojego osobistego przewodnika po najbardziej rozbudowanym systemie zarządzania bazami danych. Jeśli sięgnąłeś po tę książkę, prawdopodobnie stwierdziłeś, że Microsoft Access pozwoli Ci zarządzać danymi w sposób, którego nie umożliwiają inne aplikacje. Nawet najpopularniejsza z nich, Microsoft Excel, nie oferuje możliwości dostępnych w Accessie. Porównywanie Accessa (systemu zarządzania bazami danych) do Excela (programu do obsługi arkuszy kalkulacyjnych) może się wydawać nieuzasadnione, jednak w wielu firmach Excela używa się do zarządzania dużymi ilościami danych i ich analizowania. Możliwe, że czytasz tę książkę, ponieważ chcesz się pozbyć ograniczeń związanych z Excelem. Poznanie Accessa to doskonały (a zdaniem wielu — logiczny) następny krok w rozwoju dla analityków, którzy muszą pracować z wciąż rosnącymi zbiorami danych. Access pozwala na bardzo wydajne zarządzanie dużymi zbiorami danych i nie ma wbudowanego ograniczenia liczby wierszy. Umożliwia też skuteczne zarządzanie relacjami między odrębnymi tabelami i oferuje narzędzia pomagające w pisaniu własnych aplikacji, które można udostępniać innym. Obecnie, gdy ilość danych jest większa niż kiedykolwiek wcześniej i rośnie zapotrzebowanie na zaawansowane analizy danych, doświadczeni analitycy muszą zacząć stosować dodatkowe narzędzia, aby nie pozostać na etapie „operatora arkusza kalkulacyjnego”. To dlatego niniejsza książka jest tak ważna przy rozwijaniu umiejętności zawodowych. Znajdziesz w niej nie tylko wprowadzenie do Accessa, ale też poznasz różne sposoby pozwalające wykorzystać ten program do usprawnienia zarządzania danymi i ich analizowania.
Czy ta książka jest przeznaczona dla Ciebie? Książka zawiera wszystko, co konieczne, aby poznać Accessa 2013 na średnim poziomie. Zaczynamy od podstaw, a w każdym kolejnym rozdziale opieramy się na wiedzy przedstawionej wcześniej. Książka ta ma umożliwić zdobycie nowych umiejętności użytkownikom na wszystkich poziomach zaawansowania (początkującym, średnio zaawansowanym, a nawet doświadczonym użytkownikom Accessa). Jeśli dopiero poznajesz Accessa, zacznij lekturę od
28
Access 2013 PL. Biblia
początku książki. Natomiast czytelnicy, którzy znają program i potrafią tworzyć w nim aplikacje, mogą od razu przejść do dalszych rozdziałów. Dla nowicjuszy w świecie zarządzania bazami danych ta książka jest wszystkim, czego potrzebują, aby rozpocząć pracę z Accessem 2013. Przedstawia też bardziej zaawansowane tematy w sposób ułatwiający naukę, a także stanowiąc swego rodzaju leksykon. Osoby początkujące powinny zwrócić szczególną uwagę na część I, w której opisaliśmy niezbędne umiejętności potrzebne do tworzenia skutecznych i wydajnych baz danych. Umiejętności projektanta baz danych podlegają nieustannej ocenie pod kątem wydajności tworzonych aplikacji oraz skuteczności obsługi danych powierzonych przez użytkowników. Jeśli korzystałeś z wcześniejszych wersji Accessa, jest to książka dla Ciebie. Możliwe, że znasz już mechanizmy Accessa, jednak w każdej nowej wersji zmieniają się nie tylko dostępne funkcje, ale też sposób wykonywania niektórych zadań. Ta książka pomoże Ci zapoznać się z wszystkimi wprowadzonymi zmianami. Jeżeli chcesz poznać podstawy programowania w języku VBA (ang. Visual Basic for Applications), znajdziesz tu wszystko, czego potrzebujesz. Wprawdzie język ten jest rozbudowany i zasługuje na odrębną książkę, tu zamieściliśmy pokaźny zestaw rozdziałów, które pozwolą Ci rozpocząć korzystanie z języka VBA do wzbogacania baz danych Accessa. W części VI znajdziesz omówienie różnych aspektów (w tym wielu szczegółów technicznych) pisania procedur VBA i tworzenia aplikacji Accessa na podstawie kodu dodanego do baz danych.
Konwencje stosowane w książce W niniejszej książce zastosowano następujące konwencje:
Kiedy przedstawiana jest kombinacja klawiszy (tzn. kiedy należy nacisnąć jeden klawisz i, nie puszczając go, nacisnąć inny), to poszczególne klawisze oddzielone są znakiem plusa (+). Na przykład Ctrl+Esc oznacza, że trzeba przytrzymać klawisz Ctrl, nacisnąć klawisz Esc, a następnie dopiero puścić obydwa klawisze.
Wskaż kursorem myszy oznacza, że trzeba tak przesunąć mysz, aby jej wskaźnik znajdował się nad określonym elementem. Kliknięcie oznacza pojedyncze naciśnięcie oraz zwolnienie lewego przycisku myszy. Podwójne kliknięcie to dwukrotne naciśnięcie i zwolnienie lewego przycisku myszy w krótkim odstępie czasu. Kliknięcie prawym przyciskiem myszy polega na naciśnięciu i zwolnieniu prawego przycisku myszy. Przeciąganie elementu to kliknięcie go lewym przyciskiem myszy oraz przesuwanie wskaźnika myszy przy stale przytrzymywanym przycisku.
Kursywą oznaczone są pojęcia nowe lub o szczególnym znaczeniu oraz nazwy różnych etykietek ekranowych.
Pogrubiona czcionka o stałej szerokości znaków
oznacza tekst, który należy
bezpośrednio wprowadzić do komputera. Czcionką o stałej szerokości znaków
ukazujące się na ekranie.
wydrukowane są kod i informacje
Wprowadzenie
29
Jak książka jest zorganizowana? Książka ta jest podzielona na dziewięć części:
Część I. Komponenty Accessa. Część I zapewnia solidne opanowanie podstawowych elementów baz danych oraz zawiera wyjaśnienie najważniejszych pojęć z zakresu zarządzania bazami danych, a także omówienie planowania tabel i pracy z typami danych Accessa. W tej części po raz pierwszy przyjrzysz się Accessowi i jego interfejsowi.
Część II. Tabele Accessa. W trakcie lektury części II zdobędziesz wiedzę potrzebną do tworzenia tabel Accessa, zarządzania relacjami między tabelami i łączenia się z różnymi źródłami danych (plikami Excela, plikami tekstowymi, bazami SQL Server i innymi bazami Accessa).
Część III. Kwerendy Accessa. W części III przedstawiliśmy wybrane podstawowe narzędzia analityczne dostępne w Accessie. Poznasz tu kreator kwerend, a także sposoby tworzenia prostych i zaawansowanych analiz tabel Accessa. Opisaliśmy też podstawy kwerend, kwerendy podsumowujące, kwerendy funkcjonalne i kwerendy krzyżowe.
Część IV. Analizowanie danych w Accessie. W części IV opisaliśmy wiele zaawansowanych technik, które pozwalają przenieść analizy danych na następny poziom. Dowiesz się tu, jak przekształcać dane za pomocą kwerend, jak przeprowadzać niestandardowe obliczenia i analizy warunkowe, jak tworzyć przydatne podzapytania, a także jak przeprowadzać analizy statystyczne dla kwerend.
Część V. Formularze i raporty Accessa. W części V skoncentrowaliśmy się na tworzeniu formularzy i raportów w Accessie. Dowiesz się, jak przekształcić dane w elegancki interfejs użytkownika i w raporty Accessa (przypominają one wyglądem pliki PDF). Poznasz też metody wzbogacania wyglądu i stylu aplikacji Accessa za pomocą zaawansowanych formantów formularzy.
Część VI. Podstawy programowania w Accessie. W części VI zrobisz następny krok i zajmiesz się programowaniem. W rozdziałach z tej części najpierw opisaliśmy makra Accessa, następnie podstawy języka VBA, a na końcu korzystanie z tego języka do usprawniania baz danych Accessa. Dzięki tej części lepiej zrozumiesz złożone modele (obiektowy i zdarzeń), na których oparte są aplikacje Accessa, a także dowiesz się, jak tworzyć kod w języku VBA potrzebny do wykorzystania możliwości bogatego środowiska programowania.
Część VII. Zaawansowane techniki programowania w Accessie. W części VII omówiliśmy automatyzację i integrację. Dowiesz się tu, jak wzbogacić mechanizmy tworzenia raportów przez wykorzystanie innych programów i platform. Rozdziały z tej części nie tylko pozwolą Ci zdobyć podstawowe umiejętności potrzebne do sprawnego posługiwania się językiem VBA, ale też pomogą odkryć wiele zaawansowanych sztuczek, które możesz wykorzystać w rozwijanych aplikacjach Accessa. Poznasz tu też wiele zaawansowanych technik, np. modyfikowanie wstążki Accessa 2013.
30
Access 2013 PL. Biblia
Część VIII. Access i Windows SharePoint Services. W części VIII przedstawiliśmy usługi Microsoft Windows SharePoint. Poznasz tu rozbudowane możliwości z zakresu integrowania usług Microsoft SharePoint z Accessem. Pozwalają one na publikowanie tabel, formularzy i raportów Accessa w witrynach SharePointa. Choć obiekty Accessa publikowane w platformie SharePoint nie dają aż tylu możliwości co same aplikacje Accessa, umożliwiają udostępnianie danych Accessa zdalnym użytkownikom.
Dodatki. Znajdują się w nich przydatne dodatkowe materiały, które pomogą Ci w codziennej pracy z Accessem. W dodatku A znajdziesz dokumentację Accessa 2013. Poznasz tu maksymalną i minimalną wielkość baz danych oraz wiele formantów Accessa. W dodatku B przedstawiliśmy pomysły na poprawę szybkości i wydajności aplikacji Accessa. Z dodatku C dowiesz się, jak uniknąć uszkodzenia danych podczas korzystania z baz Accessa i jak radzić sobie z tym problemem. Dodatek D zawiera szczegółowy opis wielu wbudowanych funkcji Accessa dostępnych analitykom danych.
Jak korzystać z tej książki? Choć każdy rozdział jest integralną częścią całej książki, stanowi też niezależną całość i powiązane są z nim odrębne przykładowe pliki, które można pobrać z poświęconej książce witryny. Książkę tę możesz czytać w dowolnej kolejności, przeskakując między poszczególnymi rozdziałami lub zagadnieniami. Wyjątkowo rozbudowany indeks pozwoli Ci znaleźć miejsca, w których opisane jest interesujące Cię zagadnienie.
Zawartość witryny Zaprezentowane w książce przykłady znajdziesz w poświęconej książce witrynie — http://www.wiley.com/go/access2013bible. Spolszczona wersja przykładów znajduje się w witrynie wydawnictwa Helion (ftp://ftp.helion.pl/przyklady/ac13bi.zip). Dodatkowa pomoc na temat Accessa W trakcie eksperymentowania z nowymi funkcjami i narzędziami poznawanymi w tej książce czasem możesz potrzebować wskazówek. Pierwszym ich źródłem jest system pomocy Accessa. Nie jest on jednak doskonały. Dla początkujących użytkowników może wyglądać jak niewygodny dodatek, który zwraca onieśmielającą listę zagadnień zupełnie niepowiązanych z szukanym tematem. Prawda jest jednak taka, że gdy nauczysz się skutecznie posługiwać systemem pomocy Accessa, będzie to jeden z najszybszych i najłatwiejszych w użyciu sposobów na uzyskanie dodatkowych informacji.
Poniżej znajdziesz kilka porad, które pomogą Ci optymalnie wykorzystać system pomocy Accessa:
Przy szukaniu pomocy lokalizacja ma znaczenie. Być może pamiętasz, że system pomocy w starszych wersjach Accessa był dużo bardziej przyjazny i skuteczny niż w nowych edycjach. To nie złudzenie. Microsoft znacznie zmienił działanie systemu pomocy Accessa.
Wprowadzenie
31
W Accessie 2013 działają dwa systemy pomocy. Jeden dotyczy funkcji Accessa, a drugi zagadnień związanych z programowaniem w języku VBA. Zamiast przeprowadzać globalne wyszukiwanie na podstawie podanych kryteriów Access szuka informacji tylko w systemie powiązanym z bieżącą lokalizacją użytkownika. Dlatego jeśli potrzebujesz pomocy z zakresu programowania w VBA, wpisz zapytanie w edytorze VBA. Jeżeli natomiast chcesz się dowiedzieć więcej na temat budowania kwerend, najlepiej poszukać informacji w projektancie kwerend. Dzięki temu uzyskasz pewność, że wyszukiwanie będzie przeprowadzane w odpowiednim systemie pomocy.
Pomoc z internetu jest lepsza od tej z komputera. Gdy szukasz pomocy na dany temat, Access sprawdza, czy komputer jest podłączony do internetu. Jeśli jest, Access zwraca informacje na podstawie bieżącej zawartości witryny Microsoftu. Jeżeli połączenie jest niedostępne, używane są pliki pomocy przechowywane lokalnie razem z pakietem Microsoft Office. Jednym ze sposobów na uzyskanie optymalnej pomocy jest wykorzystanie jej internetowej wersji. Pomoc z internetu jest zwykle lepsza od tej z komputera, ponieważ zawiera bardziej szczegółowe i zaktualizowane informacje, a także odnośniki do innych, niedostępnych w komputerze zasobów.
Rozwijaj swoją wiedzę na podstawie zasobów internetowych. Zapoznaj się z kilkoma witrynami i forami poświęconymi Accessowi. Znajdziesz tam dodatkową pomoc z zakresu podstaw Accessa, a także wskazówki i sztuczki dotyczące konkretnych sytuacji. Poniższa lista witryn to dobry punkt wyjścia:
http://www.allenbrowne.com,
http://www.microsoft.com/office/community/en-us/default.mspx,
http://www.mvps.org/access,
http://www.utteraccess.com.
Witryny te są bezpłatne, a ponadto wyjątkowo pomocne, gdy potrzebujesz dodatkowych wskazówek.
32
Access 2013 PL. Biblia
Część I
Komponenty Accessa W tej części:
Rozdział 1. Wprowadzenie do projektowania baz danych
Rozdział 2. Wprowadzenie do Accessa
Każda część niniejszej książki bazuje na częściach poprzednich, a rozdziały w każdej części zawierają przykłady wykorzystujące techniki opisane w poprzednich częściach i rozdziałach. Czytelnicy, tworząc swoje aplikacje, mogą korzystać z umiejętności, które zdobyli, czytając poszczególne rozdziały tej książki i wykonując zamieszczone w niej ćwiczenia. Każdy jednak, kto postanawia poznać nową dziedzinę, musi od czegoś zacząć. W części I niniejszej książki zaprezentowaliśmy podstawowe umiejętności, które powinien poznać każdy, kto chce osiągnąć sukces w projektowaniu baz danych w Accessie. Tematy omówione w tej części pozwalają zrozumieć zagadnienia i techniki niezbędne do efektywnego korzystania ze środowiska bazodanowego oraz zdobyć umiejętności potrzebne do normalizowania danych, a także planowania i tworzenia wydajnych tabel. Jeśli znasz już zagadnienia z obszaru projektowania baz danych, możesz pominąć rozdziały z tej części. Jeżeli jednak dopiero poznajesz świat baz danych, poświęć czas na staranne zapoznanie się z przedstawionymi tu ważnymi tematami.
34
Część I Komponenty Accessa
Rozdział 1.
Wprowadzenie do projektowania baz danych W tym rozdziale:
Różnice między bazami danych, tabelami, rekordami, polami i wartościami
Dlaczego w bazie danych wykorzystywanych jest wiele tabel
Omówienie obiektów baz danych
Projektowanie systemu bazy danych
Projektowanie baz danych znacząco się różni od innych dziedzin zastosowań komputerów. W odróżnieniu od takich programów jak Microsoft Word lub Excel, których używanie jest stosunkowo intuicyjne, projektowanie baz danych wymaga odpowiedniej wiedzy. Użytkownik musi poznać szereg podstawowych informacji, w tym terminologię dotyczącą baz danych, główne zagadnienia związane z bazami i najlepsze praktyki z tego obszaru. W tym rozdziale opisaliśmy podstawy projektowania baz danych. Aby rozpocząć od razu pracę z Accessem, przejdź bezpośrednio do rozdziału 2.
Terminologia związana z bazami danych występująca w Accessie W Accessie stosuje się (w większości miejsc, choć nie wszędzie) tradycyjną terminologię baz danych. Pojęcia baza danych, tabela, rekord, pole i wartość uporządkowane są od najszerszego do najbardziej szczegółowego. Takie same pojęcia występują niemal we wszystkich systemach baz danych.
36
część 1 ł Komponenty Accessa
Bazy danych Baza danych jest pojęciem informatycznym oznaczającym zbiór informacji dotyczących określonego tematu czy zastosowania biznesowego. Bazy danych ułatwiają logiczne zorganizowanie powiązanych ze sobą informacji i oferują do nich łatwy dostęp. Uwaga
W niektórych starszych systemach baz danych terminu tego używano do opisania indywidualnych tabel. Obecnie terminem baza danych opisuje się wszystkie elementy systemu.
Bazy danych nie są przeznaczone wyłącznie dla komputerów. Istnieją również tzw. fi zyczne bazy danych, określane także jako ręczne ,..,ystemy kartotekowe. Systemy tego typu składają się zwykle z ludzi, dokumentów papierowych, teczek oraz szafek - kluczowym elementem fizycznej bazy danych jest papier. W istniejących fizycznych bazach danych można zazwyczaj wyróżnić pojemniki wejściowo-wyjściowe oraz określoną formalną metodę ich wypełniania. Informację najczęściej pobiera się w � tępujący sposób: należy papieru. Jako wejście otworzyć szafkę, wyjąć teczkę i odnaleźć w niej odpowiedni wykorzystywane są papierowe formularze wypełniane na pr ł d za pomocą klawiatuty Infotmację można odnaleźć ręcznie, smtując papiety ZQPt �ąc żądane dane z wielu dokumentów papierowych na jeden (lub nawet do rowego arkusza kalkulacyj sposób dane lub wyświetlić je nego w Excelu). Aby przeanalizować otrzym � w określony sposób, można posłużyć się kalkul �m lub arkuszem kalkulacyjnym.
�
��
�� k� "!'�
� �;� �� �
Baza danych Accessa jest niczym inny -, utomatyzowaną wersją funkcji składo wania i odczytywania informacji z pap temu kartotekowego. W bazach danych Accessa informacje są zapisane z w zystaniem dokładnie zdefiniowanej struktury. e w różnorodnej postaci - od zwykłego tekstu W tabelach Accessa dane są za ormatów, takich jak i ustracje,_ d więki czy klipy (np. nazwis_ka i a esy) do zło wtdeo. Zaptsywante dan c w�cyzyJnym, znanym fotmacie umożhwta systemom zaa�e Management System - DBMS) takim jak Access przerządzania danych (ang. tne informacje. kształcanie danych ' rium danych w bazach danych ccess� są tab�le._ D_ostęp do da Podstawowyml... nych można c za pomocą kwerend, formularzy 1 raportow. Dz1ęk1 mm użytkow nicy mogą wprowadzać i odczytywać dane oraz przedstawiać je w użyteczny sposób. Większość projektantów w formularzach i raportach używa makr lub kodu w języku Visual Basic for Applications (VBA). Dzięki temu używanie ich aplikacji staje się łatwiejsze.
�
�
� ���
�
�
�
�
� � �
�
W systemie zarządzania relacyjnymi bazami danych (ang. Relational Database Mana gement System- RDBMS), takim jak Access, dane przechowuje się w wielu powiązanych ze sobą tabelach. Na przykład tabela z danymi o pracownikach (zawierająca nazwiska i adresy) może być powiązana z tabelą danych opisujących listę płac (data wypłaty, kwota i numer czeku). Dzięki kwerendom użytkownicy mogą zadawać złożone pytania o dane umieszczone w powiązanych tabelach (np. "Ile wynosi suma wszystkich wypłat zrealizowanych dla Jana Kowalskiego w roku 20 12?"). Odpowiedzi można wyświetlić w formularzach na ekranie lub wydrukować w postaci raportów.
Rozdział
1.
ł Wprowadzenie do projektowania baz danych
37
Jedną z podstawowych różnic między relacyjną bazą danych a papierowym systemem kartotekowym jest możliwość przechowywania w relacyjnej bazie danych informacji o pojedynczej osobie czy też o pojedynczym towarze w kilku tabelach. N a przykład w systemie bazy danych o pacjentach takie dane, jak nazwisko pacjenta, jego adres czy inne dane kontaktowe, zwykle są gromadzone w innej tabeli niż informacje o leczeniu. Przeważnie w osobnej tabeli są przechowywane informacje o leczeniu wszystkich pacjen tów, a identyfikator pacjenta (standardowo jego numer) służy do wyszukania w niej da nych o leczeniu określonej osoby.
Baza danych w Accessie jest ogólnym "opakowaniem" na wszystkie dane oraz związane
z nimi obiekty. Nie jest to tylko zestaw tabel - baza danych mieści w sobie obiekty wielu typów, takie jak kwerendy, fotmularze, raporty, makra i moduły kodu.
Po otwarciu bazy danych Accessa można zacząć pracę z obiektami tej bazy (tabelami, kwerendami itd.). Można jednocześnie otworzyć wiele kopii Accessa i w razie potrzeby pracować w danym momencie z więcej niż jedną bazą danyc
�
�
Wiele baz danych Accessa zawiera setki, a nawet tysiące !, formularzy, kwerend, obiekty w bazie danych raportów, makr i modułów. Poza kilkoma wyjątk Accessa są zapisane w pojedynczym pliku z rozsz .accdb, .accde, .mdb, .mde lub .adp.
��zy� ��)i.h
'>s.-'{)-
Tabele
� � � �y ć2}�·
Tabela jest po prostu opakowaniem na w naturalnej postaci - odpowiednikiem owych. Każda tabela w bazie danych Accessa teczki w papierowych systemach k zawiera informacje opisujące o podmiot, np. osobę lub produkt, a dane są zor ganizowane w postaci wierszy
�
�DO� � relacyjnych baz
� �
W rozdziałach 3. i 4. � ztwlmy się z bardzo istotnymi regułami rządzącymi projektem an z ze sposobami ich wykorzystania w bazach danych Accessa. Wymienione regu wsKazówki zapewniają działanie aplikacji z najwyższą wydajnością, a jednocześni niają ochronę danych zapisanych w tabelach.
tern jest tabela. W czasie projektowania i tworzenia baz danych Ac W Accessie cessa, a nawet w trakcie korzystania z istniejącej aplikacji trzeba uwzględnić to, w jaki sposób tabele i inne obiekty bazy reprezentują fizyczne jednostki, któtymi baza ma za rządzać, a także jak poszczególne elementy są ze sobą powiązane.
�
Po utworzeniu tabeli można przeglądać zapisane w niej dane w postaci podobnej do ar kusza kalkulacyjnego - w tzw. widoku arkusza danych, który składa się z wierszy i ko lumn (nazywanych odpowiednio rekordami i polami; więcej informacji na ten temat można znaleźć w podrozdziale "Rekordy i pola"). Chociaż widok arkusza danych w ba zie danych wygląda podobnie do arkusza kalkulacyjnego, to jednak te dwa typy obiektów znacząco się od siebie różnią. Widok arkusza danych w Accessie został szczegółowo opisany w rozdziale 5. Dokładnie �DO� � omówiono w nim również różnice między arkuszami kalkulacyjnymi a widokiem arkusza danych. Więcej informacji na temat pól i ich właściwości można znaleźć w rozdziale 3.
38
część 1 ł Komponenty Accessa
Rekordy i pola Arkusz danych jest podzielony na wiersze zwane rekordami i na kolumny zwane polami, gdzie pierwszy wiersz (nagłówki wszystkich kolumn) zawiera nazwy pól w bazie danych. Każdy wiersz reprezentuje pojedynczy rekord zawierający pola charaktetyzujące re kord. W systemach fizycznych wiersze można porównać do pojedynczych fotmularzy (kartek papieru), natomiast pola do pustych pól formularza, których zawartość wypełnia stę samemu. Każde kolumna to pole zawierające wiele właściwości opisujących typ danych, które są w nim zapisane, oraz sposób, w jaki Access obsługuje dane w tym polu. Właściwości te obejmują nazwę pola (Company) i typ danych (Krótk4 tekst). Dla pola można określić także inne właściwości. Na przykład właściwość Rozm4 ar pol a Address definiuje w Ac cessie liczbę znaków, z jakiej może się składać adres.
""' � � �
W kontekście Accessa termin pole oznacza atrybut rekordu: .wielu innych systemach ia pole używa się baz danych, w tym także w systemie SQL Server, zami � n terminologia w pewnym pojęcia kolumna. Pola i kolumny oznaczają to samo Uż sensie zależy od kontekstu systemu bazy danych ra� j tabelę z określonym rekordem. "\...
Uwaga
-
�� �
�� \/S-� �?z� �
wartosci
Na przecięciu wiersza (rekordu) i kolumnv znajduje się wartość- właściwy ele a firmy reprezentuje pojedynczą war ment danych. Na przykład w polu Comp tość danych. Dane w tabelach Acces zorganizowane zgodnie z pewnymi regułami.
�
oa::=>
�
Opis tych reguł znajdziesz w
łach 3. i 4.
�·
Relacyjne ba� anych � �
Access jest s;: em projektowania relacyjnych baz danych. Dane Accessa są zapisane w powiązany sobą tabelach - dane z jednej tabeli (np. infmmacje o klientach) są powiązane z danymi z innej tabeli (np. informacje o zamówieniach). Access obsługuje relacje pomiędzy powiązanymi ze sobą tabelami. Dzięki nim można z łatwością uzyskać informacje o kliencie i wszystkich jego zamówieniach bez utraty jakichkolwiek danych oraz bez konieczności przeglądania rekordów, które nie dotyczą wybranego klienta. Większa liczba tabel upraszcza wprowadzanie danych i ich przeglądanie, ponieważ zmniejsza ilość niepotrzebnie powielanych informacji. Na przykład definiując dwie ta bele dla aplikacji obsługującej klientów, nie trzeba za każdym razem, gdy klient coś kupi, wpisywać od nowa jego nazwiska i adresu. Po utworzeniu tabel trzeba je ze sobą powiązać. Jeżeli na przykład w bazie danych jest tabela klientów i tabela transakcji, należy te tabele powiązać ze sobą na podstawie wspólnego pola. Tu w obu tabelach można umieścić pole z identyfikatorem klienta. Po zwala to pobrać z tabeli transakcji dane dla osoby, której identyfikator pasuje do identy fikatora z tabeli klientów.
Rozdział
1.
ł Wprowadzenie do projektowania baz danych
39
Dlaczego należy tworzyć wiele tabel? Perspektywa tworzenia wielu tabel zawsze przeraża początkujących użytkowników baz danych. Zazwyczaj chcą oni utworzyć tylko jedną dużą tabelę zawierającą wszystkie informacje - w na szym przypadku byłaby to tabela klientów zawierająca także informacje na temat wszystkich do konanych przez nich transakcji oraz inne informacje, w tym również nazwisko czy adres klienta. Zwłaszcza użytkownikom Excela wydaje się sensowne, by zastosować takie samo podejście do tworzenia tabel w Accessie. Zarządzanie pojedynczą tabelą szybko stanie się problematyczne. Przy każdej nowej transakcji dokonywanej przez klienta trzeba wpisywać wszystkie dotyczące go informacje (wielokrotnie powta rzając w każdym wierszu jego nazwisko i adres). To samo dotyczy elementów wchodzących w skład każdej transakcji, gdy w skład jednej transakcji wchodzi więcej elementów niż jeden. System staje się mało wydajny i podatny na pomyłki przy wprowadzaniu danych. Informacje w tabeli są prze chowywane w sposób bardzo nieefektywny, wiele pól bowiem nie ma zastosowania dla wszystkich rekordów i pozostają one puste. Bardzo ważną rzeczą jest utworzenie takich tabel, w których będzie zapisana minimalna ilość in formacji, a które zapewnią łatwe posługiwanie się systemem i umożlb, .jego rozwój. Aby osią gnąć ten cel, należy stworzyć więcej niż jedną tabelę, przy czym każd a l powinna zawierać utworzeniu tych tabel, rekordy z polami opisującymi wyłącznie podmiot tabeli. Nast ni , acji. Chociaż brzmi to h iif można je ze sobą powiązać, co umożliwi pobieranie z nich użyte JS unkowo prosta. bardzo skomplikowanie, praktyczna realizacja tych zagadnień
� � � �
��
'"
��-��
Zaletą tego modelu jest to, że nie trzeba e ych dotyczących klienta (np. na zwiska, ulicy, miasta, województwa, odu wego) za każdym razem, gdy do tabeli transakcji dodawany jest nowy rekord. W st zy podać identyfikator klienta. Gdy zmieni 1kować go tylko w jednym rekordzie tabeli się adres danego klienta, wystarczy klientów.
� �
Rozdzielenie danych w bazie iele tabel ułatwia zarządzanie systemem, ponieważ wszystkie rekordy okreś g� typu znajdą się w jednej tabeli. Poświęcając czas na po prawne dzielenie dany ędzy tabele, oszczędzimy go znacznie więcej przy póź niejszym projektow..i.[l u oraz pracy z systemem. Proces dzielenia danych pomiędzy ta bele nosi nazw
!2..._� � \
�
oa::=>
Więcej in
���zacji. �
ji na temat normalizacji można znaleźć w rozdziale 4.
Obiekty baz danych Accessa Osoby, dla których bazy danych są nowością (a nawet te, które są doświadczonymi użytkownikami baz danych), powinny przed rozpoczęciem korzystania z programu za poznać się z kilkoma pojęciami specyficznymi dla Accessa. Baza danych Accessa za wiera sześć rodzajów obiektów, na które składają się dane oraz narzędzia potrzebne do korzystania z niego: ł ł
Tabele - przechowują rzeczywiste dane. Kwerendy - umożliwiają wyszukiwanie, smiowanie i pobieranie określonych danych.
40
część 1 ł Komponenty Accessa ł
Formularze- umożliwiają wprowadzanie i wyświetlanie danych w zdefiniowanym wcześniej formacie.
ł
Raporty- umożliwiają wyświetlanie i drukowanie sfmmatowanych danych.
ł
Makra- umożliwiają automatyzację pewnych działań bez konieczności
programowania. ł
Moduły- zawierają programy w języku VBA (ang. Visual Basic for Applications).
Arkusze danych Arkusze danych to jeden z wielu sposobów umożliwiających przeglądanie danych w Ac cessie.Chociaż nie są obiektami bazy danych, wyświetlają listę rekordów z tabeli w forma cie podobnym do arkusza kalkulacyjnego Excela (w wierszach i kolumnach). Dane te są pobierane z tabeli w swojej pierwotnej postaci- bez przekształceń i bez filtrowania. Jest to domyślny tryb wyświetlania wszystkich pól dla wszystkich �ordów. Po arkuszu można się pomszać za pomocą klawiszy strzał�"\tawiaturze. W widoku arkusza danych mo�na �ak że wyświetlić powiązane �or� innych tabel . Ponadto _ można modyfikowac wysw1etlone dane.
� Kwerendy '\>s,'(>Kwerendy służą do pobierania informacji �t,;danych, umożliwiając wybranie i zde
=
finiowanie gmpy rekordów spełniając�'JC:dane warunki. Na kwerendach bazuje większość fotmularzy i raport · w. Ie �iem jest łączenie, filtrowanie i sortowanie danych przed wyświetleniem. K ęsto wywołuje się z poziomu makr bądź procedur języka VBA w celu modyfikow ., dawania lub usuwania rekordów w bazie danych.
�
Przykładem wykorzyst�i\ k�erendy jest sytua�ja, gdy ktoś z pracowników . działu sprzedaży wyda polec�1e danych: Pokaż rm posortowanych alfabetyczrue według " nazwiska wszystkic��ientów z Wrocławia, którzy kupili coś w ostatnich sześciu mie siącach" lub wszystkich klientów, którzy w ciągu ostatnich sześciu miesięcy kupili modele�chodu Chevrolet,. posortowanych według nazwiska i daty transakcji".
"=.L�\�
W takim przypadku, zamiast zadać pytanie w języku polskim czy angielskim, wykorzy stuje się metodę QBE (ang.Query by Example - zapytanie przez przykład).Po wpisaniu instrukcji w projektancie kwerend i ich uruchomieniu kwerenda przekształca polecenia na język SQL (ang. Struciured Query Language), a następnie pobiera określone dane.
�
oa::=>
Okno projektanta kwerend i proces tworzenia kwerend opisano w rozdziale 8.
Formularze do wprowadzania danych i ich wyświetlania Formularze do wprowadzania danych pomagają użytkownikom szybko, łatwo i popraw nie wprowadzać infmmacje do bazy danych.Umożliwiają prezentację danych w sposób bardziej strukturalny niż w przypadku użycia arkusza danych.Z poziomu tego struktu ralnego widoku rekordy można przeglądać, dodawać, modyfikować bądź usuwać. Fannu larze są najbardziej popularnym sposobem wprowadzania danych do tabeli bazy.
Rozdział 1. Wprowadzenie do projektowania baz danych
41
Formularze można wykorzystać do ograniczenia dostępu do niektórych pól w tabeli. Do formularzy można też dodać reguły sprawdzania poprawności lub kod w języku VBA, który sprawdza poprawność danych przed zapisaniem ich w tabeli bazy. Większość użytkowników woli wpisywać informacje do formularzy niż do arkuszy danych. Formularze można utworzyć w taki sposób, że będą przypominały dokumenty papierowe. Dzięki temu wprowadzanie danych jest łatwiejsze. Dzięki formularzom wprowadzanie danych jest też proste do zrozumienia — użytkownik po kolei wypełnia wszystkie pola występujące w odpowiedniej tabeli. Formularze i ekrany tylko do wyświetlania służą do przeglądania informacji. Za ich pomocą można wybiórczo wyświetlić niektóre pola z określonej tabeli. Oznacza to, że ograniczają dostęp użytkowników do pewnych danych, udostępniając im jednocześnie pozostałe.
Raporty Raporty prezentują dane w postaci przeznaczonej do drukowania. Access zapewnia bardzo dużą swobodę w zakresie tworzenia raportów. Można na przykład wyświetlić listę wszystkich rekordów z danej tabeli (np. z tabeli klientów) lub listę tylko tych rekordów, które spełniają określone warunki (np. wszystkich klientów z województwa pomorskiego). Taki efekt uzyskuje się poprzez wykorzystanie odpowiedniej kwerendy jako źródła danych raportu. Kwerenda ta wybiera dane wykorzystywane w raporcie. W raportach można łączyć dane pochodzące z wielu tabel i w ten sposób prezentować złożone zależności pomiędzy różnymi zbiorami danych. Przykładem może być drukowanie faktury. Z tabeli klientów pobiera się wtedy nazwisko i adres (ewentualnie wraz z dodatkowymi informacjami), a z tabeli transakcji dane dotyczące konkretnej sprzedaży w celu wyświetlenia poszczególnych pozycji faktury. Raport umożliwia także obliczenie potrzebnych sum i wydrukowanie ich w określonym formacie. Dodatkowo za pomocą Accessa można umieścić rekordy w raporcie z fakturą — drukowanym dokumencie z podsumowaniem informacji na temat faktury. Podczas projektowania tabel bazy danych należy uwzględnić wszystkie informacje, które w przyszłości będzie trzeba drukować. Dzięki temu ma się pewność, że w tabelach znajdują się dane potrzebne do utworzenia różnych raportów.
Obiekty bazy danych Aby utworzyć obiekty bazy danych, takie jak tabele, formularze czy raporty, najpierw należy wykonać szereg zadań projektowych. Im lepszy projekt, tym lepsza aplikacja, która na nim bazuje. Im więcej czasu programista poświęci na etapie projektowania, tym szybciej uda mu się stworzyć cały system. Projekt nie jest złem koniecznym i nie służy także do produkowania tomów dokumentacji. Jedynym celem zaprojektowania obiektu jest stworzenie jednoznacznej charakterystyki, na podstawie której można go później zaimplementować.
42
Część I Komponenty Accessa
Pięcioetapowa metoda projektowania Pięć etapów projektowania wraz z systemem bazy danych opisanych w tym podrozdziale zapewnia doskonałe podstawy do tworzenia aplikacji baz danych — w tym tabel, kwerend, formularzy, raportów, makr i prostych modułów VBA. Ilość czasu, jaką należy poświęcić na każdy etap, w całości zależy od uwarunkowań tworzonej bazy danych. Na przykład czasami użytkownik prezentuje przykład raportu, jaki ma drukować baza danych Accessa, a źródła danych są tak oczywiste, że zaprojektowanie raportu zajmuje kilka minut. Innym razem, kiedy wymagania użytkowników są szczególnie złożone lub procesy biznesowe obsługiwane przez aplikację wymagają gruntownych badań, realizacja pierwszego etapu może zająć wiele dni. Czytając opisy poszczególnych etapów procesu projektowania, zawsze należy analizować projekt pod kątem danych wyjściowych i wejściowych.
Krok 1.: Ogólny projekt systemu — od koncepcji do rzeczywistości Wszyscy twórcy oprogramowania mają wiele podobnych problemów. Pierwszym z nich jest określenie sposobu zaspokojenia oczekiwań użytkowników systemu. Przed przejściem do szczegółów bardzo ważne jest zrozumienie wszystkich ogólnych wymagań użytkownika stawianych systemowi. Użytkownicy mogą zażądać bazy danych, która obsługuje następujące zadania:
Wprowadzanie informacji o klientach (nazwisko, adres, historia finansowa) i zarządzanie tymi informacjami.
Wprowadzanie informacji o dokonanych transakcjach (data sprzedaży, metoda płatności, kwota brutto, identyfikator nabywcy i inne pola) i zarządzanie tymi informacjami.
Wprowadzanie informacji dotyczących poszczególnych pozycji transakcji (szczegóły sprzedawanych produktów) i zarządzanie tymi informacjami.
Przeglądanie informacji pochodzących z wszystkich tabel (transakcji, klientów, poszczególnych pozycji transakcji i informacji o płatnościach).
Zadawanie wszelkiego rodzaju pytań na temat informacji zawartych w bazie danych.
Tworzenie miesięcznego raportu sprzedaży.
Tworzenie historii sprzedaży dla poszczególnych klientów.
Tworzenie etykiet adresowych i raportów korespondencyjnych.
Powyższe osiem zadań opisali przyszli użytkownicy systemu. W trakcie projektowania może się również pojawić potrzeba uwzględnienia innych zadań. Przed przejściem do projektowania należy się dowiedzieć, jak działają istniejące procesy. Oznacza to, że trzeba przeprowadzić analizę wymagań systemu i określić, w jaki sposób można go zautomatyzować.
Rozdział 1. Wprowadzenie do projektowania baz danych
43
Jednym ze sposobów zapoznania się z systemem jest przygotowanie serii pytań. Odpowiedzi na te pytania powinny przybliżyć procesy biznesowe klienta i sposób wykorzystania przez niego danych. Na przykład podejmując próbę zautomatyzowania działalności dowolnej firmy, można posłużyć się następującymi pytaniami:
Jakie raporty i formularze były dotychczas używane?
Jak dotychczas były przechowywane informacje o transakcjach, klientach i inne dane?
W jaki sposób były wystawiane rachunki?
Tego typu pytania sprawią, że klient prawdopodobnie przypomni sobie jeszcze o innych rzeczach związanych z prowadzoną przez niego działalnością, o których powinien wiedzieć projektant systemu. Aby w pełni poczuć sposób działania firmy, należy dokładnie przeanalizować przebieg wykorzystywanych procesów. Najlepiej wybrać się do niej kilka razy i zaobserwować przebieg różnych procedur i metody pracy pracowników. Po zakończeniu przygotowań do następnych etapów nie należy zrywać kontaktu z klientem — należy go na bieżąco informować o wykonanych czynnościach, pytać o kolejne szczegóły, sprawdzać, czy wykonywane działania spełniają jego wymagania.
Krok 2.: Projektowanie raportów Chociaż rozpoczynanie od raportów może się wydawać dziwne, w wielu przypadkach użytkownicy są bardziej zainteresowani wydrukami z bazy danych niż wszelkimi innymi elementami aplikacji. Raporty bardzo często zawierają niemal wszystkie dane zarządzane przez aplikację. Ponieważ raporty zwykle są obszerne, często są najlepszym sposobem zbierania informacji dotyczących wymagań dla bazy danych. Podczas analizy raportów tworzonych w tym kroku nasuwa się pytanie: „Co było pierwsze: jajko czy kura?”. Czy najpierw należy opracować układ raportu, czy też wcześniej należy zdecydować o elementach danych i etykietach tekstowych, które go tworzą? W rzeczywistości te dwa elementy są analizowane w tym samym czasie. Sposób rozmieszczenia pól w raporcie nie jest zbyt ważny. Jednak im więcej czasu poświęcimy teraz, tym łatwiej będzie nam skonstruować raport. Niektórzy są tak dokładni, że posługują się liniami siatki podczas projektowania raportu. Dzięki temu dokładnie znają lokalizację wszystkich danych.
Krok 3.: Projektowanie danych Następnym etapem procesu projektowania jest zgromadzenie informacji na temat wszystkich danych, które są konieczne do utworzenia żądanych raportów. Jedną z najlepszych metod jest wypisanie wszystkich elementów znajdujących się na poszczególnych raportach. W przypadku podjęcia decyzji o takim sposobie należy zwracać uwagę na elementy znajdujące się na więcej niż jednym raporcie. Trzeba pamiętać, aby nadać im te same nazwy, w rzeczywistości bowiem są to te same elementy Rozpoczniemy od danych dotyczących klienta — wypiszemy je w taki sposób, w jaki przedstawiono je w tabeli 1.1.
44
Część I Komponenty Accessa
Tabela 1.1. Dane związane z klientem występujące w raportach Raporty klientów
Raport faktur
Imię i nazwisko klienta
Imię i nazwisko klienta
Ulica
Ulica
Miasto
Miasto
Województwo
Województwo
Kod pocztowy
Kod pocztowy
Numery telefonów
Numery telefonów
Adres e-mail Strona internetowa Rabat Data zostania klientem Data ostatniej transakcji Stawka podatkowa dla transakcji Informacja na temat kredytu (4 pola)
Jak widać z porównania informacji związanych z klientem występujących w poszczególnych raportach, istnieje wiele pól wspólnych. Większość danych dotyczących klienta znajduje się w obydwóch raportach. Tabela 1.1 zawiera tylko niektóre pola występujące w każdym raporcie — te, które odnoszą się do klienta. Ponieważ nazwy pól występujących w odpowiadających sobie wierszach są takie same, łatwo można sprawdzić, czy uwzględniono wszystkie elementy. Chociaż możliwość łatwego zlokalizowania elementów w przypadku tak małej bazy nie ma kluczowego znaczenia, to w przypadku dużych baz, zawierających wiele pól, staje się bardzo ważna. Po wyodrębnieniu informacji dotyczących klienta można przejść do danych związanych z transakcjami. W tym przypadku trzeba przeanalizować jedynie raport faktur i określić elementy dotyczące transakcji. Pola raportu zawierające informacje dotyczące transakcji zamieszczono w tabeli 1.2. Przeglądając informacje związane z transakcjami konieczne do utworzenia raportu, można zauważyć, że pewne elementy (pola) się powtarzają (np. Zakupiony produkt, Liczba sztuk i Cena produktu). Każda faktura może zawierać wiele pozycji, a każda pozycja wymaga informacji tego samego typu — o zamówionej liczbie i cenie za sztukę. Każda faktura może też zawierać więcej niż jedną sztukę danego towaru. Podobnie na każdej fakturze mogą występować informacje dotyczące częściowych płatności. Istnieje prawdopodobieństwo, że będą się one także składały z kilku pozycji — te powtarzające się elementy można połączyć w osobną grupę. Wszystkie informacje dotyczące pojedynczych produktów występujące w grupie informacji związanych z transakcjami wspomnianej w poprzednim punkcie można wyodrębnić i utworzyć dla nich nową grupę. Informacje związane z poszczególnymi elementami transakcji zamieszczono w tabeli 1.2.
Rozdział 1. Wprowadzenie do projektowania baz danych
45
Tabela 1.2. Dane związane z transakcjami występujące w raportach Raport faktur
Pojedyncza pozycja faktury
Numer faktury
Zakupiony produkt
Data sprzedaży
Liczba sztuk
Data wystawienia faktury
Opis zakupionego produktu
Sposób płatności
Cena produktu
Przedstawiciel
Rabat dla produktu
Rabat (ogólny dla transakcji)
Strefa podatkowa Stawka podatkowa Zakupiony produkt (wiele pozycji)
Liczba sztuk (wiele pozycji) Opis zakupionego produktu (wiele pozycji) Cena produktu (wiele pozycji) Rabat dla produktu (wiele pozycji) Typ wpłaty (wiele pozycji) Data wpłaty (wiele pozycji) Kwota wpłaty (wiele pozycji) Numer karty kredytowej (wiele pozycji) Data ważności (wiele pozycji)
Krok 4.: Projektowanie tabel Teraz najtrudniejsza część: trzeba określić pola w tabelach, na podstawie których będą generowane raporty. Po przeanalizowaniu wielu pól i obliczeń potrzebnych do utworzenia żądanych dokumentów można wywnioskować, że poszczególne pola raportów powinny pochodzić z różnych tabel w bazie danych (dużą część wstępnych czynności wykonaliśmy już wcześniej, łącząc pola w logiczne grupy). Na razie uwzględnimy wszystkie wyodrębnione pola. Później (z różnych powodów) być może będzie trzeba dodać inne pola. Będą też takie pola raportu, które nie pojawią się w żadnej tabeli. Należy pamiętać, że uwzględnianie w tabelach bazy danych wszystkich, nawet najmniejszych szczegółów nie jest konieczne. Na przykład może się zdarzyć, że użytkownik zażąda umieszczenia w bazie danych informacji o urlopach i innych dniach wolnych w celu łatwego wyszukiwania informacji o tym, którzy pracownicy są dostępni określonego dnia. Łatwo może jednak dojść do zaciemnienia ogólnego projektu aplikacji z powodu uwzględnienia zbyt wielu wątków podczas wstępnej fazy projektowania. Ponieważ tabele Accessa można z łatwością modyfikować w dowolnym momencie, najlepszą strategią jest odłożenie mniej ważnych elementów na późniejsze etapy projektowania —
46
Część I Komponenty Accessa
do czasu, kiedy wstępny projekt będzie gotowy. Ogólnie rzecz biorąc, uwzględnienie żądań użytkowników po zakończeniu fazy projektowania bazy danych nie jest szczególnie trudne. Po wyodrębnieniu danych ze wszystkich raportów należy je scalić według funkcji, które pełnią (czyli na przykład podzielić na logiczne grupy), a następnie porównać dane w ramach poszczególnych funkcji. W tym celu najpierw należy sięgnąć do informacji związanych z klientami i połączyć wszystkie występujące tam pola w jeden zbiór elementów danych. Następnie to samo należy wykonać dla informacji dotyczących transakcji oraz informacji dotyczących pojedynczej pozycji transakcji. Zestawienie elementów danych pochodzących z tych trzech grup informacji zamieszczono w tabeli 1.3. Tabela 1.3. Porównanie elementów danych Dane klientów
Dane faktur
Dane pojedynczej pozycji faktury
Nazwa firmy klienta
Numer faktury
Zakupiony produkt
Ulica
Data sprzedaży
Liczba sztuk
Miasto
Data wystawienia faktury
Opis zakupionego produktu
Województwo
Sposób płatności
Cena produktu
Kod pocztowy
Rabat (ogólny dla transakcji)
Rabat dla produktu
Numery telefonów (2 pola)
Stawka podatkowa
Opodatkowany?
Adres e-mail
Typ wpłaty (wiele pozycji)
Strona internetowa
Data wpłaty (wiele pozycji)
Rabat Data zostania klientem
Kwota wpłaty (wiele pozycji)
Data ostatniej transakcji
Numer karty kredytowej (wiele pozycji)
Stawka podatkowa dla transakcji
Data ważności (wiele pozycji)
Informacja na temat kredytu (4 pola)
Scalenie i porównanie danych jest dobrym sposobem na rozpoczęcie tworzenia indywidualnych definicji tabel, ale do zrobienia pozostało jeszcze wiele. Kiedy Czytelnik lepiej zapozna się z procesem projektowania danych, dowie się, że informacje w kolumnie dotyczącej klientów należy rozbić na dwie osobne kolumny. Niektóre elementy w niej zawarte są używane wobec każdego klienta tylko raz, dla innych może istnieć więcej wpisów. Przykładem może być kolumna transakcji — informacje o wpłatach mogą składać się z kilku pozycji. Rozbicie tego rodzaju informacji na osobne kolumny jest konieczne, w ten sposób bowiem wszystkie powiązane ze sobą typy elementów znajdą się w osobnych kolumnach — jest to przykład normalizacji będącej częścią procesu projektowania. Na przykład jeden klient może mieć wiele kontaktów z firmą. Jeden klient może również dokonać wielu operacji płatności związanych z jedną transakcją. Wcześniej rozbiliśmy dane na trzy kategorie: klientów, faktury i pojedyncze pozycje faktury.
Rozdział 1. Wprowadzenie do projektowania baz danych
47
Należy także pamiętać o tym, że dla jednego klienta można wystawić wiele faktur, z których każda może zawierać wiele pozycji. Kategoria faktury reprezentuje informacje na temat poszczególnych transakcji, natomiast kategoria pozycji transakcji to dane dotyczące pojedynczej pozycji na fakturze. Należy zwrócić uwagę, że wszystkie te trzy kolumny są ze sobą powiązane — na przykład jednemu klientowi można wystawić wiele faktur, a każda faktura może zawierać wiele pozycji szczegółowych. Relacje między tabelami mogą być różne. Na przykład każdej fakturze sprzedaży odpowiada jeden i tylko jeden klient, natomiast z jednym klientem może być związanych wiele transakcji. Podobna relacja zachodzi między fakturą a zawartymi na niej pozycjami. Zdefiniowanie relacji w bazie danych wymaga istnienia niepowtarzalnego identyfikatora w obu tabelach. Unikatowy identyfikator w każdej tabeli pozwala silnikowi bazy danych prawidłowo łączyć i wyodrębniać powiązane ze sobą dane. W naszym projekcie tylko tabela transakcji zawiera unikatowy identyfikator (numer faktury). Oznacza to, że trzeba do każdej z nich dodać co najmniej jedno pole, które będzie pełniło rolę łącza potrzebnego do zdefiniowania relacji z innymi tabelami. Na przykład można dodać pole identyfikatora klienta do tabeli klientów, następnie dodać to samo pole w tabeli faktur i w ten sposób zdefiniować relację między tabelami za pomocą pola z identyfikatorem klienta. Silnik bazy danych wykorzystuje relację między tabelami klientów i faktur do powiązania informacji między klientami a wystawionymi dla nich fakturami. Relacje między tabelami są realizowane dzięki kluczom. Więcej informacji na temat relacji i procesu normalizacji można znaleźć w rozdziale 4.
Rozumiejąc potrzebę łączenia między sobą grup danych, można dodać do każdej grupy wymagane pola kluczowe. Dwie nowe grupy pól i pola łączące umieszczone w każdej z nich zamieszczono w tabeli 1.4. Pola te, nazywane kluczami głównymi i kluczami obcymi, służą do łączenia tabel ze sobą. Tabela 1.4. Tabele wraz z kluczami Dane klientów
Dane faktur
Dane pozycji faktur
Dane płatności faktur
ID klienta
ID faktury
ID faktury
ID faktury
Nazwa klienta
ID klienta
Numer pozycji
Typ płatności
Ulica
Numer faktury
Zakupiony produkt
Data płatności
Miasto
Data sprzedaży
Liczba sztuk
Kwota wpłaty
Województwo
Data wystawienia faktury
Opis zakupionego produktu
Numer karty kredytowej
Kod pocztowy
Sposób płatności
Cena produktu
Data ważności
Numery telefonów (2 pola)
Przedstawiciel
Rabat dla produktu
Adres e-mail
Stawka podatkowa
Strona WWW Rabat Data zostania klientem Data ostatniej transakcji Stawka podatkowa dla transakcji
48
Część I Komponenty Accessa
Pole, które w unikatowy sposób identyfikuje każdy wiersz w tabeli, to tzw. klucz główny. Odpowiadające mu pole w powiązanej tabeli nazywa się kluczem obcym. W naszym przykładzie pole identyfikatora klienta w tabeli klientów jest kluczem głównym, natomiast pole identyfikator klienta w tabeli faktur to klucz obcy. Załóżmy, że określony rekord z tabeli klientów ma wartość 12 w polu identyfikatora klienta. Wszystkie rekordy w tabeli faktur z wartością 12 w polu identyfikator klienta dotyczą klienta o identyfikatorze 12. Po umieszczeniu pól łączących we wszystkich tabelach można w każdej tabeli znaleźć pole, za pomocą którego można połączyć tabelę z innymi tabelami w bazie danych. Na przykład w tabeli 1.4 pole identyfikator klienta występuje zarówno w tabeli klientów (gdzie jest kluczem głównym), jak i w tabeli faktur (gdzie jest kluczem obcym). Właśnie zidentyfikowaliśmy zasadniczą część trzech podstawowych tabel systemu — przedstawiono go w trzech pierwszych kolumnach w tabeli 1.4. Jest to pierwszy szkic ostatecznego projektu tabel. Utworzyliśmy także dodatkową tabelę przeznaczoną do przechowywania danych o wpłatach za transakcje. Zazwyczaj szczegółów dotyczących wpłat (np. numeru karty kredytowej) nie można znaleźć na fakturze. Poświęcenie czasu na poprawne zaprojektowanie bazy danych i tabel w niej zawartych jest, w opinii wielu osób, najważniejszym etapem konstruowania aplikacji opartej na bazie danych. Efektywne zaprojektowanie bazy danych umożliwia precyzyjne kontrolowanie danych — eliminuje kosztowne pomyłki przy wprowadzaniu danych i ogranicza ich wpisywanie tylko do niezbędnych pól. Chociaż niniejsza książka nie jest poświęcona teorii baz danych i wszystkich niuansów z nią związanych, to niezbędne wydaje się przedstawienie w niej pokrótce sztuki normalizacji bazy danych. Szczegółowe informacje na temat normalizacji można znaleźć w rozdziale 4. Na razie wystarczy, jeśli powiemy, że normalizacja jest procesem przydziału danych do poszczególnych tabel. We wcześniejszej części tego rozdziału wspomniałem o tym, że wiele osób używających Accessa umieszcza niezwiązane ze sobą informacje, na przykład dane dotyczące klientów, faktury i pozycji sprzedaży, w jednej, rozbudowanej tabeli. Rozbudowana tabela zawierająca dane różnego rodzaju szybko staje się trudna do zarządzania i aktualizacji. Ponieważ numer telefonu klienta występuje w każdym wierszu zawierającym dane tego klienta, zmiana numeru telefonu wymaga wprowadzenia modyfikacji w wielu miejscach.
Krok 5.: Projektowanie formularzy Po utworzeniu danych i określeniu relacji między tabelami przyszedł czas na zaprojektowanie formularzy. Formularze składają się z pól, poprzez które można wprowadzać dane lub które je wyświetlają w trybie edycji. Jeżeli to możliwe, formularze wyświetlane na ekranie powinny przypominać formularze funkcjonujące w systemie fizycznym.
Rozdział 1. Wprowadzenie do projektowania baz danych
49
Podczas projektowania formularzy na ekranie należy rozmieścić na nim trzy rodzaje pól:
Etykiety i pola tekstowe do wprowadzania danych (pola w formularzach i raportach Accessa zwykle nazywa się kontrolkami lub formantami).
Formanty specjalne (wielowierszowe pola tekstowe, przyciski opcji, pola list, pola wyboru, wykresy i obrazy).
Obiekty graficzne poprawiające wygląd ekranu (kolory, linie, prostokąty i efekty trójwymiarowe).
Idealna sytuacja występuje w przypadku, gdy formularz jest tworzony na podstawie istniejącego, wydrukowanego dokumentu — formularz Accessa powinien przypominać jego wersję papierową. Jego pola powinny wtedy znaleźć się mniej więcej w tych samych miejscach co na wersji papierowej. Etykiety służą do wyświetlania komunikatów, tytułów i podpisów. Pola tekstowe udostępniają miejsce, w którym można wpisywać (lub w którym są wyświetlane) tekst lub liczby zawarte w bazie danych. Pola wyboru wskazują na jakiś warunek i mogą być zaznaczone lub niezaznaczone. Inne typy formantów dostępnych w Accessie to między innymi pola list, pola kombi, przyciski opcji, przyciski przełączników i grupy opcji. Szczegółowe omówienie tworzenia formularzy znajdziesz w rozdziale 17. i dalszych rozdziałach.
50
Część I Komponenty Accessa
Rozdział 2.
Wprowadzenie do Accessa W tym rozdziale:
Ekran powitalny
Tworzenie bazy danych od podstaw
Otwieranie nowej bazy danych
Zapoznanie z interfejsem
W tym rozdziale poznasz główne komponenty interfejsu użytkownika. Nawet jeśli jesteś doświadczonym użytkownikiem Accessa, możesz się zdziwić, jak bardzo różni się interfejs wersji 2013 od wcześniejszych edycji tego programu.
Ekran powitalny Gdy otworzysz Accessa 2013 w systemie Windows (Start/Programy/Access 2013), zobaczysz domyślny ekran powitalny widoczny na rysunku 2.1. Ekran ten udostępnia kilka sposobów na otwarcie istniejącej bazy danych Accessa lub utworzenie nowej bazy. Jeśli otwierasz bazę danych bezpośrednio za pomocą Eksploratora Windows (klikając bazę dwukrotnie), nie zobaczysz ekranu powitalnego. Zamiast tego przejdziesz bezpośrednio do omówionego w dalszej części rozdziału interfejsu bazy danych.
W lewym górnym rogu ekranu powitalnego znajduje się sekcja Ostatnie. Wymienione w niej pliki to bazy danych otwierane wcześniej w Accessie 2013. Możesz kliknąć dowolny z tych plików, aby go otworzyć. Access w trakcie zapełniania sekcji Ostatnie nie odróżnia istniejących baz danych od usuniętych. Oznacza to, że baza może się pojawić w tej sekcji, nawet jeśli została usunięta. Gdy klikniesz taką bazę, pojawi się komunikat o błędzie z informacją, że Access nie może znaleźć bazy.
52
Część I Komponenty Accessa
Rysunek 2.1. Ekran powitalny Accessa umożliwia rozpoczęcie pracy z tym programem na kilka sposobów
Pod sekcją Ostatnie znajduje się pozycja Otwórz inne pliki. Należy ją kliknąć, aby móc przeglądać i otwierać bazy danych z komputera lub sieci. W górnej części ekranu powitalnego można wyszukiwać szablony baz danych Accessa w internecie. Szablony te to zwykle wyjściowe bazy danych o różnym przeznaczeniu. Microsoft udostępnia je bezpłatnie. W środkowej części ekranu powitalnego widoczne są różne szablony wbudowane. Można je kliknąć, aby je pobrać i zacząć ich używać. Microsoft utworzył internetowe repozytorium szablonów, aby umożliwić użytkownikom pobieranie niepełnych lub kompletnych aplikacji Accessa. Szablonowe bazy danych dotyczą wielu częstych sytuacji biznesowych. Pozwalają na przykład na zarządzanie stanem magazynu lub transakcjami. Warto poświęcić chwilę na zapoznanie się z tymi szablonami, jednak nie omawiamy ich w tej książce. Środkowa część ekranu powitalnego zawiera też dwa polecenia — Niestandardowa aplikacja sieci Web i Pusta baza danych dla komputerów stacjonarnych. Te dwie opcje umożliwiają utworzenie bazy danych od podstaw. Jeśli chcesz zbudować nową bazę Accessa przeznaczoną do użytku na komputerach PC (Twoich lub należących do
Rozdział 2. Wprowadzenie do Accessa
53
klientów), wybierz opcję Pusta baza danych dla komputerów stacjonarnych. Jeżeli zamierzasz opublikować aplikację Accessa za pomocą SharePointa, wybierz opcję Niestandardowa aplikacja sieci Web. Omówienie tworzenia niestandardowych aplikacji sieciowych znajdziesz w części VIII tej książki.
Tworzenie pustej bazy danych dla komputerów stacjonarnych Aby utworzyć nową pustą bazę danych, należy kliknąć opcję Pusta baza danych dla komputerów stacjonarnych na ekranie powitalnym (zobacz rysunek 2.1). Pojawi się wtedy okno dialogowe widoczne na rysunku 2.2. Można w nim określić nazwę i lokalizację bazy. Rysunek 2.2. Wprowadź nazwę nowej bazy w polu Nazwa pliku
Domyślną lokalizacją nowych baz danych jest katalog Dokumenty. Jeśli chcesz zapisywać bazy w innym miejscu, kliknij przycisk przeglądania (przypomina wyglądem katalog z Eksploratora Windows) na prawo od pola Nazwa pliku, aby przejść do odpowiedniej lokalizacji.
Po utworzeniu nowej bazy danych Access automatycznie ją otworzy. Na rysunku 2.3 zwróć uwagę na to, że Access otwiera nową bazę danych z pustą tabelą, dla której można określić nazwy pól i inne aspekty projektu.
Rysunek 2.3. Nowa baza danych po utworzeniu
54
Część I Komponenty Accessa
Formaty plików Accessa Od Accessa 2007 domyślnym formatem plików baz danych Accessa jest .accdb, który zastąpił format .mdb. Warto poświęcić czas na zrozumienie, dlaczego wprowadzono tę zmianę i jak wpływa ona na korzystanie ze starszych plików baz danych w Accessie 2013. W Accessie od początku używano aparatu bazy danych Jet (ang. Joint Engine Technology). W wersji 2007 zespół pracujący nad Accessem chciał dodać kilka nowych mechanizmów, np. pola zawierające różne wartości i pola załączników. Ponieważ nowe funkcje były zaawansowane, nie udało się dodać do aparatu Jet kodu potrzebnego do ich obsługi. Dlatego Microsoft opracował zupełnie nowy aparat bazy danych, a mianowicie ACE (ang. Access Connectivity Engine). Access 2013 obsługuje kilka formatów plików włącznie z następującymi:
.accdb z Accessa 2007 – 2013,
.mdb z Accessa 2002 – 2003,
.mdb z Accessa 2000,
.mdb z Accessa 97.
We wcześniejszych wersjach Accessa (starszych niż 2007) nie można otwierać ani dołączać plików w nowym formacie .accdb. Ponadto format .accdb nie obsługuje replikacji ani zabezpieczeń na poziomie użytkownika. Jeśli musisz używać bazy danych z Accessa 2013 we wcześniejszych wersjach tej aplikacji lub potrzebujesz replikacji albo zabezpieczeń na poziomie użytkownika, zastosuj format .mdb. Format .accdb można wykorzystać w środowisku programu Access jedynie wtedy, gdy wszyscy użytkownicy wykorzystują program Access 2007 lub jego nowszą wersję. Jednak w mieszanym środowisku użytkowników programów Access w wersjach starszych i nowszych niż 2007, w celu zachowania zgodności, należy pozostać przy formacie pliku Access 2002 – 2003. Ta sama zasada dotyczy zgodności z Accessem 2000 — w środowisku użytkowników z wersją 2000 należy pozostać przy formacie bazy danych Accessa 2000. W wersji 2013 można otwierać pliki .mdb z programów Access 2002 – 2003 i 2000 oraz wprowadzać w nich potrzebne zmiany, przy czym dostępne są tylko funkcje z owych wersji. Niektóre nowe mechanizmy Accessa są niedostępne (dotyczy to przede wszystkim funkcji z aparatu ACE). Pliki .mdb z Accessa 97 można otworzyć, a nawet uruchomić, jednak nie można modyfikować ich projektu. Aby przekształcić bazę danych zapisaną w starszym formacie, należy otworzyć ją w Accessie 2013, wybrać opcję Plik/Zapisz jako, a następnie w oknie dialogowym Zapisz jako wskazać odpowiedni format plików Accessa.
Interfejs Accessa 2013 Po utworzeniu lub otwarciu nowej bazy danych ekran Accessa wygląda podobnie jak na rysunku 2.4. W górnej części ekranu znajduje się wstążka, dodana w Accessie 2007. Po lewej stronie widoczne jest okienko nawigacji. Te dwa elementy stanowią podstawę interfejsu Accessa. Oprócz nich dostępny jest pasek szybkiego dostępu, na którym można umieścić najczęściej używane polecenia.
Rozdział 2. Wprowadzenie do Accessa
55
Rysunek 2.4. Podstawą interfejsu Accessa jest wstążka (w górnej części okna) i okienko nawigacji (po lewej stronie)
Okienko nawigacji Okienko nawigacji wyświetlające się z lewej strony ekranu jest podstawowym narzędziem do poruszania się podczas pracy z Accessem. W okienku nawigacji wyświetlają się kwerendy, formularze, raporty i obiekty Accessa innych typów. Mogą się w nim wyświetlać także kombinacje różnych typów obiektów. Aby wyświetlić dostępne opcje, kliknij listę rozwijaną na pasku tytułu okienka nawigacji (zobacz rysunek 2.5). Rysunek 2.5. Wybór alternatywnego sposobu wyświetlania okienka nawigacji
Opcje nawigacji są podzielone na dwie sekcje — Przejdź do kategorii i Filtruj według grup. Najpierw należy wybrać opcję z listy Przejdź do kategorii, a następnie opcję w sekcji Filtruj według grup. Opcje dostępne w sekcji Filtruj według grup zależą od opcji wybranej na liście Przejdź do kategorii. Dalej znajdziesz opis każdej opcji z sekcji Przejdź do kategorii i powiązanych opcji z sekcji Filtruj według grup.
56
Część I Komponenty Accessa
Dostępne są następujące opcje nawigacji: Niestandardowe Jej wybór powoduje utworzenie nowej zakładki w okienku nawigacji. Zakładka ta domyślnie nosi nazwę Grupa niestandardowa 1 i zawiera obiekty, które użytkownik przeciągnie do obszaru zakładki. Elementy dodane do niestandardowej grupy w dalszym ciągu wyświetlają się w widoku odpowiednim dla ich typu obiektu zgodnie z opisem zamieszczonym poniżej. Po wybraniu opcji Niestandardowe sekcja Filtruj według grupy jest zapełniana wszystkimi utworzonymi wcześniej niestandardowymi grupami. Pozwala to przefiltrować obiekty na podstawie dodanych niestandardowych grup. Niestandardowe grupy to doskonały sposób grupowania obiektów niejednorodnego typu (np. tabel, kwerend i formularzy) powiązanych ze sobą funkcjonalnie. Można na przykład stworzyć niestandardową grupę Klienci i dodać do niej wszystkie obiekty bazy danych powiązane z działaniami klientów. Elementy dodane do niestandardowej grupy mogą się wyświetlać także w innych grupach.
Typ obiektu Opcja ta jest najbardziej podobna do opcji z poprzednich wersji Accessa. Po jej wybraniu w sekcji Filtruj według grupy pojawiają się następujące opcje:
Tabele,
Kwerendy,
Formularze,
Raporty,
Wszystkie obiekty programu Access.
Domyślnie w okienku nawigacji widoczne są wszystkie obiekty z bieżącej bazy danych. Wybierz opcję Wszystkie obiekty programu Access, jeśli wcześniej ustawiłeś jeden z filtrów, a teraz chcesz zobaczyć wszystkie obiekty z bazy. Tabele i powiązane widoki Opcja ta wymaga pewnego komentarza. W Accessie poczyniono starania, aby projektant był informowany o ukrytych połączeniach między obiektami w bazie danych. Na przykład określona tabela może być wykorzystywana w wielu kwerendach, formularzach lub raportach. W poprzednich wersjach Accessa związki te były bardzo trudne do określenia i nie było skutecznego narzędzia wbudowanego w Accessie, które pomagałoby w zrozumieniu tych relacji. Opcja Tabele i powiązane widoki pozwala zrozumieć, które obiekty są powiązane z poszczególnymi tabelami. Po wybraniu opcji Tabele i powiązane widoki sekcja Filtruj według grupy jest zapełniana obiektami bazy danych. Gdy klikniesz jeden z tych obiektów, na liście pozostanie on sam oraz obiekty zależne od niego i nadrzędne.
Rozdział 2. Wprowadzenie do Accessa
57
Data utworzenia Ta opcja grupuje obiekty bazy danych według daty utworzenia. Ustawienie to przydaje się w przypadku, gdy chcemy się dowiedzieć, kiedy obiekt utworzono. Po wybraniu opcji Data utworzenia w sekcji Filtruj według grupy pojawiają się następujące opcje:
Dzisiaj,
Wczoraj,
W ostatnim tygodniu,
Dwa tygodnie temu,
Starsze.
Data modyfikacji Ta opcja grupuje obiekty bazy danych według daty modyfikacji. Ustawienie to przydaje się w przypadku, gdy chcemy się dowiedzieć, kiedy obiekt po raz ostatni zmodyfikowano. Po wybraniu opcji Data modyfikacji w sekcji Filtruj według grupy pojawiają się następujące opcje:
Dzisiaj,
Wczoraj,
W ostatnim tygodniu,
Dwa tygodnie temu,
Starsze.
Okna z zakładkami Osoby projektujące aplikacje we wcześniejszych wersjach Accessa bardzo często narzekały, że w przypadku otwarcia w środowisku Accessa wielu obiektów obiekty te nachodziły na siebie i przykrywały się wzajemnie, co utrudniało poruszanie się pomiędzy nimi. Microsoft wprowadził do interfejsu użytkownika Accessa zakładki, które zapobiegają przykrywaniu obiektu przez inne obiekty wyświetlające się w tym samym czasie. Na poniższym rysunku otwartych jest wiele obiektów (jedna kwerenda i cztery tabele). Można się między nimi bardzo łatwo przełączać — wystarczy kliknąć zakładkę powiązaną z danym obiektem, a pojawi się on na wierzchu.
58
Część I Komponenty Accessa Nie odpowiadają Ci nowe okna z zakładkami? Możesz przywrócić dawne, nakładające się okna za pomocą opcji Plik/Opcje. W oknie dialogowym Opcje programu Access otwórz zakładkę Bieżąca baza danych, a następnie zmień wartość ustawienia Opcje okna dokumentu z Dokumenty kartotekowe na Nakładające się okna. Aby zmiany zostały wprowadzone, trzeba zamknąć bazę i ponownie ją otworzyć.
Wstążka Wstążka zajmuje górną część głównego ekranu i od Accessa 2007 zastępuje menu i paski narzędzi znane z poprzednich wersji tego programu. Wstążka zawiera pięć zakładek, z których każda obejmuje zestaw kontrolek i poleceń (zobacz rysunek 2.5). Oto te zakładki:
PLIK — Microsoft, w mylący sposób, nazywa zakładkę Plik przyciskiem. Niezależnie od nazwy kliknięcie zakładki Plik powoduje otwarcie widoku Backstage. Znajduje się w nim wiele opcji związanych z tworzeniem, otwieraniem, zapisywaniem i konfigurowaniem baz danych. Dokładny opis widoku Backstage znajdziesz w ramce.
NARZĘDZIA GŁÓWNE — tu umieszczono często używane elementy. Znajdziesz tu zwykle niepowiązane ze sobą polecenia, z których użytkownicy wielokrotnie korzystają w trakcie pracy z Accessem. Są to między innymi polecenia dotyczące formatowania, kopiowania, wklejania, sortowania i filtrowania.
TWORZENIE — tu znajdują się polecenia do tworzenia różnych obiektów Accessa. To z tej zakładki będziesz korzystać najczęściej. Można w niej rozpocząć tworzenie tabel, kwerend, formularzy, raportów i makr. W trakcie lektury tej książki nieustannie będziesz posługiwać się tą zakładką.
DANE ZEWNĘTRZNE — służy do integrowania Accessa z innymi źródłami danych. Dostępne są tu polecenia, które umożliwiają importowanie i eksportowanie danych, nawiązywanie połączeń z zewnętrznymi bazami danych, a także pracę z SharePointem i innymi systemami.
NARZĘDZIA BAZY DANYCH — zawiera polecenia dotyczące działania bazy danych. Znajdziesz tu narzędzia do tworzenia relacji między tabelami, analizowania wydajności bazy danych, pisania dokumentacji dla bazy, a także jej kompaktowania i naprawiania.
Oprócz pięciu standardowych zakładek wstążki istnieją też zakładki kontekstowe. Są to zakładki specjalnego typu, pojawiające się tylko po zaznaczeniu określonych obiektów. Na przykład w trakcie pracy z projektantem kwerend pojawia się widoczna na rysunku 2.6 zakładka NARZĘDZIA KWEREND PROJEKTOWANIE.
Pasek narzędzi Szybki dostęp Pasek narzędzi Szybki dostęp (zobacz rysunek 2.7) to modyfikowalny pasek, na którym można umieścić polecenia najbardziej przydatne w codziennej pracy. Domyślnie znajdują się na nim trzy polecenia: Zapisz, Cofnij i Ponów.
Rozdział 2. Wprowadzenie do Accessa
59
Rysunek 2.6. Zakładki kontekstowe zawierają polecenia związane z aktywnym obiektem Rysunek 2.7. Pasek narzędzi Szybki dostęp znajduje się nad wstążką
Widok Office Backstage Widok Office Backstage (zobacz poniższy rysunek) jest bramą do wielu opcji umożliwiających tworzenie, otwieranie bądź konfigurowanie baz danych Accessa. Aby otworzyć widok Backstage, należy kliknąć zakładkę Plik na wstążce (zobacz wcześniejszy punkt).
Widok Backstage jest wspólny dla wszystkich aplikacji pakietu Office 2013, a jego funkcje są podobne w Accessie, Wordzie, Excelu i Outlooku. Daje on dostęp do działań, które są niezbyt często wykorzystywane podczas pracy w głównym oknie Accessa. Są jednak konieczne do zapisywania, drukowania bądź utrzymywania baz danych Accessa. Dzięki umieszczeniu tych opcji w obszarze Backstage wyeliminowano konieczność występowania podobnych funkcji na wstążce Accessa. Omówienie poleceń z widoku Backstage znajdziesz w dalszych rozdziałach.
60
Część I Komponenty Accessa
Gdy klikniesz strzałkę przy pasku narzędzi Szybki dostęp, zobaczysz, że możesz dodać znacznie więcej poleceń (zobacz rysunek 2.8). Zaznacz wybrane opcje, aby dodać je do omawianego paska. Rysunek 2.8. Polecenia, które można dodać do paska narzędzi Szybki dostęp
Użytkownik nie jest ograniczony do stosowania poleceń z listy rozwijanej. Do paska narzędzi Szybki dostęp można dodać dowolne polecenia. Aby to zrobić, wykonaj następujące operacje: 1. Kliknij strzałkę obok paska narzędzi Szybki dostęp i wybierz opcję Więcej poleceń. Pojawi się okno dialogowe Opcje programu Access z otwartą zakładką Pasek narzędzi Szybki dostęp (zobacz rysunek 2.9). 2. Na widocznej po lewej stronie liście rozwijanej Wybierz polecenia z zaznacz opcję Wszystkie polecenia. 3. Na alfabetycznie uporządkowanej liście poleceń zaznacz te, które chcesz dodać, i kliknij przycisk Dodaj. 4. Następnie kliknij przycisk OK. Aby zmienić kolejność ikon na pasku narzędzi Szybki dostęp, otwórz zakładkę Pasek narzędzi Szybki dostęp w oknie dialogowym Opcje programu Access (zobacz rysunek 2.9). Na liście widocznej po prawej stronie znajdują się wszystkie polecenia umieszczone obecnie na pasku narzędzi Szybki dostęp. Można kliknąć dowolne polecenie i za pomocą przycisków ze strzałkami skierowanymi w górę i w dół zmienić jego pozycję na liście. Spowoduje to zmianę kolejności poleceń.
Rozdział 2. Wprowadzenie do Accessa
Rysunek 2.9. Dodawanie poleceń do paska narzędzi Szybki dostęp
61
62
Część I Komponenty Accessa
Część II
Tabele Accessa W tej części:
Rozdział 3. Tworzenie tabel
Rozdział 4. Relacje między tabelami
Rozdział 5. Praca z tabelami
Rozdział 6. Importowanie i eksportowanie danych
Rozdział 7. Dołączanie danych zewnętrznych
W tej części znajdziesz omówienie zagadnień związanych z tworzeniem tabel Accessa i zarządzaniem nimi. Tabele są podstawą każdej aplikacji rozwijanej w Accessie. W rozdziałach z tej części znacznie wykraczamy poza opis tworzenia tabel. Poznasz tu najważniejsze zagadnienia pozwalające wykorzystać mechanizmy omówione w pozostałych częściach książki. Rozdział 3. dotyczy podstaw. Dowiesz się z niego, czym są tabele i z jakich elementów się składają. W rozdziale 4. poznasz znaczenie relacji i nauczysz się skutecznie tworzyć relacje między tabelami bazy oraz zarządzać nimi. W rozdziale 5. omówiliśmy techniki sortowania, filtrowania i używania tabel z surowymi danymi oraz arkuszy danych. W rozdziałach 6. i 7. wyjaśniliśmy, jak wyjść poza bazę danych, aby tworzyć tabele na podstawie importowanych lub dołączanych zewnętrznych źródeł danych.
64
Część II Tabele Accessa
Rozdział 3.
Tworzenie tabel W tym rozdziale:
Tworzenie nowej tabeli
Modyfikowanie projektu tabeli
Definiowanie właściwości pól
Określanie klucza głównego
Tworzenie indeksów
Tworzenie dokumentacji projektu tabeli
Zapisywanie nowej tabeli
Korzystanie z tabel
Wprowadzanie danych do tabeli
Posługiwanie się polami typu Załącznik
W tym rozdziale nauczysz się, jak rozpocząć proces tworzenia bazy danych i jej tabel. Utworzysz przestrzeń bazy, w której przechowywane będą tabele, formularze, kwerendy, raporty i kod, konstruowane w miarę poznawania Accessa. Na końcu utworzymy rzeczywiste tabele używane w przykładowej bazie danych MiniAuta dla Kolekcjonerów. W tym rozdziale wykorzystano bazę danych Rozdział03.accdb. Czytelników, którzy jeszcze nie skopiowali tej bazy danych na swój dysk twardy, zachęcamy, by zrobili to teraz.
Rodzaje tabel Dla Accessa tabela zawsze jest tabelą. Jednak w aplikacjach Accessa różne tabele mają odmienne przeznaczenie. Są trzy rodzaje tabel baz danych: obiektowe, transakcyjne i łączące. Rodzaj tworzonej tabeli pozwala określić, w jaki sposób należy ją zbudować.
66
Część II Tabele Accessa
Tabele obiektów Tabele obiektów występują najczęściej. Każdy rekord w takich tabelach przechowuje informacje dotyczące obiektu z realnego świata. Klient jest tego rodzaju obiektem, a rekord w tabeli klientów przechowuje dane na temat określonej osoby. Pola w tabeli obiektów odpowiadają cechom reprezentowanego obiektu. Pole z nazwą miasta Kraków odpowiada miastu, w którym klient mieszka. W trakcie tworzenia tabeli obiektów pomyśl o cechach, które sprawiają, że dany obiekt jest wyjątkowy, i o ważnych aspektach obiektu.
Tabele transakcyjne Drugim popularnym typem tabel są tabele transakcyjne. Każdy rekord w takiej tabeli przechowuje informacje na temat pewnego zdarzenia. Zamówienie książki to przykładowe zdarzenie. Na potrzeby przechowywania informacji o wszystkich zamówieniach można utworzyć tabelę zamówień książek. W tabelach transakcyjnych prawie zawsze znajduje się pole z datą i godziną, ponieważ moment zajścia zdarzenia zwykle jest ważną informacją. Ponadto często tworzone jest pole prowadzące do tabeli obiektów, np. pole z numerem zapisanej w tabeli klientów osoby, która złożyła zamówienie. W czasie tworzenia tabeli transakcyjnej należy pomyśleć o danych i osobach związanych z określonym zdarzeniem.
Tabele łączące Tabele łączące tworzy się najłatwiej i są one bardzo ważne w dobrze zaprojektowanej bazie danych. Łączenie dwóch tabel to zwykle prosty proces. Gdy klient zamawia książkę, można łatwo powiązać zamówienie z danym klientem. Czasem jednak relacje nie są równie oczywiste. Książka może mieć wielu autorów, a jedna osoba może być autorem wielu książek. Występuje wtedy relacja typu wiele do wielu, a tabela łącząca znajduje się pomiędzy dwoma głównymi tabelami. Nazwy tabel łączących zwykle odzwierciedlają ich przeznaczenie — np. tblAutorKsiążka. W tabelach tego rodzaju znajdują się zwykle tylko trzy pola: pole z niepowtarzalnym identyfikatorem rekordu, pole z referencją do jednej strony relacji i pole z referencją do drugiej strony relacji.
Tworzenie nowej tabeli Tworzenie tabel baz danych jest w równym stopniu sztuką co nauką. Podstawą powodzenia każdego nowego projektu bazy danych jest dobra znajomość wymagań użytkowników. Opis stosowania reguł projektowania baz danych w przypadku tworzenia tabel Accessa znajdziesz w rozdziale 4.
W tym rozdziale zaprezentujemy czynności, jakie należy wykonać w celu utworzenia prostych tabel Accessa. W kolejnych podrozdziałach przestudiujemy proces dodawania tabel do baz danych Accessa włącznie ze stosunkowo złożonym zagadnieniem wyboru właściwego typu danych dla każdego z pól w tabeli.
Rozdział 3. Tworzenie tabel
67
Ważność konwencji nazewnictwa Większość projektantów korzystających z Accessa stosuje określoną konwencję nazewnictwa obiektów bazy danych. Zazwyczaj konwencje nazewnictwa są stosunkowo proste — polegają na przykład na poprzedzeniu nazw obiektów prefiksami wskazującymi na typ obiektu. Na przykład formularzowi danych pracownika można nadać nazwę frmPracownicy. W miarę powiększania się rozmiarów i podwyższania się stopnia złożoności bazy danych wzrasta konieczność ustalenia konwencji nazewnictwa dla obiektów w bazie danych. Nawet jeśli włączy się Opcje autokorekty nazw (Plik/Opcje/Bieżąca baza danych/Opcje autokorekty nazw), Access skoryguje tylko najbardziej oczywiste sytuacje modyfikacji nazw. Zmiana nazwy tabeli powoduje zaprzestanie działania praktycznie każdej kwerendy, formularza czy raportu, które z niej korzystają. Najlepszą linią obrony jest stosowanie sensownych nazw obiektów i przyjęcie właściwej konwencji nazewnictwa na wczesnym etapie projektowania baz danych Accessa i przestrzeganie jej w całym projekcie. W Accessie obowiązuje bardzo niewiele ograniczeń dotyczących nazw przypisywanych obiektom baz danych. W związku z tym istnieje możliwość istnienia dwóch zupełnie różnych obiektów (np. formularza i raportu lub tabeli i makra) o tych samych nazwach (nie można jednak zastosować tej samej nazwy dla tabeli i kwerendy, ponieważ tabele i kwerendy zajmują tę samą przestrzeń nazw w bazie danych). Chociaż proste nazwy, takie jak Klienci i Zamówienia, są jak najbardziej właściwe, w miarę rozrastania się bazy danych łatwo się pogubić i stracić orientację, do którego obiektu odnosi się określona nazwa. Na przykład w dalszej części tej książki zapoznamy się z wykonywaniem operacji na obiektach bazy danych za pomocą kodu i makr. Podczas pracy z wbudowanym w Accessie językiem programowania Visual Basic for Applications (VBA) nie może być niejednoznaczności co do nazw używanych obiektów. Jeśli zarówno formularz, jak i raport mają nazwę Klienci, może to być mylące dla programisty oraz tworzonego przez niego kodu. Najprostszą konwencją nazewnictwa jest poprzedzenie nazw obiektów ciągiem trzech lub czterech znaków określających typ obiektu, którego ta nazwa dotyczy. Zgodnie z tą konwencją nazwy tabel poprzedza się prefiksem tbl, natomiast kwerend — qry. Prefiksy dla formularzy, raportów, makr i modułów to odpowiednio frm, rpt, mcr i bas lub mod. W tej książce w większości złożonych nazw występują zarówno wielkie, jak i małe litery: tblZamówienia Książek, tblKlienci itd. Dla większości osób nazwy zawierające zarówno małe, jak i wielkie litery są łatwiejsze do czytania i zapamiętania niż nazwy składające się wyłącznie z wielkich bądź wyłącznie z małych liter (np. TBLZAMÓWIENIAKSIĄŻEK lub tblzamówieniaksiążekszczegóły). Czasami będziemy stosowali nieformalne odwołania do obiektów bazy danych. Na przykład formalna nazwa tabeli zawierającej informacje o klientach w poprzednich przykładach to tblKlienci. Nieformalne odwołanie do tej tabeli może mieć postać „tabela klientów”. W większości przypadków użytkownicy baz danych nigdy nie stykają się z formalnymi nazwami obiektów bazy danych. Jednym z najtrudniejszych zadań projektanta aplikacji jest stworzenie interfejsu użytkownika, który ukrywa wszystkie elementy związane z zarządzaniem i przechowywaniem danych wyświetlanych w tym interfejsie. Bez trudu można modyfikować tekst wyświetlający się w paskach tytułów oraz w formularzach, raportach i innych komponentach interfejsu użytkownika w taki sposób, aby ukryć nazwy struktur danych i składników interfejsu. W Accessie nazwy tabel mogą mieć do 64 znaków. Należy to wykorzystać i nadawać długie, opisowe nazwy tabelom, kwerendom, formularzom i raportom. Nie ma powodu, aby skracać nazwę tabeli do postaci KsZam, skoro Access równie łatwo obsługuje znacznie bardziej zrozumiałą nazwę tblZamówieniaKsiążek. Oczywiście z opisowymi nazwami nie należy przesadzać. Nie ma sensu nazywać formularza frmAktualizacjaInformacjiOKlientach, skoro wystarczy zastosować nazwę frmAktualizujInfo.
68
Część II Tabele Accessa
W dłuższych nazwach o wiele łatwiej popełnić pomyłkę w pisowni, zatem należy zachować rozsądek. Chociaż Access zezwala na używanie spacji w nazwach obiektów bazy danych, należy unikać ich stosowania. Spacje nie poprawiają czytelności nazw, a mogą spowodować poważne problemy, zwłaszcza w środowiskach klient-serwer lub w przypadku wykorzystania automatyzacji OLE z innymi aplikacjami. Nawet jeśli nie przewidujemy instalacji aplikacji Accessa w środowisku klientserwer i nie mamy zamiaru wykorzystywać automatyzacji OLE lub DDE, warto wyrobić sobie nawyk niestosowania spacji w nazwach obiektów bazy danych. W nazwach tabel można też stosować znaki specjalne, np. podkreślenia. Niektórzy programiści stosują ogólną konwencję nazewnictwa, w ramach której używają podkreślenia do rozdzielania słów w nazwach tabel. Jeśli jednak nie posługujesz się określoną konwencją, która obejmuje znaki specjalne, powinieneś ich unikać.
Przed przystąpieniem do tworzenia tabel w bazie danych za pomocą narzędzi Accessa warto wcześniej zaprojektować tabele na papierze. Wiele tabel, zwłaszcza tych nieskomplikowanych, nie wymaga wielkiego planowania przed wprowadzeniem ich do bazy danych. W szczególności nie trzeba zbyt wiele planować, jeśli chce się zaprojektować tabelę zawierającą informacje przeglądowe, takie jak nazwy miast i województw. Prawidłowe zaprojektowanie tabel z informacjami o bardziej złożonych podmiotach, np. klientach lub produktach, wymaga jednak znacznego wysiłku i przemyśleń. Chociaż tabelę można utworzyć z marszu bez żadnego planowania, to jednak precyzyjne zaprojektowanie systemu bazy danych jest jak najbardziej wskazane. Wprawdzie wszelkie zmiany można wprowadzać później, ale jest to marnowanie czasu — powstaje wtedy system trudny do konserwacji i zarządzania, w przeciwieństwie do takiego, który od początku był poprawnie zaplanowany. W następnych podrozdziałach opiszemy czynności wykonywane z nową pustą tabelą dodaną do bazy danych Rozdział03.accdb. Z procesem dodawania nowych tabel do bazy danych Accessa należy dokładnie się zapoznać. Ponieważ czynności potrzebne do dodawania tabel bardzo się zmieniły w porównaniu z wcześniejszymi wersjami Accessa, nawet doświadczeni projektanci powinni przestudiować poniższe punkty.
Projektowanie tabel Projektowanie tabeli to proces, który dzieli się na kilka etapów. Wykonując je kolejno, można utworzyć czytelną strukturę tabeli przy minimalnym wysiłku: 1. Utworzenie nowej tabeli. 2. Wpisanie nazwy, typu danych, właściwości oraz (opcjonalnie) opisu dla każdego pola. 3. Ustalenie klucza głównego tabeli. 4. Utworzenie indeksów dla wybranych pól. 5. Zapisanie struktury tabeli. Ogólnie rzecz biorąc, projektowanie niektórych tabel nigdy się nie kończy. Jeśli zmienią się potrzeby użytkowników bądź reguły biznesowe rządzące aplikacją, czasami trzeba otworzyć tabelę w widoku projektu. W tej książce, podobnie jak w większości książek
Rozdział 3. Tworzenie tabel
69
na temat Accessa, opisano proces tworzenia tabel w taki sposób, jakby każda tabela była tworzona zupełnie od początku. W rzeczywistości jednak większość pracy w aplikacjach Accessa wykonuje się na istniejących obiektach bazy danych. Niektóre z tych obiektów zdefiniowaliśmy sami, inne dodali inni programiści pracujący nad aplikacją w przeszłości. Jednak proces konserwacji istniejącego komponentu bazy danych przebiega dokładnie tak samo jak tworzenie tego samego obiektu od podstaw. Oto krótka uwaga na temat modyfikowania tabel po ich utworzeniu. Dodanie nowego pola do tabeli niemal nigdy nie stwarza problemów. Istniejące wcześniej kwerendy, formularze i raporty, a nawet kod VBA będą korzystały z tabeli tak, jak dotychczas. Obiekty te nie będą się przecież odwoływały do nowego pola, ponieważ pole to dodano już po ich utworzeniu. Nowe pole nie jest automatycznie dodawane do istniejących obiektów, natomiast można dodać nowe pole i wykorzystywać je tam, gdzie trzeba w aplikacji, i wszystko będzie działało zgodnie z oczekiwaniami. Problemy powstają w przypadku usunięcia bądź zmiany nazwy pola w tabeli. Nawet przy włączonej opcji autokorekty nazw Access nie uaktualni odwołań do nazw pola w kodzie VBA, właściwościach formantów i wyrażeniach używanych w bazie danych. Modyfikacja istniejącego pola (lub dowolnego obiektu bazy danych) zawsze jest złym pomysłem. Cały czas należy dążyć do tego, by tabele, pola i inne obiekty bazy danych miały dobre, opisowe nazwy już w momencie ich dodawania do bazy danych. Nigdy nie należy planować poprawiania nazw w późniejszym czasie. Wielu projektantów posługujących się Accessem rutynowo wyłącza opcję autokorekty (należy wybrać zakładkę Plik w celu przejścia do widoku Backstage, a następnie wybrać Opcje/Bieżąca baza danych; w grupie Opcje autokorekty nazw opcja Śledź informacje autokorekty nazw nie powinna być zaznaczona). Włączenie opcji autokorekty ujemnie wpływa na wydajność, ponieważ Access stale śledzi zmiany nazw w aplikacji i dokonuje odpowiednich korekt, jeśli jest taka potrzeba. Co więcej, ponieważ opcja autokorekty nigdy nie skoryguje wszystkich nazw w aplikacji, zawsze jest więcej pracy do wykonania w przypadku, gdy chcemy zmienić nazwę obiektu bazy danych.
Najpierw należy wybrać zakładkę TWORZENIE na wstążce wyświetlającej się w górnej części ekranu Accessa. Zakładka TWORZENIE (zobacz rysunek 3.1) zawiera wszystkie narzędzia potrzebne do tworzenia nie tylko tabel, ale także formularzy, raportów i innych obiektów bazy danych.
Rysunek 3.1. Zakładka TWORZENIE zawiera narzędzia potrzebne do dodawania nowych obiektów do bazy danych Accessa W poniższych przykładach wykorzystano bazę danych Rozdział03.accdb, którą można znaleźć w przykładach dołączonych do książki.
Są dwa główne sposoby dodawania nowych tabel do bazy danych Accessa. Obydwa wywołuje się z grupy Tabele na zakładce TWORZENIE:
70
Część II Tabele Accessa
Kliknięcie przycisku Tabela — powoduje dodanie zupełnie nowej tabeli do bazy danych. Tabela jest wyświetlana w arkuszu danych i ma jedno pole Identyfikator typu Autonumerowanie.
Kliknięcie przycisku Projekt tabeli — dodaje tabelę do bazy danych i wyświetla ją w widoku projektu.
W naszym przykładzie skorzystamy z przycisku Projekt tabeli, najpierw jednak przyjrzyjmy się przyciskowi Tabela. Kliknięcie przycisku Tabela powoduje dodanie nowej tabeli w środowisku Accessa. Nowa tabela wyświetli się w widoku arkusza danych w obszarze po prawej stronie okienka nawigacji. Nową tabelę pokazano na rysunku 3.2. Zwróć uwagę, że wyświetla się ona w widoku arkusza danych z dodaną kolumną Identyfikator. Z prawej strony pola Identyfikator wyświetla się kolumna z nagłówkiem Kliknij, aby dodać. Rysunek 3.2. Nowa tabela w widoku arkusza danych
Kolumna z nagłówkiem Kliknij, aby dodać ma na celu umożliwienie szybkiego dodawania pól do tabeli. Wystarczy zacząć wprowadzać dane w nowej kolumnie. Aby przypisać nazwę polu, wystarczy kliknąć prawym przyciskiem myszy nagłówek pola, wybrać polecenie Zmień nazwę kolumny i wprowadzić nazwę pola. Mówiąc inaczej, tworzenie tabeli Accessa pod wieloma względami przypomina tworzenie arkuszy kalkulacyjnych w programie Microsoft Excel. W poprzednich wersjach programu Microsoft Access o tym sposobie zwykle mówiło się jako o „tworzeniu tabeli w widoku arkusza danych”.
Po dodaniu nowej kolumny można skorzystać z narzędzi z zakładki POLA wstążki (zobacz rysunek 3.3). Za ich pomocą można ustawić określony typ danych pola, a także wybrać format, reguły sprawdzania poprawności i inne właściwości.
Rysunek 3.3. Narzędzia do projektowania pól znajdują się w zakładce POLA na wstążce
Drugi sposób dodawania nowych tabel polega na wykorzystaniu przycisku Projekt tabeli w grupie Tabele na zakładce TWORZENIE. Powoduje to otwarcie nowej tabeli w widoku projektu. Można w nim dodawać pola do projektu tabeli. Na rysunku 3.4 pokazano projekt nowej tabeli po dodaniu kilku nowych pól. Wykorzystanie widoku projektu tabeli to bardziej sensowny sposób tworzenia tabel.
Rozdział 3. Tworzenie tabel
71
Rysunek 3.4. Nowa tabela dodana w widoku projektu
Posługiwanie się narzędziem do projektowania tabel jest proste, a każda kolumna jest czytelnie opisana. Skrajna lewa kolumna to Nazwa pola. Służy ona do wprowadzania nazw pól dodawanych do tabeli. Do każdego pola tabeli należy przypisać typ danych i (opcjonalnie) wprowadzić opis. W przykładzie zaprezentowanym poniżej utworzymy tabelę klientów w przykładowej bazie danych MiniAuta dla Kolekcjonerów. Podstawowy projekt tej tabeli został przedstawiony w tabeli 3.1. Szczegółowe informacje dotyczące projektu tej tabeli opisano w podrozdziale „Tworzenie tabeli klientów” w dalszej części niniejszego rozdziału. Domyślny rozmiar pola dla pól typu Krótki tekst w przedstawionej tabeli to 255 znaków. Choć istnieje małe prawdopodobieństwo, aby czyjeś nazwisko miało 255 znaków, nie ma nic złego w przygotowaniu bazy danych do przechowywania bardzo długich nazwisk. Access zapisuje tylko tyle znaków, ile użytkownik wprowadzi w polu tekstowym. W związku z tym przydzielenie 255 znaków na nazwisko nie powoduje zużycia 255 znaków na każde nazwisko zapisane w bazie danych. Jeśli jeszcze raz spojrzymy na rysunek 3.4, zauważymy, że okno Projekt tabeli składa się z dwóch obszarów:
Obszar wprowadzania pól — w tym obszarze (w górnej części okna) wprowadza się nazwy i typy danych poszczególnych pól. Można w nim również wprowadzać opcjonalne opisy pól.
Obszar właściwości pól — obszar ten (w dolnej części okna) służy do wprowadzania właściwości każdego z pól. Do właściwości pól należy między innymi ich rozmiar, format, maska wprowadzania i wartość domyślna. Zbiór dostępnych właściwości w tym obszarze zależy od typu danych wybranego dla pola. Więcej informacji na temat właściwości pól można znaleźć w punkcie „Przypisywanie właściwości pól” w dalszej części tego rozdziału.
72
Część II Tabele Accessa
Tabela 3.1. Tabela klientów w bazie danych MiniAuta dla Kolekcjonerów Nazwa pola
Typ danych
Opis
CustomerID
Autonumerowanie
Klucz główny
Company
Krótki tekst
Pracodawca klienta lub inna instytucja z nim związana
Address
Krótki tekst
Adres klienta
City
Krótki tekst
Miasto klienta
State
Krótki tekst
Województwo klienta
ZipCode
Krótki tekst
Kod pocztowy klienta
Phone
Krótki tekst
Telefon klienta
Fax
Krótki tekst
Faks klienta
Email
Krótki tekst
Adres e-mail klienta
WebSite
Krótki tekst
Strona internetowa klienta
OrigCustomerDate
Data/Godzina
Data, w której klient po raz pierwszy kupił coś w firmie MiniAuta dla Kolekcjonerów
CreditLimit
Waluta
Limit kredytowy klienta w złotych
CurrentBalance
Waluta
Saldo kredytowe klienta w złotych
CreditStatus
Krótki tekst
Opis statusu kredytu klienta
LastSalesDate
Data/Godzina
Data, w której klient ostatnio kupił coś w firmie MiniAuta dla Kolekcjonerów
TaxRate
Liczba (Podwójna Stawka podatku stosowana dla klienta precyzja)
DiscountPercent
Liczba (Podwójna Procent rabatu przypisany do klienta precyzja)
Notes
Długi tekst
Uwagi i komentarze dotyczące klienta
Active
Tak/Nie
Informacja o tym, czy klient w dalszym ciągu kupuje od firmy MiniAuta dla Kolekcjonerów lub sprzedaje jej towary
Aby przełączyć się pomiędzy górnym i dolnym obszarem okna projektanta tabeli, można kliknąć myszką w czasie, gdy jej wskaźnik znajduje się w określonym obszarze, lub wcisnąć klawisz F6. Klawisz F6 powoduje przechodzenie po kolei po wszystkich otwartych okienkach (m.in. po okienku nawigacji i pola wyszukiwania właściwości), dlatego aktywowanie docelowego elementu może wymagać wielu kliknięć.
Posługiwanie się zakładką Projektowanie Zakładka PROJEKTOWANIE na wstążce Accessa (zobacz rysunek 3.5) zawiera wiele formantów ułatwiających tworzenie definicji nowej tabeli.
Rozdział 3. Tworzenie tabel
73
Rysunek 3.5. Zakładka PROJEKTOWANIE na wstążce Accessa
Formanty na zakładce PROJEKTOWANIE mają wpływ na istotne aspekty projektowania tabel. W poniższych punktach opiszemy tylko kilka spośród formantów przedstawionych na rysunku 3.5. Znacznie więcej informacji o innych przyciskach można znaleźć w podrozdziale „Tworzenie tabeli klientów” w dalszej części tego rozdziału oraz w kolejnych rozdziałach książki. Klucz podstawowy Przycisk ten umożliwia wskazanie pól w tabeli, które będą pełniły funkcję klucza podstawowego (nazywanego też kluczem głównym). Tradycyjnie klucz podstawowy wyświetla się na początku listy pól tabeli, choć może się wyświetlać w dowolnym miejscu projektu tabeli. Aby przenieść pole, wystarczy kliknąć lewym przyciskiem myszy szary znacznik po lewej stronie nazwy pola w widoku projektu tabeli, a następnie przeciągnąć pole do nowej pozycji.
Wstaw wiersze Chociaż dla mechanizmu obsługi bazy danych kolejność pól w tabeli nie ma zbyt dużego znaczenia, wielu projektantów zwraca na to ogromną uwagę. W wielu kreatorach Accessa pola są wyświetlane w tej samej kolejności, w jakiej występują w tabeli. Dlatego na przykład umieszczenie pola z ulicą i numerem domu nad polem z nazwą miasta ułatwia pracę. Klucze złożone, czyli kilka pól składających się na jeden klucz, zostaną szczegółowo omówione w rozdziale 4.
Przycisk Wstaw wiersze powoduje wstawienie pustego wiersza bezpośrednio nad pozycją wskazywaną przez kursor myszy. Na przykład jeśli kursor znajduje się w drugim wierszu w oknie projektu tabeli, kliknięcie przycisku Wstaw wiersze powoduje wstawienie pustego wiersza na drugiej pozycji i przeniesienie wiersza, który znajdował się wcześniej w tym miejscu, na pozycję trzecią. Usuń wiersze Przycisk Usuń wiersze działa odwrotnie do przycisku Wstaw wiersze — usuwa wiersze z projektu tabeli. Access nie wyświetla pytania o potwierdzenie zamiaru usunięcia wiersza przed jego faktycznym usunięciem.
74
Część II Tabele Accessa
Arkusz właściwości Przycisk Arkusz właściwości powoduje otwarcie okna Właściwości dla tabeli (zobacz rysunek 3.6). Właściwości umożliwiają zdefiniowanie ważnych cech tabeli, takich jak reguła poprawności obowiązująca dla całej tabeli lub alternatywny porządek sortowania dla danych w tabeli. Rysunek 3.6. Arkusz właściwości
Indeksy Indeksy opisano bardziej szczegółowo w podrozdziale „Indeksowanie tabel” w dalszej części tego rozdziału. Kliknięcie przycisku Indeksy powoduje otwarcie okna dialogowego Indeksy, w którym można wprowadzić szczegółowe informacje na temat indeksów zdefiniowanych dla pól tabeli.
Praca z polami Pola są tworzone poprzez wpisanie nazwy i typu danych w górnym obszarze widoku projektu tabeli. Opcjonalna właściwość Opis umożliwia wprowadzenie opisu przeznaczenia danego pola. Podczas wprowadzania danych opis będzie się wyświetlał na pasku stanu. Opis może się przydać użytkownikom pracującym z aplikacją. Po wpisaniu wszystkich nazw pól i określeniu ich typów danych można bardziej precyzyjnie zdefiniować sposób wykorzystywania pola poprzez zdefiniowanie dla niego właściwości. Określanie nazwy pola Nazwa pola powinna być wystarczająco czytelna dla projektanta tabeli, dla użytkownika systemu oraz dla Accessa. Nazwy powinny być na tyle długie, aby na ich podstawie można było szybko zdefiniować funkcję pola. Nie powinny być jednak zbyt długie (później, przy wpisywaniu reguł sprawdzania poprawności lub wykorzystywaniu nazw pól w obliczeniach, wprowadzanie zbyt długich nazw jest niewygodne). Aby wpisać nazwę pola, należy umieścić kursor w pierwszym wierszu okna widoku projektu w kolumnie Nazwa pola. Następnie należy wpisać poprawną nazwę, zwracając uwagę na następujące zasady:
Rozdział 3. Tworzenie tabel
75
Nazwy pól mogą mieć długość od 1 do 64 znaków.
Nazwy pól mogą zawierać litery, cyfry i wiele znaków specjalnych.
Nazwy pól mogą zawiera odstępy, jednak warto ich unikać z tych samych powodów, dla których nie należy ich stosować w nazwach tabel.
Nazwy pól nie mogą zawierać kropek (.), wykrzykników (!), nawiasów kwadratowych ([]) i akcentu (`).
Nie można używać tzw. niskich znaków ASCII, np. Ctrl+J, Ctrl+L (znaki ASCII o wartościach od 0 do 31).
Nazwa nie może rozpoczynać się od spacji.
W nazwach plików projektów Accessa nie można używać znaku cudzysłowu (").
W nazwach pól można używać jednocześnie wielkich i małych liter. W przypadku pomyłki podczas wpisywania nazwy należy ustawić kursor w miejscu, w którym chcemy dokonać poprawki, i wprowadzić zmianę. Nazwy pól można zmieniać w dowolnej chwili — nawet jeżeli tabela zawiera już dane. Access nie odróżnia małych liter od wielkich, zatem dla bazy danych nie ma znaczenia, czy nadamy tabeli nazwę tblCustomers, czy TblCustomers. Decyzja o wyborze liter wielkich, małych bądź różnej wielkości należy wyłącznie do projektanta. Jej celem powinno być umożliwienie tworzenia opisowych nazw i zapewnienie optymalnej czytelności nazw. Jeśli po zapisaniu tabeli zmieni się nazwę pola, która jest wykorzystywana także w kwerendach, formularzach czy raportach, trzeba ją uaktualnić również we wszystkich tych obiektach. Jedną z najczęstszych przyczyn błędów w aplikacjach Accessa jest zmiana nazw podstawowych obiektów (takich jak tabele lub pola) bez wprowadzenia zmian we wszystkich obiektach. Bardzo łatwo przeoczyć odwołanie do nazwy pola zaszyte w źródle formantu formularza lub raportu albo umieszczone głęboko w kodzie VBA.
Określanie typu danych Po dodaniu pola trzeba określić typ przechowywanych w nim danych. W Accessie można wybrać dla pola dowolne spośród kilku dostępnych typów danych (bardziej szczegółowo zostały one opisane w dalszej części rozdziału). Dostępne typy danych znajdziesz w tabeli 3.2. Na rysunku 3.7 pokazano listę rozwijaną Typ danych, służącą do określania typu danych utworzonych pól. Dla każdego pola trzeba określić typ danych. Niektóre typy mają dodatkowe opcje (np. pola typu Krótki tekst i Liczba udostępniają opcję Rozmiar pola). Poniżej znajduje się lista podstawowych kwestii, które należy uwzględnić przy określaniu typu danych nowych pól tabeli:
Który typ danych wybrać? Typ danych powinien odpowiadać danym przechowywanym w polu. Do zapisywania liczby sztuk lub cen należy więc wybrać jeden z liczbowych typów danych. Tego rodzaju typów danych nie należy jednak używać do przechowywania numerów telefonów lub numerów PESEL.
76
Część II Tabele Accessa
Tabela 3.2. Typy danych dostępne w programie Microsoft Access Typ danych
Typ przechowywanych informacji
Pojemność
Krótki tekst
Znaki alfanumeryczne
Do 255 znaków
Długi tekst
Znaki alfanumeryczne
Do 1 gigabajta znaków
Liczba
Wartości liczbowe
1, 2, 4 lub 8 bajtów (16 bajtów na identyfikatory GUID)
Data/Godzina
Data i godzina
8 bajtów
Waluta
Wartości pieniężne
8 bajtów
Autonumerowanie
Automatycznie zwiększane liczby
4 bajty (16 bajtów na identyfikatory GUID)
Tak/Nie
Wartości logiczne (tak/nie, prawda/fałsz)
1 bit (0 lub –1)
Obiekt OLE
Zdjęcia, wykresy, dźwięk, filmy
Do 1 gigabajta (ograniczone pojemnością dysku)
Hiperłącze
Odnośnik do zasobów internetowych
Do 1 gigabajta znaków
Załącznik
Specjalne pole, które pozwala dołączyć pliki zewnętrzne do bazy Accessa
Zależy od załącznika
Kreator odnośników
Wyświetla dane z innej tabeli
Zwykle 4 bajty
Rysunek 3.7. Lista rozwijana Typ danych
Aplikacja nie wykonuje na numerach telefonów operacji arytmetycznych (np. dodawania lub mnożenia). Dlatego dla informacji tego rodzaju należy stosować pola tekstowe. W polach liczbowych początkowe zera są pomijane. Gdy umieścisz w polu liczbowym kod pocztowy 02173, zapisane zostaną tylko cztery ostatnie cyfry.
Rozdział 3. Tworzenie tabel
77
Jakie wymagania pamięciowe ma wybrany typ danych? Choć można zastosować typ danych o rozmiarze Liczba całk. długa zamiast o rozmiarze Liczba całkowita lub Bajt, wartości o rozmiarze Liczba całk. długa zajmują dwukrotnie więcej pamięci niż wartości o rozmiarze Liczba całkowita. Oznacza to, że do używania liczb i operowania na nich trzeba będzie wykorzystać dwukrotnie więcej pamięci roboczej, a do ich przechowywania — dwa razy więcej pamięci dyskowej. Dlatego jeśli to możliwe, do przechowywania prostych danych liczbowych używaj rozmiaru Bajt lub Liczba całkowita.
Czy zamierzasz używać danego pola do sortowania lub indeksowania? Z uwagi na binarny charakter pól typu Długi tekst i Obiekt OLE nie można ich wykorzystać przy sortowaniu lub indeksowaniu. Staraj się nie nadużywać pól typu Długi tekst. Przechowywanie i używanie danych tego typu związane jest z dużymi kosztami.
Jaki wpływ ma zastosowanie danego typu danych na sortowanie? Dane liczbowe sortuje się inaczej niż tekst. Gdy używasz liczbowego typu danych, ciąg liczb jest porządkowany w oczekiwany sposób: 1, 2, 3, 4, 5, 10, 100. Jeśli ten sam ciąg zapiszesz jako dane tekstowe, zostanie posortowany tak: 1, 10, 100, 2, 3, 4, 5. Jeżeli dane tekstowe mają być sortowane tak jak liczby, przed rozpoczęciem procesu sortowania dane trzeba przekształcić. Gdy dane tekstowe reprezentujące liczby mają być sortowane w odpowiedniej kolejności, można poprzedzić wartości zerami (001, 002 itd.). Wtedy wartości tekstowe pojawią się w oczekiwanej kolejności: 001, 002, 003, 004, 005, 010, 100.
Czy dane należy zapisać jako tekst czy jako datę? Przy stosowaniu dat prawie zawsze lepiej jest zapisywać je w polach typu Data/Godzina niż typu Krótki tekst. Wartości tekstowe są sortowane inaczej niż daty (daty wewnętrznie są zapisywane jako liczby), co może zaburzyć układ raportów i innych materiałów wymagających wyświetlania danych w kolejności chronologicznej. Nie zapisuj daty w jednym polu typu Data/Godzina, a godziny w innym polu tego typu. Typ Data/Godzina jest zaprojektowany do przechowywania dat i godzin, a z dalszych rozdziałów dowiesz się, że można łatwo wyświetlać samą datę lub samą godzinę z wartości typu Data/Godzina. Ponadto pola typu Data/Godzina służą do zapisywania konkretnej daty i godziny, a nie przedziałów czasu. Jeśli chcesz rejestrować przedziały czasu, możesz wykorzystać dwa pola typu Data/Godzina (jedno na początek i drugie na koniec danego okresu) lub pole liczbowe o rozmiarze Liczba całk. długa, w którym można zapisać liczbę sekund, minut, godzin itp.
Jakie raporty będą potrzebne? W raportach nie można sortować bądź grupować danych typu Obiekt OLE. Jeśli trzeba przygotować raport na podstawie danych typu Obiekt OLE, należy dodać pole znacznika, np. datę lub numer porządkowy, i wykorzystać je jako klucz sortowania tabeli.
Typ danych Krótki tekst
Typ danych Krótki tekst służy do przechowywania prostych informacji składających się ze znaków (liter, cyfr i znaków przestankowych). Danymi tekstowymi są nazwiska, adresy czy opisy, a także dane liczbowe, które nie są wykorzystywane do obliczeń (np. numery telefonów, NIP-y, kody pocztowe).
78
Część II Tabele Accessa
Chociaż dla każdego pola typu Krótki tekst w obszarze właściwości określa się jego rozmiar, nie można wpisać wartości większej niż 255 znaków. Do przechowywania danych tego typu Access używa pól o zmiennej długości. Jeżeli na przykład ustalimy długość pola na 25 znaków, ale w poszczególnych rekordach będą występować wpisy nie dłuższe niż 5 znaków, to w przestrzeni bazy danych będzie zajęta ilość miejsca potrzebna do zapisania 5 znaków. Po jakimś czasie można zauważyć, że plik bazy danych (.accdb) wykazuje tendencję do szybkiego rozrostu, ale to nie pola tekstowe są tego przyczyną. Mimo to dobrym nawykiem jest ograniczenie pól typu Krótki tekst do maksymalnej długości, jakiej zgodnie z naszymi przewidywaniami wpisy nie przekroczą. Z nazwiskami należy być ostrożnym, gdyż w niektórych kulturach są one bardzo długie. Jednak bezpiecznie można założyć, że kody pocztowe w Polsce zawsze będą miały długość sześciu znaków (wliczając kreskę). Ograniczając długość pola typu Krótki tekst, ogranicza się także liczbę znaków, jakie użytkownik może wpisać w odpowiednim polu formularza. Typ danych Długi tekst
Pola typu Długi tekst przechowują dane o zmiennej wielkości, przy czym ich maksymalna długość to 1 gigabajt. Pola tego typu zajmują tyle pamięci, ile potrzeba na zapisanie danych. Jeśli więc jeden rekord wymaga 100 znaków, inny tylko 10, a jeszcze inny 3000, w każdym zajmowana jest tylko niezbędna ilość pamięci. Dla pól typu Długi tekst nie trzeba określać rozmiaru. Access przydziela im tyle pamięci, ile zajmują dane. W wersjach wcześniejszych od Accessa 2013 typ Krótki tekst nosił nazwę Tekst, a typ Długi tekst — Nota. Jeśli korzystasz ze starszych wersji Accessa, musisz się posługiwać dawnymi nazwami typów danych. Właściwości i ograniczenia tych typów się nie zmieniły — zmodyfikowano tylko nazwy. Typ danych Liczba
Typ danych Liczba umożliwia przechowywanie danych liczbowych, czyli wartości, które będą brały udział w obliczeniach matematycznych lub reprezentują wartości skalarne (np. liczbę sztuk produktu w magazynie). W przypadku danych wykorzystywanych w obliczeniach finansowych należy ustalić dla nich typ Waluta, który pozwala na wykonywanie obliczeń bez błędów zaokrągleń. Dokładny typ danych liczbowych zapisanych w polu typu Liczba jest określony przez właściwość Rozmiar pola. W tabeli 3.3 zestawiono różne liczbowe typy danych wraz z ich maksymalną i minimalną wartością, liczbą miejsc dziesiętnych oraz rozmiarem (w bajtach) potrzebnym do ich przechowywania. Podczas projektowania tabel trzeba być bardzo ostrożnym i wybierać typy danych umożliwiające zapisywanie w bazie danych znacznie większych wartości niż spodziewane. Nie oznacza to, że należy używać typu Podwójna precyzja dla wszystkich pól liczbowych. Rozmiar danych typu Podwójna precyzja jest bardzo duży (8 bajtów), a operacje obliczeniowe z wykorzystaniem danych tego typu wykonują się powoli. Typ danych Pojedyncza precyzja najbardziej się nadaje do wykonywania większości obliczeń zmiennoprzecinkowych, natomiast typ Liczba całk. długa jest najlepszy do obliczeń, w których część dziesiętna liczby nie ma znaczenia.
Rozdział 3. Tworzenie tabel
79
Tabela 3.3. Właściwości typów liczbowych Ustawienie w polu Rozmiar pola
Zakres
Miejsca dziesiętne Rozmiar w pamięci
Bajt
0 do 255
Brak
1 bajt
Liczba całkowita
–32 768 do 32 767
Brak
2 bajty
Liczba całk. długa
–2 147 483 648 do 2 147 483 647
Brak
4 bajty
15
8 bajtów
Podwójna precyzja
–1,797 × 10
308
308
do 1,797 × 10
38
38
Pojedyncza precyzja
–3,4 × 10 do 3,4 × 10
7
4 bajty
Identyfikator replikacji
Nie dotyczy
Nie dotyczy
16 bajtów
Dziesiętne
Dokładność 1 – 28
15
8 bajtów
Wybór niewłaściwego typu dla pól liczbowych jest przyczyną wielu błędów. Zwróćmy uwagę, że maksymalna wartość dla danych typu Liczba całkowita wynosi 32 767. Znam przypadek bazy danych, która doskonale działała przez kilka lat, a potem zaczęły się w niej pojawiać błędy przepełnienia. Okazało się, że przyczyną błędu było ustawienie typu Liczba całkowita dla jednego z pól. Kiedy w pewnym momencie firma podjęła próbę przetwarzania bardzo rozbudowanej listy zamówień, nastąpiło przekroczenie maksymalnej wartości 32 767. Należy pamiętać, że przepełnienie może wystąpić w wyniku dodania do siebie dwóch liczb albo wykonania dowolnego działania matematycznego, którego wynik jest wartością zbyt dużą, aby mogła się zmieścić w polu. Sytuacje, kiedy w pewnych okolicznościach występujących w czasie działania aplikacji (np. podczas dodawania lub mnożenia dwóch liczb) dochodzi do przepełnienia, należą do najtrudniejszych do wykrycia błędów. Typ danych Data/Godzina
Typ danych Data/Godzina to specjalny typ liczbowy do przechowywania dat lub godzin (lub dat razem z godzinami). Po zapisaniu dat w polach typu Data/Godzina można z łatwością obliczyć liczbę dni między dwoma datami oraz wykonać inne operacje dotyczące kalendarza. Daty zapisane w polach typu Data/Godzina można również bez przeszkód sortować i filtrować. Typ danych Data/Godzina umożliwia przechowywanie dat w zakresie od 1 stycznia 100 roku do 31 grudnia 9999 roku. Typ danych Waluta
Typ danych Waluta to kolejny specjalny typ danych liczbowych. Dane tego typu nie są zaokrąglane podczas obliczeń i zachowują 15 cyfr precyzji z lewej strony przecinka dziesiętnego i 4 cyfry z prawej. Ponieważ w danych tych pozycja przecinka dziesiętnego jest stała, obliczenia liczbowe na nich są szybsze w porównaniu z liczbami typu Podwójna precyzja. Typ danych Autonumerowanie
Typ danych Autonumerowanie to jeszcze jeden specjalny typ danych liczbowych. W przypadku dodania do tabeli pola typu Autonumerowanie Access automatycznie przypisuje liczbę całkowitą długą (32 bity) do pola (począwszy od 1) i inkrementuje tę wartość każ-
80
Część II Tabele Accessa
dorazowo po dodaniu rekordu do tabeli. Alternatywnie (w zależności od właściwości Nowe wartości) wartość pola typu Autonumerowanie jest losową liczbą całkowitą automatycznie wprowadzaną do nowych rekordów. W tabeli może występować tylko jedno pole typu Autonumerowanie. Po przypisaniu wartości Autonumerowanie wewnątrz rekordu nie można go zmienić ani programowo, ani przez użytkownika. Pola typu Autonumerowanie są odpowiednikami typu danych Liczba całk. długa i zajmują 4 bajty. Zakres dopuszczalnych wartości dla pól Autonumerowanie wynosi od 1 do 4 294 967 296 — to więcej niż wystarczająco do wykorzystania w roli kluczy głównych dla większości tabel. Pole typu Autonumerowanie nie gwarantuje generowania ciągłego zbioru kolejnych liczb. Jeżeli proces dodawania nowego rekordu zostanie przerwany (np. jeśli użytkownik wciśnie klawisz Esc podczas wprowadzania danych do nowego rekordu), to planowana dla tego rekordu wartość Autonumerowanie zostanie pominięta. Pól typu Autonumerowanie nie należy używać do generowania ciągu kolejnych liczb. Zamiast tego można skorzystać z makr osadzanych (ang. data macro) lub kodu VBA (makra osadzane zostaną szczegółowo omówione w rozdziale 22.) Gdy tworzysz relację między dwiema tabelami i jednym z pól uwzględnianych w relacji jest pole typu Autonumerowanie, drugie z tych pól powinno być typu Liczba całk. długa. Pozwala to uniknąć błędów przepełnienia. Omówienie tworzenia relacji między tabelami znajdziesz w rozdziale 4. Typ danych Tak/Nie
W polach typu Tak/Nie można zapisać tylko jedną z dwóch dozwolonych wartości. Pola te są wewnętrznie zapisane jako 1 (tak) lub 0 (nie) i służą do wskazywania wartości włączony/wyłączony, tak/nie lub prawda/fałsz. Pole typu Tak/Nie zajmuje 1 bit. Typ danych Obiekt OLE
Pola typu Obiekt OLE służą do zapisywania danych OLE — wysoko specjalizowanych obiektów binarnych, takich jak dokumenty Worda, arkusze kalkulacyjne Excela, klipy dźwiękowe i filmowe lub zdjęcia. Obiekty OLE tworzy się ze pomocą aplikacji rozpoznawanej przez system Windows jako serwer OLE. Można ją powiązać z aplikacją macierzystą lub osadzić w tabeli Accessa. W formularzach i raportach Accessa obiekty OLE można wyświetlać wyłącznie w powiązanych ramkach obiektów. Pól tego typu nie można indeksować. Typ danych Załącznik
Typ danych Załącznik został wprowadzony w Accessie 2007. Był on jednym z powodów, dla których Microsoft zmienił format pliku danych Accessa. Starszy format pliku (.mdb) nie pozwala na zapisywanie załączników. Typ danych Załącznik w porównaniu z innymi typami pól Accessa jest dość złożony. Wyświetlanie go w formularzach Accessa wymaga specjalnego postępowania. Więcej informacji na temat tego interesującego typu danych można znaleźć w podrozdziale „Posługiwanie się polami typu Załącznik” w dalszej części tego rozdziału.
Rozdział 3. Tworzenie tabel
81
Typ danych Hiperłącze
Typ Hiperłącze przechowuje kombinację tekstu i liczb zapisaną jako tekst i wykorzystywaną jako adres hiperłącza. Może zawierać do trzech części:
Tekst wyświetlany w polu (zazwyczaj sformatowany, aby wyglądał jak odnośnik).
Adres internetowy — ścieżka do pliku lub lokalizacja strony WWW.
Dowolny podadres wewnątrz pliku lub strony. Przykładem podadresu jest zdjęcie na stronie WWW. Poszczególne części adresu hiperłącza są oddzielone znakiem krzyżyka (#).
Hiperłącza Accessa umożliwiają nawet odwołania do formularzy i raportów w innych bazach danych Accessa. Oznacza to, że można skorzystać z tego typu danych w celu otwarcia formularza bądź raportu pochodzącego z zewnętrznej bazy danych Accessa. Kreator odnośników
Kreator odnośników tworzy pole, które umożliwia wybieranie wartości z innej tabeli lub z listy wyników instrukcji SQL-a. Wartości mogą być również wyświetlane w postaci pola kombi lub listy. W czasie projektowania tabeli Kreator odnośników przeprowadza programistę przez proces definiowania własności odnośników. Proces ten rozpoczyna się w momencie przypisania tego typu danych do pola. Przeciągnięcie pola utworzonego za pomocą kreatora odnośników z listy pól podczas tworzenia formularza, powoduje automatyczne utworzenie na formularzu pola kombi lub pola listy. Pole listy lub pole kombi wyświetli się również w arkuszu danych kwerendy zawierającej pole tego typu. Wprowadzanie opisu pola Pole Opis jest całkowicie opcjonalne — pomaga wyłącznie zapamiętać funkcję pola lub przedstawić ją innym użytkownikom. Zazwyczaj wcale nie korzysta się z kolumny opisu lub wypełnia się ją tylko dla tych pól, których przeznaczenie nie jest oczywiste na pierwszy rzut oka. Jeżeli wprowadzi się opis dla danego pola, to przy ustawieniu się na tym polu w widoku arkusza danych lub w formularzu wyświetla się on na pasku stanu. Opisy pomagają w wyjaśnieniu funkcji pól o niejednoznacznym przeznaczeniu lub w przedstawieniu użytkownikowi pełniejszych informacji na temat poprawności danych wprowadzanych do pola. Projektowanie reguł weryfikacji poprawności danych Ostatnia ważna decyzja podczas projektowania dotyczy sprawdzania poprawności danych, które ma bardzo istotne znaczenie, gdy użytkownicy wprowadzają dane. Trzeba zapewnić, aby do systemu przedostały się tylko poprawne dane (tzn. takie, które spełniają określone testy). Jest kilka rodzajów sprawdzania poprawności danych. Można sprawdzać, czy pole zawiera znane, pojedyncze wartości, zastrzegając, że na przykład w polu Płeć dopuszczalne są tylko trzy wartości: Mężczyzna, Kobieta bądź Nieznana. Można również sprawdzać, czy wprowadzona wartość mieści się w dozwolonym zakresie, na przykład czy pole Waga ma wartość z przedziału 0 – 800 kilogramów. Więcej informacji na temat reguł poprawności danych można znaleźć w punkcie „Reguła sprawdzania poprawności i Tekst reguły sprawdzania poprawności” w dalszej części tego rozdziału.
82
Część II Tabele Accessa
Tworzenie tabeli klientów Po zapoznaniu się z dostępnymi typami danych można przystąpić do utworzenia ostatecznej działającej wersji tabeli tblCustomers.
Korzystanie z pól typu Autonumerowanie W Accessie do pól typu Autonumerowanie mają zastosowanie specjalne reguły. Otóż nie można zmienić na Autonumerowanie typu pola zdefiniowanego wcześniej w inny sposób, jeżeli do tabeli zostały już dodane jakieś dane. Przy próbie zmiany istniejącego pola na Autonumerowanie wyświetli się komunikat o błędzie: Po wprowadzeniu danych do tabeli nie można zmienić typu danych żadnego pola na Autonumerowanie, nawet jeśli do tego pola nie dodano jeszcze żadnych danych.
Zamiast tego należy dodać nowe pole typu Autonumerowanie i rozpocząć z nim pracę. W tabeli Accessa może występować tylko jedno pole typu Autonumerowanie. Ogólnie rzecz biorąc, należy korzystać z pól typu Autonumerowanie wtedy, gdy w aplikacji są potrzebne specjalne właściwości tego typu danych.
Kończenie definicji tabeli tblCustomers Kiedy tabela tblCustomers jest otwarta w widoku projektu, można przystąpić do finalizowania jej projektu. W tabeli 3.1 zamieszczonej we wcześniejszej części tego rozdziału zamieszczono definicje pól tabeli tblCustomers. Nazwy pól i typy danych należy wpisać dokładnie tak, jak przedstawiono w tabeli. Na kolejnych kilku stronach wyjaśniamy, w jaki sposób modyfikuje się zdefiniowane pola (m.in. w jaki sposób zmienia się ich kolejność i nazwy oraz jak się je usuwa). Oto kolejne czynności przy dodawaniu nowego pola do struktury tabeli: 1. Umieść kursor w kolumnie Nazwa pola, w wierszu, w którym chcesz umieścić nowe pole. 2. Wpisz nazwę pola, a następnie naciśnij klawisz Enter lub Tab, aby przejść do kolumny Typ danych. 3. Wybierz typ danych pola z rozwijanej listy w kolumnie Typ danych. 4. Jeśli jest taka potrzeba, dodaj opis pola w kolumnie Opis. Powyższe czynności należy powtarzać do czasu utworzenia wszystkich definicji pól w tabeli tblCustomers. Do przemieszczania się między wierszami można wykorzystać klawisz strzałki w dół (↓) lub po prostu kliknąć myszą w wybranym wierszu. Wciśnięcie klawisza F6 powoduje przełączanie między poszczególnymi elementami interfejsu Accessa (można go użyć do przełączania się między górną a dolną częścią okna widoku projektu tabeli).
Rozdział 3. Tworzenie tabel
83
Zmiana projektu tabeli Nawet najlepiej zaprojektowana tabela od czasu do czasu wymaga wprowadzenia zmian. Może się okazać, że potrzebne jest nowe pole lub że istniejące pole trzeba usunąć, zmienić jego nazwę bądź typ danych czy po prostu zmienić kolejność występowania pól. Chociaż projekt tabeli można zmieniać w dowolnej chwili, należy zachować ostrożność w przypadku zmiany projektu tabel zawierających dane. Trzeba uważać, aby wprowadzane zmiany nie zniszczyły danych w tabeli, co może się zdarzyć na przykład wtedy, gdy zmniejszamy rozmiar pola tekstowego bądź też właściwość Rozmiar pola pól liczbowych. Zawsze można bezproblemowo dodawać pola do tabeli, natomiast zmienianie istniejących pól może być kłopotliwe. Ponadto, z wyjątkiem kilku specyficznych sytuacji, zmiana nazwy pola po tym, kiedy zostało ono użyte w aplikacji, jest zazwyczaj złym pomysłem.
Wstawianie pola Aby wstawić nowe pole w oknie widoku projektu tabeli, należy ustawić kursor na istniejącym polu, po czym kliknąć prawym przyciskiem myszy w oknie projektowym tabeli i wybrać z menu opcję Wstaw wiersze, lub kliknąć przycisk Wstaw wiersze na wstążce. W tabeli pojawi się nowy wiersz, a wszystkie istniejące zostaną przesunięte w dół. W nowym wierszu można wpisać definicję pola. Wstawienie nowego wiersza do tabeli nie narusza innych pól, nie wpływa także na dane istniejące w tabeli. Jeżeli w bazie danych są już kwerendy, formularze czy raporty bazujące na tej tabeli, może wystąpić potrzeba dodania do nich nowego pola.
Usuwanie pola Istnieją trzy sposoby usuwania pola. Kiedy tabela wyświetla się w widoku projektu, wykonaj jedną z następujących czynności:
Zaznacz wybrane pole, klikając selektor wiersza, a następnie naciśnij klawisz Delete.
Kliknij prawym przyciskiem myszy wybrane pole, a następnie z menu podręcznego wybierz polecenie Usuń wiersze.
Zaznacz wybrane pole, a następnie kliknij przycisk Usuń wiersze znajdujący się w grupie Narzędzia w zakładce PROJEKTOWANIE na wstążce.
W przypadku usuwania pola zawierającego dane wyświetla się ostrzeżenie informujące o tym, że wszystkie dane zawarte w tym polu zostaną usunięte. Jeśli tabela zawiera dane, upewnij się, czy na pewno chcesz usunąć dane z tego pola (kolumny). Wybrane pole trzeba także usunąć z kwerend, formularzy, raportów, makr i kodu VBA odwołujących się do niego. Po usunięciu pola można je szybko przywrócić, klikając przycisk Cofnij. Trzeba to jednak zrobić przed zapisaniem zmian wprowadzonych w definicji tabeli oraz przed wprowadzeniem innych zmian w jej projekcie. Przy próbie usunięcia pola, które wchodzi w skład relacji (pole klucza głównego lub klucza obcego) Access wyświetli informację, że nie można usunąć tego pola, dopóki nie usunie się odpowiedniego powiązania z okna relacji.
84
Część II Tabele Accessa
Relacje między tabelami i okno Relacje omówiono w rozdziale 4.
Jeżeli usunie się pole, trzeba także usunąć wszystkie odwołania Accessa do tego pola. Ponieważ nazwy pola można używać w formularzach, kwerendach, raportach, a nawet regułach sprawdzania poprawności danych, trzeba dokładnie prześledzić cały system i odnaleźć wszystkie miejsca, w których wykorzystano usuwane pole.
Zmiana położenia pola Kolejność wpisania pól w widoku projektu decyduje o kolejności ich wyświetlania w widoku arkusza danych. Aby zmienić kolejność pól, wystarczy dwukrotnie kliknąć selektor pola, a następnie przeciągnąć je w nowe miejsce.
Zmiana nazwy pola Nazwę pola można zmienić, zaznaczając istniejącą nazwę w oknie widoku projektu tabeli, a następnie wpisując nową. Access automatycznie uaktualni strukturę tabeli. W czasie trwania procesu tworzenia nowej tabeli ta operacja nie nastręcza żadnych trudności.
Zmiana rozmiaru pola Zwiększanie rozmiaru pola podczas projektowania tabeli jest prostą czynnością. Należy jednak pamiętać, że zmieniać można jedynie rozmiary pól tekstowych i pól liczbowych. Wystarczy jedynie wpisać inną wartość jako właściwość Rozmiar pola w polu tekstowym lub wybrać jedną z możliwych wartości tej właściwości dla pola liczbowego. W przypadku pól liczbowych trzeba także zwrócić uwagę na właściwość Miejsca dziesiętne i upewnić się, że nie wybrano nowego rozmiaru pola, który ma mniej miejsc dziesiętnych niż aktualny. Aby zmniejszyć rozmiar pola, należy najpierw sprawdzić, czy w tabeli nie ma danych o większym rozmiarze niż nowa szerokość pola. Zmiana rozmiaru pola na mniejszy może skutkować utratą danych. Pamiętaj, że z każdego pola tekstowego wykorzystanych jest tylko tyle znaków, ile jest w nim wpisanych. Należy zawsze próbować tworzyć pola tekstowe o długości najdłuższego możliwego wpisu. Dzięki temu Access nie pozwoli użytkownikom na wpisanie wartości, która potem nie zmieści się w formularzu czy raporcie.
Problemy konwersji danych Jeśli pomimo wysiłków zdarzy się konieczność zmiany typu danych pola, w którym są zapisane dane, podczas wykonywania konwersji może dojść do utraty danych. Należy pamiętać o skutkach konwersji typu pola, dla którego wpisano dane w tabeli.
Dowolny typ danych na Autonumerowanie — niedozwolone. Pole tego typu można tworzyć tylko jako nowe pole w tabeli. na Liczba, Waluta, Data/Godzina lub Tak/Nie — w większości przypadków konwersję można przeprowadzić bez szkody dla danych. Niewłaściwe wartości są automatycznie usuwane. Na przykład pole tekstowe zawierające wartość
Krótki tekst
Rozdział 3. Tworzenie tabel
85
„28.01.12” można bez problemu przekształcić na typ Data/Godzina. Jednak próba zmiany typu pola zawierającego wartość „28.01.12” na typ Tak/Nie spowoduje usunięcie wartości. na Krótki tekst — oczywista konwersja bez utraty danych bądź ich uszkodzenia. Teksty, których długość przekracza rozmiar pola tekstowego, są obcinane i tracone.
Długi tekst
na Krótki tekst — bez utraty informacji. Wartość liczbowa jest przekształcana na tekst z wykorzystaniem formatu Liczba ogólna.
Liczba
na Waluta — ze względu na to, że dla typu danych Waluta wykorzystuje się stałą pozycję przecinka dziesiętnego, w przypadku konieczności obcięcia liczby może dojść do utraty niektórych cyfr po przecinku.
Liczba
Data/Godzina na Krótki tekst — bez utraty informacji.
Dane typu Data/Godzina są przekształcane na tekst z wykorzystaniem formatu Data ogólna. na Krótki tekst — bez utraty informacji. Wartość typu Waluta jest przekształcana na tekst bez uwzględnienia symbolu waluty.
Waluta
na Liczba — prosta i oczywista konwersja. Podczas przekształcania waluty na liczby niektóre dane mogą ulec utracie. Na przykład podczas konwersji typu Waluta na Liczba całk. długa część dziesiętna waluty jest obcinana.
Waluta
na Krótki tekst — konwersja nie powoduje utraty danych poza przypadkiem, w którym szerokość pola tekstowego jest niewystarczająca do zapisania całej wartości typu Autonumerowanie. W takim przypadku liczba będzie obcięta.
Autonumerowanie
na Liczba — prosta i oczywista konwersja. Podczas przekształcania danych typu Autonumerowanie na liczby niektóre dane mogą ulec utracie. Na przykład w przypadku konwersji liczb typu Autonumerowanie o wartości większej niż 32 767 na typ Liczba całkowita dane będą obcięte.
Autonumerowanie
Tak/Nie na Krótki tekst — prosta konwersja wartości Tak/Nie na tekst. Bez utraty
informacji. Pola typu Obiekt OLE nie mogą być konwertowane na żaden inny typ danych.
Przypisywanie właściwości pól Właściwości pól dostępne dla tabel Accessa to sprzymierzeńcy pomagający w zarządzaniu danymi w tabelach. W większości przypadków na straży przestrzegania właściwości pól stoi silnik bazy danych, co oznacza, że właściwości są przypisywane w spójny sposób w całej aplikacji. Jeśli na przykład ustawiono właściwość Wartość domyślna podczas projektowania tabeli, wartość ta będzie dostępna w widoku arkusza danych tabeli, a także w formularzach i raportach.
86
Część II Tabele Accessa
Istnienie właściwości pól to jedna z wielu różnic między tabelami Accessa a arkuszami kalkulacyjnymi Excela. Zapoznanie się z właściwościami pól to jedna z kilku umiejętności niezbędnych do tego, by do przechowywania danych używać tabel Accessa zamiast arkuszy Excela. Z każdym typem danych jest związany inny zbiór właściwości. Na przykład pola liczbowe mają właściwość Miejsca dziesiętne, natomiast pola tekstowe mają właściwość Wyrównanie tekstu. Chociaż pewna część właściwości jest wspólna dla wielu typów danych (np. Nazwa), właściwości jest wystarczająco dużo, aby się w nich pogubić lub używać ich niezgodnie z przeznaczeniem. W kolejnych punktach opisaliśmy niektóre ważniejsze i częściej wykorzystywane właściwości pól. W poniższych punktach użyto wielu odwołań do właściwości i ich ustawień w widoku projektu tabeli Accessa. Formalne nazwy właściwości (np. DefaultValue) nigdy nie zawierają spacji, natomiast w widoku projektu zwykle wyświetla się spacja dla lepszej czytelności (np. Wartość domyślna). Te nieznaczne różnice stają się ważne podczas odwoływania się do właściwości w wyrażeniach, kodzie VBA i makrach. W formalnych odwołaniach do właściwości w kodzie lub makrach zawsze należy używać oficjalnej wersji nazwy właściwości (bez spacji), nie zaś nazwy wyświetlanej w widoku projektu tabeli w Accessie.
Wspólne właściwości Poniżej zamieszczono listę właściwości wspólnych dla wielu typów danych (należy zwrócić uwagę, że w zależności od wybranego typu danych nie wszystkie wymienione właściwości będą dostępne):
Rozmiar pola — ogranicza rozmiar pola typu Krótki tekst do określonej liczby znaków (od 1 do 255). Domyślną wartością jest 255.
Nowe wartości — właściwość ma zastosowanie do pól typu Autonumerowanie. Umożliwia określenie, czy nowe wartości mają być generowane przyrostowo czy losowo.
Format — zmienia sposób wyświetlania danych po ich wprowadzeniu (tylko duże litery, daty itd.). Jest wiele różnych typów formatów, które można zastosować do danych Accessa. Wiele z nich opisano w punkcie „Format” w dalszej części tego rozdziału.
Maska wprowadzania — używana do narzucania wpisywania danych z wykorzystaniem predefiniowanych formatów (numery telefonów, kody pocztowe, NIP-y, daty, identyfikatory itp.). Właściwość ma zastosowanie zarówno do typów liczbowych, jak i do typów tekstowych.
Miejsca dziesiętne — określa liczbę miejsc dziesiętnych dla typów Waluta i dla typów liczbowych: Pojedyncza precyzja, Podwójna precyzja i Dziesiętne.
Tytuł — opcjonalna etykieta dla pól formularzy i raportów. Jeśli zdefiniowano właściwość Tytuł, Access użyje jej dla kontrolek w formularzach i raportach zamiast nazwy pola.
Wartość domyślna — wartość automatycznie wpisywana do pola dla nowych rekordów. Może to być dowolna wartość prawidłowa dla typu danych wybranego dla pola. Wartość domyślna to nic innego jak wartość początkowa. Podczas
Rozdział 3. Tworzenie tabel
87
wprowadzania danych można ją zmienić. Aby ją zdefiniować, wystarczy wprowadzić żądaną wartość w polu właściwości Wartość domyślna. Może ona być wyrażeniem, a także liczbą lub ciągiem znaków. Ponieważ właściwość Wartość domyślna dla typów danych Liczba i Waluta domyślnie ma wartość 0 (zero), pola tych typów po dodaniu nowego rekordu są automatycznie ustawiane na 0. W wielu przypadkach, na przykład w wynikach badań medycznych i w wielu aplikacjach finansowych, zero nie jest odpowiednią wartością domyślną dla pól liczbowych. Należy się upewnić, czy zero jest odpowiednią wartością domyślną w rozwijanej aplikacji Accessa.
Reguła poprawności — sprawdza, czy dane wprowadzone w polu spełniają określone reguły, np. „większa od zera”, „data po 1 stycznia 2000” itp.
Tekst reguły spr. poprawności — komunikat wyświetlany w przypadku niepoprawnych danych.
Wymagane — określa, czy wprowadzenie wartości w polu jest obowiązkowe.
Zerowa dł. dozwolona — określa, czy można do pola tekstowego wpisać pusty ciąg znaków ("") dla odróżnienia go od wartości null.
Indeksowane — przyspiesza dostęp do danych oraz ogranicza dane do niepowtarzalnych wartości (jeśli jest to wymagane). Więcej informacji na temat indeksowania można znaleźć w dalszej części rozdziału.
Kompresja Unicode — wykorzystywana w aplikacjach wielojęzycznych. Wymaga około dwóch razy więcej przestrzeni w bazie danych, ale umożliwia wyświetlanie dokumentów pakietu Office (w tym raportów Accessa) w poprawny sposób niezależnie od tego, jakiego języka znaki czy symbole w nich występują. Ogólnie rzecz biorąc, stosowanie kodów Unicode nie ma sensu, jeśli aplikacja nie będzie wykorzystywana w środowisku języków azjatyckich.
Tryb IME — zwany także trybem konwersji kanji. Określa, który tryb edytora IME ma być stosowany po przeniesieniu fokusu do pola. Stosowanie tej właściwości nie ma sensu w aplikacjach używających języków europejskich.
Tryb zdania edytora IME — używany do określania trybu IME dla pól tabeli lub formantów formularza w przypadku uzyskania i utraty fokusu. Stosowanie właściwości nie ma sensu w aplikacjach używających języków europejskich.
Format Właściwość Format określa sposób wyświetlania lub drukowania danych zapisanych w polu tabeli. Właściwość ustawiona na poziomie tabeli obowiązuje w całej aplikacji. Dla każdego typu danych są dostępne inne specyfikatory formatu. W Accessie dostępne są wbudowane specyfikatory formatu dla większości typów danych. Na format używany do wyświetlania wartości pól mają wpływ ustawienia regionalne w panelu sterowania systemu Windows. Właściwość Format ma wpływ jedynie na sposób wyświetlania wartości, a nie na sposób zapisania wartości w bazie danych.
88
Część II Tabele Accessa
Aby zdefiniować własny format, należy utworzyć odpowiedni ciąg w polu tekstowym właściwości Format. Dla każdego typu danych dostępny jest inny zbiór symboli do wykorzystania. W Accessie są również dostępne globalne symbole, które można zastosować w dowolnym ciągu definicji formatu.
(spacja) — wyświetla spacje.
"Jakiś tekst"
— wyświetla dosłownie tekst ujęty w cudzysłów.
!
(wykrzyknik) — wyrównanie do lewej.
*
(gwiazdka) — wypełnienie pustej przestrzeni następnym znakiem.
(lewy ukośnik) — wyświetla kolejny znak dosłownie, jako tekst. Lewego ukośnika należy używać do wyświetlania znaków o specjalnym znaczeniu dla Accessa.
\
[kolor] — wyświetla pole za pomocą koloru podanego w nawiasie (black — czarny,
blue — niebieski, green — zielony, cyan — niebiesko-zielony, red — czerwony, magenta — purpurowy, yellow — żółty, white — biały). Jeśli dla pola zdefiniowano zarówno właściwość Format, jak i maskę wprowadzania, właściwość Format ma wyższy priorytet. Formaty pól typu Liczba i Waluta
Istnieje szeroka gama prawidłowych formatów dla pól typu Liczba i Waluta. Można dla nich wykorzystać jeden z formatów wbudowanych albo utworzyć własny.
Liczba ogólna — wyświetla się w takim formacie, w jakim ją wprowadzono (jest to domyślny format dla liczbowych typów danych).
Waluta — wyświetla się z separatorem tysięcy (zazwyczaj jest nim spacja), przecinkiem dziesiętnym z dwoma cyframi po jej prawej stronie, a liczby ujemne są ujęte w nawias. Wartości pól typu Waluta wyświetlają się z symbolem waluty (np. znakiem dolara lub euro). Symbol ten definiuje się w panelu sterowania za pomocą apletu Opcje regionalne i językowe.
Stałoprzecinkowy — zawsze wyświetla się co najmniej jedna cyfra z lewej i dwie cyfry z prawej strony przecinka dziesiętnego.
Standardowy — wykorzystanie separatora tysięcy i dwóch cyfr po prawej stronie przecinka dziesiętnego.
Procentowy — wartość jest mnożona przez 100, a po prawej stronie wyświetla się znak procentu. Wartości procentowe wyświetlają się z dwoma miejscami po prawej stronie przecinka dziesiętnego.
Wykładniczy — notacja wykładnicza służy do wyświetlania liczb.
Euro — dodaje symbol waluty euro do liczby.
Wbudowane formaty liczbowe przedstawiono w tabeli 3.4. Wszystkie przedstawione powyżej formaty są domyślnymi formatami bazującymi na właściwości Miejsca dziesiętne ustawionej na Auto. Zastosowany format zależy także od ustawień regionalnych z panelu sterowania.
Rozdział 3. Tworzenie tabel
89
Tabela 3.4. Przykłady formatów liczbowych Typ formatu
Wpisywana liczba
Wyświetlana liczba
Zdefiniowany format
Ogólny
987654.321
987654.3
######.#
Waluta
987654.321
$987,654.32
$###,##0.00
Euro
987654.321
€987,654.32
€###,##0.00
Stałoprzecinkowy
987654.321
987654.32
######.##
Standardowy
987654.321
987,654.32
###,###.##
Procentowy
.987
98.7%
###.##%
Wykładniczy
987654.321
9.88E+05
###E+00
Niestandardowe formaty liczbowe
Formaty niestandardowe tworzy się poprzez połączenie kilku symboli tworzących specyfikator formatu. Symbole, które można stosować dla pól typu Liczba i Waluta, wyszczególniono poniżej: (kropka) — określa, czy w wyświetlanej wartości ma się wyświetlić kropka dziesiętna.
. ,
(przecinek) — separator tysięcy.
0
(zero) — znak-wypełniacz dla zera lub cyfry.
#
(krzyżyk) — znak-wypełniacz dla cyfry lub pustego miejsca.
$
(znak dolara) — wyświetla symbol dolara.
(znak procentu) — po pomnożeniu wartości przez 100 dodawany jest do niej znak procentu.
%
lub e– — wykorzystanie notacji wykładniczej do wyświetlania liczby. Wykorzystanie znaku minus do oznaczenia ujemnego wykładnika i brak znaku dla wykładników dodatnich.
E–
lub e+ — wykorzystanie notacji wykładniczej do wyświetlania liczby. Do oznaczania wykładników dodatnich wykorzystuje się znak plus (+).
E+
Niestandardowe formaty tworzy się poprzez definiowanie ciągów złożonych z jednej do czterech części i rozdzielonych średnikami. Każda część ma dla Accessa inne znaczenie:
Pierwsza część — specyfikator formatu dla wartości dodatnich.
Druga część — specyfikator formatu dla wartości ujemnych.
Trzecia część — specyfikator formatu dla wartości zerowych.
Czwarta część — specyfikator formatu dla wartości pustych.
90
Część II Tabele Accessa
Każda część to połączenie ciągu formatującego liczby z opcjonalną specyfikacją koloru. Oto przykład niestandardowego formatu: 0 000,00[Zielony];(0 000,00)[Czerwony];"Zero";"-"
Zgodnie z tym formatem liczby wyświetlą się z zerami na wszystkich pozycjach (nawet dla liczb mniejszych niż 1000), jako separator tysięcy będzie wykorzystana spacja, liczby ujemne będą ujęte w nawias, wartość zero będzie wyświetlona w postaci słowa „Zero”, a we wszystkich polach zawierających wartość null wyświetli się dywiz. Wbudowane formaty danych typu Data/Godzina
Oto wbudowane formaty danych typu Data/Godzina (w przykładach wykorzystano ustawienia regionalne dla języka polskiego):
Data ogólna — jeśli wartość zawiera tylko datę, nie wyświetla się godzina i odwrotnie: jeśli wartość zawiera tylko godzinę, nie wyświetla się data. Daty wyświetlają się z wykorzystaniem formatu Data krótka (rrrr-mm-dd) natomiast godziny jako Godzina długa.
Data długa — 13 czerwca 2013.
Data średnia — 13-cze-2013.
Data krótka — 2012-05-13.
Godzina długa — 9:21:17.
Godzina średnia — 09:21.
Godzina krótka — 09:21.
Na format dat i godzin mają wpływ opcje regionalne w panelu sterowania systemu Windows. Niestandardowe formaty danych typu Data/Godzina
Formaty niestandardowe tworzy się poprzez zdefiniowanie ciągu specyfikacji zawierającego następujące symbole: :
(dwukropek) — oddziela elementy godziny (godziny, minuty, sekundy).
/
(prawy ukośnik) — oddziela elementy daty (dni, miesiące, lata).
c
— instrukcja dla Accessa używania formatu Data ogólna.
d
— wyświetla dzień miesiąca w postaci jednej lub dwóch cyfr (1 – 31).
dd
— wyświetla dzień miesiąca w postaci dwóch cyfr (01 – 31).
ddd
— wyświetla skrót nazwy dnia tygodnia (N, Pn, Wt, Śr, Cz, Pt, So).
— wyświetla pełną nazwę dnia tygodnia (niedziela, poniedziałek, wtorek, środa, czwartek, piętek, sobota).
dddd
ddddd
— wykorzystanie wbudowanego formatu Data krótka.
dddddd
— wykorzystanie wbudowanego formatu Data długa.
Rozdział 3. Tworzenie tabel w
— wyświetla dzień tygodnia w postaci liczby.
ww m
91
— wyświetla numer tygodnia w roku.
— wyświetla numer miesiąca w roku w postaci jednej lub dwóch cyfr.
— wyświetla numer miesiąca w roku w postaci dwóch cyfr (z wiodącym zerem, jeśli jest taka potrzeba).
mm
— wyświetla trzyznakowy skrót nazwy miesiąca (sty, lut, mar, kwi, maj, cze, lip, sie, wrz, paź, lis, gru).
mmm
mmmm
— wyświetla pełną nazwę miesiąca (np. styczeń).
q
— wyświetla numer kwartału w roku odpowiadający wpisanej dacie.
y
— wyświetla numer dnia w roku (1 – 366).
yy
— wyświetla rok w postaci dwóch cyfr (np. 12).
yyyy h
— wyświetla godzinę w postaci jednej lub dwóch cyfr (0 – 23).
hh n
— wyświetla godzinę w postaci dwóch cyfr (00 – 23).
— wyświetla minuty w postaci jednej lub dwóch cyfr (0 – 59).
nn s
— wyświetla rok w postaci czterech cyfr (np. 2012).
— wyświetla minuty w postaci dwóch cyfr (00 – 59).
— wyświetla sekundy w postaci jednej lub dwóch cyfr (0 – 59).
ss
— wyświetla sekundy w postaci dwóch cyfr (00 – 59).
tttt
— wykorzystanie wbudowanego formatu Godzina długa.
AM/PM
— czas dwunastogodzinny z oznaczeniami AM/PM.
am/pm
— czas dwunastogodzinny z oznaczeniami am/pm.
A/P
— czas dwunastogodzinny z oznaczeniami A/P.
a/p
— czas dwunastogodzinny z oznaczeniami a/p.
— czas dwunastogodzinny z oznaczeniem przed- i popołudnia ustalanym na podstawie ustawień regionalnych z panelu sterowania.
AMPM
Formaty danych typu Krótki tekst i Długi tekst
Specyfikatory formatów zastosowane w odniesieniu do pól typu Krótki tekst precyzują sposób wyświetlania danych zapisanych w polach. W tabeli tblCustomers zastosowano kilka formatów. W polu tekstowym State wprowadzono symbol > we właściwości Format po to, by wyświetlać dane wielkimi literami. W polu Active zastosowano format Tak/Nie oraz właściwość Typ formantu na zakładce Odnośnik ustawioną na wartość Pole tekstowe. Pola typu Krótki tekst i Długi tekst domyślnie wyświetlają się w postaci zwykłego tekstu. Jeśli dla pola Krótki tekst i Długi tekst ma być zastosowany specyficzny format, do utworzenia specyfikatora formatu można użyć następujących symboli:
92
Część II Tabele Accessa @
— wymagany znak bądź spacja.
&
— znak opcjonalny (nieobowiązkowy).
<
— zamienia wszystkie litery na małe.
>
— zamienia wszystkie litery na wielkie.
Specyfikatory formatu definiowane przez użytkowników mogą składać się z trzech różnych sekcji oddzielonych od siebie średnikami:
Pierwsza część — specyfikator pól zawierających tekst.
Druga część — format pól zawierających ciągi o zerowej długości.
Trzecia część — format dla pól zawierających wartości null.
Jeśli specyfikator formatu zawiera tylko dwie części, druga część dotyczy zarówno ciągów zerowej długości, jak i wartości null. Na przykład poniższy specyfikator powoduje wyświetlenie ciągu „Brak” w przypadku, gdy w polu nie zapisano żadnego ciągu znaków, oraz „Nieznany”, jeśli w polu występuje wartość null. W pozostałych przypadkach wyświetla się zwykły tekst zapisany w polu: @;"Brak";"Nieznany"
Kilka przykładów niestandardowych formatów tekstowych (dla ustawień regionalnych dla języka polskiego) zamieszczono w tabeli 3.5. Tabela 3.5. Przykłady formatów Zdefiniowany format
Wpisane dane
Wyświetlane sformatowane dane
>
Jan Kowalski
JAN KOWALSKI
<
Jan Kowalski
Jan kowalski
Adam
Ad-am
&-
Ad
-Ad
@;"Pusty"
""
Pusty
@;"Pusty"
Null
Pusty
-
Formaty danych Tak/Nie
W polu typu Tak/Nie wyświetlają się słowa Tak, Nie, Prawda, Fałsz, Wł, Wył w zależności od wartości zapisanej w polu oraz ustawienia właściwości Format dla pola. W Accessie występują następujące, dość oczywiste, specyfikacje formatów dla pól typu Tak/Nie: Tak/Nie
— wyświetla Tak lub Nie.
Prawda/Fałsz Wł/Wył
— wyświetla Prawda lub Fałsz.
— wyświetla Wł lub Wył.
Ciągi Tak, Prawda i Wł oznaczają wartość twierdzącą, natomiast Nie, Fałsz i Wył to wartości przeciwne (zaprzeczenia).
Rozdział 3. Tworzenie tabel
93
W Accessie dane typu Tak/Nie są przechowywane w inny sposób niż można by się spodziewać. Dane oznaczające Tak przechowywane są jako wartości –1, a dane oznaczające Nie — jako wartości 0. Można by przypuszczać, że będą to wartości 1 i 0, ale jest inaczej. Jeśli dla pola nie zdefiniowano formatu, Access wyświetla i zapisuje wartości -1 i 0. Niezależnie od ustawionego formatu dane w polach typu Tak/Nie można wpisywać za pomocą dowolnych słów z wbudowanych formatów lub jako liczby. Aby wprowadzić wartość „nie”, należy wpisać Fałsz, Nie, Wył lub 0. W celu wprowadzenia wartości „tak” należy wpisać Prawda, Tak, Wł lub dowolną liczbę różną od zera. Jeśli wprowadzisz liczbę inną niż 0 lub -1, Access przekształci ją na -1. Dla pól typu Tak/Nie można również zdefiniować własny format. Załóżmy na przykład, że mamy tabelę zawierającą pole wskazujące na to, czy pracownik uczestniczył w szkoleniu. Chociaż można by wykorzystać odpowiedzi Tak i Nie, można też użyć bardziej wyszukanego sposobu wyświetlania. Do wyświetlania wartości w polu Tak/Nie domyślnie wykorzystuje się pole wyboru (pole zaznaczone oznacza Tak). W celu zdefiniowania niestandardowego wyglądu pola typu Tak/Nie należy ustawić jego właściwość Format zgodnie z poniższym wzorcem: ;"Tekst dla wartości Tak";"Tekst dla wartości Nie"
Zwróćmy uwagę na średnik-wypełniacz na początku tego ciągu. Zauważmy też, że wszystkie elementy tekstowe trzeba ująć w cudzysłów. W przypadku tabeli danych o pracownikach można użyć następującego specyfikatora właściwości Format: ;"Uczestniczył w szkoleniu";"Musi wziąć udział w szkoleniu"
Aby zmienić domyślny sposób wyświetlania — pole wyboru — na tekst, trzeba również ustawić właściwość Typ formantu pola Tak/Nie na wartość Pole tekstowe. Formaty danych typu Hiperłącze
Hiperłącza Access także przechowuje i wyświetla w sposób niezgodny z oczekiwaniami. Format dla tego typu danych składa się z trzech części (rozdzielonych znakiem kratki — #):
Tekst wyświetlany — napis wyświetlany w polu lub formancie.
Adres — ścieżka dostępu do pliku (UNC) lub strony internetowej (URL).
Podadres — dokładna lokalizacja w obrębie pliku lub strony.
W polach lub formantach widoczny jest tylko Tekst wyświetlany, a Adres i Podadres są ukryte. W poniższym przykładzie tekst wyświetlany to „Strona WWW Microsoft MSN”, natomiast adres hiperłącza to http://www.msn.com. Strona WWW Microsoft MSN#http://www.msn.com
Maska wprowadzania Właściwość Maska wprowadzania ułatwia wprowadzanie danych w prawidłowym formacie. Maska wprowadzania ogranicza sposób, w jaki użytkownik wprowadza dane w aplikacji. Na przykład można pozwolić użytkownikowi na wprowadzanie wyłącznie
94
Część II Tabele Accessa
cyfr w polach numeru telefonu, NIP-u i identyfikatora pracownika. Maska wprowadzania dla NIP-u może mieć następującą postać: "000-000-00-00". Maska ta nakłada obowiązek wpisania wszystkich cyfr bez używania spacji i innych znaków. Maska wprowadzania zdefiniowana na poziomie właściwości pola jest wykorzystywana wszędzie tam, gdzie pole jest używane (kwerendy, formularze, raporty). Wartość właściwości Maska wprowadzania jest ciągiem znaków składającym się z trzech części, oddzielonych od siebie średnikami:
Pierwsza część — zawiera właściwą maskę składającą się z symboli zamieszczonych poniżej.
Druga część — informuje Accessa o tym, czy należy zapisywać literały zawarte w masce razem z pozostałymi danymi. Na przykład w masce wprowadzania mogą się znaleźć kreski oddzielające poszczególne części NIP-u, natomiast maska dla numeru telefonu może zawierać nawiasy i kreski. Wartość 0 (zero) powoduje zapisywanie literałów wewnątrz danych, natomiast wartość 1 powoduje zapisanie wyłącznie wprowadzonych danych.
Trzecia część — definiuje znak-wypełniacz, który informuje użytkownika o liczbie znaków w obszarze wprowadzania. W wielu maskach wprowadzania wykorzystuje się w tej roli znaki kratki (#) lub gwiazdki (*).
W definicji masek wprowadzania można używać następujących znaków: 0
— obowiązkowa cyfra, nie można użyć znaku plus (+) ani minus (-).
9
— opcjonalna cyfra, nie można użyć znaku plus (+) ani minus (-).
— opcjonalna cyfra lub spacja. Spacje są usuwane podczas zapisywania danych w tabeli. Znaki plus i minus są dozwolone.
# L
— obowiązkowa litera A – Z.
?
— opcjonalna litera A – Z.
A
— obowiązkowy znak lub cyfra.
a
— opcjonalny znak lub cyfra.
&
— obowiązkowy dowolny znak lub spacja.
C
— opcjonalny dowolny znak lub spacja.
.
(kropka) — kropka dziesiętna.
,
(przecinek) — separator tysięcy.
:
(dwukropek) — separator dat i godzin.
;
(średnik) — znak separatora.
-
(myślnik) — znak separatora.
/
(prawy ukośnik) — znak separatora.
<
(mniejszy niż) — zamienia wszystkie następne znaki na małe litery.
Rozdział 3. Tworzenie tabel >
95
(większy niż) — zamienia wszystkie następne znaki na wielkie litery.
(wykrzyknik) — powoduje wyświetlanie maski od prawej do lewej. Znaki wypełniają maskę od prawej do lewej.
! \
(lewy ukośnik) — wyświetla kolejny znak dosłownie.
Tych samych specyfikatorów można używać w arkuszu właściwości pola w kwerendzie lub formularzu. Maski wprowadzania są ignorowane podczas importowania lub dodawania danych do tabeli za pomocą kwerendy funkcjonalnej. Właściwość Format zdefiniowana dla pola przesłania właściwość Maska wprowadzania. W takim przypadku maska wprowadzania ma zastosowanie podczas wprowadzania danych. Po zakończeniu wprowadzania format zmienia się zgodnie ze specyfikatorem formatu. Kreator masek wprowadzania
Chociaż maski wprowadzania można definiować ręcznie, to można również w łatwy sposób określić je dla pól typu Tekst lub Data/Godzina za pomocą Kreatora masek wprowadzania. Kliknięcie pola właściwości Maska wprowadzania powoduje wyświetlenie przycisku Konstruuj (z trzema kropkami). Aby uruchomić kreator, należy kliknąć ten przycisk. Jego pierwszy ekran zamieszczono na rysunku 3.8. Rysunek 3.8. Kreator masek wprowadzania służący do definiowania masek dla pól tekstowych oraz przechowujących daty
Kreator masek wprowadzania wyświetla nie tylko nazwy wszystkich predefiniowanych masek, ale także przykłady każdej z nich. Można wybrać dowolną z oferowanych masek, a po kliknięciu w polu Próbuj można sprawdzić, jak będzie przebiegało wprowadzanie danych. Po wybraniu maski wprowadzania kolejny ekran kreatora umożliwia dostosowanie jej do indywidualnych potrzeb i określenie symbolu zastępczego, np. znaku kratki (#) lub znaku „małpy” (@). Kolejny ekran zawiera pytanie, czy przechowywać znaki specjalne razem z danymi (np. kreski dla NIP-ów). Po zakończeniu pracy z kreatorem Access umieści zdefiniowaną maskę w polu odpowiedniej właściwości.
96
Część II Tabele Accessa Można utworzyć własne maski wprowadzania dla pól tekstowych oraz typu Data/Godzina, klikając przycisk Edytuj listę na pierwszym ekranie kreatora, a następnie wpisując czytelną nazwę, maskę wprowadzania, znak symbolu zastępczego oraz dane przykładowe. Po utworzeniu nowa maska będzie dostępna przy każdym uruchomieniu kreatora.
Można zdefiniować dowolną liczbę masek wprowadzania. Można także określić ustawienia międzynarodowe, co umożliwia pracę z maskami charakterystycznymi dla różnych krajów. Niestandardowa maska wprowadzania utworzona w jednej bazie jest też dostępna w innych. Tytuł Właściwość Tytuł decyduje o ciągu znaków, jaki się pojawi na domyślnej etykiecie dołączonej do formantu po przeciągnięciu pola z listy pól do formularza lub raportu. Tytuły wyświetlają się również jako nagłówki kolumn w widoku arkusza danych tabeli lub kwerendy zawierającej pole. Podczas używania właściwości Tytuł należy zachować ostrożność. Ponieważ tekst tytułu wyświetla się jako nagłówek kolumny w widoku arkusza danych, nagłówek kolumny w widoku arkusza danych kwerendy może wprowadzać w błąd. Kiedy pole występuje w kwerendzie, użytkownik nie ma bezpośredniego dostępu do właściwości pola, zatem musi pamiętać, że o nagłówku kolumny decyduje właściwość Tytuł, która nie musi być związana z nazwą pola. Aby było jeszcze trudniej, tytuł przypisany w widoku projektu tabeli oraz tytuł definiowany w arkuszu właściwości pola w widoku projektu kwerendy to dwie różne właściwości, które mogą zawierać różne teksty.
Maksymalna długość tytułu wynosi 2048 znaków, co w zupełności wystarcza dla większości opisów. Reguła sprawdzania poprawności i Tekst reguły sprawdzania poprawności Właściwość Reguła poprawności definiuje wymagania wprowadzania danych do pola. Reguła sprawdzania poprawności, nad której przestrzeganiem czuwa silnik bazy danych ACE, zapewnia zgodność danych wprowadzanych do tabeli z wymaganiami aplikacji. Właściwości dotyczące sprawdzania poprawności pól to doskonały sposób na to, by wymusić przestrzeganie reguł biznesowych — używając ich można na przykład nie dopuścić do sprzedaży produktu za zero złotych albo nie pozwolić na to, by data oceny pracownika była wcześniejsza od daty jego zatrudnienia. Sprawdzanie poprawności danych wprowadzonych do pól i formantów następuje zawsze wtedy, kiedy pole jest wykorzystywane w aplikacji. Wartość właściwości Reguła poprawności to ciąg znaków zawierający wyrażenie używane do sprawdzania danych wprowadzanych przez użytkowników. Wyrażenie spełniające rolę właściwości Reguła poprawności nie może zawierać funkcji zdefiniowanych przez użytkownika ani żadnych funkcji domeny Accessa bądź funkcji agregacji (DCount, DSum itp.). Reguła sprawdzania poprawności dla pola nie może zawierać odwołań do formularzy, kwerend lub innych tabel w aplikacji (ograniczenia te nie dotyczą reguł sprawdzania poprawności stosowanych w odniesieniu do formantów formularzy). Reguły sprawdzania poprawności dla pól nie mogą zawierać odwołań do innych pól w tabeli,
Rozdział 3. Tworzenie tabel
97
ale reguła sprawdzania poprawności zastosowana do rekordu w tabeli może odwoływać się do pól w tej samej tabeli (regułę sprawdzania poprawności poziomu rekordu ustawia się w arkuszu właściwości tabeli, a nie dla indywidualnych pól). Właściwość Tekst reguły spr. poprawności zawiera ciąg, który wyświetla się w oknie komunikatu w przypadku, gdy dane wprowadzone przez użytkownika nie spełniają wymagań określonych za pomocą właściwości Reguła poprawności. Maksymalny rozmiar właściwości Tekst reguły spr. poprawności wynosi 255 znaków. W przypadku korzystania z właściwości Reguła poprawności zawsze należy pamiętać o zdefiniowaniu tekstu reguły, by uniknąć wyświetlania ogólnego komunikatu Accessa w przypadku naruszenia reguły sprawdzania poprawności danych. Właściwość Tekst reguły spr. poprawności należy wykorzystać w celu wyświetlenia użytkownikom komunikatu z informacjami o dozwolonych wartościach. Na rysunku 3.9 pokazano okno komunikatu wyświetlane w przypadku przekroczenia wartości określonej przez właściwość Reguła poprawności dla pola CreditLimit. Rysunek 3.9. Okno komunikatu reguły sprawdzania poprawności pojawia się, kiedy użytkownik wpisze w polu wartość, która nie spełnia reguły zdefiniowanej w projekcie tabeli
Właściwość Reguła poprawności nie ma zastosowania do pól wyboru, przycisków opcji bądź przełączników w obrębie grupy opcji w formularzu. Grupa opcji ma własną właściwość Reguła poprawności, która dotyczy wszystkich formantów w obrębie grupy. Reguły sprawdzania poprawności często wykorzystuje się po to, by zapewnić, że pewne daty przypadają po innych datach (np. data przejścia pracownika na emeryturę musi być późniejsza od daty przyjęcia go do pracy), a także po to, by uniemożliwić wprowadzanie liczb ujemnych w polach stanów magazynowych lub by zapewnić wprowadzanie wartości należących do zdefiniowanego zakresu liczbowego bądź tekstowego. Daty używane w wyrażeniach Accessa (np. we właściwości Reguła poprawności) mają po obu stronach ograniczniki w postaci znaków kratki (#). Aby wprowadzić ograniczenie dla danych wprowadzanych w polu LastSalesDate do dat między 1 stycznia 2013 a 31 grudnia 2014, należy wpisać regułę Between #1/1/13# and #12/31/14#. Aby górnym limitem wprowadzanych dat była data bieżąca, można wprowadzić regułę sprawdzania poprawności mającą postać Between #1/1/2013# and Date(), gdzie Date() to wbudowana funkcja języka VBA zwracająca bieżącą datę. Z powodzeniem można jej używać w regułach sprawdzania poprawności lub innych wyrażeniach.
Po przeciągnięciu pola zawierającego regułę sprawdzania poprawności do formularza właściwość Reguła poprawności nowego formantu wyświetlana w jego arkuszu właściwości nie jest ustawiana na regułę sprawdzania poprawności pola zdefiniowaną na poziomie tabeli. Jeśli nie wprowadzi się nowej reguły sprawdzania poprawności w arkuszu właściwości formantu, Access zastosuje regułę ustawioną na poziomie tabeli.
98
Część II Tabele Accessa
Sprawdzanie poprawności zawartości pól i formantów następuje w momencie, kiedy fokus opuszcza pole tabeli lub formant formularza. Reguły sprawdzania poprawności stosowane zarówno do pola tabeli, jak i do formantu formularza powiązanego z polem są wymuszane dla obu tych elementów. Reguła poziomu tabeli stosowana jest podczas edycji danych w powiązanym formancie w czasie, kiedy fokus opuszcza formant. Reguł sprawdzania poprawności z poziomu tabeli nie można stosować dla powiązanych tabel zewnętrznych, takich jak FoxPro, Paradox lub dBASE. W powiązanych zewnętrznych tabelach należy stosować reguły sprawdzania poprawności dla formantów powiązanych z polami. Wymagane Właściwość Wymagane wskazuje na to, czy Access ma wymagać wprowadzenia wartości w polu. Ustawienie jej na wartość Tak oznacza, że wprowadzenie wartości w polu tabeli lub formancie formularza związanym z polem jest obowiązkowe. Wymagane pole nie może mieć wartości null. Właściwość Wymagane jest nieprawidłowa dla pól typu Autonumerowanie. Domyślnie wszystkim polom tego typu jest przypisywana wartość podczas tworzenia nowego rekordu. Przestrzeganie właściwości Wymagane kontroluje silnik bazy danych Accessa. Jeśli użytkownik spróbuje opuścić formant pola tekstowego związanego z polem o właściwości Wymagane ustawionej na Tak, generowany jest komunikat o błędzie. Właściwości tej można używać w połączeniu z właściwością Zerowa dł. dozwolona w celu sprawdzenia, czy wartość w polu jest nieznana, czy nie istnieje. Zerowa dł. dozwolona Właściwość Zerowa dł. dozwolona decyduje o tym, czy w polu typu Krótki tekst lub Długi tekst dozwolone jest wprowadzanie ciągów zerowej długości (""). Właściwość ta przyjmuje następujące wartości: Tak
— wprowadzanie ciągów o zerowej długości jest dozwolone.
— wprowadzanie ciągów zerowej długości jest niedozwolone. W przypadku braku prawidłowych danych tekstowych do tabeli wstawiana jest wartość null.
Nie
Odpowiednia kombinacja właściwości Zerowa dł. dozwolona i Wymagane umożliwia rozróżnienie między brakiem danych (który najczęściej reprezentuje się za pomocą ciągu zerowej długości) a nieznaną wartością danych (którą zwykle zapisuje się za pomocą wartości null). W niektórych przypadkach trzeba zapisać właściwą wartość w polu typu Krótki tekst lub Długi tekst. Przykładem nieistniejących danych jest przypadek klienta, którego adres e-mail nie jest znany. Pole z adresem e-mail należy ustawić na pusty ciąg (zerowej długości), co oznacza, że wiemy, iż użytkownik ma adres e-mail, ale go nie znamy. Inny klient, całkowicie nowy dla firmy, powinien mieć wartość null w polu z adresem e-mail, co oznacza, że nie wiemy, czy posiada adres e-mail.
Rozdział 3. Tworzenie tabel
99
Maska wprowadzania ułatwia użytkownikom aplikacji rozpoznanie sytuacji, w której w polu jest wartość null. Na przykład można tak ustawić maskę wprowadzania, aby w przypadku, gdy w polu znajduje się ciąg zerowej długości, wyświetlał się ciąg „Zapytaj klienta”, a gdy pole zawiera wartość null, pojawiał się ciąg „Brak danych”. Właściwość Wymagane określa, czy w polu można wprowadzać wartość null, natomiast właściwość Zerowa dł. dozwolona umożliwia wprowadzanie w polu ciągów zerowej długości. Użyte razem te dwie niezależne właściwości tworzą mechanizm umożliwiający stwierdzenie, czy wartość jest nieznana, czy jej nie ma. Interakcje między właściwościami Wymagane i Zerowa dł. dozwolona są dość złożone. W tabeli 3.6 zestawiono możliwości kombinacji tych właściwości, które mają na celu stworzenie obowiązku wprowadzania wartości w polu lub umożliwienie wprowadzania w nim ciągów zerowej długości lub wartości null. Tabela 3.6. Interakcje między właściwościami Wymagane i Zerowa dł. dozwolona Zerowa dł. dozwolona
Wymagane
Dane wpisane przez użytkownika
Dane zapisane w bazie danych
Nie
Nie
Null
Null
Nie
Nie
Spacja
Null
Nie
Nie
Ciąg zerowej długości
Zabroniona
Tak
Nie
Null
Null
Tak
Nie
Spacja
Null
Tak
Nie
Ciąg zerowej długości
Ciąg zerowej długości
Nie
Tak
Null
Zabroniona
Nie
Tak
Spacja
Zabroniona
Nie
Tak
Ciąg zerowej długości
Zabroniona
Tak
Tak
Null
Zabroniona
Tak
Tak
Spacja
Ciąg zerowej długości
Tak
Tak
Ciąg zerowej długości
Ciąg zerowej długości
Indeksowane Właściwość Indeksowane informuje Accessa o tym, że pole będzie wykorzystywane jako indeks w tabeli. Pola indeksowane mają wewnętrzną strukturę, która zapewnia przyspieszenie kwerend oraz operacji sortowania i grupowania. Jeśli jakieś pole często występuje w kwerendach (np. identyfikator pracownika lub NIP) lub jeśli często się je wykorzystuje w operacjach sortowania bądź grupowania w raportach, należy ustawić jego właściwość Indeksowane na wartość Tak. Dozwolone są następujące ustawienia właściwości Indeksowane: Nie
— pole nie jest indeksowane (wartość domyślna).
100
Część II Tabele Accessa
— pole jest indeksowane i Access zezwala na występowanie w kolumnie duplikatów. Jest to odpowiednie ustawienie na przykład dla nazwisk, jeśli zachodzi prawdopodobieństwo wystąpienia w tabeli takich nazwisk jak Kowalski więcej niż raz.
Tak (Duplikaty OK)
— pole jest poindeksowane i duplikaty w kolumnie są niedozwolone. Wartość tę wykorzystuje się w odniesieniu do danych, które muszą być niepowtarzalne, np. NIP-ów, identyfikatorów pracowników lub numerów klientów.
Tak (Bez duplikatów)
Więcej informacji na temat indeksów można znaleźć w dalszej części tego rozdziału. Oprócz klucza głównego można poindeksować tyle pól, ile trzeba do zapewnienia optymalnej wydajności. Access zezwala na zdefiniowanie do 32 indeksów na tabelę. Należy pamiętać, że z zastosowaniem każdego z indeksów wiąże się pewna strata wydajności w miarę dodawania kolejnych rekordów do tabeli. Access dynamicznie aktualizuje informacje dotyczące indeksów po dodaniu każdego nowego rekordu. Jeśli w tabeli zdefiniuje się zbyt wiele indeksów, dodanie każdego nowego rekordu będzie się wiązało ze znacznymi opóźnieniami. Właściwość Indeksowane można ustawić w arkuszu właściwości pola lub tabeli. W celu ustawienia indeksów składających się z wielu pól trzeba koniecznie skorzystać z arkusza właściwości tabeli. Indeksy tego rodzaju omówiono w dalszej części rozdziału. Opcja automatycznego indeksowania
W oknie dialogowym Opcje programu Access (Plik/Opcje/Projektanci obiektu) jest opcja Autoindeksowanie przy importowaniu/tworzeniu, której włączenie powoduje automatyczne indeksowanie przez Access określonych pól po ich dodaniu do projektu tabeli. Domyślnie pola, które zaczynają się lub kończą na ID, klucz, kod, num (np. IDPracownika lub Kod zadania), są automatycznie indeksowane w momencie utworzenia pola. Przy każdym dodaniu nowego rekordu do tabeli dane z pola są uwzględniane w indeksie. Aby także inne pola były automatycznie indeksowane w momencie ich tworzenia, należy dodać nowe wartości obok pola wyboru Autoindeksowanie przy importowaniu/tworzeniu w zakładce Projektanci obiektu okna dialogowego Opcje programu Access (rysunek 3.10).
Rysunek 3.10. Obszar Projekt tabeli w oknie dialogowym Opcje programu Access zawiera opcje umożliwiające ustawienie specyfikatora Autoindeksowanie przy importowaniu/tworzeniu
Rozdział 3. Tworzenie tabel
101
Kiedy należy stosować indeksowanie?
Ogólnie rzecz biorąc, należy indeksować pola, które są często wykorzystywane przy wyszukiwaniu bądź sortowaniu. Trzeba pamiętać, że indeksy spowalniają niektóre operacje, na przykład wprowadzanie rekordów do tabeli czy wykonywanie niektórych kwerend funkcjonalnych. Pól typu Długi tekst i Obiekt OLE nie można indeksować. Access nie pozwala na utrzymywanie indeksów dla tych typów danych. Indeksu nie należy stosować, jeśli pole zawiera tylko kilka niepowtarzalnych wartości. Na przykład nie osiągnie się znaczących korzyści z poindeksowania pola zawierającego informacje o płci osoby czy województwie zamieszkania bądź pola typu Tak/Nie. Ponieważ tego typu pola mogą zawierać wartości z ograniczonego zbioru, Access z łatwością sortuje zapisane w nich dane. Z indeksów składających się z wielu pól należy korzystać w przypadkach, kiedy operacje sortowania są jednocześnie wykonywane według wielu pól (np. według imienia i nazwiska). W przypadku zdefiniowania takiego indeksu posortowanie tabeli będzie znacznie łatwiejsze.
Właściwości pól tabeli tblCustomers Po zdefiniowaniu nazw pól, typów danych i opisów pól można powrócić do definicji tabeli i dokładniej zdefiniować poszczególne pola. Każde pole zawiera właściwości, które mogą być różne dla różnych typów danych. W tabeli tblCustomers należy zdefiniować właściwości dla kilku typów danych. Na rysunku 3.11 pokazano obszar właściwości pola CreditLimit. Zauważmy, że w oknie właściwości są dwie zakładki — Ogólne i Odnośnik. Rysunek 3.11. Obszar właściwości pola CreditLimit typu Waluta
Wciskanie klawisza F6 powoduje przełączanie między obszarem definicji pola a obszarem właściwości (aby wyświetlić żądany obszar, czasami trzeba wcisnąć klawisz F6 kilka razy). Aby przejść do wybranego obszaru, można również kliknąć na nim myszą. Dla niektórych właściwości dostępna jest lista dopuszczalnych wartości wraz ze strzałką w dół, która wyświetla się w momencie umieszczenia wskaźnika w polu. Kliknięcie strzałki powoduje wyświetlenie dostępnych wartości na liście rozwijanej.
102
Część II Tabele Accessa Na rysunku 3.11 znajduje się 10 właściwości dostępnych dla pola CreditLimit typu Waluta. Dla pól innych typów (Liczba, Data/Godzina, Krótki tekst lub Tak/Nie) liczba opcji może być większa lub mniejsza.
W obszarze właściwości pól okna projektu tabeli jest druga zakładka, a mianowicie Odnośnik. Po jej kliknięciu wyświetla się tylko jedna właściwość — Typ formantu. Właściwość ta ma zastosowanie dla pól typu Krótki tekst, Liczba i Tak/Nie. Okno właściwości odnośnika dla pola Aktywny typu Tak/Nie, gdzie jedyną właściwością jest Typ formantu, przedstawiono na rysunku 3.12. Właściwość tę można zdefiniować jako jedną z trzech wartości: Pole wyboru, Pole tekstowe oraz Pole kombi. Wybierając jedną z nich, decydujemy, jakiego typu formant będzie użyty w chwili umieszczania pola w formularzu. Ogólnie wszystkie formanty są tworzone jako pola tekstowe, z wyjątkiem pól typu Tak/Nie, które domyślnie przyjmują postać pól wyboru. Jednak dla pól typu Tak/Nie także można określić typ formantu jako Pole tekstowe. Można w nim wyświetlać odpowiednie wartości zależne od właściwości Format, np. Tak/Nie, Prawda/Fałsz. Rysunek 3.12. Zakładka Odnośnik dla pola typu Tak/Nie
Więcej informacji na temat pól kombi można znaleźć w rozdziale 19.
W przypadku wykorzystywania pól tekstowych zamiast pól Tak/Nie i jeśli wiadomo, że w polu tekstowym może występować tylko kilka ściśle określonych wartości, jako typ formantu należy wybrać Pole kombi. Okno właściwości odnośnika dla przypadku, kiedy dla pola CreditStatus wybrano pole kombi jako Typ formantu, przedstawiono na rysunku 3.13. Istnieją tylko dwie dozwolone wartości pola CreditStatus: OK i Przekroczony. Te dwie wartości (rozdzielone średnikiem) zostały określone we właściwości Źródło wierszy pola kombi, z kolei właściwość Typ źródła wierszy ustawiono na Lista wartości. Rysunek 3.13. Ustawienie pola kombi jako typu formantu dla pola CreditStatus
Rozdział 3. Tworzenie tabel
103
Chociaż na rysunku 3.13 elementy pola kombi pochodzą z listy wartości, równie dobrze można by określić źródło wierszy pola kombi za pomocą kwerendy bądź instrukcji SQL-a. Rysunek 3.14 przedstawia wygląd pola CreditStatus podczas wyświetlania tabeli tbl Customers w widoku arkusza danych. Użytkownik ma do wyboru tylko dwie wartości statusu kredytu: OK lub Przekroczony. Takie same pole kombi wyświetla się w przypadku dodania pola w formularzu Accessa. Rysunek 3.14. Wykorzystanie pola kombi w roli odnośnika w celu wskazania dozwolonych wartości dla pola
Właściwości dla pól typu Odnośnik są różne dla różnych typów danych. Pola danych typu Tak/Nie różnią się od pól tekstowych czy pól liczbowych. Ponieważ pole typu Odnośnik jest w rzeczywistości polem kombi, to gdy dla pola wybierzemy typ Odnośnik, zostaną wyświetlone standardowe właściwości pól kombi.
Określanie klucza głównego Każda tabela powinna mieć klucz główny — jedno lub więcej pól z niepowtarzalnymi wartościami dla każdego rekordu (w terminologii baz danych zasada ta nazywa się integralnością jednostkową). W tabeli tblCustomers kluczem głównym jest pole CustomerID. Każdy klient ma unikatową wartość pola CustomerID. Dzięki temu silnik bazy danych potrafi rozróżniać rekordy od siebie. Wartość pola CustomerID równa 17 odnosi się do jednego i tylko jednego rekordu w tabeli tblCustomers. Jeżeli nie zdefiniuje się klucza głównego (pola z niepowtarzalnymi wartościami), Access może to zrobić automatycznie.
Wybór klucza głównego Jeżeli nie ma pola CustomerID, to aby uzyskać niepowtarzalność, należałoby utworzyć klucz główny w oparciu o inne pole. Nie można do tego celu wykorzystać pola Company, ponieważ może istnieć dwóch klientów o takiej samej nazwie firmy. Kombinacja pól Company i City (klucz złożony z wielu pól) także nie wchodzi w grę z tego samego powodu: istnieje możliwość, że w jednym mieście istnieją dwie firmy o identycznych nazwach. Trzeba znaleźć pole bądź kombinację pól, które sprawią, że każdy rekord będzie niepowtarzalny.
104
Część II Tabele Accessa
Najłatwiejszym sposobem uporania się z tym problemem jest dodanie pola typu Autonumerowanie w celu wykorzystania go w roli klucza głównego. Klucz główny tabeli tbl Customers to CustomerID — pole typu Autonumerowanie. Jeżeli nie wyznaczy się żadnego pola jako klucza głównego, Access może utworzyć pole typu Autonumerowanie i wyznaczyć je jako klucz główny tabeli. Pola typu Autonumerowanie są dobrymi kluczami głównymi, ponieważ to Access generuje dla nich wartości. Oprócz tego dba o to, by żadna z wartości nie powtórzyła się w obrębie tabeli, oraz nie pozwala na modyfikowanie wartości pól tego typu. Dobry klucz główny charakteryzuje się następującymi cechami:
Klucz główny musi w niepowtarzalny sposób identyfikować każdy rekord.
Klucz główny nie może mieć wartości null.
Klucz główny musi istnieć w momencie tworzenia rekordu.
Definicja klucza głównego musi być stabilna — po jej ustaleniu nie można jej zmieniać.
Klucz główny musi być zwięzły — powinien zawierać jak najmniej atrybutów.
Oprócz tego, że klucze główne w unikatowy sposób identyfikują wiersze w tabeli, charakteryzują się również innymi właściwościami:
Klucz główny zawsze jest indeksem.
Indeksy utrzymują predefiniowaną kolejność jednego lub więcej pól, co znacznie przyspiesza wykonywanie kwerend oraz żądań wyszukiwania i sortowania.
Przy dodawaniu nowych rekordów do tabeli Access sprawdza, czy w polach klucza głównego takie dane już istnieją, a jeśli tak, to nie pozwala na wpisanie powtarzających się danych.
Domyślnie Access wyświetla dane w kolejności określonej przez klucz główny.
Dzięki zdefiniowaniu jako klucza głównego takiego pola, jak CustomerID, dane wyświetlają się w określonej kolejności. Ponieważ w naszym przykładzie typ pola CustomerID to Autonumerowanie, Access przypisuje jego wartość automatycznie w kolejności wprowadzania rekordu do systemu. Idealnym kluczem głównym jest zatem pojedyncze pole, które jest niezmienne i dla którego istnieje gwarancja niepowtarzalności w obrębie tabeli. Z tych powodów w bazie danych MiniAuta dla Kolekcjonerów wykorzystano wyłącznie pola typu Autonumerowanie jako klucze główne dla wszystkich tabel.
Tworzenie klucza głównego Klucz główny można utworzyć na jeden z trzech sposobów. Jeśli tabela jest otwarta w widoku projektu:
Zaznacz pole, które ma wejść w skład klucza głównego, a następnie kliknij przycisk Klucz główny (ikona z kluczem) z grupy Narzędzia na zakładce PROJEKTOWANIE wstążki Accessa.
Rozdział 3. Tworzenie tabel
105
Kliknij pole prawym przyciskiem myszy, a po wyświetleniu menu podręcznego wybierz z niego opcję Klucz główny.
Zapisz tabelę bez wybierania klucza głównego — Access utworzy wtedy automatycznie pole typu Autonumerowanie.
Po wyznaczeniu klucza głównego po lewej stronie wybranych pól, w obszarze selektora, pojawi się symbol klucza, który oznacza, że utworzono klucz główny.
Tworzenie złożonych kluczy głównych Do pełnienia roli klucza głównego tabeli można wyznaczyć kombinację pól. Takie klucze często określa się jako złożone klucze główne. Jak widać na rysunku 3.15, należy zaznaczyć pola, które mają wejść w skład złożonego klucza głównego, a następnie kliknąć ikonę klucza w zakładce NARZĘDZIA na wstążce. Pewnym ułatwieniem jest sytuacja, w której pola wchodzące w skład złożonego klucza głównego leżą obok siebie w widoku projektu tabeli. Rysunek 3.15. Tworzenie złożonych kluczy głównych
Złożone klucze główne są wykorzystywane głównie wtedy, gdy projektant uważa, iż klucze główne powinny składać się z danych, które naturalnie występują w bazie danych. Dawniej uczono projektantów, że w każdej tabeli powinien się znaleźć naturalny klucz główny (dane naturalnie występujące w tabeli). Powodem, dla którego obecnie rzadko się używa złożonych kluczy głównych, jest fakt, że projektanci zdali sobie sprawę z nieprzewidywalności danych. Nawet jeśli użytkownicy zapewniają, że kombinacja określonych pól nigdy się nie powtórzy w tabeli, może się zdarzyć, że praktyka okaże się inna niż plany. Używanie zastępczych kluczy głównych (pól, które naturalnie nie należą do tabeli, np. NIP-u lub identyfikatora pracownika), takich jak pola typu Autonumerowanie, umożliwia oddzielenie projektu tabeli od jej danych. Problem w przypadku naturalnych kluczy głównych (tzn. danych, które naturalnie występują w tabeli) polega na tym, że w przypadku odpowiednio rozbudowanego zbioru danych istnieje prawdopodobieństwo wystąpienia duplikatów wartości pól wybranych jako klucze główne tabeli.
106
Część II Tabele Accessa
Co więcej, w przypadku używania kluczy złożonych utrzymanie relacji między tabelami staje się bardziej skomplikowane, ponieważ trzeba dublować pola we wszystkich tabelach zawierających powiązane ze sobą dane. Używanie złożonych kluczy głównych zwiększa stopień złożoności bazy danych bez jednoczesnej poprawy stabilności, integralności i innych pożądanych własności.
Indeksowanie tabel Rzadko się zdarza (jeśli w ogóle), aby dane były wprowadzane do tabel w sposób uporządkowany. Zazwyczaj rekordy wprowadza się do tabel w sposób całkowicie przypadkowy (z wyjątkiem danych uporządkowanych chronologicznie). Na przykład obciążony system wprowadzania zamówień jednego dnia zbiera informacje dotyczące zamówień wielu klientów. Najczęściej dane te będą wykorzystywane do tworzenia raportu zamówień dla pojedynczego klienta w celu wystawienia faktury lub odczytania zamówionych ilości potrzebnych do zarządzania stanami magazynowymi. Rekordy w tabeli Orders występują jednak w porządku chronologicznym, co nie zawsze pomaga przy tworzeniu raportów dotyczących zamówień klientów. W takim przypadku lepiej by było, gdyby dane były uporządkowane według identyfikatora klienta. Aby dokładniej zilustrować to pojęcie, weźmy za przykład kartoteki Rolodex używane do zapisywania nazwisk, adresów i numerów telefonów. Załóżmy przez moment, że pozycja kart w kartotece jest stała. Można dodać nowe karty, ale tylko na koniec kartoteki. Ograniczenie to oznacza, że wizytówka Jankowskiego może się znaleźć za wizytówką Kowalskiego, a jeszcze dalej znajdzie się wizytówka Brzozowskiego. Mówiąc inaczej, dane w kartotece są nieuporządkowane. Korzystanie z wizytownika Rolodex zawierającego nieposortowane wizytówki byłoby trudne. Trzeba by było przeszukać wszystkie wizytówki, by dotrzeć do tej osoby, która nas interesuje — byłby to bardzo pracochłonny i długotrwały proces. Oczywiście z wizytownika nie korzysta się w ten sposób. W momencie dodawania wizytówki wkładamy ją w miejsce, w którym logicznie powinna się znajdować. Najczęściej oznacza to wstawienie wizytówki do wizytownika w porządku alfabetycznym, według nazwiska. Rekordy do tabel Accessa dodaje się w sposób analogiczny do przykładu z kartoteką o stałej pozycji kart. Nowe rekordy zawsze są dodawane na końcu tabeli, a nie w jej środku, gdzie logicznie powinny się znaleźć. W systemie rejestracji zamówień dobrze by jednak było, gdyby nowe rekordy dotyczące tego samego klienta znajdowały się obok siebie. Niestety, tabele Accessa nie działają w ten sposób. Naturalny porządek tabeli to taki, w jakim dodawano do niej rekordy. Taki porządek czasami określa się jako porządek wprowadzania lub porządek fizyczny dla podkreślenia, że rekordy w tabeli występują w porządku, w jakim dodano je do tabeli. Używanie tabel uporządkowanych w naturalny sposób niekoniecznie jest złe. Naturalny porządek doskonale się sprawdza w przypadku, gdy operacje wyszukiwania są wykonywane rzadko lub gdy tabela jest bardzo mała. Zdarza się również, że dane wprowadzane do tabeli są w dużym stopniu uporządkowane. Jeśli tabela służy do pobierania danych sekwencyjnych (np. odczytów z miernika elektrycznego) i dane te będą wykorzystywane w tym samym porządku, to nie ma potrzeby indeksowania danych.
Rozdział 3. Tworzenie tabel
107
Jednak w przypadkach, kiedy porządek naturalny nie wystarcza, w systemie Microsoft Access występuje mechanizm indeksowania, który przyspiesza wyszukiwanie i sortowanie rekordów. Logiczny porządek rekordów w tabeli definiuje się poprzez utworzenie w niej indeksu. W Accessie indeksy wykorzystuje się w celu utrzymania jednego lub więcej wewnętrznych porządków sortowania danych w tabeli. Na przykład można poindeksować pole LastName często wykorzystywane w kwerendach i procedurach sortowania. Microsoft Access wykorzystuje indeksy w tabeli w sposób, w jaki korzysta się ze skorowidza w książce. Otóż aby znaleźć dane, Access poszukuje ich lokalizacji w indeksie. Najczęściej w tabelach wykorzystuje się jeden lub kilka prostych indeksów. Prosty indeks to taki, który obejmuje jedno pole w tabeli. Proste indeksy umożliwiają ułożenie rekordów tabeli w porządku rosnącym lub malejącym. Tworzy się je poprzez ustawienie właściwości Indeksowane pola na jedną z następujących wartości: Tak (Duplikaty OK); Tak (Bez duplikatów).
Domyślnie w tabelach Accessa nie ma indeksu. Trudno sobie jednak wyobrazić tabelę, która nie wymagałaby użycia żadnego indeksu. W następnym podrozdziale objaśniamy, dlaczego indeksowanie w tabelach Accessa jest tak ważne.
Ważność stosowania indeksów Z danych firmy Microsoft wynika, że w ponad połowie tabel baz danych Accessa nie używa się indeksów. W tej liczbie nie uwzględnia się tabel, które są nieprawidłowo poindeksowane — mowa tylko o tych tabelach, w których wcale nie ma indeksów. Wygląda na to, że wiele osób nie docenia ważności indeksowania tabel w bazach danych Accessa. Aby zademonstrować możliwości i wartość indeksów, w przykładach dołączonych do tej książki zamieszczona została baza danych IndexTest.accdb. Znajdują się w niej dwie identyczne tabele zawierające w przybliżeniu po 355 000 losowych słów. Jedną tabelę poindeksowano według pola Word, druga zaś nie jest poindeksowana. Prosty formularz (zobacz rysunek 3.16) umożliwia odpytywanie tabeli z indeksem lub bez indeksu i obserwowanie, ile milisekund trwało wyszukiwanie w każdym przypadku. Rysunek 3.16. Formularz frmIndexTest zapewnia szybki i łatwy sposób przekonania się o ważności indeksów
Seria testów wykazała, że w spójnie poindeksowanej tabeli wyszukiwanie słowa zajmuje mniej niż 20 milisekund, podczas gdy wyszukiwanie w tabeli niepoindeksowanej zajmuje od 200 do 350 milisekund. Uzyskanie wyniku pokazanego na rysunku 3.16 prawie
108
Część II Tabele Accessa
w ogóle nie zajmuje czasu i nie zwiększa całkowitego czasu wymaganego do uruchomienia zapytania. Nie trzeba dodawać, że czas potrzebny do wykonania kwerendy zależy w dużej mierze od sprzętu komputerowego, jednak dodanie do tabeli indeksu pozwala na osiągnięcie zysku wydajności sięgającego nawet ponad 500 procent. Ponieważ zdefiniowanie indeksu powoduje, że Access wewnętrznie utrzymuje porządek sortowania według danych zapisanych w poindeksowanym polu, oczywisty staje się powód, dla którego wprowadzenie indeksu powoduje poprawę wydajności. Indeksować powinno się praktycznie wszystkie pola, które często wykorzystuje się w kwerendach lub według których często wykonuje się sortowanie w formularzach lub raportach. Bez zdefiniowania indeksu Access musi przeszukiwać wszystkie rekordy w bazie danych w poszukiwaniu danych spełniających kryteria. Proces ten nazywa się skanowaniem tabeli i jest analogiczny do przeszukiwania każdej wizytówki w kartotece Rolodex w celu znalezienia wizytówek wszystkich osób pracujących dla określonej firmy. Jeśli nie przejrzy się wszystkich wizytówek, nie będzie się miało pewności, że udało się znaleźć wszystkie wizytówki spełniające nasze kryteria. Jak wspomniano we wcześniejszej części tego rozdziału, pola, które są kluczami głównymi tabeli, zawsze są poindeksowane. Jest tak dlatego, że klucze główne służą do wyszukiwania rekordów w tabeli. Dzięki poindeksowaniu ich Access znacznie łatwiej znajdzie żądane rekordy zarówno w bieżącej tabeli, jak i w zewnętrznej tabeli powiązanej z bieżącą. Gdyby indeks nie został zdefiniowany, Access musiałby przeszukać wszystkie rekordy w obcej tabeli, aby mieć pewność, że odnalazł wszystkie powiązane rekordy. Obniżenie wydajności związane z niepoindeksowanymi tabelami może mieć katastrofalny wpływ na ogólną wydajność aplikacji Accessa. Jednym z możliwych rozwiązań problemów z wydajnością aplikacji jest zastosowanie indeksowania.
Indeksy złożone z wielu pól Indeksy złożone z wielu pól, nazywane po prostu indeksami złożonymi, tworzy się bardzo prosto. Wystarczy w widoku projektu kliknąć przycisk Indeksy lub wybrać polecenie Indeksy z menu Widok. Otworzy się okno dialogowe Indeksy (zobacz rysunek 3.17), w którym można określić pola tworzące indeks. Rysunek 3.17. Zastosowanie indeksów złożonych może przyczynić się do poprawy wydajności
Rozdział 3. Tworzenie tabel
109
Wystarczy wprowadzić nazwę indeksu (na rysunku 3.17 jest to CityState) i za pomocą klawisza Tab przełączyć się do kolumny Nazwa pola. Z listy rozwijanej należy wybrać pola tworzące indeks. W tym przypadku jeden indeks tworzą pola City i State. W skład indeksu złożonego wchodzą wszystkie pola bezpośrednio poniżej tego wiersza, dla których nie określono nazwy indeksu. Podczas tworzenia porządku sortowania w tej tabeli Access uwzględnia oba wymienione pola, co przyspiesza wykonywanie kwerend oraz operacje sortowania obejmujące zarówno pole City, jak i pole State. Kolejność pól w indeksie złożonym ma znaczenie. Opisany w tym rozdziale indeks CityState zostanie wykorzystany w Accessie tylko wtedy, gdy w kwerendzie pojawi się pole City (jeśli używane jest tylko pole State, indeks ten nie zapewnia żadnych korzyści).
Indeks złożony może zawierać do dziesięciu pól. Jeśli indeks złożony nie jest używany jako klucz główny tabeli, dowolne z tworzących go pól może być puste. Sposób ustawiania właściwości dla indeksu złożonego zaprezentowano na rysunku 3.18. Należy umieścić kursor w wierszu okna dialogowego Indeksy zawierającego nazwę indeksu. Zwróćmy uwagę na trzy właściwości wyświetlające się w dolnej części okna dialogowego Indeksy. Rysunek 3.18. Ustawianie właściwości indeksów nie jest trudne
Znaczenie właściwości indeksu jest dość oczywiste (właściwości indeksów mają zastosowanie do indeksów złożonych zarówno z jednego, jak i z wielu pól):
Podstawowy — ustawienie tej właściwości na Tak powoduje, że Access wykorzystuje indeks w roli klucza głównego tabeli. Jako klucz główny można wyznaczyć więcej niż jedno pole. Należy jednak pamiętać o regułach dotyczących kluczy głównych, w szczególności wymogu niepowtarzalności kluczy głównych oraz tego, że żadne pole wchodzące w skład klucza głównego nie może być puste. Domyślna wartość właściwości Podstawowy to Nie.
Unikatowy — ustawienie tej właściwości na Tak powoduje, że indeks musi być niepowtarzalny w obrębie tabeli. Pole zawierające NIP to dobry kandydat na unikatowy indeks, ponieważ aplikacja może oczekiwać występowania dokładnie jednej wartości wybranego NIP-u w tabeli. Dla porównania pole nazwiska nie jest dobrym kandydatem na unikatowy indeks, gdyż często się zdarza występowanie wielu osób o takich samych nazwiskach, zwłaszcza popularnych, jak Kowalski czy Nowak. W związku z tym próba utworzenia unikatowego indeksu z pola zawierającego nazwisko spowodowałaby tylko kłopoty.
110
Część II Tabele Accessa
W przypadku kluczy złożonych niepowtarzalna musi być kombinacja wartości pól — dla poszczególnych pól wchodzących w skład klucza złożonego mogą występować duplikaty.
Ignoruj zerowe — jeśli poindeksowane pole rekordu zawiera wartość null (co w przypadku kluczy złożonych zdarza się tylko wtedy, gdy wszystkie pola składające się na klucz złożony mają wartość null), indeks rekordu nie wnosi niczego do ogólnego indeksowania. Mówiąc inaczej, jeśli indeks rekordu nie zawiera jakiejś wartości, Access nie potrafi stwierdzić, gdzie należy wstawić rekord na wewnętrznej liście sortowania. Z tego powodu można poinstruować Accessa, aby rekordy z wartością null indeksu były ignorowane. Domyślnie właściwość Ignoruj zerowe jest ustawiona na Nie, co oznacza, że Access wstawia rekordy z wartością indeksu null do list indeksowania razem z innymi rekordami o wartościach indeksu różnych od null.
Należy przetestować wpływ właściwości indeksu na tabele Accessa i wykorzystać te właściwości, które najbardziej odpowiadają potrzebom bazy danych. Określone pole może jednocześnie być zarówno kluczem głównym tabeli, jak częścią indeksu złożonego. Indeksowanie należy stosować w tabelach w miarę potrzeb, tak by uzyskać najlepszą możliwą wydajność i jednocześnie nie nadużyć indeksów oraz nie naruszyć podstawowych reguł indeksowania. Na przykład w takiej bazie danych jak MiniAuta dla Kolekcjonerów numer faktury z tabeli tblSales jest często wykorzystywany w formularzach i raportach, dlatego powinien zostać poindeksowany. Ponadto jest wiele sytuacji, w których numer faktury występuje w kombinacji z innymi polami, np. datą transakcji i identyfikatorem przedstawiciela handlowego. Warto rozważyć dodanie do tabeli transakcji złożonego indeksu składającego się z kombinacji numeru faktury z datą sprzedaży i identyfikatorem przedstawiciela handlowego.
Kiedy należy indeksować tabele? Jeśli w tabeli jest stosunkowo mało rekordów, ponoszenie dodatkowych kosztów związanych z utrzymaniem dodatkowych indeksów (oprócz głównego) może być nieopłacalne. Chociaż wykorzystanie indeksu nieco przyspiesza pobieranie danych, Access musi uaktualniać informacje dotyczące indeksu przy każdej operacji wprowadzania bądź modyfikacji rekordów w tabeli. Z kolei wprowadzanie zmian w niepoindeksowanych polach nie wymaga wykonywania dodatkowych operacji plikowych. Dane z niepoindeksowanych pól można odczytać równie łatwo (choć nie tak szybko) jak z pól poindeksowanych. Ogólnie rzecz biorąc, pomocnicze indeksy warto zdefiniować w przypadku rozbudowanych tabel. W takim przypadku indeksowanie pól innych niż klucz główny przyspiesza operacje wyszukiwania. Jednak nawet w przypadku rozbudowanych tabel indeksowanie może się przyczynić do pogorszenia wydajności, jeśli rekordy w tabeli będą się często zmieniały lub jeśli często będą dodawane nowe rekordy. Każda operacja modyfikacji rekordu lub wprowadzenia nowego rekordu powoduje konieczność aktualizacji wszystkich indeksów w tabeli. Dlaczego mimo wszystkich zalet indeksów nie indeksuje się wszystkich pól w tabeli? Jakie są wady poindeksowania zbyt wielu pól? Czy można nadużyć indeksów w tabeli?
Rozdział 3. Tworzenie tabel
111
Przede wszystkim indeksy nieco zwiększają rozmiar bazy danych Accessa. Niepotrzebne poindeksowanie tabeli zajmuje pewną ilość miejsca na dysku dla każdego rekordu. Co ważniejsze, indeksy powodują obniżenie wydajności operacji dodawania rekordu do tabeli. Ponieważ Access automatycznie aktualizuje indeksy za każdym razem, kiedy rekord jest dodawany (lub usuwany), wprowadzenie każdego nowego rekordu wymaga uaktualnienia wewnętrznego indeksowania. Jeśli w tabeli istnieje dziesięć indeksów, Access dziesięć razy aktualizuje indeksy przy każdej operacji dodawania lub usuwania rekordu. W przypadku rozbudowanych tabel powoduje to zauważalne opóźnienia (szczególnie w przypadku wolnych komputerów). Czasami modyfikacja danych w rekordach powoduje konieczność aktualizacji mechanizmu indeksowania. Jest tak w przypadku, gdy modyfikacja powoduje zmianę pozycji rekordu na liście sortowania lub wyniku kwerendy. Z tego powodu w przypadku pracy z dużymi, ciągle zmieniającymi się zbiorami danych, w których rzadko wykonuje się operacje wyszukiwania, można zrezygnować z indeksowania pól w tabeli lub poindeksować tylko te pola, według których będzie wykonywane wyszukiwanie. Projektanci baz danych Accessa zwykle zaczynają od stosowania najprostszych indeksów, składających się z jednego pola, a następnie, w miarę coraz lepszego poznawania procesu, zaczynają podążać w kierunku indeksów bardziej skomplikowanych. Należy jednak pamiętać o kompromisie między zwiększeniem wydajności wyszukiwania a kosztem obliczeniowym związanym z utrzymywaniem wielu indeksów w tabelach. Należy również pamiętać o tym, że indeksowanie nie modyfikuje fizycznego rozmieszczenia rekordów w tabeli. Naturalny porządek rekordów (porządek, w jakim rekordy dodawano do tabeli) jest utrzymywany także po ustanowieniu indeksu. Proces kompaktowania i naprawy bazy danych Accessa wymusza odtwarzanie indeksów we wszystkich tabelach. Dodatkowo fizycznie przeorganizowuje tabele w plikach .accdb zgodnie z porządkiem klucza głównego. Przeprowadzanie zabiegów konserwacyjnych daje pewność działania baz danych Accessa z maksymalną wydajnością.
Drukowanie struktury tabeli Strukturę tabeli można wydrukować poprzez kliknięcie przycisku Dokumentator bazy danych z grupy Analiza zakładki NARZĘDZIA BAZY DANYCH wstążki Accessa. Grupa Analiza zawiera szereg narzędzi ułatwiających tworzenie dokumentacji obiektów bazy danych. Kliknięcie przycisku Dokumentator bazy danych powoduje wyświetlenie okna dialogowego, w którym można wybrać obiekty przeznaczone do wydrukowania. Na rysunku 3.19 w zakładce Tabele dokumentatora bazy danych wybrano tabelę tblCustomers. Można też ustawić wiele opcji drukowania. Po kliknięciu przycisku Opcje wyświetla się okno dialogowe Drukowanie definicji tabel, w którym można wybrać, jakie informacje na temat struktury tabeli wydrukować (zobacz rysunek 3.20). Mogą to być na przykład nazwy pól, wszystkie ich właściwości, indeksy, a nawet uprawnienia sieciowe. Nie należy wybierać zbyt wielu opcji w oknie dialogowym Drukowanie definicji tabel. Drukowanie wszystkich detali projektu tabeli wiąże się ze zużyciem mnóstwa papieru. Najlepiej wydrukować kilka niezbędnych informacji, a szczegóły dodawać tylko wtedy, gdy jest to konieczne.
112
Część II Tabele Accessa
Rysunek 3.19. Okno dialogowe Dokumentator bazy danych
Rysunek 3.20. Opcje drukowania w oknie dialogowym Drukowanie definicji tabel
Po wybraniu danych do wydrukowania Access generuje raport. Można go przeglądać w widoku podglądu bądź w widoku wydruku albo wysłać do drukarki. Można również zapisać raport w bazie danych jako część dokumentacji aplikacji. Dokumentator bazy danych tworzy tabelę zawierającą wszystkie wybrane obiekty i ich właściwości. Za jego pomocą można tworzyć dokumentację obiektów bazy danych, takich jak formularze, kwerendy, raporty, makra i moduły.
Zapisywanie ukończonej tabeli Ukończoną strukturę tabeli możesz zapisać, wybierając z menu Plik opcję Zapisz lub klikając przycisk Zapisz znajdujący się na pasku narzędzi Szybki dostęp w lewym górnym rogu środowiska Accessa. Jeżeli zapisujemy tabelę po raz pierwszy, Access zapyta o nazwę dla niej. Nazwy tabel mogą mieć do 64 znaków długości i muszą spełniać standardowe kryteria Accessa dotyczące nazw obiektów (nazwy mogą obejmować litery i cyfry, nie mogą rozpoczynać się od cyfry i nie mogą zawierać znaków przestankowych). Tabelę można także zapisać w trakcie jej zamykania. Jeśli tabelę zapisaliśmy wcześniej, a teraz chcemy ją zapisać pod inną nazwą, wystarczy wybrać z menu Plik opcję Zapisz jako, a następnie wpisać wybraną nazwę. Spowoduje
Rozdział 3. Tworzenie tabel
113
to utworzenie nowej struktury tabeli, przy czym istniejąca tabela o pierwotnej nazwie pozostanie nienaruszona. Aby usunąć starą tabelę, należy zaznaczyć ją w okienku nawigacji, a następnie nacisnąć klawisz Delete.
Operacje na tabelach Po utworzeniu wielu tabel można wykorzystać je w innych bazach danych lub skopiować je i używać jako kopii zapasowych. W wielu przypadkach interesuje nas skopiowanie samego projektu tabeli, bez danych. W okienku nawigacji można wykonywać wiele operacji na tabelach. Są to między innymi:
zmiana nazwy tabel,
usuwanie tabel,
kopiowanie tabel w obrębie bazy danych,
kopiowanie tabel do innej bazy danych.
Operacje te można wykonać bezpośrednio lub korzystając z opcji menu.
Zmiana nazwy tabel Nazwę tabeli można zmienić, klikając wybraną tabelę prawym przyciskiem myszy i wybierając opcję Zmień nazwę z menu podręcznego. Po zmianie nazwy tabeli wyświetli się ona na odpowiedniej pozycji na liście tabel posortowanych alfabetycznie. Po zmianie nazwy tabeli trzeba także zmienić tę nazwę we wszystkich obiektach, które się do niej odwołują (kwerendach, formularzach, raportach).
Usuwanie tabel Tabelę można usunąć, zaznaczając ją w okienku nawigacji i naciskając klawisz Delete. Innym sposobem jest kliknięcie tabeli prawym przyciskiem myszy i wybranie polecenia Usuń z menu podręcznego. Tak jak w większości operacji usuwania trzeba potwierdzić zamiar usunięcia poprzez kliknięcie w wyświetlonym oknie dialogowym przycisku Tak. Należy pamiętać, że przytrzymanie klawisza Shift przed wciśnięciem klawisza Delete spowoduje usunięcie tabeli (lub dowolnego innego obiektu bazy danych) bez wyświetlania potwierdzenia, Kombinacja klawiszy Shift+Delete jest przydatna do usuwania obiektów bazy danych. Może ona być jednak niebezpieczna w przypadku niezbyt ostrożnego korzystania z niej.
Kopiowanie tabel w obrębie bazy danych Dowolną tabelę w bazie danych można skopiować za pomocą opcji wycinania i wklejania z grupy Schowek na zakładce NARZĘDZIA GŁÓWNE. Podczas wklejania tabeli do bazy danych wyświetla się okno dialogowe Wklejanie tabeli jako. W tym oknie należy wybrać jedną z trzech opcji:
114
Część II Tabele Accessa
Tylko struktura — wybranie pierwszej opcji spowoduje utworzenie nowej pustej tabeli o tej samej strukturze co kopiowana tabela. Za pomocą tej opcji zwykle tworzy się tabele tymczasowe lub archiwalne, do których można kopiować stare rekordy.
Struktura i dane — powoduje utworzenie kompletnej kopii struktury wybranej tabeli razem ze wszystkimi danymi.
Dołącz dane do istniejącej tabeli — powoduje dodanie danych z wybranej tabeli na końcu innej tabeli. Jest to przydatne w sytuacjach łączenia ze sobą tabel, na przykład w przypadku dodawania danych dotyczących transakcji miesięcznych do tabeli zawierającej dane z całego roku.
Aby skopiować tabelę, wykonaj następujące czynności: 1. Kliknij prawym przyciskiem myszy nazwę tabeli w okienku nawigacji i wybierz polecenie Kopiuj z menu podręcznego lub kliknij przycisk Kopiuj w grupie Schowek na zakładce NARZĘDZIA GŁÓWNE. 2. Wybierz polecenie Wklej z menu podręcznego lub kliknij przycisk Wklej w grupie Schowek na zakładce NARZĘDZIA GŁÓWNE. Pojawi się okno dialogowe Wklejanie tabeli jako (zobacz rysunek 3.21). Rysunek 3.21. Próba wklejenia tabeli powoduje wyświetlenie okna dialogowego Wklejanie tabeli jako
3. Wpisz nazwę nowej tabeli. Aby dołączyć dane do istniejącej tabeli, należy w polu Nazwa tabeli wpisać nazwę istniejącej tabeli (zobacz następny krok). 4. W oknie dialogowym Wklejanie tabeli jako wybierz jedną z opcji wklejania (Tylko struktura, Struktura i dane, Dołącz dane do istniejącej tabeli). 5. Kliknij OK, aby zakończyć operację.
Kopiowanie tabel do innej bazy danych Tak jak można kopiować tabele w obrębie jednej bazy danych, można również kopiować je do innych baz. Jest wiele powodów, dla których się to robi. Na przykład możliwe jest, że jedna tabela występuje w wielu systemach lub trzeba utworzyć kopię bezpieczeństwa ważnych tabel. W trakcie kopiowania tabel do innej bazy danych nie są kopiowane relacje między tabelami — Access kopiuje jedynie struktury i dane. Metoda kopiowania tabeli do innej bazy danych jest w zasadzie taka sama jak w przypadku kopiowania dokonywanego w obrębie jednej bazy:
Rozdział 3. Tworzenie tabel
115
1. Kliknij prawym przyciskiem myszy nazwę tabeli w okienku nawigacji i wybierz polecenie Kopiuj z menu podręcznego lub kliknij przycisk Kopiuj w grupie Schowek na zakładce NARZĘDZIA GŁÓWNE. 2. Otwórz inną bazę danych Accessa i wybierz polecenie Wklej z menu podręcznego albo kliknij przycisk Kopiuj w grupie Schowek na zakładce NARZĘDZIA GŁÓWNE. Pojawi się okno dialogowe Wklejanie tabeli jako. 3. Wpisz nazwę nowej tabeli. 4. Wybierz jedną z opcji wklejania (Tylko struktura, Struktura i dane, Dołącz dane do istniejącej tabeli). 5. Kliknij OK, aby zakończyć operację.
Dodawanie rekordów do tabeli bazy danych Dodawanie rekordów do tabeli jest bardzo proste: wystarczy zaznaczyć i kliknąć wybraną nazwę tabeli w okienku nawigacji, aby wyświetlić ją w widoku arkusza danych, a po jej otwarciu można wpisywać dane w każdym polu. Dodawanie rekordów do tabeli w widoku arkusza danych przedstawia rysunek 3.22. Rysunek 3.22. Dodawanie rekordów do tabeli w widoku arkusza danych
Informacje można wpisywać we wszystkich polach z wyjątkiem pola CustomerID. Wartości w polach typu Autonumerowanie są uzupełniane automatycznie. Chociaż rekordy można wpisywać za pomocą arkusza danych bezpośrednio do tabeli, to nie jest to najbardziej efektywna metoda. Lepiej dodawać rekordy za pomocą formularzy, ponieważ kod dołączony do formularzy umożliwia dynamiczne wstawianie wartości domyślnych (np. na podstawie danych wcześniej wprowadzonych w formularzu). Formularze pozwalają również komunikować się z użytkownikami podczas procesu wprowadzania danych.
116
Część II Tabele Accessa
Posługiwanie się polami typu Załącznik Microsoft zauważył, że projektanci baz danych muszą pracować z wieloma różnymi typami danych. Chociaż tradycyjne typy danych Accessa (Krótki tekst, Waluta, Obiekt OLE itp.) umożliwiają obsługę wielu różnych typów danych, do niedawna nie było możliwości wykorzystania kompletnych plików jako danych Accessa bez przeprowadzania pewnych transformacji (np. konwersji do postaci danych OLE). Od Accessa 2010 istnieje typ Załącznik, który pozwala dołączać do baz danych Accessa całe pliki jako załączniki pól tabeli. Kliknięcie pola typu Załącznik powoduje wyświetlenie niewielkiego okna dialogowego (zobacz rysunek 3.23), które umożliwia wskazanie plików dołączanych do tabeli. Rysunek 3.23. Zarządzanie załącznikami dla pól typu Załącznik
Kliknięcie przycisku Dodaj w oknie dialogowym na rysunku 3.23 powoduje wyświetlenie znajomego windowsowego okna Wybierz pliki, pozwalającego wyszukać pliki, które mają zostać dołączone do pola. Wybrane pliki są dodawane do listy widocznej na rysunku 3.23. Zwróćmy również uwagę na to, że w oknie dialogowym Załączniki znajdują się przyciski służące do usuwania załączników pola i zapisywania załączników na dysku komputera. Ważną informacją do zapamiętania dotyczącą typu danych Załącznik jest fakt, iż pojedyncze pole załącznika w tabeli umożliwia załączenie wielu plików różnych typów. W obrębie jednego pola typu Załącznik można zapisać dokument Worda, kilka klipów wideo lub audio, a także zdjęcia. W związku z tym, że dane załączników stają się częścią bazy danych, dodanie wielu załączników do tabeli spowoduje szybki wzrost rozmiaru pliku .accdb. Z typu danych Załącznik należy korzystać tylko wtedy, gdy korzyści z jego zastosowania są większe niż problemy.
Rozdział 4.
Relacje między tabelami W tym rozdziale:
Projektowanie baz danych odpornych na błędy
Normalizacja danych w bazie danych
Omówienie typowych relacji między tabelami
Reguły integralności specyficzne dla aplikacji
Dodawanie pól kluczowych do tabel
We wcześniejszej części tej książki omówiliśmy jedno z najbardziej podstawowych założeń dotyczących relacyjnych systemów baz danych — dane są rozdzielone na pewną liczbę tabel, które są ze sobą powiązane za pomocą kluczy głównych i obcych. Chociaż tę prostą zasadę łatwo zrozumieć, znacznie trudniej nauczyć się tego, w jaki sposób i w jakich sytuacjach dane należy umieszczać w osobnych tabelach. Ponieważ dane zarządzane przez relacyjną bazę danych (taką jak Access) występują w wielu różnych tabelach, musi istnieć sposób na ich powiązanie. Im wydajniej baza danych obsługuje te powiązania, tym lepiej i w bardziej elastyczny sposób działa aplikacja jako całość. Chociaż bazy danych powinny odzwierciedlać sytuacje ze świata rzeczywistego lub co najmniej zarządzać danymi występującymi w rzeczywistych sytuacjach, nawet najbardziej skomplikowaną sytuację można sprowadzić do kilku relacji między tabelami. W miarę wzrostu złożoności danych zarządzanych przez bazę może wystąpić potrzeba dodania większej liczby tabel do projektu. Na przykład, baza danych zarządzająca sprawami dotyczącymi pracowników firmy będzie zawierać tabele zawierające informacje o pracownikach (nazwisko, numer NIP, adres, data zatrudnienia, itp.), informacje płacowe, programy udziału w zyskach dotyczące danego pracownika itp. W tym rozdziale wykorzystano dane pochodzące z różnych aplikacji, m.in. z Northwind Traders (tradycyjnej przykładowej bazy danych Accessa), przykładu małej księgarni oraz aplikacji MiniAuta dla Kolekcjonerów — aplikacji używanej w pozostałych rozdziałach tej książki. Każdy zbiór danych ma nieco odmienne przeznaczenie od pozostałych i służy do podkreślenia różnych aspektów teorii relacji. Wszystkie tabele opisywane w tym rozdziale można znaleźć w bazie danych Rozdział04.accdb.
118
Część II Tabele Accessa
Jednak podczas pracy z rzeczywistymi danymi w określonym momencie koncentrujemy się na związkach pomiędzy dwiema tabelami. Można najpierw stworzyć tabele z informacjami o pracownikach oraz płacach i połączyć te tabele za pomocą relacji tak, by można było łatwo znaleźć informacje płacowe dotyczące pracownika. W tym rozdziale wykorzystano różne dane z bazy Rozdział04.accdb. Jeżeli ktoś jeszcze nie skopiował jej do swojego komputera, powinien zrobić to teraz. Aby prześledzić przykłady, można skorzystać z tabel tej bazy danych albo utworzyć tabele samodzielnie w innej bazie danych.
Tworzenie kuloodpornych baz danych W rozdziałach 1., 2. i 3. zaprezentowaliśmy przykłady znanych relacji występujących w wielu bazach danych Accessa. Zdecydowanie najbardziej powszechnym typem relacji jest relacja jeden do wielu. W aplikacji MiniAuta dla Kolekcjonerów występuje bardzo dużo takich relacji. Każdy rekord w tabeli klientów jest powiązany z jednym lub wieloma rekordami w tabeli transakcji (każdy klient może zakupić w systemie MiniAuta dla Kolekcjonerów wiele towarów). Relacje jeden do wielu opisano bardziej szczegółowo w dalszej części tego rozdziału, w podrozdziale „Relacje między tabelami”. Z łatwością można sobie wyobrazić projekt, w którym dane z tabel klientów i transakcji znalazłyby się w jednej tabeli. Wystarczyłoby utworzyć osobny wiersz dla każdego zamówienia złożonego przez każdego z klientów. W miarę składania nowych zamówień następowałoby dodawanie nowych wierszy zawierających informacje dotyczące klientów i składanych przez nich zamówień. Przykładem takiego układu jest tabela Accessa pokazana na rysunku 4.1. Na tym rysunku kolumna OrderID zawiera numer zamówienia złożonego przez klient (dane w tej tabeli posortowano według kolumny CustomerID, aby pokazać ile zamówień złożył każdy z klientów). Tabelę przedstawioną na rysunku 4.1 utworzono poprzez połączenie tabel Customers i Orders z przykładowej bazy danych Northwind Traders. Tabela ta znajduje się w pliku bazy danych Rozdział04.accdb w przykładach dołączonych do tej książki. Zwróćmy uwagę na kolumnę OrderID z prawej strony kolumny CompanyName. Każdy klient (np. firma Alfreds Futterkiste) złożył pewną liczbę zamówień. Kolumny z prawej strony tabeli (poza prawą krawędzią widoczną na rysunku) zawierają dodatkowe informacje dotyczące każdego klienta włącznie z adresem i numerem telefonu, natomiast dalsze kolumny zawierają szczegóły dotyczące zamówień. Ogółem tabela ta zawiera 24 różne pola. Układ pokazany na rysunku 4.1 występuje w sytuacji, kiedy w roli bazy danych wykorzystuje się aplikację arkusza kalkulacyjnego, na przykład Excel. Ponieważ Excel jest arkuszem kalkulacyjnym, nie obsługuje podziału danych na oddzielne tabele i zachęca użytkowników do przechowywania wszystkich danych w jednym, rozbudowanym arkuszu. Z takim układem wiąże się kilka problemów:
Tabela szybko rozrasta się do rozmiarów, które utrudniają jej zarządzanie. W tabeli Contacts bazy Northwind Traders jest 11 różnych pól, natomiast w tabeli Orders jest ich 14. W obu tabelach jest tylko jedno pole wspólne — OrderID.
Rozdział 4. Relacje między tabelami
119
Rysunek 4.1. Tabela Accessa zawierająca dane dotyczące zarówno klientów, jak i zamówień
Za każdym razem, kiedy składane jest zamówienie, wszystkie 24 pola danych są dodawane do każdego rekordu w połączonej tabeli. Dodawanych jest także bardzo dużo danych niezwiązanych bezpośrednio z zamówieniem (np. nazwisko kontaktu czy stanowisko kontaktu).
Dane są trudne do utrzymania i aktualizacji. Wprowadzenie niewielkiej modyfikacji danych w rozbudowanej tabeli (np. zmiana numeru telefonu klienta lub numeru faksu) wymaga wyszukania wszystkich rekordów w tabeli dotyczących klienta i zmiany wszystkich wystąpień numeru telefonu. Z łatwością można popełnić błąd lub pominąć jedno lub kilka wystąpień. Im mniej rekordów wymaga zmian, tym lepiej dla użytkownika.
Monolityczny projekt tabeli to marnotrawstwo miejsca na dysku i innych zasobów. Ponieważ w połączonej tabeli jest zapisanych mnóstwo redundantnych danych (np. adres klienta powtarza się dla każdej transakcji), znaczącą ilość miejsca na dysku zajmują nadmiarowe dane. Oprócz zmarnotrawionego miejsca na dysku w nieekonomiczny sposób wykorzystuje się przepustowość sieci, pamięć i inne zasoby.
Znacznie lepszy jest projekt relacyjny, w którym powtarzające się dane są zapisane w osobnej tabeli. W takim przypadku dane z jednej tabeli służą jako odwołanie do informacji z drugiej tabeli. Dodatkowe pole, jakie trzeba zdefiniować w przypadku relacyjnego modelu danych, to niewielka cena w porównaniu z wydajnością uzyskaną dzięki przeniesieniu redundantnych danych poza tabelę. Druga olbrzymia korzyść z normalizacji danych i zastosowania ścisłych zasad projektowania baz danych w aplikacjach Accessa polega na tym, że dane stają się praktycznie kuloodporne. W prawidłowo zaprojektowanej i zarządzanej bazie danych użytkownicy
120
Część II Tabele Accessa
mają pewność, że informacje wyświetlane na formularzach i w raportach odzwierciedlają dane przechowywane w tabelach. Źle zaprojektowane bazy danych są podatne na uszkodzenia. Z tego powodu czasami dochodzi do „zagubienia” danych, które nigdy nie pojawią się na formularzach i w raportach, pomimo tego, że użytkownicy dodawali dane do aplikacji. Czasami może dojść również do zwracania przez kwerendy aplikacji błędnych danych. W każdym z takich przypadków bazom danych nie można ufać. Użytkownicy nigdy nie mają pewności, że dane, które widzą na formularzach i w raportach, są prawidłowe. Użytkownicy zwykle ufają temu, co się wyświetla na ekranie lub jest wydrukowane na papierze. Wyobraźmy sobie problemy, jakie mogłyby wyniknąć, gdyby klientowi nie została wystawiona faktura za transakcję lub gdyby doszło do nieprawidłowego zaktualizowania stanów magazynowych. Zły projekt bazy danych nie wróży niczego dobrego. Projektanci baz danych są odpowiedzialni za to, aby projektowane przez nich aplikacje były jak najdokładniejsze i jak najbardziej odporne na różnorodne sytuacje. Stosowanie się do reguł normalizowania danych pomaga osiągnąć te cele.
Normalizacja i denormalizacja danych Proces podziału danych na wiele tabel określa się terminem normalizacja. Jest kilka faz normalizacji. Pierwsza do trzeciej postaci normalnych są najłatwiejsze do zrozumienia oraz zaimplementowania i wystarczają w większości zastosowań. Choć istnieją wyższe poziomy normalizacji, zazwyczaj ignorują je wszyscy projektanci z wyjątkiem najbardziej doświadczonych i najbardziej drobiazgowych. Aby zilustrować proces normalizacji, posłużymy się niewielką bazą danych, z której mógłby korzystać hurtownik książek do rejestrowania zamówień składanych przez niewielkie księgarnie rozmieszczone w terenie. Baza danych powinna zawierać następujące informacje:
daty złożenia zamówień książek;
dane klientów, którzy złożyli zamówienie;
liczba zamówionych książek;
tytuły zamówionych książek.
Chociaż ten zbiór danych jest bardzo prosty, zawiera typowe dane zarządzane w aplikacjach Accessa i pozwala zademonstrować sposób normalizacji zbioru danych.
Pierwsza postać normalna Pierwsza faza normalizacji, nazywana pierwszą postacią normalną (w skrócie 1NF — od ang. first normal form), wymaga, aby tabela spełniała następującą regułę: Każda komórka tabeli musi zawierać pojedynczą wartość. W tabeli nie mogą występować powtarzające się grupy danych. Za tabelę uważa się dwuwymiarową strukturę danych, a zapisywanie wielu wartości w polu lub zezwolenie na powtarzające się grupy wewnątrz tabeli sugeruje występowanie trzeciego wymiaru danych. Pierwszą próbę stworzenia tabeli do zarządzania zamówieniami księgarni (tblBookOrders1) pokazano na rysunku 4.2. Zwróćmy uwagę, że niektóre
Rozdział 4. Relacje między tabelami
121
Rysunek 4.2. Nieznormalizowana tabela tblBookOrders1
księgarnie zamówiły więcej niż jedną książkę. Wartość 7 Magia ciastek w polu BookTitles oznacza, że klient zamówił 7 egzemplarzy książki pod tytułem Magia ciastek. Przechowywanie w tej samej komórce zarówno liczby, jak i nazwy to jedno z kilku naruszeń pierwszej postaci normalnej przez projekt tej tabeli. Tabela na rysunku 4.2 prezentuje zastosowanie płaskiej struktury baz danych (ang. flat-file). Dane w bazach danych o płaskiej strukturze są zapisane w dwóch wymiarach (wierszach i kolumnach). Pominięto w nich trzeci wymiar (powiązane tabele) możliwy do zaimplementowania w relacyjnych systemach baz danych takich jak Microsoft Access. Zwróćmy uwagę, że tabela na rysunku 4.2 narusza regułę pierwszej postaci normalnej. Wartość w polu BookTitle w wielu rekordach w tej tabeli zawiera więcej niż jedną wartość. Na przykład książka zatytułowana Domowe wędzonki występuje w rekordach 7. i 8. Obsługa takich danych jest bardzo trudna — aby odwołać się do książek zamówionych przez księgarnie, trzeba parsować dane zapisane w polu BookTitle i na tej podstawie stwierdzić, jakie książki zostały zamówione przez poszczególne księgarnie. Nieco lepszy projekt pokazano na rysunku 4.3 (tblBookOrders2). Liczby egzemplarzy poszczególnych książek przeniesiono do osobnych kolumn. W dalszym ciągu jednak każdy wiersz zawiera wszystkie dane pojedynczego zamówienia. Dzięki takiemu projektowi odczytanie informacji o liczbie egzemplarzy określonych tytułów jest nieco łatwiejsze. Wciąż jednak występują powtarzające się grupy dla liczb i tytułów (kolumny Quant1, Title1, Quant2, Title2 itd.), które naruszają regułę pierwszej postaci normalnej. Wysokość wiersza w tabeli na rysunku 4.3 zwiększono po to, by można było łatwiej zaprezentować układ tabeli. Projekt tabeli zamieszczonej na rysunku 4.3 ciągle jest nieelegancki, a praca z taką tabelą jest trudna. Kolumny służące do zapisywania liczby egzemplarzy i tytułów są stałą cechą tabeli. Projektant musi dodać wystarczającą liczbę kolumn, pozwalającą na zapisanie informacji o maksymalnej liczbie książek, jakie można zakupić w księgarni. Oto przykład. Załóżmy, że projektant prognozuje, iż wybrana księgarnia nigdy jednorazowo nie zamówi więcej niż 50 tytułów. Oznacza to konieczność dodania 100 kolumn do tabeli (dla każdego zamawianego tytułu potrzebne są dwie kolumny — z liczbą egzemplarzy i tytułem). Jeśli księgarnia zamówi jeden tytuł, 98 kolumn w tabeli będzie pustych — jest to czyste marnotrawstwo i przykład nieekonomicznego wykorzystania miejsca na dysku.
122
Część II Tabele Accessa
Rysunek 4.3. Projekt tabeli nieznacznie poprawiony w stosunku do poprzedniego
W przypadku projektu pokazanego na rysunku 4.3 odpytanie tabeli tblBookOrders2 w celu uzyskania informacji o sprzedaży określonej książki jest bardzo trudne. Liczby sprzedanych egzemplarzy dla poszczególnych książek są rozproszone po całej tabeli. Występują w różnych wierszach i różnych kolumnach. W związku z tym nie wiadomo, gdzie szukać informacji dotyczących transakcji. Co więcej, jeśli jakieś zamówienie przekroczy liczbę 50 tytułów, konieczna będzie aktualizacja projektu — dodanie kolumn potrzebnych dla kolejnego tytułu. Oczywiście można by tego uniknąć poprzez dodanie kolejnego wiersza dla wybranego zamówienia, ale w ten sposób praca z danymi stanie się jeszcze trudniejsza. Na rysunku 4.4 pokazano projekt tabeli tblBookOrders3 — tabelę w pierwszej postaci normalnej stworzoną na podstawie danych z rysunku 4.3. W tabeli tblBookOrders3 zamiast umieszczać zamówienia wielu książek w jednym rekordzie, każdy rekord zawiera informację o jednym tytule zamówionym przez klienta. Potrzebnych jest więcej rekordów, ale obsługa danych jest znacznie łatwiejsza. Pierwsza postać normalna jest bardziej wydajna, ponieważ w tabeli nie ma nieużywanych pól. Każde pole spełnia rolę zgodną z przeznaczeniem tabeli. Tabela z rysunku 4.4 zawiera te same dane co tabele z rysunków 4.2 i 4.3. Nowy projekt zapewnia jednak znacznie łatwiejszą pracę z danymi. Na przykład można łatwiej utworzyć kwerendę, która zwraca całkowitą liczbę książek zamówionych przez określonego klienta, lub sprawdzającą, jakie książki zamówiła wskazana księgarnia. Tabele zawsze powinny znajdować się w pierwszej postaci normalnej. Należy zadbać o to, aby każda komórka w tabeli zawierała pojedynczą wartość, a nie kombinację kilku wartości. Nie może być także powtarzających się grup (jak pokazano na rysunku 4.3).
Rozdział 4. Relacje między tabelami
123
Rysunek 4.4. Pierwsza postać normalna
Optymalizacja projektu tabeli nie kończy się jednak w tym momencie. Tabela BookOrders, a także inne tabele z tej aplikacji wymagają jeszcze wiele pracy. Tabela pokazana na rysunku 4.4 zawiera wiele redundantnych informacji. Tytuły książek powtarzają się za każdym razem, kiedy klienci zamówią tę samą książkę, a numer zamówienia i data zamówienia powtarzają się dla każdego wiersza zawierającego informacje o zamówieniu. Bardziej subtelny błąd polega na tym, że pola OrderID nie można używać jako klucza głównego tabeli. Ponieważ identyfikator zamówienia powtarza się dla każdego tytułu książki w zamówienia, nie można go używać do identyfikacji każdego rekordu w tabeli. Zamiast tego OrderID jest polem kluczowym tabeli. Można z niego korzystać w celu wyszukiwania wszystkich rekordów odpowiadających określonemu zamówieniu. Sytuację tę naprawimy w drugiej fazie optymalizacji.
Druga postać normalna Bardziej wydajny projekt można uzyskać w wyniku rozdzielenia danych z tabeli tblBook. Orders na dwie osobne tabele w celu uzyskania drugiej postaci normalnej (2NF). Oto druga reguła normalizacji: Dane, które nie zależą bezpośrednio od klucza głównego tabeli, należy przenieść do osobnej tabeli. Reguła ta oznacza, że tabela powinna zawierać dane reprezentujące jeden podmiot. Ponieważ stopniowo przekształcaliśmy jedną nieznormalizowaną tabelę na znormalizowaną postać, w tabeli tblBookOrders3 nie ma klucza głównego. Na razie można zignorować ten fakt i potraktować każdy wiersz tabeli jak encję. Wszystkie dane z tego wiersza, które nie są integralną częścią danej encji, należy przenieść do innej tabeli. W tabeli tbl BookOrders3 ani pole klienta, ani pole tytułu nie są integralną częścią zamówienia, dlatego trzeba je umieścić w innej tabeli.
124
Część II Tabele Accessa
Identyfikowanie encji Czy jednak klienci nie są integralnym aspektem zamówienia? To prawda, są. Jednak dane zapisane w polu klienta w tabeli tblBookOrders3 to nazwa klienta. Jeśli firma zmieni nazwę, nie wpłynie to na zamówienie. Także książka jest integralnym aspektem zamówienia, ale jej tytuł już nim nie jest. Aby rozwiązać ten problem, trzeba utworzyć odrębne tabele klientów i książek. Najpierw utwórzmy nową tabelę tblBookStores (zobacz rysunek 4.5). Rysunek 4.5. Przenoszenie danych o klientach do odrębnej tabeli
Aby utworzyć tabelę tblBookStores, wykonaj następujące czynności: 1. Kliknij przycisk Projekt tabeli na zakładce TWORZENIE na wstążce. 2. Dodaj pole BookStoreID typu Autonumerowanie. 3. Kliknij przycisk Klucz podstawowy na zakładce NARZĘDZIA TABEL PROJEKTOWANIE na wstążce. 4. Dodaj pole StoreName typu Krótki tekst. 5. Ustaw długość pola StoreName na 50. 6. Zapisz tabelę pod nazwą tblBookStores. Możliwe, że przydatne będą dodatkowe informacje na temat klientów, np. adres e-mail lub numer telefonu. Jednak na razie celem jest uzyskanie drugiej postaci normalnej przez przeniesienie danych, które nie są integralną częścią zamówienia, do odrębnej tabeli. Teraz utwórzmy tabelę na książki. W tym celu wykonaj następujące kroki: 1. Kliknij przycisk Projekt tabeli na zakładce TWORZENIE na wstążce. 2. Dodaj pole BookID typu Autonumerowanie. 3. Kliknij przycisk Klucz podstawowy na zakładce NARZĘDZIA TABEL PROJEKTOWANIE na wstążce.
Rozdział 4. Relacje między tabelami
125
4. Dodaj pole BookTitle typu Krótki tekst. 5. Zapisz tabelę pod nazwą tblBooks. Klient i książka są integralną częścią zamówienia (natomiast nie są nią nazwa firmy ani tytuł książki), dlatego potrzebny jest sposób na powiązanie tabel ze sobą. Choć klient może zmienić nazwę firmy, nie może zmodyfikować identyfikatora BookStoreID, ponieważ sami go utworzyliśmy i kontrolujemy tę wartość. Podobnie wydawnictwo może zmienić tytuł książki, ale nie zmodyfikuje identyfikatora BookID. Klucze główne tabel tblBookStores i tblBooks dobrze nadają się do wskazywania powiązanych obiektów. Zmiany innych danych nie stanowią tu problemu. Na rysunku 4.6 widoczne są trzy tabele. Tabela tblBookOrders3 zamiast nazwy klienta i tytułu książki zawiera klucze główne powiązanych rekordów z tabel tblBookStores i tbl Books. Gdy klucz główny jednej tabeli jest używany w polu innej tabeli, jest nazywany kluczem obcym.
Rysunek 4.6. Pierwszy krok doprowadzania tabeli do drugiej postaci normalnej
Gdyby przed przeniesieniem danych klientów do odrębnej tabeli nastąpiła zmiana nazwy Księgarnia Centrum na Księgarnia Centralna, konieczne byłoby znalezienie w tabeli tblBookOrders3 wszystkich wierszy dotyczących klienta Księgarnia Centrum i zmiana wartości pola w każdym z tych wierszy. Przeoczenie nazwy klienta podczas takiego procesu określa się mianem anomalii aktualizacji. Jej efektem są rekordy niespójne z innymi rekordami zapisanymi w bazie danych. Z punktu widzenia bazy danych Księgarnia Centrum oraz Księgarnia Centralna to dwie zupełnie różne firmy, chociaż my wiemy, że chodzi o ten sam sklep. Z powodu anomalii aktualizacji w wynikach kwerendy wybierającej wszystkie zamówienia złożone
126
Część II Tabele Accessa
przez Księgarnię Centralną nie będzie tych, dla których w polu z nazwą klienta jest wartość Księgarnia Centrum. Inną zaletą usunięcia nazwy klienta z tabeli zamówień jest fakt, iż po tej operacji nazwa będzie występowała tylko w jednym miejscu w bazie danych. Jeśli Księgarnia Centrum zmieni nazwę na Księgarnia Centralna, zmianę tę trzeba będzie uwzględnić tylko w tabeli tblBookStores. Ta jedna zmiana będzie obowiązywała w całej bazie danych, włącznie z wszystkimi formularzami i raportami, w których użyto informacji o nazwie klienta. Identyfikowanie odrębnych encji i umieszczanie dotyczących ich danych w niezależnych tabelach to duży pierwszy krok w kierunku uzyskania drugiej postaci normalnej. Jednak to jeszcze nie koniec. W tabeli zamówień nadal nie ma pola z niepowtarzalnymi wartościami, które można wykorzystać jako klucz główny. W polu OrderID występują powtarzające się wartości, co wskazuje na to, że uzyskanie drugiej postaci normalnej wymaga jeszcze trochę pracy. Mniej oczywiste encje Klienci i książki to obiekty fizyczne, które łatwo jest zidentyfikować jako odrębne encje. Następny krok jest bardziej abstrakcyjny. W tabeli zamówień tblBookOrders4 nadal znajdują się informacje na temat dwóch odrębnych (choć powiązanych) encji. Jedną z nich jest samo zamówienie, a druga to szczegóły dotyczące zamówienia (jego poszczególne pozycje). Trzy pierwsze rekordy tabeli tblBookOrders4 (zobacz rysunek 4.6) mają te same wartości pól OrderID, OrderDate i BookStoreID. Te trzy pola to cechy całego zamówienia, a nie jego poszczególnych pozycji. W polach Quantity i BookID trzech pierwszych rekordów znajdują się różne wartości. Te pola to cechy konkretnej pozycji z zamówienia. Wartości powtarzające się w kilku rekordach (np. wartość pola OrderID w tabeli tblBookOrders2 na rysunku 4.6) wskazują na to, że dane nie są jeszcze w drugiej postaci normalnej. Niektóre dane, np. klucze obce, celowo się powtarzają. Inne, np. daty i liczby sztuk, powtarzają się z naturalnych powodów i nie są oznaką problemów.
Ostatni etap tworzenia drugiej postaci normalnej to umieszczenie informacji integralnych dla całego zamówienia w tabeli odrębnej od informacji dotyczących poszczególnych pozycji zamówienia. Utwórz nową tabelę tblBookOrderDetails. Umieść w niej pola Book. OrderDetailID, Quantity i BookID. Pole BookOrderDetailID jest typu Autonumerowanie i pełni funkcję klucza głównego. Pole BookID to klucz zewnętrzny, używany do powiązania dwóch tabel. Na rysunku 4.7 widoczna jest nowa tabela zamówień (tblBookOrders5) i nowa tabela ze szczegółowymi informacjami o zamówieniach (tblBookOrderDetails). Z tabeli tblBookOrders5 usunięto dawne pole OrderID, a w zamian utworzono pole o tej samej nazwie typu Autonumerowanie. Skoro w tabeli zamówień znajduje się już pole z niepowtarzalnymi wartościami, można ustawić je jako klucz główny. Wszystkie dane w każdym rekordzie tabeli tblBookOrders5 dotyczą bezpośrednio zamówienia. W kontekście drugiej postaci normalnej można stwierdzić, że wszystkie dane bezpośrednio zależą od klucza głównego.
Rozdział 4. Relacje między tabelami
127
Rysunek 4.7. Po uzyskaniu drugiej postaci normalnej
Pole OrderID w tabeli tblBookOrderDetails to klucz obcy służący do powiązania dwóch tabel ze sobą. Na rysunku 4.7 widać, że trzy pierwsze rekordy tabeli tblBookOrderDetails mają pole OrderID o wartości 1, są więc powiązane z pierwszym rekordem tabeli tblBook. Orders5. Wszystkie pola tabeli tblBookOrderDetails bezpośrednio zależą od klucza głównego BookOrderDetailID. Wartość z pierwszego rekordu, 10, dotyczy bezpośrednio danej pozycji zamówienia. Z całym zamówieniem powiązana jest tylko pośrednio, podobnie jak wartości z dwóch następnych rekordów (5 i 7). Ta pośrednia zależność powstaje w wyniku umieszczenia w rekordzie klucza obcego OrderID. Pierwotna tabela, tblBookOrders1, zawierała w każdym rekordzie dane dotyczące kilku różnych encji. W wyniku serii kroków podzieliliśmy dane na cztery tabele: tblBook Orders5, tblBookOrderDetails, tblCustomers i tblBooks. Każda z nich zawiera dane na temat jednej encji. Dane wreszcie udało się zapisać w drugiej postaci normalnej. Podział tabeli na kilka tabel, z których każda opisuje oddzielny aspekt danych, nazywa się dekompozycją. Jest to ważna część procesu normalizacji. Mimo że tabele wydają się mniejsze niż w pierwotnej tabeli (zobacz rysunek 4.2), dane zawarte w tabelach są takie same jak poprzednio. Programista korzystający z tabel bazy danych księgarni może używać kwerend do przetwarzania danych z czterech utworzonych tabel w nowy, interesujący sposób. Łatwo można sprawdzić, ile książek z każdego tytułu zamówili poszczególni klienci oraz ile razy zamawiano określoną książkę. W połączeniu z tabelą zawierającą takie informacje, jak cena jednostkowa książki, cena sprzedaży książki itp., można z łatwością określić istotne statystyki finansowe ważne dla hurtownika zajmującego się sprzedażą książek.
128
Część II Tabele Accessa
Zwróćmy także uwagę na to, że zmniejszyła się liczba rekordów w tabeli tblBookOrder5. Jest to jedna z kilku zalet korzystania z relacyjnych baz danych. W każdej tabeli znajduje się tylko tyle danych, ile potrzeba do reprezentowania encji (w tym przypadku zamówienia książek) opisywanej przez tabelę. Jest to dużo wydajniejszy sposób korzystania z danych niż dodanie zdublowanych wartości pól (zobacz rysunek 4.2) dla każdego nowego rekordu umieszczanego w tabeli. Łamanie reguł Od czasu do czasu może okazać się konieczne złamanie tych reguł. Na przykład załóżmy, że księgarnie są uprawnione do otrzymywania rabatów na podstawie rozmiaru zamówień w ciągu ostatniego roku. W przypadku ścisłego przestrzegania reguł normalizacji procent rabatu należałoby umieścić w tabeli tblBookStores. W końcu rabat zależy od klienta, a nie od zamówienia. Może się jednak zdarzyć, że rabat będzie stosowany do każdego zamówienia indywidualnie. Na przykład przedstawiciel handlowy uzyskał zgodę od właściciela hurtowni na specjalną obniżkę cen dla szczególnie cennych klientów. W takiej sytuacji można umieścić kolumnę z rabatem w tabeli zamówień, pomimo tego, że powoduje ona zapisywanie powtarzających się informacji w wielu rekordach. Można by zapisać tradycyjny rabat w rekordzie klienta w tabeli tblBookStores i wykorzystać go jako wartość domyślną dla kolumny z rabatem, a jednocześnie zezwolić handlowcom na modyfikację tej wartości w przypadku poczynienia z klientem specjalnych uzgodnień. Tylko na pozór rozwiązanie to narusza drugą postać normalną. Domyślny rabat jest bezpośrednio zależny od klienta. Konkretna wysokość rabatu zależy od zamówienia. Podobna sytuacja dotyczy adresu dostawy. Klient może chcieć, aby większość zamówień trafiała do niego. Czasem jednak może chcieć wysłać towar bezpośrednio do jego odbiorcy. Adres wysyłki jest bezpośrednio powiązany z klientem, natomiast adres, pod który należy wysłać konkretne zamówienie, zależy od danego zamówienia. W dużych bazach w tabelach obiektów często występują dane używane jako wartości domyślne w tabelach transakcji. Omówienie tabel obiektów i tabel transakcji znajdziesz w rozdziale 3.
Trzecia postać normalna Ostatnia faza normalizacji, zwana trzecią postacią normalną (3NF), wymaga usunięcia wszystkich pól, które można uzyskać na podstawie danych zawartych w innych polach tabeli bądź innych tabel bazy danych. Załóżmy na przykład, że menedżer handlowy upiera się, aby w tabeli z zamówieniami dodać pole zawierające całkowitą liczbę zamówionych książek. Informacje te można oczywiście obliczyć na podstawie pola Quantity z tabeli tblBookOrderDetails. Nie ma powodu, dla którego należałoby dodawać nowe pole OrderTotal do tabeli Orders. Access z łatwością może obliczyć tę wartość na podstawie danych dostępnych w bazie danych. Jedyną zaletą zapisywania całkowitej liczby książek w bazie danych jest zaoszczędzenie kilku milisekund, jakie Access potrzebuje do odczytania z bazy danych i obliczenia wartości potrzebnych w formularzu lub raporcie.
Rozdział 4. Relacje między tabelami
129
Usuwanie obliczanych danych z bazy pomaga zachować integralność danych w bazie. Na rysunku 4.7 widoczne są trzy rekordy tabeli tblBookOrderDetails związane z zamówieniem o identyfikatorze 1. Po podsumowaniu wartości z pola Quantity wiadomo, że zamówiono 22 książki. Gdyby dodano pole OrderTotal i błędnie zapisano w nim wartość 33 zamiast 22, dane byłyby niespójne. Raport wyświetlający łączną liczbę zamówionych książek na podstawie pola OrderTotal zawierałby inną wartość niż raport uzyskany dzięki obliczeniom. W zależności od tworzonej aplikacji można znaleźć istotne powody, dla których warto zapisywać obliczane dane w tabelach, zwłaszcza w przypadku, gdy wykonywanie obliczeń trwa długo lub jeśli zapisane wartości są potrzebne do sprawdzenia obliczonych wartości drukowanych na raportach. Może się okazać, że wykonywanie obliczeń podczas wprowadzania danych (kiedy dane są przetwarzane rekord po rekordzie) jest bardziej wydajne niż podczas drukowania raportów (kiedy wygenerowanie pojedynczego raportu wymaga przetworzenia wielu tysięcy rekordów). Więcej informacji na temat anomalii Warto zapamiętać kwestie dotyczące anomalii aktualizacji. Celem normalizacji tabel w bazie danych jest uzyskanie maksymalnej wydajności przy minimalnym nakładzie wysiłków związanych z utrzymaniem bazy danych. Projekt bazy danych, w którym nie przeprowadzi się normalizacji, jest narażony na wystąpienie trzech rodzajów błędów. Stosowanie się do reguł opisanych w tym rozdziale umożliwia uniknięcie następujących problemów:
Anomalie wprowadzania danych. W powiązanej tabeli występuje błąd w momencie dodania rekordu do innej tabeli. Załóżmy na przykład, że dodaliśmy pole OrderTotal opisane w poprzednim punkcie. Po przetworzeniu zamówienia klient modyfikuje liczbę zamówionych książek lub dodaje nowy tytuł do tego samego zamówienia. Jeśli projektant nie zadbał o to, by aplikacja bazy danych automatycznie uaktualniła obliczane pole OrderTotal, po dodaniu nowych danych do tabeli informacje w tym polu będą błędne.
Jeśli anomalie wprowadzania danych stanowią problem w aplikacji, można skorzystać z osadzanych makr (zobacz rozdział 22.), które pomogą w zsynchronizowaniu danych w tabelach po wprowadzeniu zmian.
Anomalie usuwania danych. Anomalie usuwania danych powodują przypadkową utratę danych po usunięciu rekordu z tabeli. Załóżmy, że w tabeli tblBookOrders3 jest nazwisko, adres oraz inne informacje kontaktowe dotyczące każdej z księgarń. Usunięcie ostatniego rekordu zawierającego informacje o zamówieniach określonego klienta powoduje nieumyślne usunięcie informacji o tym kliencie. Zapisanie informacji o kliencie w osobnej tabeli zabezpiecza przed możliwością przypadkowej utraty danych. Unikanie anomalii związanych z usuwaniem danych to jeden z powodów, dla których nie warto stosować kaskadowego usuwania rekordów w tabelach (więcej informacji na temat kaskadowego usuwania rekordów można uzyskać w dalszej części tego rozdziału, w podrozdziale „Relacje między tabelami”).
Anomalie aktualizacji danych. Zapisywanie w tabelach danych, które nie zależą od klucza głównego tabeli, powoduje konieczność aktualizacji wielu wierszy za każdym razem, kiedy zmienią się te informacje. Utrzymywanie niezależnych danych (np. informacji o księgarniach) w osobnej tabeli powoduje, że w przypadku zmiany danych trzeba je zaktualizować tylko w jednym miejscu (więcej informacji na temat anomalii związanych z aktualizacją danych można znaleźć we wcześniejszej części tego rozdziału, w podpunkcie „Identyfikowanie encji”).
130
Część II Tabele Accessa
W dalszej części tego rozdziału, w punkcie „Denormalizacja”, podano kilka dobrych powodów, dla których umieszczenie w bazie danych obliczonych pól może być korzystne. Najczęściej decyzja o denormalizacji wynika z potrzeby uzyskania pewności, że obliczona wartość zapisana w bazie danych jest identyczna z wydrukowaną w raporcie. Chociaż możliwe są także wyższe poziomy normalizacji, w większości aplikacji baz danych trzecia postać normalna w zupełności wystarcza. Minimalnym wymaganiem jest dążenie do pierwszej postaci normalnej polegające na przeniesieniu redundantnych, powtarzających się danych do innej tabeli.
Denormalizacja Po zaprezentowaniu wszystkich powodów, dla których normalizacja baz danych to dobry pomysł, pokażemy sytuacje, w których warto rozmyślnie zdenormalizować tabele lub zrezygnować z procesu ich normalizacji. Ogólnie rzecz biorąc, dane normalizuje się po to, by poprawić wydajność bazy danych. Na przykład, pomimo wszystkich podjętych wysiłków, posługiwanie się tabelami odnośników w niektórych przypadkach może być czasochłonne. Nawet w przypadku użycia prawidłowo poindeksowanych i znormalizowanych tabel, niektóre operacje odwołań do tabel odnośników będą wymagały sporo czasu, zwłaszcza gdy tabele te zawierają złożone dane lub są rozbudowane. Podobnie dużo czasu może zająć obliczenie niektórych wartości. Czasami się okazuje, że zapisanie obliczonej wartości jest bardziej ekonomiczne niż obliczanie jej w locie. Jest to prawdą zwłaszcza wtedy, gdy użytkownicy pracują na starszych, wolnych komputerach z niewielką ilością pamięci. Innym częstym powodem denormalizacji danych jest umożliwianie dokładnego odtworzenia pierwotnego dokumentu. Jeśli chcesz ponownie wydrukować fakturę zapisaną rok temu, a klient w tym czasie zmienił nazwę firmy, w znormalizowanej bazie na fakturze pojawi się nowa nazwa. Jeśli z przyczyn biznesowych faktura powinna mieć pierwotną postać, nazwę klienta należy zapisać w rekordzie faktury w momencie jego tworzenia. Należy pamiętać, że większość przypadków denormalizacji schematu bazy danych stwarza wymaganie poświęcenia dodatkowego czasu na programowanie w celu ochrony danych i użytkownika przed problemami związanymi z nieznormalizowanym projektem. Na przykład w przypadku obliczonego pola OrderTotal trzeba wprowadzić kod, który oblicza i aktualizuje to pole za każdym razem, kiedy zmienią się dane, na podstawie których się je oblicza. To dodatkowe programowanie wymaga oczywiście czasu, a powstały kod zajmuje czas procesora w fazie działania aplikacji. Trzeba również uważać, aby denormalizacja projektu nie spowodowała także innych problemów. Jeśli ktoś zdecydował się na rozmyślną denormalizację projektu bazy danych i ma problem z doprowadzeniem aplikacji do poprawnego działania (w szczególności jeśli występują anomalie omawiane w poprzednim punkcie), powinien poszukać obejść umożliwiających posługiwanie się w pełni znormalizowanym projektem.
I ostatnia uwaga. Pamiętajmy, aby zawsze dokumentować operacje wykonywane w celu denormalizacji projektu. Może się zdarzyć, że ktoś poprosi nas o wprowadzenie poprawek
Rozdział 4. Relacje między tabelami
131
lub dodanie nowych własności do aplikacji. Jeśli nie opiszemy elementów projektu, które naruszają zasady normalizacji, narażamy się na możliwość, że ktoś inny cofnie te zmiany w celu „zoptymalizowania” projektu. Projektant, który to zrobi, będzie miał oczywiście jak najlepsze intencje, ale może również przywrócić problem z wydajnością rozwiązany dzięki subtelnej denormalizacji. Warto pamiętać, że denormalizację niemal zawsze wykonuje się w celu generowania raportów, a nie w celu utrzymywania danych w tabelach. Rozważmy sytuację, w której klient otrzymał specjalny rabat, różny od standardowego. W takiej sytuacji przydałaby się możliwość zapamiętania faktycznej kwoty, która znalazła się na fakturze. Obliczanie rabatu przy każdej okazji drukowania raportu jest niewłaściwe. Zapisanie faktycznej kwoty daje pewność, że w raporcie zawsze znajdzie się kwota, która widnieje na fakturze klienta, a nie wartość zależna od innych pól w bazie danych, które z czasem mogły się zmienić.
Relacje między tabelami Wiele osób decyduje się na używanie arkuszy kalkulacyjnych, na przykład Excela lub Lotusa 1-2-3, do tworzenia baz danych. Niestety w arkuszach kalkulacyjnych dane są zapisywane w dwóch wymiarach (wierszach i kolumnach) i nie pozwalają na łatwe powiązanie ze sobą poszczególnych arkuszy. Trzeba ręcznie powiązać każdą z komórek w arkuszu z komórkami w innym arkuszu, co jest bardzo żmudnym procesem. Dwuwymiarowe obiekty do przechowywania danych takie jak arkusze kalkulacyjne określa się jako kartotekowe bazy danych lub tzw. płaskie pliki bazy danych (ang. flatfile), ponieważ brakuje im trójwymiarowości właściwej dla relacyjnych baz danych. Na rysunku 4.8 pokazano arkusz Excela wykorzystany w roli kartotekowej bazy danych. Rysunek 4.8. Arkusz Excela wykorzystany w roli kartotekowej bazy danych
Wystarczy rzut oka na rysunek 4.8, aby uświadomić sobie problemy wynikające z zastosowania kartotekowych baz danych. Zwróćmy uwagę, że informacje o pracowniku występują w wielu wierszach arkusza. Za każdym razem, kiedy pracownikowi jest wystawiany czek z wypłatą, następuje dodanie nowego wiersza do arkusza. Z oczywistych względów taki arkusz bardzo szybko osiągnąłby duże rozmiary i stałby się trudny do zarządzania. Zwróćmy uwagę, jak wiele pracy trzeba włożyć we wprowadzenie stosunkowo niewielkich zmian w danych z rysunku 4.8. Na przykład zmiana pola Title wymaga przeszukiwania wielu rekordów i edycji danych zawartych w pojedynczych komórkach. Takie działania stwarzają wiele okazji do popełnienia błędów.
132
Część II Tabele Accessa
Dzięki odpowiedniemu kodowi w języku VBA w Excelu można powiązać dane z arkusza na rysunku 4.8 z innym arkuszem zawierającym szczegółowe informacje o wynagrodzeniu. Można by również programowo modyfikować dane w indywidualnych wierszach. Jednak ten olbrzymi wysiłek na nic się nie zda. Nie uda się osiągnąć możliwości relacyjnego systemu baz danych, takiego jak Microsoft Access.
Wiązanie danych Klucz główny w unikatowy sposób identyfikuje rekordy, które są zapisane w tabeli. Przykładem kluczy głównych tabeli danych o pracownikach może być NIP, kombinacja imienia i nazwiska lub identyfikator pracownika. Załóżmy, że dla tabeli z danymi o pracownikach wybrano identyfikator pracownika. Podczas tworzenia powiązania z tabelą zawierającą dane płacowe wykorzystano do połączenia tabel pole EmployeeID. Taki układ pokazano na rysunku 4.9 (więcej informacji na ten temat można znaleźć w dalszej części tego rozdziału, w punkcie „Jeden do wielu”).
Rysunek 4.9. Powiązanie między tabelami pracowników i płac to przykład typowej relacji jeden do wielu
Niektóre problemy związane z wykorzystywaniem naturalnych kluczy (np. NIP-ów) omówiono w dalszej części tego rozdziału, w punkcie „Naturalne a sztuczne klucze główne”. Chociaż na rysunku 4.9 nie widać relacji, Access wie o niej, ponieważ utworzono formalną relację między tabelami tblPayroll i tblEmployees (proces ten opisano w dalszej części tego rozdziału, w podrozdziale „Tworzenie relacji i wymuszanie przestrzegania integralności odwołań”). Dzięki relacji między tymi tabelami Access potrafi odczytać wszystkie rekordy z tabeli tblPayroll odpowiadające dowolnemu pracownikowi z tabeli tblEmployees.
Rozdział 4. Relacje między tabelami
133
Przykład relacji pokazano na rysunku 4.9. Każdy rekord z tabeli tblEmployees jest powiązany z kilkoma rekordami z tabeli tblPayroll. Jest to najczęściej spotykany typ relacji w systemach baz danych, ale w żadnym razie nie jest to jedyny sposób, w jaki mogą być ze sobą powiązane dane w tabelach. W tej książce a także w większości książek dotyczących relacyjnych baz danych takich jak Access, omówiono trzy podstawowe typy relacji między tabelami:
jeden do jednego,
jeden do wielu,
wiele do wielu.
Większość relacji w bazie danych MiniAuta dla Kolekcjonerów pokazaliśmy na rysunku 4.10.
Rysunek 4.10. Większość relacji w bazie danych MiniAuta dla Kolekcjonerów
Zwróćmy uwagę, że pomiędzy tabelami bazy danych istnieje kilka relacji jeden do wielu (np. tblSales z tblSalesPayments, tblSales z tblSalesLineItems oraz tblCustomers z tblSales). Relacja ustanowiona między tabelami jest bardzo ważna. Mówi ona Accessowi, jak znaleźć i wyświetlić informacje z pól występujących w dwóch lub więcej tabelach. Program musi wiedzieć, czy szukać tylko jednego rekordu w jednej tabeli, czy wielu rekordów na podstawie relacji. Na przykład tabela tblSales jest powiązana z tabelą tblCustomers za pomocą relacji wiele do jednego. Powód tego jest taki, że główny nacisk w systemie MiniAuta dla Kolekcjonerów położono na transakcje. Oznacza to, że z każdym rekordem transakcji zawsze będzie powiązany tylko jeden klient. Inaczej mówiąc, z jednym klientem można powiązać wiele transakcji. W takiej sytuacji system MiniAuta dla Kolekcjonerów wykorzystuje tabelę tblCustomers jako tabelę przeglądową.
134
Część II Tabele Accessa Relacje mogą być bardzo zagmatwane — wszystko zależy od tego, na co położono nacisk w systemie. Na przykład pracując z tabelami tblCustomers i tblSales, można zawsze utworzyć kwerendę zawierającą relację typu jeden do wielu między tymi tabelami. Chociaż system skoncentrowany jest na transakcjach (fakturach), to jednak czasem trzeba utworzyć raport dotyczący klientów, a nie faktur. Ponieważ jeden klient może dokonać więcej niż jednej transakcji, w tabeli tblCustomers będzie zawsze tylko jeden rekord, któremu będzie odpowiadać co najmniej jeden rekord w tabeli tblSales (może ich być więcej). Właśnie stąd Access będzie wiedział, że ma szukać tylko jednego rekordu w tabeli klientów oraz wszystkich w tabeli transakcji zawierających ten sam numer klienta.
Jeden do jednego Relacja jeden do jednego między tabelami oznacza, że każdemu rekordowi w pierwszej tabeli odpowiada jeden i tylko jeden rekord w drugiej tabeli. Pojęcie relacji jeden do jednego zilustrowano na rysunku 4.11. Rysunek 4.11. Relacja typu jeden do jednego
Klasycznych relacji jeden do jednego nie stosuje się zbyt często w relacyjnych bazach danych. W większości przypadków dane zawarte w drugiej tabeli są umieszczone w pierwszej tabeli. Relacji jeden do jednego raczej się unika, gdyż naruszają one reguły normalizacji. Zgodnie z regułami normalizacji, jeśli dane opisują pojedynczy podmiot, nie należy ich rozdzielać na wiele tabel. Ponieważ osoba ma jedną i tylko jedną datę urodzenia, powinna ona się znaleźć w tabeli zawierającej inne dane tej osoby. Czasami jednak zapisywanie określonych danych razem z innymi danymi w tabeli nie jest zalecane. Na przykład rozważmy tabele pokazane na rysunku 4.11. Dane zapisane w tabeli tblSecurityIDs są poufne. Nie chcielibyśmy, aby wszystkie osoby mające dostęp do publicznych danych dotyczących klienta (nazwisko, adres itp.) miały także dostęp do poufnego kodu bezpieczeństwa używanego podczas zakupów bądź do wystawiania faktur.
Rozdział 4. Relacje między tabelami
135
Gdyby zachodziła konieczność, tabelę tblSecurityIDs można by umieścić na innym dysku w sieci lub nawet, w celu ochrony przed niepowołanym dostępem, przechowywać na przenośnym nośniku informacji. Innym przypadkiem, kiedy trzeba zastosować relację jeden do jednego, jest sytuacja, kiedy liczba pól w tabeli przekroczy dozwoloną liczbę 255. Choć takie sytuacje występują rzadko, czasem może się zdarzyć, że w pojedynczej tabeli znajduje się zbyt wiele pól. Najprostszym rozwiązaniem jest rozdzielenie danych na wiele tabel i powiązanie ich za pomocą klucza głównego (wykorzystując w każdej z tabel tę samą wartość klucza). Jeszcze inna sytuacja występuje w przypadku przesyłania danych bądź współdzielenia ich pomiędzy bazami danych. Pracownik zajmujący się wysyłką towarów nie powinien mieć dostępu do wszystkich danych klientów. Zamiast nieistotnych informacji, takich jak nazwy stanowisk, daty urodzenia, dodatkowe numery telefonów i adresy e-mail, baza danych pracownika zajmującego się wysyłką towarów powinna zawierać tylko nazwisko klienta, jego adres oraz inne informacje dotyczące wysyłki. Rekord w tabeli informacji o klientach bazy danych pracownika zajmującego się wysyłką pozostaje w relacji jeden do jednego z odpowiadającym mu rekordem w głównej tabeli danych o klientach zapisanej na centralnym komputerze w firmie. Chociaż dane są zapisane w osobnych plikach .accdb, łącza pomiędzy tabelami mogą być aktywne, co oznacza, że modyfikacje w głównej tabeli są natychmiast uwzględniane w pliku pracownika zajmującego się wysyłką. W tabelach połączonych relacją jeden do jednego niemal zawsze występuje ten sam klucz główny — na przykład identyfikator zamówienia lub numer pracownika. Bardzo rzadko występuje potrzeba utworzenia oddzielnego pola kluczowego w drugiej tabeli wchodzącej w skład relacji jeden do jednego.
Jeden do wielu Znacznie częstszym typem relacji występujących między tabelami w relacyjnych bazach danych jest relacja jeden do wielu. W takiej relacji każdy rekord z pierwszej tabeli (rodzica) jest powiązany z jednym lub większą liczbą rekordów z drugiej tabeli (dziecka). Każdy rekord z drugiej tabeli jest powiązany z jednym i tylko jednym rekordem z pierwszej tabeli. Bez wątpienia relacje jeden do wielu są najczęstszym typem relacji spotykanych w systemach relacyjnych baz danych. Przykładami relacji jeden do wielu mogą być:
Klienci i zamówienia — każdy klient (strona „jeden”) może złożyć kilka zamówień (strona „wiele”), ale poszczególne zamówienia są przesyłane przez jednego klienta.
Nauczyciel i uczniowie — każdy nauczyciel ma wielu uczniów, ale każdy uczeń ma jednego nauczyciela (oczywiście w ramach określonej klasy).
Pracownicy i wypłaty — każdy pracownik może otrzymać wiele wypłat, ale określoną wypłatę można przekazać tylko jednemu pracownikowi.
Pacjenci i kuracje — każdy pacjent jest poddawany zerowej bądź większej od zera liczbie kuracji w związku z chorobą, ale określona kuracja może być zastosowana u wielu pacjentów.
136
Część II Tabele Accessa
Zgodnie z tym, czego dowiemy się w punkcie „Tworzenie relacji i wymuszanie przestrzegania integralności odwołań” w dalszej części tego rozdziału, tworzenie relacji jeden do wielu między tabelami Accessa jest bardzo łatwe. Relację jeden do wielu zilustrowano na rysunku 4.12. W relacjach pokazanych na tym rysunku użyto tabel z bazy danych Northwind Traders. Z rysunku jasno wynika, że każdy rekord z tabeli klientów jest powiązany z kilkoma rekordami z tabeli zamówień. Zamówienie można przesłać tylko do jednego klienta, zatem pokazany układ w pełni odzwierciedla cechy relacji jeden do wielu.
Rysunek 4.12. W bazie danych Northwind Traders występują liczne relacje jeden do wielu
Chociaż rekordy po stronie „wiele” relacji pokazanej na rysunku 4.12 posortowano alfabetycznie według pola z identyfikatorem klienta, nie ma wymogu, aby rekordy w tabeli po tej stronie relacji były uporządkowane w jakiejkolwiek kolejności. Chociaż do objaśnienia relacji jeden do wielu między tabelami zazwyczaj używa się wyrażenia rodzic-dziecko, czasami można spotkać inne określenia takiego projektu, na przykład ogół-szczegóły (ang. master-detail). Należy zapamiętać, że celem mechanizmów zapewniających integralność odwołań jest zapobieżenie utracie rekordów po stronie „wiele” relacji. Mechanizmy te gwarantują, że w tabeli „wiele” nigdy nie znajdzie się osierocony rekord — taki, dla którego nie istnieje odpowiadający mu rekord rodzic. Jak się wkrótce przekonamy, istotne jest, aby zapamiętać, która tabela występuje po stronie „jeden”, a która po stronie „wiele”.
Zwróćmy uwagę na to, jak trudne byłoby zarejestrowanie wszystkich zamówień złożonych przez klienta, gdyby informacje o zamówieniach nie były zapisane w osobnej tabeli. Alternatywa, jaką jest kartotekowa baza danych omówiona we wcześniejszej części tego rozdziału, wymaga znacznie więcej aktualizacji w porównaniu z układem jeden do wielu zaprezentowanym na rysunku 4.12. Za każdym razem, kiedy klient złoży zamówienie w firmie Northwind Traders, następuje dodanie nowego rekordu do tabeli zamówień. Do tej tabeli dodawane jest tylko pole z identyfikatorem klienta (np. AROUT), które
Rozdział 4. Relacje między tabelami
137
spełnia rolę klucza obcego odwołującego się do tabeli klientów. Utrzymywanie informacji o klientach jest stosunkowo proste, ponieważ rekord każdego klienta występuje tylko raz w tabeli klientów.
Wiele do wielu Od czasu do czasu w relacyjnych systemach baz danych wykorzystuje się relacje wiele do wielu. W układzie wiele do wielu każdy rekord w obydwu tabelach może być powiązany z jednym lub większą liczbą rekordów. Mogą też wystąpić rekordy, dla których w drugiej tabeli nie ma żadnego odpowiednika. Przykład zaprezentowano na rysunku 4.13. Każdy student w tabeli tblStudents może należeć do więcej niż jednego klubu, a każdy klub z tabeli tblClubs może mieć więcej niż jednego członka.
Rysunek 4.13. Baza danych o studentach i klubach jest przykładem relacji wiele do wielu
Jak można wywnioskować na podstawie rysunku 4.13, relacje wiele do wielu są w pewnym sensie trudniejsze do zrozumienia, ponieważ nie można ich bezpośrednio zamodelować w systemach relacyjnych baz danych takich jak Access. Zamiast nich relację wiele do wielu rozbija się na dwie osobne relacje jeden do wielu połączone ze sobą za pomocą tabeli łączącej (ang. join table). Tabela ta wchodzi w relację jeden do wielu z obydwiema tabelami wchodzącymi w skład relacji wiele do wielu. Zasada ta może być na pozór nieco myląca, jednak dokładniejsza analiza rysunku 4.13 pozwala docenić zalety takiego układu. Na rysunku 4.13 można zauważyć, że student o identyfikatorze 12 (Jerzy Wielicki) należy do klubów ogrodniczego i fotograficznego (ClubID = 2 i ClubID = 3). Jest to przykładowy student należący do wielu klubów. Zarówno Jerzy Wielicki, jak i Edward Małecki (o identyfikatorach 12 i 6) należą do klubu fotograficznego (ClubID = 3). To przykład ilustrujący, że do jednego klubu może należeć wielu studentów. Każdy student może należeć do wielu klubów, a każdy klub może mieć wielu członków.
138
Część II Tabele Accessa
Z powodu dodatkowych komplikacji związanych z koniecznością zastosowania tabeli łączącej często uważa się relacje wiele do wielu za trudniejsze do ustanowienia i utrzymania. Na szczęście implementacja tego typu relacji w Accessie jest dość prosta, jeśli przestrzega się kilku reguł. Reguły te omówiono w kilku miejscach w tej książce. Na przykład w celu zaktualizowania dowolnej strony relacji wiele do wielu (np. w celu zmiany przynależności studenta do klubu) tabela łącząca musi zawierać klucze główne z obu tabel powiązanych relacją. Relacje wiele do wielu spotyka się dość powszechnie w środowiskach biznesowych:
Prawnicy i klienci (lub lekarze i pacjenci) — każdy prawnik może prowadzić kilka procesów, a jednocześnie każdego klienta w każdym procesie może reprezentować więcej niż jeden prawnik.
Pacjenci i ochrona ubezpieczeniowa — wiele osób chroni więcej niż jedna polisa ubezpieczeniowa. Na przykład jeśli pracodawcy zarówno męża, jak i żony zapewniają ubezpieczenie medyczne, oboje małżonkowie są chronieni dwiema polisami.
Wypożyczalnie płyt DVD i ich klienci — w ciągu roku każda płyta DVD jest wypożyczana przez wiele osób. Jednocześnie w ciągu roku każdy z klientów wypożycza wiele płyt DVD.
Prenumeratorzy czasopism — większość czasopism wychodzi w nakładach liczonych w tysiącach lub nawet milionach. Wiele osób prenumeruje więcej niż jedno czasopismo.
W bazie danych MiniAuta dla Kolekcjonerów występuje relacja wiele do wielu między tabelami tblCustomers i tblSalesPayments, a rolę tabeli łączącej spełnia tabela tblSales. Każdy klient może zakupić więcej niż jeden towar, a zapłata za każdy z nich może być rozłożona na więcej niż jedną płatność. Oprócz powiązania klientów i płatności transakcji są w tabeli tblSales także inne informacje, na przykład data transakcji i numer faktury. Tabela łącząca w relacjach wiele do wielu często zawiera informacje dotyczące powiązanych danych. Biorąc pod uwagę potencjalny stopień skomplikowania złączeń wiele do wielu, należy się cieszyć, że są one nieco mniej popularne od prostych relacji jeden do wielu. Jak widać na rysunku 4.13, tabela łącząca może zawierać także inne dane oprócz kluczy głównych z łączonych tabel. Tabela tblStudentToClubJoin obejmuje pole z datą dołączenia danego studenta do określonego klubu.
Reguły integralności Access zezwala na stosowanie reguł integralności odwołań, które chronią dane przed utratą lub zniszczeniem. Integralność odwołań oznacza zachowanie relacji między tabelami w przypadku aktualizacji, usuwania i innych operacji na rekordach. W modelu relacyjnym zdefiniowano kilka reguł mających na celu wymuszenie przestrzegania integralności odwołań relacyjnych baz danych. Dodatkowo Access posiada własny zbiór reguł integralności odwołań, nad których przestrzeganiem czuwa silnik bazy danych ACE.
Rozdział 4. Relacje między tabelami
139
Wyobraźmy sobie aplikację płacową, w której nie obowiązują żadne reguły używania danych w bazie. W takim systemie można by wystawić czeki niepowiązane z pracownikami. Z punktu widzenia biznesowego wystawianie czeków dla pracowników-zjaw jest bardzo groźne. Sytuacja taka może trwać do momentu kontroli, która wykryje niedociągnięcia. Integralność odwołań bazuje na polach kluczowych tabel. Integralność odwołań oznacza, że silnik bazy danych sprawdza pola kluczowe za każdym razem, kiedy w tabeli jest dodawany, modyfikowany lub usuwany klucz główny bądź obcy. Jeśli modyfikacja wartości pola kluczowego stanie się przyczyną nieprawidłowej relacji, mówi się o naruszeniu integralności odwołań. Tabele można zaprojektować w taki sposób, aby integralność odwołań była wymuszana automatycznie. Rysunek 4.14 przedstawi relację między tabelami klientów i transakcji. Tabela tblCustomers jest powiązana z tabelą tblSales za pośrednictwem pola CustomerID. Pole CustomerID w tabeli tblCustomers jest kluczem głównym tej tabeli, natomiast pole CustomerID w tabeli tblSales jest kluczem obcym. Relacja łączy każdego klienta z fakturą dotyczącą transakcji. W tej relacji tabela tblCustomers jest rodzicem, natomiast tabela tblSales — dzieckiem.
Rysunek 4.14. Typowa relacja w bazie danych
Osierocone rekordy w aplikacji bazy danych są bardzo niedobrym symptomem. Ponieważ informacje o sprzedaży są zazwyczaj wyświetlane jako lista produktów sprzedanych poszczególnym klientom, to faktura sprzedaży niepowiązana z klientem w większości przypadków nie będzie wykryta. Z łatwością można sprawdzić, które towary sprzedano firmie Strefa Zabawek, ale na podstawie dowolnego rekordu transakcji trudno stwierdzić brak istnienia klienta, który dokonał zakupu. Na rysunku 4.14 rekordy sprzedaży powiązane z firmą Strefa Zabawek zostały oznaczone za pomocą prostokątów zakreślonych wokół danych w tabeli tblSales.
140
Część II Tabele Accessa
Ponieważ nad przestrzeganiem reguł integralności odwołań czuwa silnik bazy danych Accessa, integralność danych jest zapewniona w momencie pojawienia się danych w bazie: w tabelach, kwerendach bądź formularzach. Po zdefiniowaniu wymagań integralności aplikacji nie trzeba się martwić tym, że dane w powiązanych tabelach zostaną utracone lub zdezorganizowane. W aplikacjach bazodanowych zapewnienie integralności odwołań jest niezwykle istotne. Wielu projektantów uważa, że występowaniu osieroconych rekordów można zapobiec, wykorzystując kod VBA lub odpowiedni projekt interfejsu użytkownika. Prawda jest jednak taka, że w większości baz dane zapisane w określonej tabeli mogą być używane w różnych miejscach w aplikacji (a nawet w różnych aplikacjach). Biorąc jednocześnie pod uwagę fakt, że sporo projektów baz danych realizuje się przez wiele lat i bierze w nich udział wielu programistów, trzeba uznać, że zapewnienie właściwego sposobu ochrony danych jest bardzo trudne. Najlepszym sposobem zapewnienia integralności danych zapisanych w dowolnym systemie baz danych jest wykorzystanie silnika bazy danych do wymuszenia integralności odwołań. Dzięki ogólnym zasadom integralności odwołań modelu relacyjnego rekordy zapisane w relacyjnych tabelach nie mogą zostać utracone lub pomylone. Z oczywistych powodów ważna jest ochrona kluczy głównych łączących tabele. Również zmiany wprowadzone w tabeli, które mają wpływ na inne tabele (np. usunięcie rekordu po stronie „jeden” relacji jeden do wielu), powinny być uwzględnione w powiązanej tabeli. W innym przypadku dane w obu tabelach szybko stracą synchronizację
Klucz główny nie może mieć wartości null Zgodnie z pierwszą zasadą integralności odwołań żaden klucz główny nie może zawierać wartości null. Wartość null to taka, która po prostu nie istnieje. Wartość pola, do którego nigdy nie przypisano wartości (nawet domyślnej), wynosi null. W tabeli bazy danych nie mogą się znajdować wiersze, które mają wartość null w polu klucza głównego, ponieważ podstawowym przeznaczeniem kluczy głównych jest zapewnienie niepowtarzalności wiersza. Oczywiste jest, że wartości null nie mogą być niepowtarzalne, a model relacyjny nie będzie działał, jeśli klucze główne będą miały wartość null. Dlatego Access nie zezwala na ustawienie pola, w którym znajdują się wartości null, jako klucza głównego. Co więcej, Access nie potrafi oszacować wartości null. Ponieważ wartość null nie istnieje, nie można jej porównać z żadną inną wartością. Nie jest ona ani większa, ani mniejsza od żadnej innej wartości — po prostu nie istnieje. Dlatego nie można wykorzystywać wartości null do wyszukiwania rekordów w tabeli ani do tworzenia relacji między dwiema tabelami. Access automatycznie wymusza przestrzeganie pierwszej reguły integralności odwołań. Podczas dodawania danych do tabel nie można pozostawić pustych pól kluczy głównych bez wygenerowania ostrzeżenia (jest to jeden z powodów, dla których pola typu Autonumerowanie tak dobrze się sprawdzają w roli kluczy głównych). Po wyznaczeniu pola w tabeli Accessa jako klucza głównego Access nie dopuści do usunięcia danych w tym polu ani do ich modyfikacji w taki sposób, by powstały duplikaty wartości w innym rekordzie.
Rozdział 4. Relacje między tabelami
141
W przypadku używania złożonych kluczy głównych składających się z kilku pól wszystkie pola wchodzące w skład klucza głównego muszą zawierać wartości. Żadne pole nie może być puste. Kombinacja wartości w złożonym kluczu głównym musi być niepowtarzalna.
Wszystkim wartościom kluczy obcych muszą odpowiadać klucze główne Zgodnie z drugą zasadą integralności odwołań wartościom kluczy obcych muszą odpowiadać klucze główne. Oznacza to, że w relacji jeden do wielu każdemu rekordowi w tabeli po stronie „wiele” (czyli dziecku) musi odpowiadać rekord w tabeli po stronie „jeden” (czyli rodzic). Rekord po stronie „wiele” relacji bez odpowiadającego mu rekordu po stronie „jeden” to tzw. rekord osierocony, który powinien być usunięty z bazy danych. Identyfikacja osieroconych rekordów w bazie danych może być bardzo trudna, dlatego należy przede wszystkim nie dopuścić do ich pojawienia się w tabeli. Druga reguła integralności odwołań oznacza, że:
Nie wolno dodawać wierszy do tabeli po stronie „wiele” (dziecko), jeśli nie istnieją odpowiadające im rekordy po stronie „jeden” (rodzic). Jeśli rekord-dziecko zawiera pole IDRodzica, wartość IDRodzica musi pasować do istniejącego rekordu w tabeli-rodzica.
Nie można zmienić wartości klucza głównego w tabeli po stronie „jeden”, jeśli zmiana ta spowodowałaby powstanie osieroconych rekordów w tabeli podrzędnej.
Usunięcie wiersza po stronie „jeden” nie może powodować osierocenia odpowiadających mu rekordów po stronie „wiele”.
W przykładzie dotyczącym transakcji klucz obcy w każdym rekordzie tabeli tblSales (strona „wiele”) musi pasować do klucza głównego w tabeli tblCustomers. Nie można usunąć wiersza w tabeli tblCustomers (strona „jeden”), jeśli nie usunie się odpowiadających mu rekordów w tabeli tblSales. Jednym z ciekawych efektów stosowania reguł integralności odwołań jest fakt, iż istnieje możliwość występowania rekordu-rodzica, któremu nie odpowiada żaden rekorddziecko. Intuicyjnie taka sytuacja ma sens. W firmie rzeczywiście mogą być pracownicy, którzy jeszcze nie otrzymali wypłaty. Mogłoby się też zdarzyć, że firma MiniAuta dla Kolekcjonerów zatrudniła nowego pracownika, który jeszcze nie zrealizował żadnej transakcji. Większości rekordów-rodziców odpowiada jeden lub kilka rekordów-dzieci, ale nie jest to warunek konieczny dla relacyjnych baz danych. Jak przekonamy się w następnym podrozdziale, Access umożliwia łatwe definiowanie reguł integralności do zastosowania w aplikacjach. Należy jednak pamiętać, że nieprzestrzeganie reguł integralności odwołań stwarza ryzyko powstania osieroconych rekordów oraz innych problemów z integralnością danych.
142
Część II Tabele Accessa
Klucze Kiedy tworzymy tabele, tak jak to miało miejsce w rozdziale 3., powinniśmy dla każdej z nich zdefiniować klucz główny, którego zawartość jest unikalna dla każdego rekordu. Zapewni to, że w tabeli nie będą nigdy istniały rekordy zawierające identyczne wartości. Można na przykład mieć kilku klientów o nazwisku Michał Sitkowski, którzy nawet mogą mieszkać pod tym samym adresem (ojciec i syn). W takim przypadku trzeba zdecydować, w jaki sposób utworzyć w tabeli klientów rekordy, aby odróżnić od siebie poszczególnych Michałów Sitkowskich. Unikatowa identyfikacja każdego rekordu w tabeli — właśnie to ma zapewnić klucz główny. Na przykład w bazie danych MiniAuta dla Kolekcjonerów pole CustomerID (unikatowy numer, który przypisujemy każdemu klientowi składającemu zamówienie) jest kluczem głównym tabeli tblCustomers — każdy rekord w tabeli ma w tym polu inną wartość (nie istnieją dwa rekordy o takim samym identyfikatorze). Jest to ważne z kilku powodów:
Nie chcemy mieć w tabeli tblCustomers dwóch rekordów dla tego samego klienta, ponieważ w takim przypadku uaktualnienie informacji dotyczących klienta będzie praktycznie niemożliwe.
Chcemy mieć pewność, że każdy rekord w tabeli zawiera precyzyjne dane po to, aby informacje pobrane z tabeli także były precyzyjne.
Nie chcemy, aby tabela (wraz z jej rekordami) była większa, niż jest to konieczne. Dodanie zdublowanych (redundantnych) pól i rekordów tylko komplikuje bazę danych, a nie daje żadnego pożytku.
Dzięki możliwości przypisania pojedynczej, unikalnej wartości każdemu rekordowi tabela staje się przejrzysta i czytelna. W terminologii baz danych określa się to mianem integralności jednostkowej. Mając różne wartości klucza głównego w każdym rekordzie (np. w polu CustomerID w tabeli tblCustomers), można zawsze rozróżnić dwa rekordy (w tym przypadku klientów), nawet jeśli pozostałe pola w rekordach są identyczne. Jest to ważne, ponieważ w tabeli łatwo może się znaleźć dwóch klientów o popularnym nazwisku, takim jak na przykład Andrzej Kowalski. Teoretycznie do identyfikacji klienta można by wykorzystać jego nazwisko oraz adres, ale dwóch Andrzejów Kowalskich może mieszkać w tym samym województwie, mieście, a nawet pod tym samym adresem (na przykład ojciec i syn — Andrzej Marek Kowalski i Andrzej Marian Kowalski). Celem stosowania kluczy głównych jest tworzenia w tabelach rekordów, których niepowtarzalność jest gwarantowana. Jeżeli w trakcie tworzenia tabel w Accessie nie utworzy się kluczy głównych, Access zapyta, czy ma sam to zrobić. Jeżeli odpowiemy twierdząco, utworzy klucz główny w postaci pola typu Autonumerowanie. Pole typu Autonumerowanie jest automatycznie wstawiane przy dodawaniu każdego nowego rekordu. Wartości tej nie można zmodyfikować w przypadku, gdy raz zostanie ustawiona. Co więcej, po wprowadzeniu wartości typu Autonumerowanie do tabeli nigdy nie można jej wykorzystać po raz kolejny, nawet wtedy, gdy rekord zawierający tę wartość zostanie usunięty i wartości tej już nie będzie w tabeli. Ponieważ pole typu Autonumerowanie jest dodawane do nowego rekordu przed wszystkimi innymi danymi, to jeśli z jakiegoś powodu nowy rekord nie zostanie zapisany, nowa wartość pola typu Autonumerowanie nigdy nie będzie użyta w tabeli.
Rozdział 4. Relacje między tabelami
143
Określanie klucza głównego Jak opisano powyżej, tabela zwykle ma unikalne pole (lub kombinację pól), czyli klucz główny, który zapewnia unikalność każdego rekordu. Często jest to pole identyfikatora typu Krótki tekst lub Autonumerowanie. W celu określenia wartości dla pola identyfikatora można zdefiniować metodę generowania unikatowej wartości dla pola. Może to być najprostsza metoda, czyli pozwolenie Accessowi na automatyczne konstruowanie unikatowych wartości typu Autonumerowanie, ale można też samemu tworzyć identyfikatory, na przykład przez sklejenie pierwszej litery rzeczywistej wartości z kolejną liczbą (takie jak A001, A002, A003, B001, B002 itd.). Metoda generowania unikatowych wartości może także bazować na losowych kombinacjach liter i liczb (pod warunkiem, że będą one niepowtarzalne dla każdego rekordu) lub opierać się na złożonych obliczeniach wykorzystujących kilka wartości z innych pól tabeli. Wartość klucza głównego nie musi jednak mieć w aplikacji konkretnego znaczenia. Klucz główny istnieje w tabeli tylko po to, by zapewnić niepowtarzalność każdego wiersza, oraz jako identyfikator umożliwiający tworzenie relacji z innymi tabelami. Wielu projektantów aplikacji Accessa rutynowo używa pól typu Autonumerowanie w roli kluczy głównych, ponieważ spełniają one wszystkie wymagania i nie komplikują niepotrzebnie aplikacji. Stosowanie kluczy głównych o określonym znaczeniu możne nawet prowadzić do niejasności po zmianie danych w tabeli. Jeśli klucz główny w tabeli z informacjami o pracownikach to pierwsza litera nazwiska wraz z numerem porządkowym, Anna Nowak może mieć identyfikator N001. Gdy wyjdzie za mąż i zmieni nazwisko, identyfikator przestanie być spójny z danymi z rekordu. Identyfikator nadal będzie niepowtarzalny, ale może mylić użytkowników, którzy oczekują zależności identyfikatora od nazwiska. Tabela 4.1 przedstawia i objaśnia przykładowy sposób tworzenia wartości kluczy głównych we wszystkich tabelach bazy danych aplikacji MiniAuta dla Kolekcjonerów. Jak widać w tabeli 4.1, stworzenie metody określania klucza głównego nie wymaga wiele pracy (ani nawet wyobraźni). Zawsze skuteczny jest podstawowy schemat wykorzystujący kolejne liczby. Access automatycznie zawiadomi użytkownika, jeżeli ten będzie próbował wpisać powtarzające się wartości klucza głównego. Aby uniknąć powtarzania się wartości, można po prostu dodać do kolejnej liczby wartość 1. Tabela 4.1. Wyznaczanie kluczy głównych Tabela
Tworzenie wartości klucza głównego
tblCustomers
Firmy: pole typu Autonumerowanie przypisane przez Accessa
tblSales
Numer faktury: pole typu Autonumerowanie
tblSalesLineItems
Numer faktury (z tabeli transakcji) oraz pole typu Autonumerowanie
tblProducts
Numer produktu określany przez osobę wprowadzającą nowy produkt
tblSalesPayments
Numer faktury (z tabeli transakcji) oraz pole typu Autonumerowanie
tblSalesperson
Identyfikator przedstawiciela: pole typu Autonumerowanie
tblCategories
Kategoria produktu: określana przez osobę wprowadzającą nowy rekord
144
Część II Tabele Accessa
Chociaż wykorzystanie logiki (zaimplementowanej na przykład za pomocą kodu VBA) do wygenerowania unikatowych wartości w polu klucza głównego nie jest trudne, zdecydowanie najprostszym i najłatwiejszym sposobem jest używanie w roli kluczy głównych tabeli pól typu Autonumerowanie. Specjalne cechy pól typu Autonumerowanie (automatyczne generowanie, niepowtarzalne wartości, brak możliwości modyfikacji itp.) powodują, że pola te są idealnymi kandydatami na klucze główne. Co więcej, wartości typu Autonumerowanie to nic innego jak 4-bajtowa liczba całkowita. Dzięki temu zarządzanie nią przez silnik bazy danych jest bardzo szybkie i łatwe. Biorąc pod uwagę wszystkie te powody, w tabelach systemu MiniAuta dla Kolekcjonerów w roli kluczy głównych wykorzystano wyłącznie pola typu Autonumerowanie. Pola Autonumerowanie zawsze są niepowtarzalne, ale nie ma gwarancji, że będą zawierały kolejne wartości. W ciągu wartości w takich polach z różnych powodów (np. w wyniku usunięcia rekordów) mogą pojawić się luki, dlatego nie należy zakładać, że w polach tych znajdują się kolejne numery.
Można by sądzić, że wykorzystanie kolejnych liczb utrudnia odszukanie interesujących informacji w tabelach. Należy jednak pamiętać, że zwykle nie wyszukuje się informacji w tabeli na podstawie wartości pola identyfikatora. Zazwyczaj informacje wyszukuje się z uwzględnieniem przeznaczenia tabeli. Na przykład w tabeli tblCustomers informacji dotyczących określonego klienta będzie się szukało według jego nazwiska i imienia lub obu tych pól. Nawet jeśli w wielu rekordach występuje to samo nazwisko, do znalezienia właściwego klienta można użyć innych pól w tabeli (takich jak kod pocztowy, numer telefonu). Jeżeli nie znamy z góry identyfikatora, to prawdopodobnie nigdy nie będziemy musieli na jego podstawie wyszukiwać informacji na temat klienta.
Korzyści wynikające ze stosowania kluczy głównych Czy zdarzyło Ci się kiedyś składać po raz pierwszy w jakiejś firmie zamówienie, a na drugi dzień zdecydować się na jego zmianę? Czasami firma pyta wtedy o numer klienta. Klient zwykle odpowiada, że go nie pamięta. Przedstawiciel firmy w takim przypadku pyta klienta o jakieś inne dane, na przykład kod pocztowy lub nazwisko. Wtedy, gdy już zawęzi listę klientów, zapyta o adres. Po odnalezieniu nazwiska w bazie danych będzie mógł dotrzeć do numeru klienta. W niektórych firmach wykorzystuje się numery telefonów lub adresy e-mail jako unikalne dane pozwalające zidentyfikować klientów. Zagadnienia związane z kluczami głównymi i obcymi były omawiane w rozdziale 1., ale ponieważ pojęcia te są tak ważne w aplikacjach bazodanowych, ponownie opisaliśmy te kwestie w tym rozdziale.
Systemy baz danych zazwyczaj zawierają więcej niż jedną tabelę. Tabele te są ze sobą w jakiś sposób powiązane. Na przykład w bazie danych MiniAuta dla Kolekcjonerów tabele tblCustomers i tblSales są powiązane za pośrednictwem pola CustomerID. Ponieważ każdy klient to pojedyncza osoba, w tabeli tblCustomers potrzebny jest tylko jeden rekord. Jednak każdy klient może dokonywać wielu transakcji, co powoduje, że potrzebna jest inna tabela służąca do przechowywania informacji na temat tych transakcji — tblSales. Każda transakcja jest jedną fizyczną transakcją (w określonym dniu i o określonej godzinie). Pole CustomerID służy do powiązania klientów z transakcjami.
Rozdział 4. Relacje między tabelami
145
Klucz główny w tabeli-rodzicu (pole CustomerID w tabeli tblCustomers) jest powiązany z kluczem obcym w tabeli-dziecku (pole CustomerID w tabeli tblSales). Poza pełnieniem funkcji łącznika pomiędzy tabelami klucz główny w Accessie zapewnia następujące korzyści:
Pola kluczy głównych zawsze są poindeksowane, co znacznie przyspiesza wykonywanie kwerend, wyszukiwanie oraz sortowanie.
Każdorazowo podczas dodawania do tabeli nowych rekordów Access wymusza wprowadzanie w nich wartości (lub automatycznie sam wprowadza wartość w przypadku pól typu Autonumerowanie). Dzięki temu uzyskujemy gwarancję, że baza danych będzie spełniała wymagania integralności odwołań.
Podczas dodawania nowych rekordów do tabeli ze zdefiniowanym kluczem głównym Access sprawdza, czy dane w kolumnie klucza głównego nie powtarzają się, i zapobiega wprowadzaniu duplikatów. W ten sposób zapewnia integralność danych.
Domyślnie Access wyświetla dane w kolejności wynikającej z wartości klucza głównego. Indeks jest specjalnym wewnętrznym plikiem utworzonym po to, aby umieszczać rekordy w tabeli w pewien określony sposób. Na przykład pole klucza głównego w tabeli tblCustomers jest indeksem, który porządkuje rekordy w tabeli w kolejności określonej przez pole CustomerID. Dzięki wykorzystaniu indeksowanych tabel Access może wyświetlać rekordy w określony sposób oraz szybko wyszukiwać za pomocą indeksu dowolny rekord w tabeli.
Wybór klucza głównego Po lekturze poprzednich podrozdziałów Czytelnicy prawdopodobnie dobrze wiedzą, że wybór klucza głównego w tabeli to ważny krok w kierunku wzmocnienia projektu bazy danych. Odpowiednio zaimplementowane klucze główne pomagają w stabilizacji i ochronie danych zapisanych w bazach danych Accessa. Zgodnie z tym, co przeczytaliśmy w poprzednich podrozdziałach, pamiętajmy, że generalną zasadą rządzącą kluczami głównymi jest niepowtarzalność wartości pola kluczowego w bazie danych. Ponadto idealny klucz główny powinien być stabilny. Klucze główne składające się z pojedynczych pól, a klucze złożone Jeśli w tabeli nie istnieje idealny klucz główny w postaci pojedynczej wartości, można połączyć pola i utworzyć złożony klucz główny. Na przykład istnieje niewielkie prawdopodobieństwo, aby samo imię bądź samo nazwisko mogło służyć jako klucz główny, ale już połączenia imienia z nazwiskiem i datą urodzenia może umożliwić znalezienie kombinacji wartości, które nadają się do wykorzystania w roli klucza głównego. Jak będzie się można przekonać w punkcie „Tworzenie relacji i wymuszanie przestrzegania integralności odwołań” w dalszej części tego rozdziału, tworzenie kombinacji pól w celu ich wykorzystania jako kluczy głównych jest w Accessie bardzo łatwe. W przypadku korzystania z kluczy złożonych należy przestrzegać kilku reguł:
Żadne z pól wchodzących w skład klucza złożonego nie może mieć wartości null.
146
Część II Tabele Accessa
Bywa, że stworzenie klucza głównego na podstawie danych naturalnie występujących w tabeli jest trudne. Czasami rekordy w obrębie tabeli różnią się jednym bądź dwoma polami, pomimo że większość pozostałych pól w tabeli ma taką samą wartość.
Każde z pól może się powtarzać w obrębie tabeli, ale kombinacja pól tworzących klucz złożony nie może się powtarzać.
Jednak podobnie jak w przypadku innych aspektów projektu bazy danych, z kluczami złożonymi może być związanych wiele problemów:
Występowanie kluczy złożonych zwykle komplikuje projekt bazy danych. Jeśli użyjemy trzech pól w tabeli nadrzędnej do zdefiniowania klucza głównego tabeli, te same trzy pola muszą występować we wszystkich tabelach podrzędnych.
Zapewnienie istnienia wartości dla wszystkich pól wchodzących w skład klucza złożonego (tak, aby żadne z nich nie miało wartości null) również może być dość kłopotliwe. Większość projektantów unika stosowania kluczy złożonych, jeśli nie są one absolutnie konieczne. W wielu przypadkach problemy związane z zastosowaniem kluczy złożonych znacznie przewyższają niewielkie korzyści wynikające ze stosowania kluczy złożonych wygenerowanych na podstawie danych w obrębie rekordu.
Naturalne a sztuczne klucze główne Wielu projektantów jest zdania, że należy używać wyłącznie naturalnych kluczy głównych. Naturalne klucze główne uzyskuje się na podstawie danych występujących w tabeli, np. NIP-u lub numeru pracownika. Jeśli w tabeli nie istnieje pojedyncze pole, które mogłoby w unikatowy sposób identyfikować rekordy w tabeli, projektanci ci radzą łączenie pól w celu stworzenia złożonych kluczy głównych. Istnieje jednak wiele sytuacji, w których nie ma „doskonałego” naturalnego klucza w tabelach bazy danych. Chociaż takie pola jak NumerNIP wydają się idealnymi kandydatami do roli kluczy głównych, z danymi tego rodzaju występuje szereg problemów:
Dane te nie są uniwersalne. Nie każdy posiada NIP.
Wartość może być nieznana w czasie dodawania rekordu do bazy danych. Ponieważ klucze główne nigdy nie mogą mieć wartości null, trzeba zapewnić możliwość wprowadzania swego rodzaju tymczasowego klucza głównego w sytuacji, kiedy NIP nie jest znany. Następnie trzeba przedsięwziąć właściwe kroki w celu wprowadzenia poprawek zarówno w tabeli nadrzędnej, jak i w tabelach podrzędnych w momencie, kiedy wartość zostanie ustalona.
Wartości w rodzaju NIP-ów zwykle mają dość duży rozmiar. NIP ma co najmniej dziesięć znaków, nie licząc nawet kresek rozdzielających poszczególne grupy cyfr. Rozbudowane klucze główne niepotrzebnie komplikują obliczenia i działają wolniej od mniejszych kluczy głównych.
Istnieją ograniczenia prawne ich stosowania. NIP jest uważany za dane osobowe i podlega ochronie zgodnie z ustawą o ochronie danych osobowych (to samo dotyczy np. numeru ubezpieczenia społecznego w Stanach Zjednoczonych).
Rozdział 4. Relacje między tabelami
147
Zdecydowanie największym problemem jest fakt, iż dodanie rekordu do tabeli jest niemożliwe, jeśli wartość klucza głównego jest nieznana w momencie dodawania rekordu do bazy danych. Nawet jeśli wprowadzi się tymczasowe wartości do czasu poznania ostatecznej wartości, nakład pracy, jaki trzeba włożyć w rozwiązanie problemu, jest znaczny. W przypadku, gdy nie włączono opcji kaskadowej aktualizacji, nie można zmodyfikować wartości klucza głównego, jeśli w innych tabelach istnieją powiązane z nim rekordy.
Chociaż wartości typu Autonumerowanie nie występują naturalnie w danych w tabelach, to ze względu na istotne korzyści związane z używaniem prostych wartości liczbowych, które są generowane automatycznie i nie można ich usunąć bądź zmodyfikować, w większości przypadków są one idealnymi kandydatami do roli kluczy głównych. Tworzenie kluczy głównych Aby utworzyć klucz główny, należy otworzyć tabelę w widoku projektu, wybrać pole (lub pola), które ma być użyte w roli klucza głównego, i kliknąć przycisk Klucz podstawowy w zakładce NARZĘDZIA TABEL PROJEKTOWANIE na wstążce. Aby zaznaczyć więcej niż jedno pole w celu utworzenia klucza złożonego, należy przed kliknięciem przycisku Klucz podstawowy przytrzymać klawisz Ctrl i za pomocą myszy wybrać pola, które mają utworzyć klucz złożony. Sposoby definiowania kluczy głównych w tabelach opisano szczegółowo w rozdziale 2.
Tworzenie relacji i wymuszanie przestrzegania integralności odwołań Okno Relacje umożliwia zdefiniowanie relacji oraz reguł integralności odwołań, które mają być stosowane do tabel wchodzących w skład relacji. Utworzenie trwałych, zarządzanych relacji zapewniających zachowanie integralności odwołań pomiędzy tabelami Accessa jest łatwe: 1. Wybierz polecenie NARZĘDZIA BAZY DANYCH/Relacje. Wyświetli się okno Relacje. 2. Kliknij przycisk Pokaż tabelę na wstążce albo kliknij prawym przyciskiem myszy w oknie Relacje, po czym wybierz polecenie Pokaż tabelę z menu podręcznego. Na ekranie pojawi się okno Dodaj tabelę, podobne do pokazanego na rysunku 4.15. 3. Dodaj tabele tblBookOrders5 i tblOrderDetails do okna Relacje (dwukrotnie kliknij nazwę każdej tabeli w oknie dialogowym Pokaż tabelę albo zaznacz każdą tabelę i kliknij przycisk Dodaj). 4. Aby utworzyć relację, wystarczy przeciągnąć pole klucza głównego tabeli po stronie „jeden” i upuścić na kluczu obcym po stronie „wiele”. Można również przeciągnąć pole klucza obcego i upuścić je na polu klucza głównego. W tym przykładzie przeciągnij pole OrderID z tabeli tblBookOrders5 i upuść je na polu OrderID w tabeli tblBookOrderDetails. Access otworzy okno dialogowe Edytowanie relacji (zobacz rysunek 4.16), które umożliwia określenie szczegółów dotyczących relacji tworzonej między tabelami. Zwróćmy uwagę, że Access rozpoznał typ relacji między tabelami tblBookOrders5 i tblBookOrderDetails jako jeden do wielu.
148
Część II Tabele Accessa
Rysunek 4.15. Aby dodać tabelę do okna Relacje, należy kliknąć dwukrotnie jej nazwę
5. Określ reguły integralności odwołań, których przestrzeganie Access ma wymuszać w bazie danych. Spójrzmy na rysunek 4.16 i zwróćmy uwagę na opcję Kaskadowo usuń rekordy pokrewne. Gdyby jej nie zaznaczono, Access nie pozwoliłby na usunięcie rekordów z tabeli tblBookOrders5 (po stronie „jeden”), jeśli wcześniej ręcznie nie usunięto by wszystkich powiązanych rekordów z tabeli tblBookOrderDetails (po stronie „wiele”). Dzięki zaznaczeniu tego pola wyboru usuwanie w ramach relacji odbywa się automatycznie. Kaskadowe usuwanie rekordów może być niebezpieczne, ponieważ usuwanie w tabeli po stronie „wiele” jest wykonywane bez potwierdzenia. Rysunek 4.16. Wymuszanie przestrzegania integralności odwołań za pomocą okna dialogowego Edytowanie relacji
6. Kliknij przycisk Utwórz. Access wykreśli linię pomiędzy tabelami wyświetlanymi w oknie Relacje. Linia ta określa typ relacji. Symbol 1 na rysunku 4.17 oznacza, że tabela tblBookOrders5 znajduje się po stronie „jeden” relacji, natomiast symbol nieskończoności (∞) oznacza, że tabela tblBookOrderDetails jest po stronie „wiele”. Rysunek 4.17. Relacja jeden do wielu między tabelami tblBookOrders5 i tblBookOrderDetails
Rozdział 4. Relacje między tabelami
149
Określanie typu złączenia między tabelami Po prawej stronie okna Edytowanie relacji są cztery przyciski:
Utwórz — kliknięcie przycisku Utwórz powoduje powrót do okna Relacje, w którym będą uwzględnione wprowadzone wcześniej zmiany.
Anuluj — przycisk Anuluj unieważnia dokonane zmiany i także powoduje powrót do okna Relacje.
Typ sprzężenia — kliknięcie przycisku Typ sprzężenia powoduje otwarcie okna dialogowego Właściwości sprzężenia.
Utworzy nowe — za pomocą przycisku Utwórz nowe można utworzyć nową relację między dwiema tabelami i polami.
W przypadku uruchamiania kwerendy dotyczącej powiązanych tabel Access domyślnie zwraca tylko te rekordy, które występują w obu tabelach. W naszym przykładzie systemu płac, który omawialiśmy w punkcie „Reguły integralności specyficzne dla aplikacji” we wcześniejszej części tego rozdziału, oznacza to wyświetlanie danych tylko tych pracowników, dla których istnieją poprawne rekordy czeków płacowych w tabeli z danymi o czekach. W wynikach kwerendy nie będzie danych pracowników, którzy dotąd nie otrzymali czeku z wypłatą. Takie relacje czasami określa się jako złączenia wewnętrzne (ang. inner join), ponieważ występują w nich tylko te rekordy, które istnieją po obu stronach relacji. Nie jest to jednak jedyny typ złączeń obsługiwanych przez Accessa. Kliknięcie przycisku Typ sprzężenia powoduje otwarcie okna dialogowego Właściwości sprzężenia. Alternatywne ustawienia w oknie dialogowym Typ sprzężenia umożliwiają określenie, czy w wynikach mają się pojawić wszystkie rekordy zarówno z tabeli-rodzica, jak i z tabeli-dziecka, niezależnie od tego, czy istnieje odpowiednik po drugiej stronie (dopuszcza się możliwość występowania niedopasowanego rekordu-dziecka pod warunkiem, że klucz obcy w tabelidziecku ma wartość null). Takie złączenie (nazywane złączeniem zewnętrznym; ang. outer join) jest bardzo przydatne, ponieważ dokładnie odzwierciedla stan danych w aplikacji. W przypadku bazy danych MiniAuta dla Kolekcjonerów oznacza to wyświetlanie danych wszystkich klientów, niezależnie od tego, czy istnieją dla nich rekordy w tabeli transakcji — to jest to, o co nam chodzi. Aby zdefiniować złączenie zewnętrzne łączące klientów z transakcjami, wykonaj następujące czynności: 1. W oknie Relacje dodaj tabele tblCustomers i tblSales. 2. Przeciągnij pole CustomerID z jednej tabeli do drugiej. Pojawi się okno dialogowe Edytowanie relacji. 3. Kliknij przycisk Typ sprzężenia. Wyświetli się okno Właściwości sprzężenia (zobacz rysunek 4.18). Rysunek 4.18. Okno dialogowe Właściwości sprzężenia, służące do określania właściwości sprzężenia pomiędzy tabelami tblCustomers oraz tblSales. Zauważmy, że wybrano opcję uwzględniania wszystkich rekordów z tabeli klientów
150
Część II Tabele Accessa
4. Kliknij przycisk opcji Uwzględnia WSZYSTKIE rekordy z „tblCustomers” i tylko te rekordy z „tblSales”, dla których sprzężone pola są równe. 5. Kliknij OK. Access powróci do okna dialogowego Edytowanie relacji. 6. Kliknij OK. Access powróci do okna Relacje. W oknie Relacje powinna teraz pokazać się strzałka skierowana od tabeli tblCustomers w stronę tabeli tblSales. W tym momencie wszystko jest przygotowane do określenia więzów integralności pomiędzy dwiema tabelami złączenia zewnętrznego. Aby zmodyfikować istniejącą relację, kliknij dwukrotnie linię tej relacji w oknie Relacje. Pojawi się okno dialogowe Edytowanie relacji. Możesz w nim zmienić ustawienia dotyczące integralności odwołań i typu złączenia.
Jeśli złączenie zostanie zdefiniowane w sposób pokazany na rysunku 4.18, w kwerendach korzystających z tabel klientów i transakcji zostaną zwrócone rekordy wszystkich klientów — nawet tych, którzy jeszcze nie składali zamówień. Wprowadzenie takiego ustawienia pozwala na uzyskanie pełniejszego obrazu klientów firmy, wyświetlają się bowiem wszyscy klienci, a nie tylko ci, którzy składali zamówienia. Określanie typu złączenia dla wszystkich relacji w bazie danych nie jest absolutnie konieczne. W następnych rozdziałach dowiemy się, że można określić złączenia zewnętrzne dla każdej kwerendy w aplikacji. Wielu projektantów korzysta z domyślnych złączeń wewnętrznych dla wszystkich relacji w tworzonych przez siebie bazach danych i modyfikuje właściwości złączenia na poziomie indywidualnych kwerend w celu uzyskania pożądanych wyników. Wymuszanie więzów integralności Po zdefiniowaniu relacji, zweryfikowaniu tabel i pól łączących za pomocą okna dialogowego Edytowanie relacji oraz ustaleniu typu złączenia można określić więzy integralności pomiędzy tabelami. W tym celu należy zaznaczyć pole wyboru Wymuszaj więzy integralności znajdujące się w dolnej części okna Edytowanie relacji. To oznacza, że chcemy, by Access wymuszał stosowanie reguł integralności dla relacji między tabelami. Jeżeli zrezygnujemy z wymuszania więzów integralności, użytkownicy będą mogli dodawać nowe rekordy, zmieniać wartości w polach kluczowych oraz usuwać rekordy bez zwracania uwagi na więzy integralności — niesie to ze sobą ryzyko modyfikacji zawartości krytycznych pól i uszkodzenia danych aplikacji. Bez aktywnych więzów integralności można doprowadzić do powstania osieroconych rekordów (transakcji bez klienta). Dla zwykłych operacji (takich jak wpisywanie czy modyfikowanie informacji) więzy integralności powinny być wymuszane.
Wymuszanie więzów integralności daje również dostęp do dwóch innych opcji (kaskadowych aktualizacji i kaskadowego usuwania wierszy), które mogą się przydać w pewnych sytuacjach. Opcje te można znaleźć w dolnej części okna dialogowego Edytowanie relacji (zobacz rysunek 4.16). Po zaznaczeniu pola wyboru Wymuszaj więzy integralności i kliknięciu przycisku Utwórz (lub przycisku OK, jeżeli okno Edytowanie relacji zostało otwarte dla istniejącej relacji) może się okazać, że Access nie pozwoli na utworzenie tak zdefiniowanej relacji z zastosowanymi więzami integralności. Powodem prawdopodobnie jest to, że chcemy utworzyć relację dla tabel, w których rekordy naruszają reguły z tego wynikające
Rozdział 4. Relacje między tabelami
151
(np. w tabeli podrzędnej istnieją rekordy osierocone). W takiej sytuacji Access wyświetli ostrzeżenie w oknie dialogowym podobnym do pokazanego na rysunku 4.19. Ostrzeżenie w tym przypadku wyświetla się dlatego, że w tabeli tblSales istnieją rekordy, które nie mają odpowiedników w tabeli przedstawicieli. Z tego powodu Access nie może utworzyć więzów integralności pomiędzy wskazanymi tabelami, gdyż zapisane w nich dane naruszają reguły integralności.
Rysunek 4.19. Okno dialogowe z ostrzeżeniem o braku możliwości wymuszania więzów integralności z powodu naruszenia reguł Aby rozwiązać konflikty występujące pomiędzy istniejącymi tabelami, można za pomocą kreatora kwerend utworzyć kwerendę wyszukującą niedopasowane dane, która odnajdzie wszystkie rekordy po stronie „wiele” relacji naruszające reguły więzów integralności. Następnie można zmienić typ kwerendy na kwerendę usuwającą i za jej pomocą usunąć niewłaściwe rekordy lub wpisać poprawne wartości w polu SalespersonID.
Można usunąć nieodpowiednie rekordy, powrócić do okna relacji i wtedy ustalić wymuszanie więzów integralności pomiędzy tabelami. To, czy porządkowanie danych poprzez usuwanie rekordów jest właściwe, zależy od reguł biznesowych zarządzających aplikacją. Usuwanie zamówień tylko dlatego, że nie można wymusić więzów integralności, w większości przypadków jest niewłaściwe. Zaznaczenie opcji Kaskadowo aktualizuj pola pokrewne
Jeżeli w oknie Edytowanie relacji zaznaczy się pole Wymuszaj więzy integralności, Access uaktywni pole opcji o nazwie Kaskadowo aktualizuj pola pokrewne. Ta opcja mówi Accessowi o tym, że jeśli użytkownik zmieni zawartość powiązanych ze sobą pól (pól klucza głównego w tabeli nadrzędnej, np. CustomerID), zmiana ta będzie uwzględniona we wszystkich powiązanych tabelach. Jeśli pole klucza głównego w tabeli nadrzędnej jest powiązane z kilkoma tabelami, opcję tę należy zaznaczyć dla wszystkich powiązanych tabel. Jeśli się tego nie zrobi, opcja nie będzie działała prawidłowo.
Ogólnie rzecz biorąc, jest bardzo niewiele powodów, dla których warto by zmieniać wartość klucza głównego. Podany w punkcie „Wiązanie danych” we wcześniejszej części rozdziału przykład dotyczący brakującego NIP-u jest jednym z przypadków, kiedy może zachodzić potrzeba zastąpienia tymczasowego NIP-u stałym już po dodaniu danych pracownika do bazy danych. Jednak gdy używamy pól typu Autonumerowanie lub innych sztucznych wartości kluczy, po dodaniu rekordu do bazy danych bardzo rzadko występują powody, dla których należałoby zmodyfikować wartość klucza.
152
Część II Tabele Accessa Zaznaczenie opcji Kaskadowo usuń rekordy pokrewne
Opcja Kaskadowo usuń rekordy pokrewne instruuje Accessa o tym, że należy usunąć wszystkie powiązane rekordy pokrewne w przypadku usunięcie rekordu nadrzędnego. Chociaż czasami opcja ta może się przydać, to stosując ją, należy — podobnie jak w przypadku wielu innych opcji — zachować szczególną ostrożność. Na przykład jeżeli zaznaczymy pole wyboru Kaskadowo usuń rekordy pokrewne i spróbujemy usunąć określonego klienta (który przeprowadził się za granicę), Access najpierw usunie wszystkie związane z nim rekordy z tabel podrzędnych tblSales i tblSales LineItems, a dopiero potem usunie rekord klienta. Mówiąc inaczej: Access usunie wszystkie rekordy pozycji transakcji (szczegóły transakcji) dla wszystkich transakcji danego klienta, następnie wszystkie rekordy transakcji dla danego klienta i na końcu sam rekord klienta — wszystko podczas jednej operacji. Wielu Czytelników z pewnością już zauważyło, na czym polega podstawowy problem związany z kaskadowym usuwaniem rekordów. Jeśli razem z usunięciem danych o kliencie zostaną usunięte wszystkie rekordy dotyczące jego transakcji, nie będzie sposobu na utworzenie raportu zawierającego historyczne dane finansowe. Nie będzie można na przykład przedstawić wiarygodnych informacji na temat danych handlowych z poprzedniego roku, ponieważ wszystkie rekordy transakcji byłych klientów zostały usunięte z bazy danych. W tym konkretnym przykładzie utracilibyśmy również możliwość tworzenia raportów na temat trendów w sprzedaży, wielkości sprzedaży poszczególnych kategorii produktów, a także różnego rodzaju inne sposoby wykorzystania danych aplikacji. Znacznie sensowniejszym postępowaniem byłoby zdefiniowanie pola Active (typu Tak/Nie) w tabeli klientów. Pole to wskazywałoby klientów, którzy są aktywni. Z łatwością można by wówczas uwzględnić wartość pola Active w tych kwerendach, w których interesują nas tylko klienci aktywni (Active = Tak), i zignorować wartość pola Active w tych kwerendach, w których potrzebne są wszystkie transakcje (niezależnie od statusu aktywności klienta). Aby skorzystać z tej opcji, trzeba zaznaczyć pole Kaskadowo usuń rekordy pokrewne dla wszystkich relacji związanych z daną tabelą istniejących w bazie. Jeśli nie zaznaczy się tej opcji dla wszystkich tabel w łańcuchu powiązanych tabel, Access nie zezwoli na kaskadowe usuwanie rekordów.
Ogólnie rzecz biorąc, zezwalanie na kaskadowe usuwanie rekordów w bazie danych wydaje się złym pomysłem. Bardzo łatwo o przypadkowe usunięcie ważnych danych. Wyobraźmy sobie sytuację, w której użytkownik przypadkowo usuwa klienta, zerując całą historię jego transakcji — włącznie z płatnościami, wysyłkami, reklamacjami, promocjami i innymi działaniami. Jest bardzo mało sytuacji, w których można zezwolić użytkownikom na usuwanie wielu różnych rodzajów danych w pojedynczej operacji.
Przeglądanie wszystkich relacji Aby obejrzeć wszystkie relacje zdefiniowane w bazie danych, należy w zakładce NARZĘDZIA RELACJI PROJEKTOWANIE na wstążce wybrać polecenie Wszystkie relacje. Aby uprościć widok wyświetlany w oknie Relacje, można ukryć niektóre relacje poprzez usunięcie tabel wyświetlanych w tym oknie. Aby to zrobić, wystarczy kliknąć tabelę, a następnie wcisnąć klawisz Delete. Kiedy się to zrobi, Access usunie tabelę z okna Relacje. Usunięcie tabeli z okna Relacje nie powoduje usunięcia relacji między tabelą a innymi tabelami w bazie danych.
Rozdział 4. Relacje między tabelami
153
Podczas tworzenia tabel bazy danych należy sprawdzić, czy właściwość Wymagane dla pola klucza obcego w powiązanej tabeli (w przypadku tabel tblBookOrders5 i tblBookOrderDetails kluczem obcym jest pole OrderID w tabeli tblBookOrderDetails) ustawiono na wartość Tak. Ustawienie to daje pewność, że użytkownik wprowadzi wartość w polu klucza obcego, co daje możliwość utworzenia relacji między tabelami. Relacje utworzone w oknie Relacje mają charakter trwały i są zarządzane przez Accessa. Po utworzeniu trwałych relacji pojawiają się one domyślnie w oknie projektu kwerendy w momencie dodania tabel wchodzących w ich skład (kwerendy opisano bardziej szczegółowo w części III). Nawet bez zdefiniowania trwałych relacji między tabelami można stworzyć relacje tymczasowe za każdym razem, kiedy dodamy wiele tabel w oknie projektu kwerendy.
Usuwanie relacji Od czasu do czasu pojawia się potrzeba usunięcia relacji między tabelami. Okno Relacje to jedynie obraz relacji między tabelami. Jeśli otworzymy okno Relacje i po kliknięciu każdej z tabel wchodzących w skład relacji wciśniemy klawisz Delete, usuniemy obraz tabel wchodzących w skład relacji, ale nie samą relację. Aby usunąć relację, należy kliknąć linię łączącą tabele, a następnie wcisnąć klawisz Delete. Dopiero potem należy usunąć obraz każdej z tabel, które tworzyły relację.
Reguły integralności specyficzne dla aplikacji Oprócz reguł integralności wymuszanych przez silnik bazy danych ACE można zdefiniować szereg reguł biznesowych, które są wymuszane przez aplikacje tworzone w Accessie. W wielu przypadkach klienci lub użytkownicy informują o regułach biznesowych, które powinna spełniać aplikacja. Do zadań programisty należy utworzenie kodu Visual Basica, zaprojektowanie tabel, właściwości pól itp., czyli zaimplementowanie reguł biznesowych sformułowanych przez użytkowników. Typowe reguły biznesowe obejmują zagadnienia podobne do następujących:
Pracownik zajmujący się wprowadzaniem zamówień powinien wprowadzić swój identyfikator na formularzu używanym do wprowadzania danych.
Nie można wprowadzać liczby sztuk mniejszej od zera.
Cena jednostkowa sprzedaży nigdy nie może być niższa od ceny zakupu.
Data wysyłki zamówienia musi określać dzień po dacie zamówienia.
Najczęściej reguły te formułuje się w odniesieniu do tabeli w momencie jej projektowania. Wymuszenie takich reguł w znacznym stopniu wpływa na ochronę wartości danych zarządzanych przez bazę. Na przykład na rysunku 4.20 właściwość Reguła poprawności dla pola z liczbą sztuk (>=0) zapewnia, że liczba nigdy nie może być ujemna. Jeśli magazynier spróbuje wprowadzić liczbę ujemną w polu Quantity, wyświetli się okno z komunikatem o błędzie zawierające zdefiniowany tekst ostrzeżenia (Ta wartość nie może być ujemna).
154
Część II Tabele Accessa
Rysunek 4.20. Prosta reguła sprawdzania poprawności w dużym stopniu przyczynia się do ochrony integralności bazy danych
Reguły sprawdzania poprawności można również definiować na poziomie tabeli, używając właściwości Reguła poprawności w Arkuszu właściwości. Reguły te zapewniają ochronę danych w tabeli. Niestety, dla całej tabeli można utworzyć tylko jedną regułę. W związku z tym zdefiniowanie odpowiedniego tekstu dla wszystkich możliwych przypadków naruszenia reguły jest trudne. Właściwość Reguła poprawności ma pewne ograniczenia. Na przykład nie można wykorzystać w niej funkcji zdefiniowanych przez użytkownika. Ponadto w regułach nie można używać tu innych pól, danych z innych rekordów ani innych tabel. Reguły poprawności uniemożliwiają wprowadzanie danych zamiast wyświetlać ostrzeżenia, które użytkownik mógłby zignorować. Jeśli chcesz udostępniać ostrzeżenie, a przy tym umożliwić kontynuowanie pracy, nie stosuj reguł poprawności. W książce znajdziesz przykłady zastosowania kodu VBA do wymuszania reguł biznesowych.
Rozdział 5.
Praca z tabelami W tym rozdziale:
Arkusze danych
Okno arkusza danych
Otwieranie arkusza danych
Wpisywanie nowych danych
Poruszanie się między rekordami
Modyfikowanie wartości w arkuszu danych
Korzystanie z możliwości wycofywania zmian
Kopiowanie i wklejanie wartości w arkuszu danych
Zastępowanie wartości w arkuszu danych
Dodawanie nowych rekordów w arkuszu danych
Usuwanie rekordów w arkuszu danych
Wyświetlanie rekordów w arkuszu danych
Sortowanie i filtrowanie rekordów
Agregowanie danych
Drukowanie rekordów
W tym rozdziale skorzystamy z widoku arkusza danych do wprowadzania danych do tabel Accessa oraz do wyświetlania danych na wiele różnych sposobów. Korzystając z widoku arkusza danych, można obejrzeć wiele rekordów naraz w znanym formacie podobnym do arkusza kalkulacyjnego. Użyjemy tabel tblContacts i tblProducts do wprowadzania, modyfikowania i usuwania danych, a także poznamy inne własności dostępne w widoku arkusza danych. W tym rozdziale wykorzystano bazę danych Rozdział05.accdb. Jeżeli ktoś jeszcze nie skopiował przykładów na dysk swojego komputera, powinien zrobić to teraz.
156
Część II Tabele Accessa
Arkusze danych Arkusze danych to jeden z wielu sposobów na przeglądanie danych w Accessie. Arkusz danych przedstawia dane w postaci wierszy i kolumn. Widok arkusza danych tabeli zaprezentowano na rysunku 5.1. Każdy wiersz reprezentuje pojedynczy rekord w tabeli, a każda kolumna — jedno pole. Aby zobaczyć wiersze (rekordy), które nie mieszczą się na ekranie, należy przewinąć ekran w górę lub w dół. Aby obejrzeć niewidoczne kolumny (pola), wystarczy przewinąć ekran w lewo bądź w prawo. Rysunek 5.1. Typowe okno arkusza danych. Każdy wiersz reprezentuje pojedynczy rekord w tabeli, a każda kolumna jedno pole (np. z opisem lub datą produkcji danego modelu)
Wiele własności opisanych w niniejszym rozdziale ma zastosowanie również do formularzy Accessa. Większość formularzy Accessa w wybranym momencie wyświetla dane z jednego rekordu. Praca z danymi w takim formularzu przypomina pracę z danymi w pojedynczym wierszu arkusza danych.
Arkusze danych można dostosować do potrzeb, co zapewnia wiele różnych sposobów wyświetlania danych. Zmieniając rozmiar czcionki, szerokości kolumn i wysokość wierszy, można sprawić, że więcej danych zmieści się na ekranie. Zmiana kolejności wierszy i (lub) kolumn umożliwia logiczne organizowanie rekordów i pól. Dzięki blokowaniu kolumn pozostają one w tej samej pozycji podczas przewijania do innych części arkusza danych, a ukrywanie kolumn powoduje, że znikają one z ekranu. Filtrowanie danych pozwala na ukrycie rekordów, które nie spełniają żądanych kryteriów. Widok arkusza danych umożliwia wyświetlanie danych z różnych źródeł: tabel, kwerend i formularzy. W zależności od źródła danych niektóre własności arkuszy danych opisane w niniejszym rozdziale mogą działać nieco odmiennie. Dotyczy to zwłaszcza sytuacji, w której źródłem danych jest kwerenda lub formularz. W przypadku tych źródeł danych często się zdarza, że arkusz danych jest dostępny tylko do odczytu.
Rozdział 5. Praca z tabelami
157
Krótkie przypomnienie informacji o rekordach i polach Tabela jest kontenerem umożliwiającym przechowywanie powiązanych ze sobą informacji, np. danych pacjentów, listy kartek do wysłania (z okazji urodzin lub świąt), przypomnień o datach urodzin czy informacji płacowych. Każda tabela ma formalną strukturę. Składa się z pól, z których każde ma unikatową nazwę identyfikującą i opisującą przechowywane informacje oraz zawiera określonego typu dane (tekstowe, liczbowe, daty, godziny itp.). Typ danych decyduje o rodzaju informacji, jakie użytkownik może wprowadzać w danym polu. Kiedy informacje z tabeli są wyświetlane w arkuszu danych (dwuwymiarowym arkuszu z informacjami), Access wyświetla pola w kolumnach. Tabela składa się z rekordów. Każdy rekord zawiera informacje na temat pojedynczego podmiotu (np. określonego klienta lub towaru). Rekord składa się z informacji zapisanych we wszystkich polach w strukturze tabeli. Jeśli na przykład tabela zawiera trzy pola — nazwisko, adres i numer telefonu — to pierwszy rekord zawiera tylko jedno nazwisko, jeden adres i jeden numer telefonu. Drugi rekord także zawiera jedno nazwisko, jeden adres i jeden numer telefonu. Arkusz danych zapewnia idealny sposób przeglądania całej zawartości tabeli. Pojedynczy rekord wyświetla się w arkuszu danych jako jeden wiersz. Każdy wiersz zawiera informacje dotyczące tego rekordu. Pola wyświetlają się w arkuszu danych jako kolumny. Każda kolumna zawiera informacje dotyczące pojedynczego pola. Dzięki takiemu układowi w postaci wierszy i kolumn można przeglądać wiele danych naraz.
Okno arkusza danych Dane w widoku arkusza danych są domyślnie uporządkowane według klucza głównego, a pola występują w takiej kolejności, w jakiej zdefiniowano je w projekcie tabeli. W górnej części okna Accessa wyświetla się pasek tytułu (z nazwą pliku bazy danych), pasek narzędzi szybkiego dostępu i wstążka. W dolnej części okna Accessa znajduje się pasek stanu, który służy do wyświetlania różnych informacji na temat arkusza danych. Na przykład może zawierać opis pola, komunikaty o błędach, ostrzeżenia lub pasek postępu. Zwykle komunikaty o błędach i ostrzeżenia zamiast na pasku stanu pojawiają się w oknach dialogowych wyświetlanych na środku ekranu. Jeżeli funkcja któregoś z przycisków paska narzędzi jest nie całkiem jasna, można wskazać go za pomocą kursora myszy, a po chwili wyświetli się etykietka ekranowa zawierająca krótkie wyjaśnienie. Z prawej strony okna znajduje się pasek przewijania umożliwiający szybkie przemieszczanie się między rekordami. W czasie przesuwania belki wyświetla się etykietka informująca o docelowej pozycji (zobacz rysunek 5.1). Rozmiar belki (niewielkiego prostokąta na pasku przewijania) daje ogólne pojęcie na temat tego, ile wyświetla się rekordów z ogólnej liczby rekordów zapisanych w bazie. Na dole okna arkusza danych znajduje się pasek przewijania służący do poruszania się między polami (w lewo i w prawo), a w lewym dolnym rogu umieszczone są przyciski nawigacyjne (z lewej strony), za pomocą których również można się poruszać między rekordami.
Poruszanie się po arkuszu danych Najprostszym sposobem poruszania się w obrębie okna arkusza danych jest korzystanie z myszy — wystarczy kliknąć komórkę, w której chcemy wpisać lub zmodyfikować dane. Dodatkowo przemieszczanie się między rekordami i polami ułatwiają wstążki, paski przewijania oraz przyciski nawigacyjne. Arkusz danych można sobie wyobrazić jako
158
Część II Tabele Accessa
arkusz kalkulacyjny pozbawiony numerów wierszy i literowych oznaczeń kolumn. Zamiast tego kolumny mają nazwy, natomiast rekordy są unikatowe i umożliwiają w ten sposób zlokalizowanie dowolnej wartości. Klawisze służące do przemieszczania się w obrębie arkusza danych zaprezentowano w tabeli 5.1. Tabela 5.1. Poruszanie się po oknie arkusza danych Kierunek
Kombinacja klawiszy
Następne pole
Tab
Poprzednie pole
Shift+Tab
Pierwsze pole bieżącego rekordu
Home
Ostatnie pole bieżącego rekordu
End
Następny rekord
Strzałka w dół (↓)
Poprzedni rekord
Strzałka w górę (↑)
Pierwsze pole pierwszego rekordu
Ctrl+Home
Ostatnie pole ostatniego rekordu
Ctrl+End
Przewinięcie o jedną stronę w górę
PgUp
Przewinięcie o jedną stronę w dół
PgDn
Korzystanie z przycisków nawigacyjnych Przyciski nawigacyjne (zobacz rysunek 5.2) to sześć formantów umieszczonych w dolnej części okna arkusza danych. Za ich pomocą można poruszać się między rekordami. Dwa formanty położone najbardziej z lewej strony służą do przechodzenia odpowiednio do pierwszego i poprzedniego rekordu w arkuszu. Trzy formanty z prawej powodują przejście do następnego, ostatniego oraz nowego rekordu arkusza danych. Jeśli znamy numer rekordu (numer wiersza określonego rekordu), możemy przejść do niego poprzez kliknięcie pola numeru rekordu, wpisanie numeru rekordu i wciśnięcie klawisza Enter. Rysunek 5.2. Przyciski nawigacyjne arkusza danych
Jeżeli wpiszemy numer rekordu większy od liczby rekordów występujących w tabeli, wyświetli się komunikat z informacją, że przejście do określonego rekordu nie jest możliwe.
Rozdział 5. Praca z tabelami
159
Wstążka arkusza danych Wstążka arkusza danych (zobacz rysunek 5.3) umożliwia pracę z arkuszem danych. Na zakładce NARZĘDZIA GŁÓWNE znajduje się kilka znanych obiektów (jak również kilka nowych). W tym punkcie zamieszczono opis grup znajdujących się na wstążce. Poszczególne polecenia zostały opisane bardziej szczegółowo w dalszej części tego rozdziału.
Rysunek 5.3. Wstążka widoku arkusza danych, zakładka NARZĘDZIA GŁÓWNE Wstążki zostaną omówione w rozdziale 30.
Widoki Grupa Widoki umożliwia przełączanie między widokiem arkusza danych, tabeli przestawnej, wykresu przestawnego i widoku projektu. Wszystkie cztery opcje można zobaczyć po kliknięciu strzałki w dół polecenia Widok. Kliknięcie polecenia Widok projektu pozwala na wprowadzanie zmian w strukturze obiektu (tabeli, kwerendzie itp.). Aby powrócić do widoku arkusza danych, należy kliknąć polecenie Widok arkusza danych. Schowek W grupie Schowek są dostępne polecenia Wytnij, Kopiuj i Wklej. Działają one podobnie jak analogiczne polecenia w innych aplikacjach (Wordzie, Excelu itp.). Kliknięcie strzałki w dół polecenia Wklej daje dostęp do trzech opcji: Wklej, Wklej specjalnie oraz Dołącz i wklej. Polecenie Wklej specjalnie umożliwia wklejanie zawartości schowka w różnych formatach (tekst, CSV, rekordy itp.). Polecenie Dołącz i wklej wkleja zawartość schowka w postaci nowych rekordów — pod warunkiem, że skopiowano wiersz o podobnej strukturze. Sortowanie i filtrowanie Grupa Sortowanie i filtrowanie umożliwia zmianę kolejności wierszy, a także ograniczenie wyświetlanych wierszy na podstawie wybranych kryteriów. Rekordy Polecenia z grupy Rekordy umożliwiają zapisywanie, usuwanie lub dodawanie nowych rekordów do arkusza danych. Są tam również polecenia do wyświetlania podsumowań, sprawdzania pisowni, blokowania i ukrywania kolumn, a także zmiany wysokości wiersza i szerokości komórki.
160
Część II Tabele Accessa
Znajdowanie Grupa Znajdowanie pozwala na wyszukiwanie danych z zastępowaniem oraz przechodzenie do wskazanych rekordów w arkuszu danych. Polecenie Zaznacz umożliwia wybór jednego lub wszystkich rekordów. Okno Grupa Okno zawiera dwa przyciski ułatwiające zarządzaniem obiektami (formularzami, raportami, tabelami itp.), które są otwarte w głównym oknie Accessa:
Dostosuj do rozmiaru formularza — powoduje zmianę rozmiaru formularza w oknie w taki sposób, by odpowiadał rozmiarowi ustawionemu podczas tworzenia formularza. Domyślnie można zmieniać rozmiar formularzy w Accessie. W związku z tym użytkownik może ustawić nowy rozmiar. Przycisk Dostosuj do rozmiaru formularza przywraca rozmiar formularza do stanu określonego podczas projektowania.
Przełącz okna — umożliwia wybranie innego otwartego okna. Formularz lub raport, z którym użytkownik chce pracować, może być przykryty przez inny formularz lub raport. Przycisk Przełącz okna umożliwia szybki wybór obiektu, który ma się znaleźć na wierzchu otwartych dokumentów w głównym oknie Accessa.
Formatowanie tekstu Grupa Formatowanie tekstu umożliwia zmianę wyglądu pól tekstowych w arkuszu danych. Za pomocą poleceń z tej grupy można zmieniać czcionkę, rozmiar, ustawiać pogrubienie, kursywę, kolor itp. Wybranie atrybutu czcionki (np. pogrubiony) powoduje jego zastosowanie do wszystkich pól w arkuszu danych (wyjątek od tej reguły opisano w uwadze zamieszczonej bezpośrednio pod tym akapitem). Polecenia Wyrównaj do lewej, Wyrównaj do prawej i Wyrównaj do środka umożliwiają wyrównywanie danych w wybranej kolumnie. Kliknięcie polecenia Linie siatki pozwala na włączanie i wyłączanie linii siatki. Polecenie Alternatywny kolor wypełnienia/tła służy do zmiany kolorów kolejnych wierszy lub wyboru dla nich jednakowego koloru. Jeśli fokus znajduje się w polu innego typu niż Krótki tekst lub Długi tekst, to wszystkie formanty w grupie Formatowanie tekstu są zablokowane. Formanty z grupy Formatowanie tekstu zachowują się inaczej, jeśli aktualnie zaznaczone pole w arkuszu danych jest typu Długi tekst. Dla pól typu Długi tekst można zmieniać atrybuty czcionki (pogrubienie, podkreślenie, kursywa itp.) dla poszczególnych znaków lub słów w polu, ale jest to możliwe tylko wtedy, gdy właściwość Format tekstu ustawiono na Tekst sformatowany. Właściwość Format tekstu (mająca zastosowanie wyłącznie do pól typu Długi tekst) domyślnie ma wartość Zwykły tekst.
Otwieranie arkusza danych Aby otworzyć arkusz danych z poziomu okna bazy danych, wykonaj poniższe czynności: 1. Jeżeli baza danych Rozdział05.accdb jest otwarta, kliknij przycisk Tabele w okienku nawigacji. 2. Dwukrotnie kliknij nazwę tabeli, którą chcesz otworzyć (w naszym przykładzie tblProducts).
Rozdział 5. Praca z tabelami
161
Innym sposobem otwarcia arkusza danych jest kliknięcie prawym przyciskiem myszy tabeli tblProducts i wybranie polecenia Otwórz z menu podręcznego. Jeżeli znajdujesz się w którymś z okien widoków projektu tabeli, to aby wyświetlić dane w widoku arkusza danych, wystarczy kliknąć przycisk Widok arkusz danych w grupie Widoki na wstążce.
Wpisywanie nowych danych Po otwarciu arkusza danych widoczne są wszystkie rekordy znajdujące się w tabeli. Jeżeli dopiero co utworzono strukturę tabeli, nowy arkusz danych nie będzie zawierał żadnych danych. Na rysunku 5.4 pokazano pusty arkusz danych i fragment zakładki POLA na wstążce. W pustym arkuszu danych pierwszy wiersz zawiera gwiazdkę (*) w selektorze rekordu — oznacza to nowy rekord.
Rysunek 5.4. Pusty arkusz danych. Zwróćmy uwagę, że pierwszy rekord jest pusty i zawiera gwiazdkę w obszarze selektora rekordu
Zakładka NARZĘDZIA TABEL na wstążce zawiera prawie wszystkie narzędzia potrzebne do stworzenia kompletnej tabeli. Za jej pomocą można określić typ danych, domyślne formatowanie, indeksowanie oraz reguły sprawdzania poprawności na poziomie pól i tabeli, a także wykonać inne zadania z zakresu projektowania tabel. Jeśli arkusz danych zawiera już rekordy, nowy rekord wyświetla się w dolnej części arkusza danych. Aby ustawić kursor w wierszu nowego rekordu, należy kliknąć polecenie Nowy w grupie Rekordy na wstążce, kliknąć przycisk nawigacji Nowy (pusty) rekord w dolnej części arkusza danych lub po prostu kliknąć w ostatnim wierszu (zawierającym gwiazdkę). Kiedy użytkownik rozpoczyna wprowadzanie danych, gwiazdka zamienia się
162
Część II Tabele Accessa
w ołówek — oznacza to, że rekord jest poddawany edycji. Wiersz nowego rekordu (zawierający gwiazdkę) wyświetla się poniżej wiersza, w którym użytkownik wprowadza dane. Wskaźnik nowego rekordu zawsze znajduje się w ostatnim wierszu arkusza danych. Dodawanie nowego rekordu do tabeli tblProducts pokazano na rysunku 5.5. Rysunek 5.5. Dopisywanie rekordu do arkusza danych tabeli tblProducts
Aby dodać nowy rekord do tabeli tblProducts otwartej w widoku arkusza danych, wykonaj poniższe czynności: 1. Kliknij przycisk Nowy rekord w grupie Rekordy zakładki NARZĘDZIA GŁÓWNE na wstążce. 2. Wpisz we wszystkich polach tabeli wartości, przemieszczając się między polami za pomocą klawisza Enter lub Tab. W czasie dodawania lub modyfikowania rekordów wskaźnik rekordu może przyjmować jedną z trzech postaci:
Edytowany rekord — ikona w postaci ołówka.
Rekord jest zablokowany (w systemach wieloużytkownikowych) — ikona w postaci kłódki.
Nowy rekord — ikona w postaci ołówka. Jeżeli rekord zawiera pole typu Autonumerowanie, to Access w odpowiadającej mu kolumnie wyświetli tekst (Nowy). Nie można wprowadzać własnych wartości do pól tego typu, należy po prostu nacisnąć klawisz Enter lub Tab, aby przejść do następnej kolumny. Po wprowadzeniu danych Access automatycznie umieści w tym polu odpowiednią liczbę.
Zapisywanie rekordu Przejście do innego rekordu powoduje zapisanie rekordu, który edytowaliśmy. Zapisanie edytowanego rekordu następuje również podczas poruszania się między polami za pomocą klawisza Tab, a także po kliknięciu przycisków nawigacyjnych, kliknięciu Zapisz w grupie Rekordy na wstążce oraz zamknięciu tabeli. Sygnałem, który wskazuje na to, że rekord zapisano, jest zniknięcie symbolu ołówka z obszaru selektora rekordów.
Rozdział 5. Praca z tabelami
163
Aby możliwe było zapisanie rekordu, we wszystkich jego polach muszą się znajdować prawidłowe wartości. Pola są sprawdzane pod względem typu danych, niepowtarzalności (w przypadku zdefiniowania unikatowego indeksu) oraz wszelkich pozostałych reguł sprawdzania poprawności określonych we właściwości Reguła poprawności. Jeśli tabela zawiera klucz główny, który nie jest polem typu Autonumerowanie, w celu uniknięcia wyświetlenia komunikatu o błędzie pokazanego na rysunku 5.6 trzeba sprawdzić, czy wprowadzono niepowtarzalną wartość w polu klucza głównego. Najłatwiejszym sposobem uporania się z tym problemem jest wykorzystanie pola typu Autonumerowanie w roli klucza głównego.
Rysunek 5.6. Komunikat o błędzie Accessa wyświetlany przy próbie zapisania rekordu z powtarzającą się wartością klucza głównego. Aby uniknąć wystąpienia takiego błędu, w roli klucza głównego należy zastosować pole typu Autonumerowanie Przycisk Cofnij na pasku narzędzi szybkiego dostępu powoduje cofnięcie zmian w bieżącym rekordzie oraz w ostatnio zapisanym rekordzie. Po zmodyfikowaniu drugiego rekordu nie można cofnąć zmian w zapisanym rekordzie. Rekord można zapisać na dysku bez opuszczania rekordu, naciskając klawisze Shift+Enter.
Wiesz już, jak należy wprowadzać, modyfikować i zapisywać dane w nowych lub istniejących rekordach. W kolejnym punkcie dowiesz się, w jaki sposób Access sprawdza poprawność danych wprowadzanych w polach.
Automatyczne sprawdzanie poprawności typów danych Access sprawdza automatycznie poprawność pewnych typów danych. Dzięki temu nie trzeba we właściwościach tabeli definiować dla nich żadnych reguł sprawdzania poprawności. Typy danych, których poprawność Access potrafi sprawdzić automatycznie, to między innymi: Liczba/Waluta Data/Godzina Tak/Nie
Access sprawdza poprawność typu danych przy wyjściu z pola. Kiedy wprowadzi się literę w polu typu Liczba lub Waluta, początkowo nie wyświetla się ostrzeżenie informujące o tym, że wprowadzanie tych znaków jest niedozwolone. Jeśli jednak przejdziemy do innego pola za pomocą klawisza Tab lub po prostu klikniemy w innym polu, Access wyświetli ostrzeżenie podobne do pokazanego na rysunku 5.7, umożliwiające wprowadzenie nowej wartości albo zmianę typu danych kolumny na typ tekstowy.
164
Część II Tabele Accessa
Rysunek 5.7. Ostrzeżenie wyświetlane w przypadku, gdy użytkownik wprowadzi dane nieodpowiednie dla typu danych pola. Access oferuje kilka możliwości naprawienia problemu
Komunikat ten wyświetli się, jeśli użytkownik wprowadzi inne niedozwolone znaki (symbole, litery itp.), wprowadzi więcej niż jeden znak kropki dziesiętnej lub wprowadzi zbyt dużą liczbę dla określonego typu liczbowego. Access sprawdza, czy w polach typu Data/Godzina wprowadzono prawidłowe wartości dat lub godzin. Próba wprowadzenia daty 2005-14-45 lub godziny 37:39:12 albo wpisania niedozwolonego znaku w polu Data/Godzina spowoduje wyświetlenie ostrzeżenia podobnego do tego, które pokazano na rysunku 5.7. Pola typu Tak/Nie wymagają wprowadzenia jednej z predefiniowanych wartości:
Tak — Tak, Prawda, Wł, -1 lub liczby różnej od 0 (co odpowiada wartości -1).
Nie — Nie, Fałsz, Wył lub 0.
Oczywiście można zdefiniować własne dozwolone wartości za pomocą właściwości Format pola, ale ogólnie rzecz biorąc, wymienione wartości są jedynymi dozwolonymi. W przypadku wpisania niepoprawnej wartości wyświetli się ostrzeżenie z komunikatem o nieprawidłowej wartości. Domyślna wartość właściwości Typ kontrolki dla pól typu Tak/Nie to Pole wyboru. Aby uniemożliwić użytkownikom wprowadzenie nieprawidłowych danych w polach typu Tak/Nie, należy wyświetlać w nich pola wyboru.
W jaki sposób właściwości wpływają na wprowadzanie danych? Ponieważ dostępne typy danych różnią się między sobą, do każdego z nich stosujemy inne techniki wprowadzania. Z punktu „Zapisywanie rekordu” we wcześniejszej części tego rozdziału dowiedziałeś się, że niektóre testy poprawności danych są wykonywane automatycznie. Podczas projektowania tabeli tblContacts trzeba jednak zdefiniować kilka formatów i reguł sprawdzania poprawności danych. Sposoby wprowadzania danych opisano w poniższych punktach.
Rozdział 5. Praca z tabelami
165
Wprowadzanie standardowych danych tekstowych Pierwsze pole w tabeli tblContacts — ContactID —jest typu Autonumerowanie, natomiast pozostałe pola w tabeli są typu Krótki tekst. Po pominięciu pola ContactID po prostu wpisujemy wartości w poszczególnych polach. Dla pola ZipCode ustawiono maskę wprowadzania (00\-000;0;). Dla pól Phone i Fax także wykorzystano maski wprowadzania (!\(999") "000\-0000;0;). 0 w masce wprowadzania oznacza wymaganą cyfrę, a 9 — cyfrę opcjonalną. W masce wprowadzania kodu pocztowego wymaganych jest pięć cyfr. Do pól tekstowych, o ile nie zdefiniujemy dla nich masek wprowadzania, można wprowadzać dowolne znaki. Aby wprowadzić pole Krótki tekst lub Długi tekst składające się z wielu wierszy, należy wcisnąć klawisz Ctrl+Enter w celu dodania nowego wiersza. Jest to przydatne na przykład w przypadku formatowania długich łańcuchów znaków zawierających adresy składające się z wielu wierszy.
Wprowadzanie danych typu Data/Godzina Pola OrigCustDate i LastSalesDate z tabeli tblContacts są typu Data/Godzina. Dla obydwu zastosowano format Data krótka (16-03-2012). Moglibyśmy jednak zdefiniować format jako Data średnia (16-Mar-12) albo Data długa (16 marca 2012). Skorzystanie z jednego z tych formatów oznacza, że niezależnie od tego, jak wpiszemy datę — podając miesiąc i rok, dzień, miesiąc i rok albo miesiąc, dzień i rok — data zawsze wyświetli się we wskazanym formacie (data krótka [16-03-2012], data średnia [16-Mar-12] lub data długa [16 marca 2012]). Dlatego możemy wpisać datę jako 13/8/4 albo 13 kwi 4, a po opuszczeniu pola Access i tak wyświetli wartość w sposób zgodny ze zdefiniowanym formatem. W rzeczywistości daty są przechowywane w bazie danych bez formatowania. Z tego powodu format wybrany w formularzu nie ma wpływu na sposób przechowywania danych. Format ma wpływ wyłącznie na sposób wyświetlania danych. Nie zmienia sposobu przechowywania danych w tabeli. Ogólnie rzecz biorąc, stosowanie masek wprowadzania dla danych typu Data/Godzina nie jest dobrym pomysłem. Microsoft Access i bez nich dobrze sprawdza poprawność wprowadzanych wartości dat i godzin. Znacznie bardziej prawdopodobne jest to, że maska wprowadzania w formantach zawierających datę doprowadzi do problemów, niż że pomoże ich uniknąć.
Wprowadzanie danych liczbowych i walutowych ze sprawdzaniem poprawności Dla pola CreditLimit w tabeli tblContacts zdefiniowano regułę sprawdzania poprawności. Zdefiniowano dla niego właściwość Reguła poprawności, która ma na celu ograniczenie kwoty kredytu do 250 000 zł. W przypadku naruszenia reguły wyświetla się okno dialogowe z tekstem reguły sprawdzania poprawności określonym dla pola. Aby zezwolić klientowi na wyższą kwotę kredytu niż 250 000 zł, należy zmodyfikować regułę sprawdzania poprawności w projekcie tabeli. Symbol waluty wykorzystywany w Accessie (w tym przypadku symbol zł) jest określony za pomocą opcji regionalnych dostępnych za pośrednictwem apletu Opcje regionalne i językowe w panelu sterowania.
166
Część II Tabele Accessa
Wprowadzanie danych w polach typu Obiekt OLE W arkuszu danych można wprowadzać dane typu Obiekt OLE (ang. Object Linking and Embedding — dosł. łączenie i osadzanie obiektów), chociaż obiektu nie widać w arkuszu. W polach typu Obiekt OLE można zapisywać różne rodzaje informacji, m.in.:
zdjęcia w postaci map bitowych,
pliki dźwiękowe,
wykresy biznesowe,
pliki Worda lub Excela.
W polach typu Obiekt OLE w Accessie można zapisywać dowolne obiekty obsługiwane przez serwery OLE. Obiekty OLE zazwyczaj są wprowadzane w formularzach. Dzięki temu można zobaczyć bądź usłyszeć wartość lub z niej skorzystać. W widoku arkuszy danych obiekty OLE są widoczne w postaci napisów informujących o tym, z jakim obiektem mamy do czynienia (w polu typu Obiekt OLE może się wyświetlać np. tekst Bitmap Image). Obiekt OLE można wprowadzić w polu arkusza danych dwoma sposobami:
przez wklejenie go ze schowka,
przez kliknięcie pola typu Obiekt OLE prawym przyciskiem myszy i wybranie polecenia Wstaw obiekt z rozwijanego menu.
Wprowadzanie danych w polu typu Długi tekst Przedostatnim polem w omawianej tabeli jest pole Notes typu Długi tekst. Typ ten dopuszcza wpisanie do jednego gigabajta tekstu w każdym polu. W trakcie wpisywania tekstu w polu typu Długi tekst widać tylko kilka znaków — reszta nie mieści się w polu. Naciskając klawisze Shift+F2, można wyświetlić okno Powiększenie, które zaopatrzone jest w pasek przewijania (zobacz rysunek 5.8) i umożliwia wyświetlenie większej liczby znaków. Aby wyświetlić cały tekst z zastosowaniem innego kroju lub rozmiaru czcionki, można użyć przycisku Czcionka… dostępnego w dolnej części okna (na rysunku 5.8 znacznie powiększono czcionkę okna Powiększenie w porównaniu z domyślnym rozmiarem 8 punktów). Rysunek 5.8. Okno Powiększenie. Zwróćmy uwagę, że pozwala ono wyświetlić dużo więcej danych — co prawda nie cały możliwy do wpisania tekst, ale stosunkowo długi fragment
Przy pierwszym wywołaniu okna powiększenia cały tekst jest zaznaczony. Aby anulować zaznaczenie tekstu, można kliknąć w dowolnym miejscu okna. Jeśli użytkownik przypadkowo usunie cały tekst lub zmieni coś, czego nie chciał zmieniać, może kliknąć przycisk Anuluj i powrócić do arkusza danych, gdzie dane są zapisane w pierwotnej postaci.
Rozdział 5. Praca z tabelami
167
Z okna Powiększenie (Shift+F2) można korzystać podczas projektowania obiektów Accessa (tabel, formularzy, raportów, kwerend), aby zobaczyć tekst, który nie mieści się na ekranie.
Poruszanie się między rekordami w arkuszu danych Sytuacje, w których konieczne jest dokonanie modyfikacji w istniejących rekordach, nie należą wcale do rzadkości. Oto kilka powodów wystąpienia takich sytuacji: uzyskano nowe informacje, które wymuszają zmianę istniejących wartości, lub wykryto błędy, które wymuszają zmianę istniejących wartości. Kiedy użytkownik zdecyduje się na wprowadzenie modyfikacji danych w tabeli, pierwszym krokiem jest jej otwarcie — oczywiście jeżeli jeszcze nie jest otwarta. Korzystając z listy tabel w okienku nawigacji, otwórz tabelę tblProducts dwukrotnym kliknięciem jej nazwy widocznej na liście. Jeśli tabela wyświetla się w widoku projektu, należy kliknąć przycisk Widok arkusza danych, by przełączyć się do widoku arkusza danych. Jeżeli otworzymy w Accessie arkusz danych dla tabeli, która ma tabele powiązane ze sobą, na początku tabeli wyświetli się kolumna ze znakiem plus (+) umożliwiająca dostęp do powiązanych rekordów lub podarkuszy danych. Kliknięcie znaku plus w wierszu powoduje wyświetlenie podarkusza danych związanego z tym wierszem.
Poruszanie się między rekordami Do dowolnego rekordu możemy się dostać, przewijając ekran aż do jego odnalezienia, a następnie umieszczając w nim kursor. Jednak jeżeli tabela jest bardzo duża, przewijanie wszystkich rekordów może zająć dużo czasu, potrzebne są zatem inne metody szybkiego dotarcia do żądanych rekordów. Do przemieszczania się między rekordami można używać pionowego paska przewijania. Kliknięcie któregoś z przycisków strzałek należących do paska przewijania powoduje przesunięcie tylko o jeden rekord. Aby przesunąć się o wiele rekordów, trzeba przeciągnąć belkę przewijania lub kliknąć obszar między belką a przyciskiem strzałki. Obserwuj etykietki ekranowe wyświetlające się w trakcie przemieszczania się w inny obszar arkusza danych za pomocą pasków przewijania. Access nie uaktualnia pola numeru rekordu aż do chwili kliknięcia danego pola.
Do przemieszczania się między rekordami można również wykorzystać pięć przycisków nawigacyjnych (zobacz rysunek 5.2). Aby przejść do żądanego rekordu, należy kliknąć jeden z tych przycisków. Jeżeli znamy numer rekordu (numer wiersza zawierającego określony rekord), możemy kliknąć pole numeru rekordu, wpisać go tam, po czym nacisnąć klawisz Enter. Można też skorzystać z polecenia Przejdź do w grupie Znajdowanie na wstążce, aby przejść do pierwszego, poprzedniego, następnego, ostatniego lub nowego rekordu.
168
Część II Tabele Accessa
Wyszukiwanie określonej wartości Chociaż można szybko przejść do określonego rekordu (jeżeli zna się jego numer) lub do określonego pola bieżącego rekordu, to zazwyczaj chodzi o to, aby odnaleźć rekord zawierający określoną wartość. Można skorzystać z następujących metod zlokalizowania określonej wartości w polu:
Wybierz polecenie Znajdź (ikona lornetki) z grupy Znajdowanie na wstążce.
Naciśnij klawisze Ctrl+F.
Użyj pola Wyszukaj w dolnej części okna arkusza danych.
Wykonanie dwóch pierwszych operacji spowoduje wyświetlenie okna dialogowego Znajdowanie i zamienianie przedstawionego na rysunku 5.9. Aby ograniczyć wyszukiwanie tylko do określonego pola, przed otwarciem okna dialogowego należy umieścić kursor w wybranym polu. Wyszukiwanie danego wpisu można także rozszerzyć na całą tabelę, wybierając wartość Bieżący dokument z pola kombi Szukaj w. Rysunek 5.9. Okno dialogowe Znajdowanie i zamienianie. Najszybsza metoda jego wyświetlenia to naciśnięcie kombinacji klawiszy Ctrl+F
Jeżeli zaznaczysz cały rekord, klikając jego selektor (mały szary prostokąt obok rekordu), to Access automatycznie będzie przeszukiwał wszystkie pola.
Okno dialogowe Znajdowanie i zamienianie umożliwia określenie wielu parametrów wyszukiwania. W polu kombi Znajdź wpisuje się wartość, która ma zostać wyszukana. Można też wyświetlić listę wcześniej wyszukiwanych w danej bazie danych elementów i wybrać jeden z nich. Wartość można wpisać bezpośrednio w takiej formie, w jakiej występuje w bazie, lub skorzystać z trzech rodzajów znaków wieloznacznych. Symbole wieloznaczne obsługiwane w oknie dialogowym Znajdź przedstawiono w tabeli 5.2. Można połączyć symbole wieloznaczne, aby precyzyjniej określić kryteria wyszukiwania. Na przykład wzorzec 196[!2-8] pasuje do wartości 1961 i 1969, natomiast nie pasuje do żadnej wartości pomiędzy nimi. Rozwijana lista Uwzględnij zawiera trzy elementy, które eliminują potrzebę stosowania symboli wieloznacznych:
Dowolna część pola — w przypadku wybrania tej opcji Access wyszukuje wartości w dowolnej części pola. Operacja wyszuka słowa „Ford” w dowolnym miejscu pola, dlatego zostaną znalezione takie wartości, jak Ford Mustang, 2008 Ford F-150 oraz Ford Galaxy 500.
Rozdział 5. Praca z tabelami
169
Tabela 5.2. Symbole wieloznaczne Znak
Opis
Przykład
* (gwiazdka)
Odpowiada dowolnej liczbie znaków
Ford* pozwala znaleźć wartość Ford Mustang
? (znak zapytania)
Odpowiada jednemu znakowi
F?rd pozwala znaleźć wartość Ford
[] (nawiasy
Odpowiada jednemu znakowi z podanej listy
19[67]1 pozwala znaleźć wartości 1961 i 1971
! (wykrzyknik)
W nawiasach klamrowych pozwala wykluczyć określone znaki
19[!67]1 pozwala znaleźć wartość 1951, ale nie pasuje do 1961
- (myślnik)
W nawiasach klamrowych pozwala określić przedział znaków
196[2-8] pozwala znaleźć wartości od 1962 do 1968
# (kratka)
Odpowiada jednej cyfrze
1:## pasuje do wartości 1:18, ale już nie do 1:9
kwadratowe)
Całe pole — domyślną wartością jest Całe pole. Ta opcja powoduje, że wyszukiwane są tylko wartości całkowicie odpowiadające wpisanym. Na przykład jeżeli wybrano opcję Całe pole, a wyszukiwana jest wartość Ford, to Access odnajdzie tylko pole, którego całą wartość stanowi wpis Ford.
Początek pola — wyszukiwanie wartości Ford z opcją Początek pola wyszukuje słowa na początku pola. W efekcie zwraca wszystkie wiersze, w których słowo „Ford” stanowi pierwsze cztery znaki pola.
Oprócz opisanych pól kombi można także użyć dwóch pól wyboru znajdujących się na dole okna Znajdowanie i zamienianie:
Uwzględnij wielkość liter — określa, czy w trakcie wyszukiwania mają być rozróżniane małe i duże litery. Domyślnie pole nie jest zaznaczone (małe i duże litery nie są rozróżniane). Wtedy wyszukanie wartości NOWAK zwróci zarówno NOWAK, jak i Nowak W przypadku zaznaczenia tego pola wyboru trzeba wpisać wyszukiwaną wartość literami dokładnie takiej wielkości, jaka występuje w polach (typy danych Liczba, Waluta oraz Data/Godzina nie mają żadnych atrybutów związanych z wielkością liter). Jeżeli zaznaczono pole wyboru Uwzględnij wielkość liter, Access nie będzie brał pod uwagę stanu pola Przeszukaj pola z uwzględnieniem formatowania (jest to drugie pole wyboru), które ogranicza wyszukiwanie jedynie do wartości wyświetlanych w tabeli (owo pole wyboru należy zaznaczyć, jeżeli zdefiniowano dla pól formaty wyświetlania w arkuszu danych).
Przeszukaj pola z uwzględnieniem formatowania — pole to jest domyślnie zaznaczone, co powoduje, że wyszukiwane są tylko ciągi znaków, które mają ten sam wzorzec znaków co wpis w polu Znajdź. Aby wyszukiwać wpisy niezależnie od formatowania, należy anulować zaznaczenie tego pola wyboru. Na przykład jeśli wyszukujemy w polu Cost wartości 16 500 PLN, to jeśli zaznaczono pole wyboru Przeszukaj pola z uwzględnieniem formatowania, w polu Znajdź trzeba wpisać spację. Aby wyszukiwać wartość niesformatowaną (16500), należy anulować zaznaczenie tego pola wyboru.
170
Część II Tabele Accessa
Zaznaczenie pola wyboru Przeszukaj pola z uwzględnieniem formatowania może spowolnić proces wyszukiwania.
Wyszukiwanie rozpoczyna się po kliknięciu przycisku Znajdź następny. Jeżeli Access znajdzie odpowiednią wartość w arkuszu danych, zaznaczy ją i ustawi na niej kursor. Aby znaleźć kolejne wystąpienie wartości, należy ponownie kliknąć przycisk Znajdź następny. Okno dialogowe pozostanie otwarte, co umożliwia wyszukanie wielu wystąpień danej wartości. Aby zmienić kierunek wyszukiwania, należy wybrać jedną z trzech opcji kierunku (W górę, W dół, Wszystkie) w polu Wyszukaj. Po znalezieniu szukanej wartości można zamknąć okno dialogowe, klikając przycisk Zamknij. Aby szybko znaleźć pierwsze wystąpienie określonej wartości, można skorzystać z pola Wyszukaj wyświetlającego się w dolnej części okna arkusza danych (zobacz rysunek 5.1). W przypadku skorzystania z pola Wyszukaj Access wyszukuje wartości w całym arkuszu danych, w dowolnej części pola. Gdy wpisujemy słowo „FORD” w polu Wyszukaj, arkusz danych przemieszcza aktywną komórkę w miarę wpisywania kolejnych liter. Najpierw znajduje literę F, następnie FO itd. Po znalezieniu wartości operacja wyszukiwania zatrzymuje się. W celu znalezienia kolejnych wystąpień należy wcisnąć klawisz Enter.
Modyfikowanie wartości w arkuszu danych Jeżeli pole, w którym aktualnie znajduje się kursor, jest puste, można wpisać w nim nową wartość. W czasie wprowadzania do pól nowych wartości obowiązują te same reguły co przy dodawaniu nowego rekordu.
Ręczne zamienianie istniejących wartości Po wejściu do danego pola albo zostaje zaznaczona cała jego zawartość, albo nie zostaje zaznaczony żaden znak. Ogólna reguła jest taka, że jeśli do wejścia do pola użyto klawiatury (klawisza Tab lub klawiszy ze strzałkami), to wszystkie znaki są w nim zaznaczone (zaznaczony tekst wyświetla się w trybie kolorów odwrotnych). Kiedy użytkownik zacznie wpisywać tekst z klawiatury, zaznaczona zawartość jest automatycznie zastępowana nową. W przypadku kliknięcia w polu występująca w nim wartość nie jest zaznaczona. Aby zaznaczyć całą zawartość pola za pomocą myszy, można użyć jednej z poniższych metod:
Kliknij miejsce po lewej stronie wartości (tam, gdzie kursor przyjmuje postać dużego znaku plus).
Kliknij miejsce z lewej strony wartości, przytrzymaj wciśnięty lewy przycisk myszy, a następnie przeciągnij kursor nad całą wartością, aż zostanie zaznaczona.
Kliknij pole, a następnie naciśnij klawisz F2. Wartość wpisaną w polu można zastąpić wartością domyślną zdefiniowaną we właściwości Wartość domyślna pola. Aby to zrobić, należy zaznaczyć wartość, a następnie nacisnąć kombinację klawiszy Ctrl+Alt+Spacja. Aby zastąpić istniejącą wartość wartością występującą w poprzednim rekordzie, należy nacisnąć kombinację klawiszy Ctrl+’ (apostrof). Naciśnięcie klawiszy Ctrl+; (średnik) powoduje wstawienie do pola bieżącej daty.
Rozdział 5. Praca z tabelami
171
Naciśnięcie klawiszy Ctrl+– (minus) powoduje usunięcie całego bieżącego rekordu.
Modyfikacja istniejącej wartości Aby zmodyfikować wartość w polu, a nie całkowicie zastąpić ją inną, można za pomocą myszy ustawić kursor przed dowolnym znakiem występującym w polu, co spowoduje uaktywnienie trybu wstawiania. W miarę wpisywania kolejnych znaków istniejące będą przesuwane w prawo. Naciśnięcie klawisza Insert powoduje włączenie trybu zastępowania — każdy wpisany znak zastąpi jeden istniejący. Wśród istniejących znaków można przemieszczać kursor za pomocą klawiszy strzałek — nie powoduje to ich zmiany. Znaki z lewej strony kursora można usuwać za pomocą klawisza Backspace, natomiast z prawej klawiszem Delete. Dostępne techniki edycji przedstawiono w tabeli 5.3. Tabela 5.3. Techniki edycji Operacja edycji Umieszczenie kursora w polu Wstawienie wartości do pola Zaznaczenie całego pola Zastąpienie istniejącej wartości nową Przeniesienie punktu wstawiania na początek pola Przeniesienie punktu wstawiania na koniec pola
Klawisze Naciśnij klawisz strzałki w prawo (→) lub w lewo (←) Umieść kursor w polu i wpisz nową wartość Naciśnij klawisz F2 Zaznacz całe pole i wpisz nową wartość Naciśnij klawisze Ctrl+← (strzałka w lewo) lub wciśnij klawisz Home Naciśnij klawisze Ctrl+→ (strzałka w prawo) lub wciśnij klawisz End Naciśnij klawisze Shift+← (strzałka w lewo) Naciśnij klawisze Shift+→ (strzałka w prawo) Naciśnij klawisze Ctrl+Shift+← (strzałka w lewo) Naciśnij klawisze Ctrl+Shift+→ (strzałka w prawo) Zaznacz całą zawartość pola i wpisz nową wartość
Zaznaczenie poprzedniego znaku Zaznaczenie następnego znaku Zaznaczenie od punktu wstawiania do początku Zaznaczenie od punktu wstawiania do końca Zastąpienie istniejącej wartości nową Zastąpienie bieżącej wartości wartością Naciśnij klawisze Ctrl+’ (apostrof) poprzedniego pola Zastąpienie bieżącej wartości wartością domyślną pola Naciśnij klawisze Ctrl+Alt+Spacja Wstawienie znaku podziału wiersza w polu typu Naciśnij klawisze Ctrl+Enter Krótki tekst lub Długi tekst Naciśnij klawisze Shift+Enter lub przejdź do innego Zapisanie bieżącego rekordu rekordu Wstawienie bieżącej daty Naciśnij klawisze Ctrl+; (średnik) Wstawienie bieżącego czasu Naciśnij klawisze Ctrl+: (dwukropek) Dodanie nowego rekordu Naciśnij klawisze Ctrl++ (znak plus) Usunięcie bieżącego rekordu Naciśnij klawisze Ctrl+– (znak minus) Zmiana wartości pola wyboru lub przycisku opcji Naciśnij klawisz Spacja Cofnięcie modyfikacji bieżącego pola Naciśnij klawisz Esc lub kliknij przycisk Cofnij Naciśnij klawisz Esc lub kliknij przycisk Cofnij Cofnięcie modyfikacji bieżącego rekordu po raz drugi, po cofnięciu zmian w bieżącym polu
172
Część II Tabele Accessa
Pola, których nie można edytować Zawartości niektórych pól nie można edytować. Wśród nich wyróżnić można:
Pola typu Autonumerowanie — Access obsługuje pola typu Autonumerowanie automatycznie. Wylicza ich wartość każdorazowo w momencie tworzenia nowego rekordu. Mogą one pełnić funkcję klucza głównego.
Pola obliczeniowe — w formularzach i kwerendach mogą występować pola, których wartość jest wynikiem wyrażenia. Wartości tych pól nie są w rzeczywistości przechowywane w tabelach i nie można ich edytować.
Pola w rekordach zablokowanych przez innych użytkowników — jeżeli inny użytkownik zablokuje rekord, nie można edytować żadnego z jego pól.
Używanie funkcji Cofnij Przycisk Cofnij na pasku narzędzi szybkiego dostępu często jest nieaktywny i nie można go używać (ponieważ nie ma operacji, które można by cofnąć). Jednak podczas edycji rekordu można za pomocą tego przycisku wycofać zmiany dokonane w bieżącym polu. Ten sam efekt osiągniemy poprzez naciśnięcie klawisza Esc — spowoduje to anulowanie wprowadzonej właśnie modyfikacji lub poprzednio zmienionego pola. Dwukrotne naciśnięcie klawisza Esc spowoduje anulowanie wszystkich modyfikacji dokonanych w całym rekordzie. Po wpisaniu wartości w polu można wycofać zmianę tej wartości poprzez kliknięcie przycisku Cofnij. Kliknięcie tego przycisku umożliwia również anulowanie zmiany dokonanej w poprzednim polu po przejściu do innego pola. Za pomocą tej opcji wycofamy też wszystkie zmiany dokonane w bieżącym rekordzie przed jego zapisaniem. Po zapisaniu rekordu także jest jeszcze możliwe anulowanie zmian. Jednak po rozpoczęciu edycji kolejnego rekordu zmiany dokonane w poprzednim stają się trwałe. Nie należy liczyć na to, że polecenie Cofnij umożliwi anulowanie zmian po wprowadzeniu ich w wielu rekordach. Podczas pracy w widoku arkusza danych zmiany są zapisywane przy przejściu z rekordu do rekordu. Zmiany można cofnąć tylko dla jednego rekordu.
Kopiowanie i wklejanie wartości Kopiowanie lub wycinanie danych i umieszczanie ich w schowku należy do zadań pakietu Microsoft Office lub systemu Windows (w zależności od typu danych); nie jest to funkcja Accessa. Po wycięciu czy skopiowaniu wartości można ją wkleić w innym polu lub rekordzie, wybierając polecenie Wklej z grupy Schowek na wstążce. Dane można wycinać, kopiować i wklejać z dowolnej aplikacji systemu Windows lub między różnymi zadaniami w Accessie. Dzięki tej technice możliwe jest skopiowanie całych rekordów między tabelami czy bazami danych, a także skopiowanie wartości z arkusza danych do Worda lub Excela.
Rozdział 5. Praca z tabelami
173
Kliknięcie strzałki w dół polecenia Wklej daje dostęp do trzech opcji:
Wklej — wkleja zawartość schowka do jednego pola.
Wklej specjalnie — umożliwia wklejanie zawartości schowka w różnych formatach (tekst, CSV, rekordy itp.).
Dołącz i wklej — wkleja zawartość schowka w postaci nowych rekordów, pod warunkiem że skopiowano wiersz o podobnej strukturze. Aby wyciąć lub skopiować jeden lub więcej rekordów do schowka, należy zaznaczyć rekord lub grupę rekordów, używając selektorów. Następnie, w celu wprowadzenia ich do tabeli o podobnej strukturze, należy skorzystać z polecenia Dołącz i wklej.
Zastępowanie wartości Aby zastąpić istniejącą w polu wartość, można zlokalizować ręcznie rekord i dokonać w nim zmiany lub wykorzystać okno dialogowe Znajdowanie i zamienianie. Okno to można wyświetlić na kilka sposobów:
Wybierz polecenie Zamień w grupie Znajdowanie na wstążce.
Naciśnij klawisze Ctrl+H.
Wspomniane okno dialogowe umożliwia zamianę wartości w bieżącym polu lub w całym arkuszu danych. Za jego pomocą można znaleźć określoną wartość i zamienić ją na nową w każdym miejscu pola lub tabeli. Po wyświetleniu okna Znajdowanie i zamienianie najpierw należy kliknąć zakładkę Zamień, a następnie wpisać w polu Znajdź wartość, którą chcemy odnaleźć. Po ustaleniu wszystkich pozostałych opcji wyszukiwania (np. anulowaniu zaznaczenia pola wyboru Przeszukaj pola z uwzględnieniem formatowania) można kliknąć przycisk Znajdź następny. Spowoduje to znalezienie pierwszego wystąpienia szukanej wartości. Aby zamienić odnaleziony wpis (wskazywany przez kursor) na określony, należy wpisać wartość w polu Zamień na i kliknąć przycisk Zamień. Na przykład rysunek 5.10 przedstawia sposób wyszukania w polu kategorii tabeli tblProducts wartości Mini Vany i zamiany jej na Minivany. Rysunek 5.10. Okno dialogowe Znajdowanie i zamienianie otwarte na zakładce Zamień. Przedstawiony przykład umożliwia zamianę wartości Mini Vany na Minivany
Można najpierw określić opcje wyszukiwania na zakładce Znajdź, a następnie kliknąć zakładkę Zamień i kontynuować proces zamiany. Jednak dużo łatwiej jest od razu posługiwać się zakładką Zamień. Należy wpisać wartość, którą chcemy odnaleźć, oraz wartość,
174
Część II Tabele Accessa
którą ją chcemy zastąpić. Po wypełnieniu okna dialogowego wybranymi informacjami należy kliknąć jeden z przycisków znajdujących się z boku okna:
Znajdź następny — wyszukuje następne pole zawierające wartość wpisaną w polu Znajdź.
Anuluj — zamyka okno bez wykonania operacji wyszukiwania i zamiany.
Zamień — zamienia wartość tylko w bieżącym polu (uwaga: przedtem trzeba użyć przycisku Znajdź następny).
Zamień wszystkie — znajduje wszystkie pola zawierające wartość wpisaną w polu Znajdź i automatycznie zastępuje je nową wartością. Z opcji tej należy skorzystać tylko wtedy, gdy mamy pewność, że chcemy zamienić wszystkie wartości. Należy dokładnie sprawdzić wartość w polu Wyszukaj, aby mieć pewność, że nie dokonamy niepożądanej zamiany danych w całym arkuszu.
Dodawanie nowych rekordów Istnieje kilka sposobów dodawania rekordów w arkuszu danych:
Kliknij w ostatnim wierszu okna arkusza danych — tam, gdzie wskaźnik rekordu ma postać gwiazdki.
Kliknij przycisk nawigacyjny Nowy (pusty) rekord (pierwszy od prawej).
Kliknij polecenie Nowy z grupy Rekordy na wstążce.
Kliknij polecenie Przejdź do/Nowy z grupy Znajdowanie na wstążce.
Przejdź do ostatniego rekordu i wciśnij strzałkę w dół (↓).
Wciśnij kombinację klawiszy Ctrl++.
Kliknij prawym przyciskiem myszy selektor dowolnego rekordu i z menu podręcznego wybierz opcję Nowy rekord. Niezależnie od wybranego rekordu nowy pojawi się na dole arkusza.
Po przejściu do nowego rekordu należy wprowadzić dane w odpowiednich polach, a następnie zapisać rekord.
Usuwanie rekordów Aby usunąć rekordy, należy zaznaczyć rekord lub grupę rekordów za pomocą selektorów. Następnie należy wcisnąć klawisz Delete lub kliknąć polecenie Usuń z grupy Rekordy na wstążce (lub z menu otwieranego prawym przyciskiem myszy). Rozwijane menu Usuń zawiera polecenie Usuń rekord, które powoduje usunięcie bieżącego rekordu nawet wtedy, gdy go nie zaznaczono. Po naciśnięciu klawisza Delete lub wybraniu odpowiedniego polecenia na wstążce wyświetli się okno dialogowe z pytaniem o potwierdzenie usunięcia (zobacz rysunek 5.11). Kliknięcie przycisku Tak spowoduje usunięcie rekordów. Jeśli użytkownik kliknie Anuluj, żadne zmiany nie zostaną wprowadzone.
Rozdział 5. Praca z tabelami
175
Rysunek 5.11. Okno dialogowe usuwania rekordów ostrzega, że zostanie usunięta określona liczba rekordów — domyślnym wyborem jest Tak (zgoda na usunięcie rekordów), należy zatem zachować ostrożność Domyślnym wyborem dla tego okna dialogowego jest Tak. Naciśnięcie klawisza Enter automatycznie spowoduje usunięcie rekordów. Jeżeli użytkownik przypadkowo usunie w ten sposób rekordy, ich przywrócenie nie będzie możliwe. Jeżeli pomiędzy tabelami istnieją ustalone relacje z zaznaczoną opcją Wymuszaj więzy integralności (np. tabela tlbContacts jest powiązana z tabelą tblSales), nie można usunąć rekordu nadrzędnego relacji (tlbContacts), z którym są związane rekordy potomne (tblSales), o ile nie zostanie zaznaczona opcja Kaskadowo usuń rekordy pokrewne. W przeciwnym przypadku wyświetli się okno dialogowe z komunikatem o tym, że rekord nie może zostać zmieniony ani usunięty, ponieważ tabela '
' zawiera rekordy z nim powiązane.
Aby zaznaczyć kilka sąsiadujących ze sobą rekordów, należy kliknąć selektor pierwszego z wybranych rekordów, a następnie przeciągnąć wskaźnik rekordu na ostatni z nich. Można też kliknąć pierwszy rekord, a następnie wcisnąć klawisz Shift i kliknąć ostatni z grupy rekordów, które mają być zaznaczone. W celu zaznaczenia kilku sąsiadujących ze sobą rekordów za pomocą klawiatury, wciśnij kombinację Shift+Spacja, aby zaznaczyć bieżący rekord, a następnie wybierz kombinację Shift+↓ (strzałka w dół) lub Shift+↑ (strzałka w górę), by objąć zaznaczeniem przyległe rekordy.
Wyświetlanie rekordów Istnieją techniki umożliwiające zwiększenie wydajności użytkownika podczas dodawania lub modyfikowania rekordów. Można zmieniać kolejność pól, ukrywać i blokować kolumny, zmieniać wysokość wierszy i szerokość kolumn, zmieniać czcionkę wyświetlania napisów oraz usuwać lub modyfikować sposób wyświetlania linii siatki.
Zmiana kolejności pól Access domyślnie wyświetla kolumny w arkuszu danych w takiej kolejności, w jakiej są zdefiniowane w strukturze tabeli. Czasami w celu umożliwienia lepszej analizy danych może wystąpić potrzeba wyświetlenia wybranych kolumn obok siebie. Aby zmienić kolejność wyświetlania kolumn, należy zaznaczyć wybraną z nich poprzez kliknięcie jej nagłówka i przeciągnąć ją w nowe miejsce (zobacz rysunek 6.12). Jednocześnie można zaznaczyć i przesunąć jedną lub więcej kolumn. Przypuśćmy, że chcesz umieścić pole QtyInStock przed polem Description w arkuszu danych tabeli tblProducts. Aby to osiągnąć, wykonaj następujące czynności: 1. Ustaw kursor myszy na nazwie pola QtyInStock. Kursor zamieni się w strzałkę skierowaną w dół.
176
Część II Tabele Accessa
Rysunek 5.12. Zaznaczenie i przeciągnięcie kolumny w celu zmiany kolejności wyświetlania pól
2. Kliknij, aby zaznaczyć kolumnę. Cała kolumna QtyInStock jest teraz zaznaczona. 3. Zwolnij przycisk myszy. 4. Kliknij ponownie nagłówek kolumny. Kursor powinien przyjąć postać strzałki połączonej z prostokątem. 5. Przeciągnij kolumnę w lewo pomiędzy pole Description a pole Features. Między tymi polami pojawi się cienka, czarna kolumna (zobacz rysunek 5.12). 6. Zwolnij przycisk myszy. Kolumna zostanie przeniesiona przed pole Description arkusza danych. Ta metoda umożliwia przenoszenie pojedynczych kolumn lub kilku kolumn znajdujących się obok siebie. Aby zaznaczyć kilka pól, należy kliknąć kolumnę i przy wciśniętym przycisku myszy przeciągnąć kursor nad kilkoma kolumnami. Po zaznaczeniu można przesuwać pola w prawo i w lewo w granicach okna. Przesuwanie pól w widoku arkusza danych nie wpływa na ich kolejność w strukturze tabeli.
Zmiana szerokości wyświetlanych pól Szerokość wyświetlanych pól można zmieniać albo definiując ją w oknie dialogowym (jako liczbę znaków), albo przeciągając linie oddzielające kolumny. W trakcie przeciągania krawędzi kolumny kursor przyjmuje postać dwukierunkowej strzałki. Aby poszerzyć lub zwęzić kolumnę, wykonaj następujące czynności: 1. Umieść kursor myszy pomiędzy dwiema nazwami kolumn na linii oddzielającej pola. Kiedy kursor znajdzie się we właściwym miejscu, powinien się zamienić w poziomą dwukierunkową strzałkę.
Rozdział 5. Praca z tabelami
177
2. Przeciągnij linię rozdzielającą kolumny w lewo (aby zwęzić) lub w prawo (aby poszerzyć) kolumnę. Szerokość kolumny można błyskawicznie optymalnie dopasować (do najdłuższej wartości występującej w polu), klikając dwukrotnie prawą jej krawędź w chwili, kiedy kursor ma kształt dwukierunkowej strzałki. Zmiana szerokości kolumn nie wpływa na liczbę znaków dopuszczalnych w polach tabeli. Jest to po prostu określenie ilości miejsca przeznaczonej do wyświetlania danych z kolumny.
Innym sposobem zmiany szerokości pola jest kliknięcie kolumny prawym przyciskiem myszy i wybranie opcji Szerokość kolumny z menu podręcznego. Spowoduje to wyświetlenie okna dialogowego Szerokość kolumny (zobacz rysunek 5.13). W polu Szerokość kolumny należy wpisać liczbę znaków, które mają się zmieścić w kolumnie, lub zaznaczyć pole wyboru Szerokość standardowa, aby ustawić szerokość kolumny na rozmiar domyślny. Aby dopasować szerokość kolumny do najszerszej widocznej wartości, należy kliknąć przycisk Dopasuj optymalnie. Rysunek 5.13. Okno dialogowe Szerokość kolumny
Przesuwając prawą krawędź kolumny na lewą, można ukryć kolumnę. Ten sam efekt można osiągnąć poprzez ustawienie w oknie dialogowym szerokości kolumny na 0. Aby ponownie wyświetlić ukryte w ten sposób kolumny, trzeba wybrać polecenie Więcej/Odkryj kolumny w grupie Rekordy na wstążce.
Zmiana wysokości wyświetlanych rekordów Czasami trzeba zwiększyć wysokość wiersza w celu umożliwienia wyświetlenia tekstu czcionką o większym rozmiarze lub wyświetlenia tekstu w wielu wierszach. Wysokość rekordu (czyli wiersza) można zmienić, przeciągając linie oddzielające rekordy lub wybierając polecenie Więcej/Wysokość wiersza z grupy Rekordy na wstążce. W czasie przeciągania linii oddzielającej rekordy kursor przyjmuje postać pionowej dwukierunkowej strzałki — widać ją z lewej strony rysunku 5.14. Aby zmniejszyć lub zwiększyć wysokość wiersza, wykonaj poniższe czynności: 1. Umieść kursor myszy pomiędzy selektorami rekordów dwóch wierszy. Kursor przyjmie postać dwukierunkowej pionowej strzałki. 2. Przeciągnij krawędź rekordu w górę (zmniejszanie) lub w dół (zwiększanie), aby zmienić naraz wysokość wszystkich wierszy.
178
Część II Tabele Accessa
Rysunek 5.14. Zmiana wysokości wiersza. Wystarczy umieścić kursor myszy tak jak pokazano i przeciągnąć linię aż do osiągnięcia żądanej wysokości
Operacja zmiany wysokości wiersza wpływa na wysokość wszystkich wierszy arkusza danych. W arkuszu danych nie mogą się znajdować wiersze o różnej wysokości.
Rozmiar wierszy można także zmieniać za pomocą polecenia Więcej/Wysokość wiersza z grupy Rekordy na wstążce. Spowoduje to wyświetlenie okna dialogowego Wysokość wiersza, gdzie można podać rozmiar wiersza w punktach. Aby przywrócić domyślny rozmiar wierszy, należy zaznaczyć pole wyboru Wysokość standardowa. Jeżeli przeciągnie się linię oddzielającą rekordy tak, że będzie nachodziła na linię sąsiednią, wszystkie rekordy zostaną ukryte. To samo się zdarzy, jeżeli jako wysokość wiersza w oknie dialogowym wpiszemy liczbę bliską zera (np. 0,1). Aby wyświetlić z powrotem rekordy, należy użyć okna dialogowego Wysokość wiersza i ustawić większą wartość wysokości wiersza.
Zmiana czcionki Domyślnie Access wyświetla wszystkie dane w arkuszu danych, używając czcionki Calibri o rozmiarze 11. Aby zmienić wygląd tekstu na arkuszu danych, należy skorzystać z poleceń i rozwijanych list z grupy Formatowanie tekstu na wstążce (zobacz rysunek 5.15). Rysunek 5.15. Zmiana czcionki arkusza danych bezpośrednio ze wstążki. Można wybrać krój czcionki, rozmiar oraz inne atrybuty czcionki dla całego arkusza danych
Rozdział 5. Praca z tabelami
179
Zmiana czcionki obejmuje wszystkie dane zawarte w arkuszu. Aby zobaczyć na ekranie jak najwięcej danych, należy użyć bardzo małej czcionki. Można także włączyć tryb wyświetlania w wyższej rozdzielczości (o ile pozwala na to sprzęt). Aby lepiej widzieć litery, wystarczy zwiększyć rozmiar czcionki lub kliknąć przycisk Pogrubienie.
Wyświetlanie linii oddzielających komórki i różne kolory wierszy Normalnie pomiędzy poszczególnymi polami (kolumnami) oraz pomiędzy poszczególnymi rekordami (wierszami) są wyświetlane linie. Za pomocą polecenia Linie siatki z grupy Formatowanie tekstu na wstążce (zobacz rysunek 5.15) można zdecydować, czy linie te mają się wyświetlać czy nie. Z rozwijanej listy Linie siatki można wybrać następujące opcje:
Linie siatki: oba rodzaje,
Linie siatki: poziome,
Linie siatki: pionowe,
Linie siatki: brak.
Za pomocą list Kolor wypełnienia i Alternatywny kolor wypełnienia/tła z grupy Formatowanie tekstu można zmieniać kolory tła na arkuszu danych. Paleta Kolor wypełnienia zmienia kolor wszystkich wierszy arkusza danych, natomiast paleta Alternatywny kolor wypełnienia/tła zmienia kolor wierszy parzystych (gdy ustawiony jest kolor na tej palecie, paleta Kolor wypełnienia określa kolor tylko nieparzystych wierszy). Jeśli ktoś nie chce, aby kolory wyświetlały się naprzemiennie, może wybrać opcję Brak koloru na palecie Alternatywny kolor wypełnienia. Po zmianie ustawień dotyczących linii siatki bądź naprzemiennych kolorów wierszy Access wyświetli pytanie, czy chcemy zapisać zmiany w układzie arkusza danych. Aby zmiany były trwałe, kliknij przycisk Tak. Okno dialogowe Formatowanie arkusza danych (zobacz rysunek 5.16) umożliwia pełną kontrolę nad wyglądem arkusza danych. Aby je otworzyć, należy skorzystać z polecenia Formatowanie arkusza danych wyświetlającego się w prawym dolnym rogu grupy Formatowanie tekstu na wstążce. Za pomocą przełączników Płaski, Wypukły i Wklęsły w grupie Efekt komórki można zmienić wygląd siatki na trójwymiarowy. Pola wyboru Poziome i Pionowe w grupie Pokazywane linie siatki pozwala wybrać linie, które mają być wyświetlane. Za pomocą list Kolor tła, Alternatywny kolor tła i Kolor linii siatki można zmieniać odpowiednie kolory, korzystając z dostępnych palet kolorów. Przykład w środku okna dialogowego prezentuje podgląd wprowadzonych zmian. Listy rozwijane w grupie Style krawędzi i linii umożliwiają modyfikację wyglądu linii siatki. Za ich pomocą można zmienić style obramowania arkusza danych i podkreślenia nagłówka kolumny. Druga lista pozwala wybrać styl linii odpowiadający wyborowi w pierwszej z rozwijanych list. Dostępne są następujące style linii:
Obramowanie przezroczyste,
Ciągłe,
180
Część II Tabele Accessa
Rysunek 5.16. Okno dialogowe Formatowanie arkusza danych. Za jego pomocą można dostosować wygląd arkusza danych
Kreski,
Krótkie kreski,
Kropki,
Kropki z odstępami,
Kreska-Kropka,
Kreska-Kropka-Kropka,
Podwójna ciągła.
Rysunek 5.17 przedstawia arkusz danych, w którym zastosowano linie kropkowane zamiast ciągłych oraz większy kontrast pomiędzy naprzemiennymi wierszami. Aby dostosować arkusz danych do własnych upodobań, można skorzystać z różnych kolorów i stylów. Rysunek 5.17. Różne style linii i kolory wierszy dla arkusza danych
Rozdział 5. Praca z tabelami
181
Wyrównywanie danych w kolumnach Przyciski wyrównywania pozwalają wyrównać dane w kolumnie do lewej lub prawej albo do środka. Za ich pomocą można wybrać wyrównanie różne od ustawień domyślnych, które Access stosuje na podstawie typu danych pola (dane tekstowe są wyrównane do lewej, liczby i daty — do prawej). Aby zmienić wyrównanie danych w kolumnie, wykonaj następujące czynności: 1. Ustaw kursor w dowolnym miejscu w kolumnie, dla której chcesz zmienić wyrównanie. 2. Aby zmienić wyrównanie danych w kolumnie, kliknij polecenie Wyrównaj do lewej, Wyrównaj do środka lub Wyrównaj do prawej w grupie Formatowanie tekstu na wstążce (zobacz rysunek 5.15).
Ukrywanie i odkrywanie kolumn Kolumny można ukryć, przeciągając ich prawe krawędzie do poprzedniej kolumny lub ustalając ich szerokość na 0: 1. Ustaw kursor w dowolnym miejscu kolumny, którą chcesz ukryć. 2. Wybierz polecenie Więcej/Ukryj kolumny w grupie Rekordy na wstążce. Kolumna zniknie z ekranu. W rzeczywistości szerokość kolumny została ustawiona na 0. Aby ukryć większą liczbę kolumn, należy je najpierw zaznaczyć, a następnie wybrać polecenie Więcej/Ukryj kolumny. Po ukryciu kolumn można je ponownie wyświetlić za pomocą opcji Więcej/Odkryj kolumny z grupy Rekordy na wstążce. Kliknięcie tej opcji powoduje wyświetlenie okna dialogowego umożliwiającego wybiórcze ukrywanie i odkrywanie kolumn poprzez określenie dla nich żądanego statusu (zobacz rysunek 5.18). Następnie należy kliknąć przycisk Zamknij, a wówczas wybrane pola zostaną wyświetlone w arkuszu danych. Za pomocą wspomnianego okna dialogowego można również ukrywać jedną lub kilka kolumn poprzez anulowanie zaznaczenia pola wyboru obok każdego z pól, które chcemy ukryć. Rysunek 5.18. Ukrywanie i wyświetlanie kolumn za pomocą okna dialogowego Odkrywanie kolumn
182
Część II Tabele Accessa
Blokowanie kolumn Jeśli chcemy przewijać arkusz o dużą liczbę pól w lewo i w prawo, a jednocześnie chcemy, aby określone kolumny były cały czas widoczne na ekranie, możemy użyć opcji Więcej/ Zablokuj z grupy Rekordy na wstążce. W ten sposób można na przykład spowodować, aby pola ProductID i Description były zawsze widoczne w czasie przewijania arkusza danych w poszukiwaniu innych cech produktu. Zablokowane kolumny wyświetlają się cały czas z lewej strony arkusza danych, podczas gdy pozostałe pola można przewijać w poziomie. Aby zablokować więcej niż jedną kolumnę równocześnie, muszą one występować obok siebie (oczywiście jeżeli nie są tak położone, to trzeba je najpierw przenieść). W celu odblokowania kolumn należy wybrać opcję Więcej/Odblokuj. Po odblokowaniu kolumn nie wracają one na pierwotne miejsca. Trzeba przenieść je ręcznie.
Zapisywanie zmienionego układu arkusza W trakcie zamykania arkusza danych zapisywane są wszystkie zmiany dotyczące danych, ale mogą zostać utracone informacje na temat zmiany układu. Po wprowadzeniu wszystkich koniecznych modyfikacji w wyglądzie arkusza nikt z reguły nie chce powtarzać tych operacji przy każdym kolejnym otwarciu pliku. Jeśli użytkownik wprowadzi dowolne zmiany w układzie danych, podczas zamykania arkusza Access wyświetla pytanie o to, czy zapisać modyfikacje. Aby zachować zmiany, należy kliknąć Tak. Aby ręcznie zapisać zmiany układu, należy kliknąć przycisk Zapisz na pasku narzędzi szybkiego dostępu. Jeżeli wykonujesz na bieżąco opisywane przykłady, nie zapisuj zmian dla tabeli tblProducts, ponieważ jej wygląd nie będzie pasował do dalszych zrzutów.
Zapisywanie rekordu Access zapisuje rekord w chwili opuszczenia go. Aby zapisać rekord bez jego opuszczania, należy nacisnąć kombinację klawiszy Shift+Enter lub wybrać polecenie Zapisz z grupy Rekordy na wstążce. Zamknięcie arkusza danych również powoduje zapisanie rekordu.
Sortowanie i filtrowanie rekordów w arkuszu danych Grupa Sortowanie i filtrowanie na wstążce (zobacz rysunek 5.19) umożliwia zmianę kolejności wierszy i zawężenie liczby wyświetlanych wierszy. Za pomocą poleceń z tej grupy można wyświetlać rekordy we wskazanym porządku. Sposób użycia tych poleceń zademonstrowano w poniższych punktach. Rysunek 5.19. Grupa Sortowanie i filtrowanie umożliwia modyfikowanie kolejności rekordów i zawężanie liczby wyświetlanych wierszy
Rozdział 5. Praca z tabelami
183
Korzystanie z funkcji szybkiego sortowania Czasami trzeba posortować rekordy według określonej kolejności. Przyciski szybkiego sortowania umieszczone na wstążce umożliwiają sortowanie zaznaczonych kolumn w kolejności rosnącej lub malejącej. Aby skorzystać z tych poleceń, należy kliknąć pole, według którego chcemy posortować dane, a następnie kliknąć przycisk Rosnąco lub Malejąco. Dane zostaną natychmiast wyświetlone w żądanej kolejności. Można je także posortować poprzez kliknięcie prawym przyciskiem myszy w kolumnie i wybranie jednego z poleceń Sortuj. Dla pól typu Krótki tekst dostępne są opcje Sortuj od A do Z i Sortuj od Z do A, natomiast dla pól liczbowych można wybrać polecenie Sortuj od najmniejszych do największych lub Sortuj od największych do najmniejszych. Niektórych pól (np. typów Obiekt OLE i Długi tekst) nie można sortować. Aby posortować dane według wartości zawartych w kilku kolumnach, należy zaznaczyć więcej niż jedną kolumnę. W tym celu trzeba zaznaczyć najpierw jedną kolumnę (sposób zaznaczania kolumny przedstawiono wcześniej, w punkcie „Zmiana kolejności pól”), a następnie nacisnąć klawisz Shift i, nie zwalniając go, przesunąć kursor w prawo. Po kliknięciu jednego z przycisków szybkiego sortowania Access posortuje rekordy najpierw według wartości w kolumnie zaznaczonej jako pierwsza, a potem według wartości w kolejnych zaznaczonych kolumnach. Aby zaznaczyć kilka kolumn, które ze sobą nie sąsiadują, należy najpierw przysunąć je do siebie (zgodnie z opisem podanym wcześniej, w punkcie „Zmiana kolejności pól”). Aby wyświetlić rekordy w pierwotnej kolejności, należy wybrać polecenie Usuń sortowanie w grupie Sortowanie i filtrowanie na wstążce.
Używanie filtrowania według wyboru Filtrowanie według wyboru to mechanizm, który umożliwia wybieranie rekordów na podstawie wartości bieżącego pola. Na przykład można ustawić kursor w kolumnie Category tabeli tblProducts i kliknąć polecenie Rosnąco. Access posortuje dane według kategorii pojazdu. Następnie ustawimy kursor w kolumnie Category w polu o wartości Ciężarowe. Teraz wystarczy kliknąć polecenie Zaznaczenie w grupie Sortowanie i filtrowanie na wstążce i wybrać pozycję Równa się „Ciężarowe”. Access wyświetli wszystkie rekordy, w których pole Category ma wartość "Ciężarowe". Po kliknięciu polecenia Zaznaczenie dostępne są cztery opcje:
Równa się „Ciężarowe”,
Nie równa się „Ciężarowe”,
Zawiera „Ciężarowe”,
Nie zawiera „Ciężarowe”.
Obszar z prawej strony przycisków nawigacyjnych (w dolnej części okna arkusza danych) informuje o tym, czy w arkuszu danych zastosowano filtr. Dodatkowo polecenie Przełącz filtr na wstążce jest podświetlone, co oznacza, że zastosowano filtr. Kliknięcie tego polecenia powoduje usunięcie filtru. W takim przypadku specyfikacja filtru nie znika — jest on jedynie wyłączony. Aby ponownie zastosować ten sam filtr, należy kliknąć polecenie Przełącz filtr jeszcze raz.
184
Część II Tabele Accessa
Filtrowanie według wyboru jest addytywne. Po zastosowaniu filtru można kontynuować filtrowanie za pomocą polecenia Zaznaczenie. Wystarczy kliknąć prawym przyciskiem myszy zawartość pola, dla której chcemy zastosować filtr, a następnie wybrać dostępną opcję z menu.
Aby jeszcze bardziej zawęzić działanie filtra, a następnie zobaczyć wszystkie rekordy, które nie spełniają wybranego kryterium (np. takie, gdzie pole Make jest różne od Chevrolet), należy ustawić kursor w polu o wartości, którą chcemy wykluczyć (tam, gdzie pole Make ma wartość Chevrolet), kliknąć je prawym przyciskiem myszy i z opcji filtrowania dostępnych w menu podręcznym wybrać opcję Nie równa się „Chevrolet”. Jeżeli użyjemy polecenia Zaznaczenie dla liczbowych pól danych lub pól z datami, możemy określić zakres poprzez wybranie opcji Między z listy dostępnych opcji po kliknięciu przycisku polecenia. Wystarczy wprowadzić wartości w polach Najmniejsza i Największa dla liczb oraz Najstarsza i Najnowsza dla dat, aby ograniczyć zbiór rekordów do tych, które należą do wskazanego zakresu. Jak można sobie wyobrazić, za pomocą tej techniki można przejrzeć wszystkie transakcje obsłużone przez wybranego przedstawiciela w określonych przedziałach czasu lub dla określonych produktów. Filtrowanie według wyboru oferuje niewiarygodne możliwości wniknięcia w kolejne poziomy danych. Nawet jeśli klikniemy przycisk Usuń filtr w celu wyświetlenia wszystkich rekordów, Access w dalszym ciągu będzie przechowywał w pamięci specyfikację utworzonej kwerendy. Na rysunku 5.20 pokazano arkusz danych poddany działaniu opisanego powyżej filtra, z otwartą listą Filtrowanie według wyboru dla pola Category. Rysunek 5.20. Używanie filtrowania według wyboru. W tym przypadku wyświetlają się rekordy wszystkich samochodów ciężarowych oprócz samochodów marki Chevrolet
Jeżeli zastosujemy filtr w arkuszu danych, to w nagłówku każdej z kolumn wyświetla się wskaźnik informujący o tym, czy w odniesieniu do tej kolumny zastosowano filtr. Wskazanie go myszą powoduje wyświetlenie podpowiedzi zawierającej warunek filtru. Kliknięcie tej podpowiedzi umożliwia określenie dodatkowych kryteriów dla kolumny.
Rozdział 5. Praca z tabelami
185
Do tego celu można wykorzystać rozwijane menu pokazane na rysunku 5.21. Aby wyświetlić podobne menu dla kolumny, dla której nie zastosowano filtra, można kliknąć strzałkę w dół wyświetlającą się w nagłówku kolumny.
Rysunek 5.21. Filtrowanie pola Category. Do ustawienia kryteriów dla pola można skorzystać z menu filtrów kolumny
Menu zawiera polecenia umożliwiające sortowanie kolumny w porządku rosnącym lub malejącym, usuwanie filtra z pola, wybór określonego filtra oraz wybór wartości, które mają się wyświetlić w arkuszu danych. Lista dostępnych poleceń zmienia się na podstawie typu danych kolumny. W tym przypadku lista Filtry tekstu umożliwia wprowadzenie kryteriów filtrowania danych na podstawie wpisanych wartości. Pola wyboru na tej liście zawierają dane występujące w kolumnie. W naszym przykładzie mamy do wyboru (Zaznacz wszystko), (Puste), Ciężarowe, Minivany, Motocykl, Osobowe, Osobowy, Specjalne i SUV. Zaznaczenie pozycji (Zaznacz wszystko) powoduje wyświetlenie w arkuszu danych wszystkich wartości, niezależnie od wartości pola. Zaznaczenie pozycji (Puste) powoduje wyświetlenie rekordów niezawierających danych. Zaznaczenie dowolnej wartości danych powoduje wyświetlenie tylko tych rekordów, dla których wskazane pole zawiera wybrane wartości. Kliknięcie pozycji Minivany i Osobowe spowoduje wyświetlenie rekordów, dla których pole Category ma wartość Minivany lub Osobowe. Jeśli chcemy filtrować dane, ale nie możemy znaleźć wartości, którą chcielibyśmy użyć, możemy wybrać polecenie Filtry tekstu (albo Filtry liczb lub Filtry dat itp.) i wybrać jedno z dostępnych poleceń (Równa się, Nie równa się, Zaczyna się od itp.). Spowoduje to wyświetlenie okna dialogowego, w którym można wpisać żądaną wartość.
Używanie filtrowania według formularza Mechanizm filtrowania według formularza pozwala wprowadzać kryteria w pojedynczym wierszu arkusza danych. Po kliknięciu przycisku Filtrowanie według formularza arkusz danych zmienia się w jeden wiersz z listami rozwijanymi w każdej kolumnie. Listy
186
Część II Tabele Accessa
te zawierają wszystkie niepowtarzalne wartości z poszczególnych kolumn. Zakładka Lub w dolnej części okna umożliwia formułowanie warunków OR dla każdej z grup. Aby włączyć tryb filtrowania według formularza (zobacz rysunek 5.22), należy wybrać polecenie Zaawansowane/Filtrowanie według formularza w grupie Sortowanie i filtrowanie na wstążce. Rysunek 5.22. Filtrowanie według formularza umożliwia zdefiniowanie jednocześnie wielu warunków filtrowania. Warto zwrócić uwagę na zakładkę Lub znajdującą się w dolnej części okna
Wartości wyszukiwane w polach można wybierać za pomocą pól kombi lub wpisywać bezpośrednio w polach. Aby zobaczyć rekordy, w których pole Category ma wartość Ciężarowe lub SUV-y, należy wybrać wartość Ciężarowe z rozwijanej listy Category, kliknąć zakładkę Lub u dołu okna, a następnie wybrać SUV-y z rozwijanej listy Category. Aby zobaczyć rekordy, w których pole Category ma wartość SUV-y, a pole QtyInStock wartość 1, należy wybrać wartość SUV-y z rozwijanej listy Category i wpisać 1 w kolumnie QtyInStock. Po wprowadzeniu żądanych kryteriów należy skorzystać z polecenia Włącz filtr, by zastosować filtr (Przycisk Przełącz filtr pokazano na rysunku 5.19). Korzystając z zakładki Lub, utworzymy dowolną liczbę warunków. Jednak aby zdefiniować jeszcze bardziej zaawansowane metody filtrowania, można użyć polecenia Zaawansowane/Filtr/sortowanie zaawansowane z grupy Sortowanie i filtrowanie na wstążce. Spowoduje to przejście do ekranu QBE służącego do konstrukcji bardziej złożonych kwerend. Posługiwanie się kwerendami oraz używanie operatorów i wyrażeń omówiono w rozdziałach 8. i 9.
Agregowanie danych Arkusze danych Accessa zawsze bardzo przypominały arkusze kalkulacyjne Excela. Arkusze kalkulacyjne i arkusze danych nie tylko wyglądają podobnie, ale także pod wieloma względami podobnie działają. Jak dowiedzieliśmy się z tego rozdziału, arkusze danych Accessa umożliwiają sortowanie, wyszukiwanie rekordów i blokowanie kolumn, a także mają inne własności bliźniaczo podobne do funkcji arkuszy Excela. Jednak oprócz tego jeszcze do niedawna arkusze Accessa i arkusze Excela nie miały ze sobą zbyt wiele wspólnego.
Rozdział 5. Praca z tabelami
187
W odróżnieniu od arkuszy Excela arkusze Accessa nie pozwalały na wykonywanie podsumowań w wierszach i kolumnach ani innego rodzaju agregacji danych. Począwszy od Accessa 2007 arkusze danych zawierają wiersz Suma u dołu. Aby wyświetlić wiersz Suma, należy kliknąć przycisk Sumy w grupie Rekordy na wstążce NARZĘDZIA GŁÓWNE (przycisk Sumy jest oznaczony grecką literą sigma, podobnie jak przycisk Autosumowanie w Excelu). Każdą kolumnę w wierszu Suma można wykorzystać do innego obliczenia (suma, średnia, minimum, maksimum, zliczanie rekordów, odchylenie standardowe i wariancja). Aby skorzystać z wiersza Suma, otwórz tabelę lub formularz w widoku arkusza danych, a następnie kliknij przycisk Sumy w grupie Rekordy na wstążce NARZĘDZIA GŁÓWNE (zobacz rysunek 5.23). Access doda wiersz Suma u dołu arkusza danych, bezpośrednio pod wierszem Nowy.
Rysunek 5.23. Wiersz Suma w arkuszu danych
Kliknięcie w kolumnie w wierszu Suma powoduje przekształcenie komórki arkusza w listę rozwijaną. Poszczególne pozycje na liście są specyficzne dla typu danych kolumny. Na przykład w kolumnach tekstowych na rozwijanej liście są tylko pozycje Brak i Liczba, natomiast kolumny liczbowe zawierają pełen zbiór dostępnych podsumowań (suma, średnia, liczba itp.). Dla kolumn Data/Godzina dostępne są opcje Brak, Średnia, Liczba, Minimum i Maksimum. Obliczenia wybranych podsumowań są dynamiczne. W miarę modyfikowania danych w arkuszu danych bądź tabeli wyniki obliczeń wyświetlanych w wierszu Suma są automatycznie aktualizowane w bardzo krótkim czasie po wprowadzeniu modyfikacji. Obliczenie wielu sum wiąże się z pewnym obniżeniem wydajności, dlatego w niektórych sytuacjach, kiedy specjalne własności sumowania nie są potrzebne, można ukryć wiersz Suma. Opcje podsumowań wybranych dla kolumn arkusza danych są trwałe. Po zamknięciu arkusza danych i ponownym otwarciu wiersz Suma wyświetla się ponownie. Aby wyłączyć wiersz Suma, otwórz arkusz danych, a następnie kliknij przycisk Sumy w grupie Rekordy w zakładce NARZĘDZIA GŁÓWNE. Interesującą cechą wiersza Suma jest fakt, że w przypadku jego usunięcia można go później przywrócić do poprzedniej postaci (wystarczy jeszcze raz kliknąć przycisk Sumy).
188
Część II Tabele Accessa
Drukowanie rekordów Wszystkie rekordy zawarte w arkuszu danych można wydrukować w prostym układzie wierszy i kolumn. Sformatowane raporty nauczymy się konstruować w rozdziale 20. Na razie najprostszym sposobem drukowania jest kliknięcie ikony Drukuj na pasku narzędzi szybkiego dostępu. Spowoduje to wydrukowanie arkusza danych na domyślnej drukarce systemu Windows. Dodatkowe opcje drukowania znajdziemy w menu dostępnym za pomocą przycisku PLIK (zobacz rysunek 5.24). Rysunek 5.24. Menu Drukuj pakietu Microsoft Office
Wydruk odzwierciedla wszystkie opcje układu obowiązujące w czasie tworzenia wydruku. Kolumny ukryte nie są drukowane. Linie siatki są drukowane tylko w przypadku, gdy włączono krawędzie komórek. Wydruk uwzględnia także zdefiniowane wysokości wierszy i szerokości kolumn. Na pojedynczej stronie może się zmieścić jedynie określona liczba kolumn i wierszy — wydruk zajmie tyle stron, aby cały arkusz danych się na nich zmieścił. Jeżeli to konieczne, Access dzieli wydruk tak, aby dopasować go do pojedynczych stron. Na przykład wydruk tabeli tblProducts zajmuje 9 stron. Do wydrukowania wszystkich pól potrzebne są 3 strony, natomiast aby wydrukować wszystkie wiersze niezbędne są 3 strony. Jeden rekord tabeli tblContacts rozciąga się na 4 strony. Liczba stron zależy od zdefiniowanego układu i użytej drukarki.
Drukowanie arkusza danych Procesem drukowania można sterować za pomocą okna dialogowego Drukowanie, które otwiera się po wybraniu polecenia Drukuj. W tym oknie dialogowym można dostosować wydruk poprzez wybór różnych opcji:
Rozdział 5. Praca z tabelami
Zakres wydruku — drukuje cały arkusz danych lub tylko wybrane strony czy rekordy.
Liczba kopii — określa liczbę kopii, jakie mają zostać wydrukowane.
Sortuj — określa, czy poszczególne kopie mają być sortowane.
189
Można też zmienić drukarkę, kliknąć przycisk Właściwości i ustawić opcje dotyczące wybranej drukarki. Przycisk Ustawienia umożliwia zdefiniowanie marginesów i nagłówków.
Korzystanie z podglądu wydruku Chociaż w samym arkuszu danych możliwe jest określenie wszystkich informacji koniecznych do drukowania, to jednak opierając się wyłącznie na nim, nie mamy pewności, czy szerokość i wysokość wierszy i kolumn jest odpowiednia lub czy w celu ulepszenia wydruku nie należy zmienić czcionki na inną. Aby obejrzeć zadanie drukowania, można kliknąć polecenie Podgląd wydruku w menu Drukuj, co spowoduje wyświetlenie okna Podgląd wydruku. Domyślny widok podglądu w trybie pojedynczej strony to pierwsza strona wydruku. Aby wybrać inne widoki oraz powiększyć lub pomniejszyć widok na podglądzie, można skorzystać z poleceń dostępnych na wstążce. Kliknięcie polecenia Drukuj powoduje wydrukowanie arkusza danych na drukarce. Aby zamknąć podgląd wydruku i powrócić do widoku arkusza danych, należy kliknąć polecenie Zamknij podgląd wydruku po prawej stronie wstążki.
190
Część II Tabele Accessa
Rozdział 6.
Importowanie i eksportowanie danych W tym rozdziale:
Wprowadzenie do danych zewnętrznych
Wybór odpowiednich opcji importowania i eksportowania
Tworzenie specyfikacji importu
Eksport danych do zewnętrznych tabel i plików
W tym rozdziale pokazujemy, jak za pomocą importowania przenieść dane z zewnętrznych źródeł do bazy danych Accessa. Wyjaśniamy też, jak dzięki eksportowaniu tworzyć zewnętrzne pliki na podstawie danych z bazy. Proces importowania polega na dodawaniu do baz Accessa danych z zewnętrznych źródeł, np. z plików XML. Eksportowanie danych z Accessa prowadzi do utworzenia poza bazą nowych elementów, takich jak plik XML lub Excela z danymi z Accessa. W tym rozdziale wykorzystano wiele plików do importowania oraz dwie bazy danych Accessa: Rozdział06_1.accdb oraz Rozdział06_2.accdb. Obie bazy danych będą wykorzystane do importowania i eksportowania danych. Jeżeli ktoś jeszcze nie skopiował tych plików do swojego komputera, powinien zrobić to teraz. W przykładach znajduje się też szereg plików pomocniczych w różnych formatach (.xls, .xml, .txt itd.). Pamiętaj, aby skopiować także te pliki.
Access i dane zewnętrzne Wymiana informacji między Accessem a innymi programami ma bardzo istotne znaczenie w świecie współczesnych baz danych. Informacje są zwykle przechowywane w bardzo różnorodnych aplikacjach i formatach. Access (podobnie jak wiele innych produktów) ma własny, rodzimy format plików, który zapewnia integralność odwołań oraz obsługę wzbogaconych typów danych, takich jak obiekty OLE. W większości sytuacji format ten wystarcza; od czasu do czasu zdarza się jednak, że trzeba przenieść dane z jednego pliku bazy danych Accessa do drugiego lub wykorzystać dane w formacie z innego programu.
192
Część II Tabele Accessa
Typy danych zewnętrznych Access może wymieniać dane z wieloma różnymi aplikacjami. Zdarza się, że trzeba uzyskać dane z innych plików baz danych (takich jak FoxPro albo dBASE) lub pobrać informacje z serwera SQL Server, serwera Oracle albo pliku tekstowego. Access może przenosić dane między kilkoma kategoriami aplikacji takimi jak: inne aplikacje systemu Windows, aplikacje z komputerów Macintosha, inne systemy zarządzania bazami danych, pliki tekstowe oraz pliki z systemów mainframe.
Metody pracy z danymi zewnętrznymi Często trzeba przenieść dane z innej aplikacji lub pliku do bazy danych Accessa (albo na odwrót). Może się zdarzyć, że będą nam potrzebne informacje, które wcześniej wpisaliśmy do arkusza kalkulacyjnego. Można przepisać je ręcznie albo zaimportować do bazy danych. Access zawiera narzędzia, które umożliwiają wymianę informacji z innymi bazami danych lub arkuszami kalkulacyjnymi. Access potrafi wymieniać dane z wieloma różnymi typami plików, takimi jak:
obiekty baz danych Accessa (wszystkie typy),
pliki tekstowe,
pliki Excela,
bazy danych ODBC (SQL Server, Sybase Server, Oracle Server i inne bazy danych zgodne ze standardem ODBC),
HTML-owe tabele, listy i dokumenty,
dokumenty XML,
dane z Outlooka,
dokumenty Microsoft Exchange,
dane z SharePointa,
dokumenty Worda,
dokumenty w formacie RTF.
Access może pracować z zewnętrznymi źródłami danych na kilka sposobów:
Łączenie — tworzy łącze do tabeli w innej bazie danych Accessa albo dołącza dane przechowywane w innym formacie. Przy łączeniu wykorzystuje się dane w ich źródłowym formacie (np. pliki Excela lub XML). Dołączone dane pozostają w pierwotnym pliku. Pliku zawierającego połączone dane nie można przenieść ani usunąć. Nie można też zmienić jego nazwy. W innym przypadku, kiedy dane będą potrzebne następnym razem, Access nie będzie ich mógł zlokalizować. Jeśli nie można uniknąć przeniesienia lub zmiany nazwy połączonego źródła danych, warto wykorzystać narzędzia Accessa przeznaczone do ponownego łączenia bazy ze źródłem.
Rozdział 6. Importowanie i eksportowanie danych
193
Importowanie — kopiuje dane ze źródła danych, innej bazy danych Accessa albo pliku z bazą innej aplikacji do tabeli Accessa. Zaimportowane dane podlegają konwersji na właściwy typ danych Accessa, są zapisywane w tabeli i od tej pory Access nimi zarządza.
Eksportowanie — kopiuje dane z tabeli Accessa do pliku tekstowego, innej bazy danych Accessa albo pliku w formacie używanym w innej aplikacji. Podobnie jak przy importowaniu modyfikacje źródłowych danych nie mają wpływu na wyeksportowane informacje. Łączenie danych zewnętrznych z Accessem omawiamy w rozdziale 7.
Każda z metod ma swoje zalety i wady. Opisujemy je w kolejnych punktach. Kiedy należy dołączyć dane zewnętrzne? Łączenie w Accessie pozwala na pracę z danymi w formacie innej aplikacji, a więc na współdzielenie pliku z pierwotną aplikacją. Jeśli pozostawimy dane w formacie innej bazy danych, Access będzie mógł wczytywać dane wciąż używane przez pierwotną aplikację. Jest to przydatne, kiedy chcemy pracować w Accessie z danymi, którymi posługują się również inne programy. Jednak korzystanie z dołączonych danych związane jest z pewnymi ograniczeniami. Nie można na przykład aktualizować danych w połączonych arkuszach Excela lub plikach tekstowych. Możliwość korzystania z danych zewnętrznych jest też przydatna przy używaniu Accessa jako frontonu bazy danych SQL Server — można połączyć się z tabelą systemu SQL Server i aktualizować dane bezpośrednio tam, zamiast przesyłać je później wsadowo. Bazy danych Accessa często są łączone z danymi zewnętrznymi. Dzięki temu użytkownicy formularzy Accessa mogą dodawać i aktualizować dane zewnętrzne lub korzystać z nich w raportach Accessa. W Accessie można utworzyć łącze do następujących typów danych:
innej tabeli Accessa (.accdb, .accde, .accdr, .mdb, mda, mde),
arkusza kalkulacyjnego Excela,
folderów Outlooka,
plików tekstowych,
plików XML,
dokumentów HTML,
list SharePointa,
baz danych ODBC. W Accessie można dołączyć dane w różnych formatach (np. tabele z HTML-a, pliki tekstowe, pliki Excela i dokumenty XML) w trybie tylko do odczytu. Można używać i przeglądać tabele w formacie HTML lub tekstowym, ale nie można ich aktualizować ani dodawać do nich rekordów z wykorzystaniem Accessa.
194
Część II Tabele Accessa
Największą wadą tabel dołączonych jest to, że Access nie może wymuszać więzów integralności między tabelami (chyba że połączymy się z bazą danych Accessa lub wszystkie dołączone tabele znajdują się w innym systemie zarządzania bazami danych, który obsługuje więzy integralności). Tabele dołączone mogą też okazać się mniej wydajne od tabel lokalnych. W zależności od rodzaju i lokalizacji źródła danych użytkownicy mogą odczuć znaczące opóźnienie w trakcie otwierania formularzy lub raportów opartych na połączonych danych. Problemy z wydajnością stają się jeszcze bardziej widoczne, gdy w kwerendach stosuje się sprzężenia danych połączonych i lokalnych. Ponieważ Access nie może przeprowadzić optymalizacji danych zewnętrznych, sprzężenia często są niewydajne, a ich obliczenie wymaga dużo pamięci i cykli procesora. Jednak wyjątkowe możliwości Accessa w zakresie pracy z wieloma rodzajami danych zewnętrznych sprawiają, że jest to idealna platforma do rozwijania aplikacji, w których jest to potrzebne. Kiedy należy zaimportować dane zewnętrzne? Importowanie danych pozwala fizycznie wprowadzić zewnętrzną tabelę lub źródło danych do nowej lub istniejącej tabeli Accessa. Access automatycznie konwertuje dane z zewnętrznego formatu i kopiuje je do swojej tabeli. Można nawet zaimportować obiekty danych do innej bazy danych lub projektu Accessa, zamiast tego, który jest otwarty. Jeśli wiemy, że dane będą używane tylko w Accessie, powinniśmy je zaimportować. Ogólnie rzecz biorąc, Access działa szybciej z własnymi tabelami. Ponieważ importowanie powoduje utworzenie kopii danych, można usunąć stary plik po zaimportowaniu kopii do Accessa. Czasem bywa to jednak niewskazane. Dane mogą pochodzić na przykład z wciąż używanego arkusza kalkulacyjnego Excela. W takich przypadkach lepiej zachować zdublowane dane i pogodzić się z tym, że będą zajmować więcej miejsca (i że w obu plikach mogą pojawić się różne dane).
Jednym z podstawowych powodów importowania danych jest dostosowywanie ich do własnych potrzeb. Po zaimportowaniu tabeli do bazy Accessa można z nią pracować w taki sposób, jakby była zapisana w bieżącej bazie danych. Z drugiej strony, w dołączonych tabelach można wprowadzać tylko niektóre zmiany. Nie można na przykład określić klucza podstawowego ani reguł wprowadzania danych, przez co nie można wymusić integralności. Ponadto dołączone tabele prowadzą do plików zewnętrznych, które Access wyszukuje w określonej lokalizacji. Utrudnia to dystrybucję aplikacji. Dane w nieobsługiwanych programach Może się zdarzyć (choć to mało prawdopodobne), że wystąpi potrzeba skorzystania z danych pewnego programu, które są zapisane w nieobsługiwanym formacie bazy danych lub pliku. W takich przypadkach program zwykle może wyeksportować lub przekształcić swoje dane do jednego z formatów rozpoznawanych przez Accessa. Aby użyć danych z takich programów, należy wyeksportować je do formatu rozpoznawanego przez Accessa, a następnie zaimportować do Accessa. Większość aplikacji potrafi eksportować dane do plików XML. Jeśli format ten jest niedostępny, większość programów — nawet tych działających w innych systemach operacyjnych — potrafi eksportować dane do plików tekstowych z ogranicznikami albo o stałej szerokości pól, które można następnie zaimportować do Accessa.
Rozdział 6. Importowanie i eksportowanie danych
195
Dane do bazy danych Accessa często importuje się z przestarzałego systemu zastępowanego nową aplikacją w Accessie. Po zakończeniu procesu importowania starą aplikację można usunąć z komputera użytkownika. W przypadku częstego importowania danych z tego samego źródła można zautomatyzować ten proces za pomocą makra albo procedury języka VBA. Bywa to bardzo przydatne, jeśli regularnie importujemy dane z zewnętrznego źródła albo przeprowadzamy skomplikowane przekształcenia na importowanych danych.
Kiedy warto eksportować dane zewnętrzne? Wyeksportowane dane można przekazać do innej aplikacji. W trakcie eksportowania Access automatycznie przekształca dane na format zewnętrzny i kopiuje je do pliku, który można wczytać w innej aplikacji. Jak już wspomniano, czasem trzeba zaimportować dane do Accessa, aby móc je zmodyfikować (nie wystarczy połączyć tabeli z zewnętrznym źródłem danych). Jeśli chcesz zachować możliwość pracy ze zmodyfikowanymi danymi w zewnętrznej aplikacji, musisz utworzyć nowy plik przez wyeksportowanie zmienionych danych. Częstym powodem eksportowania danych jest chęć udostępnienia ich użytkownikom, którzy nie mają zainstalowanego Accessa.
Typy importu i eksportu Przed przystąpieniem do analizy procesów importowania i eksportowania spróbujemy w zwięzły sposób omówić niektóre opcje importowania danych do Accessa i eksportowania danych z Accessa. Bazy Accessa czasem nazywa się lądowiskiem dla wielu typów danych. Wynika to z tego, że Access ma możliwość używania i wymiany danych z wieloma aplikacjami. Na przykład można pobrać dane z innych baz danych, takich jak FoxPro lub dBase. Czasami trzeba również uzyskać informacje z bazy danych SQL Server, Oracle, pliku tekstowego lub nawet dokumentu XML. Access ma możliwość przenoszenia danych pomiędzy różnymi kategoriami aplikacji, silnikami baz danych, a nawet różnych platformami (komputery mainframe, komputery Macintosh). Otwórz bazę danych Rozdział06_1.accdb w Accessie i kliknij zakładkę DANE ZEWNĘTRZNE na wstążce (zobacz rysunek 6.1). Zobaczysz następujące grupy: Importowanie i łączenie, Eksportowanie, Zbieranie danych oraz Listy połączone z siecią Web.
Rysunek 6.1. Zakładka DANE ZEWNĘTRZNE obejmuje różne źródła danych dostępne w Accessie
Grupa Importowanie i łączenie obejmuje następujące opcje:
Zapisane operacje importowania,
Menedżer tabel połączonych,
196
Część II Tabele Accessa
Excel,
Access,
Baza danych ODBC,
Plik tekstowy,
Plik XML,
Więcej — kliknij ten przycisk, aby otworzyć listę rozwijaną Więcej. Obejmuje ona następujące opcje:
Lista programu SharePoint,
Usługi danych,
Dokument HTML,
Folder programu Outlook.
Grupa Eksportowanie obejmuje wymienione poniżej opcje:
Zapis. dane eksportu,
Excel,
Plik tekstowy,
Plik XML,
PDF lub XPS,
Wiadomość e-mail,
Access,
Korespondencja seryjna w programie Word,
Więcej — kliknij ten przycisk, aby otworzyć listę rozwijaną Więcej. Znajdziesz na niej następujące opcje:
Word,
Lista programu SharePoint,
Baza danych ODBC,
Dokument HTML.
Microsoft najwyraźniej dobrze przygotował Accessa do pełnienia funkcji lądowiska dla danych.
Importowanie zewnętrznych danych Proces importowania polega na skopiowaniu zewnętrznych danych do bazy danych Accessa. Zewnętrzne dane pozostają w pierwotnym stanie, a do Accessa importowana jest ich kopia. W przypadku importowania pliku (w przeciwieństwie do łączenia tabel) kopiujemy
Rozdział 6. Importowanie i eksportowanie danych
197
zawartość zewnętrznego źródła do tabeli Accessa. W trakcie tej operacji zewnętrzne źródło danych nie jest modyfikowane. Po zakończeniu procesu importowania nie są zachowywane żadne połączenia z zewnętrznym źródłem. Informacje można zaimportować albo do nowych, albo do istniejących tabel. Wszystkie typy danych można zaimportować do nowych tabel. Jednak w przypadku niektórych typów importu — na przykład przy importowaniu arkuszy kalkulacyjnych i plików tekstowych — dane trzeba importować do istniejących tabel, ponieważ pliki tekstowe i arkusze nie zawsze mają strukturę tabeli zgodną z Accessem.
Importowanie z innej bazy danych Accessa Do bieżącej bazy danych można importować obiekty z bazy źródłowej. Można importować tabele, kwerendy, formularze, raporty, makra lub moduły. W celu zaimportowania obiektu do bieżącej bazy danych Accessa wykonaj następujące czynności: 1. Otwórz docelową bazę danych, do której chcesz importować obiekty. W tym przypadku otwórz bazę danych Rozdział06_1.accdb. 2. Kliknij zakładkę DANE ZEWNĘTRZNE. 3. Kliknij opcję Access w sekcji Importowanie, a następnie kliknij przycisk Przeglądaj, aby określić nazwę pliku źródłowej bazy danych Accessa (Rozdział06_2.accdb). 4. Zaznacz przycisk opcji Importuj tabele, kwerendy, formularze, raporty, makra i moduły do bieżącej bazy danych, a następnie kliknij przycisk OK. Pojawi się okno dialogowe Importowanie obiektów (zobacz rysunek 6.2). Znajdują się tu obiekty bazy danych, które można zaimportować. Rysunek 6.2. Z jednej bazy danych Accessa do drugiej można zaimportować wiele typów obiektów
198
Część II Tabele Accessa
W trakcie pracy z zewnętrzną bazą danych Accessa można importować obiekty dowolnego rodzaju, w tym tabele, kwerendy, formularze, raporty, makra i moduły z kodem VBA.
5. Wybierz jedną z tabel i kliknij OK. Jeśli obiekt już istnieje w docelowej bazie danych, do nazwy importowanego obiektu zostanie dodany kolejny numer w celu odróżnienia zaimportowanego obiektu od tego, który występował wcześniej w docelowej bazie danych. Jeśli w docelowej bazie danych jest tabela tblWydziały, nowa zaimportowana tabela będzie miała nazwę tblWydziały1. Pojawi się okno dialogowe Pobieranie danych zewnętrznych — Zapisz kroki importowania. Udostępnia ono bardzo wygodną funkcję: pozwala zapisać proces importowania, co pokazano na rysunku 6.3.
Rysunek 6.3. Funkcja zapisywania kroków importowania pozwala zapisywać wykonywane często procesy w celu ich późniejszego wykorzystania
6. Podaj nazwę procesu importowania, tak aby móc łatwo sobie przypomnieć, do czego dany proces służy. Później możesz uruchomić zapisany proces importowania, klikając przycisk Zapisane operacje importowania w grupie Importowanie zakładki DANE ZEWNĘTRZNE na wstążce (zobacz rysunek 6.4). W oknie dialogowym Zarządzanie zadaniami danych można zmienić nazwę zapisywanego procesu importu, lokalizację pliku źródłowego, a także opis procesu. Pozostałych informacji na temat procesu importu (np. nazwy docelowej tabeli) nie można modyfikować. Jeśli chcesz zmienić inne informacje, utwórz nowy proces importu o odpowiednich cechach.
Rozdział 6. Importowanie i eksportowanie danych
199
Rysunek 6.4. Zapisane wcześniej procesy importowania można ponownie uruchomić Okno dialogowe Zarządzanie zadaniami danych obejmuje przycisk Utwórz zadanie programu Outlook, który służy do zapisywania procedury importu jako zaplanowanego zadania Outlooka. Jest to bardzo wygodny sposób automatycznego wykonywania procesu importowania w regularnych odstępach czasu.
Importowanie danych z arkusza kalkulacyjnego Excela Można zaimportować dane z arkuszy kalkulacyjnych Excela do nowej albo istniejącej tabeli. Najważniejsze jest to, że każda komórka danych w kolumnie arkusza musi zawierać dane tego samego typu. W trakcie importowania danych z Excela Access odgaduje typ danych dla każdego pola w nowej tabeli. Robi to na podstawie pierwszych kilku wierszy danych Excela (innych niż nagłówki kolumn). Jeśli któryś z dalszych wierszy w arkuszu Excela obejmuje niezgodne dane, może wystąpić błąd importowania. W arkuszu z rysunku 6.5 kolumna Age powinna zawierać wyłącznie liczby, ale zawiera jedną tekstową reprezentację wieku. Może to spowodować błąd w trakcie importowania. Dlatego dane z piątego wiersza należy zmodyfikować, aby cała kolumna zawierała dane liczbowe (zobacz rysunek 6.6). Można zaimportować lub dołączyć wszystkie dane z arkusza Excela albo tylko dane z nazwanego zakresu komórek. Jeśli nadamy zakresowi w arkuszu kalkulacyjnym nazwę, importowanie danych do Accessa będzie łatwiejsze. Arkusz jest często podzielony na grupy komórek (zakresy). Jedna z tych grup może, na przykład, zawierać listę transakcji danego klienta. Sekcja poniżej listy transakcji może zawierać łączne kwoty transakcji z wszystkimi klientami, sumy dla poszczególnych typów produktów albo sumy według miesiąca nabycia. Nadanie nazw poszczególnym grupom komórek umożliwia ograniczenie importu do określonej części arkusza.
200
Część II Tabele Accessa
Rysunek 6.5. Access umożliwia importowanie danych z arkusza Excela, ale z pewnymi ograniczeniami
Rysunek 6.6. Kolumny w arkuszu Excela powinny obejmować dane tego samego typu
Aby zaimportować arkusz Excela o nazwie EMPLIST.xls, wykonaj następujące czynności: 1. Kliknij przycisk Excel w zakładce DANE ZEWNĘTRZNE. 2. Przejdź do pliku Excela. 3. Wybierz opcję Importuj dane źródłowe do nowej tabeli w bieżącej bazie danych i kliknij przycisk OK. Na pierwszym ekranie kreatora importowania arkuszy (zobacz rysunek 6.7) zobaczysz listę arkuszy i nazwanych zakresów ze skoroszytu Excela, a także podgląda danych. 4. Wybierz arkusz lub nazwany zakres i ponownie kliknij przycisk Dalej.
Rozdział 6. Importowanie i eksportowanie danych
201
Rysunek 6.7. Kreator importu arkuszy
5. Na następnym ekranie (zobacz rysunek 6.8) zaznacz pole wyboru Pierwszy wiersz zawiera nagłówki kolumn i kliknij przycisk Dalej. Nie chcemy, aby nagłówki kolumn Excela były zapisane jako wartości pól. Access wykorzystuje nagłówki do utworzenia nazw pól nowej tabeli.
Rysunek 6.8. Czy pierwszy wiersz zawiera nagłówki kolumn?
202
Część II Tabele Accessa
6. Na następnym ekranie (zobacz rysunek 6.9) można określić nową nazwę dla pola, ustawić jego typ danych, usunąć pola, a także utworzyć indeks. Po zakończeniu wykonywania tych operacji kliknij przycisk Dalej.
Rysunek 6.9. Można zmienić domyślne ustawienia wybrane przez Accessa
7. Na następnym ekranie ustaw klucz główny dla nowej tabeli (zobacz rysunek 6.10) i kliknij przycisk Dalej. Klucz główny w niepowtarzalny sposób identyfikuje każdy wiersz w tabeli. Zachowaj ostrożność przy wybieraniu klucza głównego dla importowanych plików. Wskazane pole musi zawierać wartości zgodne z regułami tworzenia kluczy głównych. Nie może obejmować wartości null ani powtórzeń. Klucz główny tabeli służy do identyfikowania wierszy tabeli, dlatego jeśli żadna kolumna z arkusza Excela się do tego nie nadaje, najlepiej pozwolić Accessowi na dodanie domyślnego pola z kluczem głównym. Pola klucza głównego generowane przez Accessa zawsze mają typ Autonumerowanie i są zgodne z regułami normalizacji danych. Klucze główne omówiono w rozdziałach 3. i 4.
8. Określ nową nazwę tabeli, a następnie kliknij przycisk Zakończ. Jeśli importujesz plik Excela o takiej samej nazwie jak już dołączony plik Excela, Access wyświetli pytanie o to, czy chcesz zastąpić istniejący plik. Najlepiej nadać importowanej tabeli nową nazwę, chyba że rzeczywiście zamierzasz zastąpić dołączoną.
9. Proces importowania można zapisać i uruchomić ponownie później. Nowa tabela znajdzie się w okienku nawigacyjnym Accessa.
Rozdział 6. Importowanie i eksportowanie danych
203
Rysunek 6.10. Określanie klucza głównego dla nowej tabeli
Importowanie list SharePointa Listy SharePointa to potencjalne źródła danych dla baz Accessa. Ponieważ listy te znajdują się na serwerach WWW, dane z nich są dostępne w internecie dla uprawnionych użytkowników. W ten sposób za pomocą Accessa można współużytkować dane na całym świecie. W części VIII tej książki znajdziesz wprowadzenie do usług SharePointa i omówienie korzystania z nich.
Ponieważ w firmowych intranetach usługi SharePointa są coraz popularniejsze, Access z pewnością pozostanie ważną technologią w środowiskach korporacyjnych.
Importowanie danych z plików tekstowych Jest wiele przypadków, kiedy trzeba korzystać z plików tekstowych, na przykład przy przesyłaniu danych między firmami. Ponadto dane z systemów mainframe są zazwyczaj przenoszone do aplikacji w komputerach osobistych za pomocą plików tekstowych. W Accessie można importować dwa typy plików tekstowych: z ogranicznikami albo o stałej szerokości pól. Do importowania i eksportowania obu typów plików, w Accessie wykorzystuje się ten sam kreator. Pliki tekstowe z ogranicznikami Pliki tekstowe z ogranicznikami bywają też nazywane plikami z polami oddzielonymi przecinkami albo z polami oddzielonymi znakami tabulacji. Każdy rekord znajduje się tu w oddzielnym wierszu pliku. Pola w wierszu nie są uzupełniane spacjami, separatorem
204
Część II Tabele Accessa
pól jest najczęściej przecinek lub tabulator, a niektóre pola muszą być otoczone ogranicznikami (takimi jak znaki apostrofu lub cudzysłowu). Oto przykład pliku tekstowego rozdzielanego przecinkami: 1;Dankowska;Natalia;5/1/92 0:00:00;4000 2;Fulkowski;Andrzej;8/14/92 0:00:00;6520 3;Lubińska;Janina;4/1/92 0:00:00;1056 4;Piernikowska;Małgorzata;5/3/93 0:00:00;4000 5;Bochenek;Stefan;10/17/93 0:00:00;5000 6;Surma;Michał;10/17/93 0:00:00;1000 7;Król;Robert;1/2/94 0:00:00;1056 8;Celińska;Leokadia;3/5/94 0:00:00;1056 9;Dudziński;Józef;11/15/94 0:00:00;1056
Zwróćmy uwagę, że powyższy plik zawiera dziewięć rekordów (wierszy tekstu) i pięć pól. Pola są oddzielone przecinkami. Pola tekstowe nie są ograniczone znakami cudzysłowu. Każdy rekord ma inną długość, ponieważ różne są długości danych. Aby zaimportować plik tekstowy z ogranicznikami o nazwie ImportDelim.txt, wykonaj następujące czynności: 1. Otwórz bazę danych Rozdział06_1.accdb. 2. Kliknij zakładkę DANE ZEWNĘTRZNE. 3. W sekcji Importowanie kliknij Importuj plik tekstowy. 4. Odszukaj plik tekstowy ImportDelim.txt, wybierz go i kliknij przycisk OK. Następny ekran, jaki się wyświetli, to pierwsza strona kreatora importowania tekstu (zobacz rysunek 6.11). Kreator importu tekstu wyświetla dane w pliku tekstowym i pozwala wybrać między plikiem z ogranicznikami a plikiem o stałej szerokości pól.
Rysunek 6.11. Pierwszy ekran Kreatora importu tekstu
Rozdział 6. Importowanie i eksportowanie danych
205
5. Wybierz opcję Ograniczony i kliknij przycisk Dalej. Pojawi się następny ekran Kreatora importu tekstu (zobacz rysunek 6.12). Jak pokazano na rysunku 6.12, na tym ekranie można określić typ separatora używany w pliku tekstowym. Separator to określony znak umieszczany między polami w pliku tekstowym z ogranicznikami — często jest to średnik, choć może to być dowolny inny znak.
Rysunek 6.12. Drugi ekran Kreatora importu tekstu
6. Wybierz znak rozdzielający pola. Jeśli używany jest nietypowy separator, wybierz opcję Inny i wpisz znak w polu Inny. Jeśli separator pojawia się w wartościach pól pliku tekstowego, mogą wystąpić problemy. Gdy do rozdzielania pól używasz przecinka, a jedno z pól zawiera wartość Acme Widgets, Inc., Access będzie miał trudności z zaimportowaniem pliku. Rozwiązaniem jest umieszczenie pól tekstowych w cudzysłowach ("Acme Widgets, Inc."). Dzięki temu przecinek nie zostanie błędnie uznany za separator pól. Cudzysłów jest w tym kontekście kwalifikatorem tekstu. Cudzysłowy pełnią tu funkcję kwalifikatora. Najczęściej używa się w tym celu apostrofów i właśnie cudzysłowów. Zwykle można w ten sposób rozwiązać problemy związane z występowaniem znaków specjalnych w polach z danymi.
7. Jeśli pierwszy wiersz obejmuje nazwy pól importowanej tabeli, zaznacz pole Pierwszy wiersz zawiera nazwy pól. Po ustawieniu opcji na tym ekranie należy kliknąć przycisk Dalej. Kilka dalszych ekranów wygląda bardzo podobnie jak przy importowaniu arkuszy Excela. Można zmienić nazwy pól, określić klucz główny, a także zapisać proces importowania do wykorzystania później. Dla zaimportowanego pliku tekstowego ustaw opisową nazwę tabeli w Accessie. Access przy tworzeniu nowej tabeli domyślnie używa nazwy pliku tekstowego. Nowa tabela pojawia się w okienku nawigacyjnym Accessa.
206
Część II Tabele Accessa Aby podać puste pole w pliku tekstowym z ogranicznikami, nie wprowadzaj żadnych znaków (nawet odstępu) między przecinkami. Puste pole na końcu wiersza można dodać przez umieszczenie w tym miejscu przecinka.
Importowanie plików o stałej szerokości pól W plikach tekstowych o stałej szerokości pól każdy rekord również występuje w innym wierszu. Pola w każdym z rekordów mają jednak stałą długość. Jeśli zawartość pola nie jest wystarczająco długa, dodaje się do niego spacje tak, jak pokazano na rysunku 6.13. Rysunek 6.13. Typowy plik tekstowy o stałej szerokości pól
Zwróćmy uwagę, że pola nie są rozdzielone ogranicznikami. Zamiast tego rozpoczynają się dokładnie na tej samej pozycji w każdym rekordzie. Każdy rekord ma dokładnie tę samą długość. Warto również zauważyć, że wartości tekstowe, na przykład imiona i nazwiska, nie są ujęte w cudzysłów. Nie ma potrzeby wyróżniania wartości tekstowych, ponieważ każde pole ma określoną długość. Wszystko, co znajduje się w obrębie pozycji pola, jest interpretowane jako dane i nie wymaga ograniczników. Jeśli tabela Accessa, do której importujemy dane, ma pole klucza głównego, plik tekstowy nie może zawierać duplikatów w tym polu, bo w przeciwnym razie operacja importu zakończy się błędem, a wiersze z powtarzającymi się wartościami klucza głównego nie zostaną pobrane.
Aby zaimportować plik tekstowy o stałej długości pól, wykonaj następujące czynności: 1. Otwórz bazę danych Rozdział06_1.accdb. 2. Kliknij zakładkę DANE ZEWNĘTRZNE. 3. Wybierz polecenie Plik tekstowy z grupy Importowanie i łączenie. 4. Znajdź plik ImportFixed.txt, wybierz go, a następnie kliknij przycisk OK. Wyświetli się pierwszy ekran Kreatora importu tekstu (zobacz rysunek 6.11). Kreator wyświetla dane z pliku tekstowego i pozwala wybrać, czy są one rozdzielone ogranicznikami, czy znajdują się w polach o stałej szerokości.
Rozdział 6. Importowanie i eksportowanie danych
207
5. Wybierz opcję Stała szerokość i kliknij przycisk Dalej. Kolejny ekran powinien teraz przypominać okno pokazane na rysunku 6.14.
Rysunek 6.14. Ekran kreatora importowania tekstu dla plików o stałej szerokości pól
6. W razie potrzeby dostosuj szerokości pól. Access automatycznie rozpoznaje najlepszy podział danych na kolumny na podstawie najbardziej spójnego podziału danych w różnych wierszach. W tym przypadku podział danych na kolumny jest bardzo klarowny. W razie potrzeby można przeciągnąć linie podziału w lewo lub prawo, aby zmienić szerokość pól w pliku. 7. Kliknij przycisk Zaawansowane w dolnej części kreatora. Pojawi się ekran Specyfikacja importu (zobacz rysunek 6.15). W oknie dialogowym Specyfikacja importu można określić format daty i godziny, nazwy pól, indeksowanie i typy danych. Ponadto możesz tu wykluczyć pola, których nie chcesz importować. Szczegółowe informacje na temat tego okna znajdziesz w następnej ramce. 8. Sprawdź, czy w polu Kolejność dat ustawiona jest opcja MDR oraz czy zaznaczono pole wyboru Rok czterocyfrowy. 9. Kliknij pole wyboru Wiodące zera w datach. 10. Kliknij przycisk OK, aby zamknąć okno dialogowe Specyfikacja importu. 11. Przejdź przez pozostałe ekrany Kreatora importu tekstu.
208
Część II Tabele Accessa
Rysunek 6.15. Ekran specyfikacji importu podczas importowania pliku tekstowego o stałej szerokości pól
Importowanie i eksportowanie dokumentów XML Importowanie dokumentów XML w Accessie jest łatwe. Ten format danych można wykorzystać do przesyłania informacji pomiędzy różnymi platformami, bazami danych, systemami operacyjnymi, aplikacjami, firmami, planetami, galaktykami — i czym tam jeszcze. XML jest standardem dla danych, metadanych (czyli opisów danych), a nawet sposobu przetwarzania tych danych. Większość programistów Accessa w pewnym momencie importuje lub eksportuje dane w formacie XML. Prezentację obsługi XML-a w Accessie przedstawimy w niestandardowy sposób. Do bazy danych Accessa można z łatwością zaimportować prosty dokument XML. Jednak najlepszym sposobem pokazania dobrej obsługi XML-a w Accessie jest rozpoczęcie prezentacji od wyeksportowania jakiegoś obiektu do formatu XML. Aby wyeksportować dane z Accessa do dokumentu XML, wykonaj następujące czynności: 1. Otwórz bazę danych Rozdział06_1.accdb. 2. Otwórz tabelę tblDepartments w widoku arkusza danych. 3. W zakładce DANE ZEWNĘTRZNE, w sekcji Eksportowanie, kliknij polecenie Plik XML. 4. Nazwij plik XML tblDepartments.xml i kliknij przycisk OK. Pojawi się okno dialogowe Eksportowanie pliku XML przedstawione na rysunku 6.16. Rysunek 6.16. Okno dialogowe Eksportowanie pliku XML
Rozdział 6. Importowanie i eksportowanie danych
209
Korzystanie z okna Specyfikacja importu Jedną z zalet tego okna dialogowego jest możliwość określenia typu pliku, z którego importujemy lub do którego eksportujemy dane. Pola Język i Strona kodowa określają typ formatu. Pole kombi Strona kodowa wyświetla opcje kodowania znaków dostępne dla wybranego języka. W przypadku plików z ogranicznikami można też określić znak oddzielający pola. W polu kombi dostępne są cztery wbudowane opcje (średnik, znak tabulacji, spacja i przecinek). W tym polu można również podać własny separator pól. W przypadku plików z ogranicznikami można także określić kwalifikator tekstu. Zwykle pola tekstowe w pliku z ogranicznikami są umieszczone między kwalifikatorami (takimi jak znaki cudzysłowu). Przydaje się to, kiedy chcemy traktować dane liczbowe (np. NIP lub numer telefonu) jako tekst, a nie jako liczbę. Lista rozwijana z kwalifikatorami jest w rzeczywistości polem kombi — można w nim wpisać własny ogranicznik. Kiedy Access importuje lub eksportuje dane, przekształca dane na określony format, taki jak RRMMDD. Możesz określić sposób konwersji pól daty, wybierając jedną z sześciu opcji w polu kombi Kolejność dat:
DMR,
DRM,
MDR,
MRD,
RDM,
RMD.
Te opcje pozwalają określić kolejność części dat. D to dzień miesiąca (od 1 do 31), M to numer miesiąca (od 1 do 12), a R to rok. Domyślnie stosowany jest amerykański format dat (miesiąc, dzień, rok). W Europie kolejność części dat to zwykle dzień, miesiąc, rok. Opcja Ogranicznik daty określa znak używany pomiędzy poszczególnymi częściami daty. Domyślnie jest to ukośnik (/), ale można określić inny ogranicznik. W Europie części daty często oddziela się kropką (.), np. 22.10.12. Podczas importowania plików tekstowych zawierających daty, między rokiem, miesiącem i dniem musi znajdować się separator. W przeciwnym razie Access zgłosi błąd, jeśli określimy typ pola jako Data/Godzina. W przypadku eksportowania pola daty separator nie jest potrzebny. Za pomocą pola Ogranicznik czasu można określić stosowany w pliku tekstowym separator między godzinami, minutami i sekundami (zwykle jest to dwukropek). Aby zmienić separator, po prostu wpisz inny znak w polu Ogranicznik czasu. Pola wyboru Rok czterocyfrowy używa się wtedy, jeśli rok w polach daty ma być sformatowany jako wartość czterocyfrowa. W przypadku zaznaczenia tego pola, można eksportować daty zawierające stulecie (takie jak 1981 lub 2001). Jest to ustawienie domyślne. Pole wyboru Wiodące zera w datach pozwala określić, że części daty mają być poprzedzone zerem. Oznacza to, że w danych w razie potrzeby dodane zostaną wiodące zera (np. 02/04/03).
210
Część II Tabele Accessa
Kreator eksportowania pliku XML umożliwia ustawienie zaawansowanych opcji procesu eksportowania do pliku XML. Jeśli klikniesz przycisk Więcej opcji, wyświetli się okno dialogowe (zobacz rysunek 6.17), w którym znajduje się kilka ważnych ustawień plików XML. Rysunek 6.17. Zaawansowane opcje eksportowania do pliku XML
Dane w pliku XML mogą mieć strukturę relacyjną lub hierarchiczną. Jeden plik XML może obejmować informacje na temat kategorii produktów, a także samych produktów. Aby inne aplikacje mogły zrozumieć skomplikowany plik XML, trzeba udostępnić plik schematu. Access automatycznie generuje takie pliki (o rozszerzeniu .xsd) dla danych eksportowanych do formatu XML. Na rysunku 6.18 pokazano zakładkę Schemat w oknie dialogowym Eksportowanie pliku XML. Rysunek 6.18. Eksportowanie informacji o schemacie pliku XML
Schemat pliku XML obejmuje m.in. informacje o typach danych poszczególnych pól, a także o kluczu głównym i indeksach źródłowej tabeli. Dodatkowym usprawnieniem procesu eksportowania do pliku XML jest możliwość określenia, jak dane w formacie XML mają być prezentowane w aplikacji używającej eksportowanych danych. Sposób prezentacji określa się za pomocą konwencji języka HTML. Zwykle plik prezentacji danych w formacie XML (ma on rozszerzenie .xsl) nie
Rozdział 6. Importowanie i eksportowanie danych
211
jest potrzebny, ponieważ aplikacje wyświetlają dane tak, jak wymagają tego użytkownicy. Na rysunku 6.19 pokazano zakładkę Prezentacja w oknie dialogowym Eksportowanie pliku XML. Zauważ, że domyślnie nie jest zaznaczona żadna opcja w tej zakładce. Rysunek 6.19. Opcje prezentacji danych w formacie XML
Otwórz plik tblDepartments.xml w edytorze tekstu, np. w Notatniku. Zobaczysz zawartość pliku XML przedstawioną na rysunku 6.20. Rysunek 6.20. Wyeksportowany plik XML zawiera zwykły tekst
W dwóch pierwszych wierszach otwartego pliku tekstowego określone są używana wersja XML-a i schemat. Eksportowane dane i ich struktura zaczynają się od trzeciego wiersza. Plik XML zawiera hierarchicznie uporządkowane znaczniki, które wyznaczają strukturę danych. Każdy element danych znajduje się między otwierającym a zamykającym znacznikiem. Rekordy zaczynają się od znacznika z nazwą tabeli. Tu do definiowania tabeli służy znacznik . Kilka wierszy dalej znajduje się znacznik zamykający, , który wyznacza koniec rekordu.
212
Część II Tabele Accessa W XML-u (podobnie jak w HTML-u) znaczniki służą do określania kontekstu dla danych. Znaczniki otwierające wyznaczają początek struktury i składają się z tekstu pomiędzy znakami mniejszości (<) i większości (>). Znaczniki zamykające określają koniec struktury. Wyglądają podobnie jak znaczniki otwierające, jednak po znaku mniejszości (<) zawierają ukośnik (/).
Pomiędzy dwoma wspomnianymi znacznikami znajdują się pola i dane rekordu. Pierwsze pole pierwszego rekordu jest zapisane jako 1000. Aplikacja, która obsługuje dane w XML-u, potraktuje ten wiersz jak pole o nazwie DeptNumber o wartości 1000. Tego rodzaju hierarchia znaczników i danych obejmuje wszystkie pola każdego rekordu tabeli. Access pozwala eksportować dane do formatu XML, a także importować je z plików XML. Aby zaimportować wyeksportowany wcześniej plik tblDepartments.xml, wykonaj następujące kroki: 1. Kliknij przycisk Plik XML w grupie Importowanie i łączenie w zakładce DANE ZEWNĘTRZNE. 2. Przejdź do pliku tblDepartments.xml i kliknij przycisk OK. W oknie dialogowym Importowanie plików XML (zobacz rysunek 6.21) zobaczysz, w jaki sposób Access interpretuje dane w formacie XML. Rysunek 6.21. Access potrafi zinterpretować dane w formacie XML
3. Kliknij przycisk OK. Access przekształca poprawne dane w formacie XML na tabelę. Znacznik określa nazwę zaimportowanej tabeli, a znaczniki między i odpowiadającym mu znacznikiem zamykającym wyznaczają pola. Dane pomiędzy znacznikami pól stają się danymi w nowej tabeli.
Importowanie i eksportowanie dokumentów HTML Access umożliwia importowanie tabel HTML równie łatwo, jak tabel pochodzących z innych baz danych, arkuszy Excela czy też plików tekstowych. Wystarczy wybrać plik HTML do zaimportowania i skorzystać z Kreatora importu HTML. Kreator ten działa identycznie, jak inne kreatory importowania opisane we wcześniejszej części tego rozdziału.
Rozdział 6. Importowanie i eksportowanie danych
213
Podobnie jak w przypadku importowania dokumentów XML pokazanego w poprzednim punkcie, proces importowania dokumentów HTML prezentujemy w odwróconej kolejności. Najpierw wyeksportujemy tabelę do postaci HTML. Następnie zaimportujemy utworzony dokument HTML w celu utworzenia nowej tabeli w Accessie. 1. Otwórz bazę danych Rozdział06_1.accdb. 2. W zakładce DANE ZEWNĘTRZNE, w sekcji Eksportowanie, kliknij przycisk Więcej, a następnie kliknij polecenie Dokument HTML. 3. W oknie dialogowym Eksportowanie — Dokument HTML wskaż docelowy dokument HTML (zobacz rysunek 6.22).
Rysunek 6.22. Okno dialogowe Eksportowanie — Dokument HTML
4. Ustaw opcje dla docelowego dokumentu HTML i kliknij przycisk OK. Eksportowanie dokumentu HTML kończy się po kliknięciu przycisku OK. Jeśli nie zaznaczyłeś pola Eksportuj dane z formatowaniem i układem, wszystkie opcje dostępne w trakcie eksportowania takich dokumentów są widoczne na rysunku 6.22. Przy eksportowaniu danych z formatowaniem i układem (ustawienie to można wybrać w oknie dialogowym Eksportowanie — Dokument HTML) dostępne są dodatkowe opcje. Najważniejsza z nich wymaga określenia używanego w trakcie eksportowania szablonu HTML-a. Szablon HTML-a to zwykły plik HTML, który jednak zawiera specjalne znaczniki rozpoznawalne w Accessie. Znaczniki te informują Accessa, gdzie ma umieścić określone dane w trakcie eksportowania. Można dzięki temu zdefiniować pewne aspekty dokumentu HTML, np. styl i logo.
214
Część II Tabele Accessa
W procesie importowania dokumentów HTML dane są przekazywane do Accessa w sposób podobny jak dane z pliku tekstowego. Kreator importu HTML udostępnia niemal te same ekrany i opcje co kreator importu tekstu. Pozwala na przykład zdefiniować typy danych pól i określić klucz główny.
Importowanie obiektów Accessa innych niż tabele Oprócz tabel z innej bazy danych Accessa można importować również inne obiekty. Tak więc z innej bazy danych Accessa można zaimportować tabelę, kwerendę, formularz, raport, makro lub moduł. Można również zaimportować własne paski narzędzi i menu. Aby obejrzeć te możliwości, wykonaj następujące operacje: 1. Otwórz bazę danych Rozdział06_1.accdb. 2. W zakładce DANE ZEWNĘTRZNE, w sekcji Importowanie, kliknij opcję Access, aby importować obiekty z innej bazy danych Accessa. Pojawi się ekran widoczny na rysunku 6.23. Zauważ, że w oknie tym można wybrać importowanie obiektów bazy danych i dołączanie tabel z zewnętrznej bazy Accessa.
Rysunek 6.23. Ten sam kreator służy do importowania obiektów i dołączania zewnętrznych tabel Accessa
3. Wskaż bazę danych Rozdział06_2.accdb, a następnie kliknij OK. Na rysunku 6.24 widać, że można importować wszystkie typy obiektów Accessa.
Rozdział 6. Importowanie i eksportowanie danych
215
Rysunek 6.24. Importowanie obiektów Accessa
W przypadku importowania tabel, kwerend, formularzy, raportów, makr i modułów w jednej operacji można wybrać obiekty z każdej grupy, a następnie zaimportować wszystkie naraz. Na rysunku 6.24 widoczne jest okno dialogowe Importowanie obiektów, w którym kliknięto przycisk Opcje. Dostępne tu opcje umożliwiają importowanie relacji, menu, pasków narzędzi i innych obiektów baz danych Accessa. Importowanie (jak również eksportowanie) to doskonały sposób, by utworzyć kopię zapasową obiektów przed wprowadzeniem w nich zmian.
Importowanie folderu Outlooka Ciekawą funkcją Accessa w zakresie importowania jest możliwość pobierania danych bezpośrednio z aplikacji Microsoft Outlook. Choć większość osób uważa Outlooka za klienta poczty elektronicznej, aplikacja ta obsługuje liczne ważne zadania biznesowe, takie jak planowane wykonywanie operacji i zarządzanie kontaktami. W trakcie pracy z danymi z Outlooka w Accessie nie ma znaczenia, czy importowany obiekt to wiadomość czy dane kontaktowe. Access bez problemów obsługuje wszystkie rodzaje obiektów Outlooka. Wybierz opcję Folder programu Outlook z listy rozwijanej Więcej w grupie Importowanie i łączenie. Pojawi się okno dialogowe Folder programu Outlook (zobacz rysunek 6.25). Access umożliwia zaimportowanie danych z Outlooka, dodanie ich do istniejącej tabeli Accessa oraz dołączenie do bieżącej bazy. Jeśli wybierzesz opcję importowania, pojawi się Kreator importu z programów Exchange/ Outlook (zobacz rysunek 6.26). Jak pokazano w poniższym oknie dialogowym, Access potrafi importować wiadomości, dane kontaktowe, kalendarze, dzienniki i inne foldery.
216
Część II Tabele Accessa
Rysunek 6.25. Początkowe opcje importowania danych z Outlooka
Rysunek 6.26. Importowanie obiektów Outlooka do Accessa
Rozdział 6. Importowanie i eksportowanie danych
217
Dalsze ekrany kreatora pozwalają przejść przez proces przenoszenia danych z Outlooka do Accessa i zależą od obiektów wybranych w kreatorze. Dane z Outlooka można zaimportować do nowej lub istniejącej tabeli. Można też dodać klucz główny, określić typy danych, a także zapisać proces importowania w celu jego późniejszego uruchomienia.
Eksportowanie do formatów zewnętrznych W wyniku operacji eksportowania dane są kopiowane z tabeli Accessa do formatu innego programu lub źródła danych, na przykład dokumentu XML. Wyeksportowane dane mają format innego źródła danych, a nie bazy danych Accessa. Dane z tabeli lub kwerendy Accessa można skopiować do zewnętrznego pliku. Istnieje możliwość eksportowania tabel do kilku zewnętrznych formatów. Ogólnie rzecz biorąc, wszystko co zostało zaimportowane, można również wyeksportować, o ile nie występują inne przesłanki wskazane w tym rozdziale.
Eksportowanie obiektów do innych baz danych Accessa Można wyeksportować obiekty z bieżącej bazy danych do innej bazy danych Accessa. Możesz eksportować tabele, kwerendy, formularze, raporty itd. Wprawdzie zaimportować można jednocześnie wiele obiektów, ale wyeksportować można tylko jeden obiekt. Aby wyeksportować obiekt do innej bazy danych Accessa, wykonaj poniższe czynności: 4. Otwórz źródłową bazę danych i wybierz obiekt, który chcesz wyeksportować. 5. Kliknij przycisk Access z grupy Eksportowanie w zakładce DANE ZEWNĘTRZNE. Pojawi się okno dialogowe Eksportowanie — Baza danych programu Access. 6. Należy posłużyć się przyciskiem Przeglądaj, aby wskazać docelową bazę danych Accessa. Docelowa baza danych nie może być otwarta przy próbie eksportu. Gdyby tak było, wystąpiłby konflikt blokowania dostępu.
7. Kliknij przycisk OK. Rozpocznie się proces eksportowania. Tabele można eksportować jako wyłącznie dane lub jako dane i metadane.
Jeśli obiekt istniał wcześniej w docelowej bazie danych, wyświetli się pytanie o to, czy należy go zastąpić. Jeżeli nie chcesz go zastępować, utwórz nowy obiekt w docelowej bazie danych.
218
Część II Tabele Accessa
8. Ostatni krok umożliwia zapisanie konfiguracji eksportu do późniejszego wykorzystania. Opcja ta może się przydać, jeśli często wykonujemy tę samą operację eksportu. Przy próbie wyeksportowania obiektu do innej bazy danych Accessa, w której wcześniej znajdował się obiekt tego samego typu i o tej samej nazwie, Access przed skopiowaniem wyświetli ostrzeżenie. Użytkownik może anulować operację lub nadpisać istniejący obiekt.
Eksportowanie do programu Word Access udostępnia dwa sposoby przesyłania danych do Worda — eksportowanie do formatu RTF i korespondencję seryjną w programie Word. Plik RTF to plik ze zwykłym tekstem zawierającym znaki specjalne, które określają formatowanie. Eksportowanie do formatu RTF prowadzi do powstania pliku o rozszerzeniu .rtf, a nie standardowego dokumentu Worda. Jednak Word (podobnie jak WordPad i wiele innych edytorów tekstu) potrafi wczytywać pliki RTF. Korespondencja seryjna w programie Word Prawdziwa wartość eksportowania do Worda związana jest z korespondencją seryjną w tym programie. Mechanizm ten pozwala kontrolować, w którym miejscu w dokumencie Worda znajdą się dane z bazy. Jest to przydatne przy wysyłaniu listów, adresowaniu kopert, generowaniu raportów i tworzeniu etykiet na teczki. Aby utworzyć etykiety dla każdego działu z tabeli tblDepartments, wykonaj następujące czynności: 1. Otwórz tabelę tblDepartments w widoku arkusza danych. 2. Kliknij przycisk Korespondencja seryjna w programie Word w grupie Eksportowanie w zakładce DANE ZEWNĘTRZNE. 3. Na pierwszym ekranie kreatora korespondencji seryjnej w programie Word (zobacz rysunek 6.27) wybierz opcję Chcę, aby utworzył nowy dokument i połączył z nim dane, a następnie kliknij przycisk OK. W Wordzie otworzy się nowy dokument, a w prawym panelu pojawi się okienko zadań związanych z korespondencją seryjną. Rysunek 6.27. Kreator korespondencji seryjnej Microsoft Word umożliwia eksportowanie danych do istniejących lub nowych dokumentów
Rozdział 6. Importowanie i eksportowanie danych
219
4. W kreatorze korespondencji seryjnej wybierz etykiety jako typ dokumentu. Na trzecim etapie pracy kreatora Word domyślnie wybiera tblDepartments jako źródło danych. 5. Rozmieść pola DeptNumber i DeptDescription na szablonie etykiety, a następnie zakończ pracę kreatora. Na rysunku 6.28 widoczne są wyniki działania kreatora. Numery i opisy działów są tu rozdzielone myślnikiem. Rysunek 6.28. Gotowy szablon korespondencji seryjnej w programie Word
Aby zaimportować dane z Worda do Accessa, najpierw należy przekształcić dokument Worda na plik tekstowy. Można też zastosować Worda w połączeniu z Excelem, aby uzyskać plik tekstowy z ogranicznikami.
Publikowanie w formacie PDF lub XPS Formaty PDF i XPS opracowano z myślą o wyświetlaniu danych w postaci, w jakiej pojawią się na wydrukowanej stronie. Danych wyświetlanych w tych formatach zwykle nie można edytować. Publikowanie w formacie PDF lub XPS prowadzi do powstania stosunkowo niewielkich plików. Technika ta jest przydatna, gdy programista chce udostępniać dane, ale nie chce umożliwiać innym ich edycji. Aby wyeksportować tabelę tblEmployees w formacie PDF, wykonaj następujące czynności: 1. Zaznacz tabelę tblEmployees w okienku nawigacji. 2. Wybierz opcję PDF lub XPS w grupie Eksportowanie w zakładce DANE ZEWNĘTRZNE na wstążce. Pojawi się okno dialogowe Publikowanie jako pliku PDF lub XPS. 3. Na liście rozwijanej Zapisz jako typ wybierz opcję Plik PDF (zobacz rysunek 6.29). 4. Kliknij przycisk Publikuj. Efekt przedstawiono na rysunku 6.30. Widoczny jest tu plik PDF, który można otworzyć w różnych czytnikach plików w tym formacie. Takie czytniki są zainstalowane w większości komputerów, dlatego PDF to doskonały format do udostępniania danych, które nie mają być modyfikowane.
220
Część II Tabele Accessa
Rysunek 6.29. Wybierz PDF lub XPS jako format pliku
Rysunek 6.30. Tabela opublikowana w formacie PDF
Rozdział 7.
Dołączanie danych zewnętrznych W tym rozdziale:
Przegląd typów danych zewnętrznych i metod pracy z nimi
Łączenie baz Accessa z danymi zewnętrznymi
Używanie połączonych tabel
Rozdzielanie baz danych Accessa
W rozdziale 6. poznałeś typy danych zewnętrznych, które można importować do Accessa i eksportować z tego programu. Dowiedziałeś się też, kiedy należy importować i eksportować dane, a kiedy lepiej się z nimi łączyć. W tym rozdziale poznasz techniki używania danych zewnętrznych Accessa za pomocą aktywnego połączenia z danymi. W tym rozdziale będziemy korzystać z bazy danych o nazwie Rozdział16.accdb, a także kilku innych plików, które posłużą do łączenia. Jeżeli ktoś jeszcze nie skopiował ich do swojego komputera, powinien zrobić to teraz.
Ponieważ w rozdziale tym pokazujemy, jak Access obsługuje dane zewnętrzne, wykorzystujemy tu przykładowe dane tego rodzaju, które należy skopiować do komputera. Niestety, w trakcie korzystania z danych zewnętrznych w Accessie trzeba podać dokładną ścieżkę do każdego pliku. Ścieżki względne nie są obsługiwane. Oznacza to, że skopiowany do komputera plik Rozdział07.accdb nie będzie działał dopóty, dopóki nie połączysz z nim różnych plików zewnętrznych. Z rozdziału tego dowiesz się, jak to zrobić. Poniżej opisano, z którymi plikami połączone są poszczególne tabele. Tabela ContactsFixed Customers CustomerTypes Products tblSales tblSalesLineItems tblSalesPayments
Typ zewnętrznego pliku Plik tekstowy Excel HTML Excel 8.0 Access Excel 8.0 Access
Nazwy plików ContactsFixed.txt CollectibleMiniCars.xls CustomerTypes.html CollectibleMiniCars.xls Rozdział07_łącze.accdb tblSalesLineItems.xls Rozdział07_łącze.accdb
222
Część II Tabele Accessa
Naprawianie łączy Szczegółowe omówienie menedżera łączenia tabel znajdziesz w dalszej części rozdziału. Na razie zapoznaj się z sześcioma poniższymi krokami, które pozwolą naprawić połączone tabele z bazy Rozdział07.accdb: 1. Skopiuj katalog Rozdział07 do komputera i zapamiętaj ścieżkę do tego katalogu. 2. Otwórz plik Rozdział07.accdb. 3. Kliknij przycisk Menedżer tabel połączonych w grupie Importowanie i łączenie w zakładce DANE ZEWNĘTRZNE na wstążce. Otworzy się menedżer tabel połączonych. 4. Kliknij przycisk Zaznacz wszystkie, a następnie kliknij OK. Access wyświetli pytanie o nową lokalizację każdej z tabel połączonych. 5. Na podstawie tabeli z nazwami przedstawionej we wcześniejszej części rozdziału przejdź do odpowiednich plików. Menedżer tabel połączonych wyświetli komunikat, że wszystkie tabele zostały poprawnie odświeżone. Teraz możesz swobodnie wykonywać przykłady z tego rozdziału.
Dane dołączone do aplikacji Accessa lub do nich zaimportowane mogą mieć różne formaty. Praktycznie nie ma sposobu, aby w jednym rozdziale udokumentować wszystkie możliwe typy operacji łączenia. Z tego względu w tym rozdziale zamiast zapełniać wiele stron przykładami, które niekoniecznie mogą być przydatne do pracy, opisano najważniejsze czynności wymagane do łączenia danych zewnętrznych i poparto je kilkoma przykładami pokazującymi sposoby wykonywania tych procesów w Accessie. Jak się wkrótce przekonasz, wiedza na temat zewnętrznych formatów danych ma kluczowe znaczenie do skutecznego wykonywania operacji łączenia. Skuteczne importowanie danych do aplikacji Accessa lub korzystanie z danych za pomocą łączenia wymaga posiadania pewnej wiedzy na temat zewnętrznych formatów danych. W tym rozdziale zwrócono uwagę na wiele spraw dotyczących łączenia zewnętrznych danych. Ma to być przewodnik dotyczący wykonywania tych operacji w aplikacjach Accessa.
Dołączanie danych zewnętrznych W miarę rozwoju rynku baz danych potrzeba uzyskiwania informacji z różnorodnych źródeł będzie stale rosła. Jeśli mamy informacje zapisane w tabeli serwera SQL Server albo w starym arkuszu Excela, przepisywanie ich do Accessa mijałoby się z celem. Byłoby najlepiej, gdyby można było otworzyć tabelę Accessa i używać informacji w ich rodzimym formacie, bez przepisywania ich albo pisania programu tłumaczącego. W wielu współczesnych firmach możliwość dostępu do informacji z jednej bazy danych podczas pracy z drugą ma kluczowe znaczenie dla wielu projektów. Kopiowanie lub tłumaczenie danych z formatu jednej aplikacji na format drugiej za pomocą kodu jest czasochłonne i kosztowne. Ilość poświęconego na to czasu może stanowić o sukcesie lub porażce. Potrzebna jest więc platforma wymiany danych pomiędzy różnymi źródłami danych w środowisku.
Rozdział 7. Dołączanie danych zewnętrznych
223
Access potrafi jednocześnie połączyć się z wieloma tabelami zapisanymi w innych systemach baz danych. Po dołączeniu zewnętrznego pliku Access zachowuje parametry łącza i korzysta z danych zewnętrznych tak, jakby były zapisane w lokalnej tabeli. Access z łatwością może łączyć się z tabelami innych baz Accessa, a także z tabelami innych baz danych takich jak dBASE i FoxPro. Powszechną praktyką jest również rozdzielenie bazy danych Accessa na oddzielne bazy, w celu ułatwienia używania jej w środowisku wielodostępnym albo typu klient-serwer.
Identyfikowanie tabel połączonych W punkcie „Metody pracy z danymi zewnętrznymi” w rozdziale 6. podaliśmy listę tabel baz danych oraz innych typów plików, z którymi Access może się łączyć. Access wyświetla nazwy tabel połączonych na liście obiektów, ale wykorzystuje specjalną ikonę, która oznacza, że określona tabela jest połączona, a nie lokalna. Strzałka skierowana na ikonę wskazuje na to, że nazwa tabeli reprezentuje dołączone źródło danych. Na rysunku 7.1 pokazano listę zawierającą kilka tabel połączonych. Ikona oznacza, że plik jest dołączony. Określa też typ pliku dołączonego do bieżącej bazy danych Accessa. Na przykład X wskazuje na plik Excela, a symbol kuli ziemskiej — na tabelę z dokumentu HTML. Rysunek 7.1. Tabele połączone w bazie danych Accessa. Warto zwrócić uwagę, że każdej tabeli połączonej towarzyszy ikona określająca jej status jako tabeli połączonej
Po dołączeniu tabeli z zewnątrznej bazy danych do bazy Accessa, można traktować ją tak jak każdą inną tabelę. Na przykład na rysunku 7.2 pokazano kwerendę zaprojektowaną z wykorzystaniem kilku tabel połączonych: tblCustomers (lokalna tabela Accessa), tblSales (tabela połączona Accessa), tblSalesLineItems (z pliku Excela) oraz xlsProducts (inny plik Excela). Jak widać, tabele ze źródeł zewnętrznych niczym się nie wyróżniają. Access traktuje je tak jak zwykłe tabele. Kwerenda ta pokazuje potencjalne korzyści z dołączania źródeł danych różnego typu oraz bezproblemowe wyświetlanie danych zarówno z tabel wewnętrznych, jak i połączonych. Arkusz danych zwrócony przez pokazaną kwerendę można zobaczyć na rysunku 7.3. Każda kolumna w tym arkuszu danych pochodzi z innego dołączonego źródła danych.
224
Część II Tabele Accessa
Rysunek 7.2. Kwerenda zaprojektowana z wykorzystaniem zewnętrznych tabel połączonych
Rysunek 7.3. Dołączone dane zewnętrzne w widoku arkusza danych
Na rysunku 7.3 pokazano ważne zagadnienie dotyczące używania dołączonych danych w Accessie. Użytkownicy nie wiedzą, gdzie znajdują się dane, i w większości przypadków ich to nie interesuje. Chcą jedynie móc przeglądać dane w formacie, jakiego się spodziewają. Tylko programista musi brać pod uwagę problemy związane z dostarczeniem danych do interfejsu użytkownika. Z dołączonymi danymi wiążą się pewne ograniczenia (omówiono je w dalszym punkcie). Jednak ogólnie rzecz biorąc użytkownicy nie będą w stanie odróżnić danych rodzimych od dołączonych.
Rozdział 7. Dołączanie danych zewnętrznych
225
Tabeli zewnętrznej dołączonej do bazy danych Accessa nie można przenieść na inny dysk lub do innego katalogu. Access w rzeczywistości nie dołącza zewnętrznej tabeli do pliku .accdb, lecz zapisuje informacje o łączu w postaci nazwy pliku i ścieżki do niego. Po przeniesieniu zewnętrznej tabeli trzeba zaktualizować łącze za pomocą Menedżera tabel połączonych, o którym będzie mowa w punkcie „Przeglądanie lub zmienianie informacji o tabelach połączonych” w dalszej części tego rozdziału.
Ograniczenia dotyczące dołączonych danych Chociaż w tym rozdziale opisano używanie dołączonych danych w taki sposób, jakby były rodzimymi tabelami Accessa, dołączone dane nie pozwalają na wykonywanie pewnych operacji. Co więcej, niedozwolone operacje w pewnym stopniu zależą od typu danych dołączonych do Accessa. Ograniczenia te są dość zrozumiałe. Dołączone dane nigdy nie są „własnością” Accessa. Pliki zewnętrzne dołączone do Accessa są zarządzane przez ich macierzyste aplikacje. Na przykład arkuszami Excela zarządza Microsoft Excel. Dowolne modyfikowanie danych w arkuszu Excela przez Access byłoby niebezpieczne. Jak wiadomo, wiele operacji Excela bazuje na relatywnym położeniu względem siebie wierszy i kolumn. W związku z tym wstawienie wiersza do arkusza mogłoby przyczynić się do wypaczenia wyników obliczeń oraz innych operacji na danych wykonywanych w Excelu. Usunięcie wiersza może naruszyć granice zakresu komórek zdefiniowanego w arkuszu Excela i spowodować podobne problemy. Ponieważ nie ma możliwości, aby Access potrafił wykonać wszystkie operacje na zewnętrznych danych w sposób identyczny do stosowanego w ich rodzimych aplikacjach, firma Microsoft przyjęła bardzo konserwatywny kierunek i nie zezwala na modyfikowanie w Accessie danych zewnętrznych, jeśli taka operacja może powodować problemy w ich rodzimych aplikacjach. Ograniczenia dotyczące dołączonych danych opisano na poniższej liście:
Dane Accessa — nie ma ograniczeń dotyczących operacji na danych z tabel połączonych. Nie można jednak usunąć źródłowej tabeli ani zmienić jej nazwy. Niedozwolone jest też modyfikowanie pól i typów danych w źródłowej tabeli.
Dane Excela — nie można modyfikować istniejących danych w arkuszach Excela. Nie można również usuwać wierszy ani dodawać nowych wierszy do arkusza. Dane Excela użyte w Accessie do dowolnych celów są interpretowane jako informacje tylko do odczytu.
Pliki tekstowe — we wszystkich praktycznych zastosowaniach dane powiązane z plikami tekstowymi w Accessie są interpretowane jako dane tylko do odczytu. Chociaż można użyć tych danych w formularzach i raportach, nie można w prosty i łatwy sposób aktualizować wierszy w dołączonym pliku tekstowym. Nie można również usuwać wierszy z takich plików. O dziwo, można jednak wprowadzać nowe wiersze. Najprawdopodobniej przyczyną tego jest fakt, iż wprowadzanie nowych wierszy nie narusza istniejących operacji w sposób, w jaki jest to możliwe w przypadku usunięcia wiersza lub modyfikacji jego zawartości.
HTML — są traktowane dokładnie tak jak dane Excela. Nie można modyfikować, usuwać lub wprowadzać nowych wierszy do tabeli HTML.
226
Część II Tabele Accessa
Kontakty w Outlooku — można je wyświetlać w formularzach i raportach Accessa, jednak danych tego rodzaju nie można dodawać, usuwać ani modyfikować.
ODBC — jest to technologia dostępu do danych, w której wykorzystuje się sterownik pomiędzy bazą danych Accessa a zewnętrznym plikiem bazy danych, np. Microsoft SQL Server lub Oracle. W tym przypadku dołączone źródło danych również jest tabelą bazy danych, zatem można w niej wykonywać operacje typowe dla bazy danych (modyfikowanie, usuwanie, dodawanie), podobnie jak dla rodzimych tabel Accessa, przy czym w tabeli Accessa zdefiniowany musi być indeks. Tabele baz danych ODBC opisujemy szczegółowo w punkcie „Łączenie ze źródłami danych ODBC” w dalszej części tego rozdziału.
Dołączanie tabel z innych baz danych Accessa Za pomocą techniki dołączania w Accessie można z łatwością wykorzystać dane umieszczone w innych plikach Accessa. Dzięki temu dane Accessa można bez trudu współdzielić pomiędzy aplikacjami Accessa w sieci lub komputerze lokalnym. Informacje zaprezentowane w tym punkcie dotyczą niemal każdego dołączanego pliku danych w bazie danych Accessa. W dalszej części tego rozdziału znajdują się krótkie punkty objaśniające różnice pomiędzy łączeniem tabel Accessa a łączeniem z innymi typami plików danych rozpoznawanych przez Accessa. Bardzo powszechną praktyką wśród programistów Accessa jest podział bazy danych Accessa na dwie części. Jedna część zawiera formularze, raporty i inne komponenty interfejsu użytkownika aplikacji, natomiast druga zawiera tabele, kwerendy i inne elementy danych. Podział baz danych Accessa ma wiele zalet. Pozwala na poprawę wydajności, a także zapewnia łatwiejsze utrzymanie. O podziale baz danych Accessa można przeczytać w dalszej części rozdziału. Proces łączenia z zewnętrznymi tabelami Accessa opisany w tym punkcie stanowi istotną część operacji podziału bazy danych.
Po dołączeniu tabeli z innego pliku Accessa można się nią posługiwać niemal tak samo jak innymi tabelami w otwartej bazie danych (różnica polega na tym, że tabel połączonych nie można używać w relacjach z tabelami, które nie występują w źródłowej bazie danych). Aby dołączyć tabelę tblSalesPayments z bazy danych Rozdział07_Łącze.accdb do bazy danych Rozdział07.accdb, wykonaj następujące czynności: 1. Otwórz bazę danych Rozdział07.accdb. 2. Zaznacz zakładkę DANE ZEWNĘTRZNE na wstążce. Następnie wybierz Accessa jako typ dołączanych danych. Pojawi się okno dialogowe Pobieranie danych zewnętrznych, które pokazano na rysunku 7.4. 3. Kliknij przycisk Przeglądaj. Otworzy się windowsowe okno dialogowe Otwieranie pliku. 4. Znajdź plik Rozdział07_Łącze i kliknij przycisk Otwórz. Okno Otwieranie pliku zamknie się i powrócisz do okna dialogowego Pobieranie danych zewnętrznych. 5. Zaznacz przycisk opcji związany z łączeniem i kliknij przycisk OK. Okno dialogowe Łączenie tabel pozwala na wybór jednej lub kilku tabel z wybranej bazy danych (w tym przypadku Rozdział07_Łącze). Otwarte okno dialogowe Łączenie tabel dla bazy danych Rozdział07_Łącze.accdb pokazano na rysunku 7.5.
Rozdział 7. Dołączanie danych zewnętrznych
227
Rysunek 7.4. W oknie dialogowym Pobieranie danych zewnętrznych można wybrać typ operacji wykonywanych na zewnętrznych źródłach danych Rysunek 7.5. Okno dialogowe Łączenie tabel umożliwia wybór tabel Accessa, które mają być połączone
6. Zaznacz tabelę tblSalesPayments i kliknij OK. Dwukrotne kliknięcie nazwy tabeli nie powoduje jej wybrania — trzeba zaznaczyć tabelę, a następnie kliknąć OK.
228
Część II Tabele Accessa
Po dołączeniu tabeli tblSalesPayments, Access powraca do listy obiektów i wyświetla na niej połączoną przed chwilą tabelę. Na rysunku 7.6 pokazano tabelę tblSalesPayments dołączoną do bieżącej bazy danych. Zwróćmy uwagę na specjalną ikonę obok tabeli tblSalesPayments. Ikona ta wskazuje, że tabela jest połączona z zewnętrznym źródłem danych. Wskazanie tabeli połączonej myszą powoduje wyświetlenie zewnętrznego źródła danych tabeli. Rysunek 7.6. Okienko nawigacji po dodaniu tabeli tblSalesPayments. Zwróćmy uwagę na ikonę, która wskazuje na to, że jest to tabela połączona
W jednej operacji można dołączyć więcej niż jedną tabelę. W tym celu, przed kliknięciem przycisku OK, należy zaznaczyć wiele tabel w oknie dialogowym Łączenie tabel. Kliknięcie przycisku Zaznacz wszystkie powoduje zaznaczenie wszystkich tabel. Po wybraniu wszystkich tabel można kliknąć dowolną z nich, aby ją wykluczyć.
Łączenie ze źródłami danych ODBC Jednym z elementów, które spowodowały znaczny postęp w zakresie współdzielenia danych, było stworzenie interfejsu ODBC (ang. Open Database Connectivity) przez firmę Microsoft i innych dostawców baz danych. ODBC jest specyfikacją używaną przez producentów oprogramowania do tworzenia sterowników dla baz danych. Specyfikacja ta umożliwia działanie aplikacji Accessa w standardowy sposób dla różnych platform baz danych. Aplikacja napisana zgodnie ze specyfikacją ODBC może korzystać na zapleczu z dowolnej bazy danych zgodnej z ODBC. Załóżmy na przykład, że tworzymy aplikację Accessa, która na zapleczu ma wykorzystywać bazę danych systemu SQL Server. Najczęściej stosowanym sposobem tworzenia takich rozwiązań jest wykorzystanie sterownika ODBC systemu SQL Server. Po stworzeniu aplikacji dowiadujemy się, że jedna z filii naszej firmy chce korzystać z aplikacji, ale z wykorzystaniem Oracle jako serwera bazy danych. Jeśli w aplikacji ściśle stosowaliśmy się do składni ODBC, wykorzystanie naszej aplikacji z bazą danych Oracle
Rozdział 7. Dołączanie danych zewnętrznych
229
wymaga jedynie zakupu sterownika ODBC do bazy danych Oracle. Sterowniki te są dostarczane nie tylko przez producentów baz danych dla ich własnych produktów. Są również firmy, które specjalizują się wyłącznie w tworzeniu sterowników ODBC. Łączenie się ze źródłami danych przez interfejs ODBC opisano szczegółowo w rozdziale 29. Dowiesz się z niego, jak konfigurować źródła danych zgodne z tym interfejsem i jak je dołączać. Choć w rozdziale 29. jako przykład wykorzystano bazę SQL Server, te same reguły dotyczą wszystkich źródeł danych zgodnych z ODBC.
Dołączanie danych, które nie są bazami Można również dołączać dane które nie są bazami, takie jak arkusze Excela, tabele HTML i pliki tekstowe. Kiedy wybierzemy jeden spośród tych typów jako źródło danych, Access uruchomi kreator łączenia, który pomoże w wykonaniu tego zadania. Dołączanie plików Excela Podczas dołączania danych Excela należy zwrócić uwagę na kilka elementów:
Skoroszyt .xls Excela może zawierać wiele arkuszy. W obrębie skoroszytu należy wskazać arkusz, który ma być dołączony (można też wykorzystać zakresy ze zdefiniowaną nazwą).
W obrębie arkusza Excela można dołączać indywidualne zakresy ze zdefiniowaną nazwą. Każdy zakres odpowiada odrębnej tabeli połączonej w Accessie.
W kolumnach Excela mogą być zapisane dane dowolnego typu. Fakt pomyślnego dołączenia arkusza Excela nie oznacza, że aplikacja może korzystać ze wszystkich danych zapisanych w arkuszu Excela. Ponieważ Excel nie wprowadza ograniczeń co do typu danych zapisanych w skoroszycie, może się zdarzyć, że aplikacja napotka na wiele typów danych w pojedynczej kolumnie dołączonego arkusza Excela. Oznacza to, że czasami trzeba zdefiniować kod lub zastosować inne sposoby obejścia problemu różnych typów danych w arkuszu Excela. W plikach dołączonych do tej książki znajduje się arkusz Excela utworzony poprzez wyeksportowanie tabeli tblProducts z aplikacji MiniAuta dla Kolekcjonerów. Plik ten można wykorzystać do ćwiczeń w importowaniu danych Excela. Należy pamiętać, że dane, jakie można spotkać w arkuszach Excela, mogą być znacznie bardziej złożone i gorzej uporządkowane niż te zapisane w pliku Products.xls.
Aby dołączyć arkusz kalkulacyjny Excela o nazwie Products.xls, wykonaj następujące czynności: 1. W bazie danych Rozdział07.accdb wybierz przycisk Excel w zakładce DANE ZEWNĘTRZNE. Pojawi się okno dialogowe Pobieranie danych zewnętrznych (zobacz rysunek 7.7). 2. Zaznacz opcję Połącz ze źródłem danych, tworząc tabelę połączoną i kliknij przycisk Przeglądaj. To samo okno dialogowe Pobieranie danych zewnętrznych wykorzystuje się zarówno do operacji importowania, jak i dołączania. Z tego powodu, przed przejściem do dalszych działań, należy się upewnić, czy wybrano właściwą operację.
230
Część II Tabele Accessa
Rysunek 7.7. Pierwszy ekran w oknie dialogowym Pobieranie danych zewnętrznych — Arkusz kalkulacyjny programu Excel Importowanie danych do Accessa omówiono w rozdziale 17.
3. Kliknij przycisk Przeglądaj widoczny na prawo od pola z nazwą pliku. Pojawi się okno dialogowe Otwieranie pliku. 4. Odszukaj i otwórz plik Excela. Po wybraniu pliku powracamy do Kreatora łączenia arkuszy (zobacz rysunek 7.8). Zwróć uwagę, że okno dialogowe Kreator łączenia arkuszy zawiera opcje umożliwiające wybór z pliku skoroszytu arkuszy lub zakresów identyfikowanych przez nazwę. W tym przykładzie w pliku skoroszytu są trzy różne arkusze (o nazwach Produkty, Transakcje i Klienci). 5. Dla potrzeb tego przykładu wybierz arkusz Produkty. Kreator łączenia arkuszy przeprowadzi Cię przez kilka ekranów, na których należy określić różne informacje, na przykład zaznaczyć opcję Pierwszy wiersz zawiera nagłówki kolumn oraz określić typ danych używany dla poszczególnych kolumn arkusza Excela. Na ostatnim ekranie Kreatora łączenia arkuszy wyświetla się nazwa nowo dołączonej tabeli. 6. Kliknij przycisk Zakończ. Tabela połączona tworzy się po powrocie do środowiska Accessa. Tak jak w przypadku licznych innych elementów dotyczących projektowania baz danych wiele decyzji związanych z dołączaniem zewnętrznych źródeł danych wynika ze sposobu korzystania z danych w aplikacji. Bezpośredni wpływ na aplikację mają również nazwy wykorzystywane dla pól oraz inne szczegóły.
Rozdział 7. Dołączanie danych zewnętrznych
231
Rysunek 7.8. Główny ekran kreatora łączenia arkuszy
Dołączanie plików HTML Dołączanie danych zapisanych w dokumentach HTML nie zostało szczegółowo opisane w tej książce z powodu poważnych ograniczeń nakładanych na ten proces przez Accessa. Na przykład Access nie potrafi pobierać danych z plików HTML o dowolnej strukturze. Dane muszą być zaprezentowane w postaci tabeli HTML w formacie wierszy i kolumn, a ponadto muszą być stosunkowo jednorodne (pozbawione niestandardowych danych lub ich kombinacji, takich jak tekst, grafika i dane numeryczne w jednej tabeli HTML). Jeśli na stronie występuje więcej niż jedna tabela lub jeśli dane są zaprezentowane w sposób hierarchiczny (dane nadrzędne i podrzędne), mogą wystąpić problemy z importem. Biorąc pod uwagę wszystkie te elementy, dołączanie tabel HTML o dowolnej strukturze jest, w najlepszym przypadku, działaniem o niepewnym skutku. Znacznie łatwiej dołączyć dokument HTML specjalnie przygotowany jako źródło danych dla aplikacji Accessa, niż próbować pracy z dowolnymi plikami HTML.
Co więcej, jeśli ktoś może zadać sobie trud związany z przygotowaniem specjalizowanych dokumentów HTML do wykorzystania w roli źródeł danych Accessa, równie dobrze może przygotować wygodniejsze w użyciu pliki z wartościami rozdzielanymi przecinkami (ang. Comma Separated Values — CSV) lub pliki zawierające dane tekstowe o stałej szerokości. Pliki w formacie CSV, w których pola w każdym wierszu są rozdzielane przecinkami, są bardzo popularnym sposobem przenoszenia danych pomiędzy aplikacjami. Pliki CSV oraz pliki tekstowe o polach stałej długości omówiono w następnym podrozdziale. Jeśli pominąć wspomniane uwagi, proces dołączania danych HTML jest bardzo podobny do dołączania arkuszy Excela.
232
Część II Tabele Accessa
1. Należy wybrać przycisk rozwijanej listy Więcej na zakładce DANE ZEWNĘTRZNE i wybrać z listy pozycję Dokument HTML. Spowoduje to otwarcie okna dialogowego Pobieranie danych zewnętrznych — Dokument HTML. 2. Zaznacz opcję Połącz ze źródłem danych, tworząc tabelę połączoną i kliknij przycisk Przeglądaj. Wyświetli się okno dialogowe Otwieranie pliku, w którym można wyszukać dokument HTML do połączenia. Od tego miejsca proces dołączania danych w formacie HTML przebiega podobnie jak dołączanie innych plików z danymi. Należy podać m.in. nazwy pól i inne informacje na temat dołączanych danych. Na rysunku 7.9 pokazano pierwszy ekran kreatora importowania plików HTML. Kliknij przycisk Zaawansowane w lewym dolnym rogu, aby przejść do ekranu Specyfikacja łącza (zobacz rysunek 7.10), gdzie można podać nazwy pól i inne szczegółowe dane.
Rysunek 7.9. Kreator importu HTML wyświetla dane z pliku HTML W plikach dołączonych do tej książki znajduje się bardzo prosty dokument HTML o nazwie CustomerTypes.html. Dane w tym pliku są być może przesadnie uproszczone, ale korzystając z niego, można przećwiczyć dołączanie dokumentów HTML. Ze względu na różnorodny sposób zapisywania danych w dokumentach HTML nie ma możliwości uogólnienia sposobu dołączania danych HTML. Wystarczy jednak nabrać wprawy w dołączaniu zewnętrznych źródeł danych, aby dołączanie dokumentów HTML stało się cennym uzupełnieniem umiejętności programowania w Accessie.
Dołączanie plików tekstowych Znacznie częstszą sytuacją (w porównaniu z dołączaniem plików HTML) jest dołączanie danych zapisanych w zwykłych plikach tekstowych. Większość aplikacji, łącznie z Wordem i Excelem, pozwala na publikowanie danych w różnych formatach tekstowych. Najczęściej spotykanymi formatami są:
Rozdział 7. Dołączanie danych zewnętrznych
233
Rysunek 7.10. Ekran kreatora importu HTML umożliwiający nadanie nazw nagłówkom kolumn (nazw pól) w tabeli połączonej
Pliki z wierszami o stałej szerokości — w takich plikach każdy wiersz reprezentuje jeden wiersz w tabeli bazy danych. Każde pole w wierszu zajmuje dokładnie tyle samo znaków co odpowiadające mu pole w wierszu powyżej i poniżej wiersza bieżącego. Na przykład pole z nazwiskiem w pliku tekstowym z polami o stałej szerokości wierszy może zajmować 20 znaków, natomiast pole z numerem telefonu — 10 lub 15 znaków. Każde pole danych jest uzupełniane spacjami do prawej w celu wypełnienia szerokości przydzielonej dla pola. Typowy plik z wierszami o stałej szerokości otwarty w Notatniku systemu Windows pokazano na rysunku 7.11.
Rysunek 7.11. Typowy plik tekstowy o stałej szerokości pól
234
Część II Tabele Accessa
Pliki CSV — mają nieco bardziej skomplikowany format. Poszczególne pola są oddzielone od siebie przecinkami (,), a każde z pól zajmuje tyle miejsca, ile potrzeba, by pomieścić dane. Pomiędzy polami w pliku CSV jest niewiele miejsca. Zaletą plików CSV jest możliwość zapisania znacznie większej ilości danych w pliku o tym samym rozmiarze, ponieważ każde pole zajmuje tylko tyle miejsca na dysku, ile potrzeba. Pliki CSV trudno się czyta po otwarciu w Notatniku systemu Windows. Typowy plik CSV pokazano na rysunku 7.12.
Rysunek 7.12. Dane CSV są bardziej zwięzłe od plików tekstowych o stałej szerokości, ale mniej czytelne
Pliki tekstowe często wykorzystuje się jako pośredni mechanizm transmisji danych pomiędzy różnymi aplikacjami. Załóżmy, że w środowisku wykorzystywany jest przestarzały system zarządzania danymi, który jest niezgodny z formatami dołączanych lub importowanych danych w Accessie. Przy odrobinie szczęścia przestarzały system może być wyposażony w mechanizm eksportu danych do formatu pliku tekstowego o wierszach stałej szerokości lub formatu CSV. Dołączenie lub zaimportowanie danych tekstowych w formacie plików z wierszami stałej szerokości lub w formacie CSV może być najlepszą opcją umożliwiającą współdzielenie danych ze starym systemem. W najgorszym przypadku dołączenie lub zaimportowanie danych ze starego systemu powinno zająć znacznie mniej czasu od ponownego wprowadzenia wszystkich informacji z przestarzałego systemu do Accessa. W celu dołączenia pliku tekstowego Contacts_FixedWidth.txt lub Contacts_CSV.txt wykonaj następujące czynności: 1. Otwórz bazę danych Rozdział07.accdb i wybierz zakładkę DANE ZEWNĘTRZNE na wstążce.
Rozdział 7. Dołączanie danych zewnętrznych
235
2. Kliknij przycisk Plik tekstowy. Pojawi się okno dialogowe Pobieranie danych zewnętrznych — Plik tekstowy. 3. Upewnij się, że zaznaczona jest opcja Połącz ze źródłem danych, tworząc tabelę połączoną, a następnie kliknij przycisk Przeglądaj. Wyświetli się okno Otwieranie pliku. 4. Znajdź plik tekstowy (Contacts_FixedWidth.txt lub Contacts_CSV.txt) i kliknij przycisk Otwórz. 5. Kliknij przycisk OK, aby przejść do okna dialogowego Pobieranie danych zewnętrznych — Plik tekstowy. Wyświetli się okno dialogowe Kreator łączenia tekstu. Access zwykle dość dobrze rozpoznaje sposób rozdziału danych w plikach. Dołączanie danych tekstowych sprowadza się do kliknięcia przycisku Dalej i zweryfikowania, czy Access poprawnie zidentyfikował dane w pliku. W tym rozdziale zrezygnujemy z przedstawiania i omawiania wszystkich okien dialogowych Kreatora dołączania tekstu. Zachęcamy natomiast do samodzielnego dołączenia plików Contacts_CSV.txt i Contacts_FixedWidth.txt — oba znajdują się na płycie w plikach dołączonych do tej książki. Jak się przekonamy przy okazji dołączania tych plików, w zasadzie jedyną informacją wymaganą od użytkownika podczas tego procesu jest podanie nazwy dla każdego z pól zamieszczonych w pliku tekstowym. Przy odrobinie szczęścia w pierwszym wierszu pliku tekstowego są zapisane nazwy pól. W przeciwnym razie dołączenie pliku tekstowego będzie wymagało określenia nazwy każdego pola.
Praca z tabelami połączonymi Po dołączeniu zewnętrznej tabeli z innej bazy danych, można używać jej tak jak zwykłej tabeli Accessa. Można wykorzystywać ją w formularzach, raportach i kwerendach tak, jak rodzimą tabelę Accessa. Pracując z zewnętrznymi tabelami, można modyfikować wiele ich właściwości, na przykład ustawiać właściwości widoku i relacje, określać w kwerendach łącza między tabelami albo zmieniać nazwę tabeli. Przy zmianie nazwy połączonych tabel należy zwrócić uwagę na pewną kwestię. Zdefiniowanie innej nazwy dla tabeli wewnątrz Accessa nie zmienia nazwy pliku połączonego z aplikacją. Nazwa, jaką Access posługuje się w odniesieniu do połączonej tabeli, jest utrzymywana wewnątrz aplikacji Accessa i nie ma wpływu na połączoną fizyczną tabelę.
Ustawianie właściwości widoku Choć zewnętrznej tabeli można używać tak jak tabeli Accessa, nie da się zmieniać jej struktury (usuwać, dodawać lub przestawiać pól). Można jednak ustawić kilka właściwości pól w tabeli połączonej. Oto one:
format,
miejsca dziesiętne,
podpis,
236
Część II Tabele Accessa
maska wprowadzania,
kompresje Unicode,
tryb IME,
sterowanie wyświetlaniem.
Aby zmienić te właściwości, otwórz tabelę połączoną w widoku projektu. Access wyświetli wtedy ostrzeżenie, że nie można zmodyfikować projektu tabeli. Na rysunku 7.13 widoczne jest ostrzeżenie wyświetlane przy próbie otwarcia tabeli produktów w widoku projektu. Mimo ostrzeżenia można zmienić wymienione wcześniej właściwości.
Rysunek 7.13. Przy otwieraniu tabeli połączonej w widoku projektu pojawia się ostrzeżenie
Ustawianie relacji Access pozwala ustawić trwałe relacje na poziomie tabeli między zewnętrznymi tabelami, które nie zostały utworzone przez Accessa, a tabelami Accessa. Służy do tego narzędzie Relacje. Access nie umożliwia jednak wymuszenia więzów integralności między tabelami połączonymi a lokalnymi. W Accessie można tworzyć formularze i raporty na podstawie relacji określonych w narzędziu Relacje. Możesz np. utworzyć instrukcję SQL-a zapisywaną we właściwości Źródło rekordu formularza lub raportu.
Przy dołączaniu zewnętrznych tabel Accessa zachowywane są relacje, które mogą występować pomiędzy zewnętrznymi tabelami. W związku z tym w przypadku dołączania bazy zaplecza relacje w niej zdefiniowane są rozpoznawane i uwzględniane przez bazę frontonu. Jest to korzystne, ponieważ zdefiniowane reguły są wymuszane niezależnie od tego, w ilu frontonach używane są dane tabele. Szczegółowe omówienie relacji znajdziesz w rozdziale 4.
Optymalizowanie tabel połączonych Kiedy Access pracuje z tabelami połączonymi, musi pobierać rekordy z innego pliku. Ten proces zajmuje czas, zwłaszcza jeśli tabela znajduje się w sieci lub SQL-owej bazie danych. W przypadku korzystania z danych zewnętrznych można zoptymalizować wydajność, stosując się do poniższych wskazówek:
Unikaj używania funkcji w kryteriach kwerendy. Dotyczy to zwłaszcza funkcji sumujących, takich jak DTotal lub DCount, które automatycznie pobierają wszystkie rekordy z tabeli połączonej, a następnie wykonują kwerendę.
Rozdział 7. Dołączanie danych zewnętrznych
237
Ogranicz liczbę wyświetlanych rekordów zewnętrznych. Utwórz kwerendę z kryterium, które ogranicza liczbę rekordów z tabeli zewnętrznej. Kwerendy tej można używać w innych kwerendach, formularzach lub raportach.
Unikaj nadmiernego poruszania się po arkuszu danych. Oglądaj na arkuszu tylko te dane, których potrzebujesz. Unikaj przewijania danych w górę i w dół i nie skacz do pierwszego albo ostatniego rekordu w bardzo dużych tabelach (wyjątkiem jest dodawanie rekordów do tabeli zewnętrznej).
Jeśli dodajesz rekordy do tabel zewnętrznych, utwórz przeznaczony do tego formularz i ustaw jego właściwość Wprowadzanie danych na Tak. Dzięki temu formularz będzie zaczynał się od pustego rekordu za każdym razem, kiedy zostanie otwarty. Formularze do wprowadzania danych nie są wstępnie zapełniane danymi z powiązanej tabeli. Wykorzystanie specjalnego formularza do wprowadzania danych jest znacznie wydajniejsze od stosowania zwykłego formularza, zapełniania go danymi z połączonego źródła i przechodzenia na koniec danych w celu dodania nowego rekordu.
Usuwanie odwołania do tabeli połączonej Usunięcie tabeli połączonej z listy obiektów to kwestia trzech prostych czynności: 1. Na liście obiektów zaznacz tabelę połączoną, którą chcesz usunąć. 2. Naciśnij klawisz Delete albo kliknij prawym przyciskiem myszy tabelę połączoną i wybierz polecenie Usuń z menu podręcznego. 3. Kliknij przycisk OK w oknie dialogowym Accessa, aby usunąć plik. Usunięcie zewnętrznej tabeli usuwa tylko jej nazwę z listy obiektów bazy danych. Dane nie są usuwane ze źródłowej lokalizacji.
Przeglądanie lub zmienianie informacji o tabelach połączonych W przypadku przeniesienia, zmiany nazwy lub modyfikacji tabel bądź indeksów powiązanych z tabelą połączoną należy skorzystać z Menedżera tabel połączonych w celu zaktualizowania łączy. W innym przypadku Access nie będzie w stanie znaleźć danych, do których odwołuje się plik. 1. Kliknij zakładkę NARZĘDZIA BAZY DANYCH, a następnie przycisk Menedżer tabel połączonych. Wyświetli się okno dialogowe Menedżer tabel połączonych (zobacz rysunek 7.14), które umożliwia wyszukiwanie plików danych powiązanych z tabelami połączonymi w bazie danych. 2. Zaznacz na nim pole wyboru obok tabeli połączonej, a następnie kliknij OK. 3. Należy odszukać brakujący plik i odtworzyć łącze. Jeśli do wszystkich plików prowadzą prawidłowe łącza, wystarczy kliknąć OK. Spowoduje to, że Access zweryfikuje wszystkie łącza prowadzące do wszystkich zaznaczonych tabel.
238
Część II Tabele Accessa
Rysunek 7.14. Menedżer tabel połączonych umożliwia odszukanie tabel zewnętrznych, które zostały przeniesione
4. Jeśli wiemy, że wszystkie połączone źródła danych przeniesiono, należy zaznaczyć pole wyboru Zawsze monituj o nową lokalizację i kliknąć przycisk OK. Po zaznaczeniu tej opcji Access będzie monitował o nową lokalizację i odtwarzał łącza do wszystkich tabel w trybie wsadowym. Operacja ta przebiega znacznie szybciej w porównaniu z łączeniem tabel pojedynczo. Jeśli instalacja Accessa nie zawiera Menedżera tabel połączonych, Access automatycznie wyświetla prośbę o włożenie do napędu oryginalnej płyty instalacyjnej z pakietem Office, tak by można było zainstalować ten kreator. Taka sytuacja może się zdarzyć, jeśli w czasie pierwotnej instalacji nie zaznaczono opcji instalacji dodatkowych kreatorów.
Odświeżanie zawartości tabel połączonych Access automatycznie synchronizuje tabele połączone ze źródłowymi danymi. Użytkownik nie musi podejmować żadnych działań, aby zaktualizować dane. Gdy tabela połączona jest otwarta w widoku arkusza danych lub używana w inny sposób, Access próbuje ograniczyć dostęp do źródłowych danych w sposób zależny od rodzaju danych. Blokuje na przykład używane połączone pliki tekstowe, aby nie można było otworzyć ich w edytorze tekstu. W celu przyjrzenia się automatycznemu aktualizowaniu dołączonych danych utwórz tabelę połączoną z plikiem tekstowym, a następnie spróbuj zmodyfikować ten plik. Wykonaj następujące czynności: 1. Kliknij przycisk Plik tekstowy w grupie Importowanie i łączenie w zakładce DANE ZEWNĘTRZNE na wstążce. 2. Dołącz plik tekstowy ContactsFixed.txt (jest to plik tekstowy o stałej szerokości pól). Plik ten jest poprawnie sformatowany, dzięki czemu Access potrafi poprawnie wykryć początki pól. W tym ćwiczeniu nazwy pól nie mają znaczenia. 3. Otwórz tabelę połączoną ContactsFixed. Zauważ, że zawiera ona 12 rekordów. Jeśli spróbujesz otworzyć plik ContactsFixed.txt w edytorze tekstu, Windows poinformuje, że plik jest używany przez inny proces i że nie można go otworzyć.
Rozdział 7. Dołączanie danych zewnętrznych
239
4. Zamknij tabelę ContactsFixed. 5. Dodaj nowy wiersz do pliku tekstowego w wybranym prostym edytorze tekstu (np. w Notatniku). Nie używaj Worda, ponieważ może zapisać dane w formacie innym niż zwykły tekst. Nowy plik ContactsFixed.txt przedstawiono na rysunku 7.15.
Rysunek 7.15. Tabele połączone są synchronizowane automatycznie
6. Zapisz plik i zamknij edytor tekstu. 7. Otwórz w Accessie tabelę połączoną ContactsFixed. W tabeli znajdować się teraz będzie trzynasty wiersz.
Dzielenie baz danych dla dostępu sieciowego Jest wiele dobrych powodów dołączania tabel z różnych baz danych Accessa. Jeden z najlepszych i najważniejszych związany jest z dzieleniem bazy danych. Proces ten polega na utworzeniu dwóch plików .accdb na podstawie jednego. Jeden z tych plików, nazywany zapleczem (ang. back-end), zawiera tylko tabele. Drugi, tak zwany fronton (ang. front-end), obejmuje kwerendy, makra, kod i elementy interfejsu użytkownika, np. formularze i raporty. Fronton zawiera też łącza do wszystkich tabel używanych na zapleczu.
Zalety dzielenia baz danych Przynajmniej jeden bardzo dobry powód przemawia za tym, by zainteresować się dzieleniem baz danych Accessa. Wprawdzie możemy udostępnić pojedynczą kopię pliku .accdb lub .mdb w komputerze współużytkowanym w sieci, lecz takie rozwiązanie znacznie pogarsza wydajność. Korzystanie z bazy danych Accessa przechowywanej w komputerze zdalnym wiąże się nie tylko z prostym przenoszeniem danych z komputera zdalnego do lokalnego. Wszystkie definicje formularzy, menu i wstążek muszą zostać przeniesione do komputera lokalnego, by system Windows mógł odtworzyć interfejs użytkownika na ekranie. System Windows w komputerze lokalnym musi przechwytywać i przesyłać do zdalnego komputera wszystkie
240
Część II Tabele Accessa
zdarzenia klawiatury i myszy, aby w odpowiedzi na te zdarzenia mógł zostać wykonany właściwy kod. Poza tym pojedyncza kopia Accessa w zdalnym komputerze musi obsłużyć wszystkie żądania danych, nawet najbardziej trywialne lub wymagające. Skutki wszystkich tych akcji pogarszają się wraz ze wzrostem liczby użytkowników pracujących z tą samą zdalną kopią bazy danych. Na szczęście większość z tych problemów znika, gdy baza danych jest podzielona na składniki frontonu i zaplecza. Lokalny system Windows obsługuje interfejs użytkownika, wykorzystując informacje zawarte we frontonie. Cały kod jest wykonywany w komputerze osobistym użytkownika, a nie w zdalnym serwerze. Oprócz tego lokalna kopia Accessa może obsługiwać wszystkie żądania danych przechowywanych lokalnie, a jedynie żądania danych przechowywanych zdalnie są przekazywane do bazy danych zaplecza. Zanim zajmiemy się szczegółami, rozważmy kilka problemów związanych z bazami danych przechowywanymi w pojedynczych plikach. Zacznijmy od tego, że w przeciwieństwie do innych systemów konstruowania aplikacji wszystkie obiekty aplikacji bazodanowej Accessa są przechowywane w pojedynczym pliku — dobrze nam znanym .accdb lub .mdb, z którym mamy do czynienia na co dzień. Inne bazy danych, takie jak FoxPro for Windows, dla każdej aplikacji utrzymują szereg różnych plików, zwykle po jednym pliku na obiekt (formularz, tabela i tak dalej). Wprawdzie konieczność pracy z większą liczbą plików komplikuje nieco rozwój i utrzymanie bazy danych, lecz aktualizacja pojedynczego formularza lub kwerendy wymaga jedynie zastąpienia odpowiedniego pliku nową wersją. Aktualizowanie obiektów baz danych Accessa jest nieco bardziej skomplikowane. Jak już zapewne zauważyłeś, zastąpienie formularza lub kwerendy w bazie danych Accessa, z której korzysta wielu użytkowników, może stanowić poważny problem. Zastąpienie formularza lub innego obiektu bazy danych często wymaga całych godzin pracy poświęconych na importowanie obiektu do każdej kopii bazy danych indywidualnego użytkownika. Drugim problemem jest ruch sieciowy nieunikniony w przypadku baz danych Accessa zawartych w pojedynczych plikach. Rysunek 7.16 przedstawia ten problem w przypadku typowej metody współużytkowania bazy danych Accessa. Komputer w lewym górnym rogu jest serwerem plików, w którym znajduje się plik bazy danych. Załóżmy na moment, że cała baza danych mieści się w jednym pliku .accdb w serwerze plików i że została udostępniona na potrzeby wspólnego dostępu do danych. Każda ze stacji roboczych na rysunku 7.16 ma zainstalowaną pełną kopię Accessa (lub środowisko runtime Accessa). Co się stanie, gdy użytkownik stacji roboczej C otworzy bazę danych? Access zainstalowany w tym komputerze musi znaleźć plik .accdb w serwerze plików, otworzyć go i uruchomić aplikację. Oznacza to, że wszelkie formularze powitalne, kwerendy i inne czynności związane z uruchamianiem aplikacji muszą odbyć się przez sieć, zanim użytkownik będzie mógł rozpocząć pracę z bazą danych. Za każdym razem, gdy otwierany jest formularz lub wykonywana kwerenda, niezbędne informacje muszą zostać przesłane siecią, co spowalnia działanie aplikacji. Na rysunku 7.16 obciążenie sieci jest oznaczone linią przerywaną.
Rozdział 7. Dołączanie danych zewnętrznych
241
Rysunek 7.16. Baza danych przechowywana w serwerze może generować duży ruch w sieci
Sytuacja na rysunku 7.16 staje się jeszcze gorsza, gdy więcej niż jeden użytkownik korzysta z tej samej bazy danych. W takim przypadku ruch w sieci jest zwiększany o kwerendy, otwieranie formularzy i inne operacje wykonywane przez kopię Accessa każdego z użytkowników. Wyobraźmy sobie, że linia przerywana staje się grubsza z każdą operacją wykonywaną przez sieć. Model z podzieloną bazą danych został przedstawiony na rysunku 7.17. Proszę zwrócić uwagę, że baza danych zaplecza mieści się w serwerze, natomiast w każdej stacji roboczej jest zainstalowana kopia frontonu. Każda z tych kopii zawiera łącza do tabel przechowywanych w pliku .accdb zaplecza. Frontonowe bazy danych zawierają też formularze, raporty, kwerendy i inne składniki interfejsu użytkownika aplikacji. Rysunek 7.17. Podział i rozproszenie bazy danych pozwala zredukować ruch w sieci
W rozwiązaniu z rysunku 21.3 ruch sieciowy został zredukowany, ponieważ przez sieć przesyłane są tylko informacje o łączach i dane zwracane przez kwerendy. Użytkownik korzystający z aplikacji bazy danych używa formularzy, kwerend, raportów, kodu i makr
242
Część II Tabele Accessa
przechowywanych w lokalnym pliku .accdb we frontonie. Ze stacji roboczej (frontonu) korzysta tylko jeden użytkownik, więc czas odpowiedzi lokalnego systemu jest znacznie krótszy, ponieważ lokalna kopia Accessa może natychmiast otworzyć bazę danych i zacząć operacje uruchamiania aplikacji. Ruch w sieci rośnie tylko podczas wykonywania faktycznych kwerend. Drugą ważną zaletą struktury podzielonej bazy danych jest to, że aktualizowanie formularzy, raportów i innych komponentów aplikacji wymaga jedynie zastąpienia zewnętrznej bazy danych w komputerze każdego z użytkowników i ponownego nawiązania połączeń z tabelami w bazie wewnętrznej. Projekt z rysunku 7.17 pozwala na dostosowywanie frontonów do potrzeb indywidualnych użytkowników poszczególnych stacji roboczych. Na przykład menedżer używający stacji roboczej A może potrzebować dostępu do danych pracowników, niedostępnych dla użytkowników stacji roboczych B i C. W takim przypadku zewnętrzna baza danych w stacji roboczej A będzie zawierać formularze, kwerendy i inne obiekty bazy danych niezbędne do wyświetlania danych pracowników.
Jak podzielić obiekty? Lokalny plik .accdb powinien zawierać wszystkie obiekty interfejsu użytkownika, w tym formularze, raporty, kwerendy, makra i moduły. Składowanie tych elementów interfejsu użytkownika w komputerze lokalnym znacznie poprawia wydajność. Nie ma powodów, by przesyłać przez sieć formularze, kwerendy czy też raporty. Obiektami tymi można o wiele łatwiej manipulować, gdy znajdują się w komputerze lokalnym. Wszystkie współużytkowane tabele powinny być przechowywane w wewnętrznej bazie danych w serwerze. Ta baza danych jest otwarta w trybie udostępnionym, przez co wszystkie jej obiekty są dostępne dla wielu użytkowników. Tabele w serwerowej bazie danych są powiązane z frontonowym plikiem .accdb w komputerach osobistych użytkowników (jednoczesne łączenie tej samej tabeli z większą liczbą baz danych nie sprawia problemu). Oczywiście gdy więcej niż jedna osoba używa danych z tabeli, istnieje możliwość, że kilku użytkowników będzie modyfikować ten sam rekord. Silnik bazodanowy Accessa rozwiązuje ten problem, blokując rekord edytowany przez użytkownika. Konflikt blokad występuje, gdy więcej niż jeden użytkownik próbuje zaktualizować ten sam rekord. Tylko jeden użytkownik ma pełny dostęp do rekordu — reszta użytkowników będzie zablokowana lub ich zmiany zostaną wstrzymane, dopóki bieżący właściciel rekordu nie ukończy wprowadzania zmian.
Korzystanie z dodatku Rozdzielacz bazy danych Rozdzielacz bazy danych pomaga dzielić aplikację na bazy danych frontonu i zaplecza. Kreator ten pozwala dowolnie budować i testować bazę danych, po czym automatycznie przygotowuje aplikację do wielodostępu. W ramach eksperymentu spróbujmy podzielić bazę danych firmy Northwind Traders na pliki .accdb frontonu i zaplecza. Aby uruchomić rozdzielacz bazy danych, należy na wstążce wybrać zakładkę NARZĘDZIA BAZY DANYCH, a następnie w grupie Przenoszenie danych kliknąć Baza danych programu Access. Początkowy ekran kreatora (zobacz rysunek 7.18) objaśnia działanie narzędzia i sugeruje, aby przed kontynuacją działania wykonać kopię zapasową bazy danych.
Rozdział 7. Dołączanie danych zewnętrznych
243
Rysunek 7.18. Rozdzielacz bazy danych jest bardzo prostym kreatorem
Jedyną dodatkową informacją, której wymaga Rozdzielacz bazy danych, jest określenie miejsca, w którym ma zapisać bazę danych zaplecza. Rysunek 7.19 przedstawia znajomo wyglądające okno dialogowe w stylu Eksploratora Windows, pozwalające wskazać lokalizację pliku .accdb zaplecza. Domyślnie baza danych zaplecza ma taką samą nazwę jak oryginał, z dodatkowym przyrostkiem _wb (np. MyDB_wb.accdb).
Rysunek 7.19. W oknie dialogowym Utwórz wewnętrzną bazę danych należy wskazać ostateczną lokalizację bazy danych zaplecza Dostęp do lokalizacji sieciowej można uzyskać za pomocą ścieżki UNC (ang. Universal Naming Convention) lub przy użyciu zmapowanego napędu. Ścieżki UNC rozpoczynają się od dwóch lewych ukośników, po których następuje nazwa serwera i ścieżka do lokalizacji sieciowej. Oto przykładowa ścieżka UNC: \\Serwer\UdziałSieciowy\Katalog\. W zmapowanym napędzie ścieżkom UNC przypisywane są litery (np. S:). Zmapowany napęd jest niepowtarzalny dla każdego komputera, dlatego nie ma gwarancji, że takie
244
Część II Tabele Accessa napędy będą identyczne na różnych komputerach. W trakcie tworzenia bazy danych zaplecza zawsze stosuj ścieżki UNC do dołączania tabel, ponieważ są one takie same dla wszystkich komputerów z danej sieci. Aby zastosować ścieżkę UNC, przejdź do lokalizacji sieciowej za pomocą skrótu Sieć (w starszych wersjach systemu Windows nosił on nazwę Moje miejsca sieciowe). Plik należy zapisać dokładnie tam, gdzie będzie mieścić się w środowisku produkcyjnym. Frontonowa baza danych zawiera łącza do bazy danych zaplecza, a łącza obejmują ścieżkę do pliku, więc gdybyśmy po użyciu rozdzielacza przenieśli plik zaplecza, łącza trzeba by było odświeżyć.
Po kliknięciu przycisku Podziel (zobacz rysunek 7.19) narzędzie tworzy bazę danych zaplecza, eksportuje do niej wszystkie tabele, usuwa tabele z lokalnej bazy danych i tworzy łącza do tabel zaplecza. Inaczej mówiąc, wykonuje dokładnie te same czynności, które musielibyśmy w przeciwnym razie wykonać ręcznie. Proces może potrwać dość długo, zwłaszcza w przypadku dużych baz danych. Access musi utworzyć nową bazę danych, przenieść do niej tabele i utworzyć łącza do oryginalnej bazy danych, więc proces podziału może wymagać więcej niż kilka minut. Nie ma się czym przejmować, jeśli potrwa to dłużej, niż się spodziewaliśmy — zdecydowanie opłaci się poczekać! Warto też pamiętać, że rozdzielacz bazy danych to stosunkowo proste narzędzie, które ignoruje kwestie systemowe (np. ilość pamięci dostępnej na dysku). Sprawdź, czy na docelowej maszynie dostępne jest miejsce na bazę danych zaplecza.
Rysunek 7.20 przedstawia okienko nawigacji Accessa po podzieleniu bazy danych Northwind Traders. Baza danych zaplecza zawiera tylko tabele wyeksportowane z pliku Northwind.accdb. Warto zwrócić uwagę, że ikony powiązane z wszystkimi tabelami z Northwind.accdb zmieniły się, co wskazuje na to, że tabele te zostały przeniesione do bazy danych zaplecza. Zanim udostępnisz fronton użytkownikom, musisz zaimportować z bazy zaplecza wszystkie tabele lokalne. Rysunek 7.20. Rozdzielacz bazy danych tworzy łącza do wszystkich tabel w bazie danych
Część III
Kwerendy Accessa W tej części:
Rozdział 8. Pobieranie danych za pomocą kwerend
Rozdział 9. Stosowanie operatorów i wyrażeń
Rozdział 10. Poza kwerendy pobierające
Rozdziały z części III to wprowadzenie do wybranych podstawowych narzędzi i technik analitycznych dostępnych w Accessie. Dzięki nim zdobędziesz solidne podstawy z zakresu tworzenia kwerend Accessa. Kwerendy pozwalają pobierać dane z różnych źródeł i przedstawiać połączone informacje w przydatnych widokach. Umożliwiają przekształcenie surowych danych z tabel Accessa na sensowne informacje analityczne. Część ta rozpoczyna się od rozdziału 8., w którym opisaliśmy konstruktor kwerend i techniki przeprowadzania prostych analiz tabel Accessa. W rozdziale 9. przedstawiamy różne operatory i wyrażenia, które pozwalają wzbogacić analizy danych w Accessie. Rozdział 10. zawiera zaawansowane zagadnienia dotyczące kwerend. Dowiesz się z niego, jak wyjść poza proste pobieranie danych z tabel. Zobaczysz, jak agregować dane w kwerendach, uruchamiać kwerendy funkcyjne i tworzyć dające dużo możliwości kwerendy krzyżowe.
246
Część III Kwerendy Accessa
Rozdział 8.
Pobieranie danych za pomocą kwerend W tym rozdziale:
Czym są kwerendy i do jakich zadań mogą służyć?
Tworzenie kwerendy
Definiowanie pól w kwerendzie
Wyświetlanie wyników kwerendy
Dodawanie i usuwanie kwerend z projektu kwerendy
Sortowanie wyników kwerendy
Filtrowanie rekordów zwracanych przez kwerendę
Drukowanie rekordów zwracanych przez kwerendę
Zapisywanie kwerendy
Uwzględnianie w kwerendzie więcej niż jednej tabeli
Dodawanie, usuwanie i przenoszenie tabel w kwerendzie
Łączenie tabel w projekcie kwerendy
Opcje łączenia tabel w kwerendzie
Kwerendy są istotną częścią każdej aplikacji bazy danych. Są to narzędzia, które umożliwiają użytkownikom uzyskanie danych z wielu tabel, łączenie ich na różne użyteczne sposoby oraz prezentowanie ich w formie arkusza danych, w formularzu lub drukowanym raporcie. Być może słyszałeś stary frazes, że kwerendy przekształcają dane na informacje. Do pewnego stopnia to zdanie jest prawdziwe (dlatego właśnie jest frazesem). Dane zapisane w tabelach nie są szczególnie przydatne, ponieważ dane zwykle nie występują w jakimś konkretnym porządku. Ponadto w prawidłowo znormalizowanej bazie danych ważne
248
Część III Kwerendy Accessa
informacje są rozproszone w wielu różnych tabelach. Kwerendy są mechanizmem, który łączy ze sobą różne źródła danych i prezentuje połączone informacje w taki sposób, że użytkownicy mogą rozpocząć pracę z danymi. Wyjściową bazę danych do tego rodziału (Rozdział08.accdb) możesz pobrać z witryny poświęconej książce.
Wprowadzenie w tematykę kwerend Głównym zastosowaniem bazy danych jest przechowywanie informacji i umożliwienie ich pobierania. Dane mogą być pobierane natychmiast po ich wprowadzeniu albo kilka dni, tygodni lub nawet lat później. Oczywiście pobieranie informacji z tabel bazy danych wymaga posiadania wiedzy na temat tego, jak baza jest zbudowana. Na przykład raporty można ręcznie umieszczać w szafkach, posortowane według roku i numeru porządkowego wskazującego na datę utworzenia. Aby znaleźć określony raport, trzeba znać rok jego powstania i numer. W dobrze prowadzonych biurach powinien istnieć spis ułatwiający odszukanie określonego raportu. Spis mógłby zawierać wszystkie raporty posortowane alfabetycznie według typu i na przykład według daty. Byłby bardzo przydatny, ale znając tylko temat raportu i przybliżoną datę jego powstania, i tak trzeba by w celu zlokalizowania raportu przeszukać cały dokument. W przeciwieństwie do fizycznych kartotek komputerowe bazy danych takie jak Microsoft Access umożliwiają łatwe uzyskiwanie informacji spełniających dowolnie zdefiniowane kryteria. Na tym polega prawdziwa wartość baz danych — na możliwości przeglądania i analizowania danych w dowolny sposób. Kwerendy (zwane też zapytaniami) służą do zadawania bazie danych pytań dotyczących przechowywanych w niej danych. W większości kwerendy wykorzystuje się jako źródło danych dla formularzy, raportów oraz graficznych wykresów reprezentujących dane zapisane w bazie.
Czym są kwerendy? Zacznijmy od podstaw. Słowo kwerenda pochodzi od łacińskiego quaerere, co oznacza „pytać, wyszukiwać”. Kwerenda w programie Microsoft Access jest pytaniem dotyczącym informacji zapisanych w tabelach Accessa. Tworzy się ją za pomocą odpowiednich narzędzi dostępnych w Accessie, a następnie zapisuje jako oddzielny obiekt w bazie danych. Kwerenda może być prosta i pobierać dane umieszczone w pojedynczej tabeli lub może mieć formę złożonego zapytania dotyczącego informacji przechowywanych w kilku tabelach. Używając kwerend w ten sposób, można na przykład zapytać bazę o ciężarówki sprzedane w 2012 roku. Po zadaniu pytania Access zwraca jedynie żądane informacje.
Rozdział 8. Pobieranie danych za pomocą kwerend
249
Co można robić za pomocą kwerend? Kwerendy są bardzo elastyczne. Umożliwiają przeglądanie danych w praktycznie każdy sposób, jaki można sobie wyobrazić. Większość systemów baz danych ciągle się rozwija i zmienia. Bardzo często zmianie ulega nawet pierwotne przeznaczenie, dla którego powstał system. Oto próbka tego, co można osiągnąć za pomocą kwerend Accessa:
Wybieranie tabel. Można pobierać informacje zarówno z jednej tabeli, jak i z kilku tabel powiązanych ze sobą za pomocą określonych wspólnych danych. Przypuśćmy, że chcemy zobaczyć nazwiska klientów wraz z produktami zakupionymi przez klientów poszczególnych typów. W przypadku skorzystania z wielu tabel Access łączy dane w jeden zestaw rekordów.
Wybieranie pól. Można ustalić, które pola z każdej tabeli mają się pojawić w zbiorze wynikowym. Na przykład spośród wszystkich pól tabel tblCustomers i tblSales można wybrać tylko nazwiska, kody pocztowe, daty sprzedaży i numery faktur.
Definiowanie kryteriów. Wybieranie rekordów odbywa się na podstawie kryteriów. Na przykład możemy zażądać wyświetlenia tylko tych rekordów, które dotyczą określonej kategorii produktów.
Sortowanie rekordów. Rekordy można sortować w określonym porządku. Na przykład klientów można posortować według nazwisk i imion.
Wykonywanie obliczeń. Kwerendy można wykorzystać do wykonywania obliczeń, na przykład średniej lub sumy. Można też zliczać rekordy spełniające określone kryteria.
Tworzenie tabel. Można utworzyć nową tabelę na podstawie danych zwracanych przez zapytanie.
Wyświetlanie danych zwróconych przez kwerendy w formularzach i raportach. Zestaw rekordów tworzony na podstawie kwerendy może zawierać pola i dane nadające się do wykorzystania w raporcie bądź formularzu. Tworzenie raportu lub formularza opartego na kwerendzie oznacza, że przy każdym drukowaniu raportu czy otwarciu formularza kwerenda najpierw pobiera z tabel najbardziej aktualne informacje.
Używanie kwerend jako źródeł danych dla innych kwerend (podzapytań). Można tworzyć kwerendy, które bazują na zbiorze rekordów zwróconych przez inne kwerendy. Jest to bardzo wygodny sposób wykonywania kwerend ad hoc, gdzie może występować konieczność wielokrotnego wprowadzania niewielkich zmian w kryteriach. W takim przypadku druga kwerenda służy do odfiltrowania wyników pierwszej kwerendy.
Wprowadzanie zmian w tabelach. Kwerendy funkcyjne modyfikują wiele wierszy w różnych tabelach za pomocą pojedynczej operacji. W związku z tym kwerendy funkcyjne są często wykorzystywane do konserwowania danych, na przykład archiwizowania danych historycznych lub usuwania danych, które się zdezaktualizowały.
250
Część III Kwerendy Accessa
Co zwracają kwerendy? Access łączy rekordy zwracane przez kwerendę, a następnie prezentuje je w arkuszu danych. Zbiór wyników zwracany przez kwerendę jest powszechnie nazywany zestawem rekordów (ang. recordset). W rzeczywistości jest to dynamiczny (wirtualny) zbiór rekordów. Zbiór rekordów zwracany przez kwerendę nie jest zapisywany w bazie danych, chyba że poinstruujemy Accessa, aby utworzył tabelę na podstawie zwracanych rekordów. Więcej informacji na temat arkuszy danych można znaleźć w rozdziale 5.
Gdy zapisujemy kwerendę, zapisywana jest tylko jej struktura, a nie zwracane przez nią rekordy. Oznacza to, że zachowywany jest tylko kod w SQL-u użyty do utworzenia kwerendy. Omówienie składni SQL-a używanej w kwerendach znajdziesz w rozdziale 14.
Niezapisywanie zestawu rekordów w fizycznej tabeli ma następujące zalety:
Potrzebna jest mniejsza ilość miejsca do przechowywania danych (zwykle przestrzeni na twardym dysku).
Kwerenda wykorzystuje zawsze aktualną wersję rekordów.
Przy każdym uruchomieniu kwerenda przegląda używane tabele oraz tworzy od nowa wynikowy zbiór rekordów. Ponieważ zawartości zbiorów wynikowych nie są przechowywane, kwerenda automatycznie odzwierciedla wszystkie zmiany dokonane w tabelach bazowych od czasu ostatniego jej uruchomienia — nawet w wielodostępnych środowiskach czasu rzeczywistego. W zależności od potrzeb zestaw rekordów kwerendy może być wyświetlany w arkuszu danych albo w formularzu lub raporcie. Kiedy formularz lub raport bazuje na kwerendzie, zestaw rekordów kwerendy jest tworzony i wiązany z formularzem lub raportem przy każdym ich otwieraniu. Zestaw rekordów kwerendy można też wykorzystać w makrach i procedurach w języku VBA przy wykonywaniu różnych zautomatyzowanych zadań.
Tworzenie kwerendy Po utworzeniu tabel i umieszczeniu w nich danych można rozpocząć pracę z kwerendami. Aby utworzyć kwerendę, należy wybrać grupę Tworzenie na wstążce Accessa, a następnie kliknąć przycisk Projekt kwerendy w grupie Inne. W efekcie Access otworzy okno projektu kwerendy widoczne na rysunku 8.1. Na rysunku 8.1 pokazano dwa okna. To pod spodem to okno widoku projektu kwerendy. Na pierwszym planie wyświetla się okno dialogowe Pokazywanie tabeli. Okno Pokazywanie tabeli jest modalne, co oznacza, że aby przejść do pracy nad kwerendą, trzeba
Rozdział 8. Pobieranie danych za pomocą kwerend
251
Rysunek 8.1. Okno dialogowe Pokazywanie tabeli oraz widok projektu kwerendy
najpierw wykonać w nim jakieś czynności. W naszym przypadku trzeba dodać do kwerendy tabele, na których będzie ona wykonywać operacje. Na rysunku zaznaczona i gotowa do dodania jest tabela tblProducts. Okno dialogowe Pokazywanie tabeli pokazane na rysunku 8.1 wyświetla wszystkie tabele i kwerendy istniejące w bazie danych. Aby dodać do struktury kwerendy tabelę tblProducts, należy dwukrotnie kliknąć jej nazwę albo wybrać tabelę tblProducts na liście i kliknąć przycisk Dodaj. Po dodaniu tabeli tblProducts można zamknąć okno dialogowe Pokazywanie tabeli. Tabelę tblProducts dodaną do kwerendy pokazano na rysunku 8.2. Rysunek 8.2. Okno projektu kwerendy po dodaniu tabeli tblProducts
Aby dołączyć do kwerendy dodatkowe tabele, należy kliknąć prawym przyciskiem myszy w dowolnym miejscu górnej części okna widoku projektu kwerendy, a następnie wybrać z menu podręcznego polecenie Pokaż tabelę. Można też przeciągnąć tabele z okienka nawigacji do górnej części okna projektu kwerendy. Przycisk Pokaż tabelę jest także dostępny na wstążce, w zakładce PROJEKTOWANIE.
252
Część III Kwerendy Accessa
Usunięcie tabeli z projektu kwerendy jest łatwe. Wystarczy kliknąć ją prawym przyciskiem myszy w widoku projektu kwerendy, a następnie wybrać z menu podręcznego polecenie Usuń tabelę. Okno kwerendy ma trzy główne widoki:
Widok projektu — tworzymy w nim kwerendy.
Widok arkusza danych — wyświetla rekordy zwracane przez kwerendę.
SQL — wyświetla instrukcję SQL, która definiuje kwerendę.
Okno widoku projektu kwerendy składa się z dwóch części:
Obszar wprowadzania tabel i kwerend (w górnej części) — w tym obszarze dodajemy do projektu kwerendy tabele, kwerendy oraz listy pól. Dostępne jest odrębne okno z listą pól dla każdego dodawanego obiektu. Okno z listą pól zawiera nazwy wszystkich pól z wybranej tabeli bądź kwerendy. Rozmiar okna z listą pól można zmieniać, klikając którąś z jego krawędzi i przeciągając ją w odpowiednią stronę. Czasami trzeba zmienić rozmiar okna z listą pól po to, aby były widoczne wszystkie pola tabeli.
Siatki QBE (ang. Query by Example — zapytanie przez przykład) (w dolnej części) — zawierają nazwy pól wykorzystywanych w kwerendzie oraz kryteria stosowane do wybierania rekordów. Każda kolumna siatki QBE zawiera informacje na temat jednego pola z tabeli lub kwerendy znajdującej się w górnym obszarze.
Poszczególne obszary (panele) okna są od siebie oddzielone poziomym paskiem mogącym służyć do zmiany ich rozmiaru (zobacz rysunek 8.2). Aby zmienić rozmiar górnego lub dolnego panelu, wystarczy przeciągnąć pasek w górę lub w dół za pomocą myszy. Między górnym a dolnym obszarem można się przełączać, klikając wybrany z nich lub naciskając klawisz F6. Każdy z obszarów ma pionowy i poziomy pasek przewijania, które ułatwiają poruszanie się wewnątrz obszaru. Kwerendę tworzy się poprzez przeciąganie pól z górnego do siatki QBE. Na rysunku 8.2 pokazano pustą siatkę QBE w dolnej części widoku projektu kwerendy. Siatka QBE składa się z sześciu wierszy oznaczonych następującymi etykietami:
Pole — w tym wierszu wpisuje się lub dodaje nazwy pól.
Tabela — w tym wierszu wyświetla się nazwa tabeli, z której pochodzi pole. Przydaje się on w kwerendach wykorzystujących wiele tabel.
Sortuj — ten wiersz umożliwia zdefiniowanie sposobu sortowania dla kwerendy.
Pokaż — wiersz ten decyduje o tym, czy określone pole ma się wyświetlić w zestawie rekordów zwracanych przez kwerendę.
Kryteria — jest to wiersz zawierający kryteria filtrowania zwracanych rekordów.
lub — ten wiersz jest pierwszym z grupy wierszy, za pomocą których można zdefiniować złożone kryteria kwerendy
Rozdział 8. Pobieranie danych za pomocą kwerend
253
Więcej informacji na temat tych wierszy znajduje się w opisie procesu tworzenia kwerend w dalszej części tego rozdziału. Wstążka Projektowanie kwerendy (pokazana na rysunku 8.3) zawiera wiele różnych przycisków służących do tworzenia kwerend i wykonywania operacji na kwerendach. Przyciski te zostały opisane przy okazji ich używania w różnych rozdziałach książki. A oto najważniejsze przyciski:
Widok — służy do przełączania między widokami arkusza danych i projektu kwerendy. Rozwijana lista Widok umożliwia także wyświetlanie instrukcji w SQL-u, na której bazuje kwerenda.
Uruchom — uruchamia kwerendę. Dla kwerend wybierających wyświetla arkusz danych — pełni taką samą funkcję jak wybranie polecenia Arkusz danych z rozwijanej listy Widok. W przypadku kwerend funkcyjnych powoduje wykonanie serii operacji określonych w kwerendzie (dołączanie rekordów, tworzenie tabeli itp.).
Wybierz — kliknięcie przycisku Wybierz otwiera nową kwerendę wybierającą w widoku projektu kwerendy.
Utwórz tabelę, Dołącz, Aktualizuj, Krzyżowa i Usuń — każdy z tych przycisków określa typ tworzonej kwerendy. W większości przypadków za pomocą jednego z tych przycisków przekształca się kwerendę wybierającą w funkcyjną.
Pokaż tabelę — otwiera okno dialogowe Pokazywanie tabeli.
Rysunek 8.3. Zakładka NARZĘDZIA KWEREND PROJEKTOWANIE
Pozostałe przyciski są wykorzystywane przy bardziej zaawansowanych kwerendach i służą do drukowania zawartości kwerendy oraz wyświetlania arkusza właściwości kwerendy.
Dodawanie pól Istnieje kilka metod dodawania pól do kwerendy. Pola można dodawać pojedynczo, można zaznaczyć oraz dodać kilka pól lub wszystkie pola na liście. Dodawanie pojedynczego pola Pojedyncze pola można dodawać do kwerendy na kilka sposobów. Jedną z metod jest dwukrotne kliknięcie nazwy pola w górnej części widoku projektu kwerendy. Nazwa pola natychmiast wyświetli się w pierwszej wolnej kolumnie siatki QBE. Innym sposobem jest przeciągnięcie pola z tabeli w górnej części okna projektu kwerendy i upuszczenie go na siatce QBE. Upuszczenie pola pomiędzy dwoma innymi polami na siatce QBE powoduje przesunięcie pozostałych pól w prawo. Na rysunku 8.4 pokazano dodawanie do listy pola Cost. Po dodaniu pola można przejść do kolejnej komórki i określić następne pole, jakie ma być uwzględnione w kwerendzie.
254
Część III Kwerendy Accessa
Rysunek 8.4. Dodawanie pól tabeli do siatki QBE. Wystarczy dwukrotnie kliknąć pole lub je przeciągnąć
Każda komórka w wierszu Tabela siatki QBE zawiera rozwijaną listę tabel dodanych w górnej części widoku projektu kwerendy. Dodawanie wielu pól Do siatki QBE można dodać równocześnie więcej niż jedno pole. W tym celu należy zaznaczyć wybrane pola na liście, a następnie przeciągnąć je do obszaru QBE. Wybrane pola nie muszą ze sobą sąsiadować (jedno pod drugim). Aby wybrać więcej niż jedno pole, należy podczas ich zaznaczania przytrzymać klawisz Ctrl. Proces dodawania wielu pól pokazano na rysunku 8.5. Rysunek 8.5. Dodawanie wielu pól w obszarze siatki QBE
Pola są dodawane do siatki QBE w porządku, w jakim występują w tabeli. Można również dodać wszystkie pola tabeli poprzez kliknięcie nagłówka listy pól (tam, gdzie na rysunku 8.6 wyświetla się nazwa tblProducts). Spowoduje to zaznaczenie wszystkich pól w tabeli. Następnie można przeciągnąć wyróżnione pola do siatki QBE.
Rozdział 8. Pobieranie danych za pomocą kwerend
255
Rysunek 8.6. Dodanie gwiazdki do siatki QBE powoduje wybranie wszystkich pól tabeli
Można również kliknąć na liście pól gwiazdkę (*)i przeciągnąć ją do siatki QBE (albo dwukrotnie kliknąć gwiazdkę w celu dodania jej do siatki QBE). Chociaż czynność ta nie powoduje dodania wszystkich pól do siatki QBE, gwiazdka informuje Accessa, że w kwerendzie mają być uwzględnione wszystkie pola tabeli. W odróżnieniu od zaznaczenia wszystkich pól użycie symbolu gwiazdki powoduje umieszczenie odwołania do wszystkich pól w pojedynczej kolumnie. Przeciąganie wszystkich pól pierwszym z prezentowanych sposobów dodaje do siatki QBE rzeczywiste nazwy pól. W przypadku późniejszej modyfikacji struktury tabeli trzeba także zmodyfikować projekt kwerendy. Używanie gwiazdki do wybierania wszystkich pól ma tę zaletę, że modyfikacja tabel biorących udział w kwerendzie nie wymaga wprowadzania zmian w samej kwerendzie. Gwiazdka oznacza wybór wszystkich pól w tabeli, niezależnie od nazw pól bądź zmiany liczby pól w tabeli. Wada stosowania gwiazdki do wybierania wszystkich pól w tabeli polega na tym, że kwerenda, zgodnie z instrukcją, zwraca wszystkie pola tabeli, niezależnie od tego, czy wszystkie są używane w formularzu bądź raporcie. Pobieranie niepotrzebnych danych może być bardzo kosztownym procesem. Przyczyną niskiej wydajności często jest zastosowanie gwiazdki, która powoduje zwrócenie do formularza bądź raportu znacznie większej liczby pól niż potrzeba.
Uruchamianie kwerend Po wybraniu pól możesz uruchomić kwerendę. W tym celu kliknij przycisk Uruchom w zakładce NARZĘDZIA KWEREND PROJEKTOWANIE (zobacz rysunek 8.7).
Rysunek 8.7. Kliknij przycisk Uruchom, aby wyświetlić wyniki zwrócone przez kwerendę
256
Część III Kwerendy Accessa
Aby powrócić do siatki QBE, możesz wybrać opcję Widok/Widok projektu w zakładce NARZĘDZIA GŁÓWNE. Możesz też kliknąć prawym przyciskiem myszy nagłówek zakładki kwerendy i wybrać opcję Widok projektu (zobacz rysunek 8.8). Rysunek 8.8. Kliknij prawym przyciskiem myszy nagłówek zakładki kwerendy i wybierz opcję Widok projektu, aby wrócić do siatki QBE
Praca z polami W pewnych sytuacjach występuje potrzeba przeorganizowania wybranych dla kwerendy pól — zmiany ich kolejności, wstawienia nowego pola czy usunięcia istniejącego. Można nawet dodać pole do obszaru QBE bez wyświetlania go w arkuszu danych. Dodawanie pól bez ich wyświetlania umożliwia przeprowadzenie sortowania według ukrytego pola lub użycie ukrytego pola jako kryterium.
Zaznaczanie pola w obszarze siatki QBE Zmiana pozycji pola wymaga wcześniej jego zaznaczenia. W tym celu należy wykorzystać wiersz selektorów pól. Wiersz selektorów pól to wąski szary pasek znajdujący się nad każdą z kolumn siatki QBE w dolnej części okna projektu kwerendy. Każda kolumna reprezentuje pole. Aby zaznaczyć pole Category, należy przesunąć kursor myszy nad wiersz selektorów kolumn (aż przyjmie on postać małej, czarnej strzałki skierowanej w dół), a następnie kliknąć selektor wybranej kolumny. Następnie można przeciągnąć kolumnę. Na rysunku 8.9 pokazano strzałkę nad kolumną Category tuż przed zaznaczeniem kolumny.
Rysunek 8.9. Zaznaczanie kolumny w obszarze siatki QBE. Po przesunięciu wskaźnika myszy na wiersz selektorów przyjmuje on postać strzałki skierowanej w dół Aby zaznaczyć kilka sąsiadujących ze sobą pól, należy kliknąć selektor pierwszego z nich, a następnie przeciągnąć wskaźnik myszy na ostatnie, które chcemy zaznaczyć.
Rozdział 8. Pobieranie danych za pomocą kwerend
257
Zmiana kolejności pól Kolejność od lewej do prawej, w jakiej pola wyświetlają się w obszarze siatki QBE, określa kolejność, w jakiej występują one w widoku arkusza danych. Aby pola wyświetliły się w innej kolejności w wynikach kwerendy, można je przemieszczać w obszarze siatki QBE. Po zaznaczeniu pól można je przemieszczać w obszarze QBE poprzez przeciąganie ich do nowych pozycji. Wystarczy kliknąć lewym przyciskiem myszy pasek selektora pola i trzymając tenże przycisk wciśnięty, przeciągnąć pole na nową pozycję w obrębie siatki QBE. Na rysunku 8.10 pokazano wyróżnione pole Category. W miarę przesuwania selektora pola w lewo separator kolumn pomiędzy polami ProductID i Description zmieni się (stanie się szerszy) i będzie wskazywał nowe miejsce pola Category.
Rysunek 8.10. Przemieszczanie pola Category w miejsce pomiędzy polami ProductID i Description. Zwróć uwagę na ikonę pola QBE poniżej strzałki obok kolumny Opis Kolejność pól w kwerendzie nie ma wpływu na sposób wyświetlania danych w formularzach i raportach. Formanty w formularzach i raportach zazwyczaj są rozmieszczane zgodnie z życzeniami użytkowników.
Zmiana rozmiaru kolumn w obszarze siatki QBE Obszar QBE domyślnie wyświetla w widocznym obszarze pięć lub sześć pól. Pozostałe pola można zobaczyć, przesuwając belkę poziomego paska przewijania wyświetlającego się w dolnej części okna. Czasami występuje potrzeba zwężenia niektórych pól w celu wyświetlenia większej liczby kolumn w obszarze siatki QBE. Aby dostosować szerokość kolumn (zwiększyć lub zmniejszyć), należy przesunąć wskaźnik myszy na krawędź pomiędzy polami i przeciągnąć belkę zmiany rozmiaru kolumn w lewo lub w prawo (zobacz rysunek 8.11).
Rysunek 8.11. Zmiana rozmiaru kolumn w obszarze siatki QBE Łatwiejszym sposobem zmiany rozmiaru kolumn wewnątrz siatki QBE jest dwukrotne kliknięcie linii dzielącej dwie kolumny wewnątrz siatki. Kiedy się to zrobi, Access automatycznie dostosuje szerokość kolumny do wyświetlających się w niej danych.
258
Część III Kwerendy Accessa
Szerokość kolumn na siatce QBE nie ma wpływu na sposób wyświetlania danych w arkuszach danych, a także w formularzach lub raportach. Szerokość kolumn na siatce QBE ma znaczenie wyłącznie dla wygody programisty. Podczas zapisywania lub zamykania kwerendy Access nie zapisuje szerokości kolumn na siatce QBE.
Usuwanie pól Aby usunąć pole (pola) z obszaru QBE, należy je zaznaczyć, a następnie nacisnąć klawisz Delete. Można również kliknąć prawym przyciskiem myszy selektor pola i z menu podręcznego wybrać polecenie Wytnij.
Wstawianie pól Aby wstawić nowe pole do obszaru siatki QBE, należy przeciągnąć je z okna listy pól powyżej siatki QBE i upuścić w odpowiedniej kolumnie siatki QBE. Nowa kolumna zostanie wstawiona z lewej strony kolumny, w której upuściliśmy pole. Dwukrotne kliknięcie pola na liście pól dodaje nową kolumnę na skrajnej prawej pozycji siatki QBE.
Ukrywanie pól Możesz chcieć, aby w trakcie wykonywania kwerend widoczne były tylko niektóre pola w siatce QBE. Załóżmy, że dodałeś do siatki pola FirstName, LastName, Address, City i State. Następnie zdecydowałeś, że chcesz przyjrzeć się wybranym danym z pominięciem pola State. Zamiast usuwać to pole, możesz je ukryć. W tym celu wystarczy usunąć zaznaczenie pola Pokaż w kolumnie State (zobacz rysunek 8.12). Rysunek 8.12. Pole wyboru Pokaż przy polu State nie jest zaznaczone, dlatego pole State nie pojawia się w wynikach
Pola kwerendy często ukrywa się dlatego, że służą do sortowania lub określania kryteriów, natomiast ich wartość nie jest później potrzebna. Pomyśl na przykład o kwerendach dotyczących faktur. Użytkownicy z różnych przyczyn mogą chcieć sortować faktury według daty złożenia zamówienia, nawet jeśli daty te nie są potrzebne. Można wtedy umieścić pole z datą zamówienia w siatce QBE, posortować dane według tego pola i usunąć zaznaczenie w polu wyboru Pokaż. Access posortuje dane według pola z datą zamówienia nawet wtedy, gdy pole to nie będzie widoczne w wynikach zwróconych przez kwerendę.
Rozdział 8. Pobieranie danych za pomocą kwerend
259
Jeżeli zapiszemy kwerendę zawierającą nieużywane pole (anulowano zaznaczenie pola Pokaż i nie zdefiniowano dla niego kryteriów lub porządku sortowania), Access automatycznie usunie je ze struktury kwerendy w ramach jej optymalizowania. Przy następnym otwarciu kwerendy pole nie będzie uwzględnione w projekcie kwerendy.
Zmiana kolejności sortowania Podczas przeglądania zestawu rekordów często trzeba je wyświetlić w określonym porządku. Sortowanie zestawu rekordów ułatwia analizę danych (np. umożliwia przeglądanie zawartości tabeli tblProducts uporządkowanej według kategorii). Sortowanie polega na ustawieniu rekordów w kolejności alfabetycznej lub numerycznej. Sposób sortowania może być rosnący lub malejący. Sortować można według jednego lub kilku pól. Dyrektywy sortowania wprowadza się w wierszu Sortuj siatki QBE. Aby określić porządek sortowania dla określonego pola (np. LastName), wykonaj następujące czynności: 1. Umieść kursor w komórce Sortuj w kolumnie LastName. 2. Kliknij listę rozwijaną w komórce i wybierz porządek sortowania (Rosnąco lub Malejąco). Na rysunku 8.13 pokazano siatkę QBE z rosnącym sortowaniem określonym dla pól LastName i FirstName. Zwróćmy uwagę, że dla pola LastName wyświetlają się dozwolone opcje sortowania. Zauważmy też, że w komórce Sortuj pola wyświetla się słowo Rosnąco. Rysunek 8.13. Dla pól LastName i FirstName określono rosnący porządek sortowania
Nie można sortować według pól typu Długi tekst lub Obiekt OLE.
Kolejność od lewej do prawej, w jakiej pola występują w obszarze siatki QBE, jest istotna w przypadku sortowania według więcej niż jednego pola. Pola nie tylko wyświetlają się w arkuszu danych w porządku od lewej do prawej, ale także są sortowane w tym samym porządku (nazywa się to hierarchią sortowania). Najpierw stosowane są kryteria sortowania dla pola występującego najbardziej z lewej strony, następnie kryteria najbliższego sąsiada z prawej itd. W przykładzie pokazanym na rysunku 8.13 Access najpierw zastosuje kryteria dla pola LastName, a potem dla pola FirstName.
260
Część III Kwerendy Accessa
Wynikowy arkusz danych kwerendy z rysunku 8.13 pokazano na rysunku 8.14. Zwróćmy uwagę, że dane są posortowane najpierw według pola LastName, a następnie według pola FirstName. Dlatego właśnie w wynikach kwerendy Arkadiusz Bondek wyświetla się przed Karoliną Bondek. Rysunek 8.14. Kolejność pól w obszarze siatki QBE ma kluczowe znaczenie w przypadku sortowania według wielu pól
Dodawanie kryteriów do kwerend Użytkownicy najczęściej pracują tylko z rekordami spełniającymi określone kryteria. W innym przypadku kwerenda mogłaby zwrócić zbyt wiele rekordów, powodując poważne problemy z wydajnością. Na przykład możemy poszukiwać danych tylko tych klientów, którzy nie kupili żadnego towaru w ciągu ostatnich sześciu miesięcy. Określanie kryteriów wyboru rekordów w Accessie jest łatwe.
Kryteria wyboru rekordów Kryteria wyboru są po prostu regułami filtrowania stosowanymi w odniesieniu do danych pobieranych z bazy. Mówią one Accessowi, jakie rekordy chcemy przeglądać w zestawie rekordów. Typowe kryteria mogą mieć na przykład postać: „wszyscy sprzedawcy”, „tylko samochody, które nie są ciężarówkami” lub „towary, których cena detaliczna jest większa niż 130 zł”. Kryteria wyboru ograniczają zbiór rekordów zwracanych przez kwerendę. Pomagają użytkownikom dzięki wybieraniu tylko tych rekordów, które chcą oni przeglądać, i ignorowaniu wszystkich pozostałych. Kryteria definiuje się w wierszu Kryteria siatki QBE. Określa się je w postaci wyrażeń. Wyrażenie może być proste (np. "Ciężarowe" lub Not "Ciężarowe"). Dzięki użyciu wbudowanych funkcji Accessa może ono również przyjąć bardziej złożoną postać. Umiejętność określania kryteriów ma kluczowe znaczenie przy projektowaniu dobrych baz danych Accessa. W większości przypadków użytkownicy nie mają pojęcia, jakie dane są przechowywane w tabelach bazy danych, i akceptują to, co widzą w formularzach i raportach, jako wiarygodne dane reprezentujące aktualny stan bazy danych. Źle
Rozdział 8. Pobieranie danych za pomocą kwerend
261
dobrane kryteria mogą się przyczynić do ukrycia istotnych informacji przed użytkownikami aplikacji, a to może później doprowadzić do błędnych decyzji biznesowych lub innych poważnych problemów.
Definiowanie prostych kryteriów tekstowych Kryteria typu znakowego można określać dla pól typu tekstowego. Najczęściej wpisuje się przykład tekstu, który chce się wyodrębnić z bazy danych. Oto prosty przykład zwracający rekordy tylko tych produktów, dla których kategoria produktu to "Osobowe". 1. Dodaj tabelę tblProducts i wybierz pola Description, Category oraz Cost. 2. Wpisz Osobowe w komórce Kryteria kolumny Category (zobacz rysunek 8.15). Zwróćmy uwagę, że Access dodał cudzysłów wokół wartości. Access, w przeciwieństwie do wielu innych systemów baz danych, automatycznie stosuje założenia dotyczące zamiarów użytkownika. Rysunek 8.15. Wpisywanie tekstu "Osobowe" jako kryteriów kwerendy
3. Uruchom kwerendę. Wyświetlą się tylko samochody osobowe. Patrząc na wyniki kwerendy, można stwierdzić, że nie ma sensu wyświetlanie słowa „Osobowe” we wszystkich wierszach w trzeciej kolumnie. Ponieważ ta kwerenda wyświetla wyłącznie informacje dotyczące samochodów osobowych, użytkownik może z powodzeniem założyć, że każdy rekord dotyczy samochodu. W związku z tym nie ma potrzeby wyświetlania kategorii produktu w wynikach kwerendy. Anulowanie zaznaczenie pola wyboru Pokaż w widoku projektu kwerendy spowoduje usunięcie kolumny Category z arkusza danych, przez co dane staną się bardziej zrozumiałe, Wyrażenie opisujące kryteria można wpisać na dowolny z poniższych sposobów: OSOBOWE = OSOBOWE "OSOBOWE" = "Osobowe"
Domyślnie Access nie rozróżnia dużych i małych liter, stąd w celu zdefiniowania kryteriów wyszukiwania można zapisać słowo osobowe w dowolnej postaci.
262
Część III Kwerendy Accessa
Rysunek 8.15 jest doskonałym przykładem ilustrującym różne typy prostych kryteriów tekstowych. Równie dobrze można w polu kryteriów kolumny wpisać Not Osobowe, aby uzyskać listę wszystkich produktów, które nie są samochodami osobowymi (ciężarowe, minivany itp.). Ogólnie w przypadku danych tekstowych kryteria określa się jako równość, nierówność lub w postaci listy dopuszczalnych wartości. Ten mechanizm daje użytkownikom bardzo duże możliwości. Wystarczy jedynie podać przykład, a Access nie tylko go zinterpretuje, ale utworzy także na jego podstawie zbiór wynikowy. Tłumaczy to nazwę Zapytanie przez przykład (ang. QBE) — wpisujemy przykład, a baza danych tworzy na tej podstawie zapytanie. Aby usunąć kryterium z komórki, należy zaznaczyć jej zawartość, a następnie nacisnąć klawisz Delete. Można też wybrać polecenie Wytnij z menu podręcznego dostępnego po kliknięciu prawym przyciskiem myszy.
Definiowanie prostych kryteriów innych typów Kryteria można również określać dla pól typu Liczba, Data/Godzina oraz Tak/Nie. W tym celu należy wpisać odpowiedni przykład w polu kryterium, identycznie jak w przypadku pól tekstowych. Niemal zawsze Access potrafi właściwie zinterpretować wprowadzone kryteria i odpowiednio je dostosować, aby można było użyć ich w odniesieniu do pól kwerendy. Możliwe jest również określenie więcej niż jednego kryterium dla kwerendy. Przypuśćmy na przykład, że chcemy przejrzeć jedynie rekordy klientów, którzy mieszkają w województwie pomorskim i którzy zostali klientami po 1 stycznia 2012 roku (wartość w polu OrigCustDate większa lub równa 1 stycznia 2012). Wymaga to wprowadzenia przykładowych danych w dwóch polach — State oraz OrigCustDate. W tym celu należy pamiętać, aby wpisy występowały w tej samej linii (w wierszu Kryteria). Aby utworzyć taką kwerendę, wykonaj następujące czynności: 1. Utwórz nową kwerendę bazującą na tabeli tblCustomers. 2. Dodaj do siatki QBE pola ContactType, FirstName, LastName, State oraz OrigCustDate. 3. Wpisz "mazowieckie" lub "MAZOWIECKIE" w komórce Kryteria dla kolumny State. 4. Wpisz >= 01/01/12 w komórce Kryteria dla kolumny OrigCustDate. Zwróćmy uwagę, że Access automatycznie otacza wartości dat znakami #. 5. Uruchom kwerendę. Wygląd kwerendy pokazano na rysunku 8.16. Access wyświetli rekordy klientów mieszkających w województwie mazowieckim, którzy zostali klientami przed 1 stycznia 2012 roku. Do porównywania pól typu Data z określonymi wartościami Access wykorzystuje operatory porównania. Są to znak mniejszości (<), znak większości (>), znak równości (=) oraz różne ich kombinacje.
Rozdział 8. Pobieranie danych za pomocą kwerend
263
Rysunek 8.16. Definiowanie kryteriów dla pól tekstowych i daty w tej samej kwerendzie
Zwróć uwagę, że Access automatycznie otacza wartości dat znakami #. Dzięki temu może odróżnić pola typu Data/Godzina od pól tekstowych. Znaków #, podobnie jak cudzysłowów w przypadku pól tekstowych, nie trzeba wprowadzać samemu. Ponieważ pole OrigCustDate jest typu Data/Godzina, Access zrozumie zamiary użytkownika i wstawi odpowiednie ograniczniki. Należy pamiętać, że Access interpretuje daty zgodnie z ustawieniami regionalnymi i językowymi systemu Windows dostępnymi w panelu sterowania. Na przykład w większości krajów europejskich i azjatyckich zapis #5/6/2012# zostanie zinterpretowany jako 5 czerwca 2012 roku, podczas gdy w Stanach Zjednoczonych ten sam zapis oznacza datę 6 maja 2012 roku. Bardzo łatwo można skonstruować kwerendę, która świetnie działa, ale zwraca nieprawidłowe dane ze względu na subtelne różnice ustawień regionalnych. Operatory i ich priorytety omówiono szczegółowo w rozdziale 9.
Drukowanie zbiorów wynikowych kwerend Po utworzeniu kwerendy można z łatwością wydrukować wszystkie rekordy ze zbioru wynikowego. Chociaż nie da się określić typu raportu, można wydrukować prosty raport w postaci tabeli (wierszy i kolumn) zawierającej rekordy utworzone przez kwerendę. Podczas drukowania zbioru wynikowego dostępnych jest jednak kilka możliwości. Jeśli mamy pewność, że arkusz danych został skonfigurowany w postaci, jaka nam odpowiada, możemy ustawić kilka opcji, postępując zgodnie z poniższą instrukcją: 1. Wykorzystaj utworzoną przed chwilą kwerendę zwracającą klientów z województwa pomorskiego, którzy byli aktywni po 1 stycznia 2012 roku. 2. Jeżeli nie jesteś w widoku arkusza danych, uruchom kwerendę poprzez kliknięcie przycisku Uruchom w grupie Wyniki na wstążce. 3. Wybierz opcję Drukuj z menu Plik, będąc w oknie arkusza danych kwerendy. 4. Określ wybrane opcje w oknie dialogowym Drukowanie i kliknij OK.
264
Część III Kwerendy Accessa
Wydruk będzie odzwierciedlał wszelkie właściwości i rozmieszczenie elementów arkusza danych. Ukryte kolumny nie będą drukowane, a linie siatki będą drukowane tylko wtedy, gdy zostanie zaznaczona odpowiednia opcja. W wydruku będą także uwzględnione szerokości kolumn oraz wysokości wierszy.
Zapisywanie kwerendy Aby zapisać kwerendę, należy kliknąć przycisk Zapisz na pasku szybkiego dostępu w górnej części okna Accessa. Jeśli zapisujemy kwerendę po raz pierwszy, Access wyświetli pytanie o jej nazwę. Po zapisaniu kwerendy Access powróci do poprzedniego trybu pracy. Czasami występuje potrzeba zapisania kwerendy i zakończenia jej projektowania w pojedynczej operacji. W tym celu należy kliknąć przycisk Zamknij okno w prawym górnym rogu okna widoku projektu kwerendy. Przed właściwym zapisaniem kwerendy Access zawsze wyświetla prośbę o potwierdzenie zamiaru zapisania zmian.
Tworzenie kwerend bazujących na wielu tabelach Używanie kwerend do pobierania informacji z pojedynczej tabeli jest dość popularne, często jednak potrzebne są informacje z kilku powiązanych ze sobą tabel. Na przykład mogą być potrzebne nazwiska klientów (nabywców) wraz z zakupionymi towarami. Zdefiniowanie takiej kwerendy wymaga użycia czterech tabel: tblCustomers, tblSales, tblSalesLineItems i tblProducts. W rozdziale 3. poznałeś klucze główne i obce oraz ich znaczenie dla łączenia ze sobą dwóch tabel. Nauczyłeś się, jak tworzyć relacje między tabelami, korzystając z okna Relacje. Na końcu dowiedziałeś się, co to są więzy integralności i w jaki sposób oddziałują na dane w tabelach.
Po utworzeniu tabel bazy danych i zdecydowaniu, w jaki sposób mają być ze sobą powiązane, można tworzyć kwerendy bazujące na wielu tabelach, umożliwiające pobieranie informacji z kilku tabel naraz. Kwerenda wyświetla dane z wielu tabel i prezentuje je w taki sposób, jakby dane pochodziły z jednej rozbudowanej tabeli. Pierwszym krokiem procesu tworzenia kwerendy bazującej na wielu tabelach jest dodanie każdej z nich do okna projektu kwerendy. 1. Utwórz nową kwerendę poprzez kliknięcie przycisku Projekt kwerendy w grupie Tworzenie na wstążce. 2. Wybierz tabele tblCustomers, tblSales, tblSalesLineItems i tblProducts poprzez dwukrotne kliknięcie nazwy każdej z tabel w oknie dialogowym Pokazywanie tabeli. 3. Kliknij przycisk Zamknij.
Rozdział 8. Pobieranie danych za pomocą kwerend
265
Tabele możesz dodawać także osobno, zaznaczając je po kolei i klikając przycisk Dodaj.
Na rysunku 8.17 pokazano górny obszar okna projektu kwerendy zawierający cztery dodane przed chwilą tabele. W kwerendzie automatycznie pojawiły się linie łączące tabele, ponieważ relacje zdefiniowano na poziomie tabel.
Rysunek 8.17. Okno projektu kwerendy po dodaniu czterech tabel. Zwróćmy uwagę na widoczne linie łączące tabele W dowolnym momencie można dodać do kwerendy więcej tabel. W tym celu należy wybrać polecenie Pokaż tabelę znajdujące się na wstążce Projekt kwerendy. Można też kliknąć prawym przyciskiem myszy okno projektowe i wybrać opcję Pokaż tabelę z menu kontekstowego.
Pola z więcej niż jednej tabeli dodaje się do kwerendy dokładnie w taki sposób, w jaki robi się to w przypadku pojedynczej tabeli. Można dodać jedno pole, kilka pól zgrupowanych razem lub wszystkie pola z tabeli. Jeżeli wybierzesz pole, które występuje w kilku tabelach, Access przed nazwą pola doda nazwę tabeli, z której ono pochodzi, oraz kropkę. Na przykład pole ProductID znajduje się w kilku tabelach używanych w oknie projektowym kwerendy (w tabelach tblProducts i tblSalesLineItems). Gdy dodasz to pole z tabeli tblSalesLineItems, pojawi się ono w siatce jako tblSalesLineItems.ProductID. Pomaga to określić właściwą nazwę pola. Za pomocą tej techniki można wskazać nazwę pola z konkretnej tabeli. Najłatwiejszym sposobem wyboru pól jest dwukrotne kliknięcie ich nazw w górnej części okna projektu kwerendy. W tym celu czasami trzeba powiększyć okno listy pól tak, aby potrzebne pola były widoczne.
Przeglądanie nazw tabel W trakcie pracy z kilkoma tabelami nazwy pól w siatce QBE mogą być niejednoznaczne. Czasami zadajemy sobie pytanie w rodzaju: „z której tabeli pochodzi pole Description?”.
266
Część III Kwerendy Accessa
Access automatycznie przypisuje nazwę tabeli każdemu polu wyświetlanemu w obszarze siatki QBE. Na rysunku 8.18 pokazano okno projektu kwerendy z nazwami poszczególnych tabel wyświetlającymi się pod nazwami pól w obszarze siatki QBE. Rysunek 8.18. Obszar siatki QBE z wyświetlonymi nazwami pól. Zwróćmy uwagę, że wyświetlają się nazwy wszystkich czterech tabel
Dodawanie wielu pól Proces dodawania kilku pól naraz w kwerendzie bazującej na wielu tabelach jest dokładnie taki sam jak w przypadku kwerendy wykorzystującej pojedynczą tabelę. Aby dodać kilka pól z wielu tabel, w jednej operacji można dodać pola tylko z jednej tabeli. Najłatwiejszym sposobem wykonania tej operacji jest zaznaczenie wybranych pól i przeciągnięcie ich do obszaru QBE. Kilka sąsiadujących ze sobą pól można zaznaczyć, klikając pierwsze z nich, a następnie — przy wciśniętym klawiszu Shift — klikając ostatnie. Pola, które ze sobą nie sąsiadują, można zaznaczać, klikając je kolejno przy wciśniętym klawiszu Ctrl. Wybranie gwiazdki (*) ma jeden minus: dla kolumny tego typu nie można określić kryteriów. Aby uzyskać taką możliwość, trzeba dodać osobno wybrane pola i w ich kolumnach zdefiniować kryteria. W przypadku dodania pola w celu określenia kryterium (gdy jednocześnie wybrano gwiazdkę) kwerenda wyświetli pole dwukrotnie — ze względu na gwiazdkę i wskutek działania kolumny z kryterium. Aby tego uniknąć, można anulować zaznaczenie komórki Pokaż w kolumnie zawierającej kryterium.
Ograniczenia dla kwerend bazujących na wielu tabelach W przypadku kwerend utworzonych na podstawie wielu tabel istnieją ograniczenia dotyczące tego, które pola można edytować. Generalnie dane występujące w zbiorze wynikowym można modyfikować, a wprowadzane zmiany są uwzględniane także w tabelach bazowych. Najważniejszym wyjątkiem jest klucz główny tabeli — nie można edytować jego wartości, jeśli zaznaczono opcję wymuszania więzów integralności i jeśli pole wchodzi w skład relacji. Czasem programista chce ręcznie modyfikować wynikowy zbiór rekordów zwrócony przez kwerendę. Rekordy zawarte w tabelach Accessa nie zawsze można modyfikować. W tabeli 8.1 przedstawiono, w jakich okolicznościach pole w tabeli można modyfikować. Jak widać, kwerendy bazujące na relacji typu jeden do wielu są modyfikowalne w zakresie obydwu tabel (w zależności od sposobu zaprojektowania kwerendy).
Rozdział 8. Pobieranie danych za pomocą kwerend
267
Tabela 8.1. Zasady modyfikowalności kwerend Typ kwerendy lub pola
Modyfikowalna
Pojedyncza tabela
Tak
Relacja typu jeden do jednego
Tak
Wynik zawiera pole typu Długi tekst
Tak
Modyfikowalne pole typu Długi tekst
Wynik zawiera hiperłącze
Tak
Modyfikowalne hiperłącze
Wynik zawiera obiekt OLE
Tak
Modyfikowalny obiekt OLE
Relacje jeden do wielu
Zazwyczaj
Ograniczenia wynikające z metodyki projektowania (zobacz tekst)
Relacje wiele do jednego do wielu
Nie
Komentarz
Można modyfikować dane w formularzu lub na stronie dostępu do danych, jeżeli wartością właściwości Typ zestawu rekordów jest Dynamiczny
Dwie lub więcej tabel bez linii sprzężeń
Nie
Aby umożliwić modyfikację, trzeba utworzyć sprzężenie
Kwerenda krzyżowa
Nie
Tworzy chwilową migawkę danych
Kwerendy podsumowujące (Suma, Średnia itp.)
Nie
Operuje na pogrupowanych danych, tworząc chwilową migawkę danych
Właściwość Wartości unikatowe ma wartość Tak
Nie
Wyświetla unikatowe rekordy tylko w chwilowej migawce danych
Kwerendy z SQL-a
Nie
Kwerendy składające oraz przekazujące operują na danych poprzez ODBC
Pola obliczeniowe
Nie
Są obliczane automatycznie
Pola tylko do odczytu
Nie
Jeżeli są otwarte w trybie tylko do odczytu lub z dysku tylko do odczytu (np. CD-ROM)
Odmowa dostępu
Nie
Brak uprawnień do wstawiania, zmiany i usuwania rekordów
Tabele ODBC bez klucza głównego
Nie
Musi istnieć unikatowy identyfikator
Tabele Paradox bez klucza głównego
Nie
Musi istnieć klucz główny
Zablokowane przez innego użytkownika
Nie
Nie można wprowadzić modyfikacji, jeżeli pole jest zablokowane przez kogoś innego
Obchodzenie ograniczeń dotyczących kwerend Z tabeli 8.1 wynika, że istnieją sytuacje, w których kwerendy oraz pola w nich zawarte nie są modyfikowalne. Ogólna zasada jest taka, że żadna kwerenda wykonująca obliczenia podsumowujące lub bazująca na źródle danych ODBC (ang. Open DataBase Connectivity) nie jest modyfikowalna. Większość innych kwerend umożliwia wprowadzanie modyfikacji. Jeżeli kwerenda zawiera więcej niż jedną tabelę i niektóre z nich są połączone relacją typu jeden do wielu, mogą istnieć w niej pola, których zawartości nie można modyfikować (w zależności od struktury kwerendy).
268
Część III Kwerendy Accessa
Modyfikowanie unikatowych indeksów (kluczy głównych) Jeżeli kwerenda używa dwóch tabel połączonych relacją typu jeden do wielu, kwerenda musi zawierać klucz główny z tabeli po stronie „jeden”. Access potrzebuje wartości klucza po to, by mógł znaleźć powiązane ze sobą rekordy w obu tabelach. Zastępowanie istniejących danych w wynikach kwerendy bazującej na tabelach powiązanych relacjami typu jeden do wielu Normalnie w kwerendach typu jeden do wielu wszystkie pola w tabeli ze strony „wiele” (np. tabeli tblSales) relacji są modyfikowalne. Po stronie „jeden” relacji (tblCustomers) można modyfikować wszystkie pola z wyjątkiem pola klucza głównego. W większości baz danych jest to wystarczające. Pole klucza głównego w tabeli ze strony „jeden” relacji jest rzadko modyfikowane, ponieważ służy ono do łączenia z rekordami w powiązanych tabelach. Aktualizacja pól w kwerendach Aby można było dodawać rekordy do obydwu tabel relacji typu jeden do wielu, należy uwzględnić w kwerendzie klucz obcy ze strony „wiele” relacji i wyświetlić go w arkuszu danych. Dzięki temu będzie można dodawać rekordy, rozpoczynając od dowolnej tabeli. Pole klucza głównego ze strony „jeden” relacji będzie automatycznie kopiowane do pola sprzęgającego ze strony „wiele”. Aby dodawać rekordy do wielu tabel za pomocą formularza (opisano to w rozdziałach 17. i 18.), należy pamiętać o umieszczeniu na formularzu wszystkich (lub większości) pól z obu tabel. W przeciwnym razie formularz nie będzie zawierał kompletnych danych rekordu.
Obszar tabel Górna część okna projektu kwerendy (obszar tabel) zawiera ważne informacje dla działania kwerendy. Umiejętność posługiwania się obszarem tabel i sposobami wykonywania działań z listą pól ma kluczowe znaczenie dla budowania złożonych kwerend. Linie widoczne w tym obszarze są już gotowe, ponieważ między tabelami utworzono już relacje opisane w rozdziale 4.
Linie sprzężeń Tabele w oknie projektu kwerendy są połączone liniami sprzężeń (zobacz rysunek 8.17). Każda linia łączy pole klucza głównego z jednej tabeli z polem klucza obcego w innej tabeli. Linia sprzężenia reprezentuje relację istniejącą między dwiema tabelami w bazie danych Accessa. W naszym przykładzie jedna z linii sprzężeń łączy pole ContactID z tabeli tblCustomers z polem Buyer z tabeli tblSales. Linie zostały utworzone automatycznie, ponieważ wcześniej dla tabel zdefiniowano relacje. Jeżeli dla relacji zdefiniowano opcję wymuszania więzów integralności, Access wyświetli skrajne odcinki linii jako pogrubione. Jeżeli relacja jest typu jeden do wielu, to tabela ze strony „wiele” relacji jest oznaczona symbolem nieskończoności (∞).
Rozdział 8. Pobieranie danych za pomocą kwerend
269
Access automatycznie utworzy sprzężenie między tabelami, jeśli będą spełnione następujące warunki:
W obydwu tabelach istnieje pole o tej samej nazwie.
Pola o tej samej nazwie w obydwu tabelach są tego samego typu (tekstowe, liczbowe itp.). Warto zauważyć, że typ danych Autonumerowanie jest traktowany tak jak typy liczbowe (jako długa liczba całkowita).
W jednej z tabel wybrane pole jest kluczem głównym. Po zdefiniowaniu relacji między tabelami wyświetlają się linie sprzężeń łączące dwa pola. W czasie przewijania zawartości listy pól położenie linii zmienia się wraz ze względnym położeniem odpowiednich pól. Na przykład jeżeli przesunie się w dół belkę przewijania okna tblCustomers, linia sprzężenia przemieści się w górę wraz z polem numeru klienta, zatrzymując się dopiero na górnej krawędzi okna.
W czasie pracy z wieloma tabelami linie sprzężeń mogą sprawiać wrażenie zagmatwanych — często nakładają się i przecinają. Jeżeli przewiniemy zawartość okna listy, linie, których przeznaczenie dotąd nie było jasne, będą widoczne i stanie się oczywiste, których pól dotyczą.
Przesuwanie tabel Listy pól można przesuwać w obrębie obszaru tabel, umieszczając wskaźnik myszy nad paskiem tytułowym okna (na którym wyświetla się nazwa tabeli), a następnie przeciągając listę w nowe miejsce. Listy pól można przesuwać w celu uporządkowania zagmatwanego widoku schematu bazy danych i tym samym ułatwienia sobie pracy. Listy pól można umieszczać w dowolnym miejscu górnego obszaru okna. Można je rozciągać i zmieniać ich kolejność. Podczas zapisywania lub zamykania kwerendy Access zapisuje rozmieszczenie list pól. Przy następnym otwarciu kwerendy okna z listami pól wyświetlą się w takiej samej konfiguracji, w jakiej je pozostawiliśmy.
Usuwanie tabel Istnieją sytuacje, w których trzeba usunąć tabele z kwerendy. Aby usunąć tabelę, należy za pomocą myszy zaznaczyć ją w górnej części okna projektu kwerendy, a następnie wcisnąć klawisz Delete. Można też kliknąć prawym przyciskiem myszy wybraną listę pól, a następnie z menu podręcznego wybrać polecenie Usuń tabelę. Oczywiście usunięcie tabeli z projektu kwerendy nie usuwa tabeli z bazy danych. Po usunięciu tabeli z projektu kwerendy usuwane są także wszystkie związane z nią linie sprzężeń. Przed usunięciem nie wyświetla się żadne ostrzeżenie ani prośba o potwierdzenie zamiaru usunięcia. Tabela jest po prostu usuwana z ekranu razem z wszystkimi jej polami dodanymi do siatki QBE. Należy jednak pamiętać, że odwołania do usuniętych tabel w polach obliczeniowych nie zostaną usunięte. Odwołania „fantomowe” mogą powodować problemy podczas prób uruchomienia kwerendy. Szczegółowe omówienie pól obliczeniowych znajdziesz w rozdziale 12.
270
Część III Kwerendy Accessa
Dodawanie kolejnych tabel Do kwerendy można dodawać kolejne tabele. Można też przywrócić tabelę usuniętą przez pomyłkę. Aby przeprowadzić te operacje, należy kliknąć przycisk Pokaż tabelę w grupie Konfiguracja kwerendy w zakładce PROJEKTOWANIE. Wówczas na ekranie wyświetli się okno dialogowe Pokazywanie tabeli.
Tworzenie sprzężeń w kwerendach i ich obsługa Często trzeba utworzyć kwerendę, w której uzyskanie pożądanych wyników wymaga złączenia dwóch lub więcej powiązanych tabel. Możliwe, że chcesz złączyć tabelę pracowników z tabelą transakcji, aby utworzyć raport z informacjami o transakcjach oraz o pracownikach, którzy je obsługiwali. Od rodzaju sprzężenia zależy, które rekordy zostaną zwrócone.
Wprowadzenie do sprzężeń Istnieją trzy podstawowe rodzaje sprzężeń (inaczej złączeń): wewnętrzne, zewnętrzne lewostronne i zewnętrzne prawostronne.
Sprzężenia wewnętrzne — operacja ta nakazuje Accessowi pobranie z obu tabel tylko tych rekordów, które zawierają pasujące do siebie wartości. Wyniki zwracane przez kwerendę obejmują tylko te rekordy, w których w polach uwzględnianych w sprzężeniu w obu tabelach występuje ta sama wartość. Na rysunku 8.19 przedstawiamy sprzężenie wewnętrzne w formie graficznej.
Rysunek 8.19. Sprzężenie zewnętrzne powoduje pobranie tylko tych rekordów, które w obu tabelach mają pasujące do siebie wartości. Strzałka pokazuje, które rekordy znajdą się w wynikach
Lewostronne sprzężenie zewnętrzne — operacja ta nakazuje Accessowi pobranie wszystkich rekordów z pierwszej tabeli oraz tych rekordów z drugiej tabeli, które w polu uwzględnianym w sprzężeniu mają wartości pasujące do rekordów z pierwszej tabeli. Na rysunku 8.20 przedstawiamy lewostronne sprzężenie zewnętrzne w formie graficznej.
Rozdział 8. Pobieranie danych za pomocą kwerend
271
Rysunek 8.20. Lewostronne sprzężenie zewnętrzne powoduje pobranie wszystkich rekordów z pierwszej tabeli i tych rekordów z drugiej tabeli, które mają pasujące wartości. Strzałki pokazują, które rekordy znajdą się w wynikach
Prawostronne sprzężenie zewnętrzne — operacja ta nakazuje Accessowi pobranie wszystkich rekordów z drugiej tabeli oraz tych rekordów z pierwszej tabeli, które w polu uwzględnianym w sprzężeniu mają wartości pasujące do rekordów z drugiej tabeli (zobacz rysunek 8.21).
Rysunek 8.21. Prawostronne sprzężenie zewnętrzne powoduje pobranie wszystkich rekordów z drugiej tabeli i tylko tych rekordów z pierwszej tabeli, które mają pasujące wartości. Strzałki pokazują, które rekordy znajdą się w wynikach
Kwerenda Accessa domyślnie zwraca tylko te wiersze, w których dane występują po obu stronach relacji. Oznacza to na przykład, że kwerenda pobierająca dane z tabel klientów i transakcji zwraca rekordy tylko wtedy, gdy klienci dokonali jakichś transakcji. W związku z tym w wynikach kwerendy nie pojawią się dane klientów, którzy jeszcze nie brali udziału w żadnej z transakcji. Jeśli rekordowi klienta nie odpowiada co najmniej jeden rekord transakcji, taki rekord nie znajdzie się w wynikach kwerendy. Oznacza to, że czasami kwerenda nie zwróci wszystkich rekordów, jakich można by się spodziewać. Chociaż jest to najpopularniejszy typ sprzężenia między tabelami w kwerendzie, czasami użytkownicy chcą zobaczyć wszystkie dane z tabeli (np. tabeli tblCustomers w poprzednim przykładzie), niezależnie od tego, czy odpowiadają im rekordy w powiązanej tabeli. Niekiedy użytkownicy są specjalnie zainteresowani rekordami, które nie mają odpowiedników po przeciwnej stronie sprzężenia. Pomyśl np. o pracownikach działu handlowego zainteresowanych listą wszystkich klientów, którzy niczego nie kupili w poprzednim roku. Aby uruchomić taką kwerendę, trzeba zmodyfikować domyślne działanie sprzężenia.
272
Część III Kwerendy Accessa
Sprzężenie między tabelami można utworzyć za pomocą trzech metod:
Tworząc relację między tabelami na etapie projektowania bazy danych.
Poprzez wybranie do kwerendy dwóch tabel zawierających pole o takiej samej nazwie i takim samym typie danych, które w jednej z tabel jest kluczem głównym.
Poprzez modyfikację domyślnego działania sprzężenia.
Pierwsze dwie metody działają w oknie kwerendy automatycznie. W przypadku dodania powiązanych ze sobą tabel do kwerendy Access automatycznie wyświetli relacje zachodzące między nimi w oknie projektu kwerendy. Również automatycznie utworzy sprzężenie między dwiema tabelami zawierającymi takie same pole, pod warunkiem, że pole to jest w jednej z tabel kluczem głównym oraz w oknie opcji zaznaczono pole wyboru Włącz autosprzęganie (jest to ustawienie domyślne). Jeśli relacje zostaną ustawione za pomocą kreatora relacji, linia autosprzężenia może się nie wyświetlić w następujących sytuacjach:
Dwie tabele zawierają wspólne pole, ale w każdej z nich ma ono inną nazwę.
Tabela nie jest i nie może być logicznie powiązana z inną tabelą (np. nie można tabeli tblCustomers połączyć bezpośrednio z tabelą tblSalesLineItems).
Jeżeli w kwerendzie występują tabele, które nie zostały połączone za pomocą relacji, a chcemy je ze sobą powiązać w kwerendzie, możemy to zrobić w oknie projektu kwerendy. Utworzenie sprzężenia między tabelami w oknie projektu kwerendy nie powoduje powstania między tymi tabelami stałego połączenia. Utworzone sprzężenie (relacja) obowiązuje wyłącznie na czas działania kwerendy. Tabele wykorzystywane w kwerendzie muszą być ze sobą w jakiś sposób powiązane. W przypadku dołączenia dwóch tabel, które nie mają ze sobą nic wspólnego (np. kwerenda bazująca na tabelach tblCustomers i tblProducts bez żadnej tabeli pośredniej), Access nie będzie miał sposobu na wyznaczenie rekordów z tabeli tblCustomers, które odpowiadają rekordom z tabeli tblProducts. Jeśli nie istnieje sposób powiązania tabel ze sobą, Access zwróci bezużyteczne dane.
Wykorzystywanie sprzężeń ad hoc Na rysunku 8.22 pokazano prostą kwerendę zawierającą tabele tblSales, tblSalesLineItems, tblProducts i tblCategories. Występuje tu automatyczne sprzężenie, utworzone w momencie dodania do kwerendy tabeli tblCategories. Między tabelami tblProducts i tblCategories nie istniała do tej pory żadna formalna relacja. Access znalazł jednak w obu tabelach pole Category i wykrył, że oba pola są tego samego typu i że pole Category w tabeli tblCategories jest kluczem głównym. Z tego względu dodał linię sprzężenia ad hoc między tymi tabelami. Tabele wchodzące w skład kwerendy nie są sprzęgane automatycznie, jeżeli nie istnieje wiążąca je relacja na poziomie tabel, jeżeli nie mają wspólnego pola dla klucza głównego lub jeżeli wyłączona jest opcja autosprzęgania.
Rozdział 8. Pobieranie danych za pomocą kwerend
273
Rysunek 8.22. Sprzężenie ad hoc między tabelami tblProducts i tblCategories
Gdyby Access nie ustanowił automatycznego sprzężenia między tabelami tblProducts i tblCategories (np. ze względu na różne nazwy pola Category w obu tabelach), można by z łatwością zdefiniować sprzężenie poprzez przeciągnięcie pola Category z jednej tabeli i upuszczenie go na odpowiadającym mu polu w drugiej tabeli.
Określanie typu sprzężenia Problem w przypadku większości sprzężeń polega na tym, że w czasie działania kwerendy są one interpretowane jako równozłączenia. Jeśli w kwerendzie pokazanej na rysunku 8.19 istnieje rekord produktu, któremu nie przypisano kategorii (np. nie przypisano kategorii do samochodu), kwerenda nie zwróci żadnych rekordów, jeśli rekordowi produktu nie będzie odpowiadał rekord kategorii. Problem polega tu na tym, że nie można stwierdzić, iż jakiegoś rekordu brakuje. Jedynym sposobem, by stwierdzić, że powinno być więcej rekordów, jest dokładne przeanalizowanie rekordów transakcji lub utworzenie innej kwerendy zliczającej wszystkie transakcje albo wykonującej jakąś inną operację sprawdzającą. Aby uzyskać dokładny obraz transakcji, trzeba zmodyfikować właściwości sprzężenia między tabelami tblProducts i tblCategories. Aby to zrobić, należy kliknąć prawym przyciskiem myszy cienką linię sprzężenia między tabelami tblProducts i tblCategories, a następnie z menu podręcznego wybrać polecenie Właściwości sprzężenia. W wyniku tej operacji otworzy się okno dialogowe Właściwości sprzężenia (zobacz rysunek 8.23), w którym można zdefiniować inny rodzaj sprzężenia między tabelami. W oknie na rysunku 8.23 wybrano trzecią opcję (Uwzględnia wszystkie rekordy z 'tblProducts'…) — pierwsza opcja jest domyślna. Druga i trzecia opcja są określane jako lewostronne oraz prawostronne sprzężenie zewnętrzne i instruują Accessa, aby pobierał wszystkie rekordy z lewej (lub prawej) tabeli wchodzącej w skład sprzężenia, niezależnie od tego, czy odpowiadają im rekordy po jego drugiej stronie.
274
Część III Kwerendy Accessa
Rysunek 8.23. Wybór zewnętrznego sprzężenia dla kwerendy
Wynik działania kwerendy z nowym sprzężeniem przedstawia rysunek 8.24. W prawym dolnym rogu na tym rysunku pokazano sposób zdefiniowania sprzężenia zewnętrznego w oknie projektu kwerendy. Na pozostałej części rysunku widać wynikowy zbiór rekordów zwracanych przez zapytanie.
Rysunek 8.24. Problemy brakujących produktów z rysunku 8.23 można wyeliminować dzięki zastosowaniu prawostronnego sprzężenia zewnętrznego
Oczywiście można z łatwością zdefiniować sprzężenia, które nie mają sensu, jednak w przypadku przeglądania wyników zawierających takie sprzężenia łatwo się zorientować, że zwrócone dane nie są tymi, o które nam chodziło. Jeśli dla połączonych ze sobą pól nie istnieją wspólne wartości, otrzymamy arkusz danych niezawierający żadnych rekordów. Nigdy nie należy tworzyć sprzężeń, które nie mają sensu. Na przykład nie należy tworzyć sprzężenia między polem City z tabeli tblCustomer a polem SalesDate z tabeli tblSales. Chociaż Access nie wyklucza tworzenia takich sprzężeń, w uzyskanym zbiorze wyników nie będzie żadnych rekordów.
Usuwanie sprzężeń Aby usunąć linię sprzężenia łączącego dwie tabele, należy ją zaznaczyć, a następnie nacisnąć klawisz Delete. Aby zaznaczyć linię, należy wskazać ją myszą i kliknąć w dowolnym miejscu.
Rozdział 8. Pobieranie danych za pomocą kwerend
275
Jeżeli usunie się sprzężenie między dwiema tabelami, co spowoduje, że w oknie projektu kwerendy pozostaną niepołączone ze sobą tabele, w wyniku wyświetlą się nieoczekiwane dane wykorzystujące iloczyn kartezjański utworzony przez Accessa dla tych tabel. Iloczyn kartezjański będzie obliczany tylko dla tej kwerendy. Relacja zdefiniowana na poziomie systemu pozostanie nienaruszona.
Access umożliwia tworzenie między tabelami sprzężeń wykorzystujących wiele pól (wyświetli się więcej niż jedna linia). Oba pola muszą zawierać wspólne dane, w przeciwnym razie kwerenda nie znajdzie żadnych rekordów, które mogłaby wyświetlić w arkuszu danych.
276
Część III Kwerendy Accessa
Rozdział 9.
Stosowanie operatorów i wyrażeń W tym rozdziale:
Stosowanie operatorów w wyrażeniach
Tworzenie złożonych kwerend
Tworzenie kwerend z prostymi kryteriami
Wprowadzanie wielu kryteriów w kwerendach
Tworzenie złożonych kryteriów w kwerendach
W poprzednich rozdziałach tworzyliśmy kwerendy, wykorzystując wybrane pola z jednej lub kilku tabel. Wykorzystywaliśmy również sortowanie i definiowaliśmy kryteria, które miały na celu ograniczenie listy wyników zwracanych przez kwerendę. W tym rozdziale koncentrujemy się na używaniu operatorów i wyrażeń do obliczania danych, porównywania wartości i wyświetlania danych w różnych formatach — używając kwerend do tworzenia przykładów. W tym rozdziale do zademonstrowania użycia operatorów i funkcji wykorzystano kwerendy, jednak zasady omawiane w ćwiczeniach zamieszczonych w niniejszym rozdziale mają zastosowanie wszędzie, gdzie w Accessie stosuje się operatory i wyrażenia. Wyjściową bazę danych dla tego rozdziału, Rozdział09.accdb, można pobrać z witryny poświęconej tej książce.
Wprowadzenie w tematykę operatorów Operatory pozwalają porównywać wartości, łączyć łańcuchy tekstu, formatować dane i wykonywać rozmaite inne zadania. Operatorów używamy po to, by poinstruować Accessa, aby wykonał określone działanie w odniesieniu do jednego lub większej liczby operandów. Kombinację operatorów i operandów określa się jako wyrażenie.
278
Część III Kwerendy Accessa W tym rozdziale bardzo często będziemy spotykali się z terminem wartościowanie (ang. evaluation). Kiedy Access napotyka pole, wyrażenie, zmienną itp., to określa wartość tego elementu i wewnętrznie się nią posługuje. Wyrażenia należy tworzyć w taki sposób, aby Access prawidłowo wyznaczał ich wartość. Jeśli Access nieprawidłowo obliczy wartość wyrażenia, to aplikacja nie będzie działała zgodnie z oczekiwaniami. Zrozumienie sposobu, w jaki Access określa wartości kryteriów kwerend i wyrażeń używanych w kodzie VBA, ma kluczowe znaczenie dla odniesienia sukcesu w roli programisty aplikacji Accessa.
Operatorów używa się za każdym razem, kiedy tworzy się równanie w Accessie. Operatory służą np. do sprawdzania poprawności danych we właściwościach tabeli, tworzenia pól obliczeniowych w formularzach i raportach oraz określania kryteriów w kwerendach.
Typy operatorów Operatory można pogrupować na następujące typy:
operatory matematyczne,
operatory porównań,
operatory łańcuchowe,
operatory logiczne,
operatory różne.
Operatory matematyczne Operatory matematyczne określa się również mianem „operatory arytmetyczne”, ponieważ stosowane są do wykonywania obliczeń arytmetycznych. Z definicji służą do pracy z liczbami (operandy to liczby). Działają na dowolnym liczbowym typie danych. Może to być wartość stała, wartość zmiennej albo zawartość pola. Liczb można używać pojedynczo albo łączyć je w celu utworzenia wyrażeń złożonych. Istnieje siedem podstawowych operatorów matematycznych. +
dodawanie
–
odejmowanie
*
mnożenie
/
dzielenie
\
dzielenie całkowite
^
potęgowanie
Mod
modulo
Operatory matematyczne omawiane w tym punkcie zwykle stosuje się w polach obliczeniowych. Szczegółowy opis pól tego rodzaju znajdziesz w rozdziale 12.
Rozdział 9. Stosowanie operatorów i wyrażeń
279
Operator dodawania: +
Aby utworzyć pole obliczeniowe w kwerendzie, która dodaje wartość podatku do ceny netto, można użyć wyrażenia w postaci zamieszczonej poniżej: [Podatek] + [Cena]
Operator odejmowania: –
Operator odejmowania (znak minus –) realizuje proste odejmowanie, np. przy obliczaniu ostatecznej kwoty faktury z uwzględnieniem rabatu: [Cena] - ([Cena] * [ProcentRabatu])
Choć nawiasy nie są operatorami matematycznymi, odgrywają kluczową rolę w wielu wyrażeniach. Wyjaśniono to w podrozdziale „Priorytety operatorów”.
Operator mnożenia: *
Operatora mnożenia (*) używa się na przykład po to, aby obliczyć łączną cenę w przypadku kupowania kilku sztuk tego samego towaru. Można zaprojektować kwerendę wyświetlającą liczbę kupionych sztuk i cenę za sztukę, a dalej umieścić kolumnę zawierającą wartość uzyskaną z pomnożenia liczby sztuk i ceny za sztukę. Takie wyrażenie może mieć następującą postać: [Liczba] * [Cena]
Operator dzielenia: /
Operator dzielenia (/) służy do dzielenia dwóch liczb. Przypuśćmy, że w określonym tygodniu 212 osób wygrało na loterii łączną kwotę 1 000 000 złotych. Wyrażenie, które oblicza wygraną każdej osoby (4716,98 złotych), ma następująca postać: 1000000 / 212
Zwróć uwagę, że liczba 1000000 została zapisana bez separatorów tysięcy. Access nie potrafi wykonywać działań matematycznych na wartościach liczbowych zapisanych ze znakami interpunkcyjnymi. Operator dzielenia całkowitego: \
Operator dzielenia całkowitego (\) pobiera dowolne dwie liczby (liczba1 i liczba2), zaokrągla je w górę lub w dół do liczb całkowitych, dzieli pierwszą liczbę przez drugą (liczba1 / liczba2), a następnie odcina część ułamkową wyniku, pozostawiając tylko wartość całkowitą. Oto kilka przykładów ilustrujących różnice między dzieleniem całkowitym a zwykłym dzieleniem: Zwykłe dzielenie
Dzielenie z konwersją do liczb całkowitych
100 / 6 = 16,667
100 \ 6 = 16
100,9 / 6,6 = 15,288
100,9 \ 6,6 = 14
102 / 7 = 14,571
102 \ 7 = 14
280
Część III Kwerendy Accessa Access zaokrągla liczby według zasady znanej jako „zaokrąglenie bankiera” albo „zaokrąglaj połowę do parzystej”. Zaokrąglanie zawsze wykonywane jest do najbliższej liczby parzystej. Tak więc liczba 6,5 po zaokrągleniu ma wartość 6, natomiast liczba 7,5 po zaokrągleniu ma wartość 8. Oczywiście zasada ta obowiązuje tylko wtedy, kiedy wartość zaokrąglanej liczby znajduje się dokładnie pośrodku pomiędzy dwiema liczbami całkowitymi. Jak można się spodziewać, liczba 6,51 po zaokrągleniu ma wartość 7, natomiast 6,49 ma wartość 6. Operator potęgowania: ^
Operator potęgowania (^) podnosi liczbę do potęgi określonej przez wykładnik. Podniesienie do potęgi oznacza pomnożenie liczby przez samą siebie. Na przykład mnożenie 4 × 3 4 × 4 (tzn. 4 ) odpowiada formule 4 ^ 3. Wykładnik nie musi być liczbą całkowitą. Może to być nawet liczba ujemna. Na przykład wyrażenie 2 ^ 2.1 zwraca wartość 4,28709385014517, natomiast 4 ^ –2 zwraca wartość 0,0625. Operator reszty z dzielenia: Mod
Operator modulo (Mod) pobiera dowolne dwie liczby (liczba1 i liczba2), zaokrągla je w górę lub w dół do liczb całkowitych, dzieli pierwszą liczbę przez drugą (liczba1 / liczba2) i zwraca resztę z dzielenia. Oto kilka przykładów ilustrujących różnice między dzieleniem modulo a zwykłym dzieleniem: Zwykłe dzielenie
Dzielenie modulo
Objaśnienie
10 / 5 = 2
10 Mod 5 = 0
10 dzieli się przez 5 bez reszty
10 / 4 = 2,5
10 Mod 4 = 2
10 / 4 = 2 z resztą 2
22,24 / 4 = 5,56
22,24 Mod 4 = 2
22 / 4 = 5 z resztą 2
22,52 / 4 = 5,63
22,52 Mod 4 = 3
23 / 4 = 5 z resztą 3
Wynik dzielenia modulo to reszta po całkowitoliczbowym podzieleniu operandów przez siebie. Operator Mod jest często wykorzystywany do określania, czy liczba jest parzysta, czy nieparzysta. Aby się o tym dowiedzieć, wystarczy podzielić liczbę modulo 2: 5 Mod 2 = 1 4 Mod 2 = 0
Jeśli działanie Mod zwraca 1, to dzielna jest liczbą nieparzystą. Jeśli działanie Mod zwraca 0, to dzielna jest liczbą parzystą. Operatory porównań Operatory z tej grupy porównują dwie wartości lub dwa wyrażenia za pośrednictwem równania. W Accessie dostępnych jest sześć podstawowych operatorów porównania: =
równy
<>
nierówny
<
mniejszy
<=
mniejszy lub równy
>
większy
>=
większy lub równy
Rozdział 9. Stosowanie operatorów i wyrażeń
281
Wartością wyrażeń z operatorami porównań zawsze jest True, False lub Null. Wartość Null jest zwracana w przypadku, kiedy nie można określić wartości wyrażenia. Podczas lektury poniższych objaśnień należy pamiętać, że w Accessie w większości przypadków wielkość liter nie ma znaczenia. Na przykład ciągi znaków "OSOBOWY", "Osobowy" i "osobowy" są dla Accessa identyczne. W Accessie wyrażenia z operatorami porównań w rzeczywistości zwracają wartości liczbowe. Liczba –1 reprezentuje True, natomiast 0 reprezentuje False.
Jeśli dowolna strona równania ma wartość Null, wynikiem zawsze jest Null. Operator równości: =
Operator równości (=) zwraca wartość logiczną True, jeśli porównywane wyrażenia są takie same. Oto przykład: Kategoria = "Osobowe"
Zwraca wartość True, jeśli pole Kategoria ma wartość "Osobowe". Dla innych kategorii zwraca False.
DataSprzedaży = Date()
Zwraca True, jeśli w polu DataSprzedaży jest data dzisiejsza, oraz False dla pozostałych dat.
Operator nierówności: <>
Operator nierówności (<>) to przeciwieństwo operatora równości. Oto przykład: Kategoria <> "Osobowe" Zwraca True, jeśli produkt należy do kategorii innej niż "Osobowe". Zwraca False tylko wtedy, gdy pole Kategoria ma wartość "Osobowe". Operator mniejszości: <
Operator mniejszości (<) zwraca wartość logiczną True, jeśli lewa strona równania jest mniejsza od strony prawej, jak w poniższym przykładzie: Cena < 1000
Zwraca True, jeśli pole Cena zawiera wartość mniejszą niż 1000, i False, jeśli pole Cena zawiera wartość większą niż 1000 lub jej równą.
Co ciekawe, operator mniejszości można swobodnie stosować w odniesieniu do ciągów znaków (podobnie jak większość operatorów porównań). Na przykład poniższe wyrażenie zwraca False: "Mężczyzna" < "Kobieta"
Nie ma w tym żadnej filozofii — w przypadku operandów będących ciągami znaków Access wykonuje porównywanie znak po znaku. Ponieważ litera M znajduje się w alfabecie za literą K, słowo „mężczyzna” nie jest mniejsze niż słowo „kobieta”. Możliwość porównywania ciągów znaków jest bardzo cenna podczas sortowania danych tekstowych albo porządkowania nazw w określonej kolejności. W ciągach znaków w Accessie nie ma znaczenia wielkość liter, dlatego ciąg XYZ nie jest większy od xyz.
282
Część III Kwerendy Accessa
Przy porównywaniu liczb zapisanych jako tekst wyniki mogą być niezgodne z oczekiwaniami. Na przykład wartość 9 zostanie uznana za większą niż 10, ponieważ cyfra 1 znajduje się przed cyfrą 9. Operator mniejszości lub równości: <=
Operator mniejszości lub równości (<=) zwraca wartość logiczną True, jeśli operand po lewej stronie równania jest mniejszy lub równy względem operandu po stronie prawej, tak jak w poniższym przykładzie: Cena <= 2500
Zwraca True, jeśli Cena równa się 2500 lub jest mniejsza niż 2500. Zwraca False dla dowolnej wartości Cena, która jest większa od 2500.
Operatory porównań należy odpowiednio zapisywać. Access zgłasza błąd, jeśli wpiszemy =<. Kolejność znaków w zapisie operatorów ma znaczenie, zatem trzeba najpierw wpisać znak mniejszości, a potem równości: <=. Operator większości: >
Operator większości (>) to przeciwieństwo operatora mniejszości. Operator ten zwraca True, jeśli operand po lewej stronie równania jest większy niż operand po stronie prawej. Oto przykład: StawkaPodatkowa > 3.5
Zwraca True, jeśli wartość pola StawkaPodatkowa zawiera wartość większą niż 3,5, i False, kiedy StawkaPodatkowa jest mniejsza lub równa 3,5.
Operator większości lub równości: >=
Operator większości lub równości (>=) zwraca True, jeśli lewa strona równania jest większa lub równa prawej stronie. Oto przykład: StawkaPodatkowa >= 5
Zwraca wartość True, jeśli StawkaPodatkowa ma wartość 5 bądź większą. Zwraca False, jeżeli StawkaPodatkowa ma wartość mniejszą niż 5.
Operatory łańcuchowe W Accessie są dostępne trzy operatory łańcuchowe wykorzystywane do pracy z ciągami znaków. W odróżnieniu od operatorów matematycznych i logicznych operatory łańcuchowe zostały specjalnie zaprojektowane do pracy z danymi typu tekstowego: & konkatenacja operandów Like
operandy są podobne
Not Like
operandy nie są podobne
Operator konkatenacji: &
Operator konkatenacji łączy dwa lub więcej obiektów w wynikowy łańcuch. W pewnym sensie konkatenacja przypomina dodawanie. Jednak w odróżnieniu od dodawania zawsze zwraca ciąg znaków: [Imię] & [Nazwisko]
Rozdział 9. Stosowanie operatorów i wyrażeń
283
W zwracanym ciągu znaków pomiędzy imieniem a nazwiskiem nie ma spacji. Jeśli pole [Imię] ma wartość "Jerzy", a pole [Nazwisko] wartość "Kowalski", to operacja konkatenacji zwróci łańcuch "JerzyKowalski". Aby dodać spację między imieniem a nazwiskiem, trzeba ją po prostu dodać pomiędzy operandami tak, jak pokazano poniżej: [Imię] & " " & [Nazwisko]
Operator konkatenacji może łączyć obiekt tekstowy z obiektem liczbowym albo datą. Dzięki temu nie trzeba używać specjalnych funkcji do przekształcania liczb lub dat na postać tekstową. Przypuśćmy, że mamy pole tekstowe (NazwaUlicy) oraz pole z liczbą (NumerDomu) i chcemy zbudować wyrażenie łączące zawartość obu pól: [NazwaUlicy] & " " & [NumerDomu]
Jeśli NumerDomu ma wartość 45, a NazwaUlicy to "ulica Akacjowa", ich połączenie da następujący wynik: "ulica Akacjowa 45"
Zwracany ciąg znaków został ujęty w cudzysłów dla zwiększenia czytelności.
Przypuśćmy, że chcemy umieścić w stopce raportu pole NazwiskoOperatora oraz datę i czas sporządzenia raportu. Można to zrobić za pomocą następującego wyrażenia: [NazwiskoOperatora] & " wydrukował ten raport " & Now()
Zwróćmy uwagę na spację przed słowem „wydrukował” i za słowem „raport”. Jeśli jest 21 marca 2012 roku, godzina 16.45, powyższy wiersz wyświetli tekst zbliżony do poniższego: Mariusz Kwiatkowski wydrukował ten raport 21.03.12 16:45:40
Konkatenację można także zrealizować za pomocą operatora dodawania (+). Na przykład aby połączyć pola Imię i Nazwisko z tabeli klientów tak, aby wyświetlić je jako pojedynczy ciąg znaków, można skorzystać z wyrażenia: [Imię] + [Nazwisko]
Znajomość działania operatora konkatenacji ułatwia tworzenie i modyfikowanie wyrażeń w bazie danych. Jeśli zawsze używa się operatora łączenia (&) zamiast operatora dodawania (+) do tworzenia łańcuchów tekstowych, nie trzeba się martwić typami danych łączonych obiektów. Każda formuła zawierająca operator & automatycznie przekształca wszystkie łączone obiekty w tekstowy typ danych. Stosowanie operatora dodawania (+) do łączenia ciągów znaków czasami może powodować nieprzewidziane wyniki, ponieważ Access musi stwierdzić, czy operandy są liczbami, czy ciągami znaków, i na tej podstawie wykonać właściwe działania. Operator konkatenacji wymusza interpretowanie operandów jako ciągów znaków i powoduje, że wynik zawsze jest ciągiem znaków.
284
Część III Kwerendy Accessa
Chociaż w roli operatora konkatenacji można wykorzystać zarówno znak ampersand (&), jak i znak plus (+), stosowanie plusa w niektórych sytuacjach może prowadzić do uzyskiwania nieoczekiwanych wyników. Konkatenacja dwóch wartości z zastosowaniem operatora & zawsze zwraca ciąg znaków. Operandami operatora konkatenacji mogą być ciągi znaków, liczby, daty i godziny albo odwołania do pól, ale wynik zawsze jest ciągiem znaków. Ponieważ ampersand zawsze zwraca ciąg znaków, często wykorzystuje się go w celu zabezpieczenia przed generowaniem błędów Invalid use of null powstających podczas pracy z danymi, które mogą mieć wartość null. Załóżmy na przykład, że w formularzu Accessa jest pole tekstowe, które może, lecz nie musi zawierać wartości, gdyż nie mamy pewności, czy użytkownik wprowadził w nim jakieś dane. Podczas podstawiania zawartości pola tekstowego do zmiennej (zmienne zostaną szczegółowo omówione w rozdziale 10.) niektórzy programiści wykorzystują konkatenację pustego ciągu znaków z zawartością pola tekstowego: MojaZmienna = txtNazwisko & ""
Dzięki zastosowaniu operatora & mamy pewność, że nawet jeśli pole tekstowe zawiera wartość null, to do zmiennej będzie przypisany ciąg znaków i nie powstanie błąd. Z kolei operacja konkatenacji z operatorem plus zwraca null, jeśli jeden z operandów ma wartość null: MojaZmienna = txtNazwisko + ""
W tym przypadku, jeśli pole tekstowe txtNazwisko ma wartość null, może dojść do powstania błędu Invalid use of null. Wynikiem konkatenacji jest bowiem wartość null (oczywiście przy założeniu, że pole txtNazwisko zawiera wartość null). Doświadczeni programiści Accessa rezerwują operator + dla działań arytmetycznych, natomiast do konkatenacji ciągów znaków zawsze używają operatora &. Operatory Like (podobny do) oraz Not Like
Operator Like oraz jego przeciwieństwo, operator Not Like, służą do porównywania dwóch wyrażeń tekstowych. Operatory te ustalają, czy jedno wyrażenie pasuje, czy też nie pasuje do wzorca przechowywanego w drugim wyrażeniu. Wynikiem tego porównania jest wartość True, False lub Null. W działaniach Like oraz Not Like nie ma znaczenia wielkość liter. Operator Like ma następującą składnię: wyrażenie Like wzorzec
Operator Like szuka wyrażenia wyrażenia we wzorcu. Jeśli wyrażenie występuje we wzorcu, operator zwraca wartość True. Oto przykład: [Imię] Like "Jerzy"
Zwraca True, jeśli pole Imię ma wartość "Jerzy".
[Nazwisko] Like "KOWAL*"
Zwraca True, jeśli Nazwisko to Kowal, Kowalski lub dowolne inne zaczynające się od Kowal, niezależnie od wielkości liter. (Symbole wieloznaczne, takie jak np. *, zostaną omówione w ramce „Symbole wieloznaczne”).
Rozdział 9. Stosowanie operatorów i wyrażeń [Województwo] Not Like "Mazowieckie"
285
Zwraca True dla każdego województwa z wyjątkiem mazowieckiego.
Jeśli którekolwiek wyrażenie w formule Like ma wartość Null, wynikiem jest Null.
Operatory Like i Not Like to wartościowe oraz elastyczne narzędzia do porównywania ciągów znaków. Możliwości używania operatora Like są zwiększane dzięki symbolom wieloznacznym. Symbole wieloznaczne W poniższej tabeli zaprezentowano pięć symboli wieloznacznych, które można wykorzystywać z operatorem Like. Symbol
Przeznaczenie
?
Jeden znak (0 – 9, Aa – Zz)
*
Dowolna liczba znaków (od 0 do n)
#
Jedna cyfra (0 – 9)
[lista]
Jeden dowolny znak spośród tych, które znajdują się na liście
[!lista]
Jeden dowolny znak spośród tych, które nie znajdują się na liście
W zapisie [lista] lub [!lista] można użyć myślnika między dwoma znakami, aby określić zakres. Oto kilka przykładów: [tblKlienci].[Nazwisko] Like "Ko*"
Zwraca True w przypadku każdego nazwiska, które zaczyna się od „Ko” lub „KO”. Wszystkie ciągi znaków, które nie rozpoczynają się od „Ko” lub „KO”, zwracają False.
[Odpowiedź] Like "[A-D]"
Zwraca True, jeśli odpowiedź brzmi: A, B, C, D, a, b, c lub d. Wszystkie pozostałe litery zwracają False.
"AB1989" Like "AB####"
Zwraca True, ponieważ łańcuch zaczyna się od liter „AB”, po których następują cztery cyfry.
[Nazwisko] Not Like "[A,E,I,O,U]*"
Zwraca True dla nazwisk, które nie zaczynają się na samogłoskę. Kowalski i Jankowski zwracają True, Adamski i Oleksiak zwracają False.
[Miasto] Like "?????"
Zwraca True dla nazwy każdego miasta składającej się z pięciu liter.
286
Część III Kwerendy Accessa Jeśli wzorzec, który chcemy dopasować, zawiera znak symbolu wieloznacznego, należy ująć go w nawiasy kwadratowe. W powyższym przykładzie zastosowanie zapisu [*] we wzorcu powoduje, że gwiazdka na trzeciej pozycji jest interpretowana literalnie. "AB*Co" Like "AB[*]C*"
Ponieważ gwiazdka została ujęta w nawiasy kwadratowe, Access nie pomyli jej z gwiazdką — symbolem wieloznacznym.
Operatory logiczne Operatory logiczne służą do definiowania złożonych warunków w wyrażeniach. Podobnie jak operatory porównań, zawsze zwracają wartości True, False lub Null. Oto operatory logiczne: And
Zwraca TRUE, jeśli Wyrażenie1 i Wyrażenie2 mają wartość TRUE.
Or
Zwraca TRUE, jeśli Wyrażenie1 lub Wyrażenie2 ma wartość TRUE (wartość tę mogą mieć oba wyrażenia).
Not
Zwraca TRUE, jeśli Wyrażenie ma wartość inną niż TRUE.
Xor
Zwraca TRUE, jeśli Wyrażenie1 lub Wyrażenie2 ma wartość TRUE (wartości tej nie mogą mieć oba wyrażenia).
Eqv
Zwraca TRUE, jeśli Wyrażenie1 i Wyrażenie2 mają tę samą wartość (TRUE lub FALSE).
Imp
Przeprowadza porównanie bitów z tych samych pozycji z dwóch wyrażeń liczbowych.
Operator And
Operator And służy do wykonywania logicznej koniunkcji dwóch wyrażeń. Zwraca True, gdy oba wyrażenia mają wartość True. Ogólna składnia operacji And to: wyrażenie1 And wyrażenie2
Oto przykład: [tblKlienci].[Województwo] = "Mazowieckie" And [tblKlienci].[KodPocztowy] = "00-212".
Zwraca True tylko wtedy, gdy oba wyrażenia mają wartość True.
Sposób działania operacji And zależy od tego, w jaki sposób Access określi wartość dwóch operandów. W tabeli 9.1 opisano wszystkie możliwe wyniki w przypadkach, kiedy operandy mają wartości True lub False. Zwróćmy uwagę, że operator And zwraca True tylko wtedy, gdy oba operandy mają wartość True. Operator Or
Operator Or służy do obliczania logicznej dysjunkcji dwóch wyrażeń. Zwraca wartość True, jeśli dowolny z warunków zwraca True. Ogólna składnia operacji Or to: Wyrażenie1 Or Wyrażenie2
Rozdział 9. Stosowanie operatorów i wyrażeń
287
Tabela 9.1. Wyniki działania operatora And Wyrażenie1
Wyrażenie2
Wyrażenie1 And Wyrażenie2
True
True
True
True
False
False
True
Null
Null
False
True
False
False
False
False
False
Null
False
Null
True
Null
Null
False
False
Null
Null
Null
Działanie operatora Or ilustrują poniższe przykłady: [Nazwisko] = "Janik" Or [Nazwisko] = "Górski"
Zwraca True, jeśli nazwisko brzmi „Janik” lub „Górski”.
[StrefaPodatkowa] = "Łódzkie" Or [StrefaPodatkowa] = "Warmińskie"
Zwraca True, jeśli strefa podatkowa to „Łódzkie” albo „Warmińskie”.
Operator Or (podobnie jak And) zwraca True lub False w zależności od tego, w jaki sposób Access określi wartości operandów. W tabeli 9.2 przedstawiono wszystkie możliwe kombinacje wartości dwóch operandów. Zwróćmy uwagę, że operator Or zwraca False tylko wtedy, gdy oba operandy mają wartość False. Tabela 9.2. Wyniki działania operatora Or Wyrażenie1
Wyrażenie2
Wyrażenie1 Or Wyrażenie2
True
True
True
True
False
True
True
Null
True
False
True
True
False
False
False
False
Null
Null
Null
True
True
Null
False
Null
Null
Null
Null
Operator Not
Operator Not służy do negowania wyrażenia liczbowego lub logicznego. Zwraca wartość True, jeśli wyrażenie ma wartość False, i wartość False, jeśli wyrażenie ma wartość True. Ogólna składnia operacji Not to: Not wyrażenie [liczbowe | logiczne]
288
Część III Kwerendy Accessa
Przykład użycia operatora Not zaprezentowano poniżej: Not [Cena] <= 100000
Zwraca True, jeśli cena jest większa niż 100 000.
If Not (Miasto = "Szczecin") Then
Zwraca True dla dowolnego miasta z wyjątkiem Szczecina.
Jeśli operand ma wartość Null, operator Not zwraca wartość Null. Wszystkie możliwe wyniki działania operatora Not zestawiono w tabeli 9.3. Tabela 9.3. Wyniki działania operatora Not Wyrażenie
Not Wyrażenie
True
False
False
True
Null
Null
Operatory różne Access ma trzy bardzo przydatne operatory do obsługi różnych typów danych: Between...And
zakres
In
porównanie z listą
Is
słowo zarezerwowane
Operator Between...And
Operator Between...And pozwala ustalić, czy wartość wyrażenia należy do określonego zakresu wartości. wyrażenie Between wartość1 And wartość2
Jeśli wartość wyrażenia mieści się w zakresie między wartość1 a wartość2, wynikiem jest True, a w przeciwnym razie — False. Warto zauważyć, że operator Between...And zwraca True także dla wartości równych wartościom skrajnym, czyli działa podobnie jak operatory >= i <=. Przykłady użycia operatora Between...And zaprezentowano poniżej: [ŁącznaCena] Between 10000 And 19999
Zwraca True, jeśli pole ŁącznaCena ma wartość z zakresu pomiędzy 10 000 i 19 999 lub wynosi 10 000 bądź 19 999.
[DataSprzedaży] Between #1/1/2012# and #12/31/2012#
Zwraca True, jeśli pole DataSprzedaży odpowiada dacie z 2012 roku.
Wraz z operatorem Between...And można także używać operatora Not w celu zanegowania logiki: Not [DataSprzedaży] Between #1/1/2012# and #12/31/2012#
Zwraca True, jeśli pole DataSprzedaży odpowiada dacie spoza pierwszego kwartału 2012 roku.
Rozdział 9. Stosowanie operatorów i wyrażeń
289
Operator In
Operator In pozwala ustalić, czy wyrażenie ma wartość równą którejkolwiek z wartości podanych na liście. Ogólna składnia operatora In jest następująca: wyrażenie In (wartość1; wartość2; wartość3; ...)
Jeśli wartość wyrażenia zostanie znaleziona na liście, wynikiem jest True, a w przeciwnym razie — False. W poniższym przykładzie użyto operatora In jako kryterium dla pola Kategoria w kwerendzie: In ("SUV-y"; "Ciężarówki")
Kwerenda wyświetli tylko te pojazdy, które należą do kategorii "SUV-y" lub "Ciężarówki". Z operatora In można także korzystać w języku VBA. If [tblKlienci].[Miasto] In("Szczecin", "Toruń") Then
W tym przypadku treść instrukcji If...Then...Else będzie wykonana tylko wtedy, gdy pole Miasto ma wartość "Szczecin" lub "Toruń". Wartość zwracaną przez operację In można zanegować za pomocą słowa kluczowego Not: If strMiasto Not In ("Malbork", "Sztum") Then
W tym przypadku treść instrukcji If...Then...Else będzie wykonana tylko wtedy, gdy zmienna strMiasto ma wartość inną niż "Malbork" albo "Sztum". Operator Is
Operatora Is używa się zwykle w połączeniu ze słowem kluczowym Null, aby ustalić, czy wartość wyrażenia to Null. wyrażenie Is Null
W języku VBA operator Is można wykorzystać do porównywania różnych obiektów w celu stwierdzenia, czy są identyczne. Przykład użycia operatora Is zamieszczono poniżej: [Nazwisko] Is Null
Zwraca True, jeśli pole Nazwisko ma wartość Null. Zwraca False, jeśli w polu Nazwisko znajduje się jakakolwiek inna wartość.
Warto zwrócić uwagę, że operator Is ma zastosowanie tylko do obiektów i zmiennych obiektowych, np. pól w tabelach. Operatora Is nie można wykorzystywać ze zmiennymi typów prostych, np. ciągami znaków lub liczbami.
Priorytety operatorów Podczas pracy ze skomplikowanymi wyrażeniami zawierającymi wiele operatorów Access musi ustalić, który składnik wyrażenia obliczyć jako pierwszy, który jako drugi itd. W tym celu wykonuje działania z dobrze znaną, z góry ustaloną kolejnością działań
290
Część III Kwerendy Accessa
matematycznych i logicznych. Kolejność tę określa się mianem priorytetu operatorów. Access zawsze oblicza wyrażenia w takiej kolejności, chyba że użyje się nawiasów, aby określić inną kolejność. Operacje w nawiasach są wykonywane przed wszystkimi operacjami poza nawiasami. Wewnątrz nawiasów stosuje się domyślny priorytet operatorów. Priorytet określa się najpierw według kategorii operatora. Oto ranga operatorów według malejącego priorytetu: 1. matematyczne 2. porównania 3. logiczne Każda kategoria ma wewnętrzne priorytety operatorów, co wyjaśniamy w poniższych punktach. Priorytety operatorów matematyczny W kategorii operatorów matematycznych obowiązują następujące priorytety: 1. potęgowanie 2. negacja 3. mnożenie i (lub) dzielenie (od lewej do prawej) 4. dzielenie całkowite 5. dzielenie modulo 6. dodawanie i (lub) odejmowanie (od lewej do prawej) 7. łączenie ciągów znaków Priorytety operatorów porównania Operatory porównania mają następujący priorytet: 1. równy 2. nierówny 3. mniejszy 4. większy 5. mniejszy lub równy 6. większy lub równy 7. Like
Rozdział 9. Stosowanie operatorów i wyrażeń
291
Priorytety operatorów logicznych W kategorii operatorów logicznych obowiązuje następujący priorytet: 1. Not 2. And 3. Or 4. Xor 5. Eqv 6. Imp
Stosowanie operatorów i wyrażeń w kwerendach Jednym z najbardziej powszechnych zastosowań operatorów i wyrażeń jest tworzenie kryteriów w złożonych kwerendach. Dzięki dokładnemu zrozumieniu sposobu tworzenia tych konstrukcji proces budowania skomplikowanych kwerend zwracających przydatne wyniki będzie łatwiejszy. Niniejszy podrozdział jest poświęcony tematyce tworzenia kryteriów kwerend z wykorzystaniem operatorów i wyrażeń. Niektóre informacje w pozostałej części tego rozdziału pokrywają się z zagadnieniami omawianymi wcześniej, ale w kontekście projektowania kwerend. Umiejętność określania kryteriów ma kluczowe znaczenie dla projektowania i pisania efektywnych kwerend. Choć kwerendy mogą odwoływać się do jednej tabeli i używać tylko jednego kryterium, większość kwerend wydobywa informacje z wielu tabel na podstawie bardziej złożonych kryteriów. Ze względu na tę złożoność kwerendy powinny pobierać tylko te dane, które są nam potrzebne, w określonej kolejności. Można na przykład wybrać i wyświetlić dane z bazy danych w celu uzyskania następujących informacji:
Wszyscy nabywcy samochodów Chevrolet albo ciężarówek Ford.
Wszyscy nabywcy, którzy kupili coś w ciągu ostatnich 60 dni.
Wszystkie transakcje na kwotę większą niż 90 złotych.
Liczba klientów w każdym województwie.
Klienci, którzy zgłosili uwagi lub zażalenia.
W miarę rozwoju systemu baz danych użytkownicy żądają różnych danych podobnych do tych, które wymieniliśmy powyżej. Używając operatorów i wyrażeń, tworzy się złożone kwerendy wybierające, które umożliwiają ograniczenie liczby zwracanych rekordów. W tym podrozdziale omówiono kwerendy wybierające, które wykorzystują operatory i wyrażenia. W dalszej części książki wykorzystamy tę wiedzę do pracy z formularzami, raportami i kodem VBA.
292
Część III Kwerendy Accessa
Szczegółowy opis pracy z kwerendami zamieszczamy w rozdziale 8.
Używanie operatorów porównania w kwerendach Pracując z kwerendami wybierającymi, czasem trzeba określić jedno lub więcej kryteriów, aby ograniczyć zakres wyświetlanych informacji. Kryteria określa się za pomocą operatorów porównania w równaniach i obliczeniach. Operatory dzielą się na następujące kategorie: matematyczne, relacyjne, logiczne i tekstowe. W kwerendach wybierających operatorów używa się w komórkach Pole: lub Kryteria: obszaru zapytania przez przykład (ang. Query by Example — QBE). Najpopularniejsze operatory wykorzystywane w kwerendach wybierających przedstawiono w tabeli 9.4. Tabela 9.4. Operatory często używane w kwerendach wybierających Matematyczne
Relacyjne
Logiczne
Tekstowe
Różne
* (mnożenie)
= (równy)
And
& (konkatenacja)
Between...And
/ (dzielenie)
<> (nierówny)
Or
Like
In
+ (dodawanie)
> (większy)
Not
Not Like
Is Null
– (odejmowanie)
< (mniejszy)
Is Not Null
Za pomocą tych operatorów można wyszukać między innymi następujące grupy rekordów:
Rekordy produktów zawierające zdjęcie.
Zakres rekordów, np. wszystkie transakcje od listopada do stycznia.
Rekordy spełniające kryteria And oraz Or, np. wszystkie rekordy, które są samochodami i nie są ciężarówką ani samochodem terenowym.
Wszystkie rekordy, które nie pasują do określonej wartości, np. dowolny produkt, który nie jest samochodem.
Kiedy dodajemy kryterium do kwerendy, używamy odpowiedniego operatora wraz z przykładem tego, czego szukamy. Na rysunku 9.1 przykładem są samochody Osobowe. Operator to znak równości (=). Zauważmy, że znaku równości nie pokazano na rysunku, bowiem znak ten jest domyślnym operatorem dla kwerend wybierających.
Tworzenie złożonych kryteriów Złożone kryteria kwerend można budować, wykorzystując dowolną kombinację operatorów przedstawionych w tabeli 9.4. W wielu kwerendach złożone kryteria zawierają liczne operatory And i Or, tak jak w poniższych przykładach:
Województwem musi być mazowieckie lub zachodniopomorskie.
Miastem musi być Konin i województwem musi być wielkopolskie.
Województwem musi być opolskie lub pomorskie i miastem musi być Brzeg.
Rozdział 9. Stosowanie operatorów i wyrażeń
293
Rysunek 9.1. Siatka QBE pokazuje proste kryterium, które nakazuje wybrać wszystkie modele należące do kategorii Osobowe
Przykłady te ilustrują użycie obu operatorów logicznych: And i Or. Złożone kryteria da się często utworzyć, wpisując przykładowe dane w różnych komórkach siatki QBE, tak jak pokazano na rysunku 9.2, gdzie kryteria wprowadzono zarówno w kolumnie State, jak i w kolumnie Category. W kolumnie State kryteria określają „mazowieckie lub zachodniopomorskie”, natomiast w kolumnie Category jest dodatkowe kryterium: „inne niż osobowe”. Po uwzględnieniu kryteriów w obu kolumnach kwerenda zwraca tylko rekordy odpowiadające klientom z województw mazowieckiego albo zachodniopomorskiego oraz produktom z innych kategorii niż samochody osobowe.
Rysunek 9.2. Używanie kryteriów And i Or w kwerendach
Bezpośrednie używanie operatorów logicznych nie jest jednak jedynym sposobem wybierania rekordów na podstawie wielu kryteriów. Na rysunku 9.3 zademonstrowano powszechnie stosowaną w Accessie technikę korzystania ze złożonych kryteriów całkowicie
294
Część III Kwerendy Accessa
Rysunek 9.3. Tworzenie złożonych kryteriów bez używania operatorów And i Or
bez wprowadzania słów kluczowych And i Or. W tym przykładzie kryteria zostały umieszczone jedno pod drugim w jednej kolumnie, co odpowiada użyciu operatora Or. Na przykład w kolumnie State kryteria można zinterpretować jako "Śląskie" Or "Mazowieckie". Obecność kryteriów w innej kolumnie siatki QBE implikuje użycie operatora And. Dlatego kryteria z kolumny Category zostały scalone z kryteriami w kolumnie State i zinterpretowane w następujący sposób: (State = "Śląskie" And Category <> "Osobowe") Or (State = "Mazowieckie" And Category <> "Osobowe")
Kwerendy z rysunków 9.2 i 9.3 są równoważne i zwracają takie same dane. Jednym ze skomplikowanych aspektów kwerendy z rysunku 9.3 jest konieczność dwukrotnego zdefiniowania kryterium w kolumnie Category — raz dla każdej wartości w kolumnie State. Gdyby kryterium dla kolumny Category występowało tylko raz — na przykład w tym samym wierszu co Zachodniopomorskie w kolumnie State — całe kryterium zostałoby zinterpretowane w następujący sposób: (State = "Śląskie" and Category <> "Osobowe") Or (State = "Mazowieckie")
O tym, w jaki sposób utworzyć tego typu kwerendę złożoną, dowiesz się w punkcie „Wprowadzanie kryteriów w wielu polach” w dalszej części tego rozdziału. W obszarze siatki QBE kryteria And wpisuje się w tym samym wierszu, natomiast kryteria Or wpisuje się w różnych wierszach.
Access przekształca tę graficzną kwerendę w pojedynczą instrukcję SELECT języka SQL, która pobiera informacje z tabel. Aby zmienić zawartość okna i wyświetlić instrukcję SQL-a SELECT (pokazaną na rysunku 9.4), należy kliknąć strzałkę rozwijanej listy w grupie Widok na wstążce i wybrać polecenie Widok SQL. Access tworzy instrukcję SQL-a na podstawie pól i kryteriów wprowadzonych w obszarze siatki QBE (zobacz rysunek 9.3).
Rozdział 9. Stosowanie operatorów i wyrażeń
295
Rysunek 9.4. Widok SQL odpowiadający kwerendzie z rysunku 9.3. Zwróćmy uwagę, że instrukcja SQL-a zawiera jeden operator OR oraz dwa operatory AND (wewnątrz klauzuli WHERE)
Instrukcja SQL-a z rysunku 9.4 jest podzielona na części, żeby była bardziej czytelna. Po otwarciu okna SQL-a wyświetla się jedna długa instrukcja zajmująca kilka wierszy — bez przerw pomiędzy poszczególnymi częściami. Wyrażenie określające kryterium dla tej kwerendy ma następującą postać: (tblCustomers.State = "Zachodniopomorskie" AND tblProducts.Category <> "Osobowe") OR (tblCustomers.State = "Mazowieckie" AND tblProducts.Category <> "Osobowe")
Kryterium dla kategorii (<> "Osobowe") należy wprowadzić dla każdego województwa w siatce QBE, tak jak pokazano na rysunku 9.3. Z dalszej części tego rozdziału, w punkcie „Wprowadzanie kryteriów w wielu polach”, dowiesz się, jak używać operatorów And i Or w komórce Kryteria: kwerendy, co pozwoli uniknąć wielokrotnego wypełniania tych pól. W tym przykładzie szukaliśmy wszystkich modeli, które w polu Category nie miały wartości "Osobowe". Aby znaleźć rekordy pasujące do pewnej wartości, wystarczy pominąć operator <>. Na przykład należy wpisać wyrażenie Osobowe, aby znaleźć wszystkie pojazdy będące samochodami osobowymi. Podczas tworzenia kryteriów w obszarze siatki QBE dla kwerend wybierających nie trzeba używać znaku równości (=). And i Or to najczęściej używane operatory w kryteriach złożonych. Operatory oceniają dwa różne wyrażenia (po jednym po każdej stronie operatora And lub Or) i niezależnie ustalają, czy mają one wartość True czy False. Następnie porównują ze sobą wyniki dwóch wyrażeń, aby uzyskać logiczną odpowiedź: prawda lub fałsz. Przyjrzyj się pierwszej instrukcji And z formuły z poprzedniego akapitu: (tblCustomers.State = "Zachodniopomorskie" AND tblProducts.Category <> "Osobowe")
Prawa strona wyrażenia kryterium (tblProducts.Category <> "Osobowe") przyjmuje wartość True, jeżeli pole Category ma dowolną wartość różną od "Osobowe". Operator And porównuje logiczne wartości wyrażeń z lewej i prawej strony, aby uzyskać ostateczny wynik True lub False. Pole ma wartość Null, jeśli nie ma żadnej wartości. Null oznacza, że w polu nie wprowadzono żadnych informacji. Null nie jest ani prawdą, ani fałszem, nie odpowiada też samym spacjom czy zeru — to po prostu brak wartości. Jeśli nie wpiszemy nazwy miasta w polu Miasto, Access pozostawi je puste (chyba że w projekcie tabeli zdefiniowano wartość domyślną). Tę pustkę określa się mianem Null.
Kiedy wynikiem porównania And/Or jest wartość True, cały warunek jest prawdziwy i kwerenda wyświetla rekordy spełniające kryterium.
296
Część III Kwerendy Accessa
Warto zwrócić uwagę, że operator And zwraca True tylko wtedy, gdy obie strony wyrażenia mają wartość True, natomiast operator Or zwraca wartość True wtedy, gdy którakolwiek strona ma wartość True. W rzeczywistości jedna strona może mieć wartość Null, a operator Or będzie miał wartość True, jeśli druga strona ma wartość True. Właśnie na tym polega podstawowa różnica między operatorami And i Or.
Używanie funkcji w kwerendach wybierających Podczas pracy z kwerendami można wyświetlać informacje za pomocą wbudowanych funkcji Accessa. Można na przykład wyświetlić takie elementy, jak:
Dzień tygodnia (niedziela, poniedziałek itd.) odpowiadający dacie sprzedaży.
Wszystkie nazwiska klientów wielkimi literami.
Różnica między dwoma polami daty.
Aby wyświetlić te informacje, trzeba utworzyć w kwerendzie pole obliczeniowe. Pola obliczeniowe zostały szczegółowo opisane w rozdziale 12. (a także w wielu innych miejscach w tej książce).
Odwoływanie się do pól w kwerendach wybierających Kiedy podajemy nazwę pola w kwerendzie, bardzo często należy ująć ją w nawias kwadratowy ([]). Access wymaga nawiasów dla każdej nazwy pola umieszczonej w kryterium i dla każdej nazwy pola zawierającej spacje lub znaki interpunkcyjne. Oto przykład odwołania się do pola z wykorzystaniem nawiasów kwadratowych: [tblSales].[SaleDate] + 30
W tym przykładzie dodajemy 30 dni do wartości pola SaleDate z tabeli tblSales. Jeśli pominie się nawiasy kwadratowe ([]) podczas wpisywania nazwy pola w siatce QBE, Access może umieścić ją w cudzysłowie i uznać za tekst zamiast za nazwę pola.
Wpisywanie kryteriów jednowartościowych W niektórych sytuacjach trzeba ograniczyć rekordy zwracane przez kwerendę według wartości jednego pola, jak w poniższych przykładach:
Informacje o klientach (nabywcach) mieszkających w województwie mazowieckim.
Dane o sprzedaży modeli ciężarówek.
Klienci, którzy kupili coś w styczniu.
Każda z tych kwerend wymaga kryterium jednowartościowego. Kryterium jednowartościowe polega na wprowadzeniu tylko jednego wyrażenia w siatce QBE. Wyrażeniem mogą być przykładowe dane, takie jak „Mazowieckie”, albo funkcja, taka jak DatePart("m",[Sale
Rozdział 9. Stosowanie operatorów i wyrażeń
297
Date]) = 1. Kryteria można określić dla dowolnego typu danych: Krótki tekst, Liczba, Data/Godzina itp., a nawet dla pól typu Obiekt OLE i Autonumerowanie.
Wprowadzanie kryteriów znakowych (Krótki tekst lub Długi tekst) Kryteriów znakowych używa się w polach typu Krótki tekst lub Długi tekst. Są to albo przykłady, albo informacje o zawartości pola. Na przykład aby utworzyć kwerendę zwracającą klientów mieszkających w województwie mazowieckim, wykonaj poniższe czynności: 1. Otwórz nową kwerendę bazującą na tabeli tblCustomers w widoku projektu i dodaj do siatki QBE pola FirstName, LastName i State. 2. Kliknij komórkę Kryteria: pod polem State. 3. Wpisz w komórce Mazowieckie. Kwerenda powinna mieć postać pokazaną na rysunku 9.5. Zwróć uwagę, że otwarta jest tylko jedna tabela i wybrano tylko trzy pola. Aby obejrzeć wyniki tej kwerendy, kliknij polecenie Widok arkusza danych w grupie Widok na wstążce. Rysunek 9.5. Okno projektu kwerendy z otwartą tabelą tblCustomers
Nie trzeba wpisywać znaku równości przed słowem Mazowieckie, ponieważ to jest kwerenda wybierająca. Aby zobaczyć wszystkie województwa z wyjątkiem mazowieckiego, należy wpisać znak nierówności (<>) albo operator Not przed słowem Mazowieckie. Nie trzeba również ujmować w cudzysłów słowa Mazowieckie. Access zakłada, że używamy tekstowego literału Mazowieckie, i automatycznie dodaje cudzysłów. Dane zawierające cudzysłowy i apostrofy wymagają specjalnej uwagi. Dla przykładu rozważmy kwerendę, która ma wyszukać osobę o nazwisku podanym jako Robert „Robi” Nowak. W idealnym przypadku w tabeli klientów powinno znaleźć się pole Pseudonim, gdzie można by wpisać pseudonim "Robi". Skoro jednak go nie ma, operator może wpisać imię jako Robert "Robi", używając cudzysłowu do oznaczenia pseudonimu.
298
Część III Kwerendy Accessa
W tym przypadku Access zinterpretuje znaki cudzysłowu jako dane, a w przyszłości może się pojawić potrzeba uwzględnienia znaków cudzysłowu w kryterium kwerendy. Najprostszym rozwiązaniem jest skorzystanie z wyrażenia kryterium w następującej postaci: 'Robert "Robi"'
Zwróć uwagę na apostrofy otaczające ciąg kryterium. Access prawidłowo zinterpretuje apostrofy jako ograniczniki. W tym przypadku cudzysłowy wewnątrz apostrofów będą potraktowane jako zwykłe dane. Nie należy używać wyrażeń w następującej postaci: "Robert 'Robi'"
W tym przypadku, w porównaniu z poprzednim przykładem, zamieniliśmy miejscami apostrofy z cudzysłowami. W takiej sytuacji Access oczekuje znalezienia apostrofów w polu imienia (oczekuje, że pseudonim zapisano jako 'Robi'), zatem kwerenda nie zwróci żadnych rekordów.
Operator Like i symbole wieloznaczne W poprzednich podrozdziałach pracowaliśmy z kryteriami dosłownymi. Podawaliśmy zawartość pola, którą ma znaleźć Access; w poprzednim przykładzie był to tekst Mazowieckie. Access używał literału do wyszukania odpowiednich rekordów. Czasem jednak znamy tylko część zawartości pola albo chcemy zobaczyć większy zakres rekordów w oparciu o pewien wzorzec. Na przykład mogą nas interesować informacje o wszystkich produktach, które w opisie mają słowo „kabriolet”. Taki opis może pasować do wielu marek i modeli. W bazie danych nie ma natomiast pola, w którym można by wpisać słowo „kabriolet” i użyć go jako samodzielnego kryterium kwerendy. Aby mieć pewność, że właściwie wybraliśmy wszystkie rekordy zawierające w opisie słowo „kabriolet”, trzeba skorzystać z symboli wieloznacznych. Oto inny przykład. Przypuśćmy, że jeden z klientów kupił w zeszłym roku kilka modeli czerwonych samochodów. Pamiętamy, że w polu Notes umieściliśmy odpowiednią notatkę na ten temat, ale nie pamiętamy, który to był klient. Trzeba więc przeszukać pola Notes w tabeli tblCustomersi, aby znaleźć rekordy zawierające słowo „czerwony”. Do przeszukiwania zawartości pól z wykorzystaniem symboli wieloznacznych służy operator Like w komórce Kryteria:. Access szuka wzorca w tym polu. Programista może użyć znaku zapytania (?) do reprezentowania pojedynczego znaku albo gwiazdki (*) do reprezentowania wielu znaków. Oprócz znaku zapytania i gwiazdki Access wykorzystuje trzy inne znaki do wyszukiwań wieloznacznych. W tabeli w ramce „Symbole wieloznaczne” we wcześniejszej części rozdziału zamieszczono symbole wieloznaczne, których może używać operator Like. Znak zapytania (?) symbolizuje dowolny pojedynczy znak znajdujący się w tym samym miejscu co znak zapytania we wzorcu. Gwiazdka (*) symbolizuje dowolną liczbę znaków znajdujących się w tym samym miejscu co gwiazdka. Znak krzyżyka (#) symbolizuje dowolną pojedynczą cyfrę znajdującą się w tym samym miejscu co krzyżyk. Nawiasy kwadratowe ([]) i ujęta w nie lista symbolizują dowolny pojedynczy znak spośród tych umieszczonych na liście. Wreszcie wykrzyknik (!) w nawiasie kwadratowym oznacza
Rozdział 9. Stosowanie operatorów i wyrażeń
299
negację listy (operator Not), tzn. reprezentuje dowolny pojedynczy znak, który nie pasuje do żadnego spośród znaków umieszczonych na liście. Symboli tych można używać samodzielnie albo w połączeniu z innymi. Można ich nawet użyć kilkakrotnie w jednym wyrażeniu. Aby utworzyć przykład wykorzystujący operator Like, przypuśćmy, że chcemy znaleźć klientów, którzy lubią czerwone modele samochodów. Wiemy, że słowo „czerwony” znajduje się w polu Notes w tabeli tblCustomers. Aby utworzyć kwerendę, wykonaj poniższe czynności: 1. Dodaj do kwerendy tabele tblCustomers, tblSales, tblSalesLineItems i tblProducts. 2. Wybierz pola Company i Notes z tabeli tblCustomers, pole SalesDate z tabeli tblTransakcje oraz pole Description z tabeli tblProducts i dodaj je do siatki QBE. 3. Kliknij komórkę Kryteria: pola Notes i wprowadź w nim ciąg * czerwony * jako kryterium. Pamiętaj, by umieścić spację między pierwszą gwiazdką a literą „c” oraz między ostatnią spacją a literą „y” — innymi słowy: wpisz spacje przed słowem czerwony i po nim. W powyższym przykładzie umieściliśmy spację przed słowem „czerwony” i po nim. Gdybyśmy tego nie zrobili, Access znalazłby wszystkie słowa zawierające ciąg „czerwony”, takie jak „jasnoczerwony” czy „ciemnoczerwony”. Umieszczając spacje słowem „czerwony” i po nim, nakazujemy Accessowi szukać tylko słowa „czerwony”. Możesz stwierdzić, że jeśli zawartość pola Notes zaczyna się od słowa „czerwony” (np. „Czerwony to ulubiony kolor klienta”), Access nie wykryje rekordu, ponieważ słowo to nie jest wtedy poprzedzone spacją. Rzeczywiście tak się stanie. Przy tworzeniu kryteriów należy przeprowadzić eksperymenty. Ponieważ dane w tabelach (zwłaszcza w polach tekstowych) są nieprzewidywalne, czasem trzeba utworzyć kilka kwerend, aby uwzględnić wszystkie możliwości. W omawianej sytuacji można utworzyć dodatkową kwerendę z kryterium "czerwony *" w celu wykrycia wspomnianych rekordów.
Z zaprezentowanym przykładem jest jednak pewien problem. Zwróćmy uwagę, że warunek ("* czerwony *") wymaga istnienia spacji po słowie „czerwony”. Oznacza to, że rekord zawierający poniższą uwagę nie zostanie zwrócony przez kwerendę: Klienta interesuje każdy model samochodu pod warunkiem, że samochód jest czerwony!
W tym przypadku ze względu na brak spacji bezpośrednio po słowie „czerwony” ten rekord nie zostanie zwrócony. Prawidłowy warunek powinien mieć następującą postać: Like "* czerwony[ , !?"
Nawiasy kwadratowe, w które ujęty jest warunek " ,.!?", instruują Accessa, aby wybierał rekordy w przypadku, gdy pole Notes kończy się słowem „czerwony”, o ile za nim jest spacja albo znak interpunkcyjny. Oczywiście w nawiasach kwadratowych można również wprowadzić inne znaki. W związku z tym trzeba dokładnie wiedzieć, jakie dane są zapisane w polu, w którym szukamy danych.
300
Część III Kwerendy Accessa
Po kliknięciu poza komórką Kryteria: Access automatycznie doda operator Like i umieści wyrażenie w cudzysłowie. Siatka QBE powinna teraz mieć postać pokazaną na rysunku 9.6.
Rysunek 9.6. Stosowanie operatora Like w kwerendach wybierających
Po utworzeniu tej kwerendy można kliknąć przycisk Widok arkusza danych, aby obejrzeć jej wyniki. Pokazano je na rysunku 9.7.
Rysunek 9.7. Wyniki kwerendy wybierającej korzystającej z operatora Like w polu typu Długi tekst. W tym przypadku kwerenda szuka słowa „czerwony” w polu Notes
Kiedy klikniesz przycisk Widok arkusza danych na wstążce, przekonasz się, że kilka rekordów spełnia warunki kwerendy. Zbiór rekordów zwrócony przez tę kwerendę zawiera redundantne informacje w kolumnach Company i Notes. Redundancja jest wynikiem pytania o interesujące nas informacje razem z danymi o sprzedaży i właściwościami produktu. Access automatycznie dodaje operator Like i znaki cudzysłowu, jeśli spełnione są następujące warunki:
Rozdział 9. Stosowanie operatorów i wyrażeń
Wyrażenie nie zawiera spacji.
Użyto tylko symboli wieloznacznych ?, * oraz #.
Nawiasów kwadratowych ([ ]) użyto wyłącznie w cudzysłowie (" ").
301
W przypadku użycia nawiasów kwadratowych bez cudzysłowu trzeba samodzielnie wpisać operator Like i znaki cudzysłowu. Używanie operatora Like z symbolami wieloznacznymi to najlepszy sposób wyszukiwania wzorców w polu typu Długi tekst. Przykłady zamieszczone w tabeli 9.5 demonstrują przydatność operatora Like przy wyszukiwaniu danych w polach typu Krótki tekst i Data. W tabeli tej znajdziesz przykłady, które można wykorzystać do wyszukiwania rekordów w używanej bazie danych. Tabela 9.5. Używanie symboli wieloznacznych w połączeniu z operatorem Like Wyrażenie
Używane w polu
Wynik kryterium
Like "Ja*"
tblCustomers.LastName
Znajduje wszystkie rekordy klientów, których nazwisko zaczyna się od „Ja”, np. Janik i Jankowski.
Like "* czerwony *"
tblProducts.Features
Znajduje wszystkie rekordy, które zawierają słowo „czerwony” w polu Features.
Like "K*"
tblSales.PaymentMethod
Znajduje wszystkie transakcje, które były opłacane kartą kredytową bądź debetową.
Like "Gdańska ##"
tblCustomers.Address
Znajduje rekordy dotyczące adresów z numerem domu między 10 a 99 włącznie, np. 22, 33 lub 51, na ulicy Gdańskiej.
Like "[PBK]*"
tblCustomers.City
Znajduje wszystkie rekordy klientów, którzy mieszkają w miastach o nazwach zaczynających się literami P, B lub K.
Like "[!JKC]*"
tblCustomers.City
Znajduje wszystkie rekordy klientów, którzy nie mieszkają w miastach o nazwach zaczynających się literami J, K lub C.
Określanie wartości niepasujących Aby określić wartość niepasującą, wystarczy użyć operatorów Not lub <> przed wyrażeniem, którego nie chcemy dopasować. Przypuśćmy, że chcemy zobaczyć wszystkich klientów, którzy zakupili pojazd, ale bez nabywców z województwa mazowieckiego. Wykonaj poniższe czynności, aby się dowiedzieć, jak określić wartość niepasującą: 1. Otwórz nową kwerendę w widoku projektu i dodaj tabelę tblCustomers. 2. Wybierz z tabeli tblCustomers pola Company oraz State. 3. Kliknij komórkę Kryteria: pod polem State. 4. Wpisz <> Mazowieckie w komórce. Access automatycznie ujmie tekst Mazowieckie w cudzysłów, jeśli Ty tego nie zrobisz przed opuszczeniem pola. Kwerenda powinna mieć postać pokazaną na rysunku 9.8. Kwerenda wybiera wszystkie rekordy z wyjątkiem rekordów dotyczących klientów, którzy mieszkają w województwie mazowieckim.
302
Część III Kwerendy Accessa
Rysunek 9.8. Stosowanie operatora <> w kryterium
W 4. etapie powyższej procedury można użyć operatora Not zamiast <>, aby wyłączyć województwo mazowieckie. Zbiór wynikowy będzie taki sam bez względu na użyty operator. Operatory te można stosować zamiennie wszędzie z wyjątkiem konstrukcji ze słowem kluczowym Is. Nie można napisać Is <> Null — trzeba napisać Not Is Null lub, bardziej precyzyjnie, Is Not Null.
Wprowadzanie kryteriów liczbowych Kryteriów liczbowych używa się w połączeniu z polami typów liczbowych lub walutowych. Wystarczy wpisać liczbę i przecinek dziesiętny — jeśli jest potrzebny — po operatorze matematycznym lub operatorze porównania. Przypuśćmy, że chcemy obejrzeć towary, dla których stan magazynowy jest niższy niż 10 sztuk. 1. Otwórz nową kwerendę w widoku projektu i dodaj tabelę tblProducts. 2. Dodaj do siatki QBE pola ProductID, Description, Make, Model i QtyInStock z tabeli tblProducts. 3. Kliknij komórkę Sortuj: pod polem Make i wybierz pozycję Rosnąco z menu rozwijanego. 4. Kliknij w komórce Kryteria: pole QtyInStock i wpisz w komórce <10. Kwerenda powinna mieć postać pokazaną na rysunku 9.9. Gdy pracujemy z danymi liczbowymi, Access nie ujmuje wyrażeń w cudzysłów jak w przypadku kryteriów tekstowych. Kryteria stosowane do pól liczbowych zwykle zawierają operatory porównań takie jak operator mniejszości (<), większości (>) lub równości (=). Aby określić relację inną niż równość, należy wpisać zarówno wartość, jak i operator. Należy pamiętać, że jeśli w kryterium kwerendy wybierającej nie podamy operatora, Access domyślnie zastosuje operator równości. Dlatego właśnie w przykładzie pokazanym na rysunku 9.9 musieliśmy wprowadzić <10 w kolumnie QtyInStock. Access nie ujmuje warunku w cudzysłów, ponieważ pole QtyInStock jest liczbowe i nie wymaga ogranicznika.
Rozdział 9. Stosowanie operatorów i wyrażeń
303
Rysunek 9.9. Kryteria dla kwerendy wyszukującej produkty o niskich stanach magazynowych
Wprowadzanie kryteriów logicznych (Prawda/Fałsz) Kryteriów Prawda/Fałsz używa się w połączeniu z polami typu Tak/Nie. Przykładowymi danymi, które można określić w kryterium, mogą być wyrażenia o wartości Prawda albo Fałsz. Można też używać operatorów Not oraz <>, aby wskazać wartość przeciwną, ale dane typu Tak/Nie miewają również stan Null, który czasem trzeba sprawdzać. Access rozpoznaje kilka form prawdy i fałszu. Zamiast więc wpisywać Tak, można podać w komórce Kryteria: jedną z następujących wartości: Włączony, Prawda, Not Nie, <> Nie, < Nie albo –1. Pole typu Tak/Nie może mieć tylko trzy stany: Tak, Nie i Null. Stan Null występuje jedynie wtedy, gdy w tabeli nie ustawiono wartości domyślnej, a użytkownik jeszcze nie wprowadził wartości. Kryterium Is Null wyświetla tylko rekordy bez wartości, a kryterium Is Not Null wyświetla wszystkie rekordy o wartości Tak i Nie. Po zaznaczeniu pola wyboru Tak/Nie (albo zaznaczeniu go, a następnie usunięciu zaznaczenia) pole nie może mieć wartości Null, lecz musi mieć wartość Tak albo Nie (–1 lub 0).
Wprowadzanie kryterium dla obiektu OLE Dla obiektów OLE można definiować kryteria Is Null lub Is Not Null. Przypuśćmy, że nie mamy zdjęć wszystkich produktów i chcemy obejrzeć tylko te rekordy, które zawierają zdjęcie — to znaczy te, w których zdjęcie „nie jest Null”. Wpisujemy więc kryterium Is Not Null dla pola Picture w tabeli tblProducts. Choć prawidłowa składnia to Is Not Null, wystarczy wpisać Not Null, a Access automatycznie dołączy operator Is.
304
Część III Kwerendy Accessa
Wprowadzanie wielu kryteriów w kwerendzie W poprzednich podrozdziałach pracowaliśmy z kryteriami zawierającymi jeden warunek i dotyczącymi jednego pola. Kryterium z jednym warunkiem można określić dla pola dowolnego typu. W tym podrozdziale będziemy pracować z wieloma kryteriami dotyczącymi jednego pola. Przypuśćmy, że chcemy obejrzeć wszystkie rekordy, w których nabywca pochodzi z województwa mazowieckiego, zachodniopomorskiego lub małopolskiego, albo rekordy wszystkich pojazdów, które zostały sprzedane w pierwszym kwartale 2012 roku. Siatka QBE pozwala rozwiązywać tego rodzaju problemy. W kwerendzie wyboru można określić kryterium lub kryteria dla jednego pola albo dla kilku pól. Używając wielu kryteriów, można na przykład ustalić, które pojazdy sprzedano w ciągu ostatnich 90 dni. Dla pola SaleDate można wprowadzić dowolne spośród poniższych kryteriów: Between Date() And Date() - 90 Between Date() And DateAdd("d",-90,Date())
Spośród tych wyrażeń to, które wykorzystuje funkcję DateAdd, jest mniej mylące i bardziej charakterystyczne dla wykonywanego zadania. Dokładniejsze omówienie obliczeń z wykorzystaniem dat znajdziesz w rozdziale 12.
Operacja Or Operacji Or używa się w kwerendach wtedy, gdy pole ma spełniać dowolny spośród dwóch warunków. Przypuśćmy, że chcemy obejrzeć wszystkie rekordy, gdzie klient mieszka w województwie mazowieckim albo lubuskim. Innymi słowy, chcemy obejrzeć te rekordy, gdzie klient mieszka albo w województwie mazowieckim, albo w województwie lubuskim, albo w obu. Ogólna postać operacji Or to: [State] = "Mazowieckie" Or [State] = "Lubuskie"
Jeśli którakolwiek strona tej formuły ma wartość True, cała formuła również ma wartość True. Aby to wyjaśnić, rozważmy poniższe warunki:
Klient 1 mieszka w województwie mazowieckim — formuła ma wartość True.
Klient 2 mieszka w województwie lubuskim — formuła ma wartość True.
Klient 3 mieszka w województwach mazowieckim i lubuskim — formuła ma wartość True.
Klient 4 mieszka w województwie śląskim — formuła ma wartość False.
Określanie wielu wartości pola za pomocą operatora Or Operator Or służy do określania wielu możliwych wartości pola. Można użyć go na przykład po to, aby wyświetlić wszystkie rekordy nabywców mieszkających w województwach mazowieckim, lubuskim lub śląskim. Aby to zrobić, wykonaj następujące czynności:
Rozdział 9. Stosowanie operatorów i wyrażeń
305
1. Otwórz nową kwerendę w widoku projektu i dodaj tabele tblCustomers i tblSales. 2. Dodaj pola Company i State z tabeli tblCustomers oraz pole SalesDate z tabeli tblSales. 3. Kliknij komórkę Kryteria: pod polem State. 4. Wybierz pozycję Rosnąco z menu rozwijanego. 5. Kliknij komórkę Kryteria: pod polem State. 6. Wpisz w komórce Mazowieckie Or Lubuskie Or Śląskie. Siatka QBE powinna teraz przypominać tę, którą pokazano na rysunku 9.10. W tym przykładzie Access automatycznie dodał cudzysłowy do wartości Mazowieckie, Lubuskie i Śląskie. Rysunek 9.10. Stosowanie operatora Or. Zwróć uwagę na dwa operatory Or pod polem State — Mazowieckie Or Lubuskie Or Śląskie
Używanie komórki Lub: na siatce projektu (QBE) Oprócz stosowania operatora Or w pojedynczej instrukcji w wierszu Kryteria: pod polem State można podać poszczególne kryteria w oddzielnych wierszach siatki QBE (zobacz rysunek 9.11). Rysunek 9.11. Używanie komórki Lub: na siatce QBE. Kryteria w siatce QBE można dodawać pionowo
306
Część III Kwerendy Accessa Access pozwala na wypełnienie najwyżej dziewięciu komórek Lub:. Jeśli trzeba podać więcej warunków, można użyć operatora Or między warunkami (np. Lubuskie Or Mazowieckie Or Śląskie Or Dolnośląskie).
Po zapisaniu kwerendy Access przeorganizowuje projekt pokazany na rysunku 9.11 tak, by odpowiadał kwerendzie z rysunku 9.10. Po otwarciu kwerendy qryFigure_9-11 z przykładowej bazy danych Rozdział09.accdb można zobaczyć identyczny projekt, jak w przypadku kwerendy qryFigure_9-10. Wynika to ze zreorganizowania kryteriów podczas zapisywania kwerendy qryFigure_9-11. W przypadku tworzenia kwerendy z wykorzystaniem kryteriów Or w pionie Access optymalizuje instrukcję SQL-a będącą podstawą kwerendy poprzez umieszczenie wszystkich kryteriów Or w jednym wyrażeniu.
Używanie listy wartości w połączeniu z operatorem In Istnieje jeszcze jedna metoda określania wielu wartości jednego pola. Polega ona na wykorzystaniu operatora In. Operator In znajduje dowolną wartość spośród wymienionych na liście. Na przykład można wpisać wyrażenie In(Śląskie; Mazowieckie; Lubuskie) pod polem State w kwerendzie z rysunku 9.11. Lista wartości w nawiasach staje się przykładowym kryterium. Kwerenda powinna teraz przypominać tę z rysunku 9.12. Rysunek 9.12. Stosowanie operatora In w celu znalezienia wszystkich rekordów, w których województwo nabywcy to Śląskie, Mazowieckie lub Lubuskie
W tym przykładzie Access automatycznie dodał cudzysłowy do wartości Śląskie, Mazowieckie i Lubuskie. Kiedy używamy operatora In, każda wartość (przykładowe dane) musi być oddzielona od innych przecinkiem.
Wykorzystanie operatora And do zdefiniowania zakresu Operatora And często używa się w polach typu Liczba albo Data/Godzina. Rzadko stosuje się go w polach tekstowych, choć w pewnych sytuacjach jest to możliwe. Przypuśćmy, że chcemy obejrzeć wszystkich nabywców, których nazwiska zaczynają się od liter D, E lub F. Moglibyśmy użyć operatora And (>="D" And <="G"), choć operator Like jest lepszy (Like "[DEF]*"), ponieważ jest znacznie bardziej czytelny.
Rozdział 9. Stosowanie operatorów i wyrażeń
307
Operatorów And używa się w kwerendach wtedy, kiedy pole ma spełniać wszystkie określone warunki. Przypuśćmy, że chcemy obejrzeć wszystkie rekordy nabywców, którzy zakupili samochód między 1 października 2012 roku a 31 marca 2013 roku. Innymi słowy, interesują nas transakcje zawarte w ostatnim kwartale 2012 i w pierwszym kwartale 2013 roku. W tym przykładzie ogólna formuła to: (SaleDate >= 01.10.12) And (DataSprzedaży <= 31.03.13)
Nawiasy w pokazanym przykładzie zostały użyte dla poprawienia czytelności.
W przeciwieństwie do operatora Or (który ma wartość True w kilku różnych okolicznościach) operator And ma wartość True tylko wtedy, gdy prawdziwe są obie strony formuły. Aby wyjaśnić użycie operatora And, rozważmy poniższe warunki:
Data sprzedaży (22.09.12) nie jest większa niż 01.10.12, ale jest mniejsza niż 31.03.13 — formuła ma wartość False.
Data sprzedaży (11.04.13) nie jest większa niż 01.10.12, ale jest mniejsza niż 31.03.13 — formuła ma wartość False.
Data sprzedaży (22.11.12) jest większa niż 01.10.12 i jest mniejsza niż 31.03.13 — formuła ma wartość True.
Użycie operatora And w jednym polu określa zakres dopuszczalnych wartości w tym polu, a zatem podstawowym przeznaczeniem operatora And w jednym polu jest definiowanie zakresu wyświetlanych rekordów. Można na przykład użyć operatora And, aby utworzyć kryterium wyświetlające wszystkich nabywców, którzy zakupili towary w okresie między 1 października 2012 roku a 31 marca 2013 roku (włącznie). Aby utworzyć taką kwerendę, wykonaj poniższe czynności: 1. Utwórz nową kwerendę z wykorzystaniem tabel tblCustomers i tblSales. 2. Dodaj pole Company z tabeli tblCustomers oraz pole SaleDate z tabeli tblSales. 3. Kliknij komórkę Kryteria: pod polem SaleDate. 4. Wpisz w komórce >= 01.10.12 And <= 31.03.13. Projekt kwerendy powinien wyglądać tak, jak pokazano na rysunku 9.13. Zwróćmy uwagę na znaki kratki (#) wykorzystane w celu otoczenia dat w wyrażeniach po obu stronach operatora And. Access rozpoznaje znaki kratki jako ograniczniki wartości dat i godzin. Bez tych znaków zinterpretowałby wartości dat jako wyrażenia liczbowe (np. 10 dzielone przez 1 podzielone przez 2012).
Stosowanie operatora Between...And Zakres rekordów można wyświetlić inną metodą, a mianowicie za pomocą operatora Between...And. Operator ten pozwala wyszukać rekordy pasujące do pewnego zakresu wartości, na przykład wszystkie rekordy transakcji, w których cena towaru wynosiła od 50 do 100 zł. Korzystając z poprzedniego przykładu, utwórzmy kwerendę podobną do pokazanej na rysunku 9.14.
308
Część III Kwerendy Accessa
Rysunek 9.13. Stosowanie operatorów And i Or w złożonych kryteriach kwerend
Rysunek 9.14. Stosowanie operatora Between...And. Wyniki są takie same jak w przypadku kwerendy z rysunku 9.13
Operandy operatora Between...And są uwzględniane w zbiorze wynikowym. Oznacza to, że w zbiorze wyników kwerendy znajdą się transakcje z 1 października 2012 roku i 31 marca 2013 roku.
Wyszukiwanie danych o wartości Null Pole może być pozbawione zawartości z kilku przyczyn. Możliwe, że w czasie wprowadzania danych wartość nie była znana, a mogło się też zdarzyć, że użytkownik zapomniał wpisać informację lub usunął ją z pola. Access nie robi nic z takim polem. Jeśli w projekcie kwerendy nie zdefiniowano wartości domyślnej, pole po prostu pozostaje puste (o pustym polu mówimy, że ma wartość Null). Z logicznego punktu widzenia Null nie jest ani prawdą, ani fałszem. Pole Null nie jest odpowiednikiem pola zawierającego same spacje albo zero. Pole Null po prostu nie ma wartości. W Accessie do pracy z polami Null służą dwa specjalne operatory: Is Null
Is Not Null
Rozdział 9. Stosowanie operatorów i wyrażeń
309
Co to jest wartość Null? Bazy danych muszą obsługiwać informacje różnego rodzaju. Wszyscy znamy dane tekstowe, liczbowe, daty, a także inne typy danych. W większości przypadków wartości danych są znane. Na przykład niemal na pewno znane jest nazwisko i imię nowego pracownika, choć jego drugie imię może być nieznane. W jaki sposób baza danych reprezentuje wartość, która jest nieznana bądź w ogóle nie istnieje? Do tego właśnie służy wartość Null. Domyślnie większość pól w tabeli bazy danych ma wartość Null do czasu, aż zostaną w nich wprowadzone wartości. Wartość może być wprowadzona przez użytkownika w formularzu albo może zostać podstawiona wartość domyślna zdefiniowana w projekcie tabeli. Jeśli się dowiemy, że pracownik nie ma drugiego imienia, możemy wprowadzić pusty ciąg znaków ("") w polu przeznaczonym na drugie imię. W tym przypadku brak drugiego imienia oznacza pusty ciąg znaków. Dopóki jednak wartość jest nieznana, pole ma wartość Null.
Operatorów tych używa się do określania kryteriów wyszukiwania rekordów na podstawie pól o wartości Null. Z wcześniejszej części tego rozdziału dowiedziałeś się, że można użyć wartości Null, aby wyszukać towary, których rekordy zawierają zdjęcie. W następnym przykładzie poszukamy rekordów nabywców, w których nie podano żadnych danych w polu Notes: 1. Utwórz nową kwerendę z wykorzystaniem tabel tblCustomers i tblSales. 2. Dodaj pole Notes i pole Company z tabeli tblCustomers oraz pole SaleDate z tabeli tblSales. 3. Wpisz Is Null jako kryterium w polu Notes. 4. Anuluj zaznaczenie pola Pokaż: w polu Notes. Kwerenda powinna mieć postać pokazaną na rysunku 9.15. Wybierz polecenie Widok/Arkusz danych, aby zobaczyć rekordy, które nie mają wprowadzonej wartości w polu Notes. Rysunek 9.15. Wykorzystanie warunku Is Null w celu pobrania wierszy zawierających pola bez danych
Zaznaczenie pola wyboru Pokaż: anulowaliśmy dlatego, że nie ma potrzeby wyświetlania pola Notes w wynikach kwerendy. Kryterium służy do wyświetlania tylko tych rekordów, dla których pole Notes ma wartość null, dlatego, mówiąc dosłownie, w polu tym nie ma nic do oglądania. Z tego względu nie ma sensu uwzględniania go w wynikach.
310
Część III Kwerendy Accessa
Kiedy używamy operatorów Is Null oraz Is Not Null, wystarczy wpisać Null albo Not Null, a Access automatycznie doda operator Is do komórki Kryteria:.
Wprowadzanie kryteriów w wielu polach Wcześniej w tym rozdziale pracowaliśmy z jednym lub wieloma kryteriami określanymi w jednym polu. W tym podrozdziale zajmiemy się kryteriami wprowadzanymi w kilku różnych polach. Aby ograniczyć rekordy według zawartości kilku pól, należy ustawić w poszczególnych polach kryteria, które służą do ograniczenia zakresu. Przypuśćmy, że chcemy wyszukać wszystkie transakcje modeli od dystrybutorów z województwa świętokrzyskiego albo interesują nas nabywcy modeli motocykli z województw pomorskiego i zachodniopomorskiego. Możemy także poszukać nabywców modeli motocykli z województwa pomorskiego albo nabywców modeli ciężarówek z województwa zachodniopomorskiego. Każda z tych kwerend wymaga umieszczenia kryteriów w wielu polach i wielu wierszach.
Stosowanie operacji And i Or w polach kwerendy Aby wykonać operację And albo Or na kilku polach kwerendy, należy umieścić przykładowe lub wzorcowe dane w komórkach Kryteria: (w przypadku operacji And) albo w komórkach Lub: danego pola odpowiednio względem położenia tych danych w innym polu. Aby wykonać operację And na dwóch polach, należy umieścić dane przykładowe lub wzorcowe w tym samym wierszu siatki QBE. Aby wykonać operację Or na dwóch polach, należy umieścić dane przykładowe lub wzorcowe w różnych wierszach siatki QBE. Na rysunku 9.16 pokazano siatkę projektu z dość ekstremalnym przykładem rozmieszczenia warunków.
Rysunek 9.16. Siatka QBE definiująca relacje And/Or między polami z wykorzystaniem wierszy Kryteria:
Rozdział 9. Stosowanie operatorów i wyrażeń
311
Kwerenda z rysunku 9.16 wyświetla rekord, jeśli spełnia jedno z poniższych kryteriów: ModelYear = 1932 AND Make = Ford AND Model = Coupe
(wszystkie muszą mieć
wartość True). (jeśli ma wartość True, jeden lub dwa pozostałe wiersze mogą mieć wartość False).
Color = Zielony
(jeśli ma wartość True, jeden lub dwa pozostałe wiersze mogą mieć wartość False).
Category = Osobowe
Jeśli którekolwiek z tych kryteriów jest spełnione, rekord znajdzie się w wynikach kwerendy. Oto instrukcja SQL-a odpowiadająca kwerendzie z rysunku 9.16: SELECT ModelYear, Make, Model, Color, Category FROM tblProducts WHERE ((ModelYear="1932") AND (Make="Ford") AND (Model="Coupe")) OR (Color="Zielony") OR (Category="Osobowe")
Położenie nawiasów w powyższej instrukcji SQL-a ma znaczenie. Jedna para nawiasów otacza warunek dla pól ModelYear, Make i Model, natomiast w oddzielnych nawiasach znajduje się każdy z warunków stosowanych w odniesieniu do pól Color i Category. Oznacza to, że warunki ModelYear, Make i Model będą zastosowane jako grupa, natomiast warunki Color i Category są stosowane indywidualnie.
Określanie kryteriów Or w wielu polach kwerendy Choć operacji Or na wielu polach nie używa się tak często jak operacji And, niekiedy operacja Or jest bardzo przydatna. Przypuśćmy, że chcemy obejrzeć rekordy modeli kupionych przez klientów z województwa śląskiego oraz rekordy modeli ciężarówek bez względu na województwo, z którego pochodzą klienci. Aby utworzyć taką kwerendę, wykonaj poniższe czynności: 1. Dodaj do kwerendy tabele tblCustomers, tblSales, tblSalesLineItems i tblProducts. 2. Dodaj pole Company i pole State z tabeli tblCustomers oraz pole Description i pole Category z tabeli tblProducts. 3. Wpisz Śląskie jako kryterium w polu State. 4. Wpisz Ciężarowe w komórce Lub: pod polem Category. Projekt kwerendy powinien wyglądać tak, jak pokazano na rysunku 9.17. Zwróćmy uwagę, że warunki dla pól State i Category w siatce QBE zostały wpisane w różnych wierszach. Kiedy wpiszemy warunki w różnych wierszach siatki QBE, Access zinterpretuje je jako operację Or pomiędzy polami. Przykładowa kwerenda zwraca rekordy klientów mieszkających w województwie śląskim lub takich, którzy kupili modele ciężarówek. Oto instrukcja SQL-a odpowiadająca kwerendzie z rysunku 9.17: SELECT tblCustomers.Company, tblCustomers.State, tblProducts.Description, tblProducts.Category FROM tblProducts
312
Część III Kwerendy Accessa
Rysunek 9.17. Stosowanie operatora Or pomiędzy polami INNER JOIN (tblCustomers INNER JOIN (tblSales INNER JOIN tblSalesLineItems ON tblSales.InvoiceNumber = tblSalesLineItems.InvoiceNumber) ON tblCustomers.CustomerID = tblSales.CustomerID) ON tblProducts.ProductID = tblSalesLineItems.ProductID WHERE (tblCustomers.State="Śląskie") OR (tblProducts.Category="Ciężarowe")
Zwróćmy uwagę na rozmieszczenie nawiasów wewnątrz klauzuli WHERE. Musi być spełniony przynajmniej jeden z dwóch warunków — albo województwo to "Śląskie", albo typ samochodu to "Ciężarowe". Przeniesienie słowa „Ciężarowe” do tego samego wiersza co „Śląskie” w siatce QBE prowadzi do zmiany działania kwerendy — w tej postaci kwerenda zwróci rekordy klientów, którzy mieszkają w województwie śląskim oraz kupili modele ciężarówek. Zmodyfikowaną kwerendę pokazano na rysunku 9.18. Oto instrukcja SQL-a uzyskana w wyniku tej niewielkiej modyfikacji: SELECT tblCustomers.Company, tblCustomers.State, tblProducts.Description, tblProducts.Category FROM tblProducts INNER JOIN (tblCustomers INNER JOIN (tblSales INNER JOIN tblSalesLineItems ON tblSales.InvoiceNumber = tblSalesLineItems.InvoiceNumber) ON tblCustomers.CustomerID = tblSales.CustomerID) ON tblProducts.ProductID = tblSalesLineItems.ProductID WHERE (tblCustomers.State="Śląskie") AND (tblProducts.Category="Ciężarowe")
Różnica jest znacząca, ponieważ ze względu na modyfikację kryterium dla rekordów jest znacznie bardziej restrykcyjne. Kwerenda Figure-18 zwraca tylko jeden rekord, natomiast kwerenda Figure-17 zwraca 9 wierszy.
Rozdział 9. Stosowanie operatorów i wyrażeń
313
Rysunek 9.18. Prosta modyfikacja w siatce QBE powoduje powstanie zupełnie innej kwerendy
Stosowanie operacji And i Or na różnych polach Pracowaliśmy już oddzielnie z operatorami And i Or, więc jesteśmy gotowi do utworzenia kwerendy, która wykorzystuje relacje And i Or między różnymi polami. W następnym przykładzie wyświetlimy informacje o wszystkich nabywcach z województwa śląskiego, którzy kupili modele motocykli, oraz o wszystkich klientach z województwa podkarpackiego, którzy zakupili ciężarówki. 1. Użyj kwerendy z poprzedniego przykładu, opróżniając najpierw dwie komórki z kryteriami. 2. Wpisz Śląskie w komórce Kryteria: kolumny State. 3. W siatce QBE wpisz Podkarpackie pod Śląskie w wierszu Lub:. 4. Wpisz Motocykle jako kryterium w polu Category. 5. Wpisz Ciężarowe pod słowem Motocykle w polu Category. Wygląd kwerendy pokazano na rysunku 9.19. Zwróćmy uwagę, że kryteria Śląskie i Motocykle są w jednym wierszu, a kryteria Podkarpackie i Ciężarowe w drugim. Kwerenda ta reprezentuje dwie relacje And między polami i relację Or w każdym polu. W tej kwerendzie należy zwrócić uwagę na to, że Access w istocie zwraca dwa zbiory danych: właścicieli modeli motocykli z województwa śląskiego oraz właścicieli modeli ciężarówek z województwa podkarpackiego. Wszystkie inne kombinacje klientów i modeli są ignorowane.
Kwerenda złożona w wielu wierszach Przypuśćmy, że chcemy obejrzeć wszystkie rekordy samochodów marki Chevy zakupionych w ciągu pierwszych sześciu miesięcy 2012 roku przez klientów z województwa dolnośląskiego albo dowolne rekordy pojazdów zakupionych przez klientów z województwa
314
Część III Kwerendy Accessa
Rysunek 9.19. Stosowanie operatorów And i Or w kwerendach wybierających
wielkopolskiego. W tym przykładzie trzeba ustawić kryteria w trzech polach: tblCustomers. State, tblSales.SaleDate i tblProducts.Description. Oto instrukcja umożliwiająca ustawienie takiego warunku: ((tblSales.SaleDate Between #1/1/2012# And #6/30/2012#) And (tblProducts. Description Like "*Chev*") And (tblCustomers.State = "Dolnośląskie")) OR (tblCustomers.State = "Wielokopolskie")
Projekt kwerendy pokazano na rysunku 9.20.
Rysunek 9.20. Stosowanie wielu operacji And i Or w różnych polach. Jest to dość skomplikowana kwerenda wybierająca
Rozdział 9. Stosowanie operatorów i wyrażeń
315
Warto pamiętać, że Access interpretuje dane na podstawie ustawień regionalnych i językowych z panelu sterowania. Dlatego w zależności od kraju krótkie daty mogą być traktowane jako mm/dd/rrrr lub dd/mm/rrrr. Gdy korzystasz z dat, koniecznie uwzględnij różnice między regionami. Ponadto Access domyślnie interpretuje daty, w których rok zapisany jest dwoma cyframi z zakresu 00 – 30, jako lata 2000 – 2030, a rok zapisany cyframi z zakresu 31 – 99 jako lata 1931 – 1999. Dlatego właśnie podczas wprowadzania danych warto konsekwentnie stosować czterocyfrowy zapis roku.
316
Część III Kwerendy Accessa
Rozdział 10.
Poza kwerendy wybierające W tym rozdziale:
Stosowanie kwerend podsumowujących
Używanie kwerend funkcjonalnych
Posługiwanie się kwerendami krzyżowymi
Pobieranie i wyświetlanie konkretnych rekordów za pomocą kwerend wybierających to podstawowe zadanie wykonywane przy analizowaniu danych z Accessa. Jednak dostępne możliwości z zakresu analizy danych są znacznie większe. Analiza danych to obszerny temat obejmujący grupowanie i porównywanie danych, ich aktualizowanie i usuwanie, przeprowadzanie obliczeń z wykorzystaniem danych, a także formatowanie danych i tworzenie na ich podstawie raportów. Access udostępnia wbudowane narzędzia i mechanizmy do wykonywania każdego z tych zadań. W tym rozdziale znajdziesz szczegółowe omówienie różnych narzędzi dostępnych w Accessie. Ponadto dowiesz się, jak przy ich użyciu wyjść poza kwerendy wybierające. Wyjściową bazę danych do tego rozdziału (Rozdział10.accdb) można pobrać z witryny poświęconej tej książce.
Kwerendy podsumowujące Kwerendy podsumowujące (nazywane czasem kwerendami grupującymi) pomagają w szybkim grupowaniu i podsumowywaniu danych. Za pomocą kwerend wybierających można pobierać rekordy tylko w takiej postaci, w jakiej występują w źródle danych. Natomiast przy użyciu kwerend podsumowujących można pobrać podsumowanie wycinka danych obejmujące sumy, średnie, liczby wystąpień itd.
318
Część III Kwerendy Accessa
Tworzenie kwerendy podsumowującej Aby dobrze zrozumieć możliwości kwerend podsumowujących, wyobraź sobie, że poproszono Cię o podanie sumy wpływów z poszczególnych okresów. Aby rozpocząć szukanie odpowiedzi, otwórz nową kwerendę w widoku projektu i dodaj do niej pola Period oraz LineTotal, jak pokazano na rysunku 10.1. Jeśli uruchomisz kwerendę w tej postaci, zamiast potrzebnego podsumowania otrzymasz wszystkie rekordy ze zbioru danych. Rysunek 10.1. Ta kwerenda zamiast potrzebnego podsumowania zwróci wszystkie rekordy ze zbioru
Oto krótkie przypomnienie na temat otwierania nowej kwerendy w widoku projektu: wyświetl zakładkę TWORZENIE ze wstążki, następnie wybierz opcję Projekt kwerendy, a wówczas nad pustym widokiem projektu kwerendy pojawi się okno dialogowe Pokazywanie tabeli, w którym należy wybrać potrzebne tabele. Jeśli potrzebujesz dodatkowych informacji, krótkie przypomnienie dotyczące podstaw stosowania kwerend Accessa znajdziesz w rozdziale 8.
Aby uzyskać sumy wpływów dla poszczególnych okresów, musisz aktywować wiersz Suma w siatce QBE. W tym celu otwórz zakładkę PROJEKTOWANIE na wstążce, a następnie kliknij przycisk Suma. Na rysunku 10.2 pokazano, że po tej operacji w siatce QBE pojawia się nowy wiersz, o nazwie Suma. Wiersz Suma informuje Accessa, którą z funkcji agregacji ma zastosować przy obliczaniu podsumowań na podstawie określonych pól. Warto zauważyć, że wiersz Suma w każdym polu siatki zawiera słowa Grupuj według. Oznacza to, że wszystkie podobne rekordy zostaną pogrupowane według danego pola, co pozwala uzyskać unikatowe elementy danych. Różne funkcje agregacji szczegółowo opisaliśmy w dalszej części rozdziału. Omawiana technika wymaga tego, aby dostosować funkcje agregujące z wiersza Suma do wykonywanych analiz. W tym scenariuszu trzeba pogrupować dane według wszystkich okresów ze zbioru danych, a następnie zsumować wpływy z poszczególnych okresów. Dlatego trzeba zastosować funkcję agregującą Grupuj według w polu Period i funkcje agregującą Suma w polu LineTotal.
Rozdział 10. Poza kwerendy wybierające
319
Rysunek 10.2. Po aktywowaniu wiersz Suma pojawia się w siatce QBE i domyślnie zawiera wartość Grupuj według
Ponieważ w wierszu Suma domyślnie używana jest funkcja Grupuj według, w polu Period nie trzeba wprowadzać żadnych zmian. Jednak w polu LineTotal należy zmienić funkcję agregującą z Grupuj według na Suma. Jest to informacja dla Accessa, że wpływy z pola LineTotal ma zsumować, a nie wykorzystać do grupowania. Aby zmienić funkcję agregującą, kliknij listę rozwijaną w wierszu Suma w polu LineTotal, jak pokazano na rysunku 10.3, a następnie wybierz opcję Suma. Na tym etapie możesz uruchomić kwerendę. Rysunek 10.3. Zmiana funkcji agregacji dla pola LineTotal na Suma
Na rysunku 10.4 widać, że wynikowa tabela zawiera podsumowanie danych z informacjami o łącznych wpływach w poszczególnych okresach.
320
Część III Kwerendy Accessa
Rysunek 10.4. Po uruchomieniu kwerendy uzyskasz podsumowanie z informacjami o łącznych wpływach w określonych okresach
Funkcje agregujące W przykładzie z rysunku 10.3 na liście rozwijanej w wierszu Suma wybrano funkcję agregującą Suma. Oczywiście można wybrać dowolną z dwunastu dostępnych funkcji. Bez wątpienia natrafisz na analizy, w których będziesz potrzebować różnych innych funkcji. Dlatego warto wiedzieć, jak działa każda z nich. Grupuj według Funkcja agregująca Grupuj według łączy na podstawie określonego pola wszystkie rekordy w unikatowe grupy. Oto kilka kwestii, o których warto pamiętać przy stosowaniu tej funkcji:
Access uruchamia funkcję Grupuj według w kwerendzie podsumowującej przed przeprowadzeniem jakichkolwiek innych agregacji. Jeśli używasz tej funkcji razem z innymi funkcjami agregacji, najpierw zostanie wykonana funkcja Grupuj według. Ilustruje to przykład przedstawiony na rysunku 10.4. Access grupuje dane według pola Period przed dodaniem wartości z pola LineTotal.
Access sortuje uzyskane grupy w porządku rosnącym. Pola, dla których działa funkcja Grupuj według, domyślnie są sortowane w porządku rosnącym. Jeśli kwerenda zawiera kilka takich pól, dane w każdym z nich są sortowane w porządku rosnącym, począwszy od pierwszego pola od lewej.
Access traktuje uzyskaną grupę pól jak unikatowy element. Aby się o tym przekonać, utwórz kwerendę podobną do tej z rysunku 10.5. Kwerenda ta zlicza transakcje zarejestrowane w okresie 200701.
Rysunek 10.5. Ta kwerenda zwraca tylko jeden wiersz — zawiera on liczbę rekordów z okresu 200701
Teraz wróć do widoku projektu kwerendy i dodaj pole ProductID (zobacz rysunek 10.6). Tym razem Access potraktuje każdą kombinację okresu i numeru produktu jak unikatowy element. Poszczególne kombinacje są grupowane przed rozpoczęciem zliczania rekordów z każdej grupy. Korzyść z tego jest taka, że analizy zostają wzbogacone o nowy wymiar. Nie tylko wiadomo, ile transakcji dla każdego identyfikatora produktu zarejestrowano w okresie 200701, lecz także po dodaniu wszystkich transakcji można uzyskać dokładną liczbę wszystkich transakcji z tego okresu.
Rozdział 10. Poza kwerendy wybierające
321
Tworzenie aliasów nazw kolumn Zauważ, że na rysunku 10.4 Access automatycznie zmienił nazwę pola LineTotal na SumaOfLine Total. Jest to udogodnienie, dzięki któremu Access informuje użytkownika, że uzyskane wartości to wynik dodawania wartości z pola LineTotal. Zmiana nazwy w niektórych sytuacjach jest wygodna, jeśli jednak chcesz udostępniać wyniki innym osobom, możesz nadać polu lepszą nazwę. Wtedy przydają się aliasy. Alias to nazwa zastępcza, którą można nadać polu, aby było łatwiejsze do znalezienia w wynikach kwerendy. Aliasy pól można tworzyć na dwa sposoby:
Pierwsza metoda. Można poprzedzić nazwę pola tekstem, który ma pełnić funkcję nowej nazwy, a następnie dodać dwukropek. Poniższy rysunek pokazuje, jak utworzyć aliasy, aby nazwy kolumn w wynikach kwerendy były zrozumiałe dla użytkowników. Po uruchomieniu tej kwerendy w zbiorze danych znajdą się kolumny Period i TotalRevenue.
Druga metoda. Kliknij nazwę pola prawym przyciskiem myszy i wybierz opcję Właściwości. Pojawi się okno dialogowe Arkusz właściwości z właściwościami wybranego pola. W polu Tytuł w tym oknie wpisz pożądany alias, tak jak na poniższym rysunku.
Pamiętaj, że jeśli zdefiniujesz alias za pomocą Arkusza właściwości, wówczas w widoku projektu ani w instrukcji SQL-a kwerendy nic nie będzie wskazywało na to, że zastosowano alias. Może to utrudniać pracę użytkownikom kwerendy. Dlatego zwykle lepiej jest definiować aliasy za pomocą pierwszej metody.
322
Część III Kwerendy Accessa
Rysunek 10.6. Ta kwerenda zwraca więcej rekordów, a po zsumowaniu liczb elementów z każdej grupy uzyskiwana jest wartość 4164
Suma, Średnia, Policz, OdchStd, Wariancja Te funkcje agregujące wykonują obliczenia matematyczne na rekordach z wybranego pola. Warto zauważyć, że funkcje te nie uwzględniają rekordów o wartości Null (ignorują puste komórki).
Suma — określa łączną wartość wszystkich rekordów dla danego pola lub w określonej grupy. Działa tylko dla typów Autonumerowanie, Waluta, Data/Godzina i Liczba.
Średnia — oblicza średnią wartość wszystkich rekordów dla danego pola lub w określonej grupy. Działa tylko dla typów Autonumerowanie, Waluta, Data/Godzina i Liczba.
Policz — zlicza elementy w danym polu lub w określonej grupie. Działa dla wszystkich typów danych.
OdchStd — oblicza odchylenie standardowe dla wszystkich rekordów w danym polu lub w określonej grupie. Działa tylko dla typów Autonumerowanie, Waluta, Data/Godzina i Liczba.
Wariancja — oblicza, w jakim stopniu wartości w danym polu lub w określonej grupie różnią się od średniej dla tej grupy. Działa tylko dla typów Autonumerowanie, Waluta, Data/Godzina i Liczba.
Minimum, Maksimum, Pierwszy, Ostatni Funkcje te (w odróżnieniu od pozostałych funkcji agregujących) uwzględniają wszystkie rekordy w określonym polu lub w danej grupie, a następnie zwracają pojedynczą wartość dla grupy.
Minimum — zwraca wartość najmniejszego rekordu z danego pola lub z określonej grupy. Działa tylko dla typów Autonumerowanie, Waluta, Data/Godzina, Liczba i Krótki tekst.
Maksimum — zwraca wartość największego rekordu z danego pola lub z określonej grupy. Działa tylko dla typów Autonumerowanie, Waluta, Data/Godzina, Liczba i Krótki tekst.
Pierwszy — zwraca wartość pierwszego rekordu z danego pola lub z określonej grupy. Działa dla wszystkich typów danych.
Rozdział 10. Poza kwerendy wybierające
323
Ostatni — zwraca wartość ostatniego rekordu z danego pola lub z określonej grupy. Działa dla wszystkich typów danych.
Wyrażenie, Gdzie Jedną z podstawowych reguł dotyczących kwerend podsumowujących jest to, że w agregacji należy uwzględnić każde pole. Jednak w niektórych sytuacjach pola są stosowane jak narzędzia — służą do wykonywania obliczeń lub filtrowania. Pola tego rodzaju są środkiem do przeprowadzenia ostatecznych analiz, a nie ich częścią. Wtedy można wykorzystać funkcję Wyrażenie lub klauzulę Gdzie. Te narzędzia są wyjątkowe, ponieważ same nie grupują danych.
Wyrażenie — funkcję tę stosuje się zwykle przy przeprowadzaniu niestandardowych obliczeń lub używaniu innych funkcji w kwerendzie podsumowującej. Nakazuje ona Accessowi przeprowadzenie niestandardowych obliczeń niezależnie dla poszczególnych rekordów lub grup.
Gdzie — klauzula ta umożliwia zastosowanie kryterium do pola, które nie występuje w kwerendzie podsumowującej. W ten sposób można wykorzystać filtry w analizach.
Aby zobaczyć, jak działa funkcja agregująca Wyrażenie, utwórz w widoku projektu kwerendę podobną do tej z rysunku 10.7. Zauważ, że używane są tu dwa aliasy — Revenue (dla pola LineTotal) i Cost (dla zdefiniowanych niestandardowych obliczeń). Zastosowanie aliasu Revenue zapewnia zrozumiałą nazwę sumie wartości z pola LineTotal. Rysunek 10.7. Funkcja agregująca Wyrażenie umożliwia przeprowadzanie niestandardowych obliczeń osobno dla grup dotyczących poszczególnych okresów
Teraz można wykorzystać zapis [Revenue] do reprezentowania sumy wartości z pola LineTotal w niestandardowych obliczeniach. Funkcja agregująca Wyrażenie wiąże ze sobą wszystkie elementy, informując Accessa, że dla grup dotyczących poszczególnych okresów należy przeprowadzić obliczenia [Revenue]*.33. Opisana kwerenda zwraca łączne wpływy (Revenue) i koszty (Cost) dla grup dotyczących każdego okresu. Aby zobaczyć działanie klauzuli Gdzie, utwórz w widoku projektu kwerendę podobną do tej z rysunku 10.8. W wierszu Suma widać, że kwerenda grupuje dane według pola ProductID i sumuje wartości z pola LineTotal. Nie ustawiono jednak agregacji na pod-
324
Część III Kwerendy Accessa
stawie pola Period, ponieważ kwerenda ma korzystać z tego pola tylko przy filtrowaniu (ma odfiltrować wszystkie okresy oprócz jednego). Jako warunek w polu Period ustawiona jest wartość 200701. Gdy uruchomisz tę kwerendę w obecnej postaci, zobaczysz następujący komunikat o błędzie: Kwerenda nie zawiera podanego wyrażenia „Period” jako elementu funkcji agregującej. Rysunek 10.8. Uruchomienie tej kwerendy spowoduje błąd, ponieważ nie zdefiniowano agregacji w polu Period
Aby można było uruchomić tę kwerendę, należy kliknąć listę rozwijaną w wierszu Suma w polu Period i wybrać opcję Gdzie. Kwerenda powinna wyglądać podobnie do tej przedstawionej na rysunku 10.9. Po ustawieniu klauzuli Gdzie kwerendę można swobodnie uruchomić. Rysunek 10.9. Dodanie klauzuli Gdzie zapobiega błędowi i pozwala uruchomić kwerendę
Warto wspomnieć o jeszcze jednej kwestii związanej z klauzulą Gdzie. Zauważ, że na rysunku 10.9 pole wyboru w wierszu Pokaż w polu Period nie jest zaznaczone. Wynika to z tego, że w kwerendach podsumowujących nie można wyświetlać pól, dla których zastosowano klauzulę Gdzie. Dlatego wspomniane pole wyboru musi pozostać puste. Jeśli je zaznaczysz dla pola z klauzulą Gdzie, wówczas pojawi się komunikat o błędzie informujący, że nie można wyświetlić pola, w którym wiersz Suma ma wartość Gdzie.
Rozdział 10. Poza kwerendy wybierające
325
Kwerendy funkcjonalne Wcześniej wspomnieliśmy, że oprócz pobierania danych w trakcie analiz kształtuje się dane, modyfikuje je, usuwa i aktualizuje. Access do wykonywania tych zadań udostępnia kwerendy funkcjonalne. Niestety wiele osób nie korzysta z tych narzędzi. Zamiast tego użytkownicy eksportują małe porcje danych do Excela, aby wykonać te operacje. Rozwiązanie to może być odpowiednie, gdy analizy przeprowadzane są jednokrotnie dla małego zbioru danych. Co jednak zrobić, gdy te same analizy trzeba przeprowadzać co tydzień lub gdy zbiór danych jest za duży dla Excela? W takich sytuacjach wielokrotne eksportowanie danych do Excela, manipulowanie nimi i ponowne przenoszenie do Accessa jest niepraktyczne. Za pomocą kwerend funkcjonalnych można zwiększyć wydajność i zmniejszyć prawdopodobieństwo wystąpienia błędu. Cały proces analityczny można wtedy przeprowadzić w Accessie. Kwerendy funkcjonalne można traktować podobnie jak wybierające. Kwerenda funkcjonalna pobiera zbiór danych ze źródła na podstawie podanych definicji i kryteriów. Różnica polega na tym, że kwerenda funkcjonalna nie wyświetla zbioru danych, ale wykonuje na nim pewne operacje. Zależą one od typu kwerendy. Kwerend funkcjonalnych (w odróżnieniu od wybierających) nie można zastosować jako źródła danych formularza lub raportu, ponieważ kwerendy te nie zwracają zbioru danych.
Istnieją cztery rodzaje kwerend funkcjonalnych: tworzące tabele, usuwające, dołączające i aktualizujące. Kwerendy poszczególnych typów wykonują określone operacje.
Kwerendy tworzące tabele Kwerenda tworząca tabelę generuje nową tabelę z danymi z istniejącej tabeli. Nowa tabela zawiera rekordy zgodne z definicjami i kryteriami z kwerendy. Jeśli tworzysz kwerendę i chcesz zapisać zwrócone przez nią wyniki w odrębnej tabeli, możesz zastosować kwerendę tworzącą tabelę do wygenerowania trwałej tabeli na podstawie uzyskanych wyników. Następnie można wykorzystać nową tabelę w innych operacjach analitycznych. Przy budowaniu kwerend tworzących tabele trzeba określić nazwę generowanej tabeli. Jeśli podasz nazwę istniejącej tabeli, ta zostanie zastąpiona. Jeżeli w wyniku uruchomienia kwerendy tworzącej tabelę przypadkowo zastąpisz tabelę, nie będziesz mógł jej odtworzyć. Starannie dobierz nazwę tworzonej tabeli, aby uniknąć nadpisania istniejących informacji
.
Dane w tabeli generowanej przez kwerendę tworzącą tabelę nie są w żaden sposób powiązane z danymi źródłowymi. Oznacza to, że dane w nowej tabeli nie zostaną zaktualizowane po zmodyfikowaniu danych z pierwotnej tabeli.
Załóżmy, że dział marketingu poprosił Cię o przygotowanie listy klientów wraz z informacjami na temat historii transakcji każdego z nich. Potrzebne dane można uzyskać za pomocą kwerendy tworzącej tabelę. Aby zbudować taką kwerendę, wykonaj następujące czynności:
326
Część III Kwerendy Accessa
1. W widoku projektu kwerendy utwórz kwerendę podobną do tej z rysunku 10.10. Rysunek 10.10. Utwórz tę kwerendę w widoku projektu
2. Otwórz zakładkę PROJEKTOWANIE na wstążce, a następnie kliknij przycisk Utwórz tabelę. Pojawi się okno dialogowe Tworzenie tabeli (zobacz rysunek 10.11). Rysunek 10.11. Wprowadź nazwę nowej tabeli
3. W polu Nazwa tabeli wprowadź nazwę, jaką chcesz nadać nowej tabeli. Tu wpisz nazwę SalesHistory. Uważaj, aby nie wprowadzić nazwy tabeli, która już istnieje w bazie danych, ponieważ grozi to zastąpieniem pierwotnej tabeli. 4. Kliknij przycisk OK, aby zamknąć okno dialogowe, a następnie uruchom kwerendę. Access wyświetli komunikat ostrzegawczy widoczny na rysunku 10.12, aby poinformować, że wykonywanego zadania nie można anulować. Rysunek 10.12. Kliknij przycisk Tak, aby uruchomić kwerendę
5. Kliknij przycisk Tak, aby zatwierdzić operację i utworzyć nową tabelę. Gdy kwerenda zakończy działanie, wśród obiektów znajdziesz nową tabelę o nazwie SalesHistory.
Rozdział 10. Poza kwerendy wybierające
327
Przekształcanie wyników kwerendy podsumowującej w trwałe dane Wyników kwerendy podsumowującej z natury nie można modyfikować. Oznacza to, że nie można zmienić wartości rekordów zwróconych przez taką kwerendę, ponieważ nie istnieje relacja między zagregowanymi a pierwotnymi danymi. Można jednak przekształcić kwerendę podsumowującą w kwerendę tworzącą tabelę i utworzyć trwałą tabelę na podstawie wyników zwróconych przez kwerendę podsumowującą. W nowej trwałej tabeli można następnie swobodnie edytować dane. Aby zobaczyć działanie tej techniki, utwórz w widoku projektu kwerendę pokazaną na poniższym rysunku. Następnie przekształć ją na kwerendę tworzącą tabelę, podaj nazwę nowej tabeli i uruchom gotową kwerendę.
Zauważ, że na rysunku zdefiniowana jest kolumna o aliasie Customer. Po aliasie wystarczy wpisać słowo „All” ujęte w cudzysłów. Gdy uruchomisz tę kwerendę, zobaczysz, że w nowej tabeli znajdzie się kolumna o nazwie Customer, w której wartość każdego rekordu to All. Ten przykład pokazuje, że przy uruchamianiu kwerend tworzących tabele można dodać nową kolumnę, podając jej alias i określając jej zawartość po dwukropku.
Kwerendy usuwające Kwerenda usuwająca kasuje rekordy z tabeli na podstawie podanych definicji i warunków. Kwerenda tego typu wpływa na grupę rekordów spełniających podane kryterium. Choć rekordy można usuwać ręcznie, w niektórych sytuacjach zastosowanie kwerendy usuwającej jest wydajniejszym rozwiązaniem. Jeśli zbiór danych jest bardzo duży, kwerenda usuwająca skasuje rekordy szybciej niż można to zrobić ręcznie. Ponadto jeżeli chcesz usunąć wybrane rekordy na podstawie kilku skomplikowanych kryteriów, też warto zastosować kwerendę usuwającą. Także gdy zamierzasz skasować rekordy z jednej tabeli na podstawie porównania ich z rekordami z innej tabeli, kwerenda usuwająca będzie dobrym rozwiązaniem. Skutków wykonania kwerendy usuwającej (podobnie jak innych kwerend funkcjonalnych) nie można cofnąć. Kwerenda usuwająca jest jednak bardziej niebezpieczna od pozostałych kwerend funkcjonalnych, ponieważ usuniętych danych nie można odzyskać.
328
Część III Kwerendy Accessa
Ponieważ usuniętych danych nie można odzyskać, warto wyrobić sobie nawyk wykonywania opisanych poniżej czynności, które pozwalają uniknąć popełnienia poważnego błędu:
Uruchom kwerendę wybierającą, aby wyświetlić rekordy, które chcesz usunąć. Następnie przejrzyj te rekordy w celu upewnienia się, że na pewno powinny zostać skasowane. Dopiero wtedy uruchom kwerendę usuwającą.
Uruchom kwerendę wybierającą, aby wyświetlić rekordy, które chcesz usunąć. Następnie przekształć tę kwerendę na kwerendę tworzącą tabelę i uruchom ją, aby zarchiwizować kasowane dane. Dopiero wtedy uruchom kwerendę usuwającą w celu skasowania rekordów.
Utwórz kopię zapasową bazy danych przed uruchomieniem kwerendy usuwającej.
Załóżmy, że dział marketingu poinformował Cię, że wygenerowana tabela SalesHistory zawiera niepotrzebne rekordy. Pracownicy działu chcą, abyś skasował całą historię sprzed okresu 200806. Do wykonania tego zadania posłuży kwerenda usuwającą dla utworzonej wcześniej tabeli SalesHistory. Aby utworzyć kwerendę usuwającą, wykonaj następujące czynności: 1. Dodaj pole Period i wpisz < 200806 w polu Kryteria. Siatka QBA powinna wyglądać tak jak na rysunku 10.13. Rysunek 10.13. Ta kwerenda pobiera wszystkie rekordy z okresów wcześniejszych niż 200806
2. Przeprowadź test, uruchamiając kwerendę. 3. Przejrzyj zwrócone rekordy. Zauważ, że kryteria spełnia 6418 rekordów. Teraz wiadomo, że po uruchomieniu kwerendy usuwającej opartej na przedstawionej definicji skasowanych zostanie 6418 rekordów. 4. Wróć do widoku projektu. 5. Otwórz zakładkę PROJEKTOWANIE na wstążce i kliknij przycisk Usuń. 6. Ponownie uruchom kwerendę. Access wyświetli komunikat widoczny na rysunku 10.14, informując, że kwerenda usunie 6418 rekordów, oraz ostrzegając, iż operacji tej nie będzie można cofnąć. Liczba ta jest zgodna z oczekiwaniami, ponieważ wcześniejszy test także zwrócił 6418 rekordów.
Rozdział 10. Poza kwerendy wybierające
329
Rysunek 10.14. Kliknij przycisk Tak, aby kontynuować usuwanie
7. Ponieważ wszystko się zgadza, kliknij przycisk Tak, aby zatwierdzić operację i usunąć rekordy. Gdy zbiór danych jest bardzo duży, Access może wyświetlić komunikat z informacją, że polecenie Cofnij będzie niedostępne z uwagi na zbyt rozbudowaną operację lub brak wystarczającej ilości wolnej pamięci. Wiele osób błędnie interpretuje ten komunikat, myśląc, że operacji nie można wykonać z uwagi na za małą ilość wolnej pamięci. Komunikat informuje jednak o tym, że Access nie będzie umożliwiał wycofania zmian, gdy zechcesz kontynuować pracę. Dotyczy to kwerend usuwających, dołączających i aktualizujących.
Kwerendy dołączające Kwerenda dołączająca dodaje rekordy do tabeli na podstawie określonych definicji i warunków. Kwerendy tego rodzaju pozwalają dodawać wyniki na koniec tabeli (powoduje to dołączenie wierszy do tabeli). Kwerenda dołączająca kopiuje rekordy z jednej tabeli lub kwerendy na koniec innej tabeli. Takie kwerendy są przydatne przy przesyłaniu dużych zbiorów danych z jednej tabeli do drugiej. Jeśli istnieje tabela z dawnymi transakcjami służąca do archiwizowania rekordów z informacjami o transakcjach, za pomocą kwerendy dołączającej można dodać do niej najnowszy zbiór informacji z tabeli z nowymi transakcjami. Głównym zagrożeniem związanym z kwerendami dołączającymi jest utrata rekordów w procesie dołączania. Nie wszystkie dołączane rekordy rzeczywiście są dodawane do tabeli. Ponadto warto unikać wielokrotnego uruchamiania kwerend dołączających, ponieważ może to prowadzić do powielenia danych.
W procesie dołączania rekordy mogą zostać utracone z dwóch powodów. Oto one:
Nieudana konwersja typów — ten błąd ma miejsce, gdy typ danych źródłowych jest niezgodny z typem kolumny w docelowej tabeli. Załóżmy, że w tabeli istnieje pole o nazwie Koszt. Jest to pole typu tekstowego, ponieważ w niektórych rekordach koszt jest jeszcze nieznany i wartość pola to DU (do ustalenia). Jeśli spróbujesz dołączyć wartości z tego pola do innej tabeli, w której pole Koszt jest typu liczbowego, wszystkie wartości DU zostaną zmienione na Null, co spowoduje usunięcie oznaczenia DU.
Naruszenie klucza — ten błąd zachodzi przy próbie dołączenia powtarzających się rekordów do pola w docelowej tabeli, jeśli pole jest ustawione jako klucz główny lub jest indeksem, w którym nie mogą występować duplikaty. Tak więc jeżeli pole nie może zawierać powtarzających się wartości, Access nie zezwoli na dołączenie rekordu, który zawiera duplikat istniejącej już wartości z danego pola.
330
Część III Kwerendy Accessa
Usuwanie rekordów z jednej tabeli na podstawie rekordów z drugiej W trakcie analiz często będziesz musiał usuwać rekordy z jednej tabeli na podstawie rekordów z innej tabeli. Zadanie to jest stosunkowo łatwe, jednak wielu użytkowników ma z nim problem z powodu jednego prostego błędu. Kwerenda na poniższym rysunku wygląda prosto. Informuje Accessa, aby usunął rekordy danego klienta z tabeli Customer_ListA, jeśli klient ten występuje także w tabeli Customer_ListB.
Gdy uruchomisz tę kwerendę, Access wyświetli komunikat widoczny na poniższym rysunku. W komunikacie znajduje się prośba o określenie, która tabela zawiera usuwane rekordy.
Komunikat ten pojawia się wielu użytkownikom Accessa. Niestety nie określa on jednoznacznie, co trzeba zrobić, aby naprawić błąd. Rozwiązanie jest jednak proste. Najpierw należy usunąć z siatki QBE pole CustomerName. Następnie trzeba kliknąć dwukrotnie gwiazdkę (*) w tabeli Customer_ListA. Jest to bezpośrednia informacja dla Accessa, że usuwane rekordy znajdują się w tabeli Customer_ ListA. Na poniższym rysunku pokazano, jak w poprawny sposób zbudować potrzebną kwerendę.
Innym zagrożeniem dotyczącym kwerend dołączających jest to, że mogą nie zostać wykonane. Może się to zdarzyć z pięciu powodów:
Naruszenie blokady — ten błąd zdarza się, gdy docelowa tabela jest wyświetlona w widoku projektu lub jest używana przez inną osobę w sieci.
Rozdział 10. Poza kwerendy wybierające
331
Naruszenie reguły sprawdzania poprawności — ten błąd ma miejsce, gdy pole w docelowej tabeli ma ustawioną jedną z poniższych właściwości:
Właściwość Wymagane ustawiona na Tak — jeśli pole w docelowej tabeli ma właściwość Wymagane ustawioną na Tak i nie dołączysz danych w tym polu, kwerenda dołączająca nie zostanie wykonana.
Właściwość Zerowa dł. dozwolona ustawiona na Nie — jeśli pole w docelowej tabeli ma właściwość Zerowa dł. dozwolona ustawioną na Nie i nie dołączysz danych w tym polu, kwerenda dołączająca nie zostanie wykonana.
Właściwość Reguła poprawności ustawiona na dowolną wartość — jeżeli dla pola z docelowej tabeli ustawiono regułę poprawności, a kwerenda dołączająca narusza tę regułę, kwerenda nie zostanie wykonana. Na przykład jeśli zgodnie z regułą poprawności pole Koszt w docelowej tabeli musi mieć wartość większą od zera (reguła > 0), nie można dołączyć rekordów z wartością zero lub mniejszą.
Na szczęście Access ostrzega przed popełnieniem każdego z tych błędów. Na rysunku 10.15 przedstawiono komunikat ostrzegawczy, który informuje o tym, że z powodu błędów nie można dołączyć wszystkich rekordów. Z komunikatu dowiesz się też, ilu rekordów nie można dołączyć. Tu z uwagi na naruszenie klucza nie można dodać 5979 rekordów. W oknie można kliknąć Tak lub Nie. Jeśli klikniesz Tak, ostrzeżenie zostanie zignorowane i kwerenda dołączy rekordy (oprócz tych, które powodują błędy). Jeżeli wybierzesz opcję Nie, kwerenda zostanie anulowana, co oznacza, że nie dołączy żadnych rekordów.
Rysunek 10.15. Komunikat ostrzegawczy informuje, że w procesie dołączania zostaną utracone rekordy Warto pamiętać, że skutków uruchomienia kwerend dołączających (podobnie jak innych kwerend funkcjonalnych) nie można cofnąć. Jeśli potrafisz wykryć rekordy dołączone do docelowej tabeli, możesz anulować operację dołączania, usuwając nowe rekordy. Oczywiście wymaga to opracowania metody identyfikowania dołączonych rekordów. Możesz na przykład utworzyć pole z kodem lub tagiem, który informuje, że rekord jest dołączony. Kodem tym może być cokolwiek — od daty po prosty znak.
Załóżmy, że dział marketingu poinformował Cię, iż podał błędne dane — potrzebna jest historia transakcji z roku podatkowego 2008. Dlatego do raportu SalesHistory trzeba dodać okresy od 200801 do 200805. Do wykonania tego zadania posłuży kwerenda dołączająca.
332
Część III Kwerendy Accessa
Aby uzyskać potrzebne dane, wykonaj następujące czynności: 1. W widoku projektu utwórz kwerendę podobną do tej z rysunku 10.16. Rysunek 10.16. Ta kwerenda pobiera wszystkie rekordy z okresów od 200801 do 200805
2. Otwórz zakładkę PROJEKTOWANIE na wstążce, a następnie kliknij przycisk Dołącz. Pojawi się okno dialogowe Dołączanie (zobacz rysunek 10.17). Rysunek 10.17. Wprowadź nazwę tabeli, do której chcesz dołączyć wyniki wykonania kwerendy
3. W polu Nazwa tabeli wpisz nazwę tabeli, do której chcesz dołączyć wyniki wykonania kwerendy. Tu wprowadź nazwę SalesHistory. 4. Po wpisaniu nazwy docelowej tabeli kliknij przycisk OK. W siatce QBE pod wierszem Sortuj pojawi się wiersz Dołączanie do (zobacz rysunek 10.18). Należy podać nazwę pola z docelowej tabeli, w którym mają się pojawić informacje zwrócone przez kwerendę. Na przykład w wierszu Dołączanie do dla pola Period znajduje się słowo Period. Oznacza to, że dane z pola Period kwerendy zostaną dodane do pola o tej samej nazwie w tabeli SalesHistory. 5. Uruchom kwerendę. Access wyświetli komunikat (zobacz rysunek 10.19) z informacją, że dodanych zostanie 1760 wierszy. Komunikat zawiera też ostrzeżenie, że operacji nie można cofnąć. 6. Kliknij przycisk Tak, aby zatwierdzić operację i dodać rekordy.
Rozdział 10. Poza kwerendy wybierające
333
Rysunek 10.18. W wierszu Dołączanie do wybierz nazwę pola z docelowej tabeli, do którego chcesz dołączyć informacje zwrócone przez kwerendę
Rysunek 10.19. Kliknij przycisk Tak, aby kontynuować dołączanie
Dodawanie wiersza z sumą do zbioru danych Twój przełożony oczekuje, że przygotujesz raport z podsumowaniem wpływów, w którym znajdzie się suma wpływów uzyskanych przez każdego managera z poszczególnych rynków. Przełożony chce też otrzymać łączny poziom wpływów z każdego rynku. Zamiast generować dwa odrębne raporty możesz udostępnić jedną tabelę ze szczegółowymi danymi na temat managerów i z łącznymi wpływami dla poszczególnych rynków. Jest to łatwe: 1. Utwórz w widoku projektu kwerendę wyglądającą podobnie do tej z poniższego rysunku. Zauważ, że utworzono tu alias dla pola LineTotal.
2. Przekształć ją na kwerendę tworzącą tabelę i nazwij tabelę RevenueSummary. 3. Uruchom kwerendę.
334
Część III Kwerendy Accessa
4. Następnie wykorzystaj wygenerowaną właśnie tabelę RevenueSummary do podsumowania wpływów dla poszczególnych rynków. W tym celu utwórz w widoku projektu kwerendę podobną do tej z poniższego rysunku.
Przyjrzyj się przez chwilę kwerendzie z rysunku. Zauważ, że znajduje się tu niestandardowe pole Product_Category z wartością (Total). To gwarantuje, że można będzie zidentyfikować wiersze z sumami dodane do tabeli RevenueSummary — w wierszach tych w polu Product_Category znajdzie się wartość Total. 5. Przekształć kwerendę na kwerendę dołączającą i dodaj wyniki do tabeli RevenueSummary. Teraz możesz otworzyć tabelę RevenueSummary i posortować dane według pól Market i Product_ Category. Na poniższym rysunku widać, że udało się utworzyć tabelę zawierającą łączne wpływy dla każdej kategorii produktów i łączne wpływy dla każdego rynku.
Kwerendy aktualizujące Głównym powodem stosowania kwerend aktualizujących jest dążenie do zaoszczędzenia czasu. Nie ma łatwiejszej metody jednoczesnej edycji dużych ilości danych niż uruchomienie kwerendy aktualizującej. Wyobraź sobie, że w tabeli Customers znajdują się kody pocztowe klientów. Jeśli kod pocztowy 32-750 zostanie zmieniony na 32-751, będziesz mógł łatwo zaktualizować tabelę Customers i zastąpić wartość 32-750 kodem 32-751.
Rozdział 10. Poza kwerendy wybierające
335
Przy stosowaniu kwerend aktualizujących (jak też innych kwerend funkcjonalnych) trzeba zadbać o to, aby nie znaleźć się w sytuacji, w której nie da się cofnąć skutków wykonania kwerendy. Aby umożliwić sobie odzyskanie pierwotnych danych po popełnieniu błędu, przed uruchomieniem kwerendy aktualizującej utwórz kopię bazy. Możesz też uruchomić kwerendę wybierającą w celu wyświetlenia danych, a następnie przekształcić ją na kwerendę tworzącą tabelę. Kwerendę tworzącą tabelę możesz wykorzystać do zarchiwizowania aktualizowanych danych, po czym możesz uruchomić kwerendę aktualizującą w celu zmodyfikowania rekordów.
Załóżmy, że się dowiedziałeś, iż kod pocztowy wszystkich klientów o kodzie 33605 został zmieniony na kod 33606. Aby baza danych zawierała poprawne informacje, trzeba w tabeli Dim_Customers zaktualizować wszystkie kody pocztowe 33605 wartością 33606. Poniżej wyjaśniamy, jak to zrobić: 1. W widoku projektu utwórz kwerendę podobną do tej z rysunku 10.20. Rysunek 10.20. Ta kwerenda pobiera wszystkich klientów, których kod pocztowy to 33605
2. Przeprowadź test, uruchamiając kwerendę. 3. Przejrzyj zwrócone rekordy. Zauważ, że kryteria spełnia sześć rekordów. Wiesz zatem, że po uruchomieniu tak zdefiniowanej kwerendy aktualizującej zmodyfikowanych zostanie sześć rekordów. 4. Wróć do widoku projektu. 5. Otwórz zakładkę PROJEKTOWANIE na wstążce i kliknij przycisk Aktualizuj. W siatce QBE pojawi się wiersz Aktualizacja do. Należy wpisać w nim wartość, która ma zastąpić bieżące dane. W kwerendzie pokazanej na rysunku 10.21 kod pocztowy wybranych rekordów ma zostać zmieniony na 33606. Rysunek 10.21. Ta kwerenda aktualizuje kod pocztowy wszystkich klientów z kodem 33605 wartością 33606
336
Część III Kwerendy Accessa
6. Uruchom kwerendę. Access wyświetli komunikat widoczny na rysunku 10.22. Komunikat informuje, że kwerenda zaktualizuje sześć wierszy danych, oraz ostrzega, że operacji nie będzie można cofnąć. Sześć to liczba zgodna z oczekiwaniami, ponieważ we wcześniejszym teście zwróconych zostało sześć rekordów. Rysunek 10.22. Kliknij przycisk Tak, aby kontynuować aktualizowanie
7. Ponieważ wszystko się zgadza, kliknij przycisk Tak, aby zatwierdzić operację i zaktualizować rekordy.
Stosowanie wyrażeń w kwerendach aktualizujących Natrafisz na sytuacje, w których będziesz musiał przeprowadzić aktualizację pojedynczych rekordów. Wtedy zamiast ustawiać w wielu rekordach określoną wartość należy zaktualizować każdy rekord indywidualnie na podstawie wyrażenia. Aby zobaczyć, jak to działa, utwórz w widoku projektu kwerendę na podstawie tabeli SalesHistory wygenerowanej w punkcie „Kwerendy tworzące tabele” we wcześniejszej części rozdziału. Kwerenda powinna wyglądać tak jak na poniższym rysunku.
Ta kwerenda informuje Accessa, że ma zaktualizować pole Period, łącząc tekst „PD” i wcześniejszą wartość z tego pola. Po uruchomieniu tej kwerendy wszystkie wartości w polu Period będą miały przedrostek „PD”. Na przykład zamiast 200801 pojawi się wartość PD 200801. Pamiętaj, że to tylko jedno przykładowe wyrażenie, które można wykorzystać do zaktualizowania rekordów. W kwerendach aktualizujących możesz zastosować niemal dowolne wyrażenie — od funkcji matematycznych po operacje na łańcuchach znaków.
Rozdział 10. Poza kwerendy wybierające
337
Kwerendy krzyżowe Kwerenda krzyżowa to kwerenda podsumowująca specjalnego rodzaju, która podsumowuje wartości z określonego pola i grupuje je na podstawie dwuwymiarowej siatki. Jeden wymiar jest określany przez wartości z lewej krawędzi siatki, a drugi — przez wartości z górnej krawędzi siatki. Kwerendy krzyżowe doskonale nadają się do analizowania trendów czasowych i pozwalają na szybkie wykrywanie anomalii w zbiorze danych. Kwerendy krzyżowe mają stosunkowo prostą strukturę. Potrzebne są przynajmniej trzy pola, aby można było utworzyć siatkę określającą kwerendę krzyżową. Pierwsze pole wyznacza nagłówki wierszy, drugie — nagłówki kolumn, a na podstawie trzeciego tworzone są podsumowania danych w głównej części siatki. Dane w środku można utworzyć za pomocą dowolnej funkcji agregującej — Suma, Liczba, Średnia itd. Na rysunku 10.23 przedstawiono podstawową strukturę kwerendy krzyżowej.
O modyfikowalnych zbiorach danych Nie wszystkie zbiory danych są modyfikowalne. Czasem Access nie może z pewnych przyczyn zmodyfikować danego zbioru danych. Jeśli wykonywanie kwerendy aktualizującej się nie powiedzie, wówczas pojawi się komunikat z informacją, że w operacji trzeba zastosować modyfikowalną kwerendę lub że zbiór rekordów nie jest modyfikowalny. Kwerenda aktualizująca może nie zadziałać z następujących powodów:
W kwerendzie używane jest sprzężenie z inną kwerendą. Aby rozwiązać ten problem, utwórz tabelę tymczasową, którą można wykorzystać w sprzężeniu zamiast innej kwerendy.
Kwerenda jest oparta na kwerendzie krzyżowej, kwerendzie podsumowującej, kwerendzie składającej lub podkwerendzie, w której wykorzystano funkcje agregujące. Aby rozwiązać ten problem, utwórz tabelę tymczasową, którą można wykorzystać w sprzężeniu zamiast wspomnianych kwerend.
W kwerendzie wykorzystano przynajmniej trzy tabele, między którymi występują relacje wiele do jednego do wielu. Aby rozwiązać ten problem, utwórz tabelę tymczasową, którą można wykorzystać bez stosowania relacji.
Kwerenda jest oparta na tabeli, w której właściwość Wartości unikatowe ma wartość Tak. Aby rozwiązać ten problem, należy ustawić wartość tej właściwości dla tabeli na Nie.
W kwerendzie wykorzystano tabelę zablokowaną przez innego użytkownika. Aby rozwiązać ten problem, należy się upewnić, że tabela nie jest otwarta w widoku projektu lub nie jest zablokowana przez inną osobę.
W kwerendzie używana jest tabela z bazy danych otwartej w trybie tylko do odczytu lub zapisanej w napędzie przeznaczonym tylko do odczytu. Aby rozwiązać ten problem, uzyskaj uprawnienia do zapisu do bazy lub napędu.
W kwerendzie używana jest dołączona tabela ODBC bez unikatowego indeksu lub tabela Paradox bez klucza głównego. Aby rozwiązać ten problem, dodaj klucz główny lub unikatowy indeks do dołączonej tabeli.
W kwerendzie wykorzystano kwerendę przekazującą SQL-a. Aby rozwiązać ten problem, utwórz tabelę tymczasową, którą można wykorzystać zamiast kwerendy.
338
Część III Kwerendy Accessa
Rysunek 10.23. Podstawowa struktura kwerendy krzyżowej
Są dwie metody tworzenia kwerend krzyżowych: można wykorzystać kreator lub utworzyć kwerendę krzyżową ręcznie, za pomocą siatki QBE.
Używanie kreatora kwerend krzyżowych Aby utworzyć kwerendę krzyżową za pomocą kreatora, wykonaj następujące czynności: 1. Otwórz zakładkę TWORZENIE na wstążce, a następnie kliknij przycisk Kreator kwerend. Pojawi się okno dialogowe Nowa kwerenda (zobacz rysunek 10.24). Rysunek 10.24. W oknie dialogowym Nowa kwerenda wybierz opcję Kreator kwerend krzyżowych
2. Z listy wybierz opcję Kreator kwerend krzyżowych, a następnie kliknij przycisk OK. Pierwszy etap kreatora kwerend krzyżowych wymaga podania źródła danych. Na rysunku 10.25 widać, że jako źródło danych można wykorzystać kwerendę lub tabelę. Tu będzie to tabela Dim_Transactions. Rysunek 10.25. Wybierz źródło danych dla kwerendy krzyżowej
Rozdział 10. Poza kwerendy wybierające
339
3. Wybierz tabelę Dim_Transactions, a następnie kliknij przycisk Dalej. Kolejny krok wymaga określenia pól używanych do generowania nagłówków wierszy. 4. Wybierz pole ProductID i kliknij przycisk z symbolem >, aby przenieść pole na listę wybranych elementów. Okno dialogowe powinno wyglądać tak jak na rysunku 10.26. Zauważ, że pole ProductID pojawia się teraz na przykładowym diagramie w dolnej części okna dialogowego. Rysunek 10.26. Wybierz pole ProductID, a następnie kliknij przycisk Dalej
Do określania nagłówków wierszy w kwerendach krzyżowych można wykorzystać do trzech pól. Pamiętaj, że Access traktuje każdą kombinację pól jak unikatowy element. Oznacza to, że na podstawie kombinacji pól najpierw generowane są grupy, a następnie agregowane są dane z każdej z tych grup. Następny krok polega na zidentyfikowaniu pola, które posłuży za nagłówek kolumn w kwerendzie krzyżowej. Do określania nagłówków kolumn można wykorzystać tylko jedno pole. 5. Wybierz z listy pole OrderDate. Zauważ, że przykładowy diagram w dolnej części rysunku 10.27 został zaktualizowany — używane jest w nim pole OrderDate. Rysunek 10.27. Wybierz pole OrderDate, a następnie kliknij przycisk Dalej
340
Część III Kwerendy Accessa Jeśli pole używane jako nagłówek kolumny zawiera dane obejmujące kropkę (.), wykrzyknik (!) lub nawias kwadratowy ([ lub ]), znaki te zostaną zastąpione w nagłówku podkreśleniem (_). Nie dzieje się tak, gdy te same dane są używane w nagłówkach wierszy. Jest to celowe rozwiązanie, ponieważ konwencje nazewnicze Accessa zabraniają stosowania wymienionych znaków w nazwach pól.
Jeśli jako nagłówki kolumn używane jest pole z datą (takie jak OrderDate w przykładzie), należy wykonać krok przedstawiony na rysunku 10.28. W tym kroku można określić przedziały w celu pogrupowania dat. Rysunek 10.28. Wybierz opcję Kwartał, a następnie kliknij przycisk Dalej
6. Wybierz opcję Kwartał. Zauważ, że przykładowy diagram w dolnej części okna dialogowego jest odpowiednio aktualizowany. To już prawie koniec. W przedostatnim kroku (zobacz rysunek 10.29) określ pole, na podstawie którego chcesz agregować dane, i wybierz używaną funkcję. Rysunek 10.29. Wybierz pole LineTotal i funkcję Suma, a następnie kliknij przycisk Dalej
Rozdział 10. Poza kwerendy wybierające
341
7. Z listy pól wybierz LineTotal, a następnie wybierz Suma z listy funkcji. Zwróć uwagę na pole wyboru Tak, dołącz sumy wierszy. Pole to jest domyślnie zaznaczone, co gwarantuje, że w kwerendzie krzyżowej znajdzie się kolumna z sumami wartości z poszczególnych wierszy. Jeśli nie chcesz dodawać takiej kolumny, usuń zaznaczenie pola wyboru. Gdy przyjrzysz się przykładowemu diagramowi w dolnej części okna dialogowego, zrozumiesz, jak działa gotowa kwerenda krzyżowa. Opisana tu kwerenda oblicza sumę wartości z pola LineTotal w ujęciu kwartalnym dla każdej wartości z pola ProductID. Ostatni krok, przedstawiony na rysunku 10.30, polega na nadaniu nazwy kwerendzie krzyżowej. Rysunek 10.30. Kliknij przycisk Zakończ, aby zobaczyć wyniki wykonania kwerendy
8. Nazwij kwerendę Podsumowanie kwartalne wg produktów. Po nadaniu nazwy możesz wyświetlić kwerendę lub zmodyfikować jej projekt. 9. Załóżmy, że chcesz wyświetlić wyniki kwerendy. Kliknij przycisk Zakończ. Za pomocą kilku kliknięć udało się uzyskać rozbudowany przegląd wpływów uzyskanych w poszczególnych kwartałach dzięki poszczególnym produktom (zobacz rysunek 10.31). Rysunek 10.31. Wystarczy kilka kliknięć, aby otrzymać zaawansowane analizy
342
Część III Kwerendy Accessa
Przekształcanie kwerend krzyżowych na trwałe dane Z pewnością zdarzą Ci się sytuacje, gdy będziesz musiał przekształcić wyniki kwerendy krzyżowej na trwałe dane, aby móc wykorzystać je w dalszych analizach. Można to zrobić za pomocą prostej sztuczki: wystarczy wykorzystać zapisaną kwerendę krzyżową w kwerendzie tworzącej tabelę i wygenerować w ten sposób nową tabelę na podstawie wyników wykonania kwerendy krzyżowej. Zacznij od utworzenia nowej kwerendy w widoku projektu. Dodaj do niej zapisaną kwerendę krzyżową. Na poniższym rysunku zwróć uwagę na to, że wykorzystano utworzoną wcześniej kwerendę Podsumowanie kwartalne wg produktów. Dodaj pola, które chcesz umieścić w nowej tabeli.
Następnie przekształć projekt w kwerendę tworzącą tabelę i uruchom go. Po wykonaniu kwerendy tworzącej tabelę uzyskasz trwałą tabelę z wynikami zwróconymi przez kwerendę krzyżową.
Ręczne tworzenie kwerend krzyżowych Choć kreator kwerend krzyżowych umożliwia łatwe tworzenie takich kwerend, ma pewne ograniczenia, które mogą utrudniać analizę danych. Oto te ograniczenia:
Można wybrać tylko jedno źródło danych dla kwerendy krzyżowej. Oznacza to, że jeśli potrzebujesz danych z różnych tabel, będziesz musiał wykonać dodatkowe kroki w celu utworzenia kwerendy tymczasowej używanej jako źródło danych.
Kreator kwerend krzyżowych nie umożliwia filtrowania ani ograniczania danych na podstawie kryteriów.
Można wykorzystać tylko trzy pola jako nagłówki wierszy.
Nie można bezpośrednio zdefiniować kolejności nagłówków kolumn.
Dobra wiadomość jest taka, że kwerendę krzyżową można utworzyć ręcznie za pomocą siatki QBE. Technika ta zapewnia większą swobodę w analizach. Tworzenie kwerend krzyżowych za pomocą siatki QBE Poniżej opisano, jak utworzyć kwerendę krzyżową za pomocą siatki QBE: 1. Utwórz kwerendę podsumowującą przedstawioną na rysunku 10.32. Zauważ, że potrzebne pola pochodzą z różnych tabel. Jedną z zalet ręcznego tworzenia kwerend krzyżowych jest to, że nie trzeba ograniczać się do jednego źródła danych — przy definiowaniu pól kwerendy można wykorzystać dowolną liczbę takich źródeł.
Rozdział 10. Poza kwerendy wybierające
343
Rysunek 10.32. Utwórz przedstawioną tu kwerendę podsumowującą
2. Otwórz zakładkę PROJEKTOWANIE na wstążce i kliknij przycisk Krzyżowa. W siatce QBE pojawi się nowy wiersz o nazwie Krzyżowe (zobacz rysunek 10.33). Pozwala on określić, jaką rolę każde pole odgrywa w tworzonej kwerendzie krzyżowej.
Rysunek 10.33. W wierszu Krzyżowe określ funkcję każdego pola
3. Pod każdym polem wybierz w kolumnie Krzyżowe, czy pole ma być nagłówkiem wiersza, nagłówkiem kolumny czy wartością. 4. Uruchom kwerendę, aby zobaczyć, jak działa. W trakcie tworzenia kwerendy krzyżowej w siatce QBE pamiętaj o następujących zagadnieniach:
Trzeba podać przynajmniej po jednym polu pełniącym funkcję nagłówka wiersza, nagłówka kolumny i wartości.
Nie można zdefiniować więcej niż jednego pola dla nagłówków kolumn.
Nie można zdefiniować więcej niż jednego pola dla wartości.
Nie jesteś ograniczony do stosowania tylko trzech pól dla nagłówków wierszy.
344
Część III Kwerendy Accessa
Tworzenie kwerend krzyżowych z kilkoma polami wartości Jedną z reguł tworzenia kwerend krzyżowych jest to, że nie można podawać więcej niż jednego pola wartości. Można jednak obejść to ograniczenie i przeanalizować więcej niż jeden wskaźnik dla tych samych grup danych. Aby zrozumieć, jak to zrobić, utwórz kwerendę krzyżową przedstawioną na poniższym rysunku i zapisz ją pod nazwą Krzyżowa-1. Nagłówkiem kolumny jest niestandardowe pole, które zawiera nazwę regionu i słowo Revenue.
Następnie utwórz nową kwerendę krzyżową, przedstawioną na poniższym rysunku, i zapisz ją pod nazwą Krzyżowa-2. Także tu nagłówkiem kolumny jest niestandardowe pole. Zawiera ono nazwę regionu i słowo Transactions.
W ostatnim kroku utwórz kwerendę wybierającą, która złącza obie kwerendy krzyżowe na podstawie nagłówków wierszy. W przykładzie przedstawionym na poniższym rysunku nagłówkiem wiersza jest pole Product_Category. Dodaj wszystkie pola w odpowiedniej kolejności. Gdy uruchomisz tę kwerendę, otrzymasz analizy obejmujące obie kwerendy krzyżowe. W ten sposób uzyskasz wartości z kilku pól. Warto pamiętać, że jeśli jako nagłówków wierszy używa się kilku pól, przy złączaniu trzeba uwzględnić każde z nich.
Rozdział 10. Poza kwerendy wybierające
345
Dostosowywanie kwerend krzyżowych Kwerendy krzyżowe są przydatne, jednak czasem trzeba je dostosować, aby uzyskać oczekiwane wyniki. W tym podpunkcie wyjaśniamy kilka sposobów, które pozwalają dopasować kwerendy krzyżowe do własnych potrzeb. Definiowanie kryteriów w kwerendach krzyżowych
Możliwość filtrowania i ograniczania wyników kwerend krzyżowych to następna zaleta związana z ręcznym tworzeniem takich kwerend. Aby zdefiniować filtr dla kwerendy krzyżowej, wystarczy określić kryteria, tak jak w każdej innej kwerendzie podsumowującej. Przedstawia to rysunek 10.34.
Rysunek 10.34. Można zdefiniować kryteria, aby przefiltrować wyniki zwracane przez kwerendę krzyżową
346
Część III Kwerendy Accessa Zmienianie kolejności sortowania nagłówków kolumn kwerendy krzyżowej
W kwerendach krzyżowych nagłówki domyślnie sortowane są w kolejności alfabetycznej. Na przykład kwerenda krzyżowa z rysunku 10.35 generuje zbiór danych, w których nagłówki kolumn podane są w następującej kolejności: Canada, Midwest, North, Northeast, South, Southeast, Southwest i West.
Rysunek 10.35. Ta kwerenda krzyżowa wyświetla wszystkie regiony jako uporządkowane alfabetycznie kolumny
W większości sytuacji jest to odpowiednie rozwiązanie, jednak jeśli centrala firmy znajduje się w Kalifornii, zarząd najpierw chce zapoznać się z wynikami z regionu West. Kolejność kolumn w kwerendzie krzyżowej można określić, zmieniając wartość atrybutu Nagłówki kolumn we właściwościach kwerendy. Aby uzyskać dostęp do atrybutu Nagłówki kolumn, wykonaj następujące czynności: 1. Otwórz kwerendę w widoku projektu. 2. Kliknij prawym przyciskiem myszy szary obszar nad białą siatką QBE i wybierz opcję Właściwości. Pojawi się okno dialogowe z właściwościami kwerendy (zobacz rysunek 10.36). Rysunek 10.36. Atrybut Nagłówki kolumn jest ustawiony tak, aby kolumny pojawiały się w następującej kolejności: West, Canada, Midwest, North, Northeast, South, Southeast i Southwest
Rozdział 10. Poza kwerendy wybierające
347
3. W atrybucie Nagłówki kolumn zmień kolejność, w jakiej mają się pojawiać nagłówki kolumn. Możliwość zmiany wartości atrybutu Nagłówki kolumn jest przydatna, gdy chcesz wyświetlić miesiące w naturalnej kolejności, a nie w kolejności alfabetycznej. Wystarczy wpisać nazwy kolumn z miesiącami w kolejności, w jakiej mają się pojawić, np. „Styczeń”, „Luty”, „Marzec”, „Kwiecień”, „Maj”, „Czerwiec”, „Lipiec”, „Sierpień”, „Wrzesień”, „Październik”, „Listopad”, „Grudzień”.
W trakcie korzystania z atrybutu Nagłówki kolumn należy pamiętać o następujących kwestiach:
Nazwy poszczególnych kolumn trzeba ująć w cudzysłów i oddzielić od siebie przecinkami.
Błąd w nazwie kolumny może prowadzić do pominięcia kolumny w wynikach zwracanych przez kwerendę krzyżową. Wtedy zamiast tej kolumny pojawia się pusta fikcyjna kolumna o błędnie zapisanej nazwie.
Trzeba zapisać każdą kolumnę, która ma się znaleźć w wynikach kwerendy krzyżowej. Pominięcie kolumny w atrybucie Nagłówki kolumn spowoduje, że nie pojawi się ona w wynikach.
Gdy usuniesz zawartość atrybutu Nagłówki kolumn, wszystkie kolumny pojawią się w kolejności alfabetycznej.
348
Część III Kwerendy Accessa
Część IV
Analizowanie danych w Accessie W tej części:
Rozdział 11. Przekształcanie danych
Rozdział 12. Obliczenia i daty
Rozdział 13. Analizy warunkowe
Rozdział 14. Podstawy SQL-a w Accessie
Rozdział 15. Podkwerendy i funkcje agregujące domeny
Rozdział 16. Statystyki opisowe
Wiesz już, jak porządkować dane w tabelach i jak za pomocą kwerend wchodzić w interakcje z tymi danymi. Dzięki rozdziałom z tej części poznasz narzędzia i funkcje Accessa 2013, które pozwolą Ci przeprowadzać bardziej wartościowe analizy danych. Wykorzystanie Accessa do analizy danych pomaga usprawnić proces analityczny, zwiększyć wydajność i przeanalizować większe zbiory danych. Rozdział 11. dotyczy przekształcania danych. Znajdziesz tu przykłady ilustrujące, jak porządkować i kształtować surowe dane, tak aby możne je było prezentować. Rozdział 12. zawiera szczegółowe instrukcje na temat opracowywania i stosowania niestandardowych obliczeń w analizach. Z tego rozdziału dowiesz się też, jak pracować z datami i przeprowadzać na nich proste obliczenia. Rozdział 13. zawiera wprowadzenie do technik analizy warunkowej, które pozwalają dodać logikę biznesową do procesu analitycznego. Rozdział 14. poświęcony jest składni SQL-a. Znajdziesz tu SQL-owe kwerendy, które można wykorzystać do usprawnienia analiz. Rozdział 15. to wprowadzenie do podkwerend i funkcji agregujących domeny. W rozdziale 16. znajdziesz wiele zaawansowanych analiz statystycznych, które można przeprowadzić za pomocą podkwerend i funkcji agregujących dla zbiorów rekordów.
350
Część IV Analizowanie danych w Accessie
Rozdział 11.
Przekształcanie danych W tym rozdziale:
Wyszukiwanie i usuwanie powtarzających się rekordów
Uzupełnianie pustych pól
Scalanie pól tekstowych
Zmienianie wielkości znaków
Usuwanie początkowych i końcowych spacji
Wyszukiwanie i zastępowanie konkretnego tekstu
Uzupełnianie łańcuchów znaków
Przetwarzanie łańcuchów znaków
Przekształcenia danych zwykle wymagają wykonania określonych czynności, które mają pozwolić na uporządkowanie danych: określenie struktury tabeli, usunięcie powtórzeń, oczyszczenie tekstu, usunięcie pustych pól lub ustandaryzowanie pól z datami. Otrzymane dane często są nieuporządkowane i nieprzetworzone. Oznacza to, że mogą występować w nich powtórzenia, puste pola, niespójny tekst itd. Przed przeprowadzeniem wartościowych analiz należy przekształcić i uporządkować dane. Wiele osób przechowuje dane w Accessie, jednak nieliczni użytkownicy wykorzystują ten program do przekształcania danych. Część osób woli wyeksportować dane do Excela, tam przeprowadzić niezbędne operacje porządkujące, a następnie zaimportować dane z powrotem do Accessa. Wynika to z dobrej znajomości środowiska Excela, które zapewnia wiele możliwości. Jednak eksportowanie i importowanie danych w celu wykonania prostych zadań to niewydajne podejście, zwłaszcza gdy zbiór danych jest duży. W tym rozdziale znajdziesz wprowadzenie do wybranych narzędzi i technik Accessa, które ułatwiają porządkowanie i „dopieszczanie” danych bez konieczności korzystania z Excela. Wyjściową bazę danych do tego rozdziału, Rozdział11.accdb, można pobrać z witryny poświęconej tej książce.
352
Część IV Analizowanie danych w Accessie
Wyszukiwanie i usuwanie powtarzających się rekordów Powtarzające się rekordy bardzo utrudniają przeprowadzanie analiz. Duplikaty mogą mieć poważny wpływ na wykonywane analizy — mogą zakłócić niemal wszystkie wskaźniki, podsumowania i wnioski analityczne. Dlatego po otrzymaniu nowego zbioru danych znalezienie i usunięcie powtarzających się rekordów powinno być priorytetem.
Czym są powtarzające się rekordy? Przed rozpoczęciem wyszukiwania i usuwania duplikatów należy się zastanowić, czym są powtarzające się rekordy (inaczej duplikaty). Przyjrzyj się tabeli z rysunku 11.1. Zawiera ona 11 rekordów. Ile jest wśród nich duplikatów?
Rysunek 11.1. Czy w tabeli występują powtarzające się rekordy? Zależy to od tego, jak je zdefiniujesz
Jeśli na rysunku 11.1 za powtarzające się uznasz rekordy z taką samą wartością SicCode, znajdziesz w tabeli 11 duplikatów. Jeżeli powtarzające się rekordy muszą mieć identyczne pola SicCode i PostalCode, duplikaty będą tylko dwa (z wartościami PostalCode 77032 i 77040). Gdyby duplikaty musiały mieć identyczne wartości w polach SicCode, PostalCode i CompanyNumber, w tabeli nie występowałyby żadne powtarzające się rekordy. Ten przykład ilustruje, że jeśli dwa rekordy mają tę samą wartość w jednej kolumnie, nie są automatycznie duplikatami. To programista musi ustalić, które pola lub kombinacje pól pozwalają zdefiniować unikatowe rekordy w zbiorze danych. Gdy już wiesz, które pola umożliwiają wyznaczenie unikatowych rekordów w tabeli, możesz łatwo wykryć duplikaty, tworząc z tych pól klucz główny. Aby zobaczyć, jak to działa, otwórz tabelę LeadList w widoku projektu, a następnie oznacz pole CompanyNumber jako klucz główny. Jeśli spróbujesz zapisać tabelę po tej zmianie, zobaczysz komunikat o błędzie przedstawiony na rysunku 11.2. Komunikat ten oznacza, że w zbiorze danych występują powtarzające się rekordy i trzeba je poprawić. Przypomnienie na temat projektowania tabel znajdziesz w rozdziale 3.
Rozdział 11. Przekształcanie danych
353
Rysunek 11.2. Jeśli przy próbie ustawienia klucza głównego zobaczysz ten komunikat o błędzie, oznacza to, że w zbiorze danych występują duplikaty
Wyszukiwanie duplikatów Jeśli ustaliłeś, że zbiór danych rzeczywiście zawiera duplikaty, zwykle warto najpierw je wyszukać i przejrzeć, a dopiero potem usunąć. Staranny przegląd powtórzeń pozwala się upewnić, że rekord nie zostanie pomyłkowo uznany za duplikat i usunięty z analiz. Może się okazać, że poprawne rekordy zostały mylnie uznane za duplikaty. Wtedy należy wykorzystać dodatkowe pole do ustalania, które rekordy są unikatowe. Najłatwiejszym sposobem na znalezienie duplikatów w zbiorze danych jest uruchomienie kreatora wyszukiwania duplikatów: 1. Otwórz zakładkę TWORZENIE na wstążce i kliknij przycisk Kreator kwerend. Pojawi się okno dialogowe Nowa kwerenda (zobacz rysunek 11.3). Rysunek 11.3. Wybierz opcję Kreator kwerend wyszukujących duplikaty i kliknij przycisk OK
2. Zaznacz opcję Kreator kwerend wyszukujących duplikaty i kliknij przycisk OK. 3. Zaznacz wybrany zbiór danych, który chcesz wykorzystać w kwerendzie wyszukującej duplikaty (zobacz rysunek 11.4). 4. Określ, które pola (lub kombinacje pól) określają unikatowe rekordy w zbiorze danych, a następnie kliknij przycisk Dalej. W przykładowych ustawieniach widocznych na rysunku 11.5 unikatowe rekordy definiuje pole CompanyNumber. 5. Określ dodatkowe pola, które kwerenda ma wyświetlać (zobacz rysunek 11.6), a następnie kliknij przycisk Dalej.
354
Część IV Analizowanie danych w Accessie
Rysunek 11.4. Wybierz zbiór danych, w którym chcesz wyszukiwać duplikaty, a następnie kliknij przycisk Dalej
Rysunek 11.5. Wybierz pola, które określają unikatowe rekordy w zbiorze danych
Rysunek 11.6. Wybierz pola, które kwerenda ma wyświetlać
Rozdział 11. Przekształcanie danych
355
6. Podaj nazwę kwerendy i kliknij przycisk Zakończ (zobacz rysunek 11.7). Nowa kwerenda wyszukująca duplikaty natychmiast się otworzy i będziesz mógł ją sprawdzić. Wygenerowaną kwerendę przedstawia rysunek 11.8. Gdy Access znalazł powtarzające się rekordy, możesz usunąć duplikaty, kasując je. Rysunek 11.7. Nazwij kwerendę i kliknij przycisk Zakończ
Rysunek 11.8. Kwerenda wyszukująca duplikaty
Rekordy wyświetlane przez kwerendę wyszukującą duplikaty to nie tylko duplikaty. Wyniki obejmują jeden unikatowy rekord i jego powtórzenia. Zauważ, że na rysunku 11.8 występują cztery rekordy, w których pole CompanyNumber ma wartość 11145186. Trzy spośród nich to duplikaty, które można usunąć, natomiast należy pozostawić jeden unikatowy rekord.
Usuwanie powtarzających się rekordów Jeśli pracujesz z małymi zbiorami danych, usuwanie duplikatów jest proste — wystarczy ręcznie skasować powtarzające się dane w wynikach kwerendy wyszukującej duplikaty. Jeżeli jednak zbiór danych jest duży, kwerenda może zwrócić zbyt wiele rekordów, aby można je było ręcznie usunąć. Ręczne usuwanie rekordów w kwerendzie wyszukującej duplikaty, która zwróciła 5000 wierszy, może być bardzo męczące dla oczu. Na szczęście istnieje inne rozwiązanie.
356
Część IV Analizowanie danych w Accessie
Można masowo usunąć duplikaty, wykorzystując wbudowane w Accessa zabezpieczenie przed powtarzającymi się kluczami głównymi. Aby zobaczyć, jak działa ta technika, wykonaj następujące czynności: 1. Kliknij prawym przyciskiem myszy tabelę LeadList i wybierz opcję Kopiuj. 2. Kliknij ponownie prawym przyciskiem myszy i wybierz opcję Wklej. Pojawi się okno dialogowe Wklejanie tabeli jako (zobacz rysunek 11.9). Rysunek 11.9. Otwórz okno dialogowe Wklejanie tabeli jako, aby skopiować strukturę tabeli do nowej tabeli o nazwie LeadList_NoDups
3. Nadaj nowej tabeli nazwę LeadList_NoDups i w sekcji Opcje wklejania wybierz ustawienie Tylko struktura. Powstanie nowa pusta tabela o strukturze identycznej ze strukturą pierwotnej tabeli. 4. Otwórz tabelę LeadList_NoDups w widoku projektu i ustaw odpowiednie pole (lub kombinację pól) jako klucz główny. Sam musisz ustalić, które pole (lub która kombinacja) najlepiej pozwala zidentyfikować unikatowe rekordy w zbiorze danych. Na rysunku 11.10 do wykrywania unikatowych rekordów służy pojedyncze pole CompanyNumber, dlatego ustawiono je jako klucz główny. Rysunek 11.10. Pole (lub pola), które najlepiej określa unikatowe rekordy, ustaw jako klucz główny
Teraz zatrzymaj się na chwilę i pomyśl o tym, co już zrobiłeś. Na tym etapie powinieneś mieć tabele LeadList i LeadList_NuDups. Druga z nich powinna być pusta i mieć ustawione pole CompanyNumber jako klucz główny. 5. Utwórz kwerendę dołączającą, która doda wszystkie rekordy z tabeli LeadList do tabeli LeadList_NoDups. Gdy uruchomisz tę kwerendę, pojawi się komunikat podobny do tego z rysunku 11.11. Nie wiesz, czym są kwerendy dołączające? Ich szczegółowe omówienie znajdziesz w rozdziale 10.
Rozdział 11. Przekształcanie danych
357
Rysunek 11.11. Teraz można dołączyć wszystkie rekordy z pominięciem duplikatów
Ponieważ pole CompanyNumber w tabeli LeadList_NoDups jest ustawione jako klucz główny, Access nie pozwala na dołączenie rekordów z powtarzającą się wartością tego pola. Wystarczyło kilka kliknięć, aby utworzyć tabelę pozbawioną duplikatów. Teraz możesz wykorzystać ją jako źródło danych w dalszych analizach. Access nie stosuje zaawansowanych operacji logicznych do ustalenia, czy rekordy mogą być duplikatami. Żądania są przetwarzane przez Accessa dosłownie. Na przykład literówka w adresie lub numerze telefonu spowoduje, że rekordy, które są duplikatami, nie zostaną usunięte. Warto o tym pamiętać, zwłaszcza przy korzystaniu z pól tekstowych, w których dane wprowadza się ręcznie. Usuwanie duplikatów za pomocą jednej kwerendy tworzącej tabelę Oto sztuczka, która pozwala usunąć duplikaty za pomocą kwerendy tworzącej tabelę: 1. Otwórz zakładkę TWORZENIE i wybierz opcję Projekt kwerendy. 2. W oknie dialogowym Pokazywanie tabeli wybierz tabelę zawierającą duplikaty. 3. W zakładce NARZĘDZIA KWEREND PROJEKTOWANIE wybierz polecenie Arkusz właściwości. Pojawi się okno dialogowe Arkusz właściwości widoczne na poniższym rysunku.
Teraz wystarczy zmienić wartość właściwości Wartości unikatowe na Tak. Następnie zamknij okno dialogowe Arkusz właściwości i zmień typ kwerendy na kwerendę tworzącą tabelę.
358
Część IV Analizowanie danych w Accessie
Typowe zadania z zakresu przekształcania danych Oprócz usunięcia duplikatów rekordów nieuporządkowane zbiory danych często wymagają innych przekształceń. W tym podrozdziale opisaliśmy wybrane z typowych zadań z zakresu przekształcania danych.
Uzupełnianie pustych pól W danych często występują puste pola. Są to pola o wartości Null (oznacza ona brak wartości). Puste pola nie zawsze oznaczają problemy. Jeśli poprawnie zastosować takie pola, mogą być ważnym elementem dobrze zaprojektowanej relacyjnej bazy danych. Mimo to czasem trzeba uzupełnić puste pola sensownymi kodami oznaczającymi brak wartości. Aby uzupełnić puste pola w zbiorze danych, wystarczy uruchomić kwerendę aktualizującą. W przykładzie widocznym na rysunku 11.12 puste komórki w polu DollarPotential są aktualizowane wartością 0. Rysunek 11.12. Ta kwerenda aktualizuje puste wartości w polu DollarPotential wartością 0
Należy zauważyć, że istnieją dwa rodzaje pustych komórek — o wartości Null i z pustym łańcuchem znaków (""). Przy uzupełnianiu pustych komórek w polach tekstowych warto dodać pusty łańcuch znaków jako kryterium w kwerendzie aktualizującej, aby się upewnić, że uwzględnione zostaną wszystkie pola. W przykładzie widocznym na rysunku 11.13 puste komórki w polu Segment są aktualizowane wartością „Other”. Rysunek 11.13. Ta kwerenda aktualizuje puste komórki w polu Segment wartością „Other”
Rozdział 11. Przekształcanie danych
359
Scalanie łańcuchów znaków Bardzo dziwne jest, gdy użytkownicy eksportują dane z Accessa do Excela, aby scalić dwa lub więcej łańcuchów znaków ze sobą, po czym importują dane z powrotem do Accessa. W Accessie łańcuchy znaków można scalać na różne sposoby, używając prostych kwerend aktualizujących. Scalanie pól Przyjrzyj się kwerendzie aktualizującej przedstawionej na rysunku 11.14. W tej kwerendzie pole MyTest jest aktualizowane za pomocą scalonych wartości z pól Type i Code. Rysunek 11.14. Ta kwerenda scala wartości z pól Type i Code
Warto najpierw utworzyć pole testowe i sprawdzić efekty przekształcania danych, a dopiero potem wprowadzać zmiany w danych.
Poświęć chwilę na przeanalizowanie poniższych elementów kwerendy: [Type] — ten człon informuje Accessa, że należy wykorzystać wartość z pola Type.
— ampersand to operator dla łańcuchów znaków przeznaczony do scalania ich ze sobą.
&
[Code] — ten człon informuje Accessa, że należy wykorzystać wartość z pola Code.
Wyniki wykonania tej kwerendy przedstawia rysunek 11.15. Rysunek 11.15. Pole MyTest zawiera teraz scalone wartości z pól Type i Code
360
Część IV Analizowanie danych w Accessie Przy wykonywaniu kwerend aktualizujących, które scalają dane, należy się upewnić, że docelowe pole jest wystarczająco długie, aby pomieściło scalony łańcuch znaków. Jeśli scalony łańcuch ma 100 znaków, a pole jest przeznaczone na 50 znaków, scalony łańcuch zostanie bez ostrzeżenia skrócony.
Dodawanie własnego tekstu do wartości pól Do wartości pól można dodać własny tekst. Możliwe, że chcesz scalić wartości z pól Type i Code, a przy tym oddzielić je dwukropkiem. Tak działa kwerenda z rysunku 11.16. Rysunek 11.16. Ta kwerenda scala wartości z pól Type i Code oraz rozdziela je dwukropkiem
Poświęć chwilę na przeanalizowanie poniższych elementów kwerendy: [Type] — ten człon informuje Accessa, że należy wykorzystać wartość z pola Type.
— ampersand to operator dla łańcuchów znaków przeznaczony do scalania ich ze sobą.
&
— ten fragment powoduje dodanie dwukropka i spacji do scalanego łańcucha znaków.
": "
— ampersand to operator dla łańcuchów znaków przeznaczony do scalania ich ze sobą.
&
[Code] — ten człon informuje Accessa, że należy wykorzystać wartość z pola Code.
Wynik uruchomienia tej kwerendy przedstawia rysunek 11.17. Rysunek 11.17. Pole MyTest zawiera teraz scalone wartości z pól Type i Code oraz dwukropek między nimi
W kwerendach własny tekst należy ująć w cudzysłów.
Rozdział 11. Przekształcanie danych
361
Zmiana wielkości liter Upewnianie się, czy litery w tekście w bazie danych mają odpowiednią wielkość, może wydawać się trywialne, jest to jednak ważne zagadnienie. Wyobraź sobie, że otrzymałeś tabelę z danymi klientów, w której adresy są zapisane małymi literami. Jak takie adresy będą wyglądały na etykietach, listach i fakturach? Na szczęście użytkownicy pracujący z tabelami zawierającymi tysiące rekordów mogą wykorzystać kilka wbudowanych funkcji Accessa, dzięki którym zmiana wielkości liter jest bardzo prosta. Tabela LeadList z rysunku 11.18 zawiera pole Address, w którym dane są zapisane małymi literami. Rysunek 11.18. Wartości w polu Address są zapisane małymi literami
Aby poprawić wartości w polu Address, można zastosować funkcję StrConv. Funkcja ta przekształca znaki w łańcuchach na odpowiednią wielkość. Aby zastosować tę funkcję, należy przekazać do niej dwa wymagane argumenty — przekształcany łańcuch znaków i sposób konwersji. StrConv(przekształcany łańcuch znaków,sposób konwersji)
Przekształcany łańcuch znaków to używany tekst. W kwerendzie można zastosować nazwę pola, aby określić, że wartości z danego pola mają zostać przekształcone we wszystkich wierszach. Sposób konwersji informuje Accessa, czy ma zastosować same wielkie litery, same małe litery czy wielkie litery tylko na początku słów. Do określania sposobu konwersji służą stałe: 1
— powoduje przekształcenie wszystkich liter na wielkie.
2
— powoduje przekształcenie wszystkich liter na małe.
3
— powoduje przekształcenie pierwszej litery każdego słowa na wielką.
Oto przykłady: StrConv("To Tekst",1)
— efekt przekształcenia to „TO TEKST”.
StrConv("TO TEKST",2)
— efekt przekształcenia to „to tekst”.
StrConv("to tekst",3)
— efekt przekształcenia to „To Tekst”.
Kwerenda aktualizująca widoczna na rysunku 11.19 powoduje, że w tekście w polu Address pierwsze litery w słowach zmieniają się na wielkie.
362
Część IV Analizowanie danych w Accessie
Rysunek 11.19. Ta kwerenda przekształca pierwsze litery słów w adresie na wielkie
Można też wykorzystać funkcje Ucase i Lcase, aby przekształcić litery w tekście na wielkie lub małe. Funkcje te opisaliśmy w dodatku D w tej książce.
Usuwanie początkowych i końcowych spacji z łańcuchów znaków Gdy otrzymasz zbiór danych z systemu mainframe, hurtowni danych, a nawet pliku tekstowego, pola często będą zawierały na początku i na końcu spacje, które mogą prowadzić do uzyskania nieoczekiwanych wyników — zwłaszcza wtedy, gdy wartości ze spacjami na początku i na końcu łączy się z innymi, poprawnymi wartościami. Aby się o tym przekonać, przyjrzyj się zbiorowi danych z rysunku 11.20. Rysunek 11.20. Spacje na początku uniemożliwiają poprawną agregację
Przedstawiono tu kwerendę podsumowującą, która wyświetla potencjalne wpływy dla stanów Kalifornia, Nowy Jork i Teksas. Jednak początkowe spacje powodują, że Access umieszcza dane dla każdego stanu w dwóch zbiorach, przez co dane są nieprecyzyjne. Początkowe i końcowe spacje można łatwo usunąć za pomocą funkcji Trim. Rysunek 11.21 przedstawia, jak za pomocą kwerendy aktualizującej zmodyfikować pole i usunąć początkowe i końcowe spacje. Rysunek 11.21. Aby usunąć początkowe i końcowe spacje, wystarczy przekazać nazwę pola do funkcji Trim w kwerendzie aktualizującej
Rozdział 11. Przekształcanie danych
363
Funkcja Ltrim usuwa tylko początkowe spacje, natomiast funkcja Rtrim — tylko spacje końcowe. Funkcje te opisaliśmy w dodatku D w tej książce.
Wyszukiwanie i zastępowanie określonego tekstu Załóżmy, że pracujesz w firmie o nazwie BLVD Inc. Pewnego dnia prezes informuje Cię, że skrót „blvd” w adresach można uznać za wykorzystanie zastrzeżonej nazwy firmy, dlatego trzeba go jak najszybciej zmienić na „Boulevard”. Jak wykonać to zadanie? Możesz wpaść na pomysł, aby wykorzystać funkcję wyszukiwania i zastępowania, dostępną we wszystkich aplikacjach z pakietu Office. Jednak dane mogą zawierać setki tysięcy wierszy, a funkcja wyszukiwania i zastępowania potrafi przetwarzać za jednym razem tylko kilka tysięcy rekordów. Nie jest to więc wydajne rozwiązanie. W takich sytuacjach idealnym narzędziem jest funkcja Replace: Replace(Wyrażenie, Szukany, Zastępnik[, Start[, Liczba[, Porównanie]]])
Funkcja Replace przyjmuje trzy argumenty wymagane i trzy opcjonalne: (wymagany) — jest to kompletny sprawdzany łańcuch znaków. W kontekście kwerendy można podać nazwę pola, aby określić, że sprawdzona ma zostać wartość tego pola w każdym wierszu.
Wyrażenie
Szukany
(wymagany) — jest to podłańcuch, który należy znaleźć i zastąpić.
Zastępnik
(wymagany) — jest to podłańcuch zastępujący szukane fragmenty.
(opcjonalny) — jest to pozycja w łańcuchu, od której należy rozpocząć wyszukiwanie. Wartość domyślna tego argumentu to 1.
Start
(opcjonalny) — jest to liczba zastępowanych wystąpień szukanego podłańcucha. Domyślnie podmieniane są wszystkie wystąpienia.
Liczba
(opcjonalny) — określa sposób porównywania (więcej informacji znajdziesz w dodatku D).
Porównanie
Oto przykłady: Replace("Rama", "R", "S") zwraca „Sama”. Replace("To Ster", " S", "s") zwraca „Toster”. Replace("Microsoft Access", "Microsoft ", "") zwraca „Access”. Replace("Roadsign Road", "Road", "Rd", 9) rozpoczyna zastępowanie od
dziewiątego znaku, co daje „Roadsign Rd”. Rysunek 11.22 przedstawia, jak zastosować funkcję Replace, aby wykonać opisane wcześniej zadanie.
364
Część IV Analizowanie danych w Accessie
Rysunek 11.22. Ta kwerenda znajduje wszystkie wystąpienia tekstu „blvd” i zastępuje je słowem „Boulevard”
Dodawanie własnego tekstu w określonych miejscach łańcucha znaków Przy przekształcaniu danych czasem trzeba dodać własny tekst w określonych miejscach łańcucha znaków. Na rysunku 11.23 widoczne są dwa pola. W polu Phone znajduje się nieprzetworzony numer telefonu z raportu z systemu mainframe. Pole MyTest zawiera ten sam numer w wybranym przez programistę formacie. Jak widać, w odpowiednich miejscach łańcucha znaków dodano dwa nawiasy i łącznik, aby uzyskać odpowiedni format. Rysunek 11.23. Numer telefonu przekształcono na wybrany format, dodając odpowiednie znaki w określonych miejscach łańcucha znaków
Modyfikacje widoczne na rysunku 11.23 wprowadzono za pomocą funkcji Rigth, Left i Mid. Funkcje te pozwalają pobrać fragmenty łańcucha znaków począwszy od różnych pozycji:
Funkcja Left zwraca określoną liczbę znaków liczoną od lewej strony łańcucha. Wymaganymi argumentami funkcji Left są przetwarzany tekst i liczba zwracanych znaków. Na przykład wywołanie Left("70056-3504", 5) zwraca pięć znaków, począwszy od pierwszego znaku od lewej (70056).
Funkcja Right zwraca określoną liczbę znaków liczoną od prawej strony łańcucha. Wymaganymi argumentami funkcji Right są przetwarzany tekst i liczba zwracanych znaków. Na przykład wywołanie Right("Microsoft", 4) zwraca cztery znaki, począwszy od pierwszego znaku od prawej (soft).
Funkcja Mid zwraca określoną liczbę znaków liczoną od wskazanej pozycji. Wymagane argumenty tej funkcji to przetwarzany łańcuch znaków, pozycja początkowa i liczba zwracanych znaków. Na przykład wywołanie Mid("Lonely", 2, 3) zwraca trzy znaki, począwszy od drugiego (one).
Rozdział 11. Przekształcanie danych
365
Jeśli liczba znaków w tekście jest mniejsza niż argument określający liczbę zwracanych znaków, funkcja Mid zwraca cały tekst. Na przykład wywołanie Mid("go",1,10000) zwraca go. W dalszej części rozdziału przekonasz się, że to rozwiązanie przydaje się przy pracy z funkcjami zagnieżdżonymi.
Na rysunku 11.24 pokazano, w jaki sposób zaktualizowano pole MyTest, aby poprawnie sformatować numer telefonu. Rysunek 11.24. Ta kwerenda aktualizuje pole MyTest za pomocą odpowiednio sformatowanego numeru telefonu
Poświęć chwilę na przeanalizowanie poniższych elementów kwerendy: "("
— ten człon dodaje otwierający nawias do wynikowego łańcucha znaków.
— ampersand to operator dla łańcuchów znaków przeznaczony do scalania ich ze sobą.
&
Left([Phone],3)
— to wywołanie funkcji pobiera trzy pierwsze znaki z pola
[Phone].
— ampersand to operator dla łańcuchów znaków przeznaczony do scalania ich ze sobą.
&
")"
— ten człon dodaje zamykający nawias do wynikowego łańcucha znaków.
— ampersand to operator dla łańcuchów znaków przeznaczony do scalania ich ze sobą.
&
— to wywołanie funkcji pobiera trzy znaki z pola [Phone], począwszy od czwartego znaku.
Mid([Phone],4,3)
— ampersand to operator dla łańcuchów znaków przeznaczony do scalania ich ze sobą.
&
"-"
— ten tekst dodaje łącznik do wynikowego łańcucha znaków.
— ampersand to operator dla łańcuchów znaków przeznaczony do scalania ich ze sobą.
&
Right([Phone],4)
[Phone].
— to wywołanie funkcji pobiera cztery ostatnie znaki z pola
366
Część IV Analizowanie danych w Accessie
Dopełnianie łańcuchów do określonej liczby znaków Może się zdarzyć, że pewne pola będą musiały mieć określoną liczbę znaków, aby dane można było wykorzystać w zewnętrznych platformach takich jak ADP lub SAP. Załóżmy, że pole CompanyNumber widoczne na poniższym rysunku musi mieć dziesięć znaków. Krótsze pola trzeba uzupełnić zerami na początku, aby utworzyć dziesięcioznakowy łańcuch.
Pól liczbowych (typu Liczba) nie można dopełniać zerami, ponieważ Access usuwa zera z początków liczb. Jeśli chcesz uzupełnić zerami wartość liczbową, musisz zmienić typ danych pola na tekstowy. Rozwiązanie polega na dodaniu dziesięciu zer do każdego numeru firmy (niezależnie od jego długości) i przekazaniu nowej wersji numeru to funkcji Right, która pobierze tylko dziesięć ostatnich znaków. Na przykład numer 29875764 najpierw zostanie przekształcony na postać 000000000029875764, po czym należy przekazać go do funkcji Right, która ma pobrać tylko dziesięć ostatnich znaków: Right("000000000029875764",10). Wynik to 0029875764. Choć wykonywane są tu dwa kroki, pożądany wynik można uzyskać za pomocą jednej kwerendy aktualizującej. Na poniższym rysunku pokazaliśmy, jak to zrobić. Przedstawiona kwerenda najpierw scala każdy numer firmy z ciągiem 0000000000, a następnie przekazuje połączony łańcuch znaków do funkcji Right, która pobiera tylko dziesięć ostatnich znaków.
Poniżej pokazano wyniki zwrócone przez tę kwerendę. Pole CompanyNumber zawiera teraz dziesięcioznakowe numery firm.
Rozdział 11. Przekształcanie danych
367
Przetwarzanie łańcuchów znaków na podstawie znaczników Czy otrzymałeś kiedyś zbiór danych, w którym kilka odrębnych elementów znajdowało się w jednym polu i było rozdzielonych przecinkami? Na rysunku 11.25 widać, że wartościami pola ContactName są łańcuchy znaków reprezentujące nazwisko, imię i inicjał drugiego imienia. Trzeba przetworzyć ten łańcuch znaków na trzy odrębne pola. Rysunek 11.25. Trzeba przetworzyć wartości z pola ContactName na trzy odrębne pola
Choć nie jest to proste zadanie, można je wykonać stosunkowo łatwo, wykorzystując funkcję InStr: InStr(Start, Łańcuch znaków, Szukany, Porównanie)
Funkcja InStr szuka określonego podłańcucha w innym łańcuchu znaków i zwraca pozycję znalezionego fragmentu. Funkcja ta przyjmuje dwa argumenty wymagane i dwa opcjonalne: (opcjonalny) — jest to pozycja w łańcuchu, od której należy rozpocząć wyszukiwanie. Wartość domyślna tego argumentu to 1.
Start
Łańcuch znaków Szukany
(wymagany) — jest to przeszukiwany łańcuch znaków.
(wymagany) — jest to szukany podłańcuch.
(opcjonalny) — określa sposób porównywania. Jeśli podasz argument Porównanie, argument Start przestanie być opcjonalny.
Porównanie
Oto przykłady: InStr("Alexander, Mike, H.",",") zwraca wartość 10, ponieważ pierwszy
przecinek w podanym łańcuchu znaków to znak numer 10. InStr(11,"Alexander, Mike, H.",",") zwraca wartość 16, ponieważ pierwszy przecinek od znaku 11. to znak numer 16.
Skoro funkcja InStr zwraca tylko numer, jak może pomóc w wykonaniu opisanego zadania? Należy zastosować ją razem z funkcjami Left, Right i Mid, aby pobrać fragmenty łańcuchów znaków. Na przykład zamiast określać w funkcji Left długość podłańcucha za pomocą zapisanej na stałe liczby, można wywołać zagnieżdżoną funkcję InStr, aby zwróciła potrzebną wartość. Na przykład wywołanie Left("Alexander, Mike",9) zadziała tak samo jak Left("Alexander, Mike",Instr("Alexander, Mike", ",")-1).
368
Część IV Analizowanie danych w Accessie
Przy stosowaniu funkcji InStr w funkcjach Left, Right i Mid czasem trzeba dodać lub odjąć jeden znak (zależy to od wykonywanego zadania). Na przykład wywołanie Left("Zey, Robert", InStr("Zey,Robert", ",")) zwraca "Zey,". Dlaczego zwracany jest także przecinek? Funkcja InStr zwraca liczbę 4, ponieważ pierwszy przecinek w łańcuchu znajduje się na czwartej pozycji. Funkcja Left wykorzystuje następnie wartość 4 jako argument określający długość podłańcucha, dlatego pobiera cztery pierwsze znaki: "Zey,". Jeśli chcesz pobrać tekst bez przecinka, musisz zmodyfikować wywołanie w następujący sposób: Left("Zey, Robert", InStr("Zey, Robert", ",")-1)
Odjęcie 1 od wyniku zwróconego przez funkcję InStr spowoduje, że zamiast 4 funkcja zwróci 3. Wtedy w funkcji Left argument określający długość będzie miał wartość 3, dlatego pobrane zostaną trzy pierwsze znaki: "Zey".
Najłatwiejszym sposobem na przetworzenie pola z imieniem i nazwiskiem osoby kontaktowej (zobacz rysunek 11.26) jest zastosowanie dwóch kwerend aktualizujących. Czasem przetwarzanie łańcuchów znaków jest skomplikowane, dlatego warto utworzyć pola testowe i wykonać operacje najpierw w nich. Dzięki temu można poradzić sobie z ewentualnymi pomyłkami.
Pierwsza kwerenda Pierwsza kwerenda, przedstawiona na rysunku 11.26, pobiera nazwisko z pola ContactName i zapisuje to nazwisko w polu Contact_LastName. Następnie umieszcza w polu Contact_ FirstName pozostałą część łańcucha. Rysunek 11.26. Ta kwerenda aktualizuje pola Contact_LastName i Contact_FirstName
Gdy otworzysz tabelę LeadList, zobaczysz efekty uruchomienia pierwszej z kwerend aktualizujących. Rysunek 11.27 przedstawia, jakie postępy udało się poczynić do tej pory. Druga kwerenda Druga kwerenda, przedstawiona na rysunku 11.28, aktualizuje pola Contact_FirstName i Contact_MI.
Rozdział 11. Przekształcanie danych
369
Rysunek 11.27. Sprawdzanie postępów
Rysunek 11.28. Ta kwerenda przetwarza imię i inicjał drugiego imienia z pola Contact_FirstName
Po uruchomieniu drugiej kwerendy można otworzyć tabelę i wyświetlić wyniki (zobacz rysunek 11.29). Rysunek 11.29. Dwie kwerendy pozwoliły przetworzyć pole ContactName na trzy odrębne pola
370
Część IV Analizowanie danych w Accessie
Rozdział 12.
Obliczenia i daty W tym rozdziale:
Korzystanie z obliczeń w analizach
Korzystanie z dat w analizach
W praktyce niewiele firm może analizować surowe dane w ich pierwotnej postaci. Zazwyczaj trzeba przeprowadzić pewne wstępne analizy z wykorzystaniem obliczeń i dat. Dopiero potem można przejść do ogólnych analiz. Do pracy z obliczeniami i datami wielu użytkowników najchętniej stosuje Excela. Jednak, jak dowiesz się z dalszej części rozdziału, Access udostępnia wiele narzędzi i funkcji wbudowanych, które umożliwiają korzystanie z obliczeń i dat. Wyjściową bazę danych do tego rozdziału, Rozdział12.accdb, można pobrać z witryny poświęconej tej książce. W trakcie używania tej przykładowej bazy danych będziesz mógł otworzyć kwerendy przedstawione na rysunkach. Niektóre z nich mogą wyglądać nieco inaczej niż na zrzutach. Nie martw się tym — Access czasem przenosi kryteria i wyrażenia z uwagi na działanie wbudowanego optymalizatora kwerend. Optymalizator odpowiada za uporządkowanie kwerendy w taki sposób, aby działała jak najszybciej i najwydajniej.
Korzystanie z obliczeń w analizach Jeśli jesteś użytkownikiem Excela próbującym poznać Accessa, jednym z pytań, jakie sobie zadasz, będzie bez wątpienia: „Gdzie można wpisywać wzory?”. W Excelu obliczenia można stosować w postaci wzorów bezpośrednio w analizowanym zbiorze danych. W Accessie jest to niemożliwe. Pytanie więc brzmi: „Gdzie w Accessie umieszczane są obliczenia?”. Wiesz już, że w Accessie pracuje się inaczej niż w Excelu. Najlepszym podejściem w przypadku używania środowiska bazodanowego jest przechowywanie danych niezależnie od analiz. Dlatego nie należy zapisywać obliczeń (wzorów) w zbiorze danych. To prawda, że można zapisywać obliczone wyniki w tabelach, jednak używanie tabel do przechowywania obliczonych danych jest problematyczne z kilku powodów:
372
Część IV Analizowanie danych w Accessie
Zachowane wyniki obliczeń zajmują cenną pamięć dyskową.
Zachowane wyniki obliczeń wymagają ciągłej konserwacji przy zmianie danych w tabelach.
Zachowane wyniki obliczeń zwykle powodują powiązanie danych z jednym procesem analitycznym.
Zamiast zapisywać obliczone wyniki jako trwałe dane, lepiej jest przeprowadzać obliczenia w czasie rzeczywistym, wtedy, gdy są potrzebne. Jest to gwarancją uzyskania możliwie aktualnych i precyzyjnych danych, a ponadto nie prowadzi do powiązania danych z konkretnymi analizami.
Typowe scenariusze związane z obliczeniami W Accessie do przeprowadzania obliczeń służą wyrażenia. Wyrażenie to połączenie wartości, operatorów i funkcji. Elementy te są przetwarzane, co prowadzi do zwrócenia nowej wartości, którą można zastosować w dalszych etapach przetwarzania. Na przykład 2+2 to wyrażenie zwracające liczbę całkowitą 4, którą można wykorzystać w późniejszych analizach. W Accessie wyrażenia można stosować niemal wszędzie (w kwerendach, formularzach, raportach, stronach dających dostęp do danych, a nawet — w pewnym zakresie — w tabelach) i wykonywać przy ich użyciu różne zadania. Z tego punktu dowiesz się, jak wzbogacić analizy dzięki przeprowadzanym w czasie rzeczywistym obliczeniom opartym na wyrażeniach. Stosowanie stałych w obliczeniach Większość obliczeń zwykle obejmuje trwale zapisane liczby lub stałe. Stała to niezmienna wartość statyczna. Na przykład w wyrażeniu [List_Price]*1,1 wartość 1,1 to stała (nigdy się nie zmienia). Na rysunku 12.1 pokazujemy, jak wykorzystać stałe w wyrażeniu w kwerendzie. Rysunek 12.1. W tej kwerendzie za pomocą stałej obliczana jest cena po 10-procentowej podwyżce
Tu tworzona jest kwerenda, która analizuje, jak będzie wyglądała cena produktu po 10-procentowej podwyżce. Zastosowane wyrażenie o aliasie „Podwyżka” zwiększa wartość w polu List_Price każdego rekordu o stałą 1,1. W ten sposób obliczana jest cena o 10% wyższa od pierwotnej ceny zapisanej w polu List_Price.
Rozdział 12. Obliczenia i daty
373
Używanie pól w obliczeniach Nie we wszystkich obliczeniach potrzebne są stałe. Wiele operacji matematycznych przeprowadza się na danych, które już znajdują się w polach w zbiorze danych. Obliczenia można przeprowadzać na podstawie dowolnych pól typu Liczba lub Waluta. W kwerendzie z rysunku 12.2 nie zastosowano żadnych stałych. Obliczenia są przeprowadzane na wartościach z każdego rekordu ze zbioru danych. Przypomina to używanie wartości z komórek we wzorach w Excelu. Rysunek 12.2. W tej kwerendzie na podstawie dwóch pól obliczana jest wartość DollarVariance
Wykorzystywanie wyników agregacji w obliczeniach Zastosowanie wyników agregacji w obliczeniach pozwala wykonać kilka etapów analiz w jednej kwerendzie. Rysunek 12.3 przedstawia kwerendę podsumowującą. Jest ona wykonywana w następujący sposób: 1. Kwerenda grupuje rekordy według regionów. 2. Kwerenda określa liczbę zamówień i sumę wpływów dla każdego regionu. 3. Kwerenda przypisuje wartościom zdefiniowane aliasy (OrderCount i Rev). 4. Kwerenda wykorzystuje wyniki agregacji jako wyrażenia przy obliczaniu wartości AvgDollarPerOrder dla poszczególnych regionów.
Rysunek 12.3. W tej kwerendzie wyniki agregacji dla każdego regionu wykorzystano w wyrażeniach w obliczeniach
374
Część IV Analizowanie danych w Accessie
Stosowanie wyników jednych obliczeń w innych jako wyrażeń Warto pamiętać, że w kwerendzie można przeprowadzić więcej niż jedne obliczenia. Wyniki jednych obliczeń można wykorzystać w innych jako wyrażenia. Przedstawia to rysunek 12.4.
Rysunek 12.4. W tej kwerendzie wykorzystano wyniki jednych obliczeń w drugich jako wyrażenie
Ta kwerenda najpierw oblicza zmodyfikowane prognozy, a następnie wykorzystuje wyniki tych obliczeń w innych, które zwracają różnicę między pierwotnymi a zmodyfikowanymi prognozami. Wykorzystywanie obliczeń jako argumentu funkcji Przyjrzyj się kwerendzie z rysunku 12.5. Obliczenia z tej kwerendy zwracają liczbę z częścią ułamkową. Zwracana jest liczba zawierająca separator dziesiętny i wiele dalszych cyfr. Użytkownik chce jednak zwracać zaokrągloną wartość, aby wynikowy zbiór danych był bardziej czytelny.
Rysunek 12.5. Wyniki tych obliczeń są mało czytelne, ponieważ zawierają wiele cyfr po separatorze dziesiętnym. Zaokrąglenie wyników znacznie poprawi ich czytelność
Rozdział 12. Obliczenia i daty
375
Aby przekształcić wyniki obliczeń na liczbę całkowitą, można zastosować funkcję Int. Jest to funkcja matematyczna, która usuwa część ułamkową liczby i zwraca liczbę całkowitą. Funkcja ta przyjmuje jeden argument — liczbę. Jednak zamiast zapisywać tę liczbę na stałe w wywołaniu funkcji, można przekazać wynik obliczeń jako argument. Przedstawia to rysunek 12.6.
Rysunek 12.6. Jako argument funkcji Int można wykorzystać wynik obliczeń. Pozwala to usunąć część ułamkową z uzyskanych danych Obliczenia zwracające wartość liczbową można wykorzystać w dowolnej funkcji, która przyjmuje argumenty liczbowe.
Tworzenie obliczeń za pomocą konstruktora wyrażeń Jeśli nie chcesz ręcznie tworzyć złożonych wyrażeń obejmujących funkcje i obliczenia, możesz wykorzystać dostępny w Accessie konstruktor wyrażeń. Narzędzie to pozwala tworzyć wyrażenia za pomocą kilku kliknięć myszą. Doświadczonym użytkownikom Excela konstruktor wyrażeń może przypominać excelowy kreator wstawiania funkcji. Oba mechanizmy pozwalają tworzyć wyrażenia dzięki wskazywaniu potrzebnych funkcji i pól z danymi. Aby uruchomić konstruktor wyrażeń, kliknij prawym przyciskiem myszy w komórce siatki QBE, gdzie ma się znaleźć wyrażenie, a następnie wybierz opcję Konstruuj, co pokazano na rysunku 12.7. Konstruktor wyrażeń można uruchomić w wyniku kliknięcia prawym przyciskiem myszy w dowolnym miejscu, w którym można wpisać wyrażenie: we właściwościach formantów formularzy, właściwościach formantów raportów, właściwościach pól tabel, a także w siatce QBE kwerend.
376
Część IV Analizowanie danych w Accessie
Rysunek 12.7. Otwórz konstruktor wyrażeń, klikając prawym przyciskiem myszy w wierszu Pole w siatce QBE i wybierając opcję Konstruuj
Na rysunku 12.8 widać, że konstruktor wyrażeń udostępnia cztery panele. Wyrażenia wpisuje się w górnym. W dolnych panelach widoczne są dostępne obiekty. W lewym dolnym panelu można kliknąć ikonę ze znakiem dodawania (+), aby zobaczyć obiekty bazy danych, które można wykorzystać przy konstruowaniu wyrażenia. Rysunek 12.8. Konstruktor wyrażeń wyświetla obiekty bazy danych, które można wykorzystać w wyrażeniu
Kliknij dwukrotnie dowolny obiekt bazy danych, aby przejść do obiektów z następnego poziomu. Na przykład dwukrotne kliknięcie obiektu Funkcje powoduje przejście do katalogu Funkcje wbudowane, w którym znajdują się wszystkie dostępne w Accessie funkcje. Na rysunku 12.9 widoczny jest konstruktor wyrażeń wyświetlający wszystkie dostępne funkcje matematyczne. Jeśli korzystasz z wersji Accessa innej niż 2013, konstruktor wyrażeń może wyglądać inaczej niż na rysunku 12.9. Jednak podstawowe funkcje tego narzędzia są takie same w każdej wersji programu.
Rozdział 12. Obliczenia i daty
377
Rysunek 12.9. Konstruktor wyrażeń (podobnie jak kreator wstawiania funkcji w Excelu) wyświetla wszystkie dostępne funkcje
Gdy dwukrotnie klikniesz potrzebną funkcję, Access automatycznie wprowadzi ją w górnym panelu konstruktora wyrażeń. W przykładzie z rysunku 12.10 wybrano funkcję Round. Jak widać, funkcja jest natychmiast umieszczana w górnym panelu konstruktora wyrażeń, a Access wyświetla argumenty potrzebne w funkcji. Tu podane są dwa argumenty — Number i Precision. Rysunek 12.10. Access informuje, jakie argumenty są potrzebne do działania funkcji
Jeśli nie wiesz, do czego służą poszczególne argumenty, kliknij hiperłącze w dolnej części okna dialogowego (zobacz rysunek 12.11). W oknie systemu pomocy pojawi się opis danej funkcji. Na rysunku 12.12 widać, że w funkcji Round zamiast zapisanej na stałe wartości wykorzystano wyrażenie, które generuje wartość dynamicznie. W obliczeniach suma z pola [Dim_TransactionMaster]![Line_Total] jest dzielona przez 13. Ponieważ argument Precision jest opcjonalny, został tu pominięty.
378
Część IV Analizowanie danych w Accessie
Rysunek 12.11. Dostępne są pliki pomocy ze szczegółowym objaśnieniem każdej funkcji
Rysunek 12.12. Ta funkcja zaokrągla wyniki obliczeń ([Dim_ TransactionMaster] ![Line _Total])/13
Gdy nowe wyrażenie jest już gotowe, kliknij przycisk OK, aby umieścić je w siatce QBE. Rysunek 12.13 przedstawia nowe wyrażenie dodane jako pole. Zauważ, że dla nowego pola zastosowano domyślny alias Wyr1. Możesz zmienić go na bardziej zrozumiałą nazwę. Rysunek 12.13. Nowe wyrażenie zwraca średnie okresowe wpływy z uwzględnieniem wszystkich transakcji
Rozdział 12. Obliczenia i daty
379
Typowe błędy w obliczeniach Niezależnie od tego, w jakiej platformie analizujesz dane, w obliczeniach zawsze mogą pojawić się błędy. W Accessie nie istnieje magiczna funkcja, która zapobiegałaby wystąpieniu błędów w analizach. Można jednak wykonać kilka prostych czynności, aby uniknąć pojawienia się najbardziej typowych błędów w obliczeniach. Priorytety operatorów Możliwe, że z lekcji matematyki pamiętasz, iż w skomplikowanych równaniach z wieloma operacjami matematycznymi działania nie zawsze są przeprowadzane od lewej do prawej. Niektóre są traktowane priorytetowo i dlatego należy wykonać je na początku. W Accessie obowiązują podobne reguły dotyczące priorytetów operatorów. Gdy używasz wyrażeń i obliczeń z kilkoma operacjami, każda z nich jest wykonywana w określonej kolejności. Ważne jest, aby znać priorytety operatorów Accessa. Niepoprawnie zbudowane wyrażenie może prowadzić do błędów w analizach. Kolejność operacji w Accessie wygląda tak: 1. Obliczanie wartości w nawiasach. 2. Potęgowanie (operator potęgowania to ^). 3. Negacja (operator – zmienia znak wartości). 4. Mnożenie (operator *) i dzielenie (operator /). Te operacje mają ten sam priorytet. 5. Dodawanie (operator +) i odejmowanie (operator -). Te operacje mają ten sam priorytet. 6. Scalanie łańcuchów znaków (operator &). 7. Porównania i dopasowywanie do wzorca (operatory >, <, =, <>, >=, <=, Like, Between, Is). Te operacje mają ten sam priorytet. 8. Operatory logiczne. Przetwarza się je w następującej kolejności: Not, And, Or. Operacje o tym samym priorytecie są wykonywane od lewej do prawej.
W jaki sposób znajomość kolejności operacji pomaga uniknąć błędów analitycznych? Zobacz to na prostym przykładzie. Otóż poprawnym wynikiem operacji (20+30)*40 jest 200. Jeśli jednak pominąć nawiasy, Access wykona działanie 20+30*4 w następujący sposób: 30 * 4 = 120, 120 + 20 = 140. Priorytety operatorów powodują, że Access najpierw mnoży, a dopiero potem dodaje wartości. Dlatego wyrażenie 20+30*4 zwróci błędną wartość. Ponieważ zgodnie z priorytetami operatorów Access najpierw wykonuje działania w nawiasach, umieszczenie w nich operacji 20+30 pozwala uzyskać poprawny wynik. Wykrywanie wartości Null Wartość Null oznacza brak wartości. Gdy w tabeli Accessa występuje pusta komórka (pozbawiona danych), jest uznawana za komórkę o wartości Null.
380
Część IV Analizowanie danych w Accessie
Doświadczeni użytkownicy Excela mogą być zdziwieni informacją, że wartość Null może powodować błędy w obliczeniach. W Excelu wartość Null w kolumnie liczb nie sprawia kłopotów, ponieważ Excel traktuje ją jak zero. W Accessie jest inaczej. Gdy Access natrafi na wartość Null, nie przyjmuje, że reprezentuje ona zero. Zamiast tego natychmiast zwraca wartość Null jako wynik. Aby zobaczyć, jak to działa, utwórz kwerendę przedstawioną na rysunku 12.14. Rysunek 12.14. Aby zobaczyć, w jaki sposób wartości Null mogą powodować błędy w obliczeniach, utwórz tę kwerendę w widoku projektu
Uruchom tę kwerendę. Pojawią się wyniki widoczne na rysunku 12.15. Zauważ, że w obliczeniach wariancji dla pierwszego rekordu wynik jest niezgodny z oczekiwaniami. Zamiast niego pojawia się wartość Null. Dzieje się tak, ponieważ prognoza dla tego rekordu jest wartością Null. Rysunek 12.15. Jak widać, dowolna zmienna Null w obliczeniach powoduje, że wynik to także wartość Null
Na podstawie rysunku 12.15 można sobie wyobrazić, że spowodowany wartością Null błąd w obliczeniach może prowadzić do problemów w analizach — zwłaszcza gdy proces analityczny jest skomplikowany. Ponadto błędy tego rodzaju bywają trudne do wykrycia i naprawienia. Można jednak uniknąć błędów powodowanych wartościami Null, używając funkcji Nz. Przekształca ona napotkane wartości Null na określoną wartość: Nz(Dane,Zastępnikdlanull)
Rozdział 12. Obliczenia i daty
381
Funkcja Nz przyjmuje dwa argumenty: Dane
— są to używane dane.
Zastępnikdlanull
— jest to wartość zwracana, gdy Dane mają wartość Null.
Wywołanie Nz([PoleLiczbowe]; 0) przekształca każdą wartość Null z pola PoleLiczbowe na zero. Ponieważ problemem jest tu pole Forecast, należy przekazać je do funkcji Nz. Rysunek 12.16 przedstawia zmodyfikowaną kwerendę. Rysunek 12.16. Należy przekazać pole Forecast do funkcji Nz, aby przekształcić wartości Null na zera
Na rysunku 12.17 widać, że wariancja jest zwracana dla pierwszego rekordu, choć wartości w polu Forecast to Null. Warto zauważyć, że funkcja Nz nie powoduje umieszczenia zera w miejsce wartości Null. Funkcja ta jedynie informuje Accessa, że ma traktować wartości Null jak zera w trakcie obliczania wartości pola Variance. Rysunek 12.17. W kolumnie Variance w pierwszym wierszu występuje teraz wartość
Sprawdzanie składni wyrażeń Także proste pomyłki w składni wyrażeń z obliczeniami mogą prowadzić do błędów. Stosuj się do przedstawionych poniżej wskazówek, aby uniknąć pomyłek:
Jeśli w obliczeniach używasz pól, umieszczaj je w nawiasach kwadratowych ([]).
Upewnij się, czy w nazwach pól nie pojawiły się literówki.
382
Część IV Analizowanie danych w Accessie
Uważaj, aby przy przypisywaniu aliasu do pola obliczeniowego nie podać przypadkowo nazwy pola z tabeli używanej w kwerendzie.
Nie stosuj w aliasach niedozwolonych znaków: kropki (.), wykrzyknika (!), nawiasów kwadratowych ([]) i ampersandu (&).
Używanie dat w analizach W Accessie wszystkie daty począwszy od 31 grudnia 1899 roku są zapisywane jako dodatnia liczba porządkowa. Data 31 grudnia 1899 to 1, 1 stycznia 1900 to 2 itd. System przechowywania dat w postaci liczb porządkowych (system 1900) jest domyślnym rozwiązaniem we wszystkich aplikacjach z pakietu Office. Możesz wykorzystać ten system do wykonywania obliczeń na datach.
Proste obliczenia na datach Rysunek 12.18 przedstawia jedne z najprostszych obliczeń, jakie można przeprowadzić na datach. Tu kwerenda dodaje 30 do każdej daty wysyłki. Powoduje to zwrócenie daty wysyłki przesuniętej o 30 dni do przodu. W ten sposób uzyskiwana jest nowa data. Rysunek 12.18. Ta kwerenda dodaje 30 do każdej daty wysyłki. Powstaje w ten sposób nowa data — równa dacie przesyłki przesuniętej do przodu o 30 dni
Aby obliczenia były prawidłowe, daty muszą znajdować się w polach typu Data/Godzina. Jeśli wpiszesz datę w polu tekstowym, będzie ona wyglądała jak data, ale Access będzie ją traktował jak łańcuch znaków. W efekcie obliczenia przeprowadzane na datach w formacie tekstowym będą nieprawidłowe. Upewnij się, czy wszystkie dane są przechowywane w polach typu Data/Godzina.
Można też obliczyć, ile dni dzieli dwie daty. Obliczenia przedstawione na rysunku 12.19 odejmują numer porządkowy odpowiadający jednej dacie od numeru porządkowego reprezentującego drugą datę. W ten sposób można otrzymać liczbę dni między dwoma datami.
Zaawansowane analizy z wykorzystaniem funkcji W Accessie 2013 dostępnych jest 25 wbudowanych funkcji dotyczących dat i godzin. Niektóre z nich stosuje się bardzo rzadko. Inne wykorzystywane są rutynowo. W tym punkcie znajdziesz omówienie wybranych spośród podstawowych funkcji związanych z datą i godziną. Są to funkcje, które mogą się przydać w typowych analizach.
Rozdział 12. Obliczenia i daty
383
Rysunek 12.19. Ta kwerenda określa liczbę dni między dwoma datami
Funkcja Date Date to wbudowana funkcja Accessa, która zwraca bieżącą datę systemową (czyli datę danego dnia). Dzięki tej wszechstronnej funkcji nie trzeba na stałe zapisywać w obliczeniach bieżącej daty. Oznacza to, że można przeprowadzać dynamiczne obliczenia, w których bieżąca data systemowa jest używana jak zmienna. W ten sposób każdego dnia uzyskany zostanie inny wynik. W tym podpunkcie opisaliśmy różne sposoby, w jakie można wykorzystać funkcję Date do wzbogacenia analiz. Określanie liczby dni między aktualną datą a dniem z przeszłości
Załóżmy, że masz za zadanie wykryć zaległe płatności. Musisz znać aktualną datę, aby móc ustalić, ile dni minęło od terminu płatności. Oczywiście można wprowadzić bieżącą datę ręcznie, jest to jednak niewygodne i może prowadzić do błędów. Aby zobaczyć, jak używać funkcji Date, utwórz kwerendę z rysunku 12.20. Rysunek 12.20. Ta kwerenda zwraca liczbę dni między bieżącą datą a datami poszczególnych zamówień
Używanie funkcji Date w kryteriach
Funkcję Date można wykorzystać do odfiltrowania rekordów, umieszczając ją w wyrażeniu używanym jako kryterium. Kwerenda z rysunku 12.21 zwraca wszystkie rekordy z zamówieniami złożonymi ponad 90 dni temu.
384
Część IV Analizowanie danych w Accessie
Rysunek 12.21. Nie ma znaczenia, jaka jest data — ta kwerenda zawsze zwraca wszystkie zamówienia złożone ponad 90 dni wcześniej
Obliczanie długości okresu w latach za pomocą funkcji Date
Załóżmy, że poproszono Cię o sporządzenie listy managerów zawierającej nazwiska i lata stażu pracy. Aby wykonać to zadanie, trzeba obliczyć różnicę między aktualną datą a datą zatrudnienia każdego managera. Pierwszy krok wymaga utworzenia kwerendy przedstawionej na rysunku 12.22. Rysunek 12.22. Należy obliczyć różnicę między bieżącą datą a dniem zatrudnienia każdego managera
Patrząc na wyniki zwrócone przez kwerendę (zobacz rysunek 12.23), łatwo zauważyć, że zwracana jest liczba dni między datami, a nie liczba lat. Rysunek 12.23. W zbiorze danych znajdują się liczby dni, a nie liczby lat
Rozdział 12. Obliczenia i daty
385
Aby rozwiązać problem, wróć do widoku projektu i podziel wartości przez 365,25. Dlaczego właśnie tyle? Jest to średnia liczba dni w roku, jeśli uwzględni się lata przestępne. Wprowadzoną zmianę przedstawia rysunek 12.24. Zauważ, że pierwotne obliczenia są teraz umieszczone w nawiasach. Pozwala to uniknąć błędów związanych z priorytetami operatorów. Rysunek 12.24. Należy podzielić pierwotny wynik przez 365,25, aby przekształcić wartość na liczbę lat
Spojrzenie na wyniki (zobacz rysunek 12.25) pozwala się przekonać, że po tej zmianie kwerenda zwraca liczbę lat. Teraz wystarczy usunąć część ułamkową za pomocą funkcji Int. Dlaczego zastosowano właśnie ją? Ponieważ nie zaokrągla danych w górę lub w dół, a jedynie przekształca wartość na czytelną liczbę całkowitą. Rysunek 12.25. Kwerenda zwraca teraz lata, trzeba jednak usunąć część ułamkową wyniku
Chcesz zaokrąglić liczbę lat? Możesz umieścić obliczenia dat w funkcji Round. Opisaliśmy ją w dodatku D.
Umieszczenie obliczeń w funkcji Int gwarantuje, że w wyniku uzyskasz tylko liczbę lat bez części ułamkowej (zobacz rysunek 12.26). Wiek osób można obliczyć za pomocą tej samej metody. Wystarczy zastąpić datę zatrudnienia datą urodzenia.
386
Część IV Analizowanie danych w Accessie
Rysunek 12.26. Ta kwerenda zwraca liczbę lat, jaką każdy pracownik spędził w firmie
Funkcje Year, Month, Day i Weekday Funkcje Year, Month, Day i Weekday służą do zwracania liczb całkowitych reprezentujących różne części dat. Wszystkie te funkcje pobierają jako argument prawidłową datę. Oto przykłady: Year(#1997-12-31#) zwraca 1997. Month(#1997-12-31#) zwraca 12. Day(#1997-12-31#) zwraca 31. Weekday(#1997-12-31#) zwraca 4. Funkcja Weekday na podstawie daty zwraca dzień tygodnia. W Accessie dni tygodnia mają numery od 1 do 7 (1 to niedziela). Dlatego jeśli funkcja Weekday zwraca 4, dniem tygodnia jest środa. Jeśli w Twoim kraju niedziela nie jest pierwszym dniem tygodnia, możesz wykorzystać opcjonalny argument FirstDayOfWeek. Określa on, który dzień tygodnia należy traktować jako pierwszy (1 to niedziela, 2 to poniedziałek, 3 to wtorek itd.). Jeśli pominiesz ten argument, domyślnie pierwszym dniem tygodnia będzie niedziela.
Na rysunku 12.27 pokazujemy, jak korzystać z wymienionych funkcji w kwerendach.
Rysunek 12.27. Funkcje Year, Month, Day i Weekday umożliwiają przetwarzanie części dat
Rozdział 12. Obliczenia i daty
387
Łatwy sposób na uwzględnianie w kwerendach tylko dni roboczych Załóżmy, że poproszono Cię o podanie łącznych wpływów wygenerowanych dzięki danemu produktowi, przy czym ważne są tylko wpływy uzyskane w dniach roboczych w roku kalendarzowym 2008. Dni robocze to te, które nie są weekendami ani świętami. Pierwszą rzeczą, jaką trzeba zrobić, aby wykonać to zadanie, jest utworzenie tabeli z listą wszystkich świąt w 2008 roku. Na poniższym rysunku widać, że taka tabela może zawierać tylko jedno pole z listą wszystkich dat odpowiadających świętom.
Po utworzeniu tabeli z wszystkimi świętami można przystąpić do pracy nad kwerendą. Na poniższym rysunku pokazujemy, jak utworzyć kwerendę, która odfiltrowuje dni wolne od pracy.
Warto poświęcić chwilę na przeanalizowanie zawartości ostatniego rysunku: 1. Tworzone jest sprzężenie lewostronne tabel TransactionMaster i Holidays, co informuje Accessa, że należy pobrać wszystkie rekordy z tabeli TransactionMaster. 2. Dla tabeli Holidays używane jest kryterium Is Null. To sprawia, że w tabeli TransactionMaster uwzględniane są tylko te daty, które nie pasują do dni wolnych wymienionych w tabeli Holidays. 3. Następnie tworzone jest pole DayCheck, w którym zapisywany jest dzień tygodnia dla daty każdej usługi z tabeli TransactionMaster. 4. Kwerenda filtruje dane według nowo utworzonego pola DayCheck, tak aby wykluczyć dni tygodnia, które reprezentują soboty i niedziele. 5. W ostatnim kroku dane są filtrowane w taki sposób, aby pozostały tylko rekordy, dla których rok w dacie zamówienia to 2008.
388
Część IV Analizowanie danych w Accessie
Funkcja DateAdd W wielu organizacjach analizuje się, którego dnia zostanie osiągnięta określona wartość. Na przykład większość firm chce wiedzieć, jaka będzie data 30 dni po złożeniu zamówienia. Ponadto warto ustalić, którego dnia należy wysłać do klienta przypomnienie. Łatwym sposobem na przeprowadzenie analiz tego typu jest wykorzystanie funkcji DateAdd. Zwraca ona datę, do której dodano określony okres: DateAdd(Okres;Liczba;Data)
Funkcja DateAdd zwraca datę, do której dodano określony okres. Funkcja ta przyjmuje trzy wymagane argumenty: Okres
(wymagany) — używany okres; możliwe okresy to:
"yyyy" — rok, "q" — kwartał, "m" — miesiąc, "y" — dzień roku, "d" — dzień, "w" — dzień tygodnia, "ww" — tydzień, "h" — godzina, "n" — minuta, "s" — sekunda. Liczba (wymagany) — liczba dodawanych jednostek danego okresu; liczba dodatnia
powoduje zwrócenie daty z przyszłości, natomiast liczba ujemna — daty z przeszłości. Data
(wymagany) — wyjściowa data.
Oto przykłady: DateAdd("ww";1;#2008-11-30#) zwraca 2008-12-07. DateAdd("m";2;#2008-11-30#) zwraca 2008-01-30. DateAdd("yyyy";-1;#2008-11-30#) zwraca 2007-11-30.
Kwerenda z rysunku 12.28 pokazuje, jak wykorzystać funkcję DateAdd, aby ustalić dokładną datę osiągnięcia pewnej wartości. Kwerenda tworzy dwa nowe pola — Warning i Overdue. Funkcja DateAdd użyta w polu Warning zwraca datę przesuniętą o trzy tygodnie do przodu względem daty zamówienia. Funkcja DateAdd z pola Overdue zwraca datę przesuniętą o miesiąc do przodu względem pierwotnej daty zamówienia.
Rozdział 12. Obliczenia i daty
389
Rysunek 12.28. Ta kwerenda zwraca pierwotną datę zamówienia, datę dnia, kiedy należy wysłać przypomnienie, a także datę określającą, kiedy upływa 30 dni od złożenia zamówienia
Grupowanie danych według kwartałów Dlaczego miałbyś grupować dane według kwartałów? Większość baz danych przechowuje raczej konkretne daty niż oznaczenia kwartałów. Dlatego jeśli chcesz przeanalizować dane kwartalne, musisz przekształcić daty na kwartały. Co ciekawe, nie istnieje funkcja dla dat i godzin, która umożliwiałaby grupowanie dat według kwartałów. Istnieje jednak funkcja Format. Format to funkcja z kategorii Tekstowe. Umożliwia przekształcenie danych na łańcuch znaków. Przekształcanie odbywa się na podstawie instrukcji formatowania. W kontekście analizowania dat istnieje kilka poprawnych instrukcji, które można przekazać do funkcji Format: Format(#2004-01-31#; "yyyy") zwraca 2004. Format(#2004-01-31#; "yy") zwraca 04. Format(#2004-01-31#; "q") zwraca 1. Format(#2004-01-31#; "mmm") zwraca Jan. Format(#2004-01-31#; "mm") zwraca 01. Format(#2004-01-31#; "d") zwraca 31. Format(#2004-01-31#; "w") zwraca 7. Format(#2004-01-31#; "ww") zwraca 5. Warto pamiętać, że wartość zwrócona po przekazaniu daty do funkcji Format to łańcuch znaków, dlatego nie można wykorzystać tej wartości w dalszych obliczeniach.
Kwerenda z rysunku 12.29 grupuje daty złożenia wszystkich zamówień według kwartałów, a następnie grupuje dane w ramach poszczególnych kwartałów, aby uzyskać sumę wpływów z każdego z nich.
390
Część IV Analizowanie danych w Accessie
Rysunek 12.29. Za pomocą funkcji Format można pogrupować daty według kwartałów
Jeśli chcesz zastosować bardziej wymyślne rozwiązanie, możesz wykorzystać funkcję Format w kwerendzie krzyżowej, podając Quarter jak kolumnę (zobacz rysunek 12.30).
Rysunek 12.30. Funkcję Format można też wykorzystać w kwerendzie krzyżowej
Na rysunku 12.31 widać, że wynikowy zbiór danych w przejrzysty sposób pokazuje wpływy dla produktów w ujęciu kwartalnym. Rysunek 12.31. Dane udało się pogrupować według kwartałów
Rozdział 12. Obliczenia i daty
391
Funkcja DateSerial Funkcja DateSerial umożliwia utworzenie daty dzięki połączeniu jej elementów: roku, miesiąca i dnia. Funkcja ta doskonale się nadaje do przekształcania na datę odrębnych łańcuchów znaków, które razem reprezentują określony dzień. DateSerial(Rok;Miesiąc;Dzień)
Funkcja DateSerial przyjmuje trzy argumenty: Rok (wymagany) — dowolna liczba lub wyrażenie liczbowe o wartości od 100 do 9999. Miesiąc Dzień
(wymagany) — dowolna liczba lub wyrażenie liczbowe.
(wymagany) — dowolna liczba lub wyrażenie liczbowe.
Poniższa przykładowa instrukcja zwraca wartość 2012-04-03. DateSerial(2012; 4; 3)
W jaki sposób może to być przydatne? Teraz można zastosować kilka sztuczek i wykonać obliczenia w wywołaniu funkcji DateSerial. Oto kilka możliwości:
Można otrzymać pierwszy dzień ostatniego miesiąca, odejmując 1 od bieżącego miesiąca i podając 1 jako argument Dzień: DateSerial(Year(Date()); Month(Date()) - 1; 1)
Można otrzymać pierwszy dzień następnego miesiąca, dodając 1 do bieżącego miesiąca i podając 1 jako argument Dzień: DateSerial(Year(Date()); Month(Date()) + 1; 1)
Można otrzymać ostatni dzień bieżącego miesiąca, dodając 1 do bieżącego miesiąca i podając 0 jako argument Dzień: DateSerial(Year(Date()); Month(Date()) + 1; 0)
Można otrzymać ostatni dzień następnego miesiąca, dodając 2 do bieżącego miesiąca i podając 0 jako argument Dzień: DateSerial(Year(Date()); Month(Date()) + 2; 0)
Przekazanie 0 jako argumentu Dzień automatycznie powoduje otrzymanie ostatniego dnia miesiąca poprzedzającego miesiąc określony w funkcji DateSerial. Warto wspomnieć, że funkcja DateSerial potrafi przeskakiwać między latami. Wywołanie Month(Date()) – 1 działa poprawnie także dla stycznia, a Month(Date()) + 1 dla grudnia.
392
Część IV Analizowanie danych w Accessie
Rozdział 13.
Analizy warunkowe W tym rozdziale:
Stosowanie kwerend z parametrami
Stosowanie funkcji warunkowych
Funkcje IIf i Switch
Do tej pory przedstawialiśmy proste analizy. Wystarczyło utworzyć kwerendę, dodać kryteria i obliczenia, zapisać kwerendę i uruchomić ją w odpowiednim momencie. Co jednak robić, jeśli kryteria związane z analizami często się zmieniają lub gdy procesy analityczne zależą od wystąpienia określonych warunków? W takich sytuacjach należy się posłużyć analizą warunkową, czyli analizą, której wynik zależy od wcześniej zdefiniowanego zbioru warunków. Oprócz kodu VBA i makr istnieje też kilka innych narzędzi i funkcji (np. kwerendy z parametrami, funkcja IIf i funkcja Switch) pozwalających tworzyć analizy warunkowe. W tym rozdziale poznasz narzędzia i funkcje, które pomogą Ci zaoszczędzić czas, uporządkować proces analityczny i wzbogacić analizy. Początkową bazę danych do tego rozdziału, Rozdział13.accdb, można pobrać z witryny poświęconej tej książce.
Stosowanie kwerend z parametrami W trakcie pracy nad procesem analitycznym możesz zauważyć, że często trudno jest przewidzieć każdą możliwą kombinację kryteriów, jaka może być potrzebna. W takiej sytuacji przydatne są kwerendy z parametrami. Kwerenda z parametrami to interaktywna kwerenda, która przed rozpoczęciem pracy żąda podania kryteriów. Jest przydatna, gdy przy każdym uruchomieniu kwerendy trzeba przekazać do niej inne pytania, używając różnych kryteriów. Aby dobrze zrozumieć, w jaki sposób kwerendy z parametrami mogą być przydatne, utwórz kwerendę przedstawioną na rysunku 13.1. Za jej pomocą można wyświetlić wszystkie zamówienia złożone w okresie 200705.
394
Część IV Analizowanie danych w Accessie
Rysunek 13.1. Ta kwerenda zawiera zapisane na stałe kryterium określające okres
Choć kwerenda ta zwraca pożądane wyniki, problem polega na tym, że kryterium określające okres jest zapisane na stałe jako 200705. Dlatego gdy zechcesz przeanalizować wpływy z innego okresu, będziesz musiał utworzyć kwerendę od nowa. Zastosowanie kwerendy z parametrami pozwala opracować analizy warunkowe, oparte na zmiennych określanych przy każdym uruchomieniu kwerendy. Aby utworzyć taką kwerendę, wystarczy zastąpić zapisane na stałe kryteria tekstem umieszczonym w nawisach kwadratowych ([]), co przedstawia rysunek 13.2. Rysunek 13.2. Aby utworzyć kwerendę z parametrami, zastąp zapisane na stałe kryteria tekstem umieszczonym w nawiasach kwadratowych
Gdy uruchomisz kwerendę z parametrami, pojawi się okno dialogowe Wprowadzanie wartości parametru, gdzie należy podać wartość zmiennej. Warto zauważyć, że tekst wpisany w nawiasach kwadratowych z parametrem pojawia się w oknie dialogowym. Na tym etapie można wprowadzić wartość parametru, co przedstawia rysunek 13.3. Rysunek 13.3. Wpisz kryteria w oknie dialogowym Wprowadzanie wartości parametru i kliknij przycisk OK
Rozdział 13. Analizy warunkowe
395
Jak działają kwerendy z parametrami? Gdy uruchamiasz kwerendę z parametrami, Access próbuje przekształcić tekst na literały, otaczając tekst cudzysłowem. Jeśli jednak wokół tekstu znajdują się nawiasy kwadratowe ([]), Access przyjmuje, że ten tekst to zmienna. Wtedy w kilku krokach próbuje określić wartość zmiennej: 1. Access sprawdza, czy zmienna to nazwa pola. Jeśli tak jest, w wyrażeniu używana jest wartość tego pola. 2. Jeżeli zmienna nie jest nazwą pola, Access sprawdza, czy zmienna odpowiada polu obliczeniowemu. Jeśli tak jest, Access wykonuje odpowiednie operacje matematyczne. 3. Jeżeli zmienna nie jest polem obliczeniowym, Access sprawdza, czy zmienna wskazuje pewien obiekt, np. formant z otwartego formularza lub raportu. 4. Jeśli wszystko zawiodło, pozostaje tylko zapytać użytkownika o wartość zmiennej. Access wyświetla wtedy okno dialogowe Wprowadzanie wartości parametru z wyświetlonym tekstem z wiersza Kryteria.
Podstawowe zasady dotyczące kwerend z parametrami Kwerendy z parametrami (podobnie jak inne mechanizmy Accessa) związane są z określonymi podstawowymi regułami, których należy przestrzegać, aby rozwiązanie działało poprawnie. Oto te zasady:
Trzeba umieścić nawiasy kwadratowe ([]) wokół parametru. Jeśli tego nie zrobisz, Access automatycznie przekształci wprowadzony tekst na literał.
Nie można podać nazwy pola jako parametru. W przeciwnym razie Access zastąpi parametr wartością danego pola.
W nazwie parametru nie można używać kropek (.), wykrzykników (!), nawiasów kwadratowych ([]) ani ampersandów (&).
Nazwa parametru nie powinna zawierać zbyt wielu znaków. Jeśli będzie za długa, może nie zmieścić się w całości w oknie dialogowym Wprowadzanie wartości parametru. Ponadto nazwy parametrów powinny być jak najbardziej jednoznaczne i zwięzłe. Jeśli chcesz umieścić nazwę pola w określeniu parametru, dodaj do niej wybrane znaki. Na przykład zamiast używać określenia [System_Period] wpisz [System_Period:?]. Dwukropek (:) i znak zapytania (?) nie pełnią tu żadnej specjalnej funkcji — możesz dodać dowolny inny znak. Chodzi o to, aby umożliwić Accessowi odróżnienie określenia parametru od nazwy pola, a jednocześnie utworzyć określenie jak najbardziej podobne do nazwy pola.
Używanie kwerend z parametrami W przykładzie widocznym na rysunku 13.2 wykorzystano parametr do zdefiniowania jednego kryterium. Choć jest to najczęstszy sposób korzystania z parametrów w kwerendach, istnieje też wiele innych możliwości. Można nawet powiedzieć, że im bardziej
396
Część IV Analizowanie danych w Accessie
pomysłowo podejdziesz do kwerend z parametrami, tym bardziej eleganckie i zaawansowane będą późniejsze analizy. W tym punkcie opisaliśmy różne sposoby stosowania parametrów w kwerendach. Stosowanie wielu warunków opartych na parametrach Nie ma ograniczenia liczby parametrów stosowanych w kwerendzie. Na rysunku 13.4 pokazano, jak wykorzystać w kwerendzie więcej niż jeden parametr. Gdy uruchomisz tę kwerendę, zobaczysz prośbę o podanie okresu i identyfikatora produktu. Pozwala to dynamicznie przefiltrować dane na podstawie dwóch kryteriów bez konieczności modyfikowania kwerendy. Rysunek 13.4. W kwerendzie można zastosować więcej niż jeden parametr
Łączenie parametrów z operatorami Parametry można łączyć z dowolnymi operatorami, jakie standardowo mogą występować w kwerendach. Stosowanie parametrów razem ze standardowymi operatorami umożliwia dynamiczne rozszerzanie lub zawężanie filtrów w analizach bez konieczności tworzenia nowej kwerendy. Aby zobaczyć, jak to działa, utwórz kwerendę przedstawioną na rysunku 13.5. Rysunek 13.5. W tej kwerendzie połączono operatory standardowe z parametrami, aby ograniczyć listę wyników
Rozdział 13. Analizy warunkowe
397
W tej kwerendzie używane są operatory BETWEEN...AND oraz > (znak większości). Służą one do ograniczenia listy wyników kwerendy na podstawie parametrów zdefiniowanych przez użytkownika. Ponieważ kwerenda obejmuje trzy parametry, użytkownik jest proszony o podanie wartości trzykrotnie: musi podać okres początkowy, okres końcowy i wartość w złotówkach. Liczba zwróconych rekordów zależy od wprowadzonych parametrów. Na przykład jeśli wpiszesz 200701 jako okres początkowy, 200703 jako okres końcowy i 500 jako liczbę złotych, otrzymasz 1700 rekordów. Łączenie parametrów z symbolami wieloznacznymi Jednym z problemów w kwerendach z parametrami jest to, że jeśli użytkownik pominie parametr przy uruchamianiu kwerendy, nie zwróci ona żadnych rekordów. Jednym ze sposobów na rozwiązanie tego problemu jest połączenie parametrów z symbolami wieloznacznymi, tak że gdy użytkownik pominie parametr, kwerenda zwróci wszystkie rekordy. Aby zobaczyć, jak stosować symbole wieloznaczne z parametrami, utwórz kwerendę przedstawioną na rysunku 13.6. Po uruchomieniu wyświetla ona prośbę o podanie okresu. Ponieważ używany jest symbol wieloznaczny, można albo podać okres i przefiltrować dzięki temu dane na podstawie jednego okresu, albo pominąć parametr i otrzymać wszystkie rekordy. Rysunek 13.6. Jeśli użytkownik pominie parametr w tej kwerendzie, to z uwagi na wykorzystanie symbolu wieloznacznego zwróci ona wszystkie rekordy
Stosowanie symboli wieloznacznych razem z parametrami umożliwia użytkownikom uzyskanie wyników także po wprowadzeniu fragmentu parametru. Załóżmy, że kryterium w kwerendzie z parametrami wygląda tak: Like [Podaj nazwisko] & "*"
Gdy wpiszesz „A” jako parametr, otrzymasz wszystkie nazwiska rozpoczynające się od litery A. Teraz przyjmijmy, że kryterium w kwerendzie z parametrami wygląda tak: Like "*" & [Podaj nazwisko] & "*"
Wpisanie „A” powoduje zwrócenie wszystkich nazwisk zawierających literę A. Warto zauważyć, że te kryteria prowadzą do zwrócenia tylko rekordów o określonej wartości. Nie są zwracane rekordy, których wartość to Null. Aby otrzymać także rekordy o wartości Null, należy zastosować następujące kryterium: Like "*" & [Enter Lastname] & "*" or IS NULL
398
Część IV Analizowanie danych w Accessie
Używanie parametrów jako zmiennych w obliczeniach Parametry można stosować nie tylko jako kryteria w kwerendach. Można je wykorzystać w dowolnym miejscu, gdzie używa się zmiennej. Wyjątkowo przydatne są parametry w obliczeniach. Na przykład kwerenda z rysunku 13.7 pozwala zobaczyć, jak wysokie będą ceny po podwyżce o procent wpisany jako parametr. Gdy uruchomisz tę kwerendę, musisz wprowadzić wartość procentową, o jaką chcesz podnieść ceny. Kwerenda z parametrami wykorzysta tę wartość jako zmienną w obliczeniach. Rysunek 13.7. Parametry można wykorzystać w obliczeniach. Pozwala to zmieniać wartości zmiennych w obliczeniach przy każdym uruchomieniu kwerendy
Używanie parametrów jako argumentów funkcji Parametry można też wykorzystać jako argumenty funkcji. Na rysunku 13.8 pokazano, jak wywołać funkcję DateDiff za pomocą parametrów zamiast przy użyciu dat zapisanych na stałe. Gdy uruchomisz tę kwerendę, zostaniesz poproszony o podanie początkowej i końcowej daty. Daty te posłużą za argumenty funkcji DateDiff. W ten sposób przy każdym uruchomieniu kwerendy można podawać nowe daty bez konieczności jej modyfikowania.
Rysunek 13.8. Argumentami funkcji mogą być parametry zamiast zapisanych na stałe wartości Pamiętaj, że wartości wprowadzone jako parametry muszą pasować do typu danych argumentu funkcji. Na przykład jeśli chcesz wykorzystać parametr w funkcji DateDiff, musisz wprowadzić datę. W przeciwnym razie funkcja nie zadziała.
Rozdział 13. Analizy warunkowe
399
Po uruchomieniu kwerendy 13.8 datę początkową i datę końcową trzeba wprowadzić tylko raz, choć każda z tych dat jest używana w dwóch miejscach kwerendy. Wynika to z tego, że wartość przypisana do parametru jest używana także w dalszych jego wystąpieniach.
Jeśli musisz więcej niż raz wprowadzić wartość parametru używanego kilkakrotnie w kwerendzie, prawdopodobnie w jednym z miejsc pojawiła się literówka. Aby tego uniknąć, możesz kopiować nazwę parametru. Tworzenie parametrów przyjmujących różne wartości Kwerenda z parametrami z poniższego rysunku umożliwia dynamiczne filtrowanie wyników na podstawie okresu podanego jako parametr. Kwerenda ta nie umożliwia jednak jednoczesnego wyświetlania wyników dla więcej niż jednego okresu.
Można wykorzystać więcej niż jeden parametr, co pokazano na poniższym rysunku. W odróżnieniu od kwerendy z poprzedniego rysunku ta umożliwia uwzględnienie w wynikach więcej niż jednego okresu. Nadal jednak obowiązuje tu ograniczenie liczby parametrów, jakie można umieścić w kwerendzie (tu można podać maksymalnie trzy parametry).
400
Część IV Analizowanie danych w Accessie
Jak pozwolić na wprowadzenie dowolnej liczby parametrów? Rozwiązanie jest stosunkowo proste. Należy utworzyć parametr przekazywany do funkcji InStr, aby ustalić numer pozycji. Więcej informacji o funkcji InStr znajdziesz w rozdziale 4. W kwerendzie przedstawionej na poniższym rysunku pokazano, jak uzyskać pożądany efekt.
Warto zauważyć, że parametr nie pełni tu funkcji kryterium w polu Period. Zamiast tego parametr jest używany w funkcji InStr do sprawdzenia numeru pozycji zmiennej wprowadzonej w oknie parametrów: InStr([Wpisz okresy rozdzielone przecinkami];[Period])
Jeśli funkcja InStr znajdzie zmienną, zwróci numer pozycji. Jeśli jej nie znajdzie, zwróci zero. Tak więc szukane są rekordy, dla których zwracany jest numer pozycji większy niż zero (czyli które spełniają warunek ustawiony w kryterium). Gdy uruchomisz tę kwerendę, pojawi się okno dialogowe Wprowadzanie wartości parametru (zobacz poniższy rysunek). Możesz w nim wpisać dowolną liczbę zmiennych.
Stosowanie funkcji warunkowych Kwerendy z parametrami nie są jedynym narzędziem Accessa umożliwiającym przeprowadzanie analiz warunkowych. Access udostępnia też wbudowane funkcje, które ułatwiają porównywanie wartości, sprawdzanie poprawności danych i warunkowe obliczanie wartości. Dwie spośród tych funkcji to IIf i Switch. Te funkcje warunkowe (nazywane też funkcjami sterowania przepływem programu) sprawdzają warunki i w zależności od wyniku wykonują inne operacje. Z tego podrozdziału dowiesz się, jak za pomocą funkcji IIf i Switch sterować przebiegiem analiz.
Rozdział 13. Analizy warunkowe
401
Funkcja IIf Funkcja IIf (od ang. immediate if, czyli „natychmiastowe if”) działa jak instrukcja IF, ale dla jednej operacji. Funkcja IIf sprawdza warunek i zwraca wynik na podstawie tego, czy warunek jest spełniony czy nie: IIf(Wyrażenie; WynikDlaTrue; WynikDlaFalse)
Aby zastosować funkcję IIf, trzeba podać trzy wymagane argumenty: sprawdzane wyrażenie, wartość zwracaną dla wyrażeń o wartości True i wartość zwracaną dla wyrażeń o wartości False. Wyrażenie
(wymagany) — sprawdzane wyrażenie.
WynikDlaTrue
(wymagany) — wartość zwracana dla wyrażeń o wartości True.
WynikDlaFalse
(wymagany) — wartość zwracana dla wyrażeń o wartości False.
Przecinki w funkcji IIf możesz traktować jak instrukcje THEN i ELSE. Przyjrzyj się poniższemu wywołaniu funkcji IIf: IIf(Dzieci = 2; "Bliźniaki"; "Nie bliźniaki")
Funkcja ta oznacza: „jeśli Dzieci równa się dwa, to Bliźniaki, w przeciwnym razie to Nie bliźniaki”.
Używanie funkcji IIf w celu uniknięcia błędów matematycznych Aby zapoznać się z prostym problemem, w którego rozwiązaniu może pomóc funkcja IIf, utwórz kwerendę przedstawioną na rysunku 13.9. Rysunek 13.9. Ta kwerenda wykonuje obliczenia na podstawie wartości pól Actual i Forecast, aby ustalić zależność między nimi
Gdy uruchomisz tę kwerendę, zauważysz, że nie wszystkie wyniki wyglądają poprawnie. Jak widać na rysunku 13.10, wystąpiły błędy z uwagi na dzielenie przez zero (wynikają one z tego, że kwerenda próbuje podzielić wpływy przez zerowe prognozy). Rysunek 13.10. Błędy w wynikach są efektem dzielenia wpływów przez zero
402
Część IV Analizowanie danych w Accessie
Choć problem ten wydaje się mało istotny, w skomplikowanym, wielopoziomowym procesie analitycznym błędy tego typu mogą prowadzić do niepoprawnych analiz. Aby uniknąć takich błędów, można przeprowadzić na zbiorze danych analizy warunkowe z wykorzystaniem funkcji IIf i przed wykonaniem obliczeń sprawdzać wartość pola Forecast w każdym rekordzie. Jeśli pole to ma wartość zero, należy pominąć obliczenia i zwrócić zero. Jeżeli pole ma wartość niezerową, można przeprowadzić obliczenia, aby uzyskać prawidłową wartość. Wywołanie funkcji IIf powinno wyglądać tak: IIf([Forecast]=0;0;[Actual]/[Forecast])
Na rysunku 13.11 pokazano, jak działa ta funkcja.
Rysunek 13.11. Ta funkcja IIf umożliwia sprawdzanie pól Forecast pod kątem wartości zero i pomijanie pól o tej wartości w obliczeniach
Jak widać na rysunku 13.12, pozwala to uniknąć błędów. Rysunek 13.12. Funkcja IIf pomaga uniknąć błędów dzielenia przez zero
Przyspieszanie pracy za pomocą funkcji IIf Za pomocą funkcji IIf można też przyspieszyć proces analityczny i zaoszczędzić dzięki temu czas. Załóżmy, że na liście danych kontaktowych chcesz oznaczyć dużych i małych klientów na podstawie ich potencjalnych wydatków. Zdecydowałeś się zaktualizować pole MyTest w zbiorze danych wartościami „LARGE” i „SMALL” w zależności od potencjalnych wydatków poszczególnych klientów. Gdyby nie było funkcji IIf, zadanie to wymagałoby uruchomienia dwóch kwerend aktualizujących, przedstawionych na rysunkach 13.13 i 13.14. Czy kwerendy przedstawione na rysunkach 13.13 i 13.14 wykonają opisane zadanie? Tak. Jednak ten sam efekt można uzyskać za pomocą jednej kwerendy wykorzystującej funkcję IIf.
Rozdział 13. Analizy warunkowe
403
Rysunek 13.13. Ta kwerenda aktualizuje pole MyTest i oznacza słowem „LARGE” wszystkich klientów o potencjalnych wydatkach równych przynajmniej 10 000 złotych
Rysunek 13.14. Ta kwerenda aktualizuje pole MyTest i oznacza słowem „SMALL” wszystkich klientów o potencjalnych wydatkach niższych niż 10 000 złotych
Kwerenda aktualizująca z rysunku 13.15 pokazuje, jak wykorzystać funkcję IIf jako wyrażenie aktualizujące. Rysunek 13.15. Używając funkcji IIf, opisane zadanie można wykonać w jednej kwerendzie
Przyjrzyj się funkcji IIf używanej jako wyrażenie aktualizujące: IIf([DollarPotential]>=10000;"LARGE";"SMALL")
Funkcja ta informuje Accessa, że ma sprawdzić wartość pola DollarPotential w każdym rekordzie. Jeśli polecenie to ma wartość równą przynajmniej 10 000, należy zaktualizować dane za pomocą słowa „LARGE”. Jeżeli wartość jest mniejsza niż 10 000, należy wstawić słowo „SMALL”.
404
Część IV Analizowanie danych w Accessie
W funkcjach IIf można stosować operatory warunkowe (AND, OR, BETWEEN), aby dodać nowy poziom do wyrażenia warunkowego. Na przykład poniższa funkcja sprawdza potencjalne wydatki i segment, aby uzyskać wartość True lub False: IIf([DollarPotential]>10000 And [Segment]="Metal Fabrication";"True";"False")
Zagnieżdżanie funkcji IIf w celu sprawdzenia kilku warunków Testowany warunek czasem jest zbyt skomplikowany, aby było możliwe sprawdzenie go za pomocą prostej struktury IF…THEN…ELSE. Wtedy można zastosować zagnieżdżone funkcje IIf, czyli takie funkcje umieszczone w innych funkcjach IIf. Przyjrzyj się następującemu przykładowi: IIf([VALUE]>100;"A";IIf([VALUE]<100;"C";"B"))
Ta funkcja sprawdza, czy VALUE ma wartość większą niż 100. Jeśli tak jest, należy zwrócić "A". W przeciwnym razie uruchamiana jest druga funkcja IIf. Sprawdza ona, czy VALUE ma wartość mniejszą niż 100. Jeżeli tak jest, należy zwrócić "C". W przeciwnym razie zwracana jest wartość "B". Ponieważ funkcja IIf zwraca wyniki dla wartości True lub False, można rozbudować warunek, umieszczając w wyrażeniu dla wartości False inną funkcję IIf zamiast zapisanej na stałe wartości. To prowadzi do dalszych testów. Nie istnieje ograniczenie liczby zagnieżdżonych funkcji IIf, które można wykorzystać. Używanie funkcji IIf w analizach krzyżowych Wielu doświadczonych analityków używa funkcji IIf do tworzenia niestandardowych analiz krzyżowych zamiast uruchamiać kwerendy krzyżowe. Wśród wielu zalet przeprowadzania analiz krzyżowych bez kwerend krzyżowych jest możliwość kategoryzowania i grupowania niepowiązanych ze sobą danych. W przykładzie przedstawionym na rysunku 13.16 zwracana jest lista managerów zatrudnionych przed rokiem 2009 i po tym roku. W kwerendzie krzyżowej utworzenie tak precyzyjnych kategorii byłoby niemożliwe.
Rysunek 13.16. Ta kwerenda pokazuje, jak utworzyć analizy krzyżowe bez stosowania kwerendy krzyżowej
Rozdział 13. Analizy warunkowe
405
Wyniki widoczne na rysunku 13.17 są równie przejrzyste i zrozumiałe jak wyniki zwracane przez kwerendy krzyżowe. Rysunek 13.17. Wynikowy zbiór danych jest równie przejrzysty jak w kwerendach krzyżowych
Inną zaletą przeprowadzania analiz krzyżowych bez kwerend krzyżowych jest możliwość uwzględnienia w raporcie więcej niż jednych obliczeń. Na rysunku 13.18 pokazano kwerendę, która zwraca sumę jednostek i wpływy w formacie znanym z kwerend krzyżowych.
Rysunek 13.18. Tworzenie za pomocą funkcji IIf raportów w formacie kwerend krzyżowych pozwala obliczyć więcej niż jedną wartość
Jak widać na rysunku 13.19, wynikowy zbiór danych zapewnia bogate informacje w czytelnym formacie. Ponieważ standardowa kwerenda krzyżowa nie pozwala na obliczenie więcej niż jednej wartości (tu wartościami są liczba jednostek i wpływy), uzyskanie takiego widoku za pomocą kwerendy tego typu byłoby niemożliwe. Rysunek 13.19. Kwerenda krzyżowa nie umożliwia wykonywania wielu obliczeń, dlatego nie pozwala na przeprowadzenie takich analiz
Funkcja Switch Funkcja Switch pozwala sprawdzić wartości wyrażeń z listy i zwraca wartość powiązaną z wyrażeniem o wartości True. Aby zastosować funkcję Switch, trzeba podać przynajmniej jedno wyrażenie i przynajmniej jedną wartość: Switch(Wyrażenie; Wartość) Wyrażenie Wartość
(wymagany) — sprawdzane wyrażenie.
(wymagany) — wartość zwracana dla wyrażeń o wartości True.
406
Część IV Analizowanie danych w Accessie
Funkcja Switch jest tak przydatna, ponieważ umożliwia jednoczesne sprawdzenie wartości wielu wyrażeń i ustalenie, które z nich ma wartość True. Aby sprawdzić kilka wyrażeń, dodaj do funkcji następną parę Wyrażenie – Wartość: Switch(Wyrażenie1; Wartość1; Wyrażenie2; Wartość2; Wyrażenie3; Wartość3)
Funkcja Switch sprawdza po kolei każde wyrażenie. Jeśli wartość danego wyrażenia to True, zwracana jest wartość podana po tym wyrażeniu. Jeżeli kilka wyrażeń ma wartość True, funkcja zwraca wartość podaną po pierwszym takim wyrażeniu (pozostałe są ignorowane). Warto pamiętać, że funkcja Switch może sprawdzać wartość dowolnej liczby wyrażeń. Jeśli żadne z wyrażeń sprawdzanych przez funkcję Switch nie ma wartości True, funkcja zwraca wartość Null. Na przykład poniższa funkcja sprawdza wartość zmiennej Count i na tej podstawie zwraca określoną wartość: Switch([Count] < 10; "Mało"; [Count] > 15; "Dużo")
Problem polega na tym, że jeśli zmienna Count ma wartość z przedziału od 10 do 15, funkcja zwróci Null, ponieważ żadne z wyrażeń nie pasuje do takiej wartości. Może to pośrednio powodować błędy w innych miejscach analiz. Aby uniknąć takiej sytuacji, można dodać uniwersalne wyrażenie i powiązać z nim wartość zwracaną, gdy żadne z wcześniejszych wyrażeń nie ma wartości True: Switch([Count] < 10, "Mało", [Count] > 15, "Dużo", True, "Średnio")
Dodanie ostatniego wyrażenia, True, sprawia, że gdy żadne z pozostałych wyrażeń nie ma wartości True, zwracana jest wartość "Średnio".
Porównanie funkcji IIf i Switch Choć funkcja IIf jest wszechstronnym narzędziem, które pozwala wykonać większość analiz warunkowych, ma ograniczoną liczbę argumentów, dlatego działa jak podstawowa konstrukcja IF…THEN…ELSE. To ograniczenie sprawia, że trudno jest sprawdzać złożone warunki bez stosowania zagnieżdżonych funkcji IIf. Chociaż nie ma nic złego w używaniu takich funkcji, w niektórych analizach liczba sprawdzanych warunków powoduje, że tworzenie zagnieżdżonych funkcji IIf jest w najlepszym przypadku niepraktyczne. Aby się o tym przekonać, zastanów się nad następującą sytuacją: klientów często dzieli się na grupy na podstawie rocznych lub łącznych wpływów, jakie generują dla firmy. Załóżmy, że firma przypisuje klientów do czterech grup: A, B, C i D (tabela 13.1). Tabela 13.1. Grupy klientów Roczne wpływy
Grupa klientów
>= 10 000 złotych
A
>= 5000 złotych, ale < 10 000 złotych
B
>= 1000 złotych, ale < 5000 złotych
C
< 1000 złotych
D
Rozdział 13. Analizy warunkowe
407
Masz przypisać klientów z tabeli TransactionMaster do tych grup na podstawie przeprowadzonych przez nich transakcji. Możesz wykorzystać funkcję IIf lub Switch. Problem z funkcją IIf polega na tym, że w tej sytuacji wymaga wielokrotnego zagnieżdżenia. Oznacza to, że trzeba umieścić wyrażenia IIf w innych wyrażeniach tego rodzaju, aby obsłużyć możliwe warunki. Jeśli zdecydujesz się zastosować funkcję IIf, wyrażenie będzie wyglądało tak: IIf([REV]>=10000;"A",IIf([REV]>=5000 And [REV]<10000;"B"; IIf([REV]>1000 And [REV]<5000;"C";"D")))
Jak widać, nie tylko trudno jest ustalić, jak działa ten kod, ale z uwagi na jego złożoność można łatwo popełnić w nim błąd składniowy lub logiczny. W porównaniu z przedstawioną wcześniej zagnieżdżoną funkcją IIf poniższa funkcja Switch jest całkiem prosta: Switch([REV]<1000;"D";[REV]<5000;"C";[REV]<10000;"B";True;"A")
Funkcja ta informuje Accessa, że ma zwrócić "D", jeśli REV ma wartość poniżej 1000. Jeżeli REV ma wartość poniżej 5000, zwracane jest "C". Jeśli wartość REV jest mniejsza niż 10000, należy zwrócić "B". Gdy żaden z tych warunków nie jest spełniony, funkcja zwraca "A". Na rysunku 13.20 pokazano, jak wykorzystać tę funkcję w kwerendzie.
Rysunek 13.20. Funkcja Switch okazuje się czasem bardziej praktyczna od funkcji IIf. Ta kwerenda dzieli klientów na grupy na podstawie generowanych przez nich wpływów Może zwróciłeś uwagę na to, że rekordy o wartości poniżej 1000 mają też wartość mniejszą niż 10 000. Dlaczego więc funkcja nie przypisuje wszystkich rekordów do grupy B? Warto pamiętać, że funkcja Switch sprawdza wyrażenia od lewej do prawej i zwraca tylko wartość powiązaną z pierwszym wyrażeniem, którego wartość to True. Dlatego należy odpowiednio uporządkować wyrażenia w funkcji Switch. Ich kolejność powinna być dostosowana do analiz.
Po uruchomieniu kwerendy otrzymasz zbiór danych przedstawiony na rysunku 13.21.
408
Część IV Analizowanie danych w Accessie
Rysunek 13.21. Każdy klient jest na podstawie warunku przypisywany do grupy odpowiadającej poziomowi rocznych wpływów
Rozdział 14.
Podstawy SQL-a w Accessie W tym rozdziale:
Podstawy SQL-a
Zaawansowany SQL
Kwerendy charakterystyczne dla SQL-a
SQL (ang. Structured Query Language) to język używany do wykonywania różnych zadań w relacyjnych systemach baz danych (np. w Accessie). Aby poinformować Accessa, że ma wykonać określoną kwerendę, należy przekazać instrukcje w SQL-u. Nie bój się — już wcześniej tworzyłeś i stosowałeś instrukcje w SQL-u, nawet jeśli o tym nie wiedziałeś. W tym rozdziale odkryjesz rolę, jaką SQL odgrywa w Accessie, a także dowiesz się, co oznaczają instrukcje SQL-a generowane w trakcie tworzenia kwerend. Ponadto poznasz zaawansowane operacje, jakie można wykonywać za pomocą instrukcji SQL-a. Pozwalają one wykonywać zadania niemożliwe do zrealizowania za pomocą accessowego interfejsu użytkownika. Podstawy, które tu poznasz, pomogą Ci w stosowaniu zaawansowanych technik omawianych w dalszych rozdziałach książki. Wyjściową bazę danych dla tego rozdziału, Rozdział14.accdb, można pobrać z witryny poświęconej tej książce.
Podstawy SQL-a Głównym powodem, dla którego interakcje z SQL-em w Accessie są ograniczone, jest to, że Access jest bardziej przyjazny dla użytkowników, niż się powszechnie uważa. Access większość operacji wykonuje w środowisku przyjaznym dla użytkownika, w którym wykonywane na zapleczu żmudne zadania są ukryte. Aby się o tym przekonać, utwórz w widoku projektu kwerendę widoczną na rysunku 14.1. Ta stosunkowo prosta kwerenda oblicza sumę wpływów dla poszczególnych okresów.
410
Część IV Analizowanie danych w Accessie
Rysunek 14.1. Utwórz tę stosunkowo prostą kwerendę w widoku projektu
Następnie otwórz zakładkę NARZĘDZIA GŁÓWNE na wstążce i wybierz opcję Widok/ Widok SQL. Access przełączy się z widoku projektu do widoku przedstawionego na rysunku 14.2.
Rysunek 14.2. Aby otworzyć widok SQL-a, wybierz opcję Widok/Widok SQL
Na rysunku 14.2 widać, że gdy zajmowałeś się tworzeniem kwerendy w widoku projektu, Access sumiennie generował instrukcję SQL-a umożliwiającą uruchomienie kwerendy. Ten przykład pokazuje, że dzięki przyjaznemu dla użytkownika interfejsowi Accessa nie trzeba znać instrukcji SQL-a powiązanych z kwerendami. Warto więc zadać pytanie: skoro można uruchamiać kwerendy bez znajomości SQL-a, po co się go uczyć? Przyznajemy, że dostępny w Accessie wygodny interfejs do tworzenia kwerend sprawia, iż myśl o pominięciu nauki SQL-a jest kusząca. Jeśli jednak chcesz wykorzystać wszystkie oferowane przez Accessa możliwości z zakresu analizy danych, musisz poznać podstawy SQL-a.
Instrukcja SELECT Instrukcja SELECT to podstawa w SQL-u. Pozwala ona pobierać rekordy ze zbioru danych. Oto podstawowa struktura instrukcji SELECT: SELECT nazwy_kolumn FROM nazwa_tabeli
Instrukcję SELECT najczęściej stosuje się razem z klauzulą FROM. Klauzula FROM określa tabele, które stanowią źródło danych. Spróbuj wykonać następujące czynności: utwórz nową kwerendę w widoku projektu, następnie zamknij okno dialogowe Pokazywanie tabeli (jeśli jest otwarte), otwórz zakładkę PROJEKTOWANIE na wstążce i wybierz opcję Widok/Widok SQL, potem zaś w widoku SQL-a wpisz instrukcję SELECT przedstawioną na rysunku 14.3, a następnie uruchom kwerendę za pomocą przycisku Uruchom z zakładki PROJEKTOWANIE na wstążce.
Rozdział 14. Podstawy SQL-a w Accessie
411
Rysunek 14.3. Prosta instrukcja SELECT w widoku SQL-a
Gratulacje! Właśnie utworzyłeś swoją pierwszą ręcznie napisaną kwerendę. Może zauważyłeś, że utworzona automatycznie przez Accessa instrukcja SQL-a z rysunku 14.2 kończy się średnikiem. Średnik to standardowy znak kończący instrukcje SQL-a. W niektórych bazach danych jest wymagany, jednak w Accessie nie trzeba kończyć instrukcji SQL-a w ten sposób, ponieważ Access automatycznie dodaje ten znak w trakcie kompilowania kwerendy.
Wybieranie określonych kolumn Ze zbioru danych można pobrać określone kolumny, podając je w instrukcji SELECT: SELECT AccountManagerID, FullName,[Email Address] FROM Dim_AccountManagers
Jeśli nazwa kolumny z bazy danych zawiera spacje lub znaki niealfanumeryczne, w instrukcji SQL-a trzeba umieścić ją w nawiasach kwadratowych ([]). Na przykład w instrukcji SQL-a pobierającej dane z kolumny o nazwie Email Address nazwę tę należy podać jako [Email Address].
Pobieranie wszystkich kolumn Za pomocą symbolu wieloznacznego (*) można pobrać wszystkie kolumny ze zbioru danych bez konieczności bezpośredniego definiowania każdej kolumny: SELECT * FROM Dim_AccountManagers
Klauzula WHERE W instrukcji SELECT można zastosować klauzulę WHERE, aby przefiltrować zbiór danych i warunkowo pobrać określone rekordy. Klauzulę WHERE zawsze stosuje się w połączeniu z operatorami: = (równa się), <> (nie równa się), > (większy niż), < (mniejszy niż), >= (większy lub równy), <= (mniejszy lub równy) i BETWEEN (w określonym zakresie). Poniższa instrukcja SQL-a pobiera dane tylko tych pracowników, którzy mają na nazwisko „Kowal”: SELECT AccountManagerID, [Last Name], [First Name] FROM Dim_AccountManagers WHERE [Last Name] = "Kowal"
Następna instrukcja SQL-a pobiera dane pracowników o dacie zatrudnienia późniejszej niż 16 maja 2007 roku: SELECT AccountManagerID, [Last Name], [First Name] FROM Dim_AccountManagers WHERE HireDate > #5/16/2007#
412
Część IV Analizowanie danych w Accessie Zauważ, że w przedstawionych przykładach słowo Kowal ujęto w cudzysłów ("Kowal"), natomiast data 5/16/2007 jest umieszczona między znakami kratki (#5/16/2007#). Wartości tekstowe w instrukcjach SQL-a trzeba ujmować w cudzysłów, natomiast daty trzeba podawać między znakami kratki.
Sprzężenia Często trzeba tworzyć kwerendy, które wymagają złączenia dwóch lub więcej powiązanych tabel w celu uzyskania pożądanych wyników. Na przykład możesz chcieć złączyć tabelę pracowników z tabelą transakcji, aby utworzyć raport z informacjami o transakcjach i o pracownikach, którzy je zarejestrowali. Używany typ sprzężenia określa, jakie rekordy zostaną zwrócone. Szczegółowe omówienie sprzężeń znajdziesz w rozdziale 8.
Sprzężenia wewnętrzne Sprzężenie wewnętrzne informuje Accessa, że z obu tabel należy pobrać tylko rekordy o pasujących do siebie wartościach. Rekordy, które w polu uwzględnianym w sprzężeniu mają wartość niewystępującą w drugiej tabeli, są pomijane w wynikach kwerendy. Poniższa instrukcja SQL-a pobiera tylko te rekordy, w których numery pracowników z pola AccountManagerID pojawiają się zarówno w tabeli Dim_AccountManagers, jak i w tabeli Dim_Territory. SELECT Region, Market, AccountManagerID, FullName FROM Dim_AccountManagers INNER JOIN Dim_Territory ON Dim_AccountManagers.AccountManagerID = Dim_Territory.AccountManagerID
Sprzężenia zewnętrzne Sprzężenie zewnętrzne informuje Accessa, że z jednej tabeli należy pobrać wszystkie rekordy, a z innej — tylko te rekordy, które w polu uwzględnianym w sprzężeniu mają wartości pasujące do rekordów z pierwszej tabeli. Są dwa rodzaje sprzężeń zewnętrznych — lewostronne i prawostronne. Sprzężenie lewostronne (nazywane też zewnętrznym sprzężeniem lewostronnym) informuje Accessa, że należy pobrać wszystkie rekordy z pierwszej tabeli niezależnie od ich dopasowania oraz tylko te rekordy z drugiej tabeli, które w polu uwzględnianym w sprzężeniu mają pasujące wartości. Poniższa instrukcja SQL-a pobiera wszystkie rekordy z tabeli Dim_AccountManagers i tylko te rekordy z tabeli Dim_Territory, które w polu AccountManagerID mają wartość istniejącą w tabeli Dim_AccountManagers: SELECT Region, Market, AccountManagerID, FullName FROM Dim_AccountManagers LEFT JOIN Dim_Territory ON Dim_AccountManagers.AccountManagerID = Dim_Territory.AccountManagerID
Sprzężenie prawostronne (nazywane też zewnętrznym sprzężeniem prawostronnym) informuje Accessa, że należy pobrać wszystkie rekordy z drugiej tabeli niezależnie od ich dopasowania oraz tylko te rekordy z pierwszej tabeli, które w polu uwzględnianym w sprzężeniu mają pasujące wartości.
Rozdział 14. Podstawy SQL-a w Accessie
413
Poniższa instrukcja SQL-a pobiera wszystkie rekordy z tabeli Dim_Territory i tylko te rekordy z tabeli Dim_AccountManagers, które w polu AccountManagerID mają wartość istniejącą w tabeli Dim_Territory: SELECT Region, Market, AccountManagerID, FullName FROM Dim_AccountManagers RIGHT JOIN Dim_Territory ON Dim_AccountManagers.AccountManagerID = Dim_Territory.AccountManagerID
Zauważ, że w instrukcjach sprzężenia przed każdą nazwą kolumny znajduje się nazwa tabeli i kropka (np. Dim_AccountManager.AccountManagerID). W czasie tworzenia instrukcji SQL-a dla kwerend dotyczących kilku tabel zwykle warto podawać nazwy tabel wraz z nazwami pól, aby uniknąć niejednoznaczności i błędów. Access automatycznie dodaje nazwy tabel we wszystkich kwerendach. Ponadto jeśli nazwy tabel lub pól zawierają znaki specjalne (np. spacje), należy zastosować nawiasy kwadratowe.
Zaawansowane instrukcje SQL-a Wkrótce się przekonasz, że język SQL daje całkiem dużo możliwości i znacznie wykracza poza instrukcje SELECT, FROM i WHERE. W tym podrozdziale opisaliśmy wybrane z zaawansowanych zadań, jakie można wykonać za pomocą SQL-a.
Rozbudowywanie wyszukiwania za pomocą operatora Like Operator Like sam w sobie nie różni się od operatora równości (=). Na przykład dwie poniższe instrukcje SQL-a zwracają tę samą liczbę rekordów: SELECT AccountManagerID, [Last Name], [First Name] FROM Dim_AccountManagers WHERE [Last Name] = "Kowal" SELECT AccountManagerID, [Last Name], [First Name] FROM Dim_AccountManagers WHERE [Last Name] Like "Kowal"
Jednak operator Like zwykle stosuje się razem z symbolami wieloznacznymi, aby rozszerzyć zakres wyszukiwania o pasujące do wzorca rekordy. Oto symbole wieloznaczne dostępne w Accessie: *
— gwiazdka reprezentuje dowolną liczbę znaków dowolnego rodzaju.
?
—znak zapytania reprezentuje jeden dowolny znak.
#
— znak kratki reprezentuje jedną cyfrę.
[]—
nawiasy kwadratowe umożliwiają przekazanie do operatora Like jednego znaku lub tablicy znaków. Wartości pasujące do znaków z nawiasów kwadratowych są umieszczane w wynikach.
[!]— nawiasy kwadratowe z wykrzyknikiem umożliwiają przekazanie do operatora
Like jednego znaku lub tablicy znaków. Wartości pasujące do znaków z nawiasów kwadratowych są usuwane z wyników.
W tabeli 14.1 znajdziesz przykładowe instrukcje SQL-a, w których operator Like został wykorzystany do pobrania różnych rekordów z tej samej kolumny z określonej tabeli.
414
Część IV Analizowanie danych w Accessie
Tabela 14.1. Pobieranie z wykorzystaniem operatora Like Użyte symbole wieloznaczne
Przykładowa instrukcja SQL-a
Wynik
SELECT Field1 *
FROM Table1
Pobiera wszystkie rekordy, w których pole Field1 zaczyna się od litery A.
WHERE Field1 Like "A*" SELECT Field1 *
FROM Table1
Pobiera wszystkie rekordy, w których pole Field1 zawiera literę A.
WHERE Field1 Like "*A*" SELECT Field1 ?
FROM Table1
Pobiera wszystkie rekordy, w których pole Field1 zawiera trzy znaki.
WHERE Field1 Like "???" SELECT Field1 ?
FROM Table1
Pobiera wszystkie rekordy, w których pole Field1 zawiera trzy znaki, z których pierwszy to B.
WHERE Field1 Like "B??" SELECT Field1 #
FROM Table1
Pobiera wszystkie rekordy, w których pole Field1 zawiera trzycyfrową liczbę.
WHERE Field1 Like "###" SELECT Field1 #
FROM Table1 WHERE Field1 Like "A#A"
Pobiera wszystkie rekordy, w których Field1 zawiera trzy znaki: na początku literę A, w środku cyfrę, a na końcu drugą literę A.
SELECT Field1 #, *
FROM Table1
Pobiera wszystkie rekordy, w których pole Field1 zaczyna się od litery A i dowolnej cyfry.
WHERE Field1 Like "A#*" SELECT Field1 [], *
FROM Table1 WHERE Field1 Like "*[$%!*/]*" SELECT Field1
[!], *
FROM Table1 WHERE Field1 Like "*[!a-z]*" SELECT Field1
[!], *
FROM Table1 WHERE Field1 Like "*[!0-9]*"
Pobiera wszystkie rekordy, w których pole Field1 zawiera jeden ze znaków specjalnych podanych w przedstawionej instrukcji SQL-a. Pobiera wszystkie rekordy, w których pole Field1 nie zawiera wartości tekstowej, a obejmuje liczbę lub znak specjalny (np. @). Pobiera wszystkie rekordy, w których pole Field1 nie zawiera wartości liczbowej, a obejmuje tekst lub znak specjalny (np. @).
Rozdział 14. Podstawy SQL-a w Accessie
415
Pobieranie unikatowych wartości i wierszy bez grupowania Predykat DISTINCT umożliwia pobieranie samych unikatowych wartości z wybranych pól zbioru danych. Na przykład poniższa instrukcja SQL-a pobiera tylko unikatowe stanowiska z tabeli Dim_AccountManagers i zwraca sześć rekordów: SELECT DISTINCT AccountManagerID FROM Dim_AccountManagers
Jeśli dana instrukcja SQL-a pobiera więcej niż jedno pole, połączenie wartości wszystkich tych pól musi być unikatowe, aby rekord znalazł się w wynikach. Jeżeli chcesz, aby cały wiersz był unikatowy, możesz zastosować predykat DISTINCTROW. Ten predykat umożliwia pobranie tylko tych rekordów, w których cały wiersz jest unikatowy. Oznacza to, że kombinacja wszystkich wartości w pobieranych polach nie może być identyczna z kombinacją z któregokolwiek innego rekordu ze zwracanego zbioru danych. Predykat DISTINCTROW stosuje się tak samo jak klauzulę SELECT DISTINCT: SELECT DISTINCTROW AccountManagerID FROM Dim_AccountManagers
Grupowanie i agregowanie danych za pomocą klauzuli GROUP BY Klauzula GROUP BY umożliwia agregowanie rekordów ze zbioru danych na podstawie wartości kolumn. Gdy tworzysz kwerendę podsumowującą w widoku projektu, na zapleczu używana jest klauzula GROUP BY. Poniższa instrukcja SQL-a grupuje dane według pola Market i zwraca liczbę stanów dla każdego rynku: SELECT Market, Count(State) FROM Dim_Territory GROUP BY Market
Gdy używasz klauzuli GROUP BY, przed rozpoczęciem agregowania danych sprawdzana jest każda klauzula WHERE z kwerendy. Czasem jednak trzeba zastosować warunek WHERE po zakończeniu grupowania. Wtedy można zastosować klauzulę HAVING. Na przykład poniższa instrukcja SQL-a grupuje rekordy, dla których wartość pola Market to Dallas, a następnie zwraca tylko te rekordy, w których średnia wartości z pola LineItem dla grupy jest mniejsza niż 100. Grupowanie odbywa się tu przed sprawdzeniem, czy średnia wartości z pola LineItem wynosi poniżej 100. SELECT Market, Count(State) FROM Dim_Territory WHERE Market = "Dallas" GROUP BY Market HAVING Avg(LineItem) < 100
416
Część IV Analizowanie danych w Accessie
Określanie kolejności sortowania za pomocą klauzuli ORDER BY Klauzula ORDER BY umożliwia sortowanie danych na podstawie określonego pola. Domyślnie dane są sortowane rosnąco. Dlatego jeśli chcesz je posortować w ten sposób, nie musisz podawać specjalnych modyfikatorów. Poniższa instrukcja SQL-a sortuje wynikowe rekordy rosnąco według pól Last Name i First Name: SELECT AccountManagerID, [Last Name], [First Name] FROM Dim_AccountManagers ORDER BY [Last Name], [First Name]
Aby posortować dane w kolejności malejącej, trzeba zastosować słowo zastrzeżone DESC po każdej kolumnie, która ma być sortowana w ten sposób. Poniższa instrukcja SQL-a sortuje wynikowe rekordy malejąco według pola Last Name, a następnie rosnąco według pola First Name: SELECT AccountManagerID, [Last Name], [First Name] FROM Dim_AccountManagers ORDER BY [Last Name] DESC, [First Name]
Tworzenie aliasów za pomocą klauzuli AS Klauzula AS umożliwia przypisywanie aliasów do kolumn i tabel. Aliasy stosuje się zwykle z dwóch powodów: albo w celu poprawienia czytelności i skrócenia nazwy kolumny lub tabeli, albo w celu wskazania wybranego egzemplarza w przypadku używania kilku egzemplarzy tej samej tabeli. Tworzenie aliasów kolumn Poniższa instrukcja SQL-a grupuje dane według pola Market i zwraca liczbę stanów w każdym regionie. Ponadto za pomocą klauzuli AS ustawiono alias State Count dla kolumny z liczbą stanów: SELECT Market, Count(State) AS [State Count] FROM Dim_Territory GROUP BY Market HAVING Market = "Dallas"
Tworzenie aliasów dla tabel Poniższa instrukcja SQL-a przypisuje do tabeli Dim_AccountManagers alias MyTable: SELECT AccountManagerID, [Last Name], [First Name] FROM Dim_AccountManagers AS MyTable
Wyświetlanie tylko pierwszych elementów (instrukcje SELECT TOP i SELECT TOP PERCENT) Przy stosowaniu kwerendy SELECT pobierane są wszystkie rekordy zgodne z definicjami i kryteriami. Instrukcja SELECT TOP pobiera tylko pierwsze wartości i jest dla Accessa informacją, że należy przefiltrować zwracany zbiór danych i wyświetlić tylko określoną liczbę rekordów.
Rozdział 14. Podstawy SQL-a w Accessie
417
Kwerendy zwracające pierwsze wartości Aby dobrze zrozumieć, jak działa instrukcja SELECT TOP, utwórz kwerendę podsumowującą przedstawioną na rysunku 14.4. Rysunek 14.4. Utwórz tę kwerendę podsumowującą w widoku projektu. Zauważ, że wyniki są sortowane malejąco na podstawie sumy wartości z pola LineTotal
Kliknij przycisk Arkusz właściwości w zakładce NARZĘDZIA KWEREND PROJEKTOWANIE. Wyświetli się okno dialogowe Arkusz właściwości widoczne na rysunku 14.5. Aby wyświetlić to okno, możesz też wcisnąć klawisz F4 na klawiaturze. Rysunek 14.5. Zmień wartość właściwości Najwyższe wartości na 25
W oknie dialogowym Arkusz właściwości ustaw właściwość Najwyższe wartości na 25. Jak widać na rysunku 14.6, po uruchomieniu tej kwerendy zwracanych jest tylko 25 pierwszych klientów (według sumy wpływów). Aby pobrać 25 ostatnich klientów, wystarczy zmienić porządek sortowania według pola LineTotal na malejący. Access nie stosuje „dogrywek” — jeśli dla 24., 25. i 26. klienta uzyskano tę samą wartość, zwróconych zostanie 26 wierszy.
Instrukcja SELECT TOP Łatwo jest zrozumieć instrukcję SELECT TOP. Poniżej przedstawiamy kwerendę użytą do wygenerowania wyników z rysunku 14.6: SELECT TOP 25 Customer_Name, Sum(LineTotal) AS SumOfLineTotal FROM Dim_Customers INNER JOIN Dim_Transactions ON Dim_Customers.CustomerID = Dim_Transactions.CustomerID GROUP BY Customer_Name ORDER BY Sum(LineTotal) DESC
418
Część IV Analizowanie danych w Accessie
Rysunek 14.6. Gdy uruchomisz przedstawioną kwerendę, otrzymasz 25 klientów generujących najwyższe wpływy
Warto pamiętać, że nie trzeba używać wartości liczbowych lub walutowych, aby utworzyć kwerendę tego rodzaju. Poniższa instrukcja SQL-a zwraca dziesięciu managerów o najwcześniejszych datach zatrudnienia. W ten sposób można uzyskać raport o pracownikach o najdłuższym stażu: SELECT Top 10 AccountManagerID, [Last Name], [First Name] FROM Dim_AccountManagers ORDER BY HireDate ASC
Zwróć uwagę na klauzule DESC i ASC we wcześniejszych instrukcjach SQL-a. Gdy używasz instrukcji SELECT TOP, ważne jest, aby odpowiednio określić kierunek sortowania, ponieważ zależy od niego, czy kwerenda zwróci dziesięć największych, czy dziesięć najmniejszych wyników.
Instrukcja SELECT TOP PERCENT Instrukcja SELECT TOP PERCENT działa prawie dokładnie tak samo jak instrukcja SELECT TOP, ale zwraca n procent pierwszych rekordów zamiast n rekordów. Na przykład poniższa instrukcja SQL-a zwraca pierwszych 25% rekordów (pod względem wpływów): SELECT TOP 25 PERCENT Customer_Name, Sum(LineTotal) AS SumOfLineTotal FROM Dim_Customers INNER JOIN Dim_Transactions ON Dim_Customers.CustomerID = Dim_Transactions.CustomerID GROUP BY Customer_Name ORDER BY Sum(LineTotal) DESC
Warto pamiętać, że w instrukcjach SELECT TOP PERCENT procent dotyczy łącznej liczby rekordów ze sprawdzanego zbioru danych, a nie rekordów o określonej procentowo wartości w danym polu. Na przykład wcześniejsza instrukcja SQL-a nie zwraca rekordów, których wartości nie różnią się o więcej niż 25% od maksymalnej. Zamiast tego zwraca 25% wszystkich rekordów ze sprawdzanego zbioru danych. Oznacza to, że jeśli sama instrukcja SELECT zwraca 5961 rekordów, instrukcja SELECT TOP 25 PERCENT zwraca 1491 wierszy.
Rozdział 14. Podstawy SQL-a w Accessie
419
Wykonywanie kwerend funkcjonalnych za pomocą instrukcji SQL-a Może wcześniej się nad tym nie zastanawiałeś, ale gdy tworzysz kwerendę funkcjonalną, generujesz instrukcję SQL-a odpowiadającą danemu zadaniu. Tego typu instrukcje SQL-a nie ograniczają się do pobierania rekordów. Przetłumaczona kwerenda tworząca tabelę W kwerendach tworzących tabele używa się instrukcji SELECT…INTO do tworzenia zapisanej na stałe tabeli z wynikami kwerendy. Poniższa instrukcja najpierw pobiera numer, nazwisko i imię managera, a następnie tworzy nową tabelę o nazwie Employees: SELECT AccountManagerID, [Last Name], [First Name] INTO Employees FROM Dim_AccountManagers
Przetłumaczona kwerenda dołączająca W kwerendach dołączających wykorzystuje się instrukcję INSERT INTO do wstawienia nowych wierszy do określonej tabeli. Poniższy przykładowy kod wstawia do tabeli Employees nowe wiersze z tabeli Dim_AccountManagers: INSERT INTO Employees (AccountManagerID, [Last Name], [First Name]) SELECT AccountManagerID, [Last Name], [First Name] FROM Dim_AccountManagers
Przetłumaczona kwerenda aktualizująca W kwerendach aktualizujących stosuje się instrukcję UPDATE w połączeniu z modyfikatorem SET, aby zmodyfikować dane w zbiorze. Poniższa przykładowa instrukcja aktualizuje pole List_Price w tabeli Dim_Products, aby zwiększyć cenę o 10%: UPDATE Dim_Products SET List_Price = [List_Price]*1.1
Przetłumaczona kwerenda usuwająca W kwerendach usuwających stosuje się instrukcję DELETE do usuwania wierszy ze zbioru danych. W poniższej przykładowej instrukcji usuwane są wszystkie wiersze z tabeli Employees: DELETE * FROM Employees
Tworzenie kwerend krzyżowych za pomocą instrukcji TRANSFORM Instrukcja TRANSFORM pozwala utworzyć krzyżowy zbiór danych, który w zwięzły sposób wyświetla informacje. Instrukcja TRANSFORM wymaga trzech podstawowych składników:
agregowanego pola;
instrukcji SELECT, która określa zawartość wiersza w analizach krzyżowych;
pola, które określa kolumny analiz krzyżowych.
420
Część IV Analizowanie danych w Accessie
Oto składnia instrukcji TRANSFORM: TRANSFORM Aggregated_Field SELECT Field1, Field2 FROM Table1 GROUP BY Select Field1, Field2 PIVOT Pivot_Field
Poniższa instrukcja tworzy analizy krzyżowe, które wyświetlają obszar i rynek w wierszach oraz produkty w kolumnach. W komórkach przedstawione są wpływy. TRANSFORM Sum(Revenue) AS SumOfRevenue SELECT Region, Market FROM PvTblFeed GROUP BY Region, Market PIVOT Product_Description
Kwerendy charakterystyczne dla SQL-a Kwerendy tego rodzaju to kwerendy funkcjonalne, których nie da się utworzyć za pomocą siatki QBE Accessa. Kwerendy te trzeba uruchamiać albo w widoku SQL-a, albo z poziomu kodu (w makrach lub w kodzie VBA). Istnieje kilka typów kwerend charakterystycznych dla SQL-a. Każdy z nich wykonuje zadania określonego rodzaju. W tym podrozdziale znajdziesz wprowadzenie do kilku typów takich kwerend. Skoncentrowaliśmy się tu na tych, które można wykorzystać w Accessie do kształtowania i konfigurowania tabel z danymi.
Scalanie zbiorów danych za pomocą operatora UNION Operator UNION służy do scalania dwóch zgodnych ze sobą instrukcji SQL-a w celu uzyskania jednego zbioru danych przeznaczonego tylko do odczytu. Na przykład poniższa instrukcja SELECT generuje zbiór danych (zobacz rysunek 14.7) zawierający wpływy dla regionów i rynków: SELECT Region, Market, Sum(Revenue) AS [Sales] FROM PvTblFeed GROUP BY Region, Market
Rysunek 14.7. Ten zbiór danych zawiera wpływy dla regionów i rynków
Rozdział 14. Podstawy SQL-a w Accessie
421
Druga instrukcja SELECT generuje odrębny zbiór danych (zobacz rysunek 14.8), który zawiera łączne wpływy dla regionów: SELECT Region, "Total" AS [Market], Sum(Revenue) AS [Sales] FROM PvTblFeed GROUP BY Region
Rysunek 14.8. Ten zbiór danych zawiera łączne wpływy dla regionów
Chodzi o to, aby połączyć oba zbiory danych i utworzyć analizy, które w jednej tabeli będą obejmowały szczegółowe i sumaryczne dane. Operator UNION to doskonałe narzędzie do realizacji tego zadania, ponieważ służy do scalania wyników dwóch instrukcji SELECT. Aby zastosować operator UNION, utwórz nową kwerendę w widoku SQL-a i wprowadź następujący kod: SELECT Region, Market, Sum(Revenue) AS [Sales] FROM PvTblFeed GROUP BY Region, Market UNION SELECT Region, "Total" AS [Market], Sum(Revenue) AS [Sales] FROM PvTblFeed GROUP BY Region
Jak widać, powyższa instrukcja to tylko dwie instrukcje SQL-a połączone ze sobą operatorem UNION. Gdy połączy się obie instrukcje (zobacz rysunek 14.9), zwrócony zostanie zbiór danych zawierający szczegółowe i sumaryczne dane w jednej tabeli. Rysunek 14.9. Dwa zbiory danych połączono, aby utworzyć raport z sumarycznymi i szczegółowymi danymi
Przy wykonywaniu kwerend z instrukcją UNION Access dopasowuje kolumny z obu zbiorów danych na podstawie ich pozycji w instrukcjach SELECT. Oznacza to dwie rzeczy: w obu instrukcjach SELECT liczba kolumn musi być taka sama, a kolumny w obu instrukcjach zwykle powinny występować w tej samej kolejności.
422
Część IV Analizowanie danych w Accessie Warto zauważyć, że operator UNION wykonuje operację SELECT DISTINCT na wynikowych zbiorach danych. Oznacza to, że instrukcja UNION może wyeliminować powtarzające się wiersze, jeśli w obu zbiorach danych we wszystkich polach zawierają one te same wartości. Jeżeli zauważysz, że kwerenda z instrukcją UNION prowadzi do niepożądanej utraty rekordów, pomyśl o zastosowaniu operatora UNION ALL. Działa ona tak samo jak instrukcja UNION, ale nie wykonuje operacji SELECT DISTINCT, dlatego nie usuwa powtarzających się wierszy.
Tworzenie tabeli za pomocą instrukcji CREATE TABLE W procesie analitycznym często trzeba utworzyć tabelę tymczasową. Jest ona potrzebna do grupowania danych, do manipulowania nimi lub po prostu do ich przechowywania. Dzięki instrukcji CRATE TABLE tabelę można utworzyć w jednej kwerendzie charakterystycznej dla SQL-a. Instrukcja CREATE TABLE (w odróżnieniu od kwerend tworzących tabele) tworzy tylko strukturę, czyli schemat tabeli. Instrukcja ta nigdy nie zwraca rekordów. Pozwala natomiast utworzyć pustą tabelę w dowolnym miejscu procesu analitycznego. Oto podstawowa składnia instrukcji CREATE TABLE: CREATE TABLE TableName ( Type(), Type())
Aby zastosować instrukcję CREATE TABLE, utwórz nową kwerendę w widoku SQL-a, a następnie zdefiniuj strukturę tabeli. Poniższy przykładowy kod tworzy nową tabelę TempLog o trzech polach. Pierwszym z nich jest pole typu Text przyjmujące do 50 znaków, drugim — pole typu Text przyjmujące do 255 znaków, a trzecim — pole typu Date. CREATE TABLE TempLog ([User] Text(50), [Description] Text, [LogDate] Date)
Zauważ, że w kodzie nie określono wielkości drugiej kolumny tekstowej. Jeśli pominiesz wielkość pola, Access wykorzysta domyślny rozmiar określony dla bazy danych.
Manipulowanie kolumnami za pomocą instrukcji ALTER TABLE Instrukcja ALTER TABLE zapewnia dodatkowe sposoby modyfikowania na zapleczu struktury tabeli. Dostępnych jest kilka klauzul, które można wykorzystać w instrukcji ALTER TABLE. Cztery z nich są przydatne w analizach danych w Accessie. Oto te klauzule: ADD, ALTER COLUMN, DROP COLUMN i ADD CONSTRAINT. Instrukcja ALTER TABLE wraz z różnymi klauzulami jest stosowana znacznie rzadziej niż instrukcje SQL-a wymienione we wcześniejszej części rozdziału. Jest jednak przydatna, gdy w ramach procesu analitycznego trzeba zmienić strukturę tabel, ponieważ pomaga uniknąć ręcznych manipulacji. Warto zauważyć, że nie można cofnąć operacji wykonanych za pomocą instrukcji ALTER TABLE. Dlatego należy stosować ją z zachowaniem odpowiedniej ostrożności.
Rozdział 14. Podstawy SQL-a w Accessie
423
Dodawanie kolumn za pomocą klauzuli ADD Jak wskazuje jej nazwa, klauzula ADD umożliwia dodanie kolumny do istniejącej tabeli. Oto podstawowa składnia tej instrukcji: ALTER TABLE ADD Type()
Aby zastosować instrukcję ADD, wystarczy utworzyć nową kwerendę w widoku SQL-a i zdefiniować strukturę nowej kolumny. Na przykład uruchomienie przykładowej poniższej instrukcji spowoduje utworzenie nowej kolumny SupervisorPhone i dodanie jej do tabeli TempLog: ALTER TABLE TempLog ADD SupervisorPhone Text(10)
Modyfikowanie kolumn za pomocą klauzuli ALTER COLUMN Przy stosowaniu klauzuli ALTER COLUMN należy określić istniejącą kolumnę z istniejącej tabeli. Klauzula ta służy przede wszystkim do zmieniania typu danych i wielkości kolumn. Oto podstawowa składnia klauzuli: ALTER TABLE ALTER COLUMN Type()
Aby zastosować instrukcję ALTER COLUMN, utwórz nową kwerendę w widoku SQL-a i zdefiniuj zmiany dla danej kolumny. Na przykład poniższa instrukcja zmienia wielkość pola SupervisorPhone: ALTER TABLE TempLog ALTER COLUMN SupervisorPhone Text(13)
Usuwanie kolumn za pomocą klauzuli DROP COLUMN Klauzula DROP COLUMN umożliwia usunięcie danej kolumny z istniejącej tabeli. Oto podstawowa składnia tej klauzuli: ALTER TABLE DROP COLUMN
Aby zastosować klauzulę DROP COLUMN, należy utworzyć nową kwerendę w widoku SQL-a, a następnie wskazać usuwaną kolumnę. Uruchomienie poniższej przykładowej instrukcji spowoduje usunięcie kolumny SupervisorPhone z tabeli TempLog: ALTER TABLE TempLog DROP COLUMN SupervisorPhone
Dynamiczne dodawanie kluczy głównych za pomocą klauzuli ADD CONSTRAINT Dla wielu analityków Access jest łatwym narzędziem do pobierania, przekształcania i wczytywania danych. Umożliwia pobieranie danych z wielu różnych źródeł i późniejsze zmienianie formatu informacji oraz umieszczanie ich w skonsolidowanych tabelach. Liczni analitycy automatyzują proces pobierania, przekształcania i wczytywania danych. Stosują do tego makra uruchamiające serie kwerend. W większości sytuacji technika ta sprawdza się całkiem dobrze.
424
Część IV Analizowanie danych w Accessie
Jednak w niektórych sytuacjach proces pobierania, przekształcania i wczytywania wymaga dodania kluczy głównych do tymczasowej tabeli, aby dane w trakcie przetwarzania zachowały znormalizowaną postać. Wtedy większość użytkowników stosuje jedno z dwóch rozwiązań: zatrzymuje makro w trakcie działania i ręcznie dodaje potrzebne klucze główne lub tworzy trwałą tabelę wyłącznie w celu przechowywania tabeli z ustawionymi kluczami głównymi. Istnieje jednak także trzecia możliwość: za pomocą klauzuli ADD CONSTRAINT można dynamicznie tworzyć klucze główne. Oto podstawowa składnia tej klauzuli: ADD CONSTRAINT CONSTRAINTNAME PRIMARY KEY () ALTER TABLE
Aby zastosować klauzulę ADD CONSTRAINT, utwórz nową kwerendę w widoku SQL-a i zdefiniuj nowy klucz główny. Na przykład poniższa instrukcja dodaje złożony klucz oparty na trzech polach z tabeli TempLog: ALTER TABLE TempLog ADD CONSTRAINT CONSTRAINTNAME PRIMARY KEY (ID, Name, Email)
Tworzenie kwerend przekazujących Kwerenda przekazująca przesyła polecenia SQL-a bezpośrednio do serwera bazy danych (np. systemu SQL Server, Oracle itd.). Często serwery te są używane jako zaplecze systemu, natomiast Access pełni wtedy funkcję klienta lub frontonu. Polecenia należy przesyłać za pomocą składni odpowiedniej dla danego serwera. Zaletą kwerend przekazujących jest to, że parsowanie i przetwarzanie odbywa się wtedy na serwerze zaplecza, a nie w Accessie. Dzięki temu kwerendy działają znacznie szybciej niż przy pobieraniu danych z dołączonych tabel (zwłaszcza gdy dołączona tabel jest bardzo duża). Oto kroki potrzebne do utworzenia kwerendy przekazującej: 1. Kliknij przycisk Projekt kwerendy w zakładce TWORZENIE na wstążce. 2. Zamknij okno dialogowe Pokazywanie tabeli. 3. Kliknij przycisk Przekazująca na zakładce NARZĘDZIA KWEREND PROJEKTOWANIE. Pojawi się okno z kodem SQL-a. 4. Wpisz instrukcję SQL-a dostosowaną do docelowego systemu bazy danych. Prostą instrukcję SQL-a przedstawia rysunek 14.10. Rysunek 14.10. Aby utworzyć kwerendę przekazującą, musisz otworzyć okno z kodem w SQL-u
5. Kliknij przycisk Arkusz właściwości na zakładce NARZĘDZIA KWEREND PROJEKTOWANIE. Pojawi się okno dialogowe Arkusz właściwości widoczne na rysunku 14.11.
Rozdział 14. Podstawy SQL-a w Accessie
425
Rysunek 14.11. W oknie dialogowym Arkusz właściwości kwerendy trzeba określić łańcuch znaków połączenia zgodny z modelem ODBC
6. Wpisz łańcuch znaków połączenia odpowiedni dla używanego serwera. Zwykle jest to zgodny z modelem ODBC łańcuch znaków połączenia standardowo używany do nawiązywania połączenia z serwerem. 7. Kliknij przycisk Uruchom. Przy stosowaniu kwerend przekazujących trzeba pamiętać o kilku kwestiach:
Instrukcje SQL-a należy zbudować samodzielnie. Access w tym nie pomaga — nie można wykorzystać siatki QBE.
Jeśli łańcuch znaków połączenia się zmieni, trzeba będzie ponownie otworzyć właściwości kwerendy przekazującej i zmodyfikować właściwość z łańcuchem znaków połączenia ODBC. Jeżeli używasz nazwy istniejącego źródła danych, możesz też zmienić jego konfigurację.
Wyniki otrzymane z kwerendy przekazującej są dostępne tylko do odczytu. Zwróconych rekordów nie można aktualizować ani modyfikować.
Można pisać wyłącznie kwerendy pobierające dane. Kwerendy aktualizujące, dołączające, usuwając i tworzące tabele są niedozwolone.
Ponieważ instrukcje SQL-a wysyłane na serwer są zapisane na stałe, nie można stosować dynamicznych parametrów (takich jak w kwerendach z parametrami), ponieważ nie można ich przekazać na serwer po przesłaniu instrukcji SQL-a.
426
Część IV Analizowanie danych w Accessie
Rozdział 15.
Podkwerendy i funkcje agregujące domeny W tym rozdziale:
Rozbudowywanie analiz za pomocą podkwerend
Stosowanie funkcji agregujących domeny
Często analizy trzeba przeprowadzać na różnych poziomach. Na każdym poziomie używane są dane z wcześniejszego poziomu. Wbudowywanie poziomów w procesie analitycznym jest bardzo często stosowaną techniką. Na przykład gdy tworzysz kwerendę używającą innej kwerendy jako źródła danych, budujesz analizy wielopoziomowe. Gdy rozwijasz kwerendę opartą na tabeli tymczasowej generowanej przez kwerendę tworzącą tabelę, także korzystasz z wielopoziomowych analiz. Wszystkie standardowe techniki tworzenia analiz wielopoziomowych mają dwie wspólne cechy:
Powodują dodanie etapu do procesu analitycznego. Każda kwerenda, którą trzeba uruchomić, aby wykonać inną kwerendę (a nawet każda tabela tymczasowa potrzebna do przeprowadzenia analiz), oznacza konieczność wykonania innego zadania przed uzyskaniem ostatecznych wyników.
Wszystkie takie techniki wymagają tworzenia tabel tymczasowych lub kwerend pomocniczych, co powoduje umieszczanie w bazie danych tabel i kwerend, które mogą utrudniać zrozumienie procesu analitycznego. Prowadzi to też do szybkiego rozrastania się bazy danych. W takich sytuacjach przydatne mogą być podkwerendy i funkcje agregujące domeny.
Podkwerendy i funkcje agregujące domeny umożliwiają dodawanie poziomów do analiz w ramach jednej kwerendy. Dzięki temu nie trzeba stosować tabel tymczasowych ani kwerend pomocniczych. Podkwerendy i funkcje agregujące domeny wymagają znajomości SQL-a. Większość początkujących użytkowników Accessa nie posiada takiej wiedzy. Jeśli też należysz do tej grupy, na razie wstrzymaj się z dalszą lekturą tego rozdziału i zapoznaj się z rozdziałem 14. Znajdziesz w nim wprowadzenie do SQL-a wystarczające do tego, by móc przejść do dalszej części niniejszego rozdziału.
428
Część IV Analizowanie danych w Accessie
Wyjściową bazę danych do tego rozdziału, Rozdział15.accdb, można pobrać z witryny poświęconej tej książce.
Wzbogacanie analiz za pomocą podkwerend Podkwerendy to kwerendy pobierające zagnieżdżone w innych kwerendach. Głównym zadaniem podkwerend jest umożliwienie wykorzystania wyników jednej kwerendy w innej kwerendzie. W podkwerendach można pobierać odpowiedzi na wieloaspektowe pytania, określać dalsze kryteria pobierania danych i definiować nowe pola potrzebne w analizach. W kwerendzie widocznej na rysunku 15.1 pokazano, jak wykorzystać podkwerendę w siatce QBE. W trakcie analizowania tej kwerendy pamiętaj, że jest to tylko jeden przykład ilustrujący stosowanie podkwerend. Nie trzeba ich używać jako kryteriów.
Rysunek 15.1. Aby zastosować podkwerendę w widoku projektu, wystarczy wprowadzić instrukcję SQL-a
Jeśli w trakcie tworzenia kwerendy z rysunku 15.1 przełączysz się do widoku SQL-a, zobaczysz instrukcję SQL-a podobną do poniższej. Czy potrafisz znaleźć w niej podkwerendę? Poszukaj drugiej instrukcji SELECT. SELECT CustomerID, Sum(LineTotal) AS SumOfLineTotal FROM Dim_Transactions WHERE CustomerID IN (SELECT [CustomerID] FROM [Dim_Customers] WHERE [State] = "CA") GROUP BY CustomerID
Podkwerendy zawsze należy umieszczać w nawiasach.
Podkwerendy działają w ten sposób, że są wykonywane na początku, a wyniki są używane w zewnętrznej kwerendzie (w której podkwerenda jest zagnieżdżona), gdzie mogą pełnić funkcję kryterium, wyrażenia, parametru itd. W przykładzie widocznym na ry-
Rozdział 15. Podkwerendy i funkcje agregujące domeny
429
sunku 15.1 podkwerenda najpierw zwraca listę oddziałów powiązanych z rynkiem Dallas. Następnie kwerenda zewnętrzna wykorzystuje tę listę jako kryterium, aby odfiltrować pracowników, którzy nie są powiązani z tym rynkiem.
Po co stosować podkwerendy? Podkwerendy często działają wolniej niż standardowe kwerendy wykorzystujące sprzężenie. Wynika to z tego, że są wykonywane dla całego zbioru danych lub są uruchamiane wielokrotnie (jeden raz dla każdego wiersza przetwarzanego przez kwerendę zewnętrzną. Dlatego działają powoli, zwłaszcza dla dużych zbiorów danych. Po co więc je stosować? W wielu analizach potrzebne są wieloetapowe procesy, w których wykorzystuje się tabele tymczasowe lub kwerendy pomocnicze. Choć tabele i kwerendy tymczasowe same w sobie nie są niczym złym, to jeśli w procesie analitycznym jest ich za dużo, mogą utrudniać jego zrozumienie, a także prowadzić do nadmiernego rozrastania się bazy danych. Mimo że stosowanie podkwerend związane jest ze spadkiem wydajności, może to być akceptowalna cena za usprawnienie procedur i zoptymalizowanie procesu analitycznego. Gdy przyzwyczaisz się do pisania własnych instrukcji w SQL-u, zauważysz, że stosowanie podkwerend w kwerendach wykonywanych „w locie” pozwala zaoszczędzić czas.
Podstawowe zasady dotyczące podkwerend Jest kilka reguł i ograniczeń, o których należy pamiętać przy stosowaniu podkwerend: W łańcuchu znaków z instrukcją SQL-a podkwerendy musi się znajdować przynajmniej jedna instrukcja SELECT i jedna klauzula FROM. Podkwerendę należy umieścić w nawiasach. Teoretycznie w kwerendzie można zagnieździć do 31 podkwerend. Liczba ta jest jednak zależna od pamięci dostępnej w systemie i złożoności podkwerend. W podkwerendzie można zastosować klauzulę ORDER BY, jednak tylko wtedy, gdy podkwerenda jest instrukcją SELECT TOP lub SELECT TOP PERCENT. W podkwerendzie zawierającej klauzulę GROUP BY nie można używać słowa kluczowego DISTINCT.
Jeśli dana tabela jest używana zarówno w kwerendzie zewnętrznej, jak i w podkwerendzie, trzeba zastosować aliasy dla nazwy tej tabeli.
Tworzenie podkwerend bez pisania instrukcji SQL-a Możliwe, że nie chcesz stosować podkwerend, ponieważ nie lubisz pisać własnych instrukcji SQL-a. Rzeczywiście, pisanie licznych instrukcji SQL-a w celu wykonania drobnych analiz może się wydawać przesadą.
430
Część IV Analizowanie danych w Accessie
Załóżmy, że poproszono Cię o określenie liczby managerów, którzy mają dłuższy staż niż przeciętny manager. Wydaje się to stosunkowo łatwe — i rzeczywiście jest, jeśli zastosować podkwerendę. Od czego jednak zacząć? Można napisać instrukcję SQL-a w widoku SQL-a i ją uruchomić. Jednak niewielu użytkowników Accessa tworzy instrukcje SQL-a od podstaw. Pomysłowi użytkownicy wykorzystują wbudowane możliwości Accessa, aby zaoszczędzić czas i uniknąć problemów. Sztuczka polega na podziale analiz na dwie prostsze części: 1. Ustal średni staż pracy dla wszystkich managerów, tworząc kwerendę przedstawioną na rysunku 15.2. Rysunek 15.2. Utwórz kwerendę, aby ustalić średni staż pracy wszystkich managerów
2. Przełącz się do widoku SQL-a (zobacz rysunek 15.3) i skopiuj instrukcję SQL-a. Rysunek 15.3. Przełącz się do widoku SQL-a i skopiuj instrukcję SQL-a
3. Utwórz kwerendę, która określa liczbę managerów dla określonej długości stażu pracy. Kwerenda ta została przedstawiona na rysunku 15.4. Rysunek 15.4. Utwórz kwerendę zliczającą pracowników dla określonej długości stażu pracy
Rozdział 15. Podkwerendy i funkcje agregujące domeny
431
4. Kliknij prawym przyciskiem myszy w wierszu Kryteria dla pola TIS_in_Months i wybierz opcję Powiększ. Pojawi się okno dialogowe Powiększenie (zobacz rysunek 15.5). Pomaga ono wygodnie pracować z tekstem, który jest zbyt długi, aby można go było wygodnie wyświetlić w siatce QBE. Rysunek 15.5. Wklej pierwszą skopiowaną instrukcję SQL-a do wiersza Kryteria dla pola TIS_in_Months
5. Po otwarciu okna dialogowego Powiększenie wklej w białym obszarze wprowadzania skopiowaną wcześniej instrukcję SQL-a. Pamiętaj, że podkwerendy muszą się znajdować w nawiasach. Dlatego umieść wklejoną instrukcję SQL-a w nawiasach. Usuń też wszystkie znaki powrotu karetki automatycznie dodane przez Accessa.
6. Dokończ kwerendę — wpisz znak większości (>) przed podkwerendą i dla pola TIS_in_Months zmień wartość Grupuj według na Gdzie. Na tym etapie kwerenda powinna wyglądać tak jak na rysunku 15.6.
Rysunek 15.6. Gdy uruchomisz tę kwerendę, dowiesz się, że 12 managerów pracuje dłużej niż wynosi średnia stażu pracy
Jeśli teraz otworzysz kwerendę z rysunku 15.6 w widoku SQL-a, zobaczysz następującą instrukcję SQL-a:
432
Część IV Analizowanie danych w Accessie SELECT Count(AccountManagerID) AS MyCount FROM Dim_AccountManagers WHERE (((DateDiff("m",[HireDate],Date())) >(SELECT Avg(DateDiff("m",[HireDate],Date())) AS Avg_TIS_in_Months FROM Dim_ AccountManagers;)));
Dobre jest to, że nie musiałeś wpisywać tego kodu. Wystarczyło wykorzystać wiedzę na temat Accessa, aby połączyć operacje potrzebne do uzyskania odpowiedzi. Gdy lepiej poznasz SQL-a, nauczysz się łatwo ręcznie tworzyć podkwerendy.
Używanie operatorów IN i NOT IN w podkwerendach Operatory IN i NOT IN umożliwiają uruchamianie dwóch kwerend w ramach jednej. Podkwerenda jest uruchamiana jako pierwsza, a następnie wynikowy zbiór danych jest używany przez kwerendę zewnętrzną do przefiltrowania ostatecznych danych wyjściowych. W przykładzie przedstawionym na rysunku 15.7 najpierw uruchamiana jest podkwerenda, która pobiera wszystkich klientów z Kalifornii. Następnie zewnętrzna kwerenda używa wynikowego zbioru danych jako kryterium i zwraca sumę wartości z wierszy LineTotal tylko dla klientów o numerach zwróconych w podkwerendzie. Rysunek 15.7. W tej kwerendzie zastosowano operator IN i podkwerendę, dzięki czemu można jednocześnie wykonać dwie kwerendy
Operator NOT IN działa w odwrotny sposób. Zwraca sumę wartości z wierszy LineTotal dla tych klientów, których numery nie pasują do tych zwróconych przez podkwerendę.
Używanie podkwerend z operatorami porównania Jak ich nazwa wskazuje, operatory porównania (=, <, >, <=, >=, <> itd.) porównują dwa elementy i zwracają wartość True lub False. Zastosowanie operatora porównania do podkwerendy oznacza, że Access powinien porównać wynikowy zbiór danych kwerendy zewnętrznej z wynikowym zbiorem danych podkwerendy. Na przykład aby zwrócić wszystkich klientów, którzy dokonali zakupu na kwotę wyższą od średniej, można wykonać kwerendę przedstawioną na rysunku 15.8.
Rozdział 15. Podkwerendy i funkcje agregujące domeny
433
Rysunek 15.8. Można zastosować operatory porównania, aby porównać wynikowy zbiór danych kwerendy zewnętrznej z wynikami podkwerendy
Podkwerenda jest uruchamiana jako pierwsza i zwraca średni poziom zakupów dla wszystkich klientów. Jest to pojedyncza wartość, którą Access porównuje z wynikowym zbiorem danych kwerendy zewnętrznej. Oznacza to, że maksymalna wartość zakupu każdego klienta jest porównywana ze średnią. Jeśli jest wyższa, zostaje dodana do ostatecznych danych wyjściowych. W przeciwnym razie zostaje pominięta. Podkwerenda używana razem z operatorem porównania musi zwracać pojedynczą wartość.
Stosowanie podkwerend jako wyrażeń W każdym z dotychczasowych przykładów podkwerendy były używane razem z klauzulą WHERE. Wyniki podkwerendy pełniły więc funkcję kryterium dla kwerendy zewnętrznej. Jednak podkwerendę można też wykorzystać jako wyrażenie, przy czym podkwerenda musi wtedy zwracać pojedynczą wartość. W kwerendzie przedstawionej na rysunku 15.9 pokazano, jak zastosować podkwerendę jako wyrażenie w obliczeniach.
Rysunek 15.9. Podkwerenda jest używana jako wyrażenie w obliczeniach
W tym przykładzie podkwerendę wykorzystano do określenia średniej liczby produktów sprzedanych przez wszystkie oddziały firmy. Podkwerenda ta zwraca jedną wartość. Jest ona używana w obliczeniach do ustalenia różnicy między liczbą produktów sprzedanych na poszczególnych rynkach a średnią ogólną. Wyniki zwracane przez tę kwerendę przedstawia rysunek 15.10.
434
Część IV Analizowanie danych w Accessie
Rysunek 15.10. Wyniki kwerendy
Stosowanie podkwerend skorelowanych Kwerenda skorelowana to podkwerenda dotycząca kolumny używanej także w kwerendzie zewnętrznej. Wyjątkową cechą podkwerend skorelowanych jest to, że (w odróżnieniu od standardowych podkwerend, które trzeba uruchomić tylko raz, aby uzyskać wynik) są uruchamiane raz dla każdego wiersza przetwarzanego przez kwerendę zewnętrzną. Aby to zrozumieć, warto przyjrzeć się dwóm opisanym dalej instrukcjom SQL-a. Podkwerendy nieskorelowane Ta instrukcja SQL-a zawiera podkwerendę nieskorelowaną. Skąd o tym wiadomo? Otóż podkwerenda ta nie dotyczy żadnej kolumny z kwerendy zewnętrznej. Jest wykonywana jeden raz i zwraca średnie wpływy dla rekordów z całego zbioru danych. SELECT MainSummary.Branch_Number, (SELECT Avg(Revenue)FROM MainSummary) FROM MainSummary
Podkwerendy skorelowane W tej instrukcji SQL-a wykorzystano podkwerendę skorelowaną. W podkwerendzie tej użyto kolumny Branch_Number z kwerendy zewnętrznej, dlatego podkwerendę trzeba uruchomić dla każdego wiersza przetwarzanego w kwerendzie zewnętrznej. Ostateczny wynik zwracany przez tę kwerendę to zbiór danych ze średnią wartością wpływów dla każdego oddziału firmy. Na rysunku 15.11 pokazano, jak ta instrukcja SQL-a wygląda w widoku projektu. SELECT MainSummary.Branch_Number, (SELECT Avg(Revenue)FROM MainSummary AS M2 WHERE M2.Branch_Number = MainSummary.Branch_Number) AS AvgByBranch FROM MainSummary GROUP BY MainSummary.Branch_Number
Rysunek 15.11. Podkwerenda skorelowana
Rozdział 15. Podkwerendy i funkcje agregujące domeny
435
Stosowanie aliasów w podkwerendach skorelowanych Warto zauważyć, że w podkwerendzie skorelowanej zastosowano klauzulę AS do utworzenia aliasu T2 dla tabeli. Wynika to z tego, że w podkwerendzie i kwerendzie zewnętrznej używana jest ta sama tabela. Dzięki utworzeniu aliasu dla jednego z jej wystąpień można precyzyjnie poinformować Accessa, która tabela jest używana w instrukcji SQL-a. Choć alias w tej instrukcji jest tworzony dla podkwerendy, równie dobrze można przypisać alias do tabeli z kwerendy zewnętrznej. Warto zauważyć, że nazwa T1 nie ma żadnego konkretnego znaczenia. Można zastosować tu dowolny łańcuch znaków, o ile alias razem z nazwą kolumny nie mają łącznie więcej niż 255 znaków. Aby utworzyć alias dla tabeli w widoku projektu, wystarczy kliknąć prawym przyciskiem myszy listę pól i wybrać opcję Właściwości, co pokazano na poniższym rysunku.
Następnie wystarczy przypisać do właściwości Alias dowolne określenie (zobacz poniższy rysunek). O wprowadzeniu aliasu informuje lista pól, gdzie zamiast dawnej nazwy pojawia się alias.
Używanie podkwerendy skorelowanej jako wyrażenia W przykładzie przedstawionym na rysunku 15.9 wykorzystano podkwerendę nieskorelowaną do ustalenia różnicy między średnią liczbą jednostek sprzedanych na każdym rynku a średnią liczbą jednostek sprzedaną przez wszystkie oddziały firmy. Tę samą technikę można zastosować do podkwerend skorelowanych. W kwerendzie przedstawionej na rysunku 15.12 powiązanie z numerami poszczególnych oddziałów pozwala ustalić różnicę między rocznymi wpływami uzyskanymi przez każdego pracownika a średnimi wpływami w oddziale zatrudniającym tę osobę.
436
Część IV Analizowanie danych w Accessie
Rysunek 15.12. Podkwerendę skorelowaną można wykorzystać jako część wyrażenia
Używanie podkwerend w kwerendach funkcjonalnych Podkwerendy można stosować w kwerendach funkcjonalnych równie łatwo jak w kwerendach wybierających. Oto kilka przykładów ilustrujących, jak stosować podkwerendy w kwerendach funkcjonalnych. Podkwerendy w kwerendach tworzących tabele W tym przykładzie pokazano, jak zastosować podkwerendę w kwerendzie tworzącej tabelę: SELECT E1.Employee_Number, E1.Last_Name, E1.First_Name INTO OldSchoolEmployees FROM Employee_Master as E1 WHERE E1.Employee_Number IN (SELECT E2.Employee_Number FROM Employee_Master AS E2 WHERE E2.Hire_Date <#1/1/1995#)
Podkwerendy w kwerendach dołączających W tym przykładzie podkwerendę wykorzystano w kwerendzie dołączającej: INSERT INTO CustomerMaster (Customer_Number, Customer_Name, State ) SELECT CompanyNumber,CompanyName,State FROM LeadList WHERE CompanyNumber Not In (SELECT Customer_Number from CustomerMaster)
Podkwerendy w kwerendach aktualizujących W tym przykładzie zastosowano podkwerendę w kwerendzie aktualizującej: UPDATE PriceMaster SET Price = [Price]*1.1 WHERE Branch_Number In (SELECT Branch_Number from LocationMaster WHERE Region = "South")
Podkwerendy w kwerendach usuwających W tym przykładzie podkwerendę wykorzystano w kwerendzie usuwającej: DELETE * FROM LeadList WHERE CompanyNumber In (SELECT Customer_Number from CustomerMaster)
Rozdział 15. Podkwerendy i funkcje agregujące domeny
437
Jak za pomocą jednej kwerendy pobrać rekordy z drugiego kwartyla ze zbioru danych? Można łatwo uzyskać drugi kwartyl ze zbioru danych, używając podkwerendy pobierającej największe wartości: 1. Utwórz kwerendę pobierającą 25% największych rekordów ze zbioru danych. Aby utworzyć taką kwerendę, kliknij prawym przyciskiem myszy szary obszar nad białą siatką QBE i wybierz opcję Właściwości. W oknie dialogowym Arkusz właściwości zmień ustawienie właściwości Najwyższe wartości w taki sposób, aby zwracanych było N najwyższych wartości, co pokazano na poniższym rysunku (tu pobieranych jest 25% najwyższych wartości).
2. Przełącz się do widoku SQL-a (zobacz następny rysunek) i skopiuj łańcuch znaków z kodem SQL-a.
3. Przełącz się ponownie do widoku projektu i wklej skopiowaną instrukcję SQL-a w wierszu Kryteria pola Branch_Number. W tym celu kliknij prawym przyciskiem myszy w wierszu Kryteria pola Branch_Number i wybierz opcję Powiększ. Następnie w oknie dialogowym Powiększenie wklej skopiowaną instrukcję SQL-a, co pokazano na poniższym rysunku.
438
Część IV Analizowanie danych w Accessie
4. Następny krok jest nieco skomplikowany. We wklejonej instrukcji SQL-a trzeba wprowadzić pewne zmiany, aby działała poprawnie:
Ponieważ wklejona podkwerenda jest kryterium dla pola Branch_Number, w instrukcji SQL-a należy pobierać tylko pole Branch_Number. Dlatego można usunąć człon , Sum(MainSummary.Revenue).
Należy usunąć wszystkie znaki powrotu karetki.
Należy umieścić nawiasy wokół podkwerendy i dodać operator NOT IN przed całą instrukcją.
Na tym etapie okno dialogowe Powiększenie powinno wyglądać tak jak na poniższym rysunku.
5. Przełącz się do widoku projektu. Jeśli wszystko przebiegło prawidłowo, kwerenda powinna wyglądać podobnie jak na poniższym rysunku.
To już wszystko. Gdy uruchomisz tę kwerendę, otrzymasz drugi kwartyl ze zbioru danych. Aby otrzymać trzeci kwartyl, zastąp człon TOP 25 PERCENT w podkwerendzie fragmentem TOP 50 PERCENT, a w celu uzyskania czwartego kwartyla użyj wyrażenia TOP 75 PERCENT. Koniecznie zajrzyj do przykładowego pliku z kodem do tego rozdziału, aby zapoznać się z gotowymi kwerendami.
Funkcje agregujące domeny Funkcje agregujące domeny umożliwiają pobieranie i agregowanie informacji statystycznych z całego zbioru danych (z domeny). Funkcje te różnią się od kwerend podsumowujących, ponieważ te ostatnie grupują dane przed określaniem wartości, natomiast funkcje agregujące domeny obliczają wartości dla całego zbioru danych. Tak więc funkcje
Rozdział 15. Podkwerendy i funkcje agregujące domeny
439
agregujące domeny nigdy nie zwracają więcej niż jednej wartości. Aby dobrze zrozumieć różnicę między kwerendami podsumowującymi a funkcjami agregującymi domeny, utwórz kwerendę przedstawioną na rysunku 15.13. Rysunek 15.13. W tej kwerendzie pokazano różnicę między kwerendami podsumowującymi a funkcjami agregującymi domeny
Gdy uruchomisz tę kwerendę, otrzymasz wyniki przedstawione na rysunku 15.14. Warto zauważyć, że kolumna Aggregate Sum zawiera inną wartość łączną dla każdego roku, natomiast w kolumnie Domain Sum (obliczanej za pomocą funkcji agregującej domeny) znajduje się tylko jedna suma — dla całego zbioru danych. Rysunek 15.14. Wyraźnie widać różnicę między kwerendą podsumowującą a funkcją agregującą domeny Struktura funkcji agregujących domeny Istnieje 12 różnych funkcji agregujących domeny, jednak struktura każdej z nich jest taka sama: NazwaFunkcji("[Nazwa pola]";"[Nazwa zbioru danych]";"[Kryteria]")
NazwaFunkcji — jest to nazwa używanej funkcji agregującej domeny.
Nazwa pola (wymagana) — to wyrażenie określa pole zawierające przetwarzane dane.
Nazwa zbioru danych (wymagana) — to wyrażenie określa tabelę lub kwerendę zawierającą przetwarzane dane (to właśnie jest domena).
Kryteria (opcjonalne) — to wyrażenie służy do ograniczania zakresu danych, dla których wykonywana jest funkcja agregująca domeny. Jeśli nie określono kryteriów, funkcja agregująca domeny działa dla całego zbioru danych.
Funkcji agregujących domeny nie można używać razem z kwerendami z parametrami.
Choć w przykładach z tego rozdziału funkcje agregujące domeny są używane w wyrażeniach w kwerendach, warto pamiętać, że funkcje te można stosować także w makrach, modułach i obliczanych formantach w formularzach i raportach.
440
Część IV Analizowanie danych w Accessie
Różne funkcje agregujące domeny W Accessie istnieje 12 różnych funkcji agregujących domeny. Każda z nich wykonuje inne operacje. W tym punkcie opisaliśmy przeznaczenie każdej z tych funkcji. DSum Zwraca sumę wartości z określonego pola z domeny. Na przykład wywołanie DSum("[Line Total]"; "[Dim_Transactions]") zwraca sumę wartości z pola LineTotal z tabeli Dim_Transactions. DAvg Zwraca średnią wartości z określonego pola z domeny. Na przykład wywołanie Davg ("[LineTotal]"; "[Dim_Transactions]") zwraca średnią wartości z pola LineTotal z tabeli Dim_Transactions. DCount Zwraca łączną liczbę rekordów z domeny. Na przykład wywołanie DCount("*"; "[Dim_ Transactions]") zwraca liczbę rekordów w tabeli Dim_Transactions. DLookup Zwraca pierwszą wartość z określonego pola pasującą do zdefiniowanych w funkcji kryteriów. Jeśli nie podasz kryteriów, funkcja DLookup zwróci losową wartość z domeny. Na przykład wywołanie DLookUp("[Last_Name]";"[Employee_Master]";"[Employee_ Number]='42620' ") zwraca wartość pola Last_Name z rekordu, w którym pole Employee_ Number ma wartość 42620. DMin i DMax Zwracają minimalną oraz maksymalną wartość z domeny. Wywołanie DMin("[LineTotal] ";"[Dim_Transactions]") zwraca najmniejszą wartość pola LineTotal z tabeli Dim_Transactions, natomiast wywołanie DMax("[LineTotal]";"[Dim_Transactions]") zwraca największą wartość z tego pola.
DFirst i DLast Zwracają pierwszą oraz ostatnią wartość z domeny. Wywołanie DFirst("[LineTotal]";" [Dim_Transactions]") zwraca pierwszą wartość pola LineTotal z tabeli Dim_Transactions, natomiast wywołanie DLast("[LineTotal]";"[Dim_Transactions]") zwraca ostatnią wartość z tego pola.
DStDev, DStDevP, DVar i DVarP Za pomocą funkcji DStDev i DStDevP można uzyskać odchylenie standardowe dla próbki z populacji i dla całej populacji. Funkcje DVar i DVarP zwracają wariancję dla próbki z populacji i dla całej populacji. Wywołanie DStDev("[LineTotal]";"[Dim_Transactions]") zwraca odchylenie standardowe wartości z pola LineTotal z tabeli Dim_Transactions. Wywołanie DVar("[LineTotal]";"[Dim_Transactions]") zwraca wariancję wartości z pola LineTotal z tabeli Dim_Transactions.
Rozdział 15. Podkwerendy i funkcje agregujące domeny
441
Składnia funkcji agregujących domeny Funkcje agregujące domeny są wyjątkowe pod tym względem, że ich składnia zależy od sytuacji. Prowadzi to do poważnej frustracji użytkowników, którzy czasem całkowicie rezygnują ze stosowania takich funkcji. W tym punkcie opisaliśmy pewne ogólne wskazówki, które pomagają w tworzeniu funkcji agregujących domeny. Bez kryteriów To przykładowe wywołanie sumuje wartości z pola LineTotal z tabeli Dim_Transactions (to domena funkcji). Nawy pól i zbioru danych zawsze trzeba ujmować w cudzysłów. DSum("[LineTotal]";"[Dim_Transactions]")
Zwróć uwagę na zastosowane nawiasy kwadratowe. Choć nie zawsze są one niezbędne, zwykle warto je stosować przy podawaniu pola, tabeli lub kwerendy.
Stosowanie kryteriów tekstowych W tym przykładzie sumujemy wartości z pola Revenue z tabeli PvTblFeed (to domena) dla rekordów, których wartość pola Branch_Number to 301316. Warto zauważyć, że pole Branch_Number jest polem tekstowym. Kryteria tekstowe należy umieszczać w apostrofach. Ponadto całe wyrażenie stanowiące kryterium trzeba ująć w cudzysłów. DSum("[Revenue]";"[PvTblFeed]";"[Branch_Number] = '301316' ")
W wyrażeniu określającym kryterium w funkcji agregującej domeny można zastosować dowolną klauzulę WHERE. Daje to dodatkowe możliwości użytkownikom funkcji agregującej domeny, ponieważ pozwala na obsługę wielu kolumn i operatorów logicznych, takich jak AND, OR, NOT itd. Oto przykład: DSum("[Field1]";"[Table]";"[Field2] = 'A' OR [Field2] = 'B' AND [Field3] = 2")
Jeśli chcesz wskazać formant z formularza lub raportu, trzeba zastosować nieco inną składnię: DSum("[Revenue]";"[PvTblFeed]";"[Branch_Number] = ' " & [MyTextControl] & " ' " )
Warto zauważyć, że apostrofy zastosowano w celu przekształcenia wartości formantu na łańcuch znaków. Jeśli wartość w formancie formularza to 301316, człon "[Branch_Number] = ' " & [MyTextControl] & " ' " zostanie przekształcony na "[Branch_Number] = '301316' ". Stosowanie kryteriów liczbowych W tym przykładzie sumujemy wartości z pola LineTotal tabeli Dim_Transactions (jest to domena) dla rekordów, w których pole to ma wartość większą niż 500. Zauważ, że nie zastosowano tu apostrofów. Wynika to z tego, że LineTotal to pole liczbowe. DSum("[LineTotal]";"[Dim_Transactions]";"[LineTotal] > 500 ")
Jeśli chcesz wskazać formant z formularza lub raportu, musisz nieco zmienić składnię: DSum("[LineTotal]";"[Dim_Transactions]";"[LineTotal] > " [MyNumericControl])
442
Część IV Analizowanie danych w Accessie
Stosowanie kryteriów w postaci daty W tym przykładzie sumujemy wartości z pola LineTotal tabeli Dim_Transactions (jest to domena) dla rekordów, w których pole OrderDate ma wartość 07/05/2008: DSum("[LineTotal]";"[Dim_Transactions]";"[OrderDate] = #07/05/08# ")
Jeśli używany jest formant z formularza lub raportu, składnię trzeba nieco zmodyfikować: DSum("[LineTotal]";"[Dim_Transactions]";"[OrderDate] = #" & [MyDateControl] & "#")
Zauważ, że zastosowano znak kratki, aby przekształcić wartość formantu na datę. Jeśli w formancie w formularzu znajduje się wartość 07/05/2008, człon "[OrderDate] = #" & [MyTextControl] & "#" zostanie przekształcony na "[OrderDate] = #07/05/2008# ".
Stosowanie funkcji agregujących domeny Funkcje agregujące domeny, podobnie jak podkwerendy, nie są zbyt wydajne przy wykonywaniu analiz na dużą skalę i przetwarzaniu bardzo dużych zbiorów danych. Lepiej nadają się do przeprowadzania wyspecjalizowanych analiz na mniejszych podzbiorach danych. Najczęściej stosuje się je w środowisku, w którym zbiór danych jest przewidywalny i kontrolowany (np. w funkcjach, formularzach i raportach). Nie chcemy jednak przez to powiedzieć, że funkcje agregujące domeny nie znajdują zastosowania w codziennych analizach danych. W tym punkcie znajdziesz przykłady ilustrujące, jak wykonywać standardowe zadania za pomocą funkcji agregujących domeny. Obliczanie procentu z całości Kwerenda przedstawiona na rysunku 15.15 zwraca produkty według grup i sumę wartości pola LineTotal dla każdej kategorii produktów. Jest to wartościowa analiza, można ją jednak łatwo wzbogacić, dodając kolumnę określającą, jaki procent wpływów generuje każda grupa produktów. Rysunek 15.15. Można dodać kolumnę, która informuje, jaki procent wpływów generuje każda kategoria produktów
Aby uzyskać procent z wszystkich wpływów wygenerowanych dzięki każdej grupie produktów, trzeba oczywiście znać łączne wpływy uzyskane dla całego zbioru danych. W jego ustaleniu pomoże funkcja DSum. Poniższe wywołanie tej funkcji zwraca łączne wpływy dla całego zbioru danych: DSum("[LineTotal]";"[Dim_Transactions]")
Teraz można wykorzystać tę funkcję jako wyrażenie w obliczeniach, które zwracają, jaki procent wpływów wygenerowały poszczególne grupy produktów. Na rysunku 15.16 pokazano, jak utworzyć potrzebną kwerendę.
Rozdział 15. Podkwerendy i funkcje agregujące domeny
443
Rysunek 15.16. Możesz wykorzystać funkcję DSum jako wyrażenie w obliczeniach, żeby uzyskać procent łącznych wpływów
Wyniki widoczne na rysunku 15.17 są dowodem na to, że w ten sposób można szybko i łatwo uzyskać w jednej kwerendzie zarówno łączną wartość, jak i procent dla każdej grupy. Rysunek 15.17. Jedna kwerenda pobiera zarówno wpływy wygenerowane przez grupę, jak i procent łącznych wpływów
Zwracanie liczby elementów do danego dnia W kwerendzie z rysunku 15.18 wykorzystano funkcję DCount jako wyrażenie, aby zwracać liczbę faktur przetworzonych każdego dnia.
Rysunek 15.18. Ta kwerenda zwraca daty wystawienia wszystkich faktur i liczbę faktur przetworzonych każdego dnia
444
Część IV Analizowanie danych w Accessie
Zastanów się przez chwilę nad działaniem poniższego wywołania funkcji DCount: DCount("[TransactionID]";"[Dim_Transactions]";"[OrderDate]= #" & [OrderDate] & "#")
To wywołanie funkcji DCount zwraca liczbę faktur, dla których data wystawienia jest równa (=) poszczególnym datom zwróconym przez kwerendę. Dlatego w kontekście kwerendy z rysunku 15.18 wynikowy zbiór danych wyświetla wszystkie daty wystawienia faktur i liczbę faktur z każdego z tych dni. Co się stanie, jeśli zmodyfikujesz wywołanie funkcji w taki sposób, aby zwracało liczbę faktur dla daty równej lub wcześniejszej od dat zwróconych przez kwerendę? DCount("[TransactionID]";"[Dim_Transactions]";"[OrderDate]<= #" & [OrderDate] & "#")
Tu funkcja DCount zwraca liczbę faktur dla każdej daty i liczbę faktur dla dowolnej wcześniejszej daty, co daje liczbę faktur wystawionych do danego dnia. Aby zastosować to rozwiązanie, zastąp operator = z funkcji DCount operatorem <=, co pokazano na rysunku 15.19.
Rysunek 15.19. Zastosuj operator <= w funkcji DCount, aby zwrócić liczbę faktur o datach równych lub wcześniejszych względem daty zwróconej przez kwerendę
Rysunek 15.20 przedstawia uzyskaną liczbę faktur wystawionych do danego dnia. Rysunek 15.20. Teraz w ramach analiz generowana jest liczba faktur wystawionych do danego dnia
Rozdział 15. Podkwerendy i funkcje agregujące domeny
445
Można też uzyskać sumę wartości do danego dnia zamiast ich liczby. W tym celu należy wywołać funkcję DSum.
Stosowanie wartości z poprzedniego rekordu W kwerendzie z rysunku 15.21 wykorzystano funkcję DLookup do pobrania wpływów z poprzedniego rekordu. Uzyskana wartość jest zapisywana w nowej kolumnie o nazwie Yesterday.
Rysunek 15.21. W tej kwerendzie zastosowano funkcję DLookup do pobrania wpływów z poprzedniego dnia
Ta technika przypomina technikę zastosowaną do utworzenia sumy wartości do danego dnia. Obie oparte są na zmianie operatora porównania, aby zmodyfikować znaczenie funkcji agregującej domeny. Tu funkcja DLookup wyszukuje wpływy z rekordów, w których data faktury jest równa dacie o dzień wcześniejszej od daty zwróconej przez kwerendę. Jeśli odejmiesz 1 od zwróconej daty, otrzymasz wczorajszą datę! DLookUp("[Revenue]";"[TimeSummary]";"[OrderDate] = #" & [OrderDate]-1 & "#")
Jeśli dodasz 1, otrzymasz następny rekord z sekwencji. Sztuczka ta nie zadziała jednak dla pól tekstowych. Można ją zastosować tylko do dat i pól liczbowych. Jeśli używasz tabeli, w której nie występują takie pola, utwórz pole typu Autonumerowanie. Dzięki temu uzyskasz unikatowy identyfikator liczbowy, który można wykorzystać.
Gdy uruchomisz kwerendę z rysunku 15.21, uzyskasz wyniki z rysunku 15.22. Rysunek 15.22. Możesz wzbogacić ten mechanizm i przeprowadzić obliczenia dla poprzedniego dnia
446
Część IV Analizowanie danych w Accessie
Analizy te można wzbogacić, dodając pole obliczeniowe, które zwraca różnicę między dniem bieżącym a dniem wcześniejszym. Utwórz nową kolumnę i umieść w niej wyrażenie [Revenue]-NZ([Yesterday],0), co pokazano na rysunku 15.23. Warto zauważyć, że pole Yesterday umieszczono w funkcji NZ, aby uniknąć błędów powodowanych przez pola o wartości Null.
Rysunek 15.23. Można wzbogacić analizy, dodając różnicę między danym dniem a dniem wcześniejszym
Wyniki przedstawia rysunek 15.24. Rysunek 15.24. Inna operacja, którą można wykonać dzięki funkcjom agregującym domeny
Rozdział 16.
Statystyki opisowe W tym rozdziale:
Określanie pozycji, wartości modalnej i mediany
Pobieranie losowej próbki ze zbioru danych
Obliczanie percentyla
Określanie kwartyla dla rekordu
Tworzenie rozkładu częstości
Statystyki opisowe umożliwiają prezentowanie dużych ilości danych w postaci łatwych do zrozumienia podsumowań liczbowych. Gdy dodajesz, zliczasz lub uśredniasz dane, tworzysz statystyki opisowe. Należy zauważyć, że statystyki opisowe służą tylko do określania natury zbioru danych i umożliwiają tworzenie porównań, które można wykorzystać w innych analizach. Różnią się więc od statystyk dedukcyjnych, które pozwalają wyciągać wnioski wykraczające poza same dane. Aby lepiej zrozumieć różnice między statystykami opisowymi i dedukcyjnymi, pomyśl o ankietach przeprowadzanych wśród klientów. Statystyki opisowe podsumowują wyniki ankiety dla wszystkich klientów i pozwalają przedstawić dane za pomocą zrozumiałych wskaźników, natomiast statystyki dedukcyjne dotyczą wniosków, na przykład lojalności klientów ustalonej na podstawie różnic między grupami klientów. Do obliczania statystyk dedukcyjnych narzędzia w rodzaju Excela nadają się lepiej od Accessa. Dlaczego? Po pierwsze, Excel udostępnia wiele wbudowanych funkcji i narzędzi, które pozwalają na łatwe obliczanie statystyk dedukcyjnych. Access tych narzędzi nie posiada. Po drugie, statystyki dedukcyjne zwykle oblicza się dla małych zbiorów danych, które można swobodnie analizować i prezentować w Accessie. Natomiast obliczanie statystyk opisowych w Accessie jest praktycznym rozwiązaniem. Z uwagi na strukturę i wielkość danych często lepiej jest obliczać je w Accessie niż w Excelu. Wyjściową bazę danych dla tego rozdziału, Rozdział16.accdb, można pobrać z witryny poświęconej tej książce.
448
Część IV Analizowanie danych w Accessie
Podstawowe statystyki opisowe W tym podrozdziale omawiamy podstawowe zadania, które można wykonywać za pomocą statystyk opisowych.
Obliczanie statystyk opisowych za pomocą kwerend podsumowujących Na tym etapie książki uruchomiłeś już wiele kwerend Accessa. Część z nich to kwerendy podsumowujące. Gdy je uruchamiałeś, prawdopodobnie nie zdawałeś sobie sprawy, że obliczałeś statystyki opisowe. Naprawdę. Najprostsze statystyki opisowe można obliczyć za pomocą kwerend podsumowujących. Aby się o tym przekonać, utwórz kwerendę przedstawioną na rysunku 16.1.
Rysunek 16.1. Uruchomienie tej kwerendy podsumowującej pozwala uzyskać przydatne statystyki opisowe
Wyniki tej kwerendy przedstawia rysunek 16.2. Są one podobne do wyników funkcji obliczających statystyki opisowe w Excelu i udostępniają najważniejsze wskaźniki statystyczne dla całego zbioru danych.
Rysunek 16.2. Najważniejsze wskaźniki statystyczne dla całego zbioru danych
Do statystyk opisowych można łatwo dodawać poziomy. Na rysunku 16.3 dodano pole Branch_Number. Pozwala to uzyskać najważniejsze wskaźniki statystyczne dla każdego oddziału firmy.
Rysunek 16.3. Dołącz do kwerendy pole Branch_Number, aby dodać do analizy nowy wymiar
Rozdział 16. Statystyki opisowe
449
Na rysunku 16.4 widać, że można teraz porównywać statystyki opisowe dla różnych oddziałów, aby ustalić, jak funkcjonują.
Rysunek 16.4. W jednym arkuszu widoczne są statystyki opisowe dla każdego oddziału
Określanie rankingu, wartości modalnej i mediany Ustalanie rankingu rekordów, wartości modalnej i mediany w zbiorze danych to zadania, które analitycy danych muszą czasem wykonywać. Niestety, Access nie udostępnia wbudowanych funkcji, które umożliwiałyby łatwe wykonanie tych operacji. Oznacza to, że trzeba znaleźć sposób obliczania tego rodzaju statystyk opisowych. W tym punkcie poznasz pewne techniki, które można wykorzystać do ustalania rankingu, wartości modalnej i mediany. Określanie rankingu rekordów w zbiorze danych Bez wątpienia natrafisz na sytuację, gdy trzeba będzie uporządkować rekordy w zbiorze danych na podstawie pewnego wskaźnika, np. wygenerowanych wpływów. Ranking rekordów nie tylko jest przydatny w kontekście prezentowania danych, ale też stanowi ważny element przy obliczaniu zaawansowanych statystyk opisowych takich jak mediana, percentyle i kwartyle. Najłatwiejszym sposobem tworzenia rankingu rekordów w zbiorze danych jest wykorzystanie podkwerendy skorelowanej. W kwerendzie z rysunku 16.5 pokazano, jak utworzyć ranking za pomocą podkwerendy.
Rysunek 16.5. Ta kwerenda porządkuje pracowników na podstawie wpływów
450
Część IV Analizowanie danych w Accessie
Zastanów się nad podkwerendą, która generuje ranking: (SELECT Count(*)FROM RepSummary AS M1 WHERE [Rev]>[RepSummary].[Rev])+1
Ta podkwerenda skorelowana zwraca łączną liczbę rekordów z tabeli M1 (jest to tabela RepSummary o aliasie M1), dla których pole Rev w tej tabeli jest większe od pola Rev z tabeli RepSummary. Następnie wartość w podkwerendzie jest zwiększana o 1. Dlaczego? Jeśli tego nie zrobisz, dla rekordu o największej wartości zwrócona zostanie wartość 0, ponieważ jest zero rekordów większych od rekordu o maksymalnej wartości. Wtedy ranking zaczynać się będzie od wartości 0 zamiast 1. Dodanie 1 pozwala zapewnić, że ranking rozpocznie się od pozycji pierwszej. Ponieważ używana jest tu podkwerenda skorelowana, jest ona wykonywana dla każdego rekordu ze zbioru danych, dzięki czemu dla wszystkich rekordów zwracane są inne pozycje.
Szczegółowe omówienie podkwerend skorelowanych znajdziesz w rozdziale 15.
Wyniki zostały przedstawione na rysunku 16.6. Rysunek 16.6. Utworzono kolumnę Rank dla zbioru danych
Technika ta jest przydatna także wtedy, gdy trzeba utworzyć w kwerendzie pole typu Autonumerowanie.
Określanie wartości modalnej dla zbioru danych Wartość modalna w zbiorze danych to liczba, która pojawia się w tym zbiorze najczęściej. Na przykład wartością modalną dla zbioru {4, 5, 5, 6, 7, 5, 3, 4} jest 5. Access (w odróżnieniu od Excela) nie udostępnia wbudowanej funkcji Mode, dlatego trzeba opracować własną metodę określania wartości modalnej dla zbioru danych. Choć istnieją różne sposoby ustalenia wartości modalnej, najłatwiej jest za pomocą kwerendy zliczyć wystąpienia poszczególnych elementów, a następnie przefiltrować je, tak aby pozostał element o największej liczbie wystąpień. Aby zastosować tę metodę, wykonaj następujące czynności: 1. Utwórz kwerendę przedstawioną na rysunku 16.7. Wyniki (przedstawione na rysunku 16.8) nie wyglądają na pomocne, jednak jeśli zastosujesz kwerendę zwracającą tylko największą wartość, uzyskasz wartość modalną.
Rozdział 16. Statystyki opisowe
451
Rysunek 16.7. Ta kwerenda grupuje dane według pola Rev, a następnie zlicza wystąpienia każdej liczby z tego pola. Kwerenda jest sortowana malejąco na podstawie pola Rev
Rysunek 16.8. Prawie gotowe — wystarczy zastosować kwerendę zwracającą największe wartości, aby otrzymać wartość modalną
2. Otwórz zakładkę NARZĘDZIA KWEREND PROJEKTOWANIE i kliknij przycisk Arkusz właściwości. Pojawi się okno dialogowe Arkusz właściwości dla kwerendy. 3. Ustaw właściwość Najwyższe wartości na 1, jak pokazano na rysunku 16.9. Otrzymasz rekord o największej liczbie wystąpień. Rysunek 16.9. Ustaw właściwość Najwyższe wartości na 1
Na rysunku 16.10 widać, że teraz zwracana jest tylko jedna wartość z pola Rev — ta, która występuje najczęściej. To właśnie jest wartość modalna. Rysunek 16.10. Oto wartość modalna Warto pamiętać, że jeśli najczęściej występuje kilka wartości, kwerenda wyświetlająca największe wartości pokaże wszystkie rekordy o wartości maksymalnej. Prowadzi to do zwrócenia więcej niż jednej wartości modalnej. W takiej sytuacji trzeba samodzielnie określić, którą wartość modalną zastosować.
452
Część IV Analizowanie danych w Accessie
Określanie mediany dla zbioru danych Mediana dla zbioru danych to środkowa wartość ze zbioru danych. Oznacza to, że połowa liczb ma wartość większą i połowa ma wartość mniejszą od mediany. Na przykład medianą w zbiorze {3, 4, 5, 6, 7, 8, 9} jest 6, ponieważ jest to środkowa liczba w tym zbiorze danych. Dlaczego po prostu nie obliczyć średniej? Otóż czasem uwzględnienie skrajnych przypadków w średniej powoduje zafałszowanie analiz. Na przykład jeśli obliczysz średnią dla zbioru {32, 34, 35, 37, 89}, otrzymasz wynik 45,4. Problem polega na tym, że wartość ta nie reprezentuje tendencji centralnej dla badanej próbki liczb. Większy sens ma zastosowanie dla tej próbki mediany. Wynosi ona 35 i lepiej reprezentuje dane.
Access nie ma wbudowanej funkcji Median, dlatego trzeba opracować własną technikę określania mediany dla zbiorów danych. Łatwym sposobem na uzyskanie pożądanych efektów jest utworzenie kwerendy w dwóch krokach: 1. Utwórz kwerendę, która sortuje rekordy i tworzy ranking. Kwerenda z rysunku 16.11 sortuje rekordy i tworzy ich ranking w tabeli RepSummary.
Rysunek 16.11. Pierwszy krok w trakcie określania mediany dla zbioru danych wymaga określenia pozycji każdego rekordu w rankingu
2. Określ środkowy rekordy ze zbioru danych, zliczając rekordy z tego zbioru, a następnie dzieląc uzyskaną wartość przez 2. Dzięki temu otrzymasz środkową wartość. Ponieważ rekordy są teraz posortowane i uporządkowane w rankingu, rekord o pozycji odpowiadającej środkowej wartości jest medianą. Rysunek 16.12 przedstawia podkwerendę, która zwraca środkową wartość zbioru danych. Zauważ, że wartość ta jest umieszczona w funkcji Int, co powoduje usunięcie części ułamkowej liczby. Na rysunku 16.13 widać, że środkową wartość ma rekord 336. Możesz przejść do tego rekordu, aby zobaczyć medianę. Jeśli chcesz tylko zwrócić medianę, zastosuj podkwerendę jako kryterium w polu Rank, jak pokazano na rysunku 16.14.
Rozdział 16. Statystyki opisowe
453
Rysunek 16.12. Podkwerenda Middle Value zlicza wszystkie rekordy ze zbioru danych, a następnie dzieli uzyskaną liczbę przez 2
Rysunek 16.13. Przejdź do rekordu 336, aby zobaczyć medianę dla zbioru danych
Rysunek 16.14. Zastosowanie podkwerendy jako kryterium w polu Rank powoduje, że zwracana jest tylko mediana
454
Część IV Analizowanie danych w Accessie
Pobieranie losowej próbki ze zbioru danych Choć tworzenie losowej próbki danych niekoniecznie można uznać za zadanie z zakresu statystyki opisowej, takie próbki często są podstawą do analiz statystycznych. W Accessie losowe próbki danych można tworzyć na wiele sposobów. Jednym z najłatwiejszych jest zastosowanie funkcji Rnd w kwerendzie zwracającej najwyższe wartości. Funkcja ta na podstawie wyjściowej wartości zwraca losową liczbę. Chodzi o to, aby utworzyć wyrażenie, które stosuje funkcję Rnd do pola z wartościami liczbowymi, a następnie ograniczyć listę zwracanych rekordów za pomocą właściwości Najwyższe wartości kwerendy. Aby zastosować tę metodę, wykonaj następujące czynności: 1. W widoku projektu utwórz kwerendę używającą tabeli TransactionMaster. 2. Utwórz pole Random ID (zobacz rysunek 16.15), a następnie posortuj dane rosnąco lub malejąco według tego pola. Rysunek 16.15. Zacznij od utworzenia pola Random ID, wywołując funkcję Rnd dla pola Customer_Number
Funkcja Rnd nie zadziała dla pól zawierających tekst lub wartości Null. Co dziwne, działa ona dla pól z liczbami nawet wtedy, gdy pola te mają tekstowy typ danych. Jeśli tabela składa się z pól zawierających tylko tekst, możesz dodać pole typu Autonumerowanie, aby móc wykorzystać je w funkcji Rnd. Inna możliwość to przekazanie pola zawierającego tekst do funkcji Len, a następnie wykorzystanie tego wyrażenia w funkcji Rnd — np. Rnd(Len([Mytext])).
3. Otwórz zakładkę NARZĘDZIA KWEREND PROJEKTOWANIE i kliknij przycisk Arkusz właściwości. Pojawi się okno dialogowe Arkusz właściwości dla kwerendy. 4. Zmień wartość właściwości Najwyższe wartości na 1000, co pokazano na rysunku 16.16. 5. Wyłącz zaznaczenie w wierszu Pokaż dla pola Random ID i dodaj pola, które chcesz wyświetlić w zbiorze danych. 6. Uruchom kwerendę. Otrzymasz całkowicie losową próbkę danych, co pokazano na rysunku 16.17.
Rozdział 16. Statystyki opisowe
455
Rysunek 16.16. Ogranicz liczbę zwracanych rekordów, ustawiając właściwość Najwyższe wartości kwerendy
Rysunek 16.17. Kwerenda ta generuje próbkę 1000 losowych rekordów Gdy ponownie uruchomisz tę kwerendę, zmienisz widok lub posortujesz zbiór danych, wówczas otrzymasz inny zbiór losowych rekordów. Jeśli chcesz przeprowadzać rozbudowane analizy na niezmiennym zbiorze losowych rekordów, uruchom przedstawioną kwerendę jako kwerendę tworzącą tabelę. Pozwoli to utworzyć trwałą tabelę.
Zaawansowane statystyki opisowe W czasie stosowania statystyk opisowych niewielka ilość wiedzy może przynieść cenne efekty. Podstawowe analizy statystyczne często prowadzą do bardziej zaawansowanych. W tym podrozdziale wykorzystasz poznane wcześniej podstawy do przygotowania zaawansowanych statystyk opisowych.
Obliczanie percentyli Percentyl określa relację danego wyniku względem standardu dla grupy. Percentyle najczęściej stosuje się przy określaniu wyników w standaryzowanych testach. Jeśli wynik dziecka w takim teście odpowiada 90. percentylowi, jest wyższy od wyników 90% innych dzieci biorących udział w tym teście. Można też ująć to tak: taki wynik należy do 10% najwyższych wyników wszystkich dzieci zdających ten test. Percentyle często używa się w analizach danych do pomiaru wyniku badanego względem grupy. Można na przykład określić, w jakim percentylu znalazł się każdy pracownik ze względu na roczne wpływy uzyskane dla firmy.
456
Część IV Analizowanie danych w Accessie
Obliczanie percentyli dla zbioru danych to operacja matematyczna. Wzór na percentyle to: (liczba rekordów – pozycja) / liczba rekordów. Cały problem polega na uzyskaniu wszystkich zmiennych potrzebnych do wykonania tej operacji. Wykonaj następujące czynności: 1. Utwórz kwerendę z rysunku 16.18. Porządkuje ona wszystkich pracowników według rocznych wpływów. Koniecznie nadaj nowemu polu alias Rank.
Rysunek 16.18. Rozpocznij od utworzenia kwerendy, która porządkuje pracowników na podstawie wpływów
2. Dodaj pole, które zlicza rekordy ze zbioru danych. Na rysunku 16.19 widać, że wykorzystano do tego podkwerendę. Koniecznie nadaj nowemu polu alias RCount.
Rysunek 16.19. Dodaj pole, które zwraca łączną liczbę rekordów
3. Utwórz pole obliczeniowe z wyrażeniem (RCount–Rank)/RCount. Na tym etapie kwerenda powinna wyglądać jak ta z rysunku 16.20. 4. Uruchom kwerendę. Gdy posortujesz dane według pola Rev, uzyskasz wyniki przedstawione na rysunku 16.21. Wynikowy zbiór danych pozwala ocenić wyniki każdego pracownika względem całej grupy. Na przykład szósty pracownik ze zbioru danych znajduje się w 99. percentylu, co oznacza, że wygenerował więcej wpływów niż 99% pozostałych pracowników.
Rozdział 16. Statystyki opisowe
457
Rysunek 16.20. Ostatni krok polega na utworzeniu pola obliczeniowego określającego, w którym percentylu znajduje się każdy rekord Rysunek 16.21. Udało się z powodzeniem obliczyć, w którym percentylu znajduje się każdy pracownik
Ustalanie kwartyla dla rekordu Kwartyl to miara statystyczna oparta na podziale zbioru danych na cztery równe grupy (każda z nich zawiera 25% elementów z całego zbioru). Najwyższe 25% zbioru znajduje się w pierwszym kwartylu, natomiast najniższe 25% — w kwartylu czwartym. Kwartyle zwykle stosuje się do podziału danych na logiczne grupy, które można porównywać i niezależnie analizować. Na przykład jeśli chcesz określić minimalny standard dla generowanych miesięcznie wpływów, możesz ustalić go na poziomie średniej dla pracowników z trzeciego kwartyla. W ten sposób uzyskasz minimalny standard, który w przeszłości osiągnęło lub przekroczyło 50% pracowników. Ustalenie kwartylu, do którego należą poszczególne rekordy ze zbioru danych, nie wymaga wykonywania operacji matematycznych — wystarczy porównać wartości. Należy porównać ranking każdego rekordu z punktami wyznaczającymi kwartyle. Dlaczego? Załóżmy, że zbiór danych zawiera 100 rekordów. Gdy podzielisz 100 przez cztery, otrzymasz punkt wyznaczający pierwszy kwartyl (25). Oznacza to, że każdy rekord z pozycji 25 lub wyższej należy do pierwszego kwartyla. Aby uzyskać punkt wyznaczający drugi kwartyl, należy wykonać działanie 100/4*2. Punkt wyznaczający trzeci kwartyl można obliczyć za pomocą działania 100/4*3.
458
Część IV Analizowanie danych w Accessie
Na podstawie tych informacji łatwo zauważyć, że należy uporządkować rekordy w zbiorze danych i zliczyć je. Zacznij od utworzenia kwerendy z rysunku 16.22. Utwórz pole Rank w taki sam sposób jak na rysunku 16.18, a pole RCount — tak jak na rysunku 16.19. Rysunek 16.22. Zacznij od utworzenia pól Rank (w którym pracownicy są uporządkowani według wygenerowanych wpływów) i RCount (które zawiera łączną liczbę rekordów w zbiorze danych)
Po utworzeniu w kwerendzie pól Rank i RCount można je wykorzystać w funkcji Switch, która przypisuje do każdego rekordu odpowiedni kwartyl. Przyjrzyj się przez chwilę używanej funkcji Switch: Switch([Rank]<=[RCount]/4*1,"1st",[Rank]<=[RCount]/4*2,"2nd", [Rank]<= [RCount]/4*3,"3rd",True,"4th")
Funkcja Switch sprawdza tu cztery warunki i porównuje pozycję każdego rekordu z punktami wyznaczającymi kwartyle w używanym zbiorze danych. Więcej informacji na temat funkcji Switch znajdziesz w rozdziale 13.
Na rysunku 16.23 pokazano, jak wykorzystać przedstawioną funkcję Switch w kwerendzie. Zauważ, że używany jest tu alias Quartile.
Rysunek 16.23. Używanie funkcji Switch do tworzenia znaczników określających kwartyle
Jak widać na rysunku 16.24, można posortować wynikowy zbiór danych według dowolnego pola, a znaczniki określające kwartyle pozostaną prawidłowe.
Tworzenie rozkładu częstości Rozkład częstości to analiza specjalnego rodzaju, która kategoryzuje dane według liczby wystąpień elementów o określonych wartościach wyznaczanych przez zmienne. Na rysunku 16.25 pokazano rozkład częstości utworzony za pomocą funkcji Partition.
Rozdział 16. Statystyki opisowe
459
Rysunek 16.24. Wynikowy zbiór danych można posortować w dowolny sposób bez ryzyka utraty znaczników określających kwartyle
Rysunek 16.25. Ten rozkład częstości utworzono za pomocą funkcji Partition
W tym rozkładzie częstości pracownicy są grupowani na podstawie uzyskanych wpływów. Na przykład 183 pracowników należy do grupy 500: 5999. Oznacza to, że tych 183 pracowników zarobiło od 500 do 5999 dolarów każdy. Choć uzyskane tu wyniki można otrzymać na kilka sposobów, najłatwiejsza technika tworzenia rozkładu częstości oparta jest na funkcji Partition: Partition(Liczba, Wartość początkowa, Wartość końcowa, Skok)
Funkcja Partition określa przedział, do którego należy dana liczba. Informuje, w jakim miejscu wyznaczanej serii przedziałów znajduje się ta liczba. Funkcja Partition wymaga podania następujących czterech argumentów: (wymagany) — sprawdzana liczba. W kwerendzie jest to zwykle nazwa pola. Pozwala to określić, że należy sprawdzić wartości tego pola z wszystkich wierszy.
Liczba
(wymagany) — liczba całkowita, od której rozpoczyna się wyznaczanie przedziałów. Warto zauważyć, że liczba ta nie może być mniejsza od 0.
Wartość początkowa
(wymagany) — liczba całkowita, przy której kończy się wyznaczanie przedziałów. Warto zauważyć, że liczba ta musi być większa niż Wartość początkowa.
Wartość końcowa
460
Część IV Analizowanie danych w Accessie
(wymagany) — liczba całkowita określająca wielkość każdego przedziału z zakresu od Wartość początkowa do Wartość końcowa. Liczba ta nie może być mniejsza od 1.
Skok
Aby utworzyć rozkład częstości widoczny na rysunku 16.25, utwórz kwerendę z rysunku 16.26. W kwerendzie tej wykorzystano funkcję Partition. Za pomocą argumentów określono, że sprawdzane jest pole Revenue, wartością początkową jest 500, wartością końcową 100 000, a skok wynosi 5000. Rysunek 16.26. Ta prosta kwerenda tworzy rozkład częstości przedstawiony na rysunku 16.25
Rozkład częstości można też utworzyć dla grup. W tym celu należy dodać do kwerendy pole Grupuj według. Na rysunku 16.27 pokazano, jak to zrobić na podstawie pola Branch_Number. Rysunek 16.27. Ta kwerenda tworzy odrębny rozkład częstości dla każdego numeru oddziału ze zbioru danych
Wynik to zbiór danych (zobacz rysunek 16.28) obejmujący odrębny rozkład częstości dla każdego oddziału. W wynikach szczegółowo określona jest liczba pracowników z każdego przedziału rozkładu wpływów. Rysunek 16.28. Udało się za pomocą jednej kwerendy utworzyć zbiór rozkładów częstości
Część V
Formularze i raporty Accessa W tej części:
Rozdział 17. Tworzenie prostych formularzy
Rozdział 18. Praca z danymi w formularzach
Rozdział 19. Praca z formantami formularzy
Rozdział 20. Prezentowanie danych za pomocą raportów
Rozdział 21. Raporty w Accessie — techniki zaawansowane
Formularze i raporty to narzędzia Accessa dające niezwykle dużo możliwości. Formularze Accessa umożliwiają użytkownikom tworzenie interfejsów dla tabel baz danych i są niezawodnym mechanizmem do szybkiego rozwijania aplikacji używanym w organizacjach różnego rodzaju. Raporty Accessa pozwalają szybko połączyć analizy bazy danych z eleganckimi prezentacjami przypominającymi dokumenty w formacie PDF. Raporty obsługują grupowanie, sortowanie i warunkowe formatowanie danych. Z trzech pierwszych rozdziałów tej części dowiesz się wszystkiego, czego potrzebujesz, aby przekształcić prostą bazę w kompletną aplikację z atrakcyjnym interfejsem, który umożliwia przeglądanie, dodawanie, edytowanie i usuwanie danych. W dwóch ostatnich rozdziałach tej części omówiliśmy zadania wykonywane przy tworzeniu raportów Accessa. Z tych rozdziałów dowiesz się, jak zapewnić użytkownikom wygodny sposób przeglądania podsumowań informacji na pożądanym poziomie szczegółowości i jednocześnie umożliwić drukowanie danych w różnych formatach.
462
Część V Formularze i raporty Accessa
Rozdział 17.
Tworzenie prostych formularzy W tym rozdziale:
Tworzenie różnych typów formularzy
Dodawanie formantów w formularzu
Korzystanie z arkusza właściwości
Formularze to najbardziej elastyczny sposób przeglądania, dodawania, edytowania i usuwania danych. Wykorzystuje się je również jako panele przełączania (formularze z przyciskami nawigacyjnymi), jako okna dialogowe do zarządzania przepływem sterowania w systemie, a także do wyświetlania komunikatów. Formanty to obiekty umieszczane w formularzach, takie jak etykiety, pola tekstowe, przyciski itp. Z tego rozdziału dowiesz się, w jaki sposób tworzy się różne rodzaje formularzy. Poznasz też typy formantów wykorzystywanych w formularzach. W niniejszym rozdziale omówiono również właściwości formularzy i formantów. Pokazano też, w jaki sposób definiować wygląd i działanie interfejsu użytkownika za pomocą ustawiania bądź modyfikowania właściwości. Formularze dodawane do bazy danych Accessa to kluczowy element tworzonych aplikacji. W większości przypadków nie należy zezwalać użytkownikom na bezpośredni dostęp do arkuszy danych tabel lub kwerend, gdyż bardzo łatwo może dojść do usunięcia cennych informacji lub wprowadzenia nieprawidłowych danych do tabeli. Formularze są cennym narzędziem zapewniającym zachowanie integralności danych w bazie. Ponieważ w formularzach można zapisywać kod VBA i makra, mogą one służyć do weryfikowania poprawności wprowadzanych danych lub do potwierdzania zamiaru usunięcia rekordów przed faktycznym przeprowadzeniem operacji usuwania. Dobrze zaprojektowane formularze pozwalają także uniknąć konieczności szkolenia użytkowników, ponieważ umożliwiają wyświetlanie komunikatów, gdy użytkownik porusza się po formularzu. Formularze mogą również podpowiadać wartości domyślne lub przeprowadzać obliczenia na podstawie informacji wprowadzanych przez użytkownika lub pobieranych z tabel bazy danych. W tym rozdziale wykorzystano tabele tblProducts, tblCustomers oraz inne tabele z bazy danych Rozdział17.accdb.
464
Część V Formularze i raporty Accessa
Tworzenie formularzy Aby dodać formularz do bazy danych, można skorzystać z grupy Formularze z zakładki TWORZENIE wstążki. Za pomocą poleceń z grupy Formularze (zobacz rysunek 17.1) można utworzyć następujące typy formularzy:
Rysunek 17.1. Grupa Formularze z zakładki TWORZENIE na wstążce umożliwia dodawanie formularzy do bazy danych
Formularz — tworzy nowy formularz, umożliwiający wprowadzanie informacji dla jednego rekordu. Aby można było skorzystać z tego polecenia, należy wcześniej otworzyć lub zaznaczyć tabelę, kwerendę, formularz bądź raport. Jeśli zaznaczysz tabelę lub kwerendę w okienku nawigacji, a następnie klikniesz przycisk Formularz, Access powiąże nowy formularz ze źródłem danych i otworzy formularz w widoku układu.
Projekt formularza — tworzy nowy pusty formularz i wyświetla go w widoku projektu. Taki formularz nie jest powiązany ze źródłem danych. Trzeba określić odpowiednie źródło danych (tabelę lub kwerendę) i utworzyć formularz, dodając formanty na podstawie listy pól tego źródła.
Pusty formularz — tworzy pusty formularz, który nie zawiera żadnych formantów. Nowy formularz (podobnie jak w projekcie formularza) nie jest powiązany z żadnym źródłem danych i otwiera się w widoku układu.
Kreator formularzy — prosty kreator ułatwiający tworzenie formularzy. Wyświetla pytanie o źródło danych, umożliwia wybranie pól, które mają się znaleźć w formularzu, a także pozwala na wskazanie jednego z kilku prostych układów nowego formularza.
Formularz nawigacyjny — specjalny formularz dostarczający użytkownikom mechanizmów poruszania się po aplikacji. Więcej informacji na temat formularzy nawigacyjnych można znaleźć w dalszej części tego rozdziału.
Więcej formularzy — przycisk Więcej formularzy w grupie Formularze wyświetla rozwijaną listę zawierającą kilka innych typów formularzy:
Wiele elementów — prosty formularz w postaci tabelarycznej wyświetlający kilka rekordów związanych z wybranym źródłem danych.
Arkusz danych — tworzy formularz, który jest wyświetlany w widoku arkusza danych.
Rozdział 17. Tworzenie prostych formularzy
465
Formularz dzielony — tworzy formularz dzielony, w którym w górnej, dolnej, lewej lub prawej części wyświetla się arkusz danych, natomiast w drugiej części znajduje się formularz umożliwiający wprowadzanie informacji dotyczących rekordu wybranego w arkuszu.
Modalne okno dialogowe — szablon formularza w postaci modalnego okna dialogowego. Formularz tego typu (często określany po prostu jako okno dialogowe) pozostaje na ekranie do czasu, aż użytkownik wprowadzi informacje wymagane w oknie albo je zamknie.
Jeśli któryś z powyższych terminów jest dla Czytelnika niezrozumiały, nie należy się martwić — każdy z nich zostanie szczegółowo omówiony w niniejszym rozdziale. Trzeba pamiętać, że wstążka Accessa i jej zawartość zależy od kontekstu, zatem nie wszystkie z opisywanych opcji muszą być dostępne na zakładce TWORZENIE.
Tworzenie nowego formularza Tak jak w przypadku innych obiektów w Accessie, formularze można dodawać do aplikacji na wiele sposobów. Najłatwiejszy polega na wskazaniu źródła danych, na przykład tabeli, a następnie kliknięciu przycisku Formularz z zakładki TWORZENIE. Inny zaś wiąże się z wykorzystaniem kreatora formularzy, który przeprowadza użytkownika przez proces definiowania źródła danych i innych szczegółów nowego formularza. Użycie przycisku Formularz Aby automatycznie utworzyć nowy formularz na podstawie tabeli lub kwerendy wybranej w okienku nawigacji, należy skorzystać z polecenia Formularz z grupy Formularze na wstążce. W poprzednich wersjach Accessa ta funkcja była dostępna pod nazwą Autoformularz.
Aby utworzyć formularz na podstawie tabeli tblProducts, wykonaj następujące czynności: 1. Wybierz tabelę tblProdukty w okienku nawigacji. 2. Kliknij zakładkę TWORZENIE na wstążce. 3. Kliknij polecenie Formularz w grupie Formularze. Access utworzy nowy pusty formularz na podstawie tabeli tblProducts i wyświetli go w widoku układu (zobacz rysunek 17.2). Widok układu pozwala na modyfikację projektu formularza podczas przeglądania danych. (Formularz pokazany na rysunku 17.2 jest dostępny w przykładowej bazie danych Rozdział17.accdb pod nazwą frmProducts_AutoForm). Nowy formularz wyświetla się w widoku układu. Jest wypełniony formantami powiązanymi z wszystkimi polami ze wskazanego źródła danych. Widok układu daje użytkownikowi wyobrażenie o tym, w jaki sposób formanty (kontrolki) są rozmieszczone względem siebie, ale nie można go wykorzystywać do zmiany rozmiaru formantów lub do ich przemieszczania po formularzu. Aby zmienić układ formantów w formularzu, wystarczy kliknąć prawym przyciskiem myszy na pasku tytułu formularza, a następnie wybrać polecenie Widok projektu.
466
Część V Formularze i raporty Accessa
Rysunek 17.2. Użycie polecenia Formularz powoduje szybkie utworzenie nowego formularza zawierającego wszystkie pola z tabeli lub kwerendy
Przycisk Projekt formularza z grupy Formularze w gruncie rzeczy wykonuje to samo zadanie co przycisk Formularz. Różnica polega na tym, że do widoku projektu formularza nie są dodawane żadne formanty, a formularz otwiera się w widoku projektu. Przycisk Projekt formularza najbardziej przydaje się podczas tworzenia nowego formularza, w którym nie będą wykorzystywane wszystkie pola ze wskazanego źródła danych, a użytkownik potrzebuje większej kontroli nad rozmieszczeniem formantów. W podobny sposób działa opcja Pusty formularz, która otwiera nowy pusty formularz, ale w widoku układu. Formanty dodaje się do formularza poprzez przeciąganie pól z okna Lista pól, ale użytkownik ma niewielką kontrolę nad ich rozmieszczeniem. Opcja Pusty formularz najbardziej przydaje się wtedy, kiedy chcesz szybko stworzyć formularz ze związanymi formantami, a ich rozmieszczenie nie ma znaczenia. Dzięki tej opcji można w mniej niż minutę stworzyć nowy pusty formularz. Tworzenie formularzy za pomocą kreatora Aby utworzyć formularz za pomocą kreatora, należy skorzystać z polecenia Kreator formularzy z grupy Formularze na wstążce. Kreator formularzy wyświetla użytkownikom szereg zaprezentowanych wizualnie pytań dotyczących formularza, który ma zostać utworzony, a następnie generuje go automatycznie. Kreator formularzy pozwala na wybór pól występujących w formularzu, ich układu (Kolumnowy, Tabelaryczny, Arkusz danych, Wyjustowany) oraz tytułu formularza. Aby uruchomić kreator formularzy na podstawie tabeli tblCustomers, wykonaj następujące czynności:
Rozdział 17. Tworzenie prostych formularzy
467
1. Wybierz tabelę tblCustomers w okienku nawigacji. 2. Kliknij zakładkę TWORZENIE na wstążce. 3. Kliknij polecenie Kreator formularzy w grupie Formularze. Access uruchomi kreator formularzy pokazany na rysunku 17.3. Rysunek 17.3. Za pomocą Kreatora formularzy można utworzyć formularz na podstawie pól wybranych przez użytkownika
Kreator wstępnie wypełnia formularz polami z tabeli tblCustomers. Można jednak wybrać inną tabelę lub kwerendę, posługując się rozwijaną listą Tabele/Kwerendy nad obszarem wyboru pól. Za pomocą przycisków w środkowej części formularza można dodawać bądź usuwać pola do list Dostępne pola i Zaznaczone pola. Można także kliknąć dwukrotnie dowolne pole na liście Dostępne pola, aby przenieść je na listę Zaznaczone pola.
Grupa przycisków w dolnej części formularza umożliwia poruszanie się pomiędzy poszczególnymi etapami działania kreatora. Przyciski dostępne w tej części są wspólne dla większości okien dialogowych kreatorów:
Anuluj — anulowanie działania kreatora bez utworzenia formularza.
Wstecz — powrót do poprzedniego kroku kreatora.
Dalej — przejście do następnego kroku kreatora.
Zakończ — zakończenie działania kreatora i utworzenie formularza na podstawie bieżących ustawień. W przypadku kliknięcia przycisku Dalej lub Zakończ bez wybrania żadnego z pól Access poinformuje, że kontynuacja wymaga wybrania pól formularza.
468
Część V Formularze i raporty Accessa
Kliknięcie przycisku Dalej powoduje otwarcie drugiego okna dialogowego kreatora (pokazanego na rysunku 17.4). Można w nim określić ogólny układ i wygląd nowego formularza. Rysunek 17.4. Wybór układu nowego formularza
Układ Kolumnowy jest ustawieniem domyślnym, można jednak wybrać także jedną z pozostałych opcji: Tabelaryczny, Arkusz danych i Wyjustowany. Kliknięcie przycisku Dalej powoduje otwarcie ostatniego okna dialogowego kreatora (zobacz rysunek 17.5). W tym oknie należy podać nazwę nowego formularza. Rysunek 17.5. Zapisywanie nowego formularza
Największą zaletą korzystania z kreatora formularzy są ułatwienia w postaci powiązania nowego formularza ze źródłem danych oraz dodania formantów dla wybranych pól. Jednak w większości przypadków użytkownik musi wykonać sporo pracy już po zakończeniu działania kreatora formularzy.
Rozdział 17. Tworzenie prostych formularzy
469
Specjalne typy formularzy W środowisku Accessa słowo formularz, w zależności od kontekstu, może mieć różne znaczenia. W niniejszym punkcie zaprezentowano różne sposoby wykorzystywania formularzy w Accessie i przykłady użycia w każdym zastosowaniu. Formularze nawigacji W Accessie 2010 wprowadzono całkowicie nowy typ formularza, spełniający funkcję narzędzia nawigacyjnego dla użytkowników. Formularze nawigacji zawierają zbiór zakładek oferujących natychmiastowy dostęp do dowolnej liczby innych formularzy w układzie formularz/podformularz. Przycisk Nawigacja na wstążce daje dostęp do zbioru przycisków określających opcje rozmieszczenia zakładek (zobacz rysunek 17.6). Opcja domyślna to Karty poziome.
Rysunek 17.6. Przycisk Nawigacja daje dostęp do różnych opcji rozmieszczenia zakładek
Wybranie opcji rozmieszczenia zakładek z rozwijanej listy Nawigacja powoduje otwarcie nowego formularza nawigacji w widoku projektu (zobacz rysunek 17.7). Nowy formularz zawiera wiersz zakładek w górnej części okna oraz duży obszar pod nimi umożliwiający osadzanie podformularzy. Nazwę zakładki (np. Produkty) wpisuje się bezpośrednio na zakładce. Można też ją dodać za pomocą właściwości Tytuł. Po wprowadzeniu tytułu zakładki Access dodaje nową pustą zakładkę z prawej strony bieżącej zakładki. Na rysunku 17.7 wybrano opcję Karty poziome jako szablon formularza nawigacji i przypisano zakładce nazwę Produkty. W efekcie pojawiła się nowa zakładka Dodaj nowy. Alternatywy opcji Karty poziome (np. Karty pionowe, z lewej i Karty pionowe, z prawej) są widoczne na rysunku 17.6. Arkusz właściwości zakładki (zobacz rysunek 17.8) zawiera właściwość Nazwa elementu docelowego nawigacji. Służy ona do wskazania formularza Accessa, który będzie pełnił funkcję podformularza zakładki. Należy wybrać formularz z listy rozwijanej Nazwa elementu docelowego nawigacji, aby Access utworzył skojarzenie z podformularzem.
470
Część V Formularze i raporty Accessa
Rysunek 17.7. Formularz nawigacji zawiera duży obszar do osadzania podformularzy
Rysunek 17.8. Właściwość Nazwa elementu docelowego nawigacji służy do wskazywania podformularza powiązanego z zakładką
Rozdział 17. Tworzenie prostych formularzy
471
Kompletny formularz nawigacji pokazano na rysunku 17.9. Automatycznie wygenerowany formularz nawigacji zapewnia nowatorski sposób wykorzystania przestrzeni na ekranie. Można go ulepszyć, na przykład usuwając sekcję nagłówka, zmieniając nazwy pól albo zmniejszając puste miejsce otaczające podformularz. Formularz frmProducts pokazany na rysunku 17.9 jest dołączony do przykładowej bazy danych Rozdział17.accdb.
Rysunek 17.9. Formularz nawigacji to szybki i prosty sposób utworzenia mechanizmu do poruszania się po bazie danych
Formularze Wiele elementów Aby utworzyć formularz typu „wiele elementów” na podstawie tabeli lub kwerendy wybranej w okienku nawigacji, należy skorzystać z polecenia Wiele elementów dostępnego po kliknięciu przycisku Więcej formularzy z grupy Formularze na wstążce. Formularz w postaci tabelarycznej przypomina arkusz danych, choć jest znacznie bardziej atrakcyjny od prostego arkusza. Ponieważ formularz w postaci tabeli jest zwyczajnym formularzem Accessa, można przekształcić domyślne pola tekstowe w formularzu w pola kombi i inne zaawansowane formanty. Ze względu na to, że formularze „wiele elementów” wyświetlają jednocześnie wiele rekordów, są bardzo przydatne przy przeglądaniu bądź aktualizowaniu wielu rekordów jednocześnie. Aby utworzyć formularz „wiele elementów” na podstawie tabeli tblProducts, wykonaj następujące czynności: 1. Wybierz tabelę tblProducts w okienku nawigacji.
472
Część V Formularze i raporty Accessa
2. Kliknij zakładkę TWORZENIE na wstążce. 3. Kliknij przycisk Więcej formularzy, a następnie kliknij pozycję Wiele elementów. Access utworzy nowy formularz „wiele elementów” na podstawie tabeli tblProducts i wyświetli go w widoku układu (zobacz rysunek 17.10).
Rysunek 17.10. Aby przeglądać rekordy tak jak w arkuszu danych, można stworzyć formularz „wiele elementów”
Formularz dzielony Aby utworzyć formularz dzielony na podstawie tabeli lub kwerendy wybranej w okienku nawigacji, należy skorzystać z polecenia Formularz dzielony dostępnego po kliknięciu przycisku Więcej formularzy z grupy Formularze na wstążce. Formularz dzielony umożliwia użytkownikom przeglądanie danych w dwóch widokach jednocześnie. W dolnej części można wybrać rekord z arkusza danych i edytować informacje w formularzu wyświetlającym się w górnej części. Aby utworzyć formularz dzielony na podstawie tabeli tblCustomers, wykonaj następujące czynności: 1. Wybierz tabelę tblCustomers w okienku nawigacji. 2. Kliknij zakładkę TWORZENIE na wstążce. 3. Kliknij przycisk Więcej formularzy, a następnie kliknij pozycję Formularz dzielony. Access utworzy nowy formularz dzielony na podstawie tabeli tblCustomers i wyświetli go w widoku układu (zobacz rysunek 17.11). Aby dolna część formularza stała się całkowicie widoczna, można zmienić rozmiar formularza, a następnie skorzystać z paska podziału wyświetlającego się w środkowej części formularza.
Rozdział 17. Tworzenie prostych formularzy
473
Rysunek 17.11. Aby wybierać rekordy z listy i edytować w formularzu, należy utworzyć formularz dzielony. Pasek podziału służy do zmiany rozmiaru górnej i dolnej części formularza
Właściwość Orientacja arkusza dzielonego (dostępna w zakładce Format w Arkuszu właściwości) de