Just nu i M3-nätverket
Gå till innehåll

Problem med checkbox i array


hanzi

Rekommendera Poster

Hej, försöker mig på att göra en array. Men jag får det här felmeddelandet hela tiden: "Microsoft VBScript runtime error '800a0009'

 

Subscript out of range: '0' "

 

Det är när jag kör datan från en Checkbox och om den inte är förbokad som jag får felmeddelandet. Bokar jag för checkboxen går det bra. Den väsentliga delen av koden ser ut så här:

<%

ID = Request.Form("ID")

box1 = Request.Form("box1")

box2 = Request.Form("box2")

 

arrID = Split(ID,", ")

arrbox1 = Split(box1,", ")

arrbox2 = Split(box2,", ")

 

For x = 0 To Ubound(arrID)

 

Set conn=server.CreateObject("adodb.connection")

 

updateSQL = "UPDATE exempel SET box1 = '"& arrbox1(x) &"',box2 = '"& arrbox2(x) WHERE ID = " & arrID(x) & ";"

 

Connud.Execute(updateSQL)

 

Next

 

%>

 

Jag skrev ut "<% Response.Write Ubound(arrbox1) %>" innan jag kör koden genom databasen och då får jag värde 0 när jag bockat för checkboxen och värdet -1 när den inte är förbokad. Har testa med Replace och liknande, men det fungerar inte.

 

Vad är felet? Känns som att det är busenkelt men jag finner det inte.

Länk till kommentar
Dela på andra webbplatser

Det är lite klippt och klistrat. I den ursprungliga koden har jag &"' det råkade bara bli lite för mycket suddat när jag la upp kodsträngen. Sen stämmer det med conn.Execute, så problemen kvarstår fortfarande. Om jag har bockat för båda checkboxen fungerar det, men om en eller båda inte är förbockade fungerar det inte.

 

 

 

Du har missat &"' efter arrbox2(x)

Connud.Execute(updateSQL) ska väl vara conn.Execute?

Länk till kommentar
Dela på andra webbplatser

Satt till efter midnatt och har suttit sen sju nu på morgonen så jag börjar bli lite trött. Men börjar det bli panik så är det som det är... ;)

 

Hur menar du att jag ska skriva ut UpdateSQL? Antar att du inte menar att jag ska hämta informationen utan att skriva ut det som UpdateSQL genererar, men det vet jag inte hur man gör.

 

Men på vilket sätt ändra det läget? Om båda checkboxarna är förbockade fungerar det. Då uppdateras databasen precis som jag vill. Men om en eller båda boxarna inte är förbockad fungerar det inte. För att se vilket värde som skickas in i databasen har jag skrivit en Response.Write Ubound(arrbox1) som generar värdet "0" när checkboxen är förkryssad och värdet "-1" när den inte är förkryssad. Antar att problemet ligger här någonstans. Har försökt att ta bort minustecknet med Replace men det går inte.

 

 

 

 

 

skriv ut updateSQL och kolla att du får värden som stämmer överens med datatyperna i databasen

Länk till kommentar
Dela på andra webbplatser

Hur menar du att jag ska skriva ut UpdateSQL? Antar att du inte menar att jag ska hämta informationen utan att skriva ut det som UpdateSQL genererar, men det vet jag inte hur man gör.

Typ:

<%
ID = Request.Form("ID")
box1 = Request.Form("box1")
box2 = Request.Form("box2")

arrID = Split(ID,", ")
arrbox1 = Split(box1,", ")
arrbox2 = Split(box2,", ")

Set conn = server.CreateObject("adodb.connection")

For x = lBound(arrID) To Ubound(arrID)

  updateSQL = "UPDATE exempel SET box1 = '"& arrbox1(x) &"',box2 = '"& arrbox2(x)&"' WHERE ID = " & arrID(x) & ";"

  Response.Write updateSQL & "<br>"

  conn.Execute(updateSQL)

Next

Set conn = Nothing
%>

 

Hur ser ditt formulär ut?

 

 

 

Länk till kommentar
Dela på andra webbplatser

om box1 och box2 är boolean i databasen måste värdet på arrbox(x) vara

t, true, y, yes 1

eller

f, false, n, no, 0

 

får du andra värden, ge nya variabler korrekta värden mha if-satser, och använd dem i updateSQL

