Auto plek nummer

Status
Niet open voor verdere reacties.

mark19942007

Gebruiker
Lid geworden
11 dec 2009
Berichten
28
Hoi allemaal,

Net als kidsboys2 ben ik ook bezig met een automatiseringssysteem voor een camping.
Ik sta nu voor een probleempje.
We hebben allemaal plaatsen en klanten gemaakt.
Deze staan in 2 tabellen.

Klanten_tabel en in Huisjes.

We hebben nu een formulier gemaakt. We willen nu dat we in dit formulier de gegevens van een klant kunnen stoppen. Dit kan ook. We kunnen ook een week toevoegen. Nu willen we graag dat dit formulier kijkt welke week we hebben gebruikt en of daar dan nog een plek vrij is, zo ja willen we graag dat hij deze gelijk toevoegt.

Om onenigheid met jullie te voorkomen, we mogen van onze docent hulp zoeken op een forum!

Ik zal voor het gemak even in een rar bestand het bestand van ons toevoegen!

Wat dus de bedoeling is, is dat 'iets'(het liefst gewoon in het formulier) kijkt wat er bij week is ingevoerd en dan kijkt welke plaats in die week nog vrij is, dus bv in week 40 plek 1 bekijkt, is die ingevoerd dan bekijkt hij plek 2 is die ingevoerd bekijkt hij pklek 3, is die leeg dan vult hij die in bij pleknummer.

Alvast bedankt!!
 

Bijlagen

Laatst bewerkt:
hey mensen,

Ik zie dat hij al 5 keer bekeken is...
Zou iemand mij willen helpen? Ik zit in de knoop in wil erg graag de oplossing hebben:o
Dinsdag moet het project af zijn namelijk...

Alvast erg bedankt!:thumb:
 
Dacht het wel....
In dit voorbeeldje heb ik een formulier gemaakt waarop je boekingen kunt maken. Er staan twee keuzelijsten op: één voor de week, en één voor het huisje. Om te voorkomen dat je een verkeerd huisje boekt, is die keuzelijst geblokkeerd; je moet dus eerst een periode kiezen. Vervolgens kun je uit de Huisjeslijst een huisje kiezen dat nog niet is verhuurd.
Tis een begin...
 

Bijlagen

Hoi octafish.

Heel erg bedankt!!
Ik snap nu al een groot gedeelte, de query's snap ik al. Maar hoe heb je dat gedaan met dat formulier? Dat je eerst weken moet selecteren en dan pas plaats, hoe heb je dat gedaan?
Zoals ik al zei, echt bedankt!:o
 
Bij het openen van het formulier wordt de tweede keuzelijst uitgezet met het commando
Code:
    Me.cboPlaatsnummer.Enabled=False
Vervolgens staat op de keuzelijst cboWeek een gebeurtenis <Na Bijwerken>:

Code:
    Me.cboPlaatsnummer.Requery
    Me.cboPlaatsnummer.Enabled = True
Hiermee wordt eerst de query van cboPlaatsnummer opnieuw ingelezen, zodat de juiste huisjes te zien zijn, en vervolgens wordt de keuzelijst actief gemaakt.

ik heb overigens in je Relaties ook het e.e.a. veranderd, want die stonden precies verkeerd om.... In Relaties kun je het beste Inner Joins leggen tussen de tabellen; als je namelijk een query maakt, kun je de join altijd nog veranderen, maar meestal gebruik je toch Inner joins.
 
Oke, das nu duidelijk ja...
Maar wat is nu het verschil tussen query 1 en query 2? Of beter gezegt, kun je mij uitleggen wat deze 2 doen?
 
Kan ik wel uitleggen, maar ze worden verder niet gebruikt in de oplossing... In eerste instantie wilde ik het oplossen met queries, en zonder VBA, maar dat werd mij eerlijk gezegd ook een beetje te ingewikkeld, al kan het wel, mocht je dat willen.
Ze mogen dus ook weg...
 
Sorry, net bekeken, gebeurd niks als ik ze weg haal.
Maar dan snap ik niet wat dat dropdown menu precies doet/werkt?

Ik snap nu dat

Me.cboWeek.Requery
Me.cboPlaatsnummer.Enabled = False

te maken heeft met dat dropdown menu... Maar hoe en wat precies?
 
