Strona 1 z 1
[solved] Baza danych lekarzy, kilka pytań.
: sob maja 25, 2013 8:05 pm
autor: Rafal9018
Witam wszystkich serdecznie:)
Mam do zrobienia projekt bazy danych lekarzy, zrobiłem jedna wielką tabele z danymi tych lekarzy. Ostatnią kolumnę poświęciłem dla opini w skali punktowej. Założenie moje jest takie, że mam kilka głosów na dana osobę w skali od 0 do 9, liczę wartość średnią i wstawiam wynik do tabeli. Zrobiłem kwerendę która mi zlicza wartość średnią tych punktów. No i właśnie ta wartość średnią chciałbym umieścić w swojej kolumnie ale nie wiem jak. Szukałem sporo w google, ale niestety nic konkretnego. Dlatego też postanowiłem napisać na forum. Mam jeszcze jedno pytanie do Was, mianowicie o co chodzi z relacjami?? Szukałem też na ten temat troszkę, no niby teoretycznie wiem co i jak ale tak w praktyce jak to zastosować to nie mam pojęcia.
Proszę o wyrozumiałość i o odpowiedź. Pozdrawiam
Re: Baza danych lekarzy, kilka pytań.
: sob maja 25, 2013 11:15 pm
autor: hasheq
Relację możesz zastosować np zbierając głosy na lekarzy.
TLekarze -> dane lekarzy (idLekarza, itd)
TOceny -> idLekarza, Ocena
Re: Baza danych lekarzy, kilka pytań.
: ndz maja 26, 2013 11:28 am
autor: Jan_J
Za radą hasheq gromadź głosy w odrębnej tabeli. Dla uzyskania oceny sumarycznej masz dwie możliwości:
pierwsza: użyj zapytania, najlepiej w postaci perspektywy (CREATE VIEW), choć do pomyślenia jest także kwerenda.
druga: użycie wyzwalacza, czyli funkcji, które zaktualizuje ocenę sumaryczną przy okazji modyfikacji tabeli ocen. Maszyneria znacznie bardziej zaawansowana, mniej przenośna.
Obie metody zapewniają automatyzację.
Btw. ocena w skali 0 do 9 ma charakter rangowy -- tj. porządkowy, w oparciu o subiektywne kryteria. W takiej sytuacji zawsze mam wątpliwości, czy używać średniej jako miary. Wiem, niby wszyscy tak robią...
Re: Baza danych lekarzy, kilka pytań.
: ndz maja 26, 2013 7:38 pm
autor: Rafal9018
No już zrobiłem to liczenie tej średniej, wrzuciłem to do formularza i jest ok. Ale wciąż mam za mało relacji:/ Mam z tym problem i nie umiem tego wykorzystać w praktyce... Wrzucę to co zrobiłem, jeśli by ktoś doradził jak to rozwinąć te relacje będę wdzięczny.
Relacje Płeć podłapałem z YouTube z filmiku opisującego relacje, jeśli chodzi o relację Id_Opinie nie jestem do końca pewny czy jest to dobrze.
Re: Baza danych lekarzy, kilka pytań.
: ndz maja 26, 2013 8:29 pm
autor: Jan_J
Zauważ, że dwie tabele mają opisy nazw kolumn, a w trzeciej widać zawartość. W tym widoku zawartość tabel w ogóle nie jest ukazywana. Czyli tabela opinie jest do zaprojektowania od nowa.
(id_lekarz, data, ocena), ew. jakiś mechanizm wykluczający wielokrotne oddawanie głosu.
Re: Baza danych lekarzy, kilka pytań.
: pn maja 27, 2013 10:09 am
autor: Rafal9018
W trzeciej tabeli nie do końca jest umieszczona zawartość. Miałem na myśli, żeby do konkretnego lekarza przypisać po prostu ocenę jaką dostał. A numer Id_oceny to numer kolejnego anonimowego głosu. Zdecydowałem się na takie rozwiązanie ponieważ obliczanie średniej jest kolumnowe. Właśnie próbowałem zaprojektować taką tabele jak proponowałeś (id_lekarz, data, ocena) no i wtedy już by była relacja połączona z id_lekarza z głównej tabeli do tej trzeciej. Niestety pada mój system liczenia średniej ocen, który po prostu muszę mieć w tej bazie. No chyba, że jest jakieś inne rozwiązanie??
Proszę o wyrozumiałość bazą danych zajmuje się od nie dawna i jest to nie łatwy program do ogarnięcia.
Re: Baza danych lekarzy, kilka pytań.
: pn maja 27, 2013 10:59 am
autor: Jan_J
Rafal9018 pisze:Zdecydowałem się na takie rozwiązanie ponieważ obliczanie średniej jest kolumnowe. Właśnie próbowałem zaprojektować taką tabele jak proponowałeś (id_lekarz, data, ocena) no i wtedy już by była relacja połączona z id_lekarza z głównej tabeli do tej trzeciej. Niestety pada mój system liczenia średniej ocen, który po prostu muszę mieć w tej bazie. No chyba, że jest jakieś inne rozwiązanie??
Na skróty nie znaczy prościej. Jeżeli pani doktor zmieni nazwisko, albo nowy lekarz rozpocznie pracę, trzeba będzie zmodyfikować strukturę Twojej bazy. Bez sensu, w takich przypadkach należy jedynie zaktualizować zawartość.
Oczywiście, tabela oceny powinna wiązać się referencją z tabelą lekarze. Liczysz średnie metodą grupowania i wypisujesz w złączeniu. Schematycznie
Kod: Zaznacz cały
select lekarz, avg(ocena) as "średnia"
from lekarze left join oceny using(id_lekarza)
group by id_lekarza, lekarz
order by ...
Zwróć uwagę na grupowanie wg identyfikatora (żeby wymusić sensowną agregację średnich)
i wg imion/nazwisk (żeby umożliwić pokazanie pogrupowanych danych w zrozumiałej formie).
Bazy danych mają dość głębokie podstawy, jeżeli musisz się tym zajmować na poważnie, podejście typu “obsłużyć program” nie wystarczy. Książka Hernandeza
Bazy danych dla zwykłych śmiertelników na początek, potem w miarę potrzeby Date
Relacyjne bazy danych dla praktyków, a następnie Ullman i Widom
Podstawowy kurs systemów baz danych. Do tego dokumentacje SQLite, PostgreSQL, MySQL w zakresie typów danych i podstawowej składni zapytań SQL.
Re: Baza danych lekarzy, kilka pytań.
: pn maja 27, 2013 9:01 pm
autor: hasheq
Jan_J pisze:Za radą hasheq gromadź głosy w odrębnej tabeli. Dla uzyskania oceny sumarycznej masz dwie możliwości:
pierwsza: użyj zapytania, najlepiej w postaci perspektywy (CREATE VIEW), choć do pomyślenia jest także kwerenda.
druga: użycie wyzwalacza, czyli funkcji, które zaktualizuje ocenę sumaryczną przy okazji modyfikacji tabeli ocen. Maszyneria znacznie bardziej zaawansowana, mniej przenośna.
Obie metody zapewniają automatyzację.
Btw. ocena w skali 0 do 9 ma charakter rangowy -- tj. porządkowy, w oparciu o subiektywne kryteria. W takiej sytuacji zawsze mam wątpliwości, czy używać średniej jako miary. Wiem, niby wszyscy tak robią...
Co do triggera nie polecam nie wiem jak LO4.0 ale w 3.6 mimo długiej walki nie udało się (LO używa chyba HSQLDB 2.2.x., która nie wspiera triggerów) niestety z updatem do wyższej sobie nie poradziłem więc chętnie przyjmę poradnik bo idąc po tych od wuja nie dałem rady.
Rafal jak już tak idziesz z tymi relacjami to możesz obywatelstwa wywalić do innej tabeli, jak również miasta, kraj itd