Länk till kommentar
Dela på andra webbplatser

Formuläret ser ut så här:

 

<FORM METHOD=post ACTION="update.asp?action=uppdatera">

<INPUT TYPE=hidden NAME="ID" VALUE="<% =rs("ID") %>">

<INPUT TYPE=checkbox VALUE="1" NAME="box1" <% IF rs("box1") = "1" THEN %> CHECKED <% Else %><% End If %>>

<INPUT TYPE=checkbox VALUE="1" NAME="box2" <% IF rs("box2") = "1" THEN %> CHECKED <% Else %><% End If %>>

<INPUT TYPE=submit VALUE="Uppdatera">

</FORM>

 

 

 

Typ:

<%
ID = Request.Form("ID")
box1 = Request.Form("box1")
box2 = Request.Form("box2")

arrID = Split(ID,", ")
arrbox1 = Split(box1,", ")
arrbox2 = Split(box2,", ")

Set conn = server.CreateObject("adodb.connection")

For x = lBound(arrID) To Ubound(arrID)

  updateSQL = "UPDATE exempel SET box1 = '"& arrbox1(x) &"',box2 = '"& arrbox2(x)&"' WHERE ID = " & arrID(x) & ";"

  Response.Write updateSQL & "<br>"

  conn.Execute(updateSQL)

Next

Set conn = Nothing
%>

 

Hur ser ditt formulär ut?

Länk till kommentar
Dela på andra webbplatser

Jag har testat med att låta box1 och box2 vara både INT och VARCHAR i databasen, fungerar på samma sätt, dvs uppdateringen fungerar när båda är förbockade men fungerar ej om en eller båda kryssrutorna inte är förbockade.

 

 

 

 

om box1 och box2 är boolean i databasen måste värdet på arrbox(x) vara

t, true, y, yes 1

eller

f, false, n, no, 0

 

får du andra värden, ge nya variabler korrekta värden mha if-satser, och använd dem i updateSQL

Länk till kommentar
Dela på andra webbplatser

 

Jag skrev ut "<% Response.Write Ubound(arrbox1) %>" innan jag kör koden genom databasen och då får jag värde 0 när jag bockat för checkboxen och värdet -1 när den inte är förbokad. Har testa med Replace och liknande, men det fungerar inte.

 

 

om checkbox inte är ikryssad får du inget värde i boxarrayerna.

i for-loopen försöker du hämta värden från en adress som inte finns - array out of bounds.

 

x=0

ubound(arrbox1) = -1

arrbox1(x) - finns ej!

 

så det är egentligen redan här det börjar skita sig:

arrbox1 = Split(box1,", ")

Länk till kommentar
Dela på andra webbplatser

Formuläret ser ut så här [...]

Men om ditt formulär bara har ett ID och en Box1 och en Box2 så förstår jag inte varför du håller på med arrayer öht...blink.gif

 

 

 

Länk till kommentar
Dela på andra webbplatser

Jag gjorde en If-sats som du tipsade om och då fungerar det. Men det känns som att det egentligen finns en annan lösning som innebär mindre kod, men så länge det fungerar så är det ju bra. ;)

 

Tack för hjälpen!

 

 

om checkbox inte är ikryssad får du inget värde i boxarrayerna.

i for-loopen försöker du hämta värden från en adress som inte finns - array out of bounds.

 

x=0

ubound(arrbox1) = -1

arrbox(x) - finns ej!

 

så det är egentligen redan här det börjar skita sig:

arrbox1 = Split(box1,", ")

Länk till kommentar
Dela på andra webbplatser

Det är avskalat så att jag bara presenterar den väsentligaste koden.

;)

 

Men om ditt formulär bara har ett ID och en Box1 och en Box2 så förstår jag inte varför du håller på med arrayer öht...blink.gif

Länk till kommentar
Dela på andra webbplatser

Det är avskalat så att jag bara presenterar den väsentligaste koden.

;)

Ok... det känns dock som att du skalat bort så mycket att det är svårt att se vidden av din problemställning eller ha möjlighet att komma med en bättre lösning. :)

 

Det som du måste inse är att indexet för arrbox1 och arrbox2 helt skiljer sig från indexet för arrID. Så när du stegar igenom arrID blir det rimligtvis en tankevurpa att använda indexet (räknaren x i din kod) från den för att hitta rätt värde i arrbox1 och arrbox2.

 

 

 

