access: problem z zaprojektowaniem b.d.

0

Witam serdecznie, to mój pierwszy post więc proszę o wyrozumiałość.

Mam następujący problem.
"Chcę ewidencjonować (zapisywać) w bazie informacje o dokumentach w formie skrzynki przychodzącej / wychodzącej.
Czyli jak przysłano jakas poczte to wprowadzam ją do skrzynki odbiorczej. Poczta - dokumenty przychodzące mogą być różnego typu (Zwolnienia lekarskie, akta osobowe, zaświadczenia, wnioski itp. razem ponad 30 typów).
Dla wszystkich dokumentów zapisywanych w bazie chcę zapisać informację o nadawcy, dacie wprowadzenia do systemu, znaczniku poprawności danych itp.
Dodatkowo dla niektórych typów dokumentów chcę zapisywać informacje szczegółowe, które dla różnych typów są różne. Np. dla zwolnienia lekarskiego chce dodatkowo zapisać pesel, okres zwolnienia, kod choroby.

Teraz chce aby interfejs użytkownika posiadał takie funkcjonalności:

  1. Przeglądanie i wprowadzanie dokumentów na formularzu arkusza danych w "skrzynce odbiorczej"
    Tutaj wypełnia się jedynie typ dokumentu i pola wspólne dla wszystkich typów dokumentów

  2. Przeglądanie i wprowadzanie dokumentów na formularzach arkuszy danych stworzonych dla określonego typu dokumentu. Czyli osobny formularz dla zwolnień lekarskich i na tym formularzu wypełniam informacje szczegółowe o zwolnieniu lekarskim.

  3. Pojedynczy dokument zwolnienia lekarskiego lub innego typu dokumentu ma być widoczny i edytowalny na obydwu formularzach (skrzynce odbiorczej informacje ogólne, formularzu zwolnienia lek. lub innego typu informacje szczegółowe)
    "

Moje pytanie brzmi jak zbudować tabele do ewidencjonowania takich dokumentów?

Siedziałem nad tym chwilkę i to co udało mi się stworzyć:

  1. Tabela główna t_inbox { PK:id_document, FK:id_doctype, field1, field2,...}
    W tej tabeli przechowywane są wszystkie dokumenty przychodzące i informacje wspólne dla wszystkich dokumentów

  2. Osobna tabela na zwolnienia lekarskie t_Doc_L4 { PK:id_document, pesel, begda, endda, ....}
    Tutaj przechowywane są dane szczegółowe zwolnień. Id_document z tej tabeli pozostaje w relacji 1:1 z t_inbox.id_document

  3. Osobne tabele na inne typy dokumentów o analogicznej budowie t_Doc_XXX { PK:id_document, field_x, field_y, ... }*
    Dodatkowe tabele tworzone w miarę potrzeb - rozszczerzania ewidencji szczegółowej
    Id_document z każdej tabeli pozostaje w relacji 1:1 z t_inbox.id_document

Czy dobrze zaprojektowałem tabele na dokumenty?

Następna kwestia to integralność.
Tworzenie i usuwanie wpisów w tabeli t_inbox powinno skutkować odpowiednio tworzeniem i usuwaniem wpisów w odpowiednich tabelach danych szczegółowych.
Podobnie tworzenie i usuwanie dokumentów z tabel danych szczegółowych powinno skutkować usunięciem wpisów z tabeli t_inbox.

Chciałbym aby podstawowe rzeczy (wstawianie i usuwanie w tabelach zależnych) realizowane było po stronie bazy danych a nie po stronie formularzy.

Access 2010 (nie wiem jak wcześniejsze) umożliwia ustawianie triggerów na tabelach i własnie tymi triggerami chciałbym zrealizować podstawowe funkcjonalności.

Czy ktos ma jakiś pomysł jak to zrealizować?
Mam kilka pomysłów ale chciałbym dowiedzieć się jak takie coś zrealizować najlepiej.

Pozdrawiam
Mrlestat

0

Ale chcesz to oprzeć o formularze access'a? Czy GUI ma być w jakiejś innej technologii?

Wg mnie taki projekt tabel może być. Można zaproponować inne bardziej generyczne rozwiązania, ale jeśli interfejs chcesz oprzeć o formularze access'a to było by to trudne w realizacji.

Integralność: dane wstawia się/usuwa się w transakcjach. Access 2010 je wspiera http://msdn.microsoft.com/en-us/library/ff193241.aspx
Jeśli te triggery są w kontekście integralności, to nie tędy droga.

0

Tak formularze w accesie, przynajmniej na razie.
W każdym razie od początku tworzę osobną bazkę na dane (strona serwera) i osobną na formularze i raporty(strona klienta).
I wlaśnie zalezało mi na tym aby automatyczne tworzenie odpowiednich wpisów w tabelach powiązanych odbywało się po stronie bazy danych a nie po stronie formularzy. Ale z tym jest cholernie ciężko.

Utworzyłem relacje 1:1 t_inbox, t_doc_l4, oraz 1:1 t_inbox, t_doc_akta
Nie mogę włączyć wymuszania więzów integralności ponieważ przy tworzeniu wpisu w t_inbox baza wymaga wpisów o tym samym id w obu tabelach powiązanych a mnie wlasnie chodziło o to ze czesc wpisów szczegółów siedzi w jednej tabeli a część w drugiej.

Triggerami chciałem automatycznie wstawiac rekordy w t_inbox, jeśli user edytuje tabele szczegółów i tam wstawia wpisy. Problem jest taki, że jednoczesnie musze dać możliwosc tworzenia wpisów w t_inbox co z kolei powoduje konieczność wstawiania wpisów w t_doc_l4 itp.
Ostatecznie wstawiając rekord do t_doc_l4 triggery się zapętlają i tworzą mi się po 4 wpisy w obu tabelach :((

Nie wiem jak zastosować transakcje po stronie serwera... w ogóle nie wiem jak używać transakcji w accessie.
Co miałeś na myśli pisząc rozwiązania generyczne? Jestem ciekawy innego spojrzenia na ten temat.

aaa i jeszcze kolejny problem.
Wiadomo, że accessa będzie używać wiecej niz jedna osoba na raz.
Jeśli jedna bedzie akurat na edycji formularza ze zwolnieniami a druga na edycji inbox i obie osoby beda chciały mniej wiecej w tym samym czasie dodawac nowe zwolnienia to ... chyba zaczynam czaic ze triggery nie sa najlepsze do takiej akcji

pozdrawiam

0

Zamiast tworzyć takie cuda na kiju lepiej stwórz formularze osobne na L4 i każdy inny typ, które poza polami wspólnymi będą miały też te specyficzne dla typu dokumentu. I dany formularz od razy wykona wstawienie danych do dwóch tabel. Nie będziesz potrzebował żadnych trigger'ów.
Ewentualnie możesz spróbować zrobić forma na dane ogólne z przyciskiem dalej, po którym załaduje się form tylko na dane specyficzne dla danego typu dokumentu. Więc najpierw wstawisz rekord nadrzędny, a następnie podrzędny.
Dawno nie bawiłem się accessem i nie mam go ani w pracy ani w domu, więc dokładniejszej pomocy nie potrafię udzielić. Ale sądzę że oba scenariusze przy odrobinie gimnastyki są do zrealizowania w access. A jeśli chodzi o to na ile to skomplikowane to zależy od twojej wiedzy o sql i pewnie visual basic.

1 użytkowników online, w tym zalogowanych: 0, gości: 1