Access Problem z kwerendą jako źródłem danych dla formularza

0

Mam takie relacje
title

SELECT Pokoje.ID_Pokoju, Studenci.plec, Pokoje.Typ_pokoju
FROM Studenci, Pokoje
WHERE [forms]![Studenci2]![Plec] =[Pokoje].[Typ_pokoju];

i taki formularz
title

który składa się z tabel: Studenci, Zakwaterowanie, Pokoje.

Chce osiągnąć, żeby w polu Zakwaterowanie_ID_Pokoju (pole kombi) do wyboru były tylko pokoje odpowiadające płci studenta. M - facet, K - kobieta.
W kwerendzie, Plec jest to nazwa pola w formularzu w której jest przechowywana nazwa płci M lub K.

Mam jednak problem z tym, że numery pokoi z tego pola powtarzają się okresowo w sensie: 5,6,7,8,9,10,5,6,7,8,9,10 itd kilka(naście) razy.
Chciałbym to zrobić tak żeby nie powtarzało tych samych wyników, bo to jest bez sensu ;)

Pozdrawiam i z góry dzięki za odpowiedź.

0

DISTINCT nie wystarczy?

0

A możesz jaśniej? Ja jestem ciemny jak dwunasta w nocy, jeżeli chodzi o bazy danych i accessa. Kazali mi zrobić bazę danych i robię... już miesiąc... z tym że prowadzący na samym początku mi ją źle zaprojektował i się męczyłem, a dziś jednak zmienił filtracje tych pokoi z bezwymiarowej relacji która nie działała na kwerendę.

0

heh... trochę pomogło, bo teraz każdy pokój powtarza się tylko dwa razy w stylu: 5,5,6,6,7,7 itd ale później już nie idzie od początku, czyli jest dużo lepiej ;)

0

Albo jak zmienić kwerendę żeby była źródłem danych dla pola "Numer Pokoju"? W sensie żeby kwerenda wysyłała do tego pola nie ID_Pokoju jak jest teraz, tylko numery pokoi w których zgadzają się płeć z typem pokoju.

1

Twoja kwerenda jest zła, w sensie masz tam cross join-a

SELECT Pokoje.ID_Pokoju, Studenci.plec, Pokoje.Typ_pokoju
FROM Studenci, Pokoje
WHERE [forms]![Studenci2]![Plec] =[Pokoje].[Typ_pokoju];

To zwróci cie iloczyn kartezjański tabel studenci i pokoje, brak warunku sprżężenia stąd powielone pokoje. Zakladam, że to kwerenda przypisana do combo.

Wystarczy pobrać dane tylko z tabeli pokoje:

SELECT Pokoje.ID_Pokoju, Pokoje.Typ_pokoju
FROM Pokoje
WHERE [forms]![Studenci2]![Plec] =[Pokoje].[Typ_pokoju];

Jeżeli jednak masz mieć dostęp do danych z tabeli studenci, musisz to zrobić złączając 3 tabele studenci, Zakwaterowanie, Pokoje

SELECT 
    P.ID_Pokoju
   , P.Typ_pokoju
   ,S.Plec
FROM 
    (Pokoje as P
    INNER JOIN Zakwaterowanie as  Z on P.ID_Pokoju =  Z.ID_Pokoju)
    INNER JOIN Studenci as S on S.id_student = z.ID_Student
WHERE 
    [forms]![Studenci2]![Plec] =[Pokoje].[Typ_pokoju];

W tym ostatnim zapytaniu mogłem pomylić się z nawiasami, nigdy nie pamiętam jak to access wymaga nawiasów przy joinach

1
Dzonzi napisał(a):

Albo jak zmienić kwerendę żeby była źródłem danych dla pola "Numer Pokoju"? W sensie żeby kwerenda wysyłała do tego pola nie ID_Pokoju jak jest teraz, tylko numery pokoi w których zgadzają się płeć z typem pokoju.

Jeżeli masz w tym polu przechowywać id_pokoju, a pokazywać numer to zakładając, że źódło combo zwraca dwie kolumny id_pokoju i numer pokoju to ustaw własciwości combo:
Liczba kolumn:2
Kolumna związana: 1
Szerokośc kolumn: 0cm;4cm