Länk till kommentar
Dela på andra webbplatser

Nu fungerar det inte.

 

Anledningen till att jag använder array är att jag vill uppdatera flera rader samtidigt i databasen. Varje rad innehåller ett antal textrutor, tre stycken Checkbox och två stycken Select option. Textrutorna och Select Option är inga problem, men checkboxarna ställer till det hela tiden. Kör jag updateSQL satsen utan den data som checkboxarna innehåller fungerar det helt perfekt.

 

Det här är inte den riktiga koden, men principen är densamma:

 

Formuläret:

<FORM METHOD=post ACTION=update.asp>
<%
Do until rs.EOF
%>
<INPUT TYPE=hidden VALUE="<% =rs("ID") %>" NAME="ID">
<INPUT TYPE=text VALUE="<% =rs("bilmarke") %>" NAME="bilmarke" SIZE=15>
<INPUT TYPE=text VALUE="<% =rs("bilmodell") %>" NAME="bilmodell" SIZE=15>
<INPUT TYPE=text VALUE="<% =rs("bilaffar") %>" NAME="bilaffar" SIZE=15>
<INPUT TYPE=text VALUE="<% =rs("kontaktperson") %>" NAME="kontaktperson" SIZE=15>
<INPUT TYPE=checkbox VALUE="1" NAME="box1">
<SELECT NAME="fargval">
<OPTION VALUE="0">Välj färg
<OPTION VALUE="1">Röd
<OPTION VALUE="2">Blå
<OPTION VALUE="3">Grön
</SELECT>
<INPUT TYPE=checkbox VALUE="1" NAME="box2">
<INPUT TYPE=checkbox VALUE="1" NAME="box3">
<SELECT NAME="status">
<OPTION VALUE="0">Välj status
<OPTION VALUE="1">Publicera
<OPTION VALUE="2">Arkivera
<OPTION VALUE="3">Klar för publicering
</SELECT>
<%
rs.MoveNext
Loop
%>
<INPUT TYPE=submit>
</FORM>

Bekymrar er inte om sambanden mellan de olika formulärtyperna, jag vill bara illustrera formuläret så realistiskt som möjligt. Anledningen till att Formuläret startas och slutas utanför Loop-slingan är för att själva poängen är att flera rader ur databasen ska uppdateras samtidigt.

 

 

Uppdateringsfunktionen så:

<%
ID = Request.Form("ID")
bilmarke = Request.Form("bilmarke")
bilmodell = Request.Form("bilmodell")
bilaffar = Request.Form("bilaffar")
kontaktperson = Request.Form("kontaktperson")
box1 = Reqeust.Form("box1")
fargval = Request.Form("fargval")
box2 = Reqeust.Form("box2")
box3 = Reqeust.Form("box3")
status = Request.Form("status")


arrID = Split(ID,", ")
arrbilmarke = Split(bilmarke,", ")
arrbilmodell = Split(bilmodell,", ")
arrbilaffar = Split(bilaffar,", ")
arrkontaktperson = Split(kontaktperson,", ")
arrbox1 = Split(box1,", ")
arrfargval = Split(fargval,", ")
arrbox2 = Split(box2,", ")
arrbox3 = Split(box3,", ")
arrstatus = Split(status,", ")


For x = 0 To Ubound(arrID)
If arrbox1(x) = "1" THEN
Else
arrbox1(x) = "0"
End If

If arrbox2(x) = "1" THEN
Else
arrbox2(x) = "0"
End If

If arrbox3(x) = "1" THEN
Else
arrbox3(x) = "0"
End If
Set Conn = Server.CreateObject("ADODB.Connection")
updateSQL = "UPDATE exempel SET bilmarke = '"& arrbilmarke(x) &"',bilmodell = '"& arrbilmodell(x) &"',bilaffar = '"& arrbilaffar(x) &"',kontaktperson = '"& arrkontaktperson(x) &"',fargval = '"& arrfargval(x) &"',box1 = '"& arrbox1(x) &"',box2 = '"& arrbox2(x) &"', box3 = '"& arrbox3(x) &"', status = '"& arrstatus(x) &"' WHERE ID = " & arrID(x) & ";"
Conn.Execute(updateSQL)

Next
%>

