Tjena
Har satt ihop en liten koll i ett anmälningsscript om personen tidigare varit anmäld och isf. skall en utskrft göras över tidigare anmälningar.
Nu har jag ett litet problem, att bara en post visas, trots att personen varit anmäld ett flertal gånger tidigare.
If Request.Form("do") = "checkPersNum" Then
nPersNum = Request.Form("nPers1") & "-" & Request.Form("nPers2")
lId = Request.Form("lId")
openDB("def")
sSql = "SELECT gId, nPersNum " &_
"FROM tbl_sSchool_notifications " &_
"WHERE nPersNum = '" & nPersNum & "'"
Set rs1 = oConn.Execute(sSql)
If Not rs1.EOF Then
' Hittar tidigare personnummer
gId = rs1("gId")
sSql = "SELECT gId, gName, gStartDate, gClosed " &_
"FROM tbl_sSchool_groups " &_
"WHERE gId = " & gId & " " &_
"ORDER BY gStartDate DESC"
Set rs2 = oConn.Execute(sSql)
If Not rs2.EOF Then
' Hittar tidigare grupp, kolla om stängd eller ej.
If gId = rs2("gId") AND rs2("gClosed") = False Then
' Dubbelbokning, informera om detta
Response.Write("<h4>Du är redan anmäld till " & rs2("gName") & " med start " & rs2("gStartDate") & "</h4>")
Else
' Tidigare bokning, lista gamla och gå vidare.
Response.Write("<h4>Du har tidigare gått i:<br>")
[b]Do Until rs2.EOF
Response.Write("- " & rs2("gName") & " med start " & rs2("gStartDate") & "<br>")
rs2.MoveNext
Loop[/b]
Response.Write("</h4>")
End If
End If
Set rs2 = Nothing
Else
' Hittar inget tidigare personnummer, gå vidare...
Response.Write("<h4>Du är inte tidigare anmäld</h4>")
End If
Set rs1 = Nothing
closeDB()
End If
I det fetstilta området ligger mitt problem (tror jag), där bör ju recset'et loopas igenom för att skriva ut alla tidigare anmälningar.
Min tabelluppbyggnad som är intressant för er kan tänkas vara:
Har ni något förslag på vettig lösning, kanske man kan slå ihop dessa frågor med en INNER JOIN ?
Har slut på idéer vad som kan vara fel.
Min DBMS är Access.
Else
' Tidigare bokning, lista gamla och gå vidare.
Response.Write("<h4>Du har tidigare gått i:<br>")
[B]rs2.MoveFirst[/B]
Do Until rs2.EOF
Response.Write("- " & rs2("gName") & " med start " & rs2("gStartDate") & "<br>")
rs2.MoveNext
Loop
Response.Write("</h4>")
End If
Det kan bero på:
Set rs2 = oConn.Execute(sSql)
[B]If Not rs2.EOF Then[/B]
' Hittar tidigare grupp, kolla om stängd eller ej.
Det enda som händer är att scriptet gör TimeOut, funkar alltså inte.
Jag vill ju med det här plocka fram alla grupper som är öppna där personen redan anmält sig.
Försökte mecka ihop en fråga med INNER JOIN som bör funka bra till det här, men det är något fel i frågan som jag inte lyckas lösa.
openDB("def")
sSql = "SELECT gName, gDayTime, gStartDate, gClosed, nPersNum " &_
"FROM tbl_sSchool_notifications sn INNER JOIN tbl_sSchool_groups sg " &_
"ON sn.gId = sg.gId " &_
"WHERE sn.nPersNum = '" & nPersNum & "' " &_
"AND sg.gGlosed = False"
' Response.Write("<p class=""frmText"">" & sSql & "</p>")
' Response.End
Set rs = oConn.Execute(sSql)
If Not rs.EOF Then
Response.Write("<h4>Du är redan anmäld till " & rs("gName") & " med start " & rs("gStartDate") & "</h4>")
Else
Response.Write("<h4>Du är inte tidigare anmäld</h4>")
End If
Set rs = Nothing
Men jag får:
Feltyp:
Microsoft JET Database Engine (0x80040E10)
Det har inte angetts något värde för en eller flera nödvändiga parametrar.
/sss/notification.asp, line 103
Rad 103 är alltså SQL-Frågan.
Några förslag?
Måste verkligen lösa det här, börjar brinna i knutarna.
Ahh, Do'h ;)
Kollade förut och när jag såg det fetstilta så antog jag att jag skulle byta ut det.
Tokigt...
Har skrivit om koden helt nu och kommit fram till följande:
openDB("def")
sSql = "SELECT nPersNum " &_
"FROM tbl_sSchool_notifications " &_
"WHERE nPersNum IN " &_
"(" &_
"SELECT nPersNum FROM tbl_sSchool_notifications sn " &_
"INNER JOIN tbl_sSchool_groups sg " &_
"ON sn.gId = sg.gId " &_
"WHERE sn.nPersNum = '" & nPersNum & "' AND sg.gClosed = FALSE" &_
")"
' Response.Write("<p class=""frmText"">" & sSql & "</p>")
' Response.End
Set rs = oConn.Execute(sSql)
If Not rs.EOF Then
Response.Write("<h4>Du är redan anmäld.</h4><br>")
Else
Response.Write("<h4>Tidigare grupper</h4><br>")
sql = "SELECT gName, gDayTime, gStartDate, nName, nPersNum " &_
"FROM tbl_sSchool_groups sg INNER JOIN tbl_sSchool_notifications sn " &_
"ON sg.gId = sn.gId " &_
"WHERE sn.nPersNum = '" & nPersNum & "'"
Set rs2 = oConn.Execute(sql)
If Not rs2.EOF Then
Do Until rs2.EOF
Response.Write(rs2("gName") & "<br>")
rs2.MoveNext
Loop
Else
Response.WRite("Du är inte anmäld sedan tidigare")
End If
Set rs2 = Nothing
End If
Set rs = Nothing
closeDB()
Har provkört fram och tillbaka nu och det verkar funka kanon.
Kanske är mitt gamla (ditt) ett bättre alternativ eller är koden ovan bättre rent prestandamässigt?
På måndag klockan åtta kommer det här nämligen öppnas och då kommer ca. 1000 besökare vilja anmäla sina ungar till vårens simskola så då måste allt funka klockrent.
Jag har ingen aning, men jag vet att MoveFirst är en vanlig metod... Inte lika vanlig som MoveNext, men jag tror inte att det tar mer på prestandan att använda sig av dem metoderna som finns tillgängliga.