Laatst bewerkt:
De keuzelijst cboPlaatsnummer gebruikt een query als rijbron waarin een waarde uit de keuzelijst cboWeek wordt gebruikt. Als je het formulier opent, heb je nog niks gekozen uit die lijst. De lijst cboPlaatsnummer is dan ook nog niet opgebouwd.
Kies je nu een waarde in cboWeek, dan verandert er iets op het formulier. Alleen doet Access met die verandering niks. Dat moet je zelf aangeven. En dat gebeurt dus met de actie Me.cboPlaatsnummer.Requery. Nu krijgt de keuzelijst de goede waarden.

En iets vergelijjkbaars geldt als je naar een ander record gaat op het formulier: je moet weer een aantal instellingen op het formulier goedzetten, anders gaat hij verder met de vorige instellingen.
Da's een beetje het idee achter de Requery commando's die je her en der tegenkomt.
 
Oke, erg bedankt, allemaal duidelijk!
Maar wat voor mij nog steeds niet helemaal duidelijk is, hoe je er voor hebt gezorgt dat hij de weken laat zien in een dropdown menu, en hoe het kan dat hij in plaatsnummer alleen de vrije nummers van de daarboven geselecteerde week laat zien?

Sorry dat ik misschien teveel vragen stel :rolleyes: Ik moet het alleen wel weten en snappen anders kan ik het alsnog niet gebruiken/inleveren. Maar zeker bedankt!
 
Waarschijnlijk een beetje aan de late kant, maar toch nog een poging om wat meer licht in de duisternis te scheppen...
Ik heb in deze versie, die overigens een stuk beter werkt, de query van de keuzelijst cboPlaatsnummer vervangen door een query die wordt opgebouwd nadat een week is geselecteerd. De code ziet er zo uit:

Code:
Private Sub cboWeek_AfterUpdate()
Dim strSQL As String
Dim sWeek As String, tmp As String
    
    sWeek = Me.cboWeek
    strSQL = "SELECT Id, Soort FROM Huisjes" & vbCrLf
    strSQL = strSQL & "WHERE (Id Not In (SELECT plaatsnummer FROM klanten_tabel WHERE Week = '" & sWeek & "'))"
    Me.cboPlaatsnummer.RowSource = strSQL
    Me.cboPlaatsnummer.Requery
    Me.cboPlaatsnummer.Enabled = True

End Sub

