webForumDet fria alternativet

Uppdatara kryssrutor kopplade till olika ID?

ASP

25 svar · 349 visningar · startad av Mattias

Medlem sedan mars 2000205 inlägg
Frågan#1

Jag har en sida där jag har ett antal rader med kryssrutor som var och en symboliserar om en stuga är bokad en viss vecka. Varje rad av kryssrutor är "kopplad" till respektive rads/stugas ID-nummer.

Sidans syfte är att man ska kunna uppdatera dessa kryssrutor genom att föra in kryssrutevärdena rad efter rad till databasen. Jag skickar alltså vidare värdena i formuläret till en dataupptagarsida. Det är här problemet uppkommer.

Hur gör jag för att rad efter rad:s kryssrutor ska läggas in i databasen vid respektive ID-nummer? Koden jag skrivit nu (på upptagarsidan) funkar inte, men jag lägger in den ändå så att ni kan se den nuvarande koden. Är medveten om att den/jag kan vara helt åt h-e, men jag är inget ASP-geni precis. ;) Jag får inget felmeddelande utan hamnar på upptagarsidan, men fälten i DBn uppdateras inte.

<%
stugID = Request.Form("stugID")

v23 = Request.Form("v23")
v24 = Request.Form("v24")
v25 = Request.Form("v25")
v26 = Request.Form("v26")
v27 = Request.Form("v27")
v28 = Request.Form("v28")
v29 = Request.Form("v29")
v30 = Request.Form("v30")
v31 = Request.Form("v31")
v32 = Request.Form("v32")
v33 = Request.Form("v33")
v34 = Request.Form("v34")
v35 = Request.Form("v35")

Set Connection = Server.CreateObject("ADODB.Connection")
cnpath="DBQ=" & server.mappath("\mapp\databas.mdb")
connection.open "DRIVER={Microsoft Access Driver (*.mdb)}; " & cnpath

SQL = "UPDATE tblStuginfo_1 SET StugID = '" & stugID & "', v23 = '" & v23 & "', v24 = '" & v24 & "', v25 = '" & v25 & "', v26 = '" & v26 & "', v27 = '" & v27 & "', v28 = '" & v28 & "', v29 = '" & v29 & "', v30 = '" & v30 & "', v31 = '" & v31 & "', v32 = '" & v32 & "', v33 = '" & v33 & "', v34 = '" & v34 & "', v35 = '" & v35 & "' WHERE tblStuginfo_1.stugID = '" & stugID &"'"

Connection.Execute(SQL)
Connection.Close	
%>

Problemet med den nuvarande koden är väl att den bara lägger in den första radens (ID-numrets) kryssrutor? Hur gör jag alltså så att varje rads kryssrutevärden ska föras in i DBn? Lite svårt att förklara, men jag hoppas ni greppar ungefär hur jag menar.

------------------

// Mattias

[Redigerat av Mattias den 25 sep 2001]

Medlem sedan dec. 19996 721 inlägg
#2

Sätt datatypen för v23 m.fl. till ja/nej (bit), checkboxarnas VALUE till "1" och byt raderna med

v23 = Request.Form("v23")

till

v23 = len(Request.Form("v23"))

Ta sedan bort enkelfnuttarna runt veckovärdena i SQL-satsen. Jag antar att StugID är av texttyp. Annars ska enkelfnuttarna bort där också.

------------------
/emission
If you see someone without a smiley, give them your colon.

Medlem sedan mars 2000205 inlägg
#3

Tack för svaret, men informationen vill fortfarande inte läggas in i DBn. Kryssrutornas kod (på formulärsidan) ser ut så här:

<input type="checkbox" name="v35" value="1" <% If RS("v35") = true Then %> CHECKED <% End If %>>

Jag har inget problem att här infoga kryssrutornas värde från DBn till formulärets kryssrutor via ovanstående kod. Men vid uppdatering av forumläret hamnar jag alltså fortfarande på dataupptagningssidan utan att uppdaterade fält läggs in i DBn. Så här ser den relevanta koden på upptagarsidan ut nu:

<%
stugID = Request.Form("stugID")

v23 = len(Request.Form("v23"))
v24 = len(Request.Form("v24"))
v25 = len(Request.Form("v25"))
v26 = len(Request.Form("v26"))
v27 = len(Request.Form("v27"))
v28 = len(Request.Form("v28"))
v29 = len(Request.Form("v29"))
v30 = len(Request.Form("v30"))
v31 = len(Request.Form("v31"))
v32 = len(Request.Form("v32"))
v33 = len(Request.Form("v33"))
v34 = len(Request.Form("v34"))
v35 = len(Request.Form("v35"))

Set Connection = Server.CreateObject("ADODB.Connection")
cnpath="DBQ=" & server.mappath("\mapp\databas.mdb")
connection.open "DRIVER={Microsoft Access Driver (*.mdb)}; " & cnpath

SQL = "UPDATE tblStuginfo_1 SET StugID = '" & stugID & "', v23 = " & v23 & ", v24 = " & v24 & ", v25 = " & v25 & ", v26 = " & v26 & ", v27 = " & v27 & ", v28 = " & v28 & ", v29 = " & v29 & ", v30 = " & v30 & ", v31 = " & v31 & ", v32 = " & v32 & ", v33 = " & v33 & ", v34 = " & v34 & ", v35 = " & v35 & " WHERE tblStuginfo_1.stugID = '" & stugID &"'"

Connection.Execute(SQL)
Connection.Close	
%>

Vad gäller stugID-numret så är de av typen X-123, dvs texttyp. Ser du/ni något annat fel i ovanstående upptagningskod?

------------------

// Mattias

Medlem sedan dec. 19996 721 inlägg
#4

Skriv ut SQL-satsen som skapas, så tar vi en titt på den.

Onödigt att sätta StugID i UPDAT-satsen. Den ska ju vara samma som förut.

------------------
/emission
If you see someone without a smiley, give them your colon.

Medlem sedan mars 2000205 inlägg
#5

Här är SQL-satsen som skrivs ut:


UPDATE tblStuginfo_1 SET v23 = 4, v24 = 10, v25 = 10, v26 = 4, v27 = 4, v28 = 13, v29 = 4, v30 = 4, v31 = 4, v32 = 7, v33 = 1, v34 = 1, v35 = 4 WHERE tblStuginfo_1.stugID = ''

------------------

// Mattias

Medlem sedan feb. 20012 412 inlägg
#6

Hej!

Varibeln stugID är tom. Du jämför tblStuginfo_1.stugID med ingenting.

------------------
MVH Jörgen :)

Medlem sedan mars 2000205 inlägg
#7

Jo, det ser jag nu, men hur går jag tillväga för att infoga respektive stugas (stugID:s) bokningar (kryssrutor) i DBn? Såvitt jag kan se så skickas även stugID:t vidare från formuläret. Här är ASP-koden från formulärsidan som fångar upp stugor från ett visst område och presenterar dem och dess bokningar så att användaren kan klicka in nya bokningar och ta bort gamla:

<%
kategori = request.form("kategori")

Set Connection = Server.CreateObject("ADODB.Connection")
cnpath="DBQ=" & server.mappath("\mapp\databas.mdb")
connection.open "DRIVER={Microsoft Access Driver (*.mdb)}; " & cnpath

SQL = "SELECT * FROM tblStuginfo_1 WHERE Kategori = '" & kategori & "'"

set RS = Connection.Execute(SQL)
%>
 <form method="POST" action="bokning.asp">

...

<%
' --- Efter fem rader läggs rubrikerna (veckonumerna) in så att det blir lättare att läsa när det är många poster

WHILE NOT RS.EOF

FOR i = 1 to 5

' --- Byter färg på bakgrunden i varannan tabellrad

counter = counter + 1
If counter Mod 2 = 0 then
   color = "FFFFFF"
Else
   color = "#F1F1F1"
End If

%>
' --- Stug-ID läggs längst till vänster i tabellen
<%= RS("StugID") %>

' --- Så här ser varje cell med kryssruta ut:

 <td width="38" align="center" valign="middle" height="25" bgcolor="<% =color %>">
    <input type="checkbox" name="v23" value="1" <% If RS("v23") = true Then %> CHECKED <% End If %>

<%

RS.MoveNext

IF RS.EOF THEN EXIT FOR

NEXT
%>

...

<%
WEND
%>
...
 <input type="submit" value="Uppdatera bokning" name="B1">
...

<%
RS.close
SET RS = NOTHING
connection.close
%>

------------------

// Mattias

Medlem sedan dec. 19996 721 inlägg
#8

Du måste ha med StugID i formuläret, typiskt i ett hidden-fält.

Medlem sedan mars 2000205 inlägg
#9

Men StugID finns ju i formuläret nu. Titta i mitten av koden jag lade in så ser du <%= RS("StugID") %>. Eller hur menar du?

------------------

// Mattias

Medlem sedan dec. 200012 464 inlägg
#10

Det finns inget fält som heter stugid

<input type='HIDDEN' name='stugID' value='<%=rs("stugID")%>'>

------------------
essentitia preter non sans multiplicandum

Medlem sedan mars 2000205 inlägg
#11

Aha, NU är jag med. :) Har lagt till ett hiddenfält som skickar vidare StugID till nästa sida, men vid uppdateringen så får jag dock felmeddelandet:

Error Type:
Microsoft VBScript runtime (0x800A01A8)
Object required: '[string: "UPDATE tblStuginfo_1"]'
/webtester/bokning.asp, line 26

Rad 26 på upptagarsidan är SQL-satsen:

set SQL = "UPDATE tblStuginfo_1 SET v23 = " & v23 & ", v24 = " & v24 & ", v25 = " & v25 & ", v26 = " & v26 & ", v27 = " & v27 & ", v28 = " & v28 & ", v29 = " & v29 & ", v30 = " & v30 & ", v31 = " & v31 & ", v32 = " & v32 & ", v33 = " & v33 & ", v34 = " & v34 & ", v35 = " & v35 & " WHERE StugID = '" & StugID &"'"

Det är ju eventuellt många stugor vars veckor ska uppdateras utefter vad användaren klickat i för kryssrutor på föregående sida. Kan felet ha något med DET att göra eller är det nåt annat i SQL-satsen som spökar?

------------------

// Mattias

Medlem sedan dec. 200012 464 inlägg
#12

set används inte vid tilldelning av strängar

SQL = "UPDATE tblStuginfo_1 SET v23 = " & v23 & ", v24 = " & v24 & ", v25 = " & v25 & ", v26 = " & v26 & ", v27 = " & v27 & ", v28 = " & v28 & ", v29 = " & v29 & ", v30 = " & v30 & ", v31 = " & v31 & ", v32 = " & v32 & ", v33 = " & v33 & ", v34 = " & v34 & ", v35 = " & v35 & " WHERE StugID = '" & StugID &"'"

------------------
essentitia preter non sans multiplicandum

Medlem sedan mars 2000205 inlägg
#13

Ok, det borde jag ju ha tänkt på. ;) Nu kommer jag iaf vidare och enligt min utskrivning av SQL-satsen så ska de värden jag kryssar för i kryssrutorna uppdateras, men tyvärr läggs inga värden till i DBn.

Kan det ha med koden för kryssrutevärdet i formuläret?

<input type="checkbox" name="v23" value="1" <% If RS("v23") = true Then %> CHECKED <% End If %>

Jag skickar ju vidare värdet 1 om kryssrutan i formuläret är ikryssad och i DBn har jag valt Ja/Nej (kryssruta) som datatyp. Men greppar egentligen Access att värdet 1 innebär att kryssrutan i DBn ska kryssas i?

------------------

// Mattias

[Redigerat av Mattias den 26 sep 2001]

Medlem sedan feb. 20012 412 inlägg
#14

Hej!

Det fattas en > efter CHECKED.

Jag hade inte gjort if-satsen så, utan gjort en helt ny INPUT, en utan checked och en med och styrt vilken som skulle användas med if-satsen.

<% If RS("v23") = true Then %>

<input type="checkbox" name="v23" value="1" CHECKED>

<% else %>

<input type="checkbox" name="v23" value="1">

<% End If %>

r: stavfel

mvh Jörgen :)

------------------
Varför bråka när man kan kramas?

[Redigerat av jorgen den 26 sep 2001]

Medlem sedan dec. 200012 464 inlägg
#15

Jag har för mig att Access tolkar 0 som false och allt annat som true så det borde vara ok.

------------------
essentitia preter non sans multiplicandum

[Redigerat av LarsG den 26 sep 2001]

Medlem sedan dec. 200012 464 inlägg
#16

Hur ser koden där du gör update ut och hur ser själva sql-satsen ut efter det att du har stoppat in alla värden?

------------------
essentitia preter non sans multiplicandum

Medlem sedan mars 2000205 inlägg
#17

jorgen: På vilket sätt är din lösning bättre än den jag använder?

LarsG: Så här ser updatekoden ut när jag klickat för v23 på först, andra och tredje radens stugor samt v24 och v25 på första radens stuga (C-429):

UPDATE tblStuginfo_1 SET v23 = 7, v24 = 1, v25 = 1, v26 = 0, v27 = 0, v28 = 0, v29 = 0, v30 = 0, v31 = 0, v32 = 0, v33 = 0, v34 = 0, v35 = 0 WHERE StugID = 'C-429, C-430, C-503, C-504, C-537'

------------------

// Mattias

Medlem sedan feb. 20012 412 inlägg
#18

Hej!

Funktionsmässigt gör det ingen större skillnad. Men strukturen på koden gör det lättare att kommentera och därmed lättare att felsöka, bygga om och förså koden vid ett senare tillfälle.

Mvh Jörgen :)

------------------
Varför bråka när man kan kramas?

Medlem sedan dec. 200012 464 inlägg
#19

Ok, jag förstår. Du har alltså flera stugor som du vill uppdatera samtidigt. (Jag tänkte att det var så att du jobbade med en stuga i taget.)

Det som händer är att du lägger ut flera fält i ditt formulär som har samma namn och då kommer de värden som finns i de fälten att slås samman till en komma-separerad lista.

Det man får göra är att se till att de olika fälten får olika namn, tex så att man har ett löpnummer (du kan använda counter till exempel)

<input type='HIDDEN' name='stugID<%= counter%>' value='<%=rs("stugID")%>'>

<td width="38" align="center" valign="middle" height="25" bgcolor="<% =color %>">
<input type="checkbox" name="v23_<%= counter%>" value="1" <% If RS("v23") = true Then %> CHECKED <% End If %> >

sen så får du lägga till ett hidden fält som anger hur många stugor som du har

<input type='HIDDEN' name='counter' value='<% =counter%>'>

och sedan på sidan som uppdaterar

for i = 0 to request.form("counter")
stugID = request.form("stugID" & i)
v23 = Request.Form("v23_" & i)
v24 = Request.Form("v24_" & i)
v25 = Request.Form("v25_" & i)
v26 = Request.Form("v26_" & i)
v27 = Request.Form("v27_" & i)
v28 = Request.Form("v28_" & i)
v29 = Request.Form("v29_" & i)
v30 = Request.Form("v30_" & i)
v31 = Request.Form("v31_" & i)
v32 = Request.Form("v32_" & i)
v33 = Request.Form("v33_" & i)
v34 = Request.Form("v34_" & i)
v35 = Request.Form("v35_" & i)
SQL = "UPDATE tblStuginfo_1 SET v23 = " & v23 & ", v24 = " & v24 & ", v25 = " & v25 & ", v26 = " & v26 & ", v27 = " & v27 & ", v28 = " & v28 & ", v29 = " & v29 & ", v30 = " & v30 & ", v31 = " & v31 & ", v32 = " & v32 & ", v33 = " & v33 & ", v34 = " & v34 & ", v35 = " & v35 & " WHERE StugID = '" & StugID &"'"
connect.execute sql,,128
next

Det blir alltså en update sats per stuga.

------------------
essentitia preter non sans multiplicandum

[Redigerat av LarsG den 26 sep 2001]

[Redigerat av LarsG den 27 sep 2001]

Medlem sedan mars 2000205 inlägg
#20

Det fungerade tyvärr inte. Update-koden hinner inte ens köras. Får felmeddelandet:

Microsoft VBScript runtime (0x800A000D)
Type mismatch: '[string: "1, 2, 3, 4, 5, 5"]'
/webtester/bokning.asp, line 10

Rad 10 är:

FOR i = 0 to Request.Form("counter")

Är dock osäker på ett par saker i ditt föregående inlägg.

1. Jag placerar koden som anger hur många stugor jag har (<input type='HIDDEN' name='stugID' value='<%=rs("stugID")%>'> ) i slutet av loopen. Detta är väl korrekt?

2. Funderar på om du skrivit fel i slutet av din kod eller om det är JAG som gjort fel i min tidigare kod? Du skrev:

sql = SQL = "UPDATE tblStuginfo_1....

och

connect.execute sql,,128

------------------

// Mattias

271 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)
131 ms — ändringar (db)