Bazy Danych - Instrukcja do Ćwiczenia laboratoryjnego nr 3 1
Transkrypt
Bazy Danych - Instrukcja do Ćwiczenia laboratoryjnego nr 3 1
Bazy Danych - Instrukcja do Ćwiczenia laboratoryjnego nr 3 1) Utwórz kwerendę, która posłuży do stworzenia formularza Faktury Kwerenda powinna zawierać tylko pola potrzebne na fakturze. Ponieważ występują one w kilku tabelach, to wszystkie niezbędne tabele (lub kwerendy) należy dołączyć do tworzonej kwerendy. Można użyć kreatora prostych kwerend (wybierających) lub widoku projekt kwerendy. Aby uzyskać prawidłowe zestawienia należy wcześniej zdefiniować wszystkie relacje między tabelami – relacje te zostaną pokazane w projekcie kwerendy i są niezbędne do jej prawidłowego działania. Na bazie utworzonej kwerendy zbuduj formularz Faktury, umożliwiający wprowadzenie danych do wszystkich wykorzystanych tabel. Skorzystaj z dołączonej kopii faktury w celu określenia potrzebnych na fakturze pól i odpowiedniego ich rozmieszczenia. Wykorzystaj wszelkie poznane wcześniej elementy pozwalające na usprawnienie działania formularza Faktury, np. pola kombi wyszukującego klienta, dodaj własne przyciski nawigacyjne, przyciski dodające i usuwające rekordy czy wyszukujące itp. Wyrażenia w kwerendach modyfikujących (funkcjonalnych) Kwerendy modyfikujące to procedury automatycznego przetwarzania danych źródłowych. Uruchomienie kwerend modyfikujących powoduje dokonanie zmian w danych źródłowych, w przeciwieństwie do kwerend wybierających, które takich zmian nie dokonują. Wynikiem kwerend modyfikujących nie są zestawienia w postaci arkusza danych. Uruchomienie takiej kwerendy dokonuje, najczęściej nieodwracalne zmiany w bazie danych. Praktyczne zastosowanie kwerend funkcjonalnych można prześledzić na przykładzie rozliczania przychodzących kwot z tytułu dokonanej sprzedaży. Ponieważ wystawienie faktury przy sprzedaży towaru nie jest jednoznaczne z otrzymaniem należności za ten towar to równolegle z ewidencją sprzedaży (zamówień) trzeba prowadzić ewidencję wierzytelności oraz ewidencję wpływających należności (płatności). Przed dokonaniem jakichkolwiek rozliczeń w tabeli Finanse płatności wartość pola DoRozliczenia jest równa wartości pola Kwota. Po całkowitym rozliczeniu danej płatności zmniejszy się ona do zera. Ponieważ jednak pojedyncza płatność może pokrywać należności z kilku faktur a rozliczenie odbywa się osobno dla każdej faktury, wartość z tego pola odpowiada tej części nadesłanej kwoty, która pozostała jeszcze do rozliczenia. W związku z powyższym potrzebne będzie zapamiętanie w bazie danych, która płatność jakich faktur dotyczy (tabela Szczegóły płatności). Algorytm rozliczania płatności za pomocą kwerend modyfikujących wyglądać może tak: 1) Kwerenda pierwsza: Wybierz z rejestru płatności pierwszą płatność, dla której wartość w polu DoRozliczenia jest większa od zera (taką, która nie została jeszcze do końca rozliczona) i skojarz ją z najstarszą, nie zapłaconą fakturą (zamówieniem) wystawioną nadawcy wybranej płatności, figurującą w rejestrze wierzytelności 2) Kwerenda druga: Dla wybranej faktury pomniejsz wartość DoZapłaty o wartość DoRozliczenia odpowiadającej płatności. Jednocześnie pomniejsz wartość DoRozliczenia o kwotę rozliczoną dla wybranej faktury. Do wykonania tych dwóch działań w jednym kroku można wykorzystać zapamiętaną osobno wartość z pola DoZapłaty. 3) Kwerenda trzecia: Zapisz numer płatności i identyfikator wybranej faktury w tabeli szczegółowego rejestru płatności. Konieczne również będzie zabezpieczenie kolejności wykonywania kwerend po sobie. Przed wykonaniem każdej kwerendy funkcjonalnej pojawiają się komunikaty ostrzegające przed zmianami w tabelach i podające ilu wierszy te zmiany będą dotyczyć. Można je wyłączyć w Menu Narzędzia\ Opcje\ grupa opcji Potwierdzaj\ kategoria Edytuj/Znajdź\ wyłączając opcję Kwerendy funkcjonalne. Utwórz tabele i relacje: 1) Finanse wierzytelności Pola Nazwa IDzamówienia WartośćBrutto DoZapłaty Typ Autonumer Liczba (całkowita długa) Liczba (całkowita długa) Rozmiar 2) Finanse płatności Pola Nazwa LpPłatności DataOtrzymania IDklienta (lub kontrahenta) Kwota DoRozliczenia Typ Autonumer Data/Godzina Liczba Walutowy Walutowy Rozmiar (całkowita długa) 3) Szczegóły płatności Pola Nazwa LpPłatności IDzamówienia Typ Liczba Liczba Rozmiar (całkowita długa) Kwerendy tworzące tabele Różnią się one od zwykłych kwerend wybierających tym, że zamiast chwilowego zestawienia najbardziej aktualnych danych dają w rezultacie nową tabelę, w której przechowują zarchiwizowane dane z określonej chwili. Szczególnym przypadkiem zastosowania zapytań tworzących tabele jest zapamiętywanie danych zebranych z różnych tabel źródłowych w postaci pojedynczej tabeli o charakterze pomocniczej i chwilowym. Jej główną zaletą jest uproszczenie złożonych procedur przetwarzania danych. Czasami stworzenie takiej tymczasowej tabeli staje się wręcz konieczne, gdyż Access bardzo spowalnia działanie podczas wykonywania zapytań zbudowanych na zapytaniach, których obiektami źródłowym są zapytania :-). Jedyne dziedziczone po polach tabel źródłowych atrybuty pól nowo stworzonej tabeli to Typ danych i Rozmiar pola. Pozostałe atrybuty przyjmują swoje standardowe ustawienia. ♦ Otwórz okno projektu nowego zapytania\ Menu Kwerenda\ Kwerenda tworząca tabele ♦ W polu dialogowym Utwórz tabelę wpisz nazwę tworzonej tabeli (później będzie ją można zmienić na liście atrybutów zapytania) Musimy skojarzyć pierwszą nie rozliczoną do końca płatności z najstarszą, nie zapłaconą fakturą, przy czym informacją, według której zapytanie ma kojarzyć płatność z fakturą, będzie oczywiście identyfikator odbiorcy. Zauważmy, że chcemy zapisać w docelowej tabeli tylko jeden wiersz, bowiem jak już wspomniano, pojedyncza operacja rozliczenia dotyczy tylko jednej faktury i tylko jednej płatności. Ponieważ rejestr może zawierać kilka nie rozliczonych płatności, a także w wierzytelnościach może figurować kilka nie zapłaconych faktur dla tego samego odbiorcy, konieczne będzie użycie funkcji agregujących. Nie uprzedzajmy jednak faktów. ♦ Wybierz tabele źródłowe, którymi będą: Finanse-Platności, Finanse-Wierzytelności i Zamówienia. Ta ostatnia to swego rodzaju łącznik pomiędzy dwoma pierwszymi. ♦ Utwórz sprzężenia, jeżeli wcześniej nie zostały zadeklarowane powiązania zgodnie z przedstawioną wcześniej ilustracją. ♦ Wypełnij szablon QBE. Jako pierwszą kolumnę wybierzmy pole LpPłatności z tabeli Finanse-Platności. Ponieważ jednak nie chodzi nam o wszystkie nie rozliczone płatności, należy włączyć opcję Podsumowanie i wybrać dla pola LpPłatności funkcję Pierwszy. ♦ Następna kolumna to warunek Gdzie dla pola Do rozliczenia z tej samej tabeli. Będzie miał on postać <>0, co wpiszemy w pole Kryteria. Kolejna kolumna to pole ID Faktury z tabeli Finanse—Wierzytelności, także z funkcją Pierwszy. Zakładamy tutaj, że kolejność wierszy w tabeli Finanse-Wierzytelności odpowiada kolejności, w jakiej faktury były wystawiane. (Gdyby tak nie było, należałoby dodać do szablonu pole DataZamówienia z tabeli Zamówienia i użyć go jako kryterium sortowania faktur.) ♦ Do wykonania czynności w drugim etapie procedury przydatna będzie wartość z pola Do zapłaty, które to pole przemianujemy w nowej tabeli na Należność. I w tej kolumnie jako funkcję agregującą wybierzmy Pierwszy. Musimy tu wziąć pod uwagę, że w tabeli Finanse-Wierzytelności mogą figurować pozycje już nieaktualne. Aby nie rozliczać ponownie rozliczonej już faktury, dodajmy w następnej kolumnie warunek Gdzie, w którym wykluczymy wybór faktur, mających w polu Do zapłaty wartość 0. ♦ Ostatnie, czwarte pole nowej tabeli będzie miało charakter pomocniczy, zabezpieczający przed skutkami pomylenia kolejności w uruchamianiu zapytań realizujących rozliczenia. Deklaracja tego pola wygląda tak: Status: „Nie rozliczona", a jej skutkiem będzie stworzenie w nowej tabeli pola o nazwie Status, w które wpisana zostanie wartość „Me rozliczona". Stwierdzenie owo odnosi się do kombinacji płatność - faktura, rozliczanej przez budowaną procedurę. ♦ Zachowaj zapytanie pod nazwą Rozliczenia-krok 1 ♦ Włącz opcję Kwerenda tworząca tabele z menu Kwerenda, podać nazwę tabeli docelowej, np. Pomocnicza do rozliczeń, sprawdzić działanie kwerendy przełączając w tryb arkusza danych i – jeśli wszystko gra, uruchomić je tworząc nową tabelę Kwerendy aktualizujące Aktualizacja przechowywanych w tabelach danych poprzez bezpośrednią edycję to zajęcie żmudne i potencjalnie niebezpieczne, gdyż może być źródłem wielu błędów, zwłaszcza przy zmianie wartości liczbowych, kwot itp. Trzeba najpierw odszukać wiersz, a następnie zmienić wartość odpowiedniego pola. Często przy tym konieczne jest skorzystanie z danych znajdujących się w innych tabelach. Częściowym ułatwieniem w tego rodzaju pracy może być przygotowanie zapytania wybierającego tylko te wiersze, które mają być aktualizowane, oraz potrzebne dane pomocnicze. Wtedy można poddać edycji dane w zestawieniu, unikając niepotrzebnego przeglądania dużych tabel i przechodzenia od tabeli aktualizowanej do tabel pomocniczych. Najlepiej jednak zadanie to powierzyć zapytaniom aktualizującym które są efektywnym i elastycznym narzędziem automatycznego przetwarzania danych. ♦ Aby zwykłe zapytanie wybierające przekształcić w zapytanie usuwające, Wybierz z menu Kwerenda polecenie Kwerenda aktualizująca. Różnica pomiędzy szablonami QBE dla zapytań wybierających i aktualizujących polega na zastąpieniu wiersza Pokaż wierszem Zamiana na. W rubryki tego wiersza wpisuje się wyrażenia, których wyniki zastępują wartości pól wybranych wierszy tabeli źródłowej. Niemożliwe jest oczywiście użycie w zapytaniu aktualizującym funkcji agregujących a także zmian w polach klucza głównego, w wyniku których zaburzona zostałaby integralność danych (puste pola lub powtarzające się wartości). Aby rozliczyć nadchodzących płatności, wykorzystamy zapytania aktualizujące w kolejnym etapie tej procedury. Na razie mamy ewidencję wierzytelności, nadchodzących płatności oraz wybraną „pierwszą z brzegu" parę płatność - faktura. To rozliczenie to nic innego jak aktualizacja obydwu ewidencji. ♦ Jako obiekty źródłowe do zapytania Rozliczenia-krok 2 wybierz tabele: Finanse-Płatności, FinanseWierzytelności i Pomocnicza do rozliczeń. Tym razem ta ostatnia pełnić będzie rolę łącznika przy tworzeniu sprzężeń. Co dalej? ♦ Trzeba zastąpić kwotę z pola Do zapłaty dla wybranej faktury różnicą Do zapłaty - Do rozliczenia. Jeżeli kwota płatności jest dokładnie równa należności za wybraną fakturę, wynikiem będzie 0. A skoro Do zapłaty pozostało O, to znaczy, że faktura została zapłacona. Z drugiej strony, skoro cała płatność została zaliczona na poczet wybranej faktury, to i ta płatność została rozliczona, więc należy w pole Do rozliczenia wpisać wartość 0. Rozważyliśmy jednak przypadek szczególny, podczas gdy w rzeczywistości klient najczęściej przysyła tylko tyle pieniędzy, ile uważa za niezbędne minimum. Oznacza to, że dla wybranej pary płatność - faktura zachodzi relacja [Do rozliczenia]< [Do zapłaty] lub [Do rozliczenia] > [Do zapłaty]. Ten drugi przypadek może mieć miejsce tylko wtedy, gdy nasz kontrahent zalega nam za kilka faktur i uznał, że nasza cierpliwość się kończy. Sytuacja się trochę komplikuje, ale można ją rozwiązać, korzystając z funkcji Ilf. Aktualizacja pola Do zapłaty polegać będzie na zastąpieniu bieżącej wartości różnicą [Do zaplaty]-[Do rozliczenia], z tym że gdyby wynik miał być ujemny, w pole wpisane zostanie zero. ♦ Zadanie to zrealizuje następujące wyrażenie wpisane w rubrykę Zamiana na kolumny: Do zapłaty: Ilf ([Do zapłaty]-[Do rozliczenia] <0;0; [Do zapłaty]-[Do rozliczenia]) Aktualizacja pola Do rozliczenia w rejestrze płatności polegać będzie z kolei na zastąpieniu wartości bieżącej różnicą [Do rozliczenia]-[Do zapłaty] lub, gdyby okazała się ujemna, zerem. Problem w tym, że wyrażenie to wymaga wartości pola Do zaplaty sprzed aktualizacji, w przeciwnym razie wynik będzie błędny. Z tego względu, w poprzednim etapie, w tabeli Pomocnicza do rozliczeń zapamiętano wartość Do zaplaty jako Należność. ♦ Kolejna kolumna szablonu QBE zawierać zatem będzie w rubryce Pole nazwę Do rozliczenia, a w rubryce Zamiana na wyrażenie: llf([Dorozliczenia]-[Należność]<0;0;[Dorozliczenia]-[Należność]) Po dokonaniu obydwu zmian rozliczenie można uznać za dokonane, aby to uwzględnić, zmieńmy jeszcze wartość pola Status w tabeli Pomocnicza do rozliczeń na „Rozliczona". Cel tej operacji okaże się oczywisty w trzecim, ostatnim już etapie tworzonej procedury.1 Kwerendy dołączające Kwerenda dołączająca to taka, która uzupełnia istniejącą tabelę o dane wybrane z innych tabel lub zapytań, dołączając na jej końcu nowe wiersze. Musi być oczywiście zachowana zgodność typu dopisywanych danych z typem pól tabeli docelowej oraz zachowana jednoznaczność wartości klucza głównego tej tabeli. ♦ Włącz opcję Kwerenda dołączająca z menu Kwerenda do szablonu QBE i wybierz z obiektów źródłowych pola, których wartości chcesz przenieść do tabeli docelowej, a także te, których wartości posłużą nam za kryteria. Access nie wymaga, by w budowanym zapytaniu liczba pól była zgodna z liczbą pól tabeli docelowej. Można dopisywać dane tylko do wybranych pól, nie troszcząc się o pozostałe. Ważne jest, aby w zapytaniu było pole odpowiadające polu klucza głównego tabeli docelowej, chyba że kluczem głównym jest pole typu licznik. W takiej sytuacji Access sam poradzi sobie z uzupełnieniem jego wartości. ♦ Kiedy po przełączeniu w tryb arkusza danych okaże się, że zapytanie wybiera dokładnie te dane, o jakie nam chodzi, naciskając przycisk z wykrzyknikiem uruchom zapytanie. ♦ Podobnie jak w przypadku zapytania tworzącego tabelę, tu także podstawowym atrybutem zapytania jest nazwa tabeli docelowej, z tą jednak różnicą, że dopisywać wiersze można tylko do tabeli istniejącej. Przy wyborze opcji Kwerenda dołączająca pojawia się pole dialogowe, w które trzeba wpisać tę nazwę lub wybrać ją z listy rozwijanej. Jako że Access umożliwia nam dopisanie danych nie tylko do tabeli bazy danych aktualnie otworzonej, ale do dowolnej innej i to nie tylko Accessowej, do wyboru mamy dwie opcje: Bieżąca baza danych i Inna baza danych. Szablon QBE dla zapytania dołączającego zamiast wiersza Pokaż ma wiersz Dołączanie do. Rubryki tego wiersza wypełniamy nazwami pól wybranymi z rozwijanych list. ♦ Zbuduj zapytanie dołączające, które zrealizuje trzeci i ostatni krok rozliczania płatności. W trzecim etapie należy zapisać identyfikatory rozliczonej dopiero co pary płatność - faktura w tabeli Szczegóły płatności, która pełnić tu będzie rolę tabeli docelowej. Dane te zapisane są w tabeli Pomocnicza do rozliczeń. ♦ Tabela Pomocnicza do rozliczeń będzie obiektem źródłowym zapytania dołączającego. Do szablonu QBE wybierzmy z tabeli źródłowej pola Lp i Pierwszyz ID Faktury, polami docelowymi zaś dla nich niech będą: Lp i ID Faktury. ♦ Aby zabezpieczyć się przed zapisaniem tych danych, zanim dokonamy rozliczenia (czyli gdybyśmy w naszej procedurze ominęli krok drugi), dodajmy jeszcze pole Status, dla którego w rubrykę Kryteria wpiszemy wartość „Rozliczona". ♦ Zapisz Kwerendę pod nazwą Rozliczenia-krok 3 Może się zdarzyć, że spróbujemy dwa razy dopisać tę samą informację do tabeli docelowej. Jednak wykonanie tej czynności pogwałciłoby jednoznaczność klucza głównego, w związku z tym Access zmieniać wartość pola Status w tabeli Zamówienia dla faktur już zapłaconych, czyli takich, które w polu Do zapłaty w tabeli FinanseWierzytelności mają wartość 0. Należałoby to pole uwzględnić w tabeli Zamówienia. zarzuca realizację zapytania, wyświetla natomiast charakterystyczny komunikat o błędach. Informuje w nim o następujących przyczynach niepowodzeń: a) w związku z błędną konwersją typów danych, np. przy próbie dopisania wartości typu tekstowego do pól typu liczbowego, wiersze były puste i nie zostały dołączone; b) w związku z pogwałceniem jednoznaczności klucza głównego wiersze nie zostały dołączone; c) w związku z blokadą wierszy w środowisku wielodostępnym, nie zostały one dołączone. W sytuacji, kiedy w tabeli docelowej kluczem głównym jest pole typu Autonumer, zapytanie dołączające może nie mieć żadnego odpowiednika tego pola, gdyż Access automatycznie nada kolejne numery dopisanym wierszom. ♦ Można również utworzyć kwerendę dołączającą do okresowego uzupełniania tabeli FinanseWierzytelności o dane dotyczące nowych, nie zapłaconych faktur. Kwerendy usuwające Nie ma chyba nic bardziej spowalniającego nasz system i budzącego większą irytację niż nieaktualne dane, zaśmiecające używane na bieżąco tabele. Oczywiście, niektóre z nich dobrze jest zachowywać jeszcze przez jakiś czas „na wszelki wypadek", jednak najlepiej przeznaczyć na nie osobne tabele czy nawet osobną bazę danych jako wydzielone archiwum. Po archiwizacji trzeba usunąć stare wiersze z bieżących tabel. Najszybciej zadanie to wykona kwerenda usuwająca, należąca do ostatniego z opisywanych typów kwerend modyfikujących. Pozwala ona usunąć z tabel źródłowych całe wiersze wybrane na podstawie dowolnie ustalonych kryteriów. Jedyne ograniczenia w usuwaniu wierszy związane są z naruszeniem integralności danych. Na przykład dla pojedynczej tabeli ze strony jeden zadeklarowanego związku jeden-do-wiele nie można usuwać wierszy posiadających swoje odpowiedniki w tabeli ze strony wiele (chyba że przy deklaracji powiązania włączona została opcja kaskadowego usuwania). ♦ Żeby stworzyć zapytanie usuwające, trzeba po wyborze obiektów źródłowych włączyć opcję Kwerenda usuwająca z menu Kwerenda. Szablon QBE zapytania usuwającego wyposażony jest w specjalny wiersz nazwany Usuwanie, w którego rubrykach pojawiać się mogą jedynie dwie pozycje: a) Skąd, oznacza tabelę, z której wiersze będą usuwane; b) Gdzie, wybieramy dla pól używanych do ustalenia kryteriów. W tym przypadku szczególnie ważne jest, aby przed uruchomieniem zapytania przełączyć je w tryb arkusza danych i sprawdzić, czy wybiera ono jedynie te wiersze, które mają być usunięte. Usuwanie wierszy zapytaniem jest bowiem nieodwracalne. ♦ Prostym przykładem zapytania usuwającego, uzupełniającym zestaw zapytań rozliczających płatności, będzie zapytanie usuwające z tabeli Finanse-Wierzytelności wiersze, dla których wartość pola Do zapłaty wynosi 0. Tworzenie raportów Raporty opieramy na kwerendach. Należy to przyjęć jako zasadę, nawet jeśli nie będziemy określać żadnych kryteriów wyszukiwania. Umożliwi nam to w każdej chwili łatwą modyfikację zakresu wyświetlanych rekordów lub wyświetlenie tych rekordów, które spełniają kryteria kwerendy. Raporty pozwalają nam utrwalić w postaci wydruku stan danych w określonym momencie czasu. Nadają się dzięki temu do wszelkiego rodzaju zestawień i sprawozdań. Nie można ich natomiast wykorzystać do zmiany stanu bazy danych tak, jak to było w przypadku formularzy. Wyższość raportów nad formularzami, gdy chodzi o tworzenie sprawozdań (wszak formularze też można drukować), wynika z dodatkowych możliwości grupowania danych, obliczania sum częściowych i globalnych oraz innych cech, których formularze nie posiadają. Poza tym raport operuje zbiorczo na wszystkich wierszach obiektu źródłowego, a nie na pojedynczych tak jak formularz. ♦ Utwórz raport - sprawozdanie ze sprzedaży produktów w ramach poszczególnych kategorii - korzystając z kreatora raportów Raport powinien zawierać numery faktur wraz z datami i wartościami dla produktów z poszczególnych kategorii, pogrupowane według tychże kategorii. Każda grupa ma być podsumowana. Cały zaś raport niech wieńczy wartość sprzedaży ogółem. Potrzebne dane to opis kategorii, numer faktury, data sprzedaży i wartość każdej pozycji na fakturze. Aby je zebrać, konstruujemy kwerendę opartą na podstawowych tabelach Zamówienia, Opisy zamówień, Produkty i Kategorie. ♦ Zapisz Kwerendę pod dowolną znaczącą nazwą ♦ Menu Wstaw/ Raport. Z rozwijanej listy w polu dialogowym Nowy raport wybierz nazwę właściwej kwerendy. Z drugiej listy w tym polu wybierz pozycję Kreator raportów. ♦ Wybierz odpowiednie pola z obiektu źródłowego, które będą umieszczone na raporcie. Kreator pozwala wybrać pola z kilku obiektów (tabel i/lub zapytań). ♦ Wybierz poziomy grupowania. Jeśli chcemy pogrupować sprzedaż według kategorii trzeba wskazać na liście pól nazwę Kategoria i kliknąć przycisk >>. Można ustalić kilka poziomów grupowania, np. możliwe jest pogrupowanie sprzedaży według kategorii, a następnie, w ramach każdej z nich, na sprzedających. Dostępny w tym polu przycisk Opcje grupowania pozwala ustalić przedziały grupowania, które zależą od typu danych w polu grupującym. Opisy kategorii towarów są tekstami. W tym przypadku standardowo grupowanie odbywa się po całej nazwie. Czasem jednak wygodnie jest pogrupować wartości tekstowe biorąc jedynie kilka pierwszych znaków, a nawet tylko pierwszy z nich. W ten sposób uzyskujemy grupowanie według alfabetu. Dla danych liczbowych grupowanie może odbywać się w przedziałach o określonej wartości, np. co sto, zaś dla dat w różnych interwałach czasowych np. miesięcznych. ♦ Ustal, jak mają być sortowane wiersze w grupach. Wybierz sortowanie pól w porządku rosnącym lub malejącym. Dostępny w polu przycisk Opcje sumowania umożliwia ustalenie sposobu sumowania wartości pól liczbowych w grupach. Po kliknięciu przycisku pojawia się pole dialogowe, w którym dla każdego pola liczbowego wybieramy funkcję agregującą, a za pomocą dodatkowych opcji decydujemy, czy wartości liczbowe będą wyświetlane w każdym wierszu i dodatkowo w podsumowaniu, czy tylko w podsumowaniu, oraz czy ma zostać obliczony procentowy udział sumy każdej grupy w sumie całkowitej. W naszym przypadku dla pola Wartość sprzedaży wybieramy funkcję Suma i włączamy opcję liczenia procentowych udziałów sprzedaży w ramach każdej kategorii w globalnej sprzedaży. ♦ Wybierz układ danych na raporcie, tzn. krój czcionki i sposób przedstawienia danych. ♦ Zapisz raport pod wybraną nazwą Raport oglądamy w trybie podglądu wydruku, natomiast w trybie projektowania możemy dokonać zmian zarówno w wyglądzie raportu, jak i w sposobie grupowania i agregowania wyświetlanych danych. Przełączeniu w tryb projektowania, podobnie jak dla formularzy, służy polecenie Widok Projekt z menu Widok. Struktura raportu jest dość rozbudowana i zawiera wiele sekcji. Nagłówek i Stopkę raportu, Nagłówek i Stopkę strony a ponadto nagłówek i stopkę grupy danych Kategoria - nagłówek/stopka oraz zasadniczą sekcję raportu, czyli Szczegóły. Wartości sumaryczne dla grupy obliczane są poprzez funkcję Suma w polu tekstowym znajdującym się w stopce grupy danych. Globalna suma obliczana jest w polu tekstowym w stopce raportu. Może się zdarzyć, że tekst danych w polach tekstowych zostanie obcięty (po prostu nie zmieści się w ramce). Problem ten rozwiązujemy w jeden z dwóch możliwych sposobów. Pierwszy to zwiększenie szerokości pól tekstowych jak się da najbardziej, tak by zmieściły się w nim jak najdłuższe teksty. Rozwiązanie alternatywne to włączenie atrybutu Można powiększać. Ustawienie to powoduje na wydruku dynamiczne dostosowanie wielkości pola tekstowego do jego zawartości - tekst zostanie złamany i wyświetlony w kilku wierszach. Sortowanie i grupowanie danych Aby otrzymać przejrzyste wydruki danych przechowywanych w bazie, konieczne jest ich uporządkowanie według określonego klucza. Struktura takiego uporządkowania może być wielopoziomowa. Przykładem może być pogrupowanie wartości sprzedaży według kategorii produktów, według daty sprzedaży lub według zakresu dat, np. wartości sprzedaży z danego tygodnia. Każdą grupę danych można teraz scharakteryzować pewną wartością zbiorczą, np. sumą. Innym przypadkiem uporządkowania danych jest ich sortowanie, które jest niczym innym jak ustawieniem danych w określonej kolejności. Samo jednak posortowanie danych nie prowadzi do wyodrębnienia z nich jakichkolwiek grup. Raporty, jako obiekty przeznaczone do tworzenia sprawozdań i wszelkiego rodzaju zestawień, zostały wyposażone w specjalne możliwości sortowania i grupowania danych. Grupowanie danych w raportach wygląda trochę podobnie jak w kwerendach podsumowujących, gdzie aby pogrupować wiersze według wartości jednego lub kilku pól, używaliśmy funkcji Grupuj według. Ustalenie sposobu grupowania oraz sortowania danych w raporcie odbywa się w polu dialogowym Sortowanie i grupowanie, otwieranym przyciskiem na pasku narzędzi lub poleceniem o tej samej nazwie z menu Widok. ♦ Otwórz w widoku Projekt raport stworzony w poprzednim przykładzie/ wybierz Menu Widok/ Sortowanie i grupowanie Wywołane pole dialogowe składa się z dwóch części, górnej, zawierającej nazwy pól (lub wyrażenia) w kolumnie Pole/Wyrażenie oraz sposób sortowania w kolumnie Porządek sortowania i dolnej, nazwanej Właściwości grupy. Wpisanie nazwy pola i wybór sposobu sortowania powodują odpowiednie uporządkowanie wartości tego pola w raporcie. Aby podzielić dane na grupy, trzeba użyć nagłówka zawierającego wartości pola grupującego lub stopki zawierającej podsumowanie wartości w danej grupie. W pierwszym utworzonym raporcie dane zgrupowane są według kategorii sprzedawanych produktów, czego wynikiem są dwie dodatkowe sekcje widoczne w projekcie raportu: Kategoria — nagłówek i Kategoria — stopka. Jak widać, nazwa grupy to nazwa pola, według którego grupowane są dane. W nagłówku grupy znajduje się pole tekstowe zawierające wartości pola Kategoria, w stopce zaś pole z wyrażeniem sumującym wartości pola Wartość sprzedaży i drugie, z odwołującym się do wartości pierwszego, wyrażeniem obliczającym procentowy udział wartości sprzedaży w danej kategorii w kwocie całkowitej. Wartość pola zawierającego podsumowanie sprzedaży ze stopki raportu dostępna jest na poziomie dowolnej grupy. W rezultacie dostajemy w raporcie listę grup oznaczonych opisami kategorii produktów z podsumowaniem każdej grupy. Atrybuty Grupuj według i Trzymaj razem pozwalają ustalić sposób grupowania. Pierwszy z nich, określa sposób grupowania w zależności od typu danych pola grupującego. Dla większości typów danych dostępne jest ustawienie Każda wartość, powodujące grupowanie według tych samych wartości danych z pola grupującego. (Ustawienie to zostało wykorzystane przez kreatora w naszym przykładzie, gdzie grupy tworzone są przez wiersze o identycznych wartościach pola Opis kategońi.) Dla danych typu tekstowego możliwe jest także grupowanie według Pierwszych znaków. Liczbę znaków, które mają być brane pod uwagę przy grupowaniu, należy wpisać w rubrykę atrybutu Przedział grupy. Może się to przydać przy grupowaniu danych według alfabetu (dane na literę A, B...), wtedy Przedział grupy wynosi 1, lub przy grupowaniu danych według identyfikatorów składających się z ciągu znaków, z których kilka pierwszych jest identycznych. Dane typu liczbowego można pogrupować według przedziału, którego długość określona jest wartością atrybutu Przedział grupy. Gdy wynosi ona np. 100, dane grupowane są w przedziałach od O do 99, od 100 do 199 itd. Dodatkowe możliwości grupowania pojawiają się dla danych typu Data/godzina. Na liście wartości atrybutu Grupuj według znajdujemy wówczas pozycje Rok, Kwartał, Miesiąc, Tydzień, Dzień, Godzina i Minuta. Ostatni atrybut grupy to Trzymaj razem, a jego wartości to: Nie, Całą grupę i Z pierwszym szczegółem. Atrybut ten dotyczy drukowania grupy z uwzględnieniem podziału na strony. Normalnie jest on wyłączony, więc koniec strony może pojawić się w dowolnym miejscu grupy. Wartość Całą grupę wymusza przechodzenie do nowej strony zawsze, gdy na poprzedniej grupa nie mieści się w całości, to jest razem z nagłówkiem i stopką. Kiedy grupa jest zbyt duża, by zmieścić się na jednej stronie, ustawienie to jest ignorowane. Trzecia wartość pozwala zabezpieczyć się przed pozostawieniem na kończącej się stronie nagłówka grupy bez jednego choćby wiersza danych należącego do tej grupy. Access pozwala grupować dane według wartości wielu pól lub wyrażeń jednocześnie. W ten sposób możemy wewnątrz każdej grupy określonej przez kategorię produktów wyodrębnić podgrupy, np. ze względu na datę sprzedaży, a te z kolei podzielić według wartości sprzedaży. Włączenie atrybutu Ukryj powtórzenia powoduje nie wyświetlanie formantów przyjmujących te same wartości w kolejnych wierszach. Dzięki temu znacznie poprawia się czytelność raportu i tym nie trzeba wtedy używać grupowania wierszy. Obliczenia w raportach Podobnie jak formularze, raporty również mogą zawierać pola wyliczeniowe. Źródłem danych w takim przypadku jest wyrażenie, a nie pole tabeli lub zapytania źródłowego. Zasady przypisywania formantom wyrażeń są identyczne jak w formularzach. Wpisujemy je jako wartość atrybutu Źródło formantu, zaczynając zawsze od znaku równości. Najistotniejszą rolę w przypadku raportów odgrywają obliczenia z użyciem funkcji agregujących, najczęściej funkcji sumowania. Dzięki opisanym powyżej możliwościom grupowania danych raporty pozwalają na obliczanie sum częściowych dla każdej grupy danych. Aby obliczyć taką sumę częściową, należy uaktywnić stopkę grupy danych (włączyć atrybut Stopka grupy w polu Sortowanie i grupowanie) i umieścić w niej pole tekstowe z wyrażeniem sumującym, np. =Suma([Kwota]) (w angielskim Accessie należy użyć funkcji Sum). Pole wyliczeniowe z wyrażeniem sumującym umieszczone w stopce raportu obliczy sumę globalną. Oprócz sumowania globalnego i w grupach możemy także obliczać sumy bieżące, których wartości uwzględniają sumy częściowe kolejnych grup. Jako przykład zastosowania weźmy ewidencję sprzedaży. Oprócz podsumowania wartości sprzedaży za każdy dzień chcielibyśmy także znać wartość sprzedaży, powiedzmy od początku bieżącego miesiąca. Ta ostatnia liczba to właśnie suma bieżąca (krocząca), zmieniająca się każdego dnia. Możliwości kumulatywnego sumowania danych w polu tekstowym zależą od ustawienia, dostępnego tylko dla pól tekstowych w raportach, atrybutu Suma bieżąca. Atrybut ten jest standardowo wyłączony, ale może też przyjmować wartość W grupie lub Wszędzie. ♦ Otwórz raport zestawiający sprzedaż według kategorii. ♦ Umieść w stopce każdej grupy duplikat pola z sumą częściową i zmień mu ustawienie atrybutu Suma bieżąca na Wszędzie (Oczywiście dla pierwszej grupy wartości obydwu pól w stopce będą równe, dla ostatniej wartość w polu z sumą kroczącą powinna być równa wartości globalnej w stopce raportu.) ♦ Ponumeruj automatyczne wiersze w raporcie wykorzystując atrybut Suma bieżąca: ♦ Umieść na blankiecie raportu w sekcji Szczegóły pole tekstowe zawierające wyrażenie =1. Normalnie, dla każdego wiersza danych raportu w polu takim wyświetlona zostałaby jedynka. Jednak włączenie atrybutu Suma bieżąca spowoduje, że w kolejnych wierszach raportu pojawią się kolejne liczby 1, 2, 3... Gdy sumowanie przeprowadzane jest po grupie, wówczas numeracja przeprowadzana jest oddzielnie dla każdej grupy. ♦ Na każdym raporcie można umieścić gotowe pola wyliczane wykorzystując polecenia Numery stron i Data i Godzina z menu Wstaw. Utwórz raporty będące wyjściami bazy danych - przykłady Rozbuduj bazę danych o elementy niezbędne do utworzenia zaplanowanych raportów. Pamiętaj, że aby otrzymać raport zawierający określone dane, trzeba te dane wcześniej zebrać w odpowiedniej tabeli, wprowadzić za pomocą formularzy (interface użytkownika) i dopiero można utworzyć raport oparty na tabeli lub najlepiej na kwerendzie. Na podstawie przechowywanych w bazie danych dotyczących sprzedaży i wydatków dokumenty te są automatycznie wypełniane i mogą być wydrukowane. Raporty najlepiej uruchamiać za pomocą przycisków umieszczonych na poszczególnych formularzach lub z osobnego formularza – Panelu Głównego, lub pomocniczego. ♦ Utwórz kwerendy wybierające, których źródłem będą dodane w punkcie 0 tabele i tabele utworzone za pomocą kwerend. ♦ Skonstruuj oparte na nich raporty pokazujące wierzytelności i dokonane płatności ♦ Utwórz raport faktury VAT Raport oprócz nagłówka z nazwą, numerem dokumentu i datą sprzedaży zawiera dane sprzedawcy (stała część), dane nabywcy, dane o sprzedaży i część końcową z wyszczególnieniem kwoty do zapłaty oraz miejscem na podpisy kontrahentów. Raport jest dwustronicowy, pierwsza strona to oryginał, druga to kopia, oczywiście każda strona zawiera identyczne dane. Dzięki temu zarówno kopia, jak i oryginał są drukowane jednocześnie. Inną konsekwencją tego faktu jest umieszczenie wszystkich elementów raportu w sekcji szczegółów, bez korzystania z nagłówków i stopek. W polu z datą wystawienia dokumentu oraz z adresem nabywcy wykorzystano wyrażenie łączące stały tekst z wartością pola źródłowego. Zabieg ten sprawia, że tekst pozbawiony jest dużych przerw, jak to ma miejsce przy użyciu pola tekstowego z etykietą. Operatorem łączącym łańcuchy tekstowe jest znak &, a przykładowe wyrażenie wygląda tak: = [Miejscowość] &", ul." & [Adres] Najważniejszą częścią dokumentu jest wyliczenie towarów będących przedmiotem sprzedaży oraz szczegółowe rozliczenie wartości netto, podatku i wartości brutto według różnych stawek podatku. Wszystkie te elementy faktury reprezentowane są w naszym raporcie przez podraporty, czyli stworzone osobno raporty umieszczone następnie wewnątrz raportu głównego. Procedura umieszczania podraportu w raporcie głównym i ich wzajemnego powiązania jest identyczna jak dla formularzy. W tym przypadku polem łączącym jest pole z numerem faktury. Źródłem danych dla podraportów są specjalnie zdefiniowane zapytania. W podraporcie Faktura sprzedaży-szczególy wykorzystano nagłówek raportu, umieszczając w nim opisy poszczególnych rubryk, w części przeznaczonej na dane można umieścić po lewej pole w rubryce oznaczonej Lp. z użyciem tu opisanego wcześniej sposobu dynamicznej numeracji wierszy w raporcie, możliwej dzięki atrybutowi Suma bieżąca. W ten sposób wszystkie pozycje na fakturze będą zawsze ponumerowane. Wróćmy jeszcze na chwilę do raportu głównego. Zawiera on wyodrębnione Pole tekstowe oznaczone etykietą Do zaplaty. W polu tym powtórzona zostaje globalna wartość faktury. Wartość ta występuje także w podraporcie, który jako obiekt raportu głównego nazywa się Brutto, podczas gdy w rzeczywistości jest to raport Faktura sprzedaży-brutto. Aby móc odwołać się z poziomu raportu głównego do wartości pola należącego do podraportu, należy użyć wyrażenia, którego ogólna składnia wygląda następująco: = [Nazwa podraportu]. Raport! [Nazwa formantu], gdzie Nazwa podraportu to wartość atrybutu Nazwa dla podraportu, Nazwa formantu zaś to wartość tegoż atrybutu dla formantu (np. pola tekstowego) wewnątrz raportu używanego jako podraport. Gdy odwołujemy się do formantu na formularzu, zamiast słowa Raport należy użyć Formularz. W rozważanym przykładzie użyto wyrażenia: = [Brutto].Raport![ PoleSumOfWartość brutto] Po identyfikatorach Raport i Formularz nie trzeba wstawiać nazwy raportu (formularza). Access szuka wymienionego formantu na raporcie (formularzu) aktywnym, w przeciwnym razie wystąpi błąd, a zamiast wyniku wyrażenia, na wydruku lub w trybie podglądu, pojawi się napis #Nazwa?. Do formantów użytych w raportach i formularzach można odwoływać się także z poziomu zapytań. Przykładem jest zapytanie źródłowe raportu głównego Dane dofaktury-naglówek. Zawiera ono jako parametr wyrażenie: Formularze! [Ewidencja sprzedaży]! [Element pierwszy] Tu jednak użyto identyfikatora klasy obiektów systemowych Formularze, po którym musi wystąpić nazwa obiektu. Odwołując się do raportu, używamy identyfikatora Raporty. Użycie identyfikatorów Formularze lub Raporty wraz z nazwami obiektów pozwala odwołać się do dowolnego z otwartych formularzy lub raportów. Identyfikatory Formularz i Raport pozwalają odwołać się tylko do aktywnego formularza lub raportu. Dla wyjaśnienia należy dodać, że pole tekstowe o nazwie Element pierwszy w formularzu Ewidencja sprzedaży zawiera numer faktury. Dzięki odwołaniu się do wartości tego pola w zapytaniu źródłowym dla raportu z fakturą sprzedaży możemy drukować fakturę VAT zgodną z danymi w formularzu Ewidencja sprzedaży. ♦ Jako zadanie specjalne pozostaje opracowanie algorytmu zamiany wartości liczbowych na postać słowną, aby automatycznie wypełnić rubrykę Slownie. Najprościej, choć może niezbyt elegancko, będzie posłużyć się metodą spotykana gdzieniegdzie, a polegającą na zamianie poszczególnych cyfr na ich słowne odpowiedniki. W ten sposób zawrotna kwota 123 500 zł staje się w postaci słownej ciągiem: „jeden-dwa-trzypięć-zero-zero złotych zero-zero groszy". ♦ Do samodzielnego opracowania, opcjonalnie można utworzyć raport Książka przychodów i rozchodów. W przypadku braku danych źródłowych rozbuduj bazę o potrzebne tabele i kwerendy) Książka przychodów i rozchodów to podstawowy dokument firm o niewielkich obrotach. Winien on zawierać ewidencję wszelkiej sprzedaży i wydatków rozpisanych na szereg kategorii. W przypadku prowadzenia takiej ewidencji za pomocą komputera wymagany jest codzienny wydruk zestawienia przychodów i rozchodów. W przedstawianym przykładzie systemu bazy danych książka przychodów i rozchodów jest raportem zawierającym wszystkie potrzebne dane. Informacje te są wprowadzane do bazy poprzez formularze dotyczące sprzedaży oraz wydatków i przechowywane w różnych tabelach. Przed sporządzeniem dziennego raportu o przychodach i rozchodach uruchamiane są cztery zapytania gromadzące dane w jednej tabeli nazwanej Pomocnicza-Książka p/r. Są to zapytania dołączające. Jak już wspomniano, zarówno przychody, jak i rozchody są podzielone na szereg kategorii, w sumie jest ich siedem. Każdej z nich odpowiada jedna kolumna książki przychodów i rozchodów. Aby uzyskać zestawienie odpowiadające temu podziałowi, konieczne jest użycie zapytania krzyżowego, dla którego wartości pola Numer kolumny tabeli Pomocnicza-Książka p/r stanowić będą nagłówki kolumn. Zapytanie to jest bezpośrednim źródłem danych naszego raportu i nazywa się Książka p/r—Do wydruku. W przypadku takim, jak omawiany obecnie, to znaczy gdy źródłem danych dla raportu jest zapytanie krzyżowe, bardzo ważne jest ustalenie kolejności kolumn w zapytaniu poprzez wpisanie ich w rubrykę atrybutu Nagłówki kolumn. Bez tego raport nie będzie w stanie współpracować z zapytaniem, W przypadku formularzy opartych na zapytaniach krzyżowych nie musimy ustalać kolejności kolumn. Pozostaje jeszcze problem podsumowania przychodów i rozchodów z każdej kolumny na końcu strony. Gdy stron jest więcej, do podsumowania bieżącej strony (folio) należy dodać podsumowanie z poprzedniej strony (przeniesienie). W tym celu trzeba pogrupować dane w sposób nieco nietypowy, bo nie ze względu na wartość którejś z danych, ale ze względu na liczbę wierszy, jaka zmieści się na jednej stronie wydruku. Przy przyjętych rozmiarach rubryk na stronie mieści się 37 wierszy danych. Gdy podzielimy wszystkie dane przeznaczone do raportu na takie grupy, to w stopce każdej z nich bez problemu otrzymamy podsumowanie każdej kolumny w ramach grupy, czyli na jednej stronie, a ustawiając atrybut Suma bieżąca na Wszędzie, także podsumowanie od początku zestawienia. Jednak utworzenie grup ze względu na liczbę wierszy wymaga użycia wartości jednego z pól zapytania źródłowego do ponumerowania wierszy. Pole to bierze się z tabeli Pomocnicza-Książka p/r i jest typu Licznik. Stamtąd jego wartości przekazywane są zapytaniem źródłowym do raportu i choć nie są w nim wyświetlane, mogą być użyte jako kryterium grupowania.