Wat er gebeurt, is het volgende:
Als je een week hebt geselecteerd, moet de keuzelijst Plaatsnummer alleen die huisjes laten zien, die niet zijn verhuurd. Omdat de keuzelijst in beginsel is gebaseerd op de tabel Huisjes, moet je dus eerst alle huisjes uit de lijst 'verwijderen' die al zijn verhuurd.
De mooiste manier om dat te doen, vind ik de bovenstaande manier: je maakt een criterium, waarin je een selectie maakt van de huisjes die voor die week zijn verhuurd, en zegt vervolgens: alle huisjes, behalve die!
Dat gebeurt in deze regel:
WHERE (Id Not In (SELECT plaatsnummer FROM klanten_tabel WHERE Week = '" & sWeek & "')
In deze constructie heb ik eerst de waarde uit de keuzelijst cboWeek toegewezen aan de variabele sWeek, dus daarom zit die ook in de SQL tekst.
Probeer maar eens uit, en kijk of je het snapt...
 

Bijlagen

Sorry:confused: nu maak je het wel erg ingewikkeld:P haha... hij werkt ook niet helemaal die je hebt gemaakt!
Ik hou het liever toch op de eerste versie... Zoals ik net met kidsboys2 heb besproken, hij en ik snappen het nog niet helemaal... hoe heb je nu dat eerste formulier gemaakt? We moeten dit wel weten anders mogen we het alsnog niet inleveren van onze docent:o En bovendien heb ik er anders niks aan:d

Alvast bedankt! Maar kun je ons/mij toch nog even uitleggen hoe je dat nu precies gemaakt hebt?:thumb::thumb::thumb:
 
Ik raak zelf ook een beetje confuus :confused: De nieuwe versie heb ik er op gezet, omdat de oude het eigenlijk niet goed deed... En nu lees ik, dat de eerste wel goed werkt, maar de laatste niet?? Ik zat gisteravond dus nog even naar de eerste variant te kijken, en kwam er achter dat die niet goed werkte; de keuzelijsten werden niet helemaal goed gevuld. Vandaar de nieuwe variant... Wat doet-ie volgens jou verkeerd?
 
De eerste pakte soms inderdaad een verkeerd lijstje, maar dat was een kwestie van formulier sluiten en weer openen. En die 2e, daar kan ik wel een week selecteren maar hij laat dan geen plaatsnummers zien! En bovendien, staan er 2, een dropdown menu en een tekstvak...

Wat gaat er fout bij jou in de eerste?
Nogmaals mijn vraag:P Hoe heb je dat formulier gemaakt?:thumb:
 
OK, hier dan (hopelijk) de laatste versie... Deze is weer gebaseerd op queries, dus hopelijk wat begrijpelijker!
Om te beginnen: er zit een query in, qReserveringWeek die wordt gebruikt in het formulier. Deze kan dus niet weg....
Dit is wat hij doet:
Code:
SELECT Huisjes.Id, Klanten_tabel.Week
FROM Huisjes LEFT JOIN Klanten_tabel ON Huisjes.Id = Klanten_tabel.Plaatsnummer
WHERE (Klanten_tabel.Week=[Forms]![Klanten_tabel]![cboWeek])
ORDER BY Huisjes.Id, Klanten_tabel.Week;
Deze query selecteert alle huisjes die in een bepaalde week zijn geboekt, op basis van de week die is geselecteerd op het formulier. Die selectie wordt gemaakt met de regel
WHERE (Klanten_tabel.Week=[Forms]![Klanten_tabel]![cboWeek])
Als je de query uitvoert zonder dat het formulier geopend is, zal hij ook niet de juiste records weergeven, want er is dan geen week geselecteerd.

Op het formulier heb je dus twee keuzelijsten: cboWeek en cboPlaatsnummer.
cboWeek
Deze heeft de volgende Rijbron:
SELECT Weken.Week, Count(Klanten_tabel.Id) AS Aantal FROM Weken LEFT JOIN Klanten_tabel ON Weken.Week=Klanten_tabel.Week GROUP BY Weken.Week HAVING (Count(Klanten_tabel.ID)<DCount("[Id]","[Huisjes]"));
Hiermee wordt een selectie gemaakt van de beschikbare weken. Er zit een filtering op deze query:
HAVING (Count(Klanten_tabel.ID)<DCount("[Id]","[Huisjes]"))
die het volgende doet: hij telt het aantal huisjes dat is uitgeleend; zodra dat gelijk is aan het aantal huisjes dat je kunt reserveren, dan verdwijnt de week uit de lijst. In dat geval zijn namelijk alle huisjes voor die week gereserveerd, en mag je dus niet meer reserveren voor die week. Daarom staat ook het veld Aantal erbij in de keuzelijst, zodat je kunt zien hoeveel reserveringen er zijn in die week.
De keuzelijst cboWeek heeft nog een stukje VBA nodig, om de keuzelijst cboPlaatsnummer te kunnen verversen. Hoe dat werkt heb ik eerder uitgelegd.

cboPlaatsnummer
Deze heeft de volgende rijbron:
Code:
SELECT Huisjes.Id, Huisjes.Soort, qReserveringWeek.Week
FROM Huisjes LEFT JOIN qReserveringWeek ON Huisjes.Id = qReserveringWeek.Id
WHERE (qReserveringWeek.Id Is Null);
Hier zit dus een link in met de query qReserveringWeek. Het is een zogenaamde Outer Join; de query laat alle records zien uit Huisjes, oftewel: laat alle huisnummers zien, en verder zie je normaal gesproken ook de records die in beide tabellen aanwezig zijn, oftewel: je zou, als je niet filtert, uit de query alle verhuurde huisnummers zien, en een hoop lege velden. Als ik de niet-lege velden niet zou wegfilteren, zou de query dus de volledige lijst laten zien aan huisjes, omdat dat de hoofdtabel is in de query. Maar een huisje dat al is gereserveerd, en waarvan het nummer dus in de query qReserveringWeek te zien is, wil je niet nog een keer kunnen reserveren. Daarom staat er een criterium op het veld qReserveringWeek.Id:
WHERE (qReserveringWeek.Id Is Null). Oftwel: alleen lege records laten zien uit de query. De niet-verhuurde huisjes dus.

En dat is het wel, in grote lijnen...
 

Bijlagen

Heel heel heel erg bedankt!
De tijdsdruk is weer afgenomen, docent is ziek:D

Ik snap wat je hier hebt geschreven en ga deze vakantie hard aan werken om er echt iets moois van te maken!:thumb: Nogmaals erg bedankt! Als ik vragen heb zet ik het hier wel weer neer.:cool:
 
OK, hier dan (hopelijk) de laatste versie... Deze is weer gebaseerd op queries, dus hopelijk wat begrijpelijker!
Om te beginnen: er zit een query in, qReserveringWeek die wordt gebruikt in het formulier. Deze kan dus niet weg....
Dit is wat hij doet:
Code:
SELECT Huisjes.Id, Klanten_tabel.Week
FROM Huisjes LEFT JOIN Klanten_tabel ON Huisjes.Id = Klanten_tabel.Plaatsnummer
WHERE (Klanten_tabel.Week=[Forms]![Klanten_tabel]![cboWeek])
ORDER BY Huisjes.Id, Klanten_tabel.Week;
Deze query selecteert alle huisjes die in een bepaalde week zijn geboekt, op basis van de week die is geselecteerd op het formulier. Die selectie wordt gemaakt met de regel
WHERE (Klanten_tabel.Week=[Forms]![Klanten_tabel]![cboWeek])
Als je de query uitvoert zonder dat het formulier geopend is, zal hij ook niet de juiste records weergeven, want er is dan geen week geselecteerd.

Op het formulier heb je dus twee keuzelijsten: cboWeek en cboPlaatsnummer.
cboWeek
Deze heeft de volgende Rijbron:

Hiermee wordt een selectie gemaakt van de beschikbare weken. Er zit een filtering op deze query:
HAVING (Count(Klanten_tabel.ID)<DCount("[Id]","[Huisjes]"))
die het volgende doet: hij telt het aantal huisjes dat is uitgeleend; zodra dat gelijk is aan het aantal huisjes dat je kunt reserveren, dan verdwijnt de week uit de lijst. In dat geval zijn namelijk alle huisjes voor die week gereserveerd, en mag je dus niet meer reserveren voor die week. Daarom staat ook het veld Aantal erbij in de keuzelijst, zodat je kunt zien hoeveel reserveringen er zijn in die week.
De keuzelijst cboWeek heeft nog een stukje VBA nodig, om de keuzelijst cboPlaatsnummer te kunnen verversen. Hoe dat werkt heb ik eerder uitgelegd.

cboPlaatsnummer
Deze heeft de volgende rijbron:
Code:
SELECT Huisjes.Id, Huisjes.Soort, qReserveringWeek.Week
FROM Huisjes LEFT JOIN qReserveringWeek ON Huisjes.Id = qReserveringWeek.Id
WHERE (qReserveringWeek.Id Is Null);
Hier zit dus een link in met de query qReserveringWeek. Het is een zogenaamde Outer Join; de query laat alle records zien uit Huisjes, oftewel: laat alle huisnummers zien, en verder zie je normaal gesproken ook de records die in beide tabellen aanwezig zijn, oftewel: je zou, als je niet filtert, uit de query alle verhuurde huisnummers zien, en een hoop lege velden. Als ik de niet-lege velden niet zou wegfilteren, zou de query dus de volledige lijst laten zien aan huisjes, omdat dat de hoofdtabel is in de query. Maar een huisje dat al is gereserveerd, en waarvan het nummer dus in de query qReserveringWeek te zien is, wil je niet nog een keer kunnen reserveren. Daarom staat er een criterium op het veld qReserveringWeek.Id:
WHERE (qReserveringWeek.Id Is Null). Oftwel: alleen lege records laten zien uit de query. De niet-verhuurde huisjes dus.

En dat is het wel, in grote lijnen...

Sorry dat ik dit weer opnieuw tot een discussie breng, maar ik wil dit ook graag begrijpen.
het grootste gedeelte snap ik wel. maar je hebt het over queryS.
ik vind er maar één. ik mis die querys van cboWeek en cboPlaatsnummer
hoe zit dit dan in elkaar?

Groeten van my :D
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan