webForumDet fria alternativet

Bokningssystem, presentation

3 svar · 569 visningar · startad av Sasch

SaschMedlem sedan nov. 2002830 inlägg
#1

Håller på att bygga ett bokningssystem för hanteradet av rum och arrangemangen som äger rum där. Kontrollen av att boka är inget problem, det är löst.

Men har stora problem för att skapa en visningssida för bokningarna. Det finns inget färdigt time/schedualgrid i databasen att loopa ut - utan bara bokningarna för rummet. Jobbar mot en MySQL-databas.

Tabellstruktur med dummydata
_______________________
ID      key    1
RoomID  Int    1
EventID Int    10
Start   datum  2010-10-01 14:00:00
Stop    datum  2010-10-01 15:00:00

Perfekt vore att först loopa ut varje dag, i stil med en veckobaserad kalender med tider i kanten och sedan kolla upp de bokningar som finns. Denna loopar dock bara ut varje UNIT under bokningsbara tiden. Fungerar ju också iofs...

Bygger upp ett grid i asp:

' Datum att använda som exempel, dessa är dock dynamiska
dtmConventionStart = cDate("2010-02-26 12:00:00")
dtmConventionStop = cDate("2010-02-28 14:00:00")

Dim intNDays, dtmCurrentDate
intNDays = DateDiff("d",dtmConventionStart, dtmConventionStop)
dtmCurrentDay = dtmConventionStart

	Dim rowId, bookingUnit
	rowId = 0
	DO WHILE dtmCurrentDay >= dtmConventionStart AND dtmCurrentDay <= dtmConventionStop

	Response.Write ("<ul class=""base"">"& vbCrlf )
		Response.Write ("<caption>"& FormatDateTime(dtmCurrentDay,2) &"</caption>"& vbCrlf)
		
		' # For each day 
		IF dtmCurrentDay = dtmConventionStart Then
			bookingUnit = dtmConventionStart
		ElseIF dtmCurrentDay = dtmConventionStop Then
			bookingUnit = dtmConventionStop
		End IF

		 ' # 1 UNIT = 30min to begin with
		 
		 ' # Hightlighted problem
		 ' # Do until a new day, then break for a new column,
		 ' # One day per column that is
		Do UNTIL bookingUnit >= DateAdd("h",24,dtmCurrentDay) OR bookingUnit >= dtmConventionStop

		 	' # Database controll to check if there is an event on this time

		 	' # Highlighted problem
		 	' # how do I loop it out? Hmm.
		 	' # First thought is array, but how do I go about?

			Response.Write ("	<li id="""& rowId &""" class=""unitruler")

			' # if timeunit is boooked, attached the class "booked"
			' # for now, an impossible equation
			IF 1 = 2 Then
				Response.Write (" booked")
			END IF

			Response.Write (""">"& bookingUnit &"</li>"& vbCrlf)
			
			bookingUnit = DateAdd("h",1,bookingUnit)
			rowId = rowId + 1
		Loop
		
		dtmCurrentDay = DateAdd("d",1,dtmCurrentDay)
		Response.Write ("</ul>"& vbCrlf )
	Loop

Problem 1:
Men hur kontrollerar jag när ett arrangemang start och stoppar? För problemet här blir ju bara att jag får ut starttiden, sedan måste jag ju fortfarande loopa ut markerade mellan och det är här det brister, utan att få dubbelposter i existerande grid?

Jag tänker mig en array kanske, men har ingen aning om hur jag ska gå tillväga - hjälp?

prebenMedlem sedan mars 2009452 inlägg
#2

' Datum att använda som exempel, dessa är dock dynamiska
dtmConventionStart = cDate("2010-02-26 12:00:00")
dtmConventionStop = cDate("2010-02-28 14:00:00")

Nu vill inte jag vara dryg här.. men vad är det du ska hyra ut och vad är det som är så viktigt att det är så exakt på timmen i din databas? Räcker det inte med dag? Jag förstår att kunden kommer kl. 12, men ingen annan kan ju hyra det rummet den dagen. Eller kan man det?

Samma vid avfärd. Man måste ju städa efteråt. Plocka i ordning stolar med mera. Kanske det drar ut på tiden, kanske med eftersnack?

Ingen kund vill ju få tillgång till rummet kl. 16, då har ju i princip hela dagen gått.

***
Om jag varit dig hade jag byggt ett system enbart baserat på datum. Så just detta rummet är alltså bokat 100% datum 26, 27, 28. Ingen annan kan komma till då.

Du måste tänka, dom kanske vill förbereda innan kl. 12. Sen samma på hemresan. Du kan ju inte piska ut folket...! :-)

OK. Du fattar. Jag vet inte vad det är du gör, men kanske det blir lite lättare för dig om du går på enbart datum och inte klockslag. Klockslag är givetvis viktigt, men det kanske går att anteckna i anslutning till EventID.

[event]
ID
strNotes

Fundera på detta! Det löser iofs inte ditt problem... men resultatet blir samma fast med mindre kod och det kanske kan vara en lösning? Med hopp!

SaschMedlem sedan nov. 2002830 inlägg
#3

Mycket tankvärt, faktiskt. Och visst hade det blivit nåt enormt enklare att bara kolla av hela dagar.

