Tjenare!
Kunde inte sätta en bra rubrik.
Jag har en MySQL-databas där jag har indexerat följande kolumner:
new_Start, new_Slut, File, Fram, Retur, Tio och Femton.
Så här ser min kod ut:
<%
Session.LCID = 1053
Server.ScriptTimeout = 1200
Response.Buffer = False
Set Connect=server.createObject("ADODB.Connection")
Connect.Open = "DRIVER={MySQL ODBC 3.51 Driver}; SERVER=mysql.host.blabla; DATABASE=; UID=;PASSWORD=; OPTION=3"
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>TAXI 2009</title>
</head>
<body style="font-family:Courier;background-color:#DDD;">
<form method="post" action="?do=find">
<table>
<tr>
<td><b>Stad</b></td>
<td><b>Starttid (HH:MM)</b></td>
<td><b>Veckodag</b></td>
</tr>
<tr>
<td>
<select name="stad" style="font-family:Courier;">
<option>Välj stad...</option>
<option></option>
<option value="1">Lidköping</option>
<option value="2">Skara</option>
</select>
</td>
<td><input name="starttid" type="text" style="font-family:Courier;" /></td>
<td>
<!--
<select name="veckodag" disabled style="font-family:Courier;">
<option>Välj veckodag...</option>
<option></option>
<option value="0">Måndag</option>
<option value="1">Tisdag</option>
<option value="2">Onsdag</option>
<option value="3">Torsdag</option>
<option value="4">Fredag</option>
<option value="5">Lördag</option>
<option value="6">Söndag</option>
</select>
-->
</td>
<td><input type="submit" value="Sök" style="font-family:Courier;" /></td>
</tr>
</table>
</form>
<div style="font-size:7px;">
<%
If Request.Querystring("do") = "find" Then
Starttid = FormatDateTime(""&Request.Form("starttid")&"", vbShortTime)
Starttiden = Starttid
' Den ska loopa igenom dag för dag (måndag - söndag) 0 = Måndag, osv.
For minDag = 0 to 6
Response.Write("<table>")
' Vi ska hitta alla som inte är Kund=1,696,210, och inga bussar... och där stad är som angivet i formuläret, samt Weekday = minDag från For-loopen här ovan.
Set RecSet = Server.CreateObject("ADODB.Recordset")
RecSet.Open "Select DISTINCT Startdatum From LIDSK WHERE NOT Kundnr IN(1,696,210) AND NOT Bussar = 1 AND Stad = "&Request.Form("stad")&" " & _
"AND Weekday(new_Start) = "&minDag&"", Connect, 3, 3
' Gör korrekt format av Startdatum från recordsettet ovan
Dagen = RecSet("Startdatum")
Dagen = Left(Dagen,4) & "-" & Left(Right(Dagen,4),2) & "-" & Right(Dagen,2)
' Denna raden printar bara ut en rubrik
Response.Write "<tr><td>" & WeekdayName(Weekday(Dagen)) & "ar " & Starttid &" +30min" & "</td></tr>"
' Nu loopar vi igenom recsettet ovan.
Do Until RecSet.EOF
' Gör korrekt format av Startdatum.. igen? Dumt... men så är det iaf.
dennaDagen = RecSet("Startdatum")
dennaDagen = Left(dennaDagen,4) & "-" & Left(Right(dennaDagen,4),2) & "-" & Right(dennaDagen,2)
' Print ut datumet i vänstra kolumnen
Response.Write "<tr><td>" & dennaDagen & "</td>"
' Nu ska vi loopa ut varje minut fr.o.m det klockslaget som angavs i formuläret "starttid". T.ex 12:00 ska loopas fram till 12:30, minut för minut.
For Tal = 1 to 31
' Här fulmeckar jag lite... kommer inte ihåg exakt varför.
If Tal = 1 Then
Starttid = FormatDateTime(Starttid)
Else
Starttid = DateAdd("n",1,Starttid)
End If
' Fulmecka lite format etc...
Starttid = FormatDateTime(Starttid, vbShortTime)
Startdatum = RecSet("Startdatum")
Startdatum = Left(Startdatum,4) & "-" & Left(Right(Startdatum,4),2) &"-"& Right(Startdatum,2)
Starttid2 = FormatDateTime(Startdatum,2) & " " & FormatDateTime(Starttid, vbShortTime)
' Här räknar vi hur många rader som har denna minuten (från For-loopen) mellan klockslagen i new_Start och new_Slut.
Set RecSet2 = Server.CreateObject("ADODB.Recordset")
RecSet2.Open "SELECT COUNT(*) AS RecSetAntal FROM LIDSK " & _
"WHERE NOT Kundnr IN(1,696,210) AND NOT Bussar = 1 AND Stad = "&Request.Form("stad")&" " & _
"AND '"&Starttid2&"' BETWEEN LIDSK.new_Start AND LIDSK.new_Slut", Connect, 3, 3
' Lite meckande som jag inte kommer ihåg exakt varför jag skrev.
If Tal = 1 Then
mittAntal = RecSet2(0)
End If
If CInt(RecSet2("RecSetAntal")) > CInt(mittAntal) Then
mittAntal = RecSet2(0)
End If
' Printa ut resultat av ovanstående SQL-sats gav OM DET ÄR DEN SISTA MINUTEN SOM LOOPATS FRAM.
If Tal = 31 Then
Response.Write "<td>" & mittAntal & "</td></tr>"
Starttid = Starttiden
End If
' Gå vidare till nästa minut.
Next
RecSet.MoveNext
Loop
Response.Write("</table>")
' Gå vidare till nästa dag.
Next
End If
%>
</div>
</body>
</html>
Problemet är att loopen (eller SQLen?) låser sig ibland... vet ej varför... ser ej någon logisk förklaring till det... Det är 190.000st poster i databasen, men den räknar inte igenom alla. En lustig grej är att om man kör samma sökning två gånger så går det jättesnabbt andra gången (antar att det är för att indexet lärt databasen vart datan ligger, eller något sånt?).
Problemet är som sagt att den låser sig typ 3-4st gånger per sökning. Vet inte om den just "låser sig", men den tar väldigt lång tid efter ett par sökningar av minuter... så lång tid att den gör timeout till slut...
Är ju inte direkt den mest optimala eller bästa prestanda lösningen jag har här... det vet jag... men har ingen annan lösning på problemet (Stort tack till Peter_S som hjälpte mig med mitt tidigare problem i en annan tråd).
Tacksam för hjälp!
Mvh
Oskar