Jag ser ju själv att det blir problem med If-satserna när jag sen kör allt i en array, ska de sitta någon annanstans?

 

Tacksam för skyndsam hjälp!

 

 

 

 

 

 

Ok... det känns dock som att du skalat bort så mycket att det är svårt att se vidden av din problemställning eller ha möjlighet att komma med en bättre lösning. :)

 

Det som du måste inse är att indexet för arrbox1 och arrbox2 helt skiljer sig från indexet för arrID. Så när du stegar igenom arrID blir det rimligtvis en tankevurpa att använda indexet (räknaren x i din kod) från den för att hitta rätt värde i arrbox1 och arrbox2.

Länk till kommentar
Dela på andra webbplatser

Du får bara ut värden från checkboxar som är ikryssade så du får bara en array med 1,1,1,1,1,1,1,1 och kan inte urskilja vilka som hör till vad.

Jag kan komma på två möjliga lösningar, båda jobbiga.

 

Antingen genererar du check-box namnen (alt. checkbox value..) så alla blir unika:

box-1-1

box-1-2

box-2-1

...

box-n-1

box-n-2

 

Annars skapar har du en (eller en för varje box) hidden input som du ger "rätt" värde innan du submitar.

Ett javascript som går igenom samtliga checkboxar och genererar en sträng "0, 1, 0, 1, 1..."

Länk till kommentar
Dela på andra webbplatser

Det var detta problem jag syftade på i tidigare inlägg, dvs. att det saknas inbördes koppling mellan fälten.

[...]

Jag kan komma på två möjliga lösningar, båda jobbiga.

 

Antingen genererar du check-box namnen (alt. checkbox value..) så alla blir unika:

box-1-1

box-1-2

box-2-1

[...]

Här ett enkelt exempel på hur du kan göra det som i3o6 ger som första alternativ:

<%
SET conn = Server.CreateObject("ADODB.Connection")
conn.open "DRIVER=SQL Server; SERVER="&strSQLSrvAdr&"; DATABASE="&strDBName&"; UID="&strDBUserName&"; PWD="&strDBPassword&";"

If lCase(Trim(Request("action")&" "))="uppdatera" Then

  arrId = Split(Trim(Request("id")&" "),",")

  If isArray(arrId) Then

     For i=lBound(arrId) To uBound(arrId)

        strId = Trim(arrId(i)&" ")
        strBox1 = Trim(Request("box1_"& strId)&" ")
        strBox2 = Trim(Request("box2_"& strId)&" ")
        strBilmarke = Trim(Request("bilmarke_"& strId)&" ")
        If strBox1<>"1" Then strBox1="0" End If
        If strBox2<>"1" Then strBox2="0" End If

        strSQL = "UPDATE exempel SET bilmarke='"&strBilmarke&"', box1="& strBox1 &", box2="& strBox2 &" WHERE id=" & strId
        conn.execute(strSQL)

        strMessage = "Uppdateringar genomförda!"
     Next
  Else
     strMessage = "Inga uppdateringar genomfördes!"
  End If

End If
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>332140 - Problem med checkbox i array | Eforum</title>
</head>

<body>
  <h2><a href="//eforum.idg.se/topic/332140-problem-med-checkbox-i-array">332140 - Problem med checkbox i array</a></h2>

  <form method="post" action="?action=uppdatera">
     <% 
     SET objRS = conn.execute("SELECT id, bilmarke, box1, box2 FROM exempel")

     If Not objRS.EOF Then
        Do Until objRS.EOF
        intId = objRS("id")
        strBilmarke = objRS("bilmarke")
        If objRS("box1")=True Then strSelBox1 = " CHECKED" Else strSelBox1 = "" End If
        If objRS("box2")=True Then strSelBox2 = " CHECKED" Else strSelBox2 = "" End If
     %>
     <fieldset>
        <legend>Fordon <%=intId%></legend>
        <p>Bilmärke: <input name="bilmarke_<%=intId%>" value="<%=strBilmarke%>"></p>
        <p>
           Box1: <input type="checkbox" value="1" name="box1_<%=intId%>"<%=strSelBox1%>> 
             
           Box2: <input type="checkbox" value="1" name="box2_<%=intId%>"<%=strSelBox2%>>
        </p>
        <input type="hidden" name="id" value="<%=intId%>">
     </fieldset>
     <% 
           objRS.MoveNext
        Loop
     End If
     SET objRS = Nothing
     %>
     <p><input type="submit" value="Uppdatera">   <%=strMessage%></p>
  </form>

</body>
</html>
<% 
conn.close
SET conn = Nothing
%>

 

 

 

 

Länk till kommentar
Dela på andra webbplatser

Tack för hjälpen. Nu är den här kvällen räddad också. ;)

 

Förstår inte varför det ska vara sån skillnad på checkbox och de övriga funktionerna i ett formulär. Den klarar ju av att hålla isär när det kommer från textformulär eller select option. Vad i funktionen checkbox är det som gör att det inte går?

 

Jag kommer testa i3o6´s första alternativ och fungerar inte det som jag tänkt mig får det bli en uppdatering för varje rad. Det kan dock bli omständigt för användaren då det kan bli upp till hundra rader att hantera.

 

 

 

Det var detta problem jag syftade på i tidigare inlägg, dvs. att det saknas inbördes koppling mellan fälten.

 

Här ett enkelt exempel på hur du kan göra det som i3o6 ger som första alternativ:

<%
SET conn = Server.CreateObject("ADODB.Connection")
conn.open "DRIVER=SQL Server; SERVER="&strSQLSrvAdr&"; DATABASE="&strDBName&"; UID="&strDBUserName&"; PWD="&strDBPassword&";"

If lCase(Trim(Request("action")&" "))="uppdatera" Then

  arrId = Split(Trim(Request("id")&" "),",")

  If isArray(arrId) Then

     For i=lBound(arrId) To uBound(arrId)

        strId = Trim(arrId(i)&" ")
        strBox1 = Trim(Request("box1_"& strId)&" ")
        strBox2 = Trim(Request("box2_"& strId)&" ")
        strBilmarke = Trim(Request("bilmarke_"& strId)&" ")
        If strBox1<>"1" Then strBox1="0" End If
        If strBox2<>"1" Then strBox2="0" End If

        strSQL = "UPDATE exempel SET bilmarke='"&strBilmarke&"', box1="& strBox1 &", box2="& strBox2 &" WHERE id=" & strId
        conn.execute(strSQL)

        strMessage = "Uppdateringar genomförda!"
     Next
  Else
     strMessage = "Inga uppdateringar genomfördes!"
  End If

End If
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>332140 - Problem med checkbox i array | Eforum</title>
</head>

<body>
  <h2><a href="//eforum.idg.se/topic/332140-problem-med-checkbox-i-array">332140 - Problem med checkbox i array</a></h2>

  <form method="post" action="?action=uppdatera">
     <% 
     SET objRS = conn.execute("SELECT id, bilmarke, box1, box2 FROM exempel")

     If Not objRS.EOF Then
        Do Until objRS.EOF
        intId = objRS("id")
        strBilmarke = objRS("bilmarke")
        If objRS("box1")=True Then strSelBox1 = " CHECKED" Else strSelBox1 = "" End If
        If objRS("box2")=True Then strSelBox2 = " CHECKED" Else strSelBox2 = "" End If
     %>
     <fieldset>
        <legend>Fordon <%=intId%></legend>
        <p>Bilmärke: <input name="bilmarke_<%=intId%>" value="<%=strBilmarke%>"></p>
        <p>
           Box1: <input type="checkbox" value="1" name="box1_<%=intId%>"<%=strSelBox1%>> 
             
           Box2: <input type="checkbox" value="1" name="box2_<%=intId%>"<%=strSelBox2%>>
        </p>
        <input type="hidden" name="id" value="<%=intId%>">
     </fieldset>
     <% 
           objRS.MoveNext
        Loop
     End If
     SET objRS = Nothing
     %>
     <p><input type="submit" value="Uppdatera">   <%=strMessage%></p>
  </form>

</body>
</html>
<% 
conn.close
SET conn = Nothing
%>

Länk till kommentar
Dela på andra webbplatser

jo för att checkbox inte returnerar angivet värdet om boxen inte är ikryssad. Inte svårare än så.

Länk till kommentar
Dela på andra webbplatser

Klar, fungerade nästan på en gång! Tack för hjälpen Cluster, i3o6 och Jonas B!

 

 

 

Tack för hjälpen. Nu är den här kvällen räddad också. ;)

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...