0

Powtórzenia już zostały wyeliminowane. Zrobiłem tak jak napisałeś i teraz pole "Numer Pokoju" zwraca ID_Pokoju oraz Typ_pokoju lub Płeć studenta (przy każdym ID jest literka M).
Nie wpisywałem tej ostatniej kwerendy, bo chyba nie musze mieć dostępu do studentów.

1

Zapytanie combo powinno wyglądać tak:

SELECT Pokoje.ID_Pokoju, Pokoje.Numer_pokoju
FROM Pokoje
WHERE [forms]![Studenci2]![Plec] =[Pokoje].[Typ_pokoju];

Wtedy z ustawieniami jak wyżej będzie numer pokoju wyświetlany

0

Pokazuje już tylko ID pokoju i numer pokoju :)
A jak zrobić żeby pokazywało tylko tę drugą kolumnę z numerem pokoju?

0

Napisałem ci kilka postów wyzej jak ustawić właściwości combo

1

No teraz działa, ale pojawił się kolejny problem. Jak teraz wybiorę numer pokoju to nie pojawiają się informacje o numerze piętra i o liczbie miejsc w pokoju. Czy mógłbym Ci tą bazę wysłać na priv i sprawdziłbyś?

1

Załączam w załączniku tę bazę danych. Problemy mam z formularzem Kwaterowanie Studentów. W tym zewnętrznym formularzu Studenci wybieram studenta, a w podformualarzu numer pokoju do którego chcę go zakwaterować i nie pokazuje mi informacji o piętrze i ilości miejsc w pokoju.

1

Masz złe zapytanie zarówno w podformularzu jak i w combo, poprawiłem, ale to raczej praca u podstaw, bo wygląda tak jak zabawa klockami malego dziecka...

1

Super! Dziękuje Pan Panczo ;)
Bazy danych to zupełnie nie moja działka, to zapychacz na moim kierunku ;p

1

A ta kwerenda subformZakwaterowanie sama się stworzyła? Potrzebna jest?

1

Nie, nie jest potrzebna.

0

A jak napisać kwerendę która zwróci mi wolne pokoje, do których nie został przypisany żaden student oraz studentów którzy nie zostali przypisani do żadnego pokoju?

1

Co to znaczy wolny pokój?

a nieprzypisane pkoju/studenci prostym where:

where
    idStudenta not in (select id_student from rezerwacje)
0

A da się to zapisać w jednej kwerendzie? Nie wiem w jaki sposób je połączyć

SELECT Imie, Nazwisko, Pesel
FROM Studenci
WHERE ID_Student NOT IN (SELECT ID_Student FROM Zakwaterowanie);

SELECT Numer_pokoju, Ilosc_miejsc, Pietro, Typ_pokoju
FROM Pokoje
Where ID_pokoju NOT IN (Select ID_Pokoju FROM Zakwaterowanie);

Chce żeby pokazywalo mi na początku niezakwaterowanych studentów, a dopiero po nich pokoje. Kwerendy działają bardzo fajnie, po prostu nie umiem ich połączyć, bo teraz jak je połączyłem to wyszły mi wszystkie kombinacje tych studentów z pokojami, ponad 2800 rekordów XD

0

Ale w jaki sposób to połączyć? Nie za bardzo widzę sens, jak potrzebujesz to pokazać obok siebie, to zrób to na dwóch osobnych podformularzach umieszczonych obok siebie.

0

Myślisz, że dałoby radę jeszcze zrobić kwerendę która będzie pilnowała żebym do pokoju dwuosobowego nie zakwaterował 3 studentów? np. w taki sposób, gdy kwateruje studentów w formularzu Kwaterowanie Studentów i zapiszę do dwuosobowego pokoju dwóch studentów to gdy będę przypisywał trzeciego to wywali komunikat o braku wolnych miejsc? Fajnie byłoby mieć taki bajer.
Albo jeszcze do tej kwerendy o wolnych pokojach zrobić tak, żeby zwracało nie tylko pokoje które są całkowiecie wolne, a takie w których są wolne miejsca, więc np. powinno zwrócić pokój trzyosobowy w którym jest zakwaterowanych 2 studentów.

