61 messaggi dal 30 maggio 2002
Stamane mi sono svegliato con la voglia di implementare un semplice sondaggio nel mio sito web.
Stanotte rischio di non dormire perchè mi sta facendo impazzire.
Ho un database access con 2 tabelle
tabella "Domande" (IDdomanda, Domanda)
tabella "Risposte" (IDrisposta, IDdomanda, Risposta, Totale)
Il problema: quando faccio l'update la query va a sommare 2 anzichè 1.
Ho provato a fare un response.write della variabile "somma" e il risultato è corretto; il problema c'è solo quando vado ad aggiornare il campo "Totale" della tabella "Risposte" (ovvero quando eseguo "sql_update").
Posto il codice nella speranza che qualcuno non sia in ferie e possa aiutarmi.
Grazie.


<%
Response.Buffer=True

dim qID, aID
qID = Request.Form("qID")
aID = Request.Form("aID")

dim conn, sql_totale, rs_totale, voti, somma

set conn = Server.CreateObject("ADODB.Connection")
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & server.MapPath("dbs/polls.mdb") & ";Persist Security Info=False"
sql_totale = "SELECT Risposte.IDrisposta, Risposte.Totale "
sql_totale = sql_totale & "FROM Risposte "
sql_totale = sql_totale & "WHERE (((Risposte.IDrisposta)="&aID&"))"
set rs_totale = Server.CreateObject("ADODB.Recordset")
rs_totale.open sql_totale, conn
voti=Cint(rs_totale("Totale"))
somma=Cint(voti+1)
rs_totale.Close
set rs_totale = nothing

dim rs_update, sql_update
set rs_update = Server.CreateObject("ADODB.Recordset")
sql_update = "UPDATE Risposte SET Risposte.Totale="&somma&" WHERE ((Risposte.IDrisposta)="&aID&")"
conn.execute(sql_update)

set voti = nothing
set somma = nothing
rs_update.Close
set rs_update = nothing
conn.Close
set conn = nothing

dim scadenza
scadenza = DateAdd("h", 12, Now)

Response.Cookies("sondaggio").Secure=False
Response.Cookies("sondaggio")("IDsondaggio")=""&qID&""
Response.Cookies("sondaggio")("votazione")="yes"
Response.Cookies("sondaggio").Expires=scadenza
Response.Buffer=False
Response.Redirect "../index.asp"
%>
2.190 messaggi dal 04 marzo 2004
Contributi | Blog
Ciao, ti somma sempre 2 o anche altri valori?
Il codice sembra corretto eccetto un piccolo dettaglio:
sql_update = "UPDATE Risposte SET Risposte.Totale="&somma&" WHERE ((Risposte.IDrisposta)="&aID&")" 
nella quale io credo che Risposte.Totale sia un numero, quindi dovresti scrivere:
sql_update = "UPDATE Risposte SET Risposte.Totale='"&somma&"' WHERE ((Risposte.IDrisposta)="&aID&")" 
cioè con il singolo apice.

Alessio Leoncini (WinRTItalia.com)
.NET Developer, Interactive Designer, UX Specialist, Trainer
61 messaggi dal 30 maggio 2002
ciao novecento.
grazie per l'apice: in effetti mancava.
partendo da una base in cui il "Totale" è 1, alla prima votazione il risultato del "Totale" è 3, alla seconda votazione è 3, alla terza è 7, alla quarta è 9... insomma... i valori vengono sommati a casaccio.
2.190 messaggi dal 04 marzo 2004
Contributi | Blog
Hai per caso controllato che il codice non venga eseguito da più pagine?

Alessio Leoncini (WinRTItalia.com)
.NET Developer, Interactive Designer, UX Specialist, Trainer
61 messaggi dal 30 maggio 2002
sinceramente non so come fare, ma credo sia impossibile dal momento che la query c'è solo nella pagine di cui ho postato il codice
2.190 messaggi dal 04 marzo 2004
Contributi | Blog
La colonna IDrisposta contiene valori univoci?

Alessio Leoncini (WinRTItalia.com)
.NET Developer, Interactive Designer, UX Specialist, Trainer
61 messaggi dal 30 maggio 2002
sì, certo e un contatore con duplicati non ammessi.

ho provato anche a cambiare le righe che eseguono l'aggiornamento come segue:

