Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00430 007328 10472188 na godz. na dobę w sumie
Access. Analiza danych. Receptury - książka
Access. Analiza danych. Receptury - książka
Autor: , Liczba stron: 360
Wydawca: Helion Język publikacji: polski
ISBN: 978-83-246-1285-7 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> bazy danych >> access
Porównaj ceny (książka, ebook, audiobook).
Korzystaj z bazy danych Access jak profesjonalista!

Access to znane już narzędzie służące do wszechstronnego przetwarzania i analizy danych. Posiada sporo ukrytych mechanizmów, pozwalających efektywnie wykonywać zadania, które początkowo mogą wydawać się skomplikowane. Książka przedstawia przykłady kwerend, metody przenoszenia danych pomiędzy bazami Access, obliczania wielu wskaźników finansowo-biznesowych i sporo innych zagadnień - wszystko pod kątem analizy i przetwarzania danych. Każda zaprezentowana receptura jest opatrzona kompletnym opisem rozwiązania problemu wraz ze szczegółowym omówieniem metody postępowania oraz analizą kodu.

Access. Analiza danych. Receptury to uniwersalny podręcznik przeznaczony zarówno dla początkujących użytkowników bazy danych Access, jak i doświadczonych. Dzięki przejrzystemu językowi i mnogości poruszonych zagadnień każdy, niezależnie od stopnia zaawansowania, może poszerzyć swoją wiedzę. Zawiera mnóstwo ciekawych wskazówek i technik ułatwiających codzienną pracę z bazami danych, co czyni ją atrakcyjną nawet dla osób doskonale posługujących się bazą Access. Jest to także kompendium wiedzy niezbędnej każdemu, kto chce wyciągać ze zbiorów danych naprawdę cenne informacje.

Baza danych to fundament biznesu - zobacz, jak efektywnie nią zarządzać!

Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

