08. august 2003 - 15:41Der er
44 kommentarer og 1 løsning
randomize - noget er helt galt her
Jeg har lavet følgende script:
GameID = 1 NotSeeded = ((Cint(NumberOfTeams) - Cint(NumberOfSeedings)) / 2) For s = 1 To Cint(NotSeeded) Randomize SQL_MATCHES = "SELECT TOP 2 * FROM klaner WHERE seeding = 0 AND c_gmid = 0" Set rsMatches = conntemp.execute(SQL_MATCHES)
Teams = 1 Do While Not rsMatches.EOF If Cint(Teams) = 1 Then SQL_CREATE_MATCHES = "INSERT INTO kampe (stid, hold1, h1cnid) "&_ "VALUES (1, '"& rsMatches("navn") &"', '"& Cint(rsMatches("cnid")) &"')" Set rsCreateMatches = conntemp.execute(SQL_CREATE_MATCHES)
SQL_UPDATE_HOLD1 = "UPDATE klaner "&_ "SET c_stid = 1 AND c_gmid = "& Cint(GameID) &" WHERE cnid = "& Cint(rsMatches("cnid")) conntemp.execute(SQL_UPDATE_HOLD1) ElseIf Cint(Teams) = 2 Then SQL_UPDATE_MATCHES = "UPDATE kampe "&_ "SET hold2 = '"& rsMatches("navn") &"' AND h2cnid = "& Cint(rsMatches("cnid")) Set rsUpdateMatches = conntemp.execute(SQL_UPDATE_MATCHES)
SQL_UPDATE_HOLD2 = "UPDATE klaner "&_ "SET c_stid = 1 AND c_gmid = "& Cint(GameID) &" WHERE cnid = "& Cint(rsMatches("cnid")) conntemp.execute(SQL_UPDATE_HOLD2) End If Teams = Teams + 1 rsMatches.MoveNext Loop GameID = GameID + 1 Next Response.Redirect "?"
Der der er meningen med scriptet er, at den skal vælge 2 tilfældige klaner fra db'en og lave en kamp imellem de 2 klaner og det skal den gøre alt efter hvor mange hold der er tilmeldt og hvor mange seedede hold der er.
I dette tilfælde er det følgende: hold tilmeldt: 32 hold seedede: 4
dvs. at den skal finde 28 hold(par vist) og lave 14 kampe.
Problemet er at ikke kører hele scriptet igennem (der er tilsyneladende nogle fejl), men jeg har siddet med det her script i jeg ved ikke hvor lang tid og har prøvet 54 forskellige måder, men den gør det samme hvergang.
Hvis jeg kører scriptet sådan som det er der, kommer tabellen "kampe" til at se sådan ud:
Håber at det er til at se, men det næsten tydeligt at se, at den kun udfylder felterne til den første klan og der bliver jo ikke ret meget kamp ud af det, med kun 1 klan i hver kamp. Det kan også ses at den vælger den samme klan hvergang (klan4), hvilket ikke burde være muligt, så der må være et eller andet fuldstændigt galt. Tabellen "klaner" bliver heller ikke opdateret, hvilket den også skulle gøre.
Håber i kan finde rundt i det ellers bare spørg løs!
Du er nød til at lave et script der kan hendte 2 random poster ud fra DB'en som ikke er ens, det er ikke nok bare at skrive randomize.
Jeg har lavet et script som dettte som kan hendte X tilfældige ud, så i stedet for dette:
Randomize SQL_MATCHES = "SELECT TOP 2 * FROM klaner WHERE seeding = 0 AND c_gmid = 0" Set rsMatches = conntemp.execute(SQL_MATCHES)
Prøv at sætte dette ind, det ser lidt vildt ud, men det skulle være jo være to helt tilfældige og ikke ens.:
antalRandom = 2 Set rs = Server.CreateObject("ADODB.Recordset") Rs.Open "SELECT * FROM klaner WHERE seeding = 0 AND c_gmid = 0", conntemp,1,3 inDB = rs.RecordCount If inDB > antalRandom then Randomize timer newId = Int (rnd*inDB) strIndex = "," & newid & "," indexFound = 1 Do while indexFound < antalRandom Do Newid = Int (rnd*inDB) Loop while inStr(strIndex,"," & newid & ",") > 0 strIndex = strIndex & newid & "," indexFound = indexFound + 1 Loop strIndex = mid (strIndex,2,len(strIndex)-2) strHoldID = "" For i = Lbound(myArr) to Ubound(myArr) rs.move myArr(i),1 strHoldID = "," & rs("cnid") next strHoldID = Mid(strHoldID,2) end if Rs.Close SQL_MATCHES = "SELECT * FROM klaner WHERE cnid IN (" & strHoldID & ")" Set rsMatches = conntemp.execute(SQL_MATCHES)
GameID = 1 NotSeeded = ((Cint(NumberOfTeams) - Cint(NumberOfSeedings)) / 2) For s = 1 To Cint(NotSeeded) antalRandom = 2 Set rs = Server.CreateObject("ADODB.Recordset") Rs.Open "SELECT * FROM klaner WHERE seeding = 0 AND c_gmid = 0", conntemp,1,3 inDB = rs.RecordCount If inDB > antalRandom then Randomize timer newId = Int (rnd*inDB) strIndex = "," & newid & "," indexFound = 1 Do while indexFound < antalRandom Do Newid = Int (rnd*inDB) Loop while inStr(strIndex,"," & newid & ",") > 0 strIndex = strIndex & newid & "," indexFound = indexFound + 1 Loop strIndex = mid (strIndex,2,len(strIndex)-2) strHoldID = "" For i = Lbound(myArr) to Ubound(myArr) rs.move myArr(i),1 strHoldID = "," & rs("cnid") next strHoldID = Mid(strHoldID,2) end if Rs.Close SQL_MATCHES = "SELECT * FROM klaner WHERE cnid IN (" & strHoldID & ")" Set rsMatches = conntemp.execute(SQL_MATCHES)
Teams = 1 Do While Not rsMatches.EOF If Cint(Teams) = 1 Then SQL_CREATE_MATCHES = "INSERT INTO kampe (stid, hold1, h1cnid) "&_ "VALUES (1, '"& rsMatches("navn") &"', '"& Cint(rsMatches("cnid")) &"')" Set rsCreateMatches = conntemp.execute(SQL_CREATE_MATCHES)
SQL_UPDATE_HOLD1 = "UPDATE klaner "&_ "SET c_stid = 1 AND c_gmid = "& Cint(GameID) &" WHERE cnid = "& Cint(rsMatches("cnid")) conntemp.execute(SQL_UPDATE_HOLD1) ElseIf Cint(Teams) = 2 Then SQL_UPDATE_MATCHES = "UPDATE kampe "&_ "SET hold2 = '"& rsMatches("navn") &"' AND h2cnid = "& Cint(rsMatches("cnid")) Set rsUpdateMatches = conntemp.execute(SQL_UPDATE_MATCHES)
SQL_UPDATE_HOLD2 = "UPDATE klaner "&_ "SET c_stid = 1 AND c_gmid = "& Cint(GameID) &" WHERE cnid = "& Cint(rsMatches("cnid")) conntemp.execute(SQL_UPDATE_HOLD2) End If Teams = Teams + 1 rsMatches.MoveNext Loop GameID = GameID + 1 Next Response.Redirect "?"
Hvis er rigtigt sat sammen, så for jeg følgende fejl:
okay, nu henter den da forskellige klaner...sådan da, men der er stadig ikke noget af det andet der virker, altså den sætter kun den første klan ind i hver kamp osv.
du kan overveje at prøve at lave det om til en SQL som opdater i setdet for med 3-4 SQL sætning så dette:
Do While Not rsMatches.EOF If Cint(Teams) = 1 Then SQL_CREATE_MATCHES = "INSERT INTO kampe (stid, hold1, h1cnid) "&_ "VALUES (1, '"& rsMatches("navn") &"', '"& Cint(rsMatches("cnid")) &"')" Set rsCreateMatches = conntemp.execute(SQL_CREATE_MATCHES)
SQL_UPDATE_HOLD1 = "UPDATE klaner "&_ "SET c_stid = 1 AND c_gmid = "& Cint(GameID) &" WHERE cnid = "& Cint(rsMatches("cnid")) conntemp.execute(SQL_UPDATE_HOLD1) ElseIf Cint(Teams) = 2 Then SQL_UPDATE_MATCHES = "UPDATE kampe "&_ "SET hold2 = '"& rsMatches("navn") &"' AND h2cnid = "& Cint(rsMatches("cnid")) Set rsUpdateMatches = conntemp.execute(SQL_UPDATE_MATCHES)
SQL_UPDATE_HOLD2 = "UPDATE klaner "&_ "SET c_stid = 1 AND c_gmid = "& Cint(GameID) &" WHERE cnid = "& Cint(rsMatches("cnid")) conntemp.execute(SQL_UPDATE_HOLD2) End If Teams = Teams + 1 rsMatches.MoveNext Loop GameID = GameID + 1
Bliver til:
Do While Not rsMatches.EOF SQL_CREATE_MATCHES = "INSERT INTO kampe (stid, hold1, h1cnid, c_stid, c_gmid, hold2,h2cnid) "&_ "VALUES (1, '"& rsMatches("navn") &"', '"& Cint(rsMatches("cnid")&"'"&_ "1, " & Cint(GameID) &","
Det du har skrevet 08/08-2003 19:45:21 vil jo slet ikke virke, for c_stid og c_gmid findes slet ikke i kampe tabellen, men til gengæld i tabellen klaner.
Der er det hele rettet, så det skulle virke, men der kommer den med en fejl i SQL_CREATE_MATCHES = SQL_CREATE_MATCHES & "'"& rsMatches("navn") &"', '"& Cint(rsMatches("cnid")) &"')"
Ville det ikke være nemmere hvis det kunne komme til at virke ??
antalRandom = 2 Set rs = Server.CreateObject("ADODB.Recordset") Rs.Open "SELECT * FROM klaner WHERE seeding = 0 AND c_gmid = 0", conntemp,1,3 inDB = rs.RecordCount If inDB > antalRandom then Randomize timer newId = Int(rnd * inDB) strIndex = ","& newid &"," indexFound = 1 Do while indexFound < antalRandom Do Newid = Int(rnd * inDB) Loop while inStr(strIndex,","& newid &",") > 0 strIndex = strIndex & newid &"," indexFound = indexFound + 1 Loop strIndex = mid (strIndex,2,len(strIndex)-2) myArr=split(strIndex,",",-1) strHoldID = "" For i = Lbound(myArr) to Ubound(myArr) rs.move myArr(i),1 strHoldID = ","& rs("cnid") next strHoldID = Mid(strHoldID, 2) end if Rs.Close SQL_MATCHES = "SELECT * FROM klaner WHERE cnid IN ("& strHoldID &")" Set rsMatches = conntemp.execute(SQL_MATCHES)
Prøv at ændre dette så den udskriver den SQL sætning som skal finde de to hold:
SQL_MATCHES = "SELECT * FROM klaner WHERE cnid IN ("& strHoldID &")" Set rsMatches = conntemp.execute(SQL_MATCHES)
Til dette:
SQL_MATCHES = "SELECT * FROM klaner WHERE cnid IN ("& strHoldID &")" Response.write SQL_MATCHES Response.end Set rsMatches = conntemp.execute(SQL_MATCHES)
Ok, jeg har også hørt fra en anden at han ikke kunne komme på eksperten omkring samme tid som den kommentar jeg lavede så den har nok været lidt ustabil :)
Så den finder altså 2 klaner. Så virker det lidt underlidt at den kommer med den fejl og dog... For den er vel ikke EOF når man trækker det andet hold ud. Prøv lige at rsMatches.MoveNext efter disse to linjker:
Jeg tror der er noget jeg har regnet forkert, for den skriver 2 af kampen mellem klan25 og klan29 og der bliver ikke skrevet noget ved klan16 eller klan18, så den kamp skulle jo have været der istedet for en af de kampe mellem klan25 og klan29.
antalRandom = 2 Set rs = Server.CreateObject("ADODB.Recordset") Rs.Open "SELECT * FROM klaner WHERE seeding = 0 AND c_gmid = 0", conntemp,1,3 inDB = rs.RecordCount If inDB > antalRandom then Randomize timer newId = Int (rnd*inDB) strIndex = "," & newid & "," indexFound = 1 Do while indexFound < antalRandom Do Newid = Int (rnd*inDB) Loop while inStr(strIndex,"," & newid & ",") > 0 strIndex = strIndex & newid & "," indexFound = indexFound + 1 Loop strIndex = mid (strIndex,2,len(strIndex)-2) strHoldID = "" For i = Lbound(myArr) to Ubound(myArr) rs.move myArr(i),1 strHoldID = "," & rs("cnid") next strHoldID = Mid(strHoldID,2) end if
Til dette så den husker de før valgte ids:
antalRandom = 2 Set rs = Server.CreateObject("ADODB.Recordset") if oldIDs = "" then SQL = "SELECT * FROM klaner WHERE seeding = 0 AND c_gmid = 0" else SQL = "SELECT * FROM klaner WHERE seeding = 0 AND c_gmid = 0 AND cnid not in(" & oldIDs & ")" end if Rs.Open SQL, conntemp,1,3 inDB = rs.RecordCount If inDB > antalRandom then Randomize timer newId = Int (rnd*inDB) strIndex = "," & newid & "," indexFound = 1 Do while indexFound < antalRandom Do Newid = Int (rnd*inDB) Loop while inStr(strIndex,"," & newid & ",") > 0 strIndex = strIndex & newid & "," indexFound = indexFound + 1 Loop strIndex = mid (strIndex,2,len(strIndex)-2) strHoldID = "" For i = Lbound(myArr) to Ubound(myArr) rs.move myArr(i),1 strHoldID = "," & rs("cnid") next strHoldID = Mid(strHoldID,2) if oldIDs <> "" then oldIDs = oldIDs & "," oldIDs = oldIDs & strHoldID end if
Du skal have mange tak for din hjælp og mange tak fordi du gad at bruge så meget tid på at hjælpe mig :)
Du har ihvertfald fortjent de point.
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.