PDA

Zobacz pełną wersję : Problem Access 2007



desper
04-02-09, 15:34
Witam
Moj problem wyglada nastepujaco. Mam baze danych w ktorej musze rezerwować miejsca w restauracji. I wszystko jest ok z tym tylko wyjątkiem że daty rezerwacji i godziny rezerwacji nakładają sie na siebie. Jak zrobić żeby sprawdzić czy rezerwacja danego terminu jest możliwa, jeśli tak to zapisz a jeśli data i godzina jest już zajęta powinno wyświetlać komunikat i tym że rezerwacja jest nie możliwa.
Jestem poczatkujacym w accessie wiec prosze o wyrozumialosc.
Pozdrawiam

koneton
27-02-09, 10:27
Dużo zależy od tego jak wygląda struktura bazy danych. Czy godzina rezerwacji to dwa pola od i do, czy tylko godzina od?

doderic
27-02-09, 20:03
(...) daty rezerwacji i godziny rezerwacji nakładają sie na siebie. (...)

Skoro nakładają się, to zakładam, że rezerwacja jest ważna od - do, czyli są dwa pola warunkujące kiedy rezerwacja się zaczyna i kiedy się kończy.

Najpierw trochę rozważań. Są 4 przypadki, kiedy rezerwacji nie można wykonać (kropki, to jakieś punkty w czasie, 'a' to istniejąca rezerwacja, 'b' to nowa rezerwacja, którą próbujesz dodać):

1. nowa rezerwacja zaczyna się przed istniejącą, ale kończy za późno:


...aaaa...
.bbb......


2. nowa rezerwacja zaczyna się za szybko, jeszcze w czasie istniejącej rezerwacji:


...aaaa...
.....bbb...


3. nowa rezerwacja jest króciutka, ale jest w trakcie istniejącej:


...aaaa...
....bb....


4. nowa rezerwacja zaczyna się jeszcze przed istniejącą i kończy długo po:


...aaaa...
.bbbbbbbb.


Co mają te wszystkie przypadki wspólnego?
Nowa rezerwacja 'b' zawsze zaczyna się przed końcem istniejącej rezerwacji 'a' i zawsze 'b' kończy się po początku 'a'.
Tak więc próbując dodać nową rezerwację musisz sprawdzić, czy nie ma już przypadkiem jakiejś rezerwacji, która:


b.początek < a.koniec AND b.koniec > a.początek


W praktyce -- nie podam przepisu dokładnie krok po kroku, ale na tyle szczegółowo, żeby dało się odtworzyć:
1. Zacznij od stworzenia kwerendy, która będzie wyszukiwała zachodzące na siebie rezerwacje -- przydadzą się przy tym parametry (nie mam pojęcia, gdzie je znaleźć w 2007, ale w 2003 wystarczyło kliknąć prawą myszą w okienku projektu kwerendy). Dokładnie dwa parametry: [b.początek] i [b.koniec].

2. Mając taką kwerendę musimy gdzieś użyć funkcji: DCount("*"; "SprRez"), która zwraca ile jest rekordów w zapytaniu SprRez.

3. W zależności od tego czy do zapisu nowej rezerwacji używasz makra czy funkcji vbasic musisz:

a. albo dodać warunki do swojego makra (tutorialek tutaj: http://www.bluemoosetech.com/microsoft-access-tutorial.php?jid=48&title=Microsoft%20Access%20Macro%20Conditions) -- dodaj nową linijkę na początku makra, jako warunek podaj:


DCount("*"; "SprRez") > 0

a jako akcję wybierz OknoKomunikatu (MsgBox) i wpisz komunikat informujący o tym,że nie można dodać rezerwacji. Dodaj jeszcze drugą linijkę, pozostaw pusty warunek i jako akcję wybierz ZatrzymajMakro. Dopiero od trzeciej linijki mają być akcje, które pozwalają na zapis nowej rezerwacji -- w trzeciej linijce musisz też podać warunek:


DCount("*"; "SprRez") = 0


b. albo dodać linijkę z instrukcją IF do funkcji vb -- jeśli użyłeś standardowego kreatora do stworzenia przycisku zapisującego rekord, to do linijki wyglądającej mniej więcej tak:


DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70

dopisz:


If DCount("*"; "SprRez") = 0 Then
DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70
Else
MsgBox("Nie można dodać tej rezerwacji bo jest konflikt!")
EndIf



Mam nadzieję, że ten przydługi opis pomoże i przynajmniej wskaże dalsze kierunki poszukiwań, jeśli nie pozwoli po prostu stworzyć tego, co chcesz...

Ew. jeśli system nie musi koniecznie zablokować rezerwacji, a może pozostawić decyzję człowiekowi, to na formularzu rezerwacji możesz dodać podformularz wyświetlający rekordy z kwerendy z pkt. 1. Jeśli kwerenda coś pokaże, to znaczy, że jest konflikt. Jeśli nie, to można spokojnie rezerwować.