04. oktober 2004 - 13:34Der er
24 kommentarer og 1 løsning
List ledige tider ud fra dato i comboboks
I forbindelse med en tidsreservations db har jeg to combobokse.
Fra combo1 henter jeg datoen via datopicker fra combo2 vil jeg så gerne ha' listet de ledige tider.
Jeg har 2 tabeller: Tblreservation: kunde_id, reservationsdato og tid_id
Der er 19 tider der kan reserveres og de findes i tabel 2: Tbltid: tid_id og tid
Så forstiller jeg mig noget med at få listet de 19 mulige tid_id'er undtaget de tid_id'er der findes under tblreservation for den dato jeg valgte i combo1
Håber der er nogen der kan hjælpe mig.
PS. da både reservationsdato og tid_id i tblreservationer er nøglefelter, er det ikke muligt at lave dobbeltbooking, så derfor ville det allerbedste være, om det var muligt at liste alle 9 mulige tider, blot med den finesse at de reserverede tider stod med rødt, men det er sikkert ikke muligt i access.
SELECT Tbltid.Tid_id, Tbltid.tid FROM Tbltid LEFT JOIN Tblreservation ON Tbltid.Tid_id = Tblreservation.tid_id WHERE (((Tblreservation.tid_id) Is Null));
SELECT Tbltid.Tid_id, Tbltid.tid FROM Tbltid LEFT JOIN Tblreservation ON Tbltid.Tid_id = Tblreservation.tid_id WHERE (((Tblreservation.tid_id) Is Null)) OR (((Tblreservation.Reservationsdato)=[Formularer]![Tblreservation]![Reservationsdato]));
Det sidste ( rød/grøn ) kan vist ikke lade sig gøre i comboboksen
jeg ville evt gaa en lidt anden vej, som muligvis er langsommmer - men det kan da afproeves. Du ved at du har de 19 tids-slots for hver data saa du ved at du skal hae 19 raekker i comboen, og jeg vil foreslaa at du har 2 kolonner: tid og status, hvor status kan indikere en booking.
Saa din RowSource for combo'en er altid tiderne 1-19 i col(0), og status kan som udgangspunkt vaere blank indtil du klikker paa datoen i combo1 hvorefter du looper igennem de 19 tidspunkter:
For i = 1 to 19
if Dcount("tid_id", "TblReservation", "TblReservation.Dato = " & me.combo1.value & " AND TblReservation.tid_id = " & i) > 0 then
me.combo2.Column(2,i) = "Reserveret"
end if
next i
Ikke afproevet. Men med denne metode vil du f.eks ogsaa kunne tilfoeje kunde_id eller navn i comboen paa det tidspunkt hvor der er en reservation.
Har forsøgt mig frem og tilbage med Jensens forslag uden at kunne få det til at virke, men sikkert bare fordi jeg er lidt tung i det. :)
Overchord > dit forslag lyder rigtig godt, især fordi jeg så evt. også ville kunne få navn med. Evt. måske bare erstatte reserveret med navn, og så på den måde se at det er reserveret... Desværre får jeg en fejlmeddelse, når jeg sætter din kode ind og jeg har ikke meget (ingen) forstand på den slags.
Fejlmeddelsen lyder "compile erro: end if whitout blok if"
hov... overchord... Det var mig der ikke havde skrevet det korrekt.. nu kommer der ingen fejlmeddelse.. men det ser ikke ud til at køre som det skal og samtidig ser det ud til at jeg nu kan dobbeltbooke..
nu har jeg vist fundet det rigtige sted at indætte koden, men får en run-time error '2001' med teksten, "du har annuleret den forrige handling" når jeg forsøger at vælge en tid.
min kode ser sådan ud:
Private Sub combo2_BeforeUpdate(Cancel As Integer) For i = 1 To 19
If DCount("tid_id", "TblReservationer", "TblReservations.Dato = " & Me.combo1.Value & " AND TblReservationer.tid_id = " & i) > 0 Then Me.combo2.Column(2, i) = "Reserveret" End If
Hvis det ikke virker helt som det skal kan vi altid "snyde" lidt og lave det som er vaerdi-liste istedet, hvor man looper igennem de 19 gange, men fremfor at opdatere hver enkelt gang smider vi det hele i en streng som saa bliver sat til rowsource for comboen.
Jeg er lidt på Herrens mark her, da det er 5-6 år siden jeg sidst legede med access.
Syntes jeg har forsøgt mig med alle mulige kombinationer. Mener du hvilken kontrol elementkilde min combo2 har..? det er tid_id i tbl_reservationer. Rækkekilden (RowSource) har tbltid
ok, proev at skifte den ud med en liste med de 19 tal. Idet du altid har de 19 tids-slots vil det vaere det samme for hver dato der vises - eneste forskel er reservationerne i kolonner nummer to. 1. Skift kontrol elementkilde til en vaerdi liste/value list 2. I Raekkekilden skal der nu indskrives vaerdier skiftevis for kolonne 1 og kolonne 2 - som default vil reservationerne altid vaere tomme, saa vaerdilisten bliver "1"; "-"; "2"; "-" ...osv 3. Naar comboen er rettet til paa den maade kan vi arbejde lidt anerledes med den idet den kun indirekte er bundet til data naar du vaelger en dato i din combo1.
Saa i din combo1_click haendelse laegger du:
Private sub combo1_click()
dim ValList as string dim Reservation(19) as string dim i as integer
For i = 1 To 19 If DCount("tid_id", "TblReservationer", "TblReservations.Dato = " & Me.combo1.Value & " AND TblReservationer.tid_id = " & i) > 0 Then reservation(i) = "Reservaeret" else Reservation(i) = "-" End If
for i = 1 to 19 vallist = "'" & i & "'; '" & Reservations(i) & "'; " Next i
jo - det er netop det jeg mener - jeg arbejder selv med en engelsk version, saa nogle gange lidt svaert at gaette de danske navne :-) Naar du saetter raekkekildetypen til en vaerdiliste skulle kontrol elemen-kilden autmatisk forsvinde, hvis ikke, saa slet hvad der staar i feltet Princippet er at combo2 i sig selv ikke er bundet direkte til data idet det "kun" er en rapporteringsmekanisme. Istedet traekkes paa data fra combo1 og de eksisterende relationer.
Nu får jeg godt nok 2 kollonner, tid_id og den til visning af om tiden er reserveret, i sidstnævnte er der kun en streg, også ved de tider som skulle være reserveret.
Når jeg sletter kontrol elementkilden kan jeg heller ikke gemme.
hmm det lyder maerkeligt... Prev at oprette en ny combo-boks, hvor du ved guiden oprettelse vaelger selv at indskrive vaerdier fremfor at hente dem fra en tabel eller forespoergsel. Den oprindelige kode er erstattet med den fra 05/10-2004 15:16:01 En ting som muligvis foraarsager fejlen ved Dcount er at det er et dato-format: proev at erstatte DCount udtrykket med: DCount("tid_id", "TblReservationer", "TblReservations.Dato = #" & Me.combo1.Value & "# AND TblReservationer.tid_id = " & i)
Jeg har prøvet både at lave det sådan at den gemmer det i hukommelsen (ingenting i kontrol element kilden) og så den gemmer i tid_id
Jeg arbejder i access 2000
Du skal ha' mange tak for du gider bruge så meget tid på dette og når du får tid, må du også meget gerne sende en eksempel til mig. Min email adr er: carlos@lite.dk
ok jeg laver et hurtigt eksempel i Access97 i frokostpausen, hvis der stadig er problemer kan jeg lave et acc2000 eksempel iaften naar jeg kommer hjem :-)
ok, jeg haaber det kan bruges. Hvis du faar problemer, saa smid en besked herinde. Til andre: Loesningen var baseret paa ovensteende eksempel fra 05/10-2004 15:16:01.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.