1

Problem jaki widzę to taki, że ty masz daty od do więc trzeba by sprawdzać nie tylko liczbę zakwaterowanych studentów w pokoju, ale jeszcze w okresie na który jest kwaterowany, więc trzeba to ograniczyć czy okresy się nie zazębiają, ale czy też nie zawieraja w sobie zadanych, czyli coś w ten desen:
x - data od nowej rezerwacji
y - data do nowej rezerwacji

select
    count(*)
from 
    zakwaterowanie
where
    id_pokoju=1
   and (
          x between zakwaterowanie_od and zakwaterowanie do
          or y between zakwaterowanie_od and zakwaterowanie do
          or (x < zakwaterowanie_od and y > zakwaterowanie_do)
   )
0

O kurczę, o tym nie pomyślałem. Ale w sumie będę miał ten argument gdyby mi prowadzący zarzuci kwaterowanie wielu studentów do 1 pokoju to powiem, że można pod warunkiem, że daty nie będą się nakładać :)

Jeszcze kurczę mam problem z kwerendą parametryczną:

SELECT Studenci.Imie, Studenci.Nazwisko, Zakwaterowanie.Data_Zakwaterowania, Zakwaterowanie.Data_Wykwaterowania
FROM Studenci INNER JOIN Zakwaterowanie ON Studenci.ID_Student = Zakwaterowanie.ID_Student
WHERE (((Zakwaterowanie.Data_Zakwaterowania)>=[OD] And (Zakwaterowanie.Data_Zakwaterowania)<=[DO]));

Potrzebuje kwerendę parametryczną w której podaje się datę OD DO i która będzie zawracała studentów, którzy zakwaterowali się w tym przedziale czasowym. Teraz mi jakoś dziwacznie to działa. O ile warunek OD działa prawidłowo, tak warunek DO już nie.

1

co to znaczy dziwnie działa?
Używaj between:

SELECT Studenci.Imie, Studenci.Nazwisko, Zakwaterowanie.Data_Zakwaterowania, Zakwaterowanie.Data_Wykwaterowania
FROM Studenci INNER JOIN Zakwaterowanie ON Studenci.ID_Student = Zakwaterowanie.ID_Student
WHERE Zakwaterowanie.Data_Zakwaterowania between [OD] AND [DO];

jest czytelniej

0

No teraz już mi prawie wszystko działa. Oprócz dwóch rzeczy. Dodałem makro, które powinno po włączenie bazy danych otworzyć automatycznie formularz START, a tego nie robi. Dopiero gdy kliknę to makro to wlącza ten formularz.
Druga rzecz to jakiś dziwny błąd, który pokazuje się gdy otwieram formularz Kwaterowanie studentów. Chodzi o wprowadzanie jakiegoś parametru, którego nie powinno wymagać. Dasz radę zerknąć?

#edit
Chyba, że otwieranie formularza START da się zrobić kwerendą to byłoby jeszcze lepiej.

1

Jeżeli piszesz makro które ma się uruchamiać po otwarciu programu musisz mu nadać nazwę autoexec: https://support.office.com/pl-pl/article/Tworzenie-makra-uruchamianego-podczas-otwierania-bazy-danych-98ba1508-dcc6-4e0f-9698-a4755e548124

Nie ma sensu jednak używać makra aby ustawić formularz startowy, robisz to tu:
Plik->Opcje->bieżąca baza danych->wyświetl formularz

Drugi błąd wynika z kwerendy combo z listą pokoi, ponieważ wyświetlasz formularz Kwaterowanie studentów jako podformularz musisz się do niego odwołać poprzez formularz start.
Zmień kwerendę Kwerenda filtrująca pokoje

SELECT Pokoje.ID_Pokoju, Pokoje.Numer_pokoju AS Numer, Pokoje.Ilosc_miejsc AS [Ilość miejsc], Pokoje.Pietro AS Piętro
FROM Pokoje
WHERE (((Pokoje.Typ_pokoju)=[Formularze]![START]![PodformularzNawigacji].[Form]![Plec]));

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