Lekcja 16. Formularze i raporty w aplikacjach bazodanowych
ŚredniPo co się tego uczymy?
Zwykły użytkownik aplikacji nigdy nie widzi ani nie pisze SQL-a — wypełnia formularz albo klika w raport. Ta lekcja pokazuje, jak najprostsze formularze i raporty łączą to, czego się nauczyłeś (DML, SELECT, agregacje) z rzeczywistym interfejsem użytkownika.
Teoria
Formularz to interfejs, przez który użytkownik wprowadza dane, które w tle trafiają do bazy poleceniem INSERT albo UPDATE — użytkownik nie widzi SQL-a, tylko wypełnia pola i klika przycisk.
Raport to zestawienie danych z bazy, zwykle będące wynikiem gotowego zapytania SELECT (często z JOIN i funkcjami agregującymi), przygotowane w czytelnej, uporządkowanej formie do przeglądania albo wydruku.
W SQL można przygotować gotowy "szkielet" raportu jako WIDOK (VIEW) — to zapisane na stałe zapytanie, które wygląda i zachowuje się jak tabela, ale zawsze pokazuje aktualne dane:
CREATE VIEW RaportSprzedazy AS
SELECT p.nazwa, SUM(z.ilosc) AS sztuk_sprzedanych, SUM(z.ilosc * p.cena) AS wartosc
FROM Zamowienia z
JOIN Produkty p ON z.id_produktu = p.id_produktu
GROUP BY p.nazwa;
Od tej pory wystarczy napisać SELECT * FROM RaportSprzedazy;, żeby dostać gotowe zestawienie — bez przepisywania długiego zapytania za każdym razem.
Prosty formularz w praktyce to formularz HTML połączony ze skryptem po stronie serwera (np. w PHP albo ASP.NET), który po kliknięciu "Zapisz" wykonuje polecenie INSERT z danymi wpisanymi przez użytkownika.
Przykład z życia
Sekretariat szkoły wypełnia formularz "nowy uczeń" w systemie — w tle wykonuje się INSERT do tabeli Uczniowie. Dyrektor otwiera "raport frekwencji" — w tle wykonuje się gotowe zapytanie SELECT z GROUP BY, które ktoś wcześniej zapisał jako widok.
Kod (SQL)
-- Widok jako gotowy "raport" zawsze pokazujący aktualne dane
CREATE VIEW RaportUczniowieKlasy AS
SELECT k.nazwa AS klasa, COUNT(u.id_ucznia) AS liczba_uczniow, AVG(u.srednia_ocen) AS srednia_klasy
FROM Klasy k
LEFT JOIN Uczniowie u ON k.id_klasy = u.id_klasy
GROUP BY k.nazwa;
-- korzystanie z gotowego raportu jest już bardzo proste:
SELECT * FROM RaportUczniowieKlasy ORDER BY srednia_klasy DESC;
-- prosty formularz HTML wysyłający dane do skryptu zapisującego je do bazy
-- (fragment pliku .html)
-- <form action="zapisz_ucznia.php" method="POST">
-- <input type="text" name="imie" placeholder="Imię">
-- <input type="text" name="nazwisko" placeholder="Nazwisko">
-- <button type="submit">Zapisz</button>
-- </form>
Komentarz i wyjaśnienie kodu
Widok RaportUczniowieKlasy zapisuje na stałe całe zapytanie z JOIN-em i GROUP BY — od tej chwili każdy, kto chce zobaczyć raport, po prostu odpytuje go jak zwykłą tabelę (SELECT * FROM RaportUczniowieKlasy), bez konieczności pamiętania i przepisywania oryginalnego, bardziej złożonego zapytania. Fragment HTML na końcu pokazuje samą "powierzchnię" formularza — pola tekstowe imie i nazwisko trafiają po kliknięciu przycisku do skryptu zapisz_ucznia.php, który dopiero tam wykonuje właściwe polecenie INSERT (tego typu skrypty poznasz szerzej w dziale aplikacji webowych).
Ćwiczenie samodzielne
Stwórz widok VIEW pokazujący dla każdego klienta liczbę złożonych zamówień i sumę ich wartości, korzystając z tabel z lekcji o JOIN-ach.
Zadania do pracy własnej
Zadanie 1. Raporty dla sklepu muzycznego
Uwaga przed importem: plik z bazą jest spakowany jako
.gz. phpMyAdmin w XAMPP przyjmuje takie pliki bez rozpakowywania. Jeżeli po pobraniu nazwa wygląda np.sklep_muzyczny.sql_.gzi import nie przejdzie, zmień nazwę pliku nasklep_muzyczny.sql.gz, a potem wybierz go w zakładce Importuj.Baza do pracy: Sklep muzyczny (.sql.gz). Zaimportuj spakowany plik SQL w XAMPP/phpMyAdmin, a następnie wykonaj zapytania.
- Przygotuj raport sprzedaży według kategorii.
- Przygotuj raport klientów według miasta.
- Przygotuj raport produktów poniżej minimalnego stanu.
- Przygotuj raport dziennej sprzedaży.
- Przygotuj raport TOP 3 produktów według wartości sprzedaży.
- Przygotuj raport zamówień z pełnymi danymi klienta.
- Przygotuj raport średniej ceny w kategoriach.
- Przygotuj raport klientów bez e-maila.
- Przygotuj raport produktów bez zamówień.
- Przygotuj raport danych do formularza wyboru produktu.
Zadanie 2. Raporty dla apteki
Uwaga przed importem: plik z bazą jest spakowany jako
.gz. phpMyAdmin w XAMPP przyjmuje takie pliki bez rozpakowywania. Jeżeli po pobraniu nazwa wygląda np.sklep_muzyczny.sql_.gzi import nie przejdzie, zmień nazwę pliku nasklep_muzyczny.sql.gz, a potem wybierz go w zakładce Importuj.Baza do pracy: Apteka Zdrowie (.sql.gz). Zaimportuj spakowany plik SQL w XAMPP/phpMyAdmin, a następnie wykonaj zapytania.
- Przygotuj raport sprzedaży według kategorii.
- Przygotuj raport klientów według miasta.
- Przygotuj raport produktów poniżej minimalnego stanu.
- Przygotuj raport dziennej sprzedaży.
- Przygotuj raport TOP 3 produktów według wartości sprzedaży.
- Przygotuj raport zamówień z pełnymi danymi klienta.
- Przygotuj raport średniej ceny w kategoriach.
- Przygotuj raport klientów bez e-maila.
- Przygotuj raport produktów bez zamówień.
- Przygotuj raport danych do formularza wyboru produktu.
Zadanie 3. Raporty dla siłowni
Uwaga przed importem: plik z bazą jest spakowany jako
.gz. phpMyAdmin w XAMPP przyjmuje takie pliki bez rozpakowywania. Jeżeli po pobraniu nazwa wygląda np.sklep_muzyczny.sql_.gzi import nie przejdzie, zmień nazwę pliku nasklep_muzyczny.sql.gz, a potem wybierz go w zakładce Importuj.Baza do pracy: Siłownia FitZone (.sql.gz). Zaimportuj spakowany plik SQL w XAMPP/phpMyAdmin, a następnie wykonaj zapytania.
- Przygotuj raport sprzedaży według kategorii.
- Przygotuj raport klientów według miasta.
- Przygotuj raport produktów poniżej minimalnego stanu.
- Przygotuj raport dziennej sprzedaży.
- Przygotuj raport TOP 3 produktów według wartości sprzedaży.
- Przygotuj raport zamówień z pełnymi danymi klienta.
- Przygotuj raport średniej ceny w kategoriach.
- Przygotuj raport klientów bez e-maila.
- Przygotuj raport produktów bez zamówień.
- Przygotuj raport danych do formularza wyboru produktu.
Typowe błędy
Częsty błąd to mylenie widoku (VIEW) ze zwykłą tabelą — widok nie przechowuje własnych danych, tylko za każdym razem na nowo wykonuje zapisane zapytanie, więc zawsze pokazuje aktualny stan, ale nie da się do niego swobodnie robić INSERT tak jak do zwykłej tabeli. Drugi błąd: tworzenie zbyt wielu bardzo podobnych widoków zamiast jednego, bardziej uniwersalnego zapytania z parametrami po stronie aplikacji. Trzeci: formularz bez żadnej walidacji danych po stronie serwera, co prowadzi do błędnych lub wręcz niebezpiecznych danych trafiających do bazy.
Nawiązanie do egzaminu zawodowego
To realizacja efektu INF.03.4.6 ("tworzy formularze, zapytania i raporty do przetwarzania danych") — łączy w sobie wcześniej poznane SELECT, JOIN i GROUP BY w praktyczne narzędzia, których użytkownik końcowy używa bez znajomości SQL-a.