Re: Baza danych lekarzy, kilka pytań.
: wt maja 28, 2013 2:40 pm
autor: Rafal9018
Dzięki, poprawki już wprowadziłem myślę że jest ok:) chciałbym udoskonalić swoją bazę, mianowicie o przyciski w formularzu. Szukałem na necie sporo, wiem że używa się do tego makra ale znaleźć już gotowego makra nie mogłem. Czy ma ktoś takie makro i wytłumaczyłby krok po kroku jak to ogarnąć??:) Interesuje mnie zrobienie przycisku np. zamknięcia formularza i przełączania miedzy innymi formularzami. Widziałem podobny temat:
http://forum.openoffice.org/pl/forum/vi ... ?f=8&t=391 załącznik formularze_zakladki_v2.odb
Z góry dziękuję za pomoc:)
Re: Baza danych lekarzy, kilka pytań.
: wt maja 28, 2013 8:19 pm
autor: belstar
Do zamknięcia formularz nie jest potrzebne ci żadne makro. Po prostu wstaw przycisk i we właściwościach ustaw tak jak na obrazku.
Do otworzenia formularza użyj poniższego makra, z małym zastrzeżeniem – przycisk musi się nazywać tak samo jak otwierany formularz – dlaczego? Ano dlatego żeby jednym makrem otwierać różne formularze. Makro
OtworzFormularz przypisz do zdarzenia
Wykonaj działanie
.
Kod: Zaznacz cały
Sub OtworzFormularz(oEvent)
openform(oEvent.Source.Model.Name)
End Sub
function openform(sNewFormName as string ) as object
' Give the name of the form you want open.
' It will only work with OO03.1 or higher
'Don't be scared of this long sub.
' Most is for testing if all things are good
dim oNewForm ' This object is for subdocument.
dim oNewFormopen ' This is the text document. Now you can reach the forms and the controls
' Test if your version of OOo is capabel for this code
if GetSolarVersion < 310 then
print "Twoja wersja Open Offica jest za stara zainstaluj nowszą"
end
end if
' Go for the object of the subdocument
if ThisDatabaseDocument.FormDocuments.hasbyname(sNewFormName) then
oNewForm=ThisDatabaseDocument.FormDocuments.getbyname(sNewFormName)
else
Print "Ta baza danych nie posiada formularza o tej nazwie"
end
end if
if not HasUnoInterfaces(oNewForm,"com.sun.star.sdb.XSubDocument") then
' It is possible that you use a mapname and this is not good working
' for that reason I did not work it out.
msgbox "Twoja wersja Open Offica jest niekompatybilna z tym kodem" & chr(13) _
& "Program zostanie zatrzymany"
end
end if
' All things are tested and good open the form
openform = oNewForm.open ' This give also back an object with is the same as thiscomponent
end function
Pobierz przykład
http://forum.openoffice.org/pl/forum/vi ... =13&t=1830 i go przeanalizuj. Znajdziesz tam o wiele więcej, co możesz wykorzystać.
Re: Baza danych lekarzy, kilka pytań.
: wt maja 28, 2013 11:38 pm
autor: Rafal9018
Zastosowałem Twoje wskazówki, co do przycisku zamknij wszystko działa. Natomiast co do przycisku otwierania nowego formularza występuje mały błąd mianowicie:
Tak jak napisałeś krok po kroku zrobiłem.
Re: Baza danych lekarzy, kilka pytań.
: śr maja 29, 2013 8:45 am
autor: belstar
Wstaw punkt przerywania w pierwszej linijce funkcji OpenForm i wciśnij przycisk, który otwierać ma formularz. Po uruchomieniu funkcji procedura powinna przerwać wykonywanie w punkcie który wstawiłeś. Najedź kursorem na zmienną sNewFormName w dymku powinna pojawić się zawartość tejże, jeśli jest to dokładnie nazwa twojego formularza do otwarcia powinno być wszystko OK - wstaw plik przykładowy, jeśli jest inna popełniłeś błąd w nazwie przycisku.
Re: Baza danych lekarzy, kilka pytań.
: śr maja 29, 2013 11:03 am
autor: Rafal9018
Mam problem z ustawieniem tego punktu przerwania bo nie bardzo wiem o co w tym chodzi. Zrobiłem przykładową bazę danych tak na szybko. Jeśli to nie stworzy dla Ciebie problemu zobacz co tam zrobiłem źle i w którym momencie.
Edit:
Ustawiłem ten punkt przerwania w drugiej lini. Natomiast program informuję, nie ustawiono zmiennej języka Basic. Metoda prób i błędów, tam gdzie jest pole czujka wpisałem nazwę swojego formularza. Wraz z tym pojawiła się zmienna. Błędu już nie wyrzuca tylko jak klikam przycisk jest brak reakcji.
Re: Baza danych lekarzy, kilka pytań.
: śr maja 29, 2013 6:40 pm
autor: Jan_J
Zamieszczony załącznik nie zawiera makr. Przycisk odwołuje się do makra z biblioteki osobistej (Standard.Module1.OtworzFormularz), które zostało na Twoim dysku.
Re: Baza danych lekarzy, kilka pytań.
: śr maja 29, 2013 7:58 pm
autor: Rafal9018
Faktycznie zapisałem makro u siebie na dysku. Zapisałem teraz w dokumencie powinno być dobrze w tym momencie. Użyłem całego makra, które kolega wyżej wstawił.
Re: Baza danych lekarzy, kilka pytań.
: śr maja 29, 2013 8:32 pm
autor: belstar
Napisałem:
belstar pisze:przycisk musi się nazywać tak samo jak otwierany formularz
Zapomniałem dodać
dokładnie tak samo, wliczając w to wielkość liter. Masz formularz
kontakt a przycisk nazwałeś
Kontakt. Po zmianie wszystko działa jak należy (u mnie).
Re: Baza danych lekarzy, kilka pytań.
: śr maja 29, 2013 9:02 pm
autor: Rafal9018
Hmm no fakt popełniłem tutaj błąd wielkości liter. Ale pobrałem teraz ten dokument co poprawiłeś i klikam przycisk i brak jakiej kol wiek reakcji:/ jaka masz wersje office?? może tu tkwi problem??
Re: Baza danych lekarzy, kilka pytań.
: śr maja 29, 2013 9:53 pm
autor: belstar
LO 3.5 i LO 4, na obu działa
Sprawdź Narzędzia > Opcje > Bezpieczeństwo > Bezpieczeństwo makr > ustaw Średni
Re: Baza danych lekarzy, kilka pytań.
: śr maja 29, 2013 11:51 pm
autor: Rafal9018
Zmieniłem bezpieczeństwo na średnie, zainstalowałem LO 3.5 i niestety nic to nie dało:/
Re: Baza danych lekarzy, kilka pytań.
: pt maja 31, 2013 12:14 pm
autor: Rafal9018
Ogarnąłem już te błędy:) Dziękuję wszystkim za pomoc, wszystko działa jak się należy:) Dzięki!!! pozdrawiam wszystkich