Dessvärre handlar det alltså om att faktiskt hyra ut per timme, jag postar koden igen med smärre kommentarförändringar så klarnar det nog för er lite:

[b]' Datum att använda som exempel, dessa är dock dynamiska
' Detta är alltså tidsrymden då det går att boka rum(men) Ingen färdig bokning.

dtmConventionStart = cDate("2010-02-26 12:00:00")
dtmConventionStop  = cDate("2010-02-28 14:00:00")

' Detta är en dummybokning som hämtas från tabellen booking
BookingStart    = cDate("2010-02-26 14:00:00")
BookingStop     = cDate("2010-02-26 19:00:00")
BookingRoomID   = 1
BookingEventID  = 12
[/b]
Dim intNDays, dtmCurrentDate
intNDays = DateDiff("d",dtmConventionStart, dtmConventionStop)
dtmCurrentDay = dtmConventionStart

	Dim rowId, bookingUnit
	rowId = 0
	DO WHILE dtmCurrentDay >= dtmConventionStart AND dtmCurrentDay <= dtmConventionStop

	Response.Write ("<ul class=""base"">"& vbCrlf )
		Response.Write ("<caption>"& FormatDateTime(dtmCurrentDay,2) &"</caption>"& vbCrlf)
		
		' # For each day 
		IF dtmCurrentDay = dtmConventionStart Then
			bookingUnit = dtmConventionStart
		ElseIF dtmCurrentDay = dtmConventionStop Then
			bookingUnit = dtmConventionStop
		End IF

		 ' # 1 UNIT = 1h to begin with
		 
		 [b]' # Hightlighted problem[/b]
		 ' # Do until a new day, then break for a new column,
		 ' # One day per column that is
		Do UNTIL bookingUnit >= DateAdd("h",24,dtmCurrentDay) OR bookingUnit >= dtmConventionStop

			[b]' ## Database controll to check if time is booked or not
			SET rsCheck = Server.CreateObject("ADODB.Recordset")
			SET rsCheck = objdbConnection.Execute ("SELECT * FROM booking WHERE (Start = '"& bookingUnit &"' OR Stop = '"& bookingUnit &"') AND RoomID = "& event_room_id )

				IF rsCheck.EOF Then
					IF unitBooked = 1 Then
						Response.Write (" booked")
					End IF
				ELSE
					IF rsCheck("Stop") = bookingUnit Then
						unitBooked = 0
						Response.Write (" booked")
					ElseIF rsCheck("Start") = bookingUnit Then
						unitBooked = 1
						Response.Write (" booked")
					End IF
				End IF

			
			CloseRecordset(rsCheck)[/b]

		 	[b]' # Highlighted problem[/b]
		 	' # how do I loop it out? Hmm.
		 	' # First thought is array, but how do I go about?
			IF unitBooked = 1 Then
					Response.Write (" booked")
			End IF

			Response.Write ("	<li id="""& rowId &""" class=""unitruler")

			' # if timeunit is boooked, attached the class "booked"
			IF unitBooked = 1 Then
					Response.Write (" booked")
			End IF

			Response.Write (""">"& bookingUnit &"</li>"& vbCrlf)
			
			bookingUnit = DateAdd("h",1,bookingUnit)
			rowId = rowId + 1
		Loop
		
		dtmCurrentDay = DateAdd("d",1,dtmCurrentDay)
		Response.Write ("</ul>"& vbCrlf )
	Loop

Det handlar om rätt korta bokningar alltså, från 3-4 timmar till ja, kanske hela dygn vilket gör att det är dumt att boka ett rum en hel dag....

Men nu har jag ändå kommit ganska långt, jag har lyckats kolla vid varje tidsenhet om den är bokad eller inte och därifrån.

		Do UNTIL bookingUnit >= DateAdd("h",24,dtmCurrentDay) OR bookingUnit >= dtmConventionStop
			Response.Write ("	<li id="""& rowId &""" class=""unitruler")
			
			' ## Database controll to check if time is booked or not
			SET rsCheck = Server.CreateObject("ADODB.Recordset")
			SET rsCheck = objdbConnection.Execute ("SELECT * FROM booking WHERE (Start = '"& bookingUnit &"' OR Stop = '"& bookingUnit &"') AND RoomID = "& event_room_id  )
			
				IF rsCheck.EOF Then
					IF unitBooked = 1 Then
						Response.Write (" booked")
					End IF
				ELSE
					IF rsCheck("Stop") = bookingUnit Then
						unitBooked = 0
						Response.Write (" booked")
					ElseIF rsCheck("Start") = bookingUnit Then
						unitBooked = 1
						Response.Write (" booked")
					End IF
				End IF
			
			CloseRecordset(rsCheck)
			
			
			Response.Write ("""  onClick=""javascript: eventoptions('"& bookingUnit &"');"">"& bookingUnit &"</li>"& vbCrlf)
			bookingUnit = DateAdd("h",1,bookingUnit)
			rowId = rowId + 1
		Loop

Problemet med denna kodsnutt är att den inte verkar hämta ut första booking.stop - av någon konstig anledning, något som har en idé varför?

SaschMedlem sedan nov. 2002830 inlägg
#4
<style type="text/css">
.booked { background: #f00; }
</style>

Så är det kanske lättare att se vad som händer.

139 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)