Access. Analiza danych. Receptury Autor: Ken Bluttman, Wayne Freeze T‡umaczenie: Grzegorz Kowalczyk ISBN: 978-83-246-1285-7 Tytu‡ orygina‡u: Access Data Analysis Cookbook Format: B5, stron: 360 Korzystaj z bazy danych Access jak profesjonalista! (cid:149) Jak stosowa(cid:230) wska(cid:159)niki statystyczne do analizy danych biznesowych? (cid:149) Jak rozszerza(cid:230) funkcjonalno(cid:156)(cid:230) zapytaæ SQL, stosuj„c skrypty VBA? (cid:149) Jak przetwarza(cid:230) dane i przenosi(cid:230) je miŒdzy bazami Access? Access to znane ju¿ narzŒdzie s‡u¿„ce do wszechstronnego przetwarzania i analizy danych. Posiada sporo ukrytych mechanizm(cid:243)w, pozwalaj„cych efektywnie wykonywa(cid:230) zadania, kt(cid:243)re pocz„tkowo mog„ wydawa(cid:230) siŒ skomplikowane. Ksi„¿ka przedstawia przyk‡ady kwerend, metody przenoszenia danych pomiŒdzy bazami Access, obliczania wielu wska(cid:159)nik(cid:243)w finansowo-biznesowych i sporo innych zagadnieæ (cid:150) wszystko pod k„tem analizy i przetwarzania danych. Ka¿da zaprezentowana receptura jest opatrzona kompletnym opisem rozwi„zania problemu wraz ze szczeg(cid:243)‡owym om(cid:243)wieniem metody postŒpowania oraz analiz„ kodu. Access. Analiza danych. Receptury to uniwersalny podrŒcznik przeznaczony zar(cid:243)wno dla pocz„tkuj„cych u¿ytkownik(cid:243)w bazy danych Access, jak i do(cid:156)wiadczonych. DziŒki przejrzystemu jŒzykowi i mnogo(cid:156)ci poruszonych zagadnieæ ka¿dy, niezale¿nie od stopnia zaawansowania, mo¿e poszerzy(cid:230) swoj„ wiedzŒ. Zawiera mn(cid:243)stwo ciekawych wskaz(cid:243)wek i technik u‡atwiaj„cych codzienn„ pracŒ z bazami danych, co czyni j„ atrakcyjn„ nawet dla os(cid:243)b doskonale pos‡uguj„cych siŒ baz„ Access. Jest to tak¿e kompendium wiedzy niezbŒdnej ka¿demu, kto chce wyci„ga(cid:230) ze zbior(cid:243)w danych naprawdŒ cenne informacje. (cid:149) Tworzenie kwerend r(cid:243)¿nych typ(cid:243)w (cid:149) Wstawianie, aktualizacja i usuwanie danych (cid:149) Przetwarzanie tekstu i liczb zapisanych w formie ‡aæcucha znak(cid:243)w (cid:149) Zastosowanie tabel, modyfikacja zawarto(cid:156)ci systemu Windows, szyfrowanie danych (cid:149) Wykorzystanie obiektu FileSystemObject, przetwarzanie danych XML oraz XSLT, komunikacja z bazami SQL (cid:149) Rozwi„zywanie problem(cid:243)w biznesowych (cid:149) Obliczanie wska(cid:159)nik(cid:243)w statystycznych Baza danych to fundament biznesu (cid:150) zobacz, jak efektywnie ni„ zarz„dza(cid:230)! Wydawnictwo Helion ul. Ko(cid:156)ciuszki 1c 44-100 Gliwice tel. 032 230 98 63 e-mail: helion@helion.pl Spis treści Przedmowa ...............................................................................................................................9 1. Tworzenie kwerend .................................................................................................... 15 15 18 21 23 25 29 32 36 38 43 46 49 50 52 54 1.1. Wyszukiwanie niedopasowanych rekordów 1.2. Zastosowanie operatorów AND i OR 1.3. Kryteria wykorzystujące operator IN 1.4. Wyłączanie rekordów z zapytania przy użyciu operatora NOT 1.5. Parametryzacja zapytań 1.6. Zwracanie n rekordów z górnej lub dolnej części zakresu wyszukiwania 1.7. Zwracanie unikatowych rekordów 1.8. Zwracanie losowo wybranych rekordów 1.9. Dostrajanie wyszukiwania przy użyciu podzapytań 1.10. Łączenie danych za pomocą operacji UNION 1.11. Dynamiczne wstawianie pól w kwerendzie wybierającej 1.12. Zastosowanie aliasów do upraszczania wyrażeń SQL 1.13. Lewe sprzężenie zewnętrzne — tworzenie i zastosowanie 1.14. Prawe sprzężenie zewnętrzne — tworzenie i zastosowanie 1.15. Tworzenie pełnego sprzężenia zewnętrznego 2. Obliczenia w kwerendach ...........................................................................................57 57 60 62 64 68 71 75 2.1. Obliczanie sum i wartości średnich zbioru danych 2.2. Obliczanie liczby elementów w danej grupie 2.3. Zastosowanie wyrażeń w kwerendach 2.4. Zastosowanie funkcji własnych w kwerendach 2.5. Zastosowanie wyrażeń regularnych w kwerendach 2.6. 2.7. Tworzenie i zastosowanie kwerend krzyżowych Iloczyn kartezjański, czyli jak otrzymać wszystkie kombinacje danych 3 3. Kwerendy funkcjonalne .............................................................................................. 81 81 86 91 95 3.1. Kwerendy aktualizujące 3.2. Dołączanie danych 3.3. Usuwanie danych 3.4. Kwerendy tworzące tabele 4. Zarządzanie tabelami, polami, indeksami i kwerendami ..........................................99 99 106 109 111 112 4.1. Programowe tworzenie tabel 4.2. Modyfikacja struktury tabeli 4.3. Tworzenie i zastosowanie indeksów 4.4. Programowe usuwanie tabel 4.5. Programowe tworzenie kwerend 5. Przetwarzanie ciągów znaków .................................................................................115 5.1. Wyodrębnianie wybranej liczby znaków z lewej lub prawej strony ciągu alfanumerycznego 5.2. Wyodrębnianie znaków z łańcucha znaków, kiedy znana jest pozycja początkowa i długość 5.3. Określanie pozycji początkowej znanego podciągu znaków 5.4. Obcinanie spacji z końca łańcucha znaków 5.5. Usuwanie spacji z wnętrza łańcucha znaków 5.6. Zamiana jednego łańcucha znaków na inny 5.7. Konkatenacja łańcuchów znaków 5.8. 5.9. Kategoryzacja znaków na podstawie kodów ASCII Sortowanie liczb zapisanych w postaci tekstowej 115 117 118 120 123 124 126 129 132 6. Programowe przetwarzanie danych ........................................................................ 135 135 140 143 146 150 154 156 159 163 165 168 171 174 177 180 6.1. Wykorzystywanie funkcji programu Excel z poziomu bazy Access 6.2. Przetwarzanie danych przechowywanych w pamięci 6.3. Zastosowanie tablic wielowymiarowych 6.4. Sortowanie tablic 6.5. Spłaszczanie struktury danych 6.6. Rozszerzanie struktury danych 6.7. 6.8. Wyszukiwanie wartości zbliżonych do wzorca 6.9. Przetwarzanie transakcyjne 6.10. Odczytywanie i zapisywanie danych z rejestrów systemu Windows 6.11. Przetwarzanie kodu HTML stron sieci WWW 6.12. Formatowanie raportów definiowanych przez użytkownika 6.13. Zaokrąglanie wartości 6.14. Korespondencja seryjna 6.15. Tworzenie formularzy budowania kwerend Szyfrowanie danych 4 | Spis treści 7. Import i eksport danych ............................................................................................ 185 7.1. Tworzenie specyfikacji importu lub eksportu 185 191 7.2. Automatyzacja operacji importu i eksportu danych 194 7.3. Eksportowanie danych przy użyciu obiektu FileSystemObject 7.4. Importowanie danych przy użyciu obiektu FileSystemObject 196 201 7.5. Importowanie i eksportowanie plików przy użyciu XML 204 7.6. Generowanie schematów XML 206 7.7. Zastosowanie języka XSLT w operacjach importu i eksportu danych 7.8. Wykorzystanie XML za pośrednictwem parsera MSXML 209 213 7.9. Odczytywanie i zapisywanie atrybutów XML 215 7.10. Tworzenie źródeł danych RSS 7.11. Przekazywanie parametrów do bazy danych SQL Server 218 7.12. Obsługa wartości zwracanych przez procedury osadzone bazy SQL Server 220 221 7.13. Praca z typami danych bazy SQL Server 223 7.14. Obsługa osadzonych znaków cudzysłowu 7.15. 224 227 7.16. 229 7.17. 232 7.18. 7.19. Eksportowanie danych do programu Excel 235 237 7.20. Współpraca z programem PowerPoint 7.21. Wybieranie danych losowych 240 Importowanie kalendarza spotkań z programu Outlook Importowanie wiadomości poczty elektronicznej z programu Outlook Importowanie listy kontaktów z programu Outlook Importowanie danych z programu Excel 8. Obliczanie daty i czasu ..............................................................................................243 243 247 249 252 253 256 257 8.1. Obliczanie czasu 8.2. Obliczanie czasu z uwzględnieniem wyjątków 8.3. Przeliczanie stref czasowych 8.4. Lata przestępne w obliczeniach 8.5. Rozkładanie dat na elementy składowe 8.6. Rozkładanie czasu na elementy składowe 8.7. Dodawanie wartości reprezentujących czas 9. Obliczenia biznesowo-finansowe ............................................................................ 261 261 263 264 266 267 270 272 274 9.1. Obliczanie średniej ważonej 9.2. Obliczanie średniej kroczącej 9.3. Obliczanie okresów zwrotu inwestycji 9.4. Obliczanie stopy zwrotu inwestycji 9.5. Obliczanie amortyzacji liniowej 9.6. Tworzenie harmonogramu spłaty kredytu 9.7. Zastosowanie tabel przestawnych i wykresów przestawnych 9.8. Tworzenie tabel przestawnych Spis treści | 5 9.9. Prezentacja danych na wykresach 9.10. Odszukiwanie trendów danych 9.11. Znajdowanie formacji „głowa i ramiona” 9.12. Wyznaczanie wstęg Bollingera 9.13. Obliczanie odległości na podstawie kodów pocztowych 279 281 285 295 298 10. Obliczenia statystyczne ............................................................................................305 10.1. Tworzenie histogramów 305 10.2. Obliczanie i porównywanie średniej, mediany oraz dominanty 308 10.3. Obliczanie wariancji zbioru danych 311 10.4. Obliczanie kowariancji dwóch zbiorów danych 314 10.5. Obliczanie korelacji dwóch zbiorów danych 315 10.6. Wyznaczanie wszystkich permutacji elementów zbioru danych 316 10.7. Wyznaczanie wszystkich możliwych kombinacji elementów zbioru danych 319 321 10.8. Obliczanie częstości występowania wartości w zbiorze danych 322 10.9. Obliczanie rocznej stopy wzrostu 10.10. Obliczanie funkcji rozkładu prawdopodobieństwa dla zbioru danych 325 327 10.11. Obliczanie wartości kurtozy 331 10.12. Obliczanie współczynnika asymetrii krzywej rozkładu zbioru danych 10.13. Procentowy podział zakresu wartości zbioru danych 333 335 10.14. Określanie rangi wartości poszczególnych elementów danych 336 10.15. Obliczanie współczynników regresji liniowej 10.16. Wyznaczanie zmienności danych 338 Skorowidz .............................................................................................................................343 6 | Spis treści ROZDZIAŁ 3. Kwerendy funkcjonalne Kwerendy dzielimy na pasywne i funkcjonalne. Kwerendy pasywne, takie jak standardowe kwe- rendy wybierające, zwracają zestawy rekordów spełniających kryteria wyszukiwania, ale w żaden sposób nie modyfikują danych (kwerendy pasywne nie modyfikują danych w tabelach źródło- wych ani nie przechowują zwracanych rekordów dłużej niż dana kwerenda jest aktywna). Kwerendy aktywne mogą modyfikować dane źródłowe, a zestawy rekordów zwracanych przez takie kwerendy mogą być dostępne w nieskończoność. Na przykład kwerenda usuwająca, jak sama nazwa wskazuje, usuwa rekordy z tabel źródłowych bazy danych — jest to procedura cał- kowicie niszcząca dane. Jeżeli takie usunięte informacje nie zostały wcześniej zapisane w kopii bezpieczeństwa, to ich odzyskanie nie będzie możliwe. Kwerendy aktualizujące również mogą modyfikować dane źródłowe, zmieniając informacje przechowywane w poszczególnych rekor- dach — podobnie jak w przypadku kwerend usuwających, jeżeli aktualizowane rekordy nie zostały wcześniej zapisane w kopii bezpieczeństwa, to po ich aktualizacji przywrócenie poprzed- nich wartości nie będzie możliwe. Kwerendy dołączające oraz kwerendy tworzące tabele należą do grupy kwerend funkcjonal- nych, które nie modyfikują danych źródłowych, ale za to powodują, że zwracane rekordy są przechowywane dłużej, niż wynosi czas aktywności kwerendy. Kwerendy dołączające dodają zwracane rekordy do istniejących tabel, a kwerendy tworzące tabele umieszczają zwracane rekordy w nowych tabelach. W tym rozdziale będziemy szczegółowo omawiali wszystkie cztery rodzaje kwerend funkcjonalnych. 3.1. Kwerendy aktualizujące Opis problemu Mamy daną tabelę, której rekordy wymagają modyfikacji. Pole Nazwa stanu przechowuje dwu- literowe skróty nazw stanów. Naszym zadaniem jest zamiana tych skrótów na pełne nazwy stanów. Jak tego dokonać? 81 Rozwiązanie Rozwiązaniem problemu będzie zastosowanie kwerendy aktualizującej, którą możemy w prosty sposób utworzyć z poziomu widoku projektu kwerendy. Aby tego dokonać, należy po przełą- czeniu do widoku projektu kwerendy wybrać z menu głównego polecenie Kwerenda/Kwerenda aktualizująca, co spowoduje odpowiednie przygotowanie siatki projektu kwerendy. W wersji Access 2007 należy najpierw przy użyciu Wstążki utworzyć pusty projekt kwerendy, a następnie na karcie Projektowanie w grupie Typ kwerendy kliknąć polecenie Aktualizuj. Po utworzeniu kwerendy aktualizującej w siatce projektu kwerendy pojawi się dodatkowy wiersz o nazwie Aktualizacja do, natomiast znikną wiersze Sortuj i Pokaż znane z kwerend wybierających. Na rysunku 3.1 przedstawiono projekt kwerendy aktualizującej, której zadaniem jest zastąpienie w polu Nazwa stanu wszystkich wystąpień akronimu NY na pełną nazwę New York. Rysunek 3.1. Prosta kwerenda aktualizująca Zwróćmy uwagę, że w wierszu Kryteria znajduje się wartość NY — jest to wartość, która będzie poszukiwana i zamieniana na nową. Wartość wpisana w wierszu Aktualizacja do — New York — to nowa wartość, która zastąpi wartość poszukiwaną. Odpowiednie użycie kryteriów ma tutaj ogromne znaczenie, bo przecież chcemy zmodyfikować tylko rekordy, które w polu Nazwa stanu mają wartość NY. Kwerenda aktualizująca nie musi posiadać klauzuli Where (która odpowiednio filtruje rekordy i pozwala na aktualizację tylko tych, które są zgodne z podanym wzorcem wyszukiwania) — kwerenda aktualizująca może aktualizować wszystkie rekordy w bazie. W pewnych sytuacjach taki zakres działania kwerendy może być bardzo pożądany, ale w naszym przykładzie aktuali- zacja wszystkich rekordów w tabeli klientów byłaby prawdziwą katastrofą (jak pamiętamy, jeżeli nie mamy kopii zapasowej tabeli, to nie możemy anulować zmian wprowadzonych przez kwe- rendę aktualizującą i przywrócić poprzedniej zawartości tabeli). Po uruchomieniu kwerendy na ekranie pojawi się okno dialogowe z prośbą o potwierdzenie zamiaru wykonania takiej operacji, przedstawione na rysunku 3.2. Aby kontynuować, należy nacisnąć przycisk Tak. 82 | Rozdział 3. Kwerendy funkcjonalne Rysunek 3.2. Okno dialogowe z prośbą o potwierdzenie zamiaru wykonania aktualizacji Przedstawiona powyżej kwerenda aktualizuje nazwę tylko jednego stanu. Jest to rozwiązanie do przyjęcia, aczkolwiek uruchamianie podobnej kwerendy aktualizującej 50 razy (po jednej kwe- rendzie aktualizującej dla każdego stanu) może być dosyć czasochłonne i nużące. Na szczęście istnieją również bardziej efektywne metody. Jednym z możliwych rozwiązań jest wywołanie z poziomu kwerendy własnej funkcji prze- twarzającej dane. W naszym przypadku taka funkcja powinna pobierać akronim nazwy sta- nu i zwracać jego pełną nazwę. Poniżej przedstawiamy przykładowy kod takiej funkcji: Function new_state_name(current_state_name As String) As String new_state_name = current_state_name If current_state_name = NY Then new_state_name = New York If current_state_name = CT Then new_state_name = Connecticut If current_state_name = MA Then new_state_name = Massachusetts If current_state_name = CA Then new_state_name = California End Function Jak widać, dla uproszczenia w kodzie naszej przykładowej funkcji zakodowaliśmy zaledwie kilka akronimów nazw stanów, ale oczywiście nic nie stoi na przeszkodzie, aby umieścić tam wszystkie 50 nazw stanów (bądź równie dobrze tylko niektóre, wybrane nazwy stanów). Kodo- wanie wszystkich 50 stanów może być nieco żmudnym zajęciem, ale przynajmniej w efekcie otrzymamy dosyć uniwersalną, w pełni użyteczną funkcję. Pierwszy wiersz kodu funkcji ustawia wynik działania funkcji na wartość będącą argumentem funkcji (bieżący akronim nazwy stanu), dzięki czemu jeżeli pełna nazwa stanu nie zostanie odna- leziona, funkcja zwróci akronim nazwy stanu i w zasadzie w takim rekordzie nic się nie zmieni. Jeżeli jednak akronim będący argumentem funkcji pasuje do któregoś z poleceń If, funkcja jako wynik swojego działania zwraca pełną nazwę stanu. Na rysunku 3.3 przedstawiono wygląd siatki projektu takiej kwerendy aktualizującej. Zwróćmy uwagę na fakt, że tym razem nie mamy ustawionych żadnych kryteriów. Brak kryteriów wyszu- kiwania wynika z prostego faktu, że chcemy przetwarzać wszystkie rekordy tabeli. Sama funkcja wywoływana jest w wierszu Aktualizacja do, a jako argumentu wywołania funkcji używamy wartości pola Nazwa stanu. Wyniki działania kwerendy przedstawiono na rysunku 3.4. Jak widać, dla tych stanów, które zostały w funkcji odpowiednio zakodowane przy użyciu poleceń If, akronimy zostały zastąpione pełnymi nazwami stanów; dla wszystkich pozostałych stanów oryginalne akronimy nie zostały zaktualizowane. Jeszcze innym sposobem dokonania konwersji akronimów na pełne nazwy stanów jest zastoso- wanie wbudowanej funkcji Dlookup. W naszym przykładzie użyjemy tabeli Stany, przechowu- jącej nazwy stanów. Tabela posiada dwa pola: Akronim oraz Pełna nazwa stanu. Wygląd tej tabeli został przedstawiony na rysunku 3.5. 3.1. Kwerendy aktualizujące | 83 Rysunek 3.3. Zastosowanie własnej funkcji w kwerendzie aktualizującej Rysunek 3.4. Wyniki działania kwerendy aktualizującej Rysunek 3.5. Tabela przechowująca pełne nazwy stanów i ich akronimy 84 | Rozdział 3. Kwerendy funkcjonalne Wygląd siatki projektu kwerendy został przedstawiony na rysunku 3.6. Rysunek 3.6. Kwerenda aktualizująca z funkcją DlookUp Wywołanie funkcji DlookUp następuje w wierszu Aktualizacja do i wygląda następująco: DLookUp( [Pełna nazwa stanu] ; Stany ; [Akronim]= [Nazwa stanu] ) Pełna nazwa stanu oraz Akronim to nazwy dwóch pól tabeli Stany, a Nazwa stanu to pole w tabeli Klienci. W tabeli Stany każdy stan posiada swój rekord przechowujący pełną nazwę stanu oraz jej akronim. Dzięki takiemu rozwiązaniu po uruchomieniu nasza kwerenda dokona zamiany akronimów na pełne nazwy dla wszystkich 50 stanów (pod warunkiem oczywiście, że w tabeli Stany nie ma żadnych błędów). Omówienie Wszystkie kwerendy aktualizujące, o których mówiliśmy do tej pory, pracowały tylko na jednym polu tabeli. Kod SQL kwerendy przedstawionej na rysunku 3.1 jest krótki i wygląda następująco: UPDATE Klienci SET Klienci.[Nazwa stanu] = New York WHERE (((Klienci.[Nazwa stanu])= NY )); Kod SQL kwerendy aktualizującej zawsze rozpoczyna się od słowa kluczowego UPDATE, po którym następuje nazwa tabeli i klauzula SET wskazująca pole, które będzie aktualizowane (jednocześnie możemy aktualizować więcej niż jedno pole, o czym będziemy mówić już za chwilę). Dowolne kryteria wyszukiwania używane do ograniczenia liczby aktualizowanych rekordów są definiowane w klauzuli WHERE. Kryteria wyszukiwania nie muszą bazować na polu, które jest aktualizowane. W poprzednim przykładzie kryteria wyszukiwania operowały co prawda na aktualizowanym polu, ale porów- najmy kod poprzedniej kwerendy z następującym zapytaniem SQL: UPDATE Klienci SET Klienci.[Nazwa stanu] = New York WHERE (((Klienci.Miasto)= New York City )); W tym przykładzie pole Nazwa stanu jest aktualizowane tylko dla tych rekordów, w których pole Miasto ma wartość New York City. 3.1. Kwerendy aktualizujące | 85 Jedna kwerenda może aktualizować dowolną ilość pól, aczkolwiek należy pamiętać o tym, że dla wszystkich pól obowiązują te same kryteria wyszukiwania zdefiniowane w kwerendzie. Na rysunku 3.7 przedstawiono projekt kwerendy, która dla wszystkich klientów mających status Nieaktywny ustawia wartość trzech pól na Pusty. Rysunek 3.7. Kwerenda aktualizująca kilka pól jednocześnie Kod SQL kwerendy przedstawionej powyżej wygląda następująco: UPDATE Klienci_Status SET Klienci_Status.[Nazwa klienta] = Pusty , Klienci_Status.Miasto = Pusty , Klienci_Status.[Nazwa stanu] = Pusty WHERE (((Klienci_Status.Status)= Nieaktywny )); Zgodnie z wymogami składni języka SQL kwerenda rozpoczyna się od słowa kluczowego UPDATE, po którym następuje nazwa tabeli i klauzula SET. Następnie wymieniane są wszystkie pola, którym przypisywane są nowe wartości. Kod kwerendy kończy klauzula WHERE definiu- jąca kryteria wyszukiwania (o ile oczywiście takie kryteria zostały zdefiniowane). 3.2. Dołączanie danych Opis problemu Chcemy, aby rekordy zwracane przez daną kwerendę były dołączane do innej tabeli. Jak można tego dokonać? Rozwiązanie Bardzo często spotykamy się z koniecznością archiwizacji starszych danych, zakończonych trans- akcji i innych tego typu informacji. Zazwyczaj takie operacje są realizowane poprzez przenie- sienie odpowiednich rekordów do innych tabel przechowujących zarchiwizowane czy też histo- ryczne dane. Takie tabele mają zazwyczaj identyczną strukturę jak tablice źródłowe, dzięki czemu przenoszenie rekordów pomiędzy nimi jest bardzo proste i wygodne. Warto jednak pamiętać o tym, że nie jest to żaden twardy wymóg — tabele przechowujące dane archiwalne mogą mieć 86 | Rozdział 3. Kwerendy funkcjonalne dodatkowe pola, w których umieszczane są takie informacje jak data przeniesienia rekordu do archiwum, kto zatwierdził archiwizację danego rekordu i tak dalej. Prawdziwym wołem roboczym takich rozwiązań jest jedna z kwerend funkcjonalnych — kwe- renda dołączająca (ang. append query). Jak sama nazwa wskazuje, kwerenda dołączająca dodaje rekordy do istniejącej tabeli. Bardzo często dołączane rekordy są pobierane z innej tabeli, ale równie dobrze dołączane rekordy mogą być generowane przez jakiś proces, wartości poszcze- gólnych pól mogą być wyliczane bądź nawet mogą być pobierane z tej samej tabeli. Dołączając do tabeli rekordy pobierane z tej samej tabeli, należy uważać, aby nie doszło do dublowania wartości unikalnego klucza tabeli. Na rysunku 3.8 przedstawiono tabelę Transakcje przechowującą informacje o transakcjach doko- nywanych przez poszczególnych klientów. Rekordy opisują transakcje przeprowadzane w róż- nych dniach, opiewające na różne kwoty i posiadające różne statusy. Rysunek 3.8. Tabela przechowująca informacje o transakcjach Jednym z zadań, które są często wykonywane w takich sytuacjach, jest wyczyszczenie tabeli ze starych rekordów opisujących zakończone transakcje. Załóżmy, że mamy do dyspozycji drugą tabelę, ArchiwumTransakcji, która przechowuje takie rekordy. W prosty sposób możemy teraz utworzyć projekt kwerendy, która odfiltruje zakończone transakcje i umożliwi przeniesienie ich do archiwum. Na rysunku 3.9 przedstawiono wygląd projektu kwerendy dołączającej, wyszu- kującej rekordy mające datę transakcji wcześniejszą niż 2006-04-01 i status Zrealizowana. Uruchomienie tej kwerendy spowoduje umieszczenie takich rekordów w tabeli ArchiwumTrans- akcji (na rysunku 3.9 nie widać tego wprost, ale tabela ArchiwumTransakcji została wybrana z listy Nazwa tabeli podczas tworzenia kwerendy dołączającej w oknie dialogowym Dołączanie). 3.2. Dołączanie danych | 87 Rysunek 3.9. Projekt kwerendy dołączającej Jeżeli struktura tabeli ArchiwumTransakcji jest identyczna jak tabeli Transakcje, to w wierszu Do- łączanie do nazwy odpowiednich pól pojawią się automatycznie. Jeżeli dołączamy rekordy do tabeli o innej strukturze, to musimy ręcznie wybrać odpowiednie pola źródłowe i dopasować do nich pola docelowe. Kod SQL kwerendy dołączającej przedstawionej na rysunku 3.9 wygląda następująco: INSERT INTO ArchiwumTransakcji ( [ID klienta], [Data transakcji], [Kwota transakcji], Status ) SELECT Transakcje.[ID klienta], Transakcje.[Data transakcji], Transakcje.[Kwota transakcji], Transakcje.Status FROM Transakcje WHERE (((Transakcje.[Data transakcji]) #2006-04-01#) AND ((Transakcje.Status)= Zrealizowana )); Kod SQL kwerendy dołączającej rozpoczyna się od słów kluczowych INSERT INTO, po których następuje nazwa tabeli docelowej oraz umieszczona w nawiasach lista pól tabeli docelowej. Na- stępnie w składni kwerendy pojawia się wyrażenie SELECT, które pobiera odpowiednie rekordy z tabeli źródłowej (w naszym przypadku jest to tabela Transakcje), zgodnie ze zdefiniowanymi kryteriami wyszukiwania. Warto zwrócić uwagę na fakt, że ilość pól wybranych z tabeli źró- dłowej musi odpowiadać ilość pól w tabeli docelowej. Kwerenda dołączająca nie musi opero- wać na wszystkich polach tabeli źródłowej. Po uruchomieniu naszej kwerendy rekordy są dodawane do tabeli ArchiwumTransakcji. Ale to dopiero połowa całej historii — wybrane rekordy zostały skopiowane do tabeli archiwalnej, ale ich oryginały nadal istnieją w tabeli źródłowej. Aby je usunąć, musimy użyć odpowiedniej kwe- rendy usuwającej. Kwerendy usuwające zostaną szczegółowo omówione w podrozdziale 3.3. Omówienie Powyższy przykład dobrze ilustruje typowy sposób działania kwerend dołączających: pod- kwerenda wybiera z tabeli źródłowej odpowiednie rekordy, wyszukiwane w zależności od zde- finiowanych (bądź nie) kryteriów wyszukiwania i następnie wyszukane rekordy są dołączane do tabeli docelowej. 88 | Rozdział 3. Kwerendy funkcjonalne Teraz przyjrzymy się innej metodzie wstawiania rekordów do tabeli, w której zamiast pól z tabeli źródłowej do pól tabeli docelowej będziemy bezpośrednio wstawiali odpowiednie wartości. W przedstawionym poniżej kodzie SQL kwerendy dołączającej rolę tabeli docelowej nadal spełnia tabela ArchiwumTransakcji, ale tym razem do tabeli docelowej wstawiamy zako- dowane „na sztywno” wartości zdefiniowane w klauzuli VALUES. Warto zauważyć, że wstawiane wartości muszą być umieszczone w nawiasach. INSERT INTO ArchiwumTransakcji VALUES (2000, #2006-04-10#, 35.25, Zrealizowana ); Tworząc takie kwerendy dołączające, musimy pamiętać o następujących kluczowych elementach: • INSERT INTO nazwa tabeli to prawidłowy sposób rozpoczynania wyrażenia SQL. • Za pomocą klauzuli VALUES można „na sztywno” zakodować wartości wstawiane do tabeli. Poszczególne wartości muszą być odpowiednio dopasowane do typu poszczególnych pól w tabeli, do których są wstawiane. Wartości numeryczne nie potrzebują żadnych kwalifi- katorów i mogą być wstawiane bezpośrednio w kodzie SQL kwerendy jako liczby całkowite, rzeczywiste itd. (na przykład 2000 czy 35.25). Daty muszą być ujęte w znaki krzyżyka # (ang. hash), a tekst (ciągi alfanumeryczne) musi być ujęty w znaki apostrofu lub cudzysłowu (oba warianty są dopuszczalne). Cztery wartości użyte w kodzie SQL poprzedniego przykładu odpowiadają pod względem typu i kolejności czterem polom w tabeli docelowej, stąd nie istnieje tutaj konieczność definiowania listy pól. Warto jednak powiedzieć, że zdefiniowanie w takim przypadku listy pól nie jest żad- nym błędem, a co więcej, może być nawet rozwiązaniem preferowanym ze względu na większą przejrzystość kodu. W takim przypadku kod SQL kwerendy dołączającej wyglądałby następująco: INSERT INTO ArchiwumTransakcji ([ID klienta], [Data transakcji], [Kwota transakcji], Status) VALUES (2000, #2006-04-10#, 35.25, Zrealizowana ); Wyniki działania obu przedstawionych kwerend są identyczne. Zdefiniowanie nazw pól tabeli docelowej jest wymagane w sytuacji, kiedy wstawiane wartości nie są ułożone w odpowiednim porządku bądź jeżeli niektóre pola tabeli zostają pominięte. Przykładowo: możemy wstawić do tabeli nowy rekord, w którym ustawimy tylko wartości pól ID klienta oraz Kwota transakcji; wartości innych pól mogą nie być jeszcze znane i dlatego zostały pominięte. Kod SQL kwerendy dołączającej może wyglądać w takiej sytuacji następująco: INSERT INTO ArchiwumTransakcji ([ID klienta], [Kwota transakcji]) VALUES (2000, 35.25); W tym przypadku ustawiamy jedynie wartości dwóch pól. Taki sposób postępowania jest naj- zupełniej prawidłowy, a wykonanie kwerendy zakończy się powodzeniem, pod warunkiem że pola, których wartości nie ustawiamy, mogą przyjmować wartości puste. Dołączanie rekordów ze zbioru rekordów Polecenie INSERT INTO jest często wykorzystywane w procedurach przetwarzających dane VBA/ADO, gdzie tabela docelowa jest wypełniana w miarę przechodzenia pętli przez kolejne rekordy zbioru rekordów (ang. recordset), przykładowo: Sub append_routine() Dim conn As ADODB.Connection Set conn = CurrentProject.Connection Dim rs_transactions As New ADODB.Recordset 3.2. Dołączanie danych | 89 Dim ssql As String Pobieramy wszystkie rekordy z tabeli Transakcje ssql = Select * From Transakcje rs_transactions.Open ssql, conn, adOpenKeyset, adLockOptimistic Do Until rs_transactions.EOF Jeżeli data transakcji to 1 kwietnia, wstawiamy rekord do archiwum i ustawiamy kwotę transakcji na 0 If rs_transactions.Fields( Data transakcji ) = #2006-04-01# Then ssql = Insert Into ArchiwumTransakcji Values ( ssql = ssql rs_transactions.Fields( ID klienta ) , ssql = ssql # rs_transactions.Fields( Data transakcji ) #, ssql = ssql 0 , ssql = ssql April s Fools Day — wszystko za darmo! ) conn.Execute ssql End If rs_transactions.MoveNext Loop usuwamy wszystkie rekordy z 2006-04-01 z tabeli Transakcje ssql = Delete * From Transakcje Where ssql = ssql Transakcje.[Data transakcji]=#2006-04-01# conn.Execute ssql rs_transactions.Close Set rs_transactions = Nothing conn.Close MsgBox Gotowe! End Sub W tym przykładzie zbiór rekordów (rs_transactions) zawiera wszystkie rekordy z tabeli Trans- akcje. Podczas przetwarzania w pętli kolejnych rekordów ze zbioru procedura sprawdza, czy data transakcji to 2006-04-01. Jeżeli tak, tworzone jest odpowiednie polecenie INSERT INTO języka SQL. Przykładowo: INSERT INTO ArchiwumTransakcji Values VALUES (106, #2006-04-01#, 0, April s Fools Day — wszystko za darmo! ); Uważni Czytelnicy z pewnością zwrócili uwagę na użycie podwójnego znaku apo- strofu w ciągu znaków April s. Taki zapis zapobiega wystąpieniu błędu, który mógłby się w przeciwnym razie pojawić podczas próby wstawienia ciągu znaków zawierającego apostrof. Procedura przedstawiona powyżej kopiuje wszystkie rekordy z 1 kwietnia 2006 do tabeli archi- walnej i jako kwotę transakcji ustawia wartość 0. Po przejściu pętli przez wszystkie rekordy zbioru wykonywana jest kwerenda usuwająca wszystkie rekordy z 1 kwietnia 2006 z tabeli Transakcje. Poniżej przedstawiamy fragment kodu odpowiedzialny za usuwanie rekordów: usuwamy wszystkie rekordy z 2006-04-01 z tabeli Transakcje ssql = Delete * From Transakcje Where ssql = ssql Transakcje.[Data transakcji]=#2006-04-01# conn.Execute ssql Użycie odpowiedniej procedury VBA do przechodzenia przez kolejne rekordy i podejmowanie odpowiednich decyzji o dołączaniu poszczególnych rekordów do innej tabeli jest świetnym rozwiązaniem zwłaszcza w sytuacji, kiedy warunki określające sposób przetwarzania stają się złożone. Bo jak inaczej znaleźć na przykład rekordy, w których musimy zredukować kwotę transakcji do 0, jeżeli możemy to zrobić tylko dla ściśle wybranych klientów, dla transakcji wykonanych tylko w kilku określonych dniach i tylko wtedy, gdy całkowite saldo transakcji takiego klienta jest mniejsze niż 100, a ostatnie zlecenie zostało złożone nie wcześniej niż 30 dni temu? 90 | Rozdział 3. Kwerendy funkcjonalne Zdefiniowanie takich warunków w siatce projektu kwerendy może być niezłym wyzwaniem, stąd znajomość sposobu połączenia w procedurze VBA poleceń języka SQL z instrukcjami warun- kowymi może być bezcenną pozycją w zestawie umiejętności każdego użytkownika bazy danych Microsoft Access. 3.3. Usuwanie danych Opis problemu Musimy usunąć z tabeli określone dane. Rekordy, które mają być usunięte, muszą spełniać okre- ślone kryteria wyszukiwania, a pozostałe rekordy muszą pozostać nienaruszone. W jaki sposób można bezpiecznie wykonać taką operację? Rozwiązanie Aby usunąć z tabeli rekordy spełniające określone kryteria wyszukiwania, należy użyć kwerendy usuwającej (ang. delete query). Jeżeli w takiej kwerendzie nie zastosujemy żadnych kryteriów wyszukiwania, to używając jej, musimy zachować daleko idącą ostrożność — kwerenda usuwająca uruchomiona bez kryteriów wyszukiwania może całkowicie wyczyścić zawartość tabeli. Kwerendy usuwające powodują usunięcie danych, ale pozostawiają tabele. Tabele nie są usuwane. Aby usunąć wybrane dane z tabeli, musimy utworzyć odpowiednią kwerendę usuwającą, która wybierze tylko rekordy przeznaczone do skasowania. Na rysunku 3.10 przedstawiono projekt kwerendy, która usuwa rekordy klientów pochodzących ze stanu CA (California). Oznacza to, że usunięte zostaną tylko takie rekordy, dla których pole Nazwa stanu ma wartość CA; inne rekordy tabeli pozostaną nienaruszone. Zawsze musimy pamiętać, że mimo iż w siatce projektu kwerendy na rysunku 3.10 umieszczone zostało tylko jedno pole, uruchomienie kwerendy nie usuwa danych tylko z tego pola — zamiast tego w całości zostają usunięte wszystkie rekordy spełniające podane kryterium wyszukiwania. W siatce projektu kwerendy nie musimy umiesz- czać wszystkich pól rekordu; wystarczy umieścić tam pola, dla których definiujemy kryteria wyszukiwania. Kiedy używamy kwerendy usuwającej wszystkie rekordy z tabeli (czyli kwe- rendy bez kryteriów wyszukiwania), wystarczy z okna tabeli przeciągnąć gwiazdkę na siatkę projektu kwerendy — gwiazdka oznacza po prostu wszystkie pola tabeli. Aby utworzyć kwerendę usuwającą, należy po przejściu na siatkę projektu kwerendy wybrać z menu głównego polecenie Kwerendy/Kwerenda usuwająca. W wersji Access 2007 wystarczy w tym celu skorzystać z odpowiedniego przycisku na Wstążce. Kod SQL kwerendy przedsta- wionej na rysunku 3.10 wygląda następująco: DELETE [Klienci].[Nazwa stanu] FROM Klienci WHERE ((([Klienci].[Nazwa stanu])= CA )); 3.3. Usuwanie danych | 91 Rysunek 3.10. Kwerenda usuwająca ze zdefiniowanymi kryteriami wyszukiwania Jak widać, kod SQL kwerendy jest relatywnie prosty. Jego składnia jest nieco zbliżona do składni kwerendy wybierającej SELECT, z wyjątkiem tego, że kod kwerendy usuwającej rozpoczyna się od słowa kluczowego DELETE. Interesujący jest fakt, że „przesłanie” czy też „wiadomość” wyni- kające ze składni powyższego kodu SQL mogą być nieco mylące. Jak już wspominaliśmy wcze- śniej, wykonanie takiej kwerendy usuwa całe rekordy, a nie tylko wartości pola Nazwa stanu. Zdecydowanie lepszym „składniowo” zapisem takiej kwerendy będzie następujący kod SQL: DELETE [Klienci].* FROM Klienci WHERE ((([Klienci].[Nazwa stanu])= CA )); Różnica polega na tym, że zamiast nazwy pojedynczego pola użyliśmy gwiazdki, która symbo- lizuje wszystkie pola tabeli. Jak widać, czasami sposób, w jaki Access tworzy kod SQL kwerend, nie jest najlepszą reprezentacją zamierzonej akcji. Oczywiście kod generowany przez Accessa jest poprawny i działa, ale może być nieco mylący. Omówienie Kiedy usuwamy rekordy z tabeli, która jest powiązana relacjami z innymi tabelami, musimy wziąć pod uwagę kilka dodatkowych elementów. Ponieważ tabela nadrzędna jest połączona z tabelą podrzędną relacją jeden do wielu, usunięcie rekordów z tabeli nadrzędnej spowodo- wałoby naruszenie więzów integralności i pozostawienie „osieroconych” rekordów w tabeli podrzędnej. Access posiada mechanizm pozwalający na sprawne rozwiązanie takiego dylematu, co nie zmie- nia faktu, że zrozumienie istoty problemu jest niezmiernie ważne. Aby zilustrować całe zagad- nienie, posłużymy się przykładem. Na rysunku 3.11 przedstawiono relację ustanowioną pomię- dzy tabelami Klienci i Transakcje. Zwróćmy uwagę, że w oknie dialogowym Edytowanie relacji zaznaczona została opcja Wymuszaj więzy integralności (aby wyświetlić to okno dialogowe, należy dwukrotnie kliknąć lewym przyciskiem myszy linię łączącą obie tabele bądź z menu głównego wybrać polecenie Relacje/Edytuj relację). Taka relacja oznacza, że rekordy w tabeli Transakcje muszą być dopasowane do odpowiednich rekordów z tabeli Klienci, a dokładniej, że każdy rekord w tabeli Transakcje musi posiadać w polu ID klienta wartość, która odpowiada wartości pola ID klienta jakiegoś rekordu w tabeli Klienci. 92 | Rozdział 3. Kwerendy funkcjonalne Rysunek 3.11. Przeglądanie relacji pomiędzy dwiema tabelami Rekordy w tabeli Klienci muszą posiadać unikatowe wartości w polu ID klienta, stąd ilość rekor- dów w tabeli Klienci jest taka sama, jak ilość unikatowych identyfikatorów klientów (ilość uni- katowych wartości pola ID klienta). W taki właśnie sposób tabela Klienci spełnia rolę tabeli nadrzędnej w relacji jeden do wielu. Pole ID klienta w tabeli Transakcje nie musi posiadać unikatowych wartości. W praktyce sytu- acja wygląda tak, że niemal każdy rekord z tabeli Klienci będzie posiadał wiele odpowiadających mu rekordów w tabeli podrzędnej Transakcje — dobrze prowadzony biznes powoduje, że stali, lojalni klienci ciągle wracają i składają nowe zlecenia. I znów, jedynym wymaganiem dla rekordów z tabeli Transakcje jest to, że wartość pola ID klienta musi odpowiadać wartości tego pola w jednym z rekordów tabeli Klienci. Teraz załóżmy, że chcemy usunąć danego klienta z tabeli Klienci. Ponieważ pomiędzy tabelami istnieją więzy integralności, ale kaskadowe usuwanie rekordów pokrewnych nie jest dozwolone (opcja Kaskadowo usuń rekordy pokrewne jest wyłączona, jak to zostało zilustrowane na rysunku 3.11), to jeżeli dany klient będzie posiadał powiązane rekordy w tabeli podrzędnej, Access nie pozwoli na proste usunięcie klienta. Więzy integralności pomiędzy tabelami nie pozwolą na utworzenie „osieroconych” rekordów. Klienci nie muszą mieć żadnych rekordów opisujących transakcje, więc usunięcie klientów bez transakcji jest możliwe, ale jeżeli dla danego klienta istnieją w tabeli podrzędnej jakiekolwiek rekordy opisujące jego transakcje, to usunięcie takiego klienta nie będzie możliwe. Jeżeli klient posada jakieś powiązane z nim transakcje, to przed usunięciem rekordu klienta musimy usunąć wszystkie rekordy opisujące jego transakcje. Usuwanie rekordów transakcji nie podlega żadnym ograniczeniom i w żaden sposób nie możemy utworzyć „osieroconego” rekordu klienta — „osierocone” rekordy mogą się teoretycznie pojawić jedynie w tabeli podrzędnej. 3.3. Usuwanie danych | 93 A zatem w jaki sposób usunąć wszystkie transakcje danego klienta? Kwerenda usuwająca przed- stawiona na rysunku 3.12 usuwa wszystkie rekordy transakcji dla klienta April Kramer. W re- kordzie opisującym tego klienta znajduje się odpowiednie pole ID klienta, które jest wykorzy- stywane przez kwerendę do identyfikacji usuwanych rekordów. Zwróćmy uwagę na fakt, że w wierszu Usuwanie w pierwszych dwóch kolumnach umieszczono klauzule Where, spełniające rolę kryteriów wyszukiwania. Trzecia kolumna identyfikuje tabelę, z której będą usuwane odna- lezione rekordy (Transakcje); w wierszu Usuwanie tej kolumny umieszczono klauzulę Skąd. Rysunek 3.12. Usuwanie rekordów z jednej tabeli w oparciu o kryteria z innej tabeli Kod SQL kwerendy przedstawionej na rysunku 3.12 wygląda następująco: DELETE Klienci.Imię, Klienci.Nazwisko, Transakcje.* FROM Klienci INNER JOIN Transakcje ON Klienci.[ID klienta] = Transakcje.[ID klienta] WHERE (((Klienci.Imię)= April ) AND ((Klienci.Nazwisko)= Kramer )); Jest to nieco mylące, ponieważ po słowie kluczowym DELETE występują nazwy pól z tabeli Klienci (Imię i Nazwisko) — można stąd wysnuć mylny wniosek, że usuwane będą rekordy z tabeli Klienci. Oczywiście nie jest to prawdą — usuwane są tylko rekordy transakcji z tabeli podrzędnej, podczas gdy tabela klientów pozostaje nienaruszona. Rekord opisujący klienta zostaje usunięty przez kolejną kwerendę, przedstawioną na rysunku 3.13. Usunięcie w ten sposób rekordu klienta April Kramer może być niebezpieczne, ponieważ teoretycznie może istnieć więcej niż jeden klient o takim imieniu i nazwisku. Imienia i nazwiska klienta użyto w tej kwerendzie tylko na potrzeby lepszego zilustro- wania zasady usuwania takich rekordów. W praktyce jedynym sposobem gwarantują- cym, że usunięty zostanie właściwy rekord klienta, jest posłużenie się polem ID klienta. Jak widać, jeżeli kaskadowe usuwanie rekordów pokrewnych nie jest dozwolone (na przy- kład kiedy w oknie Edytowanie relacji opcja Kaskadowo usuń rekordy pokrewne została wyłączona), przed usunięciem rekordu klienta musimy usunąć wszystkie odpowiadające mu rekordy z tabeli podrzędnej. Jeżeli jednak ta opcja została włączona, to usunięcie wybranych rekordów z tabeli nadrzędnej spowoduje automatyczne usunięcie wszystkich pokrewnych rekordów z tabeli pod- rzędnej. W takiej sytuacji usunięcie April Kramer z tabeli Klienci spowodowałoby automatycz- nie usunięcie wszystkich związanych z nią rekordów z tabeli Transakcje. 94 | Rozdział 3. Kwerendy funkcjonalne Rysunek 3.13. Kwerenda usuwająca z tabeli nadrzędnej rekord klienta Takie rozwiązanie potrafi zaoszczędzić masę czasu, ale nie ma nic za darmo. Kaskadowe usu- wanie rekordów pokrewnych może w prosty sposób spowodować niezamierzone usunięcie z tabel cennych informacji. Jeżeli chcemy skorzystać z tej opcji, powinniśmy upewnić się, że kopie zapasowe danych są tworzone odpowiednio często, w regularnych odstępach czasu. Usu- nięcie danych jest nieodwołalne i jeżeli nie posiadamy odpowiedniej kopii zapasowej, anulo- wanie takiej operacji i przywrócenie poprzednich danych nie będzie możliwe. Jeżeli nie posia- damy odpowiedniego mechanizmu tworzenia kopii zapasowych, ryzyko związane z użyciem możliwości kaskadowego usuwania rekordów może przeważyć nad wszystkimi zaletami pły- nącymi z zastosowania tego mechanizmu. Zanim zdecydujemy się na jego zastosowanie, musimy starannie rozważyć wszystkie argumenty za i przeciw. 3.4. Kwerendy tworzące tabele Opis problemu W jaki sposób można utworzyć tabelę przechowującą rekordy będące rezultatem działania kwerendy? Rozwiązanie W pewnych sytuacjach bardzo użyteczna może być możliwość umieszczenia rekordów zwra- canych przez kwerendę bezpośrednio w nowej tabeli. Aby tego dokonać, musimy skorzystać z kwerendy tworzącej tabelę (ang. make-table query). W zasadzie możemy sobie teraz zadać pytanie, po co mamy zadawać sobie trud tworzenia nowej tabeli, skoro tabele przechowujące takie dane już istnieją? Oto kilka powodów: • Aby połączyć w jednej tabeli powiązane ze sobą dane nieposiadające struktury hierarchicznej. • Aby podzielić dane z jednej wielkiej tabeli na kilka mniejszych tabel. Takiego podziału doko- nujemy zazwyczaj w oparciu o wartości jednego lub kilku pól kluczowych tabeli źródłowej. 3.4. Kwerendy tworzące tabele | 95 Rysunek 3.14 dobrze ilustruje pierwszą sytuację. Mamy tutaj dwie tabele, które najwyraźniej są ze sobą powiązane — mają wspólne pole ID pracownika, aczkolwiek nie istnieje tutaj relacja jeden do wielu. W każdej z tabel jednemu pracownikowi odpowiada tylko jeden rekord. Utrzymywa- nie nazwisk pracowników w jednej tabeli, a informacji o dacie zatrudnienia i dziale w innej tabeli być może ma jakieś uzasadnienie biznesowe, ale nie ma żadnego sensu z punktu widzenia pro- jektowania bazy danych. Połączenie danych z tych dwóch tabel w jedną wydaje się być jak naj- bardziej sensownym posunięciem. Tabela będąca rezultatem takiej operacji będzie miała jedno pole ID pracownika oraz trzy dodatkowe pola opisujące dane pracownika. Rysunek 3.14. Dwie tabele połączone relacją jeden do jednego Aby utworzyć taką tabelę, musimy umieścić dwie istniejące tabele w widoku projektu kwe- rendy, a w siatce projektu umieścić wszystkie pola tych tabel (ale tylko jedno pole ID pracownika). Następnie musimy poinformować Accessa, że tworzymy kwerendę tworzącą tabele. Aby tego dokonać, wybieramy z menu głównego polecenie Kwerendy/Kwerenda tworząca tabele (w wersji Access 2007 używamy odpowiedniego przycisku na Wstążce). Kiedy wybierzemy z menu kwe- rendę tworzącą tabele, na ekranie pojawi się okno dialogowe Tworzenie tabeli, w którym możemy wpisać nazwę nowej tabeli lub wybrać z listy rozwijanej nazwę istniejącej tabeli. Na rysunku 3.15 przedstawiono projekt kwerendy, która łączy rekordy z dwóch tabel i zapisuje je w jednej, nowej tabeli o nazwie DaneOsobowePracowników. Kod SQL kwerendy przedstawionej na rysunku 3.15 wygląda następująco: SELECT Pracownicy.[ID pracownika], Pracownicy.Pracownik, DataZatrudnienia_Dział.[Data zatrudnienia], DataZatrudnienia_Dział.[Nazwa działu] INTO DaneOsobowePracowników FROM Pracownicy INNER JOIN DataZatrudnienia_Dział ON Pracownicy.[ID pracownika] = DataZatrudnienia_Dział.[ID pracownika]; Zwróćmy uwagę, że kluczowym elementem takiej kwerendy jest polecenie SELECT lista pól INTO nazwa nowej tabeli , po którym następują: klauzula FROM oraz ewentualne sprzężenia i kryteria wyszukiwania. 96 | Rozdział 3. Kwerendy funkcjonalne Rysunek 3.15. Projekt kwerendy tworzącej tabele Na rysunku 3.16 przedstawiono wyniki działania kwerendy tworzącej tabele. Wszystkie infor- macje o pracowniku zostały teraz umieszczone w jednej tabeli. Żadne relacje pomiędzy danymi pracowników nie zostały utracone, dla każdego pracownika mamy podany jego identyfikator, nazwisko, datę zatrudnienia oraz nazwę działu, w którym pracuje. Rysunek 3.16. Tabela będąca wynikiem działania kwerendy łączącej tabele Jak już wspomniano wcześniej, innym zastosowaniem kwerend tworzących tabele jest dzielenie wielkich tabel na mniejsze. Przykładem takiego zadania będzie podzielenie tabeli przedstawionej na rysunku 3.16 na szereg tabel przechowujących informacje o pracownikach poszczególnych działów. Przykładowo: aby utworzyć nową tabelę przechowującą informacje o pracownikach działu sprzedaży, należałoby utworzyć następującą kwerendę tworzącą tabele: SELECT DaneOsobowePracowników.[ID pracownika], DaneOsobowePracowników.Pracownik, DaneOsobowePracowników.[Data zatrudnienia], DaneOsobowePracowników.[Nazwa działu] 3.4. Kwerendy tworzące tabele | 97 INTO DziałSprzedaży FROM DaneOsobowePracowników WHERE (((DaneOsobowePracowników.[Nazwa działu])= Sales )); Pamiętajmy, że utworzenie nowej tabeli zawierającej informacje o pracownikach działu sprze- daży nie modyfikuje w żaden sposób naszej tabeli źródłowej. Jeżeli chcemy takie dane usunąć, musimy skorzystać z osobnej kwerendy usuwającej rekordy. Omówienie Kwerendy tworzącej tabele możemy użyć do nadpisania istniejącej tabeli. Jeżeli po słowie klu- czowym INTO umieścimy nazwę istniejącej tabeli, to jej struktura oraz dane zostaną całkowicie zastąpione strukturą i danymi będącymi rezultatem działania kwerendy tworzącej tabele. Nazwa nowej tabeli pozostaje taka sama jak starej tabeli, ale jej stan przed i po wykonaniu kwerendy już wcale taki sam być nie musi. Innym sposobem wykorzystania kwerendy tworzącej tabele jest użycie w składni polecenia SQL pól tymczasowych, co spowoduje utworzenie nowej tabeli posiadającej jeden rekord. Nazwy pól i ich wartości są zapisane bezpośrednio w kodzie SQL kwerendy. A oto przykład: SELECT 123 AS [Moja wartość], Adam AS [Moje imię] INTO MojaNowaTabela; Wykonanie tego prostego zapytania SQL powoduje utworzenie nowej tabeli o nazwie Moja- NowaTabela zawierającej jeden rekord składający się z dwóch pól: pierwsze pole, o nazwie Moja wartość, ma wartość 123, natomiast drugie pole, o nazwie Moje imię, ma wartość Adam. Zwróćmy uwagę na fakt, iż w kodzie kwerendy nie występuje ani słowo kluczowe FROM, ani sekcja klauzuli Where — dzieje się tak, ponieważ nasza kwerenda nie odwołuje się do żadnej tabeli źródłowej. 98 | Rozdział 3. Kwerendy funkcjonalne
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

Access. Analiza danych. Receptury
Autor:
,

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: