[solved] Baza danych lekarzy, kilka pytań.

Użytkowanie programu bazodanowego
Rafal9018
Posty: 12
Rejestracja: sob maja 25, 2013 7:22 pm

[solved] Baza danych lekarzy, kilka pytań.

Post 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
OpenOffice 3.3 windows 7 64-bity
hasheq
Posty: 16
Rejestracja: czw sty 10, 2013 1:49 am

Re: Baza danych lekarzy, kilka pytań.

Post autor: hasheq »

Relację możesz zastosować np zbierając głosy na lekarzy.
TLekarze -> dane lekarzy (idLekarza, itd)
TOceny -> idLekarza, Ocena
LibreOffice 3.6.4.3 na Windows 7
Jan_J
Posty: 4560
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Baza danych lekarzy, kilka pytań.

Post 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ą...
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Rafal9018
Posty: 12
Rejestracja: sob maja 25, 2013 7:22 pm

Re: Baza danych lekarzy, kilka pytań.

Post 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.
Załączniki
Przechwytywanie.JPG
OpenOffice 3.3 windows 7 64-bity
Jan_J
Posty: 4560
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Baza danych lekarzy, kilka pytań.

Post 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.
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Rafal9018
Posty: 12
Rejestracja: sob maja 25, 2013 7:22 pm

Re: Baza danych lekarzy, kilka pytań.

Post 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.
Załączniki
Przechwytywanie.JPG
OpenOffice 3.3 windows 7 64-bity
Jan_J
Posty: 4560
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Baza danych lekarzy, kilka pytań.

Post 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.
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
hasheq
Posty: 16
Rejestracja: czw sty 10, 2013 1:49 am

Re: Baza danych lekarzy, kilka pytań.

Post 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 ;)
LibreOffice 3.6.4.3 na Windows 7
Rafal9018
Posty: 12
Rejestracja: sob maja 25, 2013 7:22 pm

Re: Baza danych lekarzy, kilka pytań.

Post 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:)
OpenOffice 3.3 windows 7 64-bity
belstar
Posty: 654
Rejestracja: czw mar 17, 2011 9:08 am

Re: Baza danych lekarzy, kilka pytań.

Post 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ć.
LibreOffice 5.1.2.2 Ubuntu 16 LTS
Rafal9018
Posty: 12
Rejestracja: sob maja 25, 2013 7:22 pm

Re: Baza danych lekarzy, kilka pytań.

Post 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:
Przechwytywanie.JPG
Tak jak napisałeś krok po kroku zrobiłem.
OpenOffice 3.3 windows 7 64-bity
belstar
Posty: 654
Rejestracja: czw mar 17, 2011 9:08 am

Re: Baza danych lekarzy, kilka pytań.

Post 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.
LibreOffice 5.1.2.2 Ubuntu 16 LTS
Rafal9018
Posty: 12
Rejestracja: sob maja 25, 2013 7:22 pm

Re: Baza danych lekarzy, kilka pytań.

Post 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.
Załączniki
Nowa Baza Danych.odb
(18.28 KiB) Pobrany 206 razy
OpenOffice 3.3 windows 7 64-bity
Jan_J
Posty: 4560
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Baza danych lekarzy, kilka pytań.

Post 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.
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Rafal9018
Posty: 12
Rejestracja: sob maja 25, 2013 7:22 pm

Re: Baza danych lekarzy, kilka pytań.

Post 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ł.
Nowa Baza Danych.odb
(19.93 KiB) Pobrany 191 razy
OpenOffice 3.3 windows 7 64-bity
belstar
Posty: 654
Rejestracja: czw mar 17, 2011 9:08 am

Re: Baza danych lekarzy, kilka pytań.

Post 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).
Załączniki
Nowa Baza Danych.odb
(19.83 KiB) Pobrany 240 razy
LibreOffice 5.1.2.2 Ubuntu 16 LTS
Rafal9018
Posty: 12
Rejestracja: sob maja 25, 2013 7:22 pm

Re: Baza danych lekarzy, kilka pytań.

Post 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??
OpenOffice 3.3 windows 7 64-bity
belstar
Posty: 654
Rejestracja: czw mar 17, 2011 9:08 am

Re: Baza danych lekarzy, kilka pytań.

Post autor: belstar »

LO 3.5 i LO 4, na obu działa
Sprawdź Narzędzia > Opcje > Bezpieczeństwo > Bezpieczeństwo makr > ustaw Średni
LibreOffice 5.1.2.2 Ubuntu 16 LTS
Rafal9018
Posty: 12
Rejestracja: sob maja 25, 2013 7:22 pm

Re: Baza danych lekarzy, kilka pytań.

Post autor: Rafal9018 »

Zmieniłem bezpieczeństwo na średnie, zainstalowałem LO 3.5 i niestety nic to nie dało:/
OpenOffice 3.3 windows 7 64-bity
Rafal9018
Posty: 12
Rejestracja: sob maja 25, 2013 7:22 pm

Re: Baza danych lekarzy, kilka pytań.

Post autor: Rafal9018 »

Ogarnąłem już te błędy:) Dziękuję wszystkim za pomoc, wszystko działa jak się należy:) Dzięki!!! pozdrawiam wszystkich :D
OpenOffice 3.3 windows 7 64-bity
Rafal9018
Posty: 12
Rejestracja: sob maja 25, 2013 7:22 pm

Re: [solved] Baza danych lekarzy, kilka pytań.

Post 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
Przechwytywanie.JPG (11.63 KiB) Przejrzano 10651 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 :D
OpenOffice 3.3 windows 7 64-bity
Jan_J
Posty: 4560
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: [solved] Baza danych lekarzy, kilka pytań.

Post 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).
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Rafal9018
Posty: 12
Rejestracja: sob maja 25, 2013 7:22 pm

Re: [solved] Baza danych lekarzy, kilka pytań.

Post autor: Rafal9018 »

Zrobiłem nowy projekt tabeli.
Przechwytywanie.JPG
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?? :crazy:
Załączniki
Przechwytywanie.JPG
OpenOffice 3.3 windows 7 64-bity
Jan_J
Posty: 4560
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: [solved] Baza danych lekarzy, kilka pytań.

Post 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).
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
ODPOWIEDZ