Re: [solved] Baza danych lekarzy, kilka pytań.
: sob cze 08, 2013 1:57 pm
autor: Rafal9018
Witam ponownie

piszę gdyż projekt mojej bazy został zwrócony :/ Wszystko ładnie działa z przyciskami. Chodzi o to że jak jestem w formularzu A i znajdę sobie rekord który mnie interesuję np. o numerze id 15 to przeskakując do drugiego formularza B gdzie są np. dane kontaktowe mam rekord 1. A czy da się jakoś zrobić, że jestem w formularzu A przy id 15 i przeskakuje do formularza B i od razu jestem przy id 15??

Druga sprawa jaką, źle zrobiłem to jest system ocen na danego lekarza. Mianowicie nazwy kolumn to było imię i nazwisko lekarza, tak jak Jan_J mnie uprzedzał to jest błąd. Postanowiłem więc zrobić nową tabele, ale jest problem :/ Projekt tej tabeli miał wyglądać następująco:

- Przechwytywanie.JPG (11.63 KiB) Przejrzano 12558 razy
Problem stwarza dla mnie to, że jeśli będę chciał powtórzyć id to wyskakuję błąd, że id się dubluje. A wywołanie kolejny raz tego samego id to po prostu by była kolejna ocena na danego lekarza. Jeśli ktoś ma jakieś pomysł jak to zrobić chętnie wysłucham, bądź inna koncepcję tabeli trzeba wprowadzić.
PS. Jan_J, belstar Bardzo dziękuję wam za pomoc, nie wiem jak mam nawet dziękować

Macie u mnie piwo

Re: [solved] Baza danych lekarzy, kilka pytań.
: ndz cze 09, 2013 10:36 pm
autor: Jan_J
Rafal9018 pisze:[...] że jeśli będę chciał powtórzyć id to wyskakuję błąd, że id się dubluje. A wywołanie kolejny raz tego samego id to po prostu by była kolejna ocena na danego lekarza.[...]
id znaczy, jak rozumiem, id_lekarza w tabeli oceny.
id_lekarza w tabeli lekarze jest tzw. kluczem głównym (primary key). Jednym z wymagań każdego klucza jest jego niepowtarzalność. Ustawienie kolumny jako klucza głównego dokonujesz w projekcie tabeli, wskazując kolumnę prawym przyciskiem i opisując ją jako klucz. (Inna metoda to dyrektywa ALTER TABLE .. ADD CONSTRAINT ... PRIMARY KEY ... sformułowana bezpośrednio w SQL-u.) Decyzja jest obrazowana za pomocą małej ikonki klucza.
W tabeli oceny oczywiście identyfikator lekarza ma prawo wystąpić dowolnie wiele razy, nie może być więc kluczem głównym. Jeżeli taka decyzja została podjęta, trzeba się z niej wycofać. Tabela oceny mogłaby prawdę mówiąc nie mieć klucza głównego.
Natomiast id_lekarza jest w niej tzw. kluczem obcym. Znaczy to, że może przyjmować tylko takie wartości, jakie ma pewna inna kolumna w pewnej (innej) tabeli. W tym przypadku id_lekarza w tabeli lekarze.
Graficzny interfejs pozwala opisać kolumnę jako klucz obcy za pomocą opcji Narzędzia/Relacje. (Inna metoda to sformułowanie dyrektywy ALTER TABLE .. ADD CONSTRAINT ... FOREIGN KEY ... REFERENCES ... bezpośrednio w SQL-u.)
PS. Inne rodzaje więzów nakładanych na kolumny, jak ograniczenia zakresu wartości (CHECK) oraz wymagania unikalności (UNIQUE) w interfejsie Base wymusza się za pomocą jawnie sformułowanych żądań SQL (Narzędzia/SQL) w dialekcie stosownym do wykorzystanego systemu zarządzania bazą danych (domyślnie dla baz wbudowanych jest to HSQL DB).
Re: [solved] Baza danych lekarzy, kilka pytań.
: pn cze 10, 2013 4:11 pm
autor: Rafal9018
Zrobiłem nowy projekt tabeli.
Ogólnie chciałem z tych ocen robić średnia. Czy jest może możliwość zrobienia takiej kwerendy??
Po prostu pierwsza kolumna to lekarz o id numer 1, zaraz zanim jego ocena, kolumna 3 to by był lekarz o id numer 2 i potem jego ocena. Także w każdej kolumnie byłby konkretny lekarz i jego oceny, dzięki czemu można by zrobić wartość średnia. Niestety jak tworzyłem kwerendę jak na obrazku wyżej nie dostawałem żadnego wyniku. Hmm, jest jakiś sposób utworzyć taka kwerendę, ale zastosować jakieś inne rozwiązanie??

Re: [solved] Baza danych lekarzy, kilka pytań.
: pn cze 10, 2013 8:57 pm
autor: Jan_J
Zajrzyj do widoku SQL, co tam wyszło. Lepiej się go czyta i pisze, niż pozornie łatwiejsze formularze projektowe kwerend.
Minimalnie:
Kod: Zaznacz cały
select id_lekarza, avg(ocena) from oceny group by id_lekarza
Sensownie:
Kod: Zaznacz cały
select imie, nazwisko, avg(ocena) from oceny join lekarze using(id_lekarza) group by id_lekarza, imie, nazwisko
Zastrzeżenia:
* średnia z danych w skali porządkowej jest wątpliwa
* jeżeli nawet, to wymaga unikalności: jedna ocena od jednego pacjenta za jedną rzecz, w praktyce zapewne można wymusić UNIQUE (id_lekarza, id_ocena).