Łączenie dwóch DBGrid i inne

0

Witam,

utworzyłem bazę danych zawierającą dane dotyczące pokoi, rezerwacji i klientów hotelu. Stworzyłem DBGrid, który wyświetla wszystkie pokoje, oraz inny DBGrid(na tej samej formatce), który ma wyświetlać wyposażenie każdego z pokoi. Jestem dość zielony jeśli chodzi o Delphi.
Szukałem tego w różnych książkach i innych stronach jednak nie były opisane dokładnie moje problemy, a nie mam niestety czasu na długie rozmyślania nad aplikacją.

Pytania:

  1. Jak zrobić aby drugi DBGrid wyświetlał informacje dotyczące pokoju jedynie zaznaczonego na pierwszym DBGridzie, a nie wszystkich (DataSource są połączone z IBQuerry, a nie IBTable)?
  2. Chciałbym utworzyć chceck boxy, które klienci będą klikać. Będą one dotyczyły odpowiedniego wyposażenia (np. kliknięcie w CheckBoxa "internet" wyświetli nam tylko te pokoje, które posiadają internet, a klikając w owy check box oraz check box "balkon" wyświetli jedynie te, które posiadają zarówno inernet jak i balkon). Jak to zrobić?
  3. Jak wprowadzić do bazy danych dane dot. klienta? Chciałbym aby klient wypisywał swoje dane, wybrał pokój i wszystko (włącznie z rezerwacją zapisywało się automatycznie).

Wiem, że to sporo, ale może ktoś pomoże, bo z resztą jakoś sobie poradzę. Z góry dziękuję i proszę zadawać dot. szczegółów projektu.

1
  1. Zakładam że masz tabele:

tab_pokoje
pokoje_id PK
...

tab_wyposazenie (lista-slownik mozliwego wyposazenia)
wyposazenie_id PK
...

tab_pokoje_wyposazenie (relacja wele-wiele, jakie wyposazenie jest w pokoju)
pokoje_id PK
wyposazanie_Id PK

tab_rezerwacje
rezerwacje_id PK
pokoje_id FK
klienci_id FK
...

tab_klienci
klienci_id PK
....

Dla pokoi: IBQuery_pokoje->DataSource_pokoje->DBGrid_pokoje: SELECT * FROM tab_pokoje
Dla wyposazenia: IBQuery_wyposazenie->DataSource_wyposazenia->DBGrid_wyposazenia
polaczenie master-detail: IBQuery_wyposazenie.DataSource:=DataSource_pokoje, z parametrem pokoje_id, np.

IBQuery_wyposazenie.SQL:=
SELECT
tab_wyposazenie.*
FROM
tab_pokoje_wyposazenie, tab_wyposazenie
WHERE
tab_pokoje_wyposazenie.pokoje_id=tab_wyposazenie.popkoje_id AND tab_wyposazenie.wyposazenie_id= :pokoje_id

  1. Musisz napisać, zmodyfikowac odpowiednie zapytanie SQL w IBQuery_pokoje: np

SELECT
*
FROM
tab_pokoje
WHERE
pokoje_id IN (SELECT pokoje_id FROM tab_pokoje_wyposazenie WHERE wyposazenie_id IN ( internet_id, balkon_id, ... ))

  1. No to już jest zbyt ogólnie, co napisałeś. Zależy od implementacji.
0

Czyli zacząć od podstaw SQL :)

0
  1. Nie wiem czy dobrze zrozumiałem, ale wydaje się, że właśnie wszystko mam tak jak napisałeś z tym, że wciąż wyświetla mi wyposażenie wszystkich pokoi w drugim DBGrid'zie. Chciałbym właśnie, że po kliknięciu na wiersz wyświetlą się dane dot. tylko tego jednego pokoju w drugim DBGridzie. Komendę "Select" sobie napiszę tylko nie wiem gdzie ją umieścić, bo nie do końca rozumiem środowisko Delphi. Myślałem, że coś trzeba napisać w event "OnCellClick", ale nie jestem tego pewien.

  2. No mam DBGrid'y i to co widać tutaj: http://imageshack.us/photo/my-images/17/rezerwacje.jpg/
    Tylko gdzie mam wpisać to co podałeś, aby po zaznaczeniu działo się to co chcę oraz po zaznaczeniu drugiego działały oba naraz.

  3. Chodzi o to, że klient wybierze pokój, poda termin w jakim chce się tam zatrzymać oraz swoje dane personalne. Chciałbym, aby po kliknięciu przycisku "zatwierdź rezerwację" zapisywano rezerwację z jego ID, ID klienta o ile go nie ma jeszcze w bazie oraz nową rezerwację. Nie wiem czy nie będę zmuszony o wrzucenie schematu całej bazy, abyście mogli mi pomóc.

Możliwe, że nie zrozumiałem wszystkiego co mi napisałeś. Jeśli tak jest to przepraszam.

1
  1. Nie musisz obsługiwać żadnego eventu. Kiedy poruszasz się po DBgridzie z pokojami, w datasecie IBQuery_pokoje za tym podąża kursor, czyli bieżący rekord. Ten z kolei wpływa automatycznie na odświeżanie z odpowiednim parametrem IBQuery_wyposazenie.
  2. Musisz obsłużyć event ChechBox.OnClick, w którym należy modyfikowć zapytanie w IBQuery_pokoje w części: ...wyposazenie_id IN ( internet_id, balkon_id, ... ))
  3. Owszem musisz raczej zapodać cały schemat, wtedy pomogę.
0

Schemat: http://imageshack.us/photo/my-images/525/modelzx.jpg/

  1. Coś chyba robię źle. Mam tak:
    I DBGrid
    IBQuery1 i w properies okienko DataSource jest puste, a SQL:
    select ID_POKOJ, NUMER, CENA, NAZWA, MIASTO, ADRES_H, DOBA_OD, DOBA_DO
    from POKOJ p join HOTEL h on p.ID_Hotel=h.ID_Hotel
    DataSource1 gdzie w properies ustawiam IBQuery1
    DBGrid1 i w properies ustawiam DataSource1

    II DBGrid
    IBQuery2 mam ustawione DataSource1, a w SQL:
    select p.ID_POKOJ,TYP_W, OPIS_W_SZCZEGOLY
    from WYPOSAZENIE w1 join WYPOSAZENIE_SZCZEGOLY w2 on w1.ID_WYPOSAZENIE=w2.ID_WYPOSAZENIE join POKOJ p on p.ID_POKOJ=w2.ID_POKOJ
    DataSource2 ustawiam w properies IBQuery2
    DBGrid2 i w properies ustawiam DataSource2.

Efekt jest taki, że o ile DBGrid1 jest taki jak chcę, to jakoś nie widzę połączenia między DBGrid1 i DBGrid2, ponieważ wciąż pokazuje mi wyposażenia wszystkich pokoi, a nie klikniętego. Prawdopodobnie mam błąd w drugim kodzie SQL, ale pewien nie jestem. Mam nadzieję, że po otrzymaniu modelu problem stał się łatwiejszy do wyobrażenia.

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