Dziennik lekcyjny jako baza danych w Access


(Maxer 1992) #1

Witam. Mam za zadanie stworzyć dziennik lekcyjny jako baza danych w Microsoft Access. Funkcjonalność jaką ma spełniać to :

  • dodawanie, edytowanie klas

  • dodawanie, edytowanie uczniów

  • dodawanie, edytowanie przedmiotów

  • dodawanie ocen z przedmiotów z podziałek na kartkówki,sprawdziany itd. (potrzebne do średniej ważonej) poszczególnym uczniom

  • obliczanie średniej ważonej ocen poszczególnym uczniom z poszczególnych przedmiotów

  • musi też być zawarta tabela z wagami ocen aby można je edytować np. sprawdzian - waga 3 , kartkówka - waga 2 itd.

Narazie stworzyłem 3 tabele :

  • Uczniowie ( ID_U, Imię, Nazwisko)

  • Oceny ( ID_U,Ocena, ID_P)

  • Przedmioty (ID_P , przedmiot )

Relacje wyglądają tak : Uczniowie -- 1-N--- Oceny --- N - N------ Przedmioty

Nie wiem jak za bardzo ruszyć dalej bo w takim układzie jeśli stworze formularz dodawania ocen to do wyboru mam ID_U , ID_P i Ocena a musiałoby być (Imię Nazwisko), (Przedmiot), (Ocena) . Nie mam też pomysłu jak stworzyć kwerendę która będzie liczyć średnią ważoną. Bardzo proszę o wszelką pomoc. Pozdrawiam


(Tomek Matz) #2

Tabele robisz dobrze. Potrzebne są małe modyfikacje:

Klasa (ID_K, Nazwa) -> Nazwa musi być unikalna

Uczen ( ID_U, ID_K, Imie, Nazwisko)

Przedmiot (ID_P , Nazwa) -> Nazwa musi być unikalna

Ocena ( ID_P, ID_U, ID_R,Ocena)

OcenaRodzaj( ID_R, Nazwa) - Nazwa to np. Sprawdzian, Kartkówka itd. (Nazwa musi być unikalna)

Waga (ID_W, ID_R, Waga) - Wagi dla poszczególnych nazw rodzajów ocen. (ID_R musi być unikalne)

EDIT: Jeśli zrobisz takie tabele to zapytanie liczące średnią ważoną wygląda następująco:

SELECT SUM(temp.licznik) / SUM(temp.mianownik)

FROM

(

	SELECT SUM(o.Ocena * w.Waga) licznik, SUM(w.Waga) mianownik

	FROM Ocena o, Waga w

	WHERE o.ID_P = 1 AND o.ID_U = 1 AND o.ID_R = w.ID_R

	GROUP BY o.ID_R

) temp

Sęk w tym, że uruchamiałem je w MS SQL Server. Nie jestem pewien, czy MS Access obsługuje agregację i operator / (po prostu nie pamiętam :D). Sprawdzisz sobie sam.


(Maxer 1992) #3

Stworzyłem takie tabele. I teraz relacje po kolei do tabel ID do ID tak ? A jak stworzyć żeby w formularzu pokazywało normalnie np. do wyboru przedmiot z bazy a nie ID_P ? Tego kodu średniej ważonej nie wiem gdzie wpisać bo w kwerendzie nie ma takiego pola tylko wybiera się co ma wyświetlić ...


(Tomek Matz) #4

Dokładnie, musisz potworzyć klucze główne i obce (czytaj więzy integralności).

Co do formularzy to nie pamiętam jak się je obsługiwało w Access. Szukaj we właściwościach. Będziesz musiał pewno utworzyć kwerendę i ustawić ją jako źródło danych tego formuarza.

Jeśli chodzi o to zapytanie SQL. Jak jesteś w kreatorze kwerendy to kliknij prawym myszy na jej obszarze i wybierz Widok SQL (o ile coś takiego będzie).


(Maxer 1992) #5

A więc tak :

  • znalazłem widok SQL , pokazuje "błąd składniowy (brak operatora) w wyrażeniu kwerendy .... więc faktycznie nie obsługuje chyba tego operatora

  • Moje relacje wyglądają tak

61access.jpg

Teraz będę szukać o formularzach , faktycznie abym mógł skorzystać z danych z różnych tabel w jednym formularzu muszę użyć kwerendy

  • Ma to funkcjonować w formie graficznej dlatego zależy mi tak bardzo na formularzach , że z menu głównego przechodzisz np. do dodaj ocenę lub dodaj ucznia , gdybyś wiedział jak to wszystko ustawić proszę o info

Pozdrawiam i do tej pory już bardzo dziękuję bo nadałeś mi dobry trop :slight_smile:


(Tomek Matz) #6

Możesz wrzucić ten pik Access na jakiś serwer i wysłać mi link na priva to spróbuję poprawić to zapytanie, żeby działało. (coś czuję, że powinno być as temp , ale to strzał). Jeśli chodzi o te tabele, to lepiej tworzyć ich nazwy w liczbie pojedynczej, czyli zamiast Uczniowie -> Uczen. Nie używaj też polskich liter w nazwach kolumn/tabel, czyli Imie zamiast Imię. Tak jak teraz patrzę to nawet byś mógł usunąć tabelę Waga i w tabeli OcenaRodzaj dodać kolumnę Waga i tam powstawiać wartości. Bo tak to są teraz dwie tabele pomiędzy, którymi jest relacja 1 do 1. Gdy to wszystko zrobisz to sama struktura bazy danych będzie już ok.

Jeśli chodzi o formularze, to da się zrobić to o czym mówisz, ale jak już pisałem, nie pamiętam jak się to robiło. Generalnie jak będziesz szukał jakiegoś info to skoncentruj się na dwóch właściwościach:

Formularz -> Dane -> Źródło danych (tu wybierasz tabelę lub podajesz nazwę kwerendy)

Pole tekstowe -> Dane -> Źródło formantu (tu podajesz nazwę kolumny)

-- Dodane 14.12.2010 (Wt) 0:14 --

Brakowało AS. Tutaj poprawione zapytanie. Wyliczy średnią dla ucznia o ID_U = 0 i dla przedmiotu o ID_P = 0.

SELECT Sum(temp.licznik)/Sum(temp.mianownik) AS Srednia

FROM 

(

SELECT SUM(o.Ocena*w.Waga) AS licznik, SUM(w.Waga) AS mianownik 

FROM Ocena AS o, Waga AS w 

WHERE o.ID_P=0 And o.ID_U=0 And o.ID_R=w.ID_R 

GROUP BY o.ID_R

) AS temp;

Napisałem też trochę inną wersję tego zapytania. Wyliczy średnią dla każdego ucznia i każdego przedmiotu (niestestowane, ale powinno działać).

SELECT temp.Uczen, temp.Przedmiot, Sum(temp.licznik)/Sum(temp.mianownik) AS Srednia

FROM 

(

SELECT o.ID_U AS Uczen, o.ID_P AS Przedmiot, SUM(o.Ocena*w.Waga) AS licznik, SUM(w.Waga) AS mianownik 

FROM Ocena AS o, Waga AS w 

WHERE o.ID_R=w.ID_R 

GROUP BY o.ID_U, o.ID_P, o.ID_R

) AS temp

GROUP BY temp.Uczen, temp.Przedmiot;