Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Access - Tworzenie bazy danych.

robiw 17 Paź 2016 22:46 768 15
  • #1 17 Paź 2016 22:46
    robiw
    Poziom 26  

    Witam Kolegów,
    Jako, że bardzo dawno zajmowałem się Access'em i zupełnie zapomniałem jego obsługę mam pytanie odnośnie konstrukcji bazy danych. W bazie mam podstawową tabelę, która opisuje usterki. Jednym z pól tej bazy danych jest pole nazwisko, które odnosi się do listy nazwisk (innej tabeli). Nie wiem jak "osadzić" jedną tabelę w drugiej by była możliwość taka, że każda z tych osób (nazwisk) może zaznaczyć, że zapoznała się z daną usterką i wtedy, gdy filtruję po tym nazwisku to pokazuje mi tylko usterki, których dana osoba jeszcze nie poznała (nie kliknęła jakiegoś checkbox'a potwierdzającego odczytanie usterki). Uprzejmie proszę o podpowiedź...z góry dziękuję... robiw

    0 15
  • #2 17 Paź 2016 22:55
    JacekCz
    Poziom 36  

    to się nazwywa relacje wiele<->wiele
    Implementuje się niemal zawsze przez tabelę pośrednią, przy okazji ta tabela ma ciekawe możliwości, np pole data powiadomienia

    Zakładam że każda z tabel jest prawidłowo zaprojektowana i ma klucz pierwotny id_xxxx
    Na skrajach tabele które ty wymieniasz, w środku nowa

    W tym przypadku Usterka <-> (id_usterki)Zapoznanie: data, bool:akceptacja, ble, ble (id_osoby) <-> Osoba

    0
  • #3 17 Paź 2016 23:07
    robiw
    Poziom 26  

    Czyli muszę dodać nową tabelę zapoznanie? O jakiej konstrukcji? Kurczę...zapomniałem całkiem to narzędzie :-(...robiw

    0
  • #4 18 Paź 2016 05:36
    JacekCz
    Poziom 36  

    robiw napisał:
    Czyli muszę dodać nową tabelę zapoznanie? O jakiej konstrukcji? Kurczę...zapomniałem całkiem to narzędzie :-(...robiw


    To nie problem narzędzia, bo w każdej bazie relacyjnej by się robiło tak samo, tylko pewnego podkładu teoretycznego. Jak w wielu dziedzinach, rzecz nie polega na znajomości klinięć.

    Najważniejszą częścią tej tabeli są dwa klucze obce, zależnie od serwera automatyczny klucz pierwotny jest wymagany (MS_SQL) lub zalecany, oraz pola extra - jako przykład dałem datę zapoznania. Jakby projekt się rozwijał, tu by były fakty związane każdym zdarzeniem zapoznania, np akceptacja, kilku słowowy komentarz itd.. wszystko co dotyczy zapoznania Osoby X z Usterką Y

    Taka tabela (podstawowa dla relacji wiele-wiele) jest mocno opisana w literaturze. Jest chyba elementem na który "trudno wpaść" ale potem się odkrywa jego walory.

    0
  • #5 18 Paź 2016 08:27
    robiw
    Poziom 26  

    To wiadomo, że trzeba mieć podstawy. Chciałem na szybko do tego podejść a doba ma tylko 24h i nie można być specjalistą we wszystkim. Tworzę 2podstawowe tabele:

    Osoba: pola: ID, Nazwisko, Imię
    Usterka: pola: ID, Opis usterki

    ... i tutaj chciałem dać polę Nazwisko i powiązanie do tabeli Osoba, jednak potrzebuję by dana usterka mogła być potwierdzana przez wieleosób niezależnie...

    wprowadzam, więc, tabelę skrzyżowań Potwierdzenie: pola ID, ID_usterki i ID_osoby, gdzie dwa ostatnie pola wiążę relacją jeden do wielu z każdą z tabel podstawowych... No i utknąłem... bo jak teraz we wprowadzaniu opisu danej usterki od razu wybrać np. jedno z nazwisk, że już się zapoznałem - tam przecież nie ma pola Nazwisko...robiw

    0
  • #6 18 Paź 2016 08:54
    adamas_nt
    Moderator Programowanie

    Po mojemu, to strasznie prosta baza. Wystarczy:
    tabela1 (główna) Id(Nr, klucz), Data(data), IdSerwisanta(Nr), IdUsterki(Nr), Potw(tak/nie)
    tabela2 Id, Imię Nazwisko(text), inne wg uznania
    tabela3 Id, NawaUsterki(text), inne wg uznania

    Relacje narzucają się same, a w formularzu dodajesz chkBox powiązany z "Potw"
    Stosowna kwerenda zwróci potrzebne dane...

    0
  • #7 18 Paź 2016 09:02
    robiw
    Poziom 26  

    Wydaje mi się, że w ten sposób dla jednej i tej samej usterki nie będziesz mógł wprowadzić potwierdzenia jej odczytania przez każdego serwisanta a o to chodziło...robiw

    Dodano po 2 [minuty]:

    Na początku także pomyślałem o takiej, prostej konstrukcji...ale zamysł jest taki, by każdy z serwisantów mógł niezależnie potwierdzać zapoznanie się z usterką i by miał możliwość filtrowania tychże usterek np. pokazywania tylko takich, których jeszcze nie potwierdził...

    0
  • #8 18 Paź 2016 09:05
    adamas_nt
    Moderator Programowanie

    Aaa, chyba zaczynam rozumieć.
    Dla siebie zrobiłbym tak:
    Przy rejestracji usterki wpisuję datę i usterkę (idUsterki), pole Nazwisko zostaje puste. Wpisanie nazwiska (przez serwisanta?) jest potwierdzeniem, że się zapoznano...

    0
  • #9 18 Paź 2016 09:22
    robiw
    Poziom 26  

    Nie...to nie tak...każdy serwisant musi mieć możliwość niezależnego potwierdzenia tej samej usterki, tego samego wpisu...robiw

    0
  • #10 18 Paź 2016 09:31
    JacekCz
    Poziom 36  

    robiw napisał:
    ... bo jak teraz we wprowadzaniu opisu danej usterki od razu wybrać np. jedno z nazwisk, że już się zapoznałem - tam przecież nie ma pola Nazwisko...robiw


    Na GUI Combo wypełniasz z innej tabeli. Nie miałem Accesa od wielu lat, ale mam przeświadczenie kontrolka typu "Combo" (do wyboru nazwiska) ma wszystko gotowe

    Różne środowiska używają innych słów do tych samych koncepcji.
    Combo "binduje się" z kolumną klucza obcego (Osoby) we własnej tabeli, a lista wartości jest pobierana z tabeli zrelacjonowanej (często automatycznie, bo metadane o polu mają takie informacje, lub po lekkim wskazaniu)

    robiw napisał:
    Wydaje mi się, że w ten sposób dla jednej i tej samej usterki nie będziesz mógł wprowadzić potwierdzenia jej odczytania przez każdego serwisanta a o to chodziło...robiw


    Prawda, dobrze rozumiesz. Następny pomysł kolegi tez nie w całości spełnia oczekiwania

    adamas_nt napisał:
    Aaa, chyba zaczynam rozumieć.
    Dla siebie zrobiłbym tak:
    Przy rejestracji usterki wpisuję datę i usterkę (idUsterki), pole Nazwisko zostaje puste. Wpisanie nazwiska (przez serwisanta?) jest potwierdzeniem, że się zapoznano...


    No nieeee.....

    0
  • #11 18 Paź 2016 09:49
    robiw
    Poziom 26  

    Rozwiązanie z kontrolką Combo, jeśli dopuszczalne, ma kilka poważnych wad:
    - łatwo "odkliknąć" ustawione już potwierdzenia,
    - nie wygląda to tak elegancko, jak osobne checkbox'y,
    - (chyba) gorzej się filtruje.

    Poza tym to rozwiązanie jest sprzeczne z rozwiązaniem relacji wielu do wielu tak mi się wydaje... robiw

    0
  • #12 18 Paź 2016 09:59
    JacekCz
    Poziom 36  

    robiw napisał:
    Rozwiązanie z kontrolką Combo, jeśli dopuszczalne, ma kilka poważnych wad:
    - łatwo "odkliknąć" ustawione już potwierdzenia,
    - nie wygląda to tak elegancko, jak osobne checkbox'y,
    - (chyba) gorzej się filtruje.

    Poza tym to rozwiązanie jest sprzeczne z rozwiązaniem relacji wielu do wielu tak mi się wydaje... robiw


    Combo pracuje w momencie (pierwszego) wpisywania, tak zrozumiałem Twoje pytanie, może błędnie

    Grunt to się zgodzić na design bazy danych, a potem do tego ekrany (zawsze źle jest jednocześnie myśleć o wszystkim, zawsze trzeba dzielić na pod-zagadnienia). Ekranów będzie kilka: do pierwszego założenia Usterki, do kliknięcia powiadomienia (co zachodzi dużo czasu później - masz rację dane nie mogą się zamazać) itd... oraz do analiz jak kto chce

    W mojej ocenie nie powstał tu lepszy pomysł na bazę niż "mój", a ten nie jest mój tylko podręcznikowy. O ile się na niego zgadzasz, to czego nie rozumiesz?


    *) relacja wiele do wiele to tak w ogólnym widzeniu (widzę las), ale jak podchodzimy do drzewa to widziny że jedno konkretne Powiadomienie ma dwie relacje 1:1 (not null). Jakby to powiedzieć obrazowo, n:n nie istnieje jako gotowa implementacja, trzeba ją stworzyć z kilku 1:1

    0
  • #13 18 Paź 2016 10:17
    robiw
    Poziom 26  

    Piszesz bardzo zagadkowo...ale sprawdziłem wersję z kontrolką Combo. Działa to całkiem dobrze. Zastanawiam się teraz nad rozwiązaniem innego problemu. W polu usterka chcę mieć jej symboliczny numer (1...20) - to proste, utworzę dodatkową tabelę...ale też jej kategorię...a kategoria to jeden z 4 kolorów, który chcę pokazać kolorem a nie stringiem z jego nazwą...

    0
  • #14 18 Paź 2016 10:40
    JacekCz
    Poziom 36  

    robiw napisał:
    Piszesz bardzo zagadkowo...


    Ty też nie dałeś definicji tabel które już masz, trudno się do mgiełki ściśle odnosić.


    robiw napisał:
    ...Zastanawiam się teraz nad rozwiązaniem innego problemu. W polu usterka chcę mieć jej symboliczny numer (1...20) - to proste, utworzę dodatkową tabelę...ale też jej kategorię...a kategoria to jeden z 4 kolorów, który chcę pokazać kolorem a nie stringiem z jego nazwą...


    Wydaje się prawidłowo czujesz relacyjne bazy, tabel trochę przybywa ale prawdopodobnie dobrze myślisz

    Nie rozumiem o symbolicznym numerze

    0
  • #15 18 Paź 2016 10:47
    robiw
    Poziom 26  

    Numer symboliczny to taka karteczka z numerem na sprzęcie... nic wielkiego. Co do kolorów to jest tutaj problem, gdyż formatowanie warunkowe na formularzu przyjmuje tylko 3 wartości a kolorów jest 4... tutaj nie mam pomysłu...

    Rozumiem, że filtrowanie rekordów i wyświetlenie tych, których nie potwierdziła dana osoba załatwi mi kwerenda? A elementem wejściowym tej kwerendy będzie wartość z kontrolki filtrowania? robiw

    0
  • #16 18 Paź 2016 10:59
    JacekCz
    Poziom 36  

    robiw napisał:
    Numer symboliczny to taka karteczka z numerem na sprzęcie... nic wielkiego. Co do kolorów to jest tutaj problem, gdyż formatowanie warunkowe na formularzu przyjmuje tylko 3 wartości a kolorów jest 4... tutaj nie mam pomysłu...

    Rozumiem, że filtrowanie rekordów i wyświetlenie tych, których nie potwierdziła dana osoba załatwi mi kwerenda? A elementem wejściowym tej kwerendy będzie wartość z kontrolki filtrowania? robiw


    Numer sprzętu czy numer awarii?
    Numer sprzętu prowadzi naturalnie do tabeli ze sprzętem (choćby mini).
    Numer awarii (wyczytałem między wierszami słusznie lub nie) niech cię nie kusi jakiś recykling

    Co do kolorów na GUI nie pomogę (choć przeczuwam że może być jakieś "advanced" z nielimitowanymi kolorami), z GUI filtra tez nie pomogę. Zapewniam że zdrowa baza danych da się kwerendować pod kątem wszystkich rozsądnych celów

    0