dim rs_update, sql_update
set rs_update = Server.CreateObject("ADODB.Recordset")
sql_update = "SELECT Risposte.IDrisposta, Risposte.Totale FROM Risposte WHERE ((Risposte.IDrisposta)="&aID&")"
rs_update.Open sql_update, conn, 3, 3
rs_update.Fields("Totale")=somma
rs_update.update

ma il risultato non cambia
61 messaggi dal 30 maggio 2002
Ho provato a riscrivere il codice, ma evidentemente commetto nuovamente qualche errore.

Riassumo

Ho un db con due tabelle:
- tabella "Domande" con i campi
IDdomanda (contatore)
Domanda (testo 200 caratteri)
- tabella "Risposte" con i campi
IDrisposta (contatore)
IDdomanda (intero lungo, no decimali)
Risposta (testo 200 caratteri)
Voto (intero lungo, no decimali)

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

Il form che posta la scelta alla pagina vota.asp (che esegue l'aggiornamento del db) è:

<form action="poll/vota.asp" method="post" name="pollForm">
<!--#include file="poll/pollconnect.asp"-->
<%
set rsQ = Server.CreateObject("ADODB.Recordset")
set rsQ = pollConn.execute("qryLastQ")
qID = rsQ("IDdomanda")
Response.write "<h3>" & rsQ("Domanda") & "</h3>"
rsQ.Close
set rsQ = nothing
Response.write "<input type=""hidden"" name=""qID"" value="""&qID&""">"
sqlA = "SELECT Risposte.IDrisposta, Risposte.IDdomanda, Risposte.Risposta "
sqlA = sqlA & "FROM Risposte "
sqlA = sqlA & "WHERE (((Risposte.IDdomanda)="&qID&")) "
sqlA = sqlA & "ORDER BY Risposte.IDrisposta"
set rsA = Server.CreateObject("ADODB.Recordset")
set rsA = pollConn.execute(sqlA)
do while not rsA.EOF
Response.Write "<input type=""radio"" name=""aID"" value="""&rsA("IDrisposta")&""">"&rsA("Risposta")&"<br>"
rsA.movenext
loop
rsA.Close
set rsA = nothing
pollConn.Close
set pollConn = nothing
%>
</form>

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

La pagina vota.asp è

<%
option explicit
Response.Buffer=true

dim qID, aID
qID = Cint(Request.Form("qID"))
aID = Cint(Request.Form("aID"))

if Request.Cookies("sondaggio")("votazione")="yes" or Request.ServerVariables("HTTP_COOKIE")="" then
Response.Redirect("../sondaggio.asp?q="&qID)

else

dim pollConn, sqlVoto, rsVoto, somma

set pollConn = Server.CreateObject("ADODB.Connection")
pollConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & server.MapPath("dbs/polls.mdb") & ";Persist Security Info=False"
sqlVoto = "SELECT Risposte.IDrisposta, Risposte.Voto "
sqlVoto = sqlVoto & "FROM Risposte "
sqlVoto = sqlVoto & "WHERE (((Risposte.IDrisposta)="&aID&"))"
set rsVoto = Server.CreateObject("ADODB.Recordset")
set rsVoto = pollConn.execute(sqlVoto)
somma = ""
somma = Cint(rsVoto("Voto"))+1
rsVoto.Close
set rsVoto = nothing
sqlVoto = ""

dim sqlTotale, rsTotale
sqlTotale = "UPDATE Risposte SET Risposte.Voto='"&somma&"' WHERE ((Risposte.IDrisposta)="&aID&")"
set rsTotale = Server.CreateObject("ADODB.Recordset")
set rsTotale = pollConn.execute(sqlTotale)

'rsTotale.Close
set rsTotale = nothing
pollConn.Close
set pollConn = nothing
somma = ""
sqlTotale = ""

dim scadenza
scadenza = DateAdd("h", 12, Now)

Response.Cookies("sondaggio").Secure=False
Response.Cookies("sondaggio")("votazione")="yes"
Response.Cookies("sondaggio").Expires=scadenza
Response.Buffer=false
Response.Redirect("../sondaggio.asp?q="&qID)

end if
%>

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

Alla luce di queste modifiche:
- se faccio un Response.Write di "somma" vedo che il risultato è corretto
- quando vado a consultare il db vedo che al voto viene sempre sommato 2 (anziché 1)

Dove cavolaccio sbaglio?

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.