Jag har en databas med tabellerna Elever och EleversTeori. <b>jag vill visa alla Elever som går en viss kurs i ett formulär.</b> Hej! Jag ska se om jag kan förklara bättre. JAg tror detta är ett tips i rätt rikning: Jag måste vara den otydligaste människan i världen. Jag tror inte att FilterOn hjälper mej tyvärr eftersom det är en tabell i FROM fältet av frågan som behöver läggas till och tas bort. <b>Det jag vill är att öppna huvudformuläret på villkor som finns i ett underformulär.</b> Hej Per, Vaför måst du förändra FROM satsen? hm... Hej igen! Det är lite llurigt. Men WhereFilkors parametern är det som blir filtret. Du är en klippa!Ytterligare en villkorsfråga
Elever innehåller bland annat Elever.personnummer och
ElevsTeori som bland annat innehåller ElevsTeori.elev (= Elever.personnummer)
och ElevsTeori.kurs.
Det jag har problem med är att jag vill visa alla Elever som går en viss kurs i ett formulär. Jag har frågan
SELECT *
FROM Elever, ElevsTeori
WHERE Elever.personnummer = ElevsTeori.elev
AND ElevsTeori.kurs = ”Matematik”;
Vilket naturligtvis fungerar men...
För att det ska fungera i mitt huvudformulär måste jag lägga till ElevsTeori i frågorna som huvudformuläret baseras på (SELECT * FROM Elever, ElevsTeori ORDER BY Elever.efternamn;) men...
då får jag ut posterna i Elever lika många gånger som de finns i ElevsTeori och då blir det en väldig röra, eftersom formuläret måste gå att använda även i ofiltrerat skick.
I huvudformuläret är ElevsTeori.elev och Elever.personnummer sedan sammankopplat i ett underformulär så där har jag inte samma problem.
Någon som har något förslag på hur jag ska göra?
//LisaSv: Ytterligare en villkorsfråga
Jag antar att detta är kärnan i ditt problem?
Jag skulle gjort följande:
* Skapa ett formulär som är bundet till kurser. JAg tycker det borde finnas en tabell för detta och att du länkar ElevsTeori.kurs till kurser.KursId.
Alternativt kan du skapa ett distinct urval:
SELECT DISTINCT ElevsTeori.kurs
FROM ElevsTeori
ORDER BY ElevsTeori.kurs
Du har nu ett formulär vilket du kan navigera i samtliga kurser. En förutsättning för att visa de elever som tillhör kusen.
* Skapa nu ett underformulär i ditt kursformulär med datakällan:
SELECT *
FROM ElevsTeori LEFT JOIN Elever ON ElevsTeori.elev = Elever.personnummer
* Länkar underformuläret till kursformuläret med kurs till kurs.
Nu skall underformuläret visa samtliga elever i din kurs
Sv:Ytterligare en villkorsfråga
Det är tyvärr inte riktigt så enkelt.
Jag har redan ett huvudformulär med tillhörande underformulär och tabellen Kurser.
Det jag inte lyckades förmedla i min fråga var att det är huvudformuläret som har ett underformulär som visar ElevsTeori.
I ett tredje formulär (vilket Andreas H redan har stiftat bekantskap med) ska jag sätta villkor för vilka Elever som ska vara med när jag öppnar huvudformuläret. Problemet är det att huvudformuläret egentligen inte har en aning om vilka kurser vilken elev går för det vet bara ElevsTeori. Huvudformuläret är baserat på frågan.
SELECT *
FROM Elever
ORDER BY Elever.efternamn;
Om jag ändrar frågan till att inkludera ElevsTeori
SELECT *
FROM Elever,. ElevsTeori
ORDER BY Elever.efternamn;
får jag ut en himla massa rader, och eftersom huvudformuläret måste gå att använda som det är utan filtrering är det ingen lösning.
Att lägga till DISTINCT i denna fråga hjälper tyvärr inte heller eftersom frågan levererar precis det som den ska en rad per elev per kurs.
Sålänge jag inte har med ElevsTeori i frågan som jag baserar huvudformuläret på så har jag ingen nytta av att kunna sätta villkoret WHERE Elever.personnummer = ElevsTeori.elev AND ElevsTeori.kurs = forms!valForm!kbKurs; för att öppna huvudformuläret från valForm (det tredje formuläret).
Finns det något sätt att få tag i kopplingen mellan huvud och underformuläret, utan att ha med informationen från underformuläret i hela huvudformuläret.
Ojoj så rörigt det blev...
men det är precis såhär det är får jag ut det ena så stjälper jag det andra.
Hoppas du eller någon annan har en aning om hur jag ska få ordning på det hela.
//Lisa
Sv:Ytterligare en villkorsfråga
Grunden är denna
<B>Tabeller med egenskaper</B>
<B>Elever ElevsTeori Kurser </B>
p_nr elev kurs
namn kurs plats
<B>Formulär</B>
<B>Huvudformuläret ElevInfo </B>
Ett huvudformulär med information om elever inklusive underformulären
ElevsTeori som jag har som exempel här men även
ElevsVerkstad, ElevsPraktik och ElevsAnhöriga.
Huvudformuläret ElevInfo är baserat på frågan ElevInfoFråga som ser ut såhär:
SELECT *
FROM Elever
ORDER BY Elever.efternamn;
<B>Underformuläret ElevsTeori är kopplat mellan Elever.personnummer och ElevsTeori.elev</B>
Underformuläret ElevsTeori visar vilka kurser, betyg, platser och tider eleven som visas i huvudformuläret ElevInfo har gått eller går. Underformuläret är baserat på:
SELECT *
FROM ElevsTeori
ORDER BY ElevsTeori.startdatum DESC;
<B>Överformuläret VäljElevGrupp</B>
Detta formulär består av kombinationsrutor där användaren kan välja vilka egenskaper de elever som ska öppnas i huvudformulären ska ha. Det innehåller dessutom knappar för att öppna alla huvudformulär i applikationen.
<B>Det jag vill göra är</B>
Jag vill att användaren ska kunna välja en kurs i kombinationsrutorna i Överformuläret VäljElevGrupp och visa de elever som går den kursen. ElevsTeori som håller reda på vilka elever som går vilka kurser finns inte som huvudformulär utan endast som underformulär vilket innebär att jag vill öppna huvudformuläret för de elever som går en viss kurs i huvudformulärets underformulär.
<B>Problemen med detta är</B>
För att få frågan
SELECT *
FROM Elever, EleversTeori
WHERE Elever.pNr = ElevsTeori.elev AND ElevsTeori.kurs = "Matematik"
att fungera måste jag ha med tabellen ElevsTeori i frågan för huvudformuläret ElevInfo.
Om jag lägger till ElevsTeori i den frågan får jag problem eftersom det ger en rad per elev och kurs som svar. Huvudformuläret måste kunna användas utan filter så det är inte acceptabelt att ha en sådan lösning.
Jag hoppas detta bringade mer klarhet i min fråga
//Lisa
Sv: Ytterligare en villkorsfråga
Private Sub Combo4_AfterUpdate()
If IsNull(Combo4.Value) Then
Me.FilterOn = False
Else
Me.Filter = "p_nr IN (SELECT elev FROM ElevsTeori WHERE kurs='" & Combo4.Value & "')"
Me.FilterOn = True
End If
End Sub
Sv:Ytterligare en villkorsfråga
Det jag vill är att öppna huvudformuläret på villkor som finns i ett underformulär.
Det borde ju gå att få tag på kopplingen mellan huvud och underformulär (Elever.pnr = ElevsTeori.elev) utan att för den skull ta med de tabeller underformuläret är baserat på i frågan till Huvudformuläret.
En annan lösning hade ju varit att öppna frågan huvudformuläret är baserad på och tillfälligt skriva om den till den nya frågan. Se mer på [Spara sträng till fråga]
Är det någon som har varit i samma sits - och löst det?
//LisaSv: Ytterligare en villkorsfråga
Är det alltid så att det skall vara det som finns i underformuläret som skall vara styrande?
I så fall borde du vända på steken så att säga...
Om det fungerar bra som det är idag förut detta fel kan du väl kanske tänka på att ev. göra ett till formulär?
/ PerSv:Ytterligare en villkorsfråga
Det är bara ibland jag ska få ut egenskaper från underformuläret.
Det där med att göra ett till formulär låter egentligen vansinnigt men om man tänker en gång till så kanske det inte är så dumt.
Om man i det nya formuläret använder det gamla underformuläret som huvudformulär och det gamla huvudformuläret som underformulär så ser det likadant ut men villkoret fungerar. Jag får klura vidare på det om några timmar när minisonen sover middag.
//LisaSv: Ytterligare en villkorsfråga
Om du tittar i mitt exemple så har jag inkluderat en underfråga.
Denna underfråga gör att bara de elever som går en specifik kurs visas i elevinfo formuläret utan att en ny tabell läggs till.
Vad det inte det du ville göra?Sv:Ytterligare en villkorsfråga
Jag kanske tittade för snabbt, har inte så lätt för att se i andras kod ska ta tag i saken senare idag men nu är det öppen förskola, kräx och bjöjor för hela slanten ett tag.
//LisaSv: Ytterligare en villkorsfråga
Jag har tyvärr inte lyckats återkomma till detta formulär förrän idag men jag får fortfarande inte ihop det, det kan vara på grund av mina bristande SQL kunskaper men även för att det var svårt att synka in Andreas kod i min.
Private Function SättFilter() As String
Dim filter As String
If kbKurs <> "" Then
filter = "Elever.personnummer IN (SELECT ElevsTeori.elev, ElevsTeori.kurs FROM ElevsTeori WHERE ElevsTeori.kurs = Forms!aVÄLJELEVGRUPP!kbKurs)"
End If
SättFilter = filter
End Function
'-----------------------------------------------------
Private Function SättVillkor() As String
Dim villkor As String
Dim flagga As Integer
If tbEfternamn <> "" Then
If flagga = 1 Then
villkor = villkor & " AND "
End If
villkor = villkor & "Elever.efternamn = " & "'" & tbEfternamn & "'"
flagga = 1
End If
If kbKurs <> "" Then
End If
'-------------------------------------------
Private Sub btElevInfo_Click()
Dim villkor As String
Dim filter As String
villkor = SättVillkor()
filter = SättFilter()
DoCmd.OpenForm "aELEVINFO", , filter, villkor, , acWindowNormal
Om jag gör såhär blir resultatet att alla elevers formulär öppnas (fast första eleven läser engelska som jag har testat på så då blir jag jätteglad – i några sekunder)
Så blir det om jag sätter filtret till:
"Elever.personnummer IN (SELECT ElevsTeori.elev, ElevsTeori.kurs FROM ElevsTeori WHERE ElevsTeori.kurs = Forms!aVÄLJELEVGRUPP!kbKurs)"
Är det någon som ser vad jag har gjort för fel?
//Lisa
PS: jag <B>vet</B> att det är fult med svensk kod
Sv:Ytterligare en villkorsfråga
Så du skall slå samman dem:
Private Function SättVillkor() As String
Dim villkor As String
If Len(kbKurs.Value) > 0 Then
villkor = villkor & " AND (Elever.personnummer IN (SELECT ElevsTeori.elev, ElevsTeori.kurs FROM ElevsTeori WHERE ElevsTeori.kurs = Forms!aVÄLJELEVGRUPP!kbKurs))"
End If
If Len(tbEfternamn.Value) > 0 Then
villkor = villkor & " AND Elever.efternamn = '" & tbEfternamn & "'"
End If
If Len(villkor) Then 'Ta bort första AND
SättVillkor = Mid(villkor, 6)
End If
End Function
'-------------------------------------------
Private Sub btElevInfo_Click()
Dim villkor As String
villkor = SättVillkor()
DoCmd.OpenForm "aELEVINFO", , , villkor, , acWindowNormal
End Sub
Har förenklat koden lite. Så du slipper håla reda på om det skall vara AND.
Sv: Ytterligare en villkorsfråga
När minisonen sover nästa gång ska jag gräva ner mej i koden.
//Lisa