51 messaggi dal 02 novembre 2006
salve, devo aggiornare contemporaneamente tutti i records di una tabella Access. Nel caso specifico ho un campo di controllo che mi serve x discriminare uno specifico record. Sono un autodidatta, pertanto non me ne vogliate...

Questo è il codice della pagina asp

<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>
<!--#include file="../Connections/data.asp" -->
<%
'creo l'oggetto Recordset
'Set rs = Server.CreateObject("ADODB.Recordset")
'Eseguo la query SQL SELECT
rs.Open "SELECT * FROM Stagione ORDER by Stag DESC", cn
%>
<html>
<head>
<title>Gestione Stagione</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link href="../Stile/organico.css" rel="stylesheet" type="text/css">
</head>
<body>
<form action="" method="post" name="form1">
<table width="60%" border="0">
<%
'creo l'area ripetuta
While rs.EOF = False
%>
<tr>
<td><input type="radio" name="Checkbox" id="Checkbox" value="<%=rs("Checkbox")%>"<% if rs("Checkbox").Value then Response.Write(" checked=""checked""") %> />
<%=Server.HTMLEncode(rs("Stag"))%>
</div></td>
</tr>
<%
rs.MoveNext
'chiudo l'area ripetuta
Wend
rs.Close
%>
<tr>
<td><span class="Insubmit">
<input type="submit" name="Modifica" value="Modifica">
</span></td>
</tr>
</table>
</form>

'qui mi perdo; la seguente parte di codice è utile se trasferisco la modifica ad una pagina di dettaglio, ma non va bene se voglio aggiornare tutti i records in contemporanea; avevo provato a creare un area ripetuta che facesse l'update di tutti irecord, ma non funziona.

<%
Dim Checkbox
If Request.Form("Modifica") <> "" Then
rs.Open "Stagione", cn, 3, 3

While rs.EOF = False

Checkbox = Request.Form("Checkbox")
rs("Checkbox") = Checkbox

rs.MoveNext
Wend

rs.Update
rs.Close
End If
Response.Redirect("Stagione_Inserimento.asp")
%>


</body>
</html>


<%
Set Rs = Nothing
%>
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao, ci sei vicino. La cosa si potrebbe risolvere in due modi, ma ti propongo quella più vicina al codice che hai già scritto.

Dovresti modificare il name delle checkbox, in modo che sia univoco. L'attributo id non è necessario, infatti ai fini del passaggio dei dati via post è indispensabile solo il name, quindi l'id puoi anche eliminarlo.

Immagino che la tabella "Stagione" abbia una chiave primaria ID, quindi potresti usare quella per creare name univoci.
<input type="radio" name="Checkbox<%=rs("ID")%>" <% if rs("Checkbox").Value then Response.Write(" checked=""checked""") %> />
Anche l'attributo value non è necessario, infatti assumerà un valore predefinito di "on" nel caso la checkbox sia spuntata e stringa vuota se non lo fosse.

Infine, modifica il tuo codice di aggiornamento così:
<%
Dim Checkbox
If Request.Form("Modifica") <> "" Then
rs.Open "Stagione", cn, 3, 3

While rs.EOF = False

'qui chiedo il valore della checkbox che ha il mio id nel nome
Checkbox = Request.Form("Checkbox" & rs("ID"))
'valuto il valore della checkbox
'un valore non vuoto indica che la checkbox era stata spuntata
if Checkbox<>"" then
rs("Checkbox") = true
else
rs("Checkbox") = false
end if
'non vorrei sbagliarmi ma mi sembra che l'update
'vada chiamato qui, prima del movenext (?)
rs.Update
rs.MoveNext
Wend

rs.Close
End If
Response.Redirect("Stagione_Inserimento.asp")
%>


ciao,
Modificato da BrightSoul il 21 novembre 2011 23.50 -

Enjoy learning and just keep making
51 messaggi dal 02 novembre 2006
Funziona. ho però modificato il codice della pagina in questo modo:

ho dovuto inserire un gruppo di pulsanti (due) per la scelta vero/falso relativa ad ogni record, dato che il risultato che mi serviva con un solo pulsante non lo posso ottenere. in pratica volevo un pulsante radio per ogni record che flaggato "spostava la condizione vero/falso" sul quel record, invertendola in tutti gli altri, ora modificando il name del checkbox da "Checkbox" a Checkbox<%=rs("Id")%>" questo diventa ovviamente univoco e relativo al singolo record pertanto, devo necessariamente inserire un secondo pulsante per invertire la condizione.

grazie per l'aiuto, per ora lo utilizzo così

Sarebbe possibile realizzare una lista con un songolo pulsante che sposta il flag in verticale, e che aggiorni tutti i record?

----------------------------------------------------------------
Modificato da angelorso il 22 novembre 2011 10.21 - <%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>
<!--#include file="../Connections/data.asp" -->
<%
'creo l'oggetto Recordset
'Set rs = Server.CreateObject("ADODB.Recordset")
'Eseguo la query SQL SELECT
rs.Open "SELECT * FROM Stagione ORDER by Stag DESC", cn
%>
<html>
<head>
<title>Gestione Stagione</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link href="../Stile/organico.css" rel="stylesheet" type="text/css">
</head>
<body>
<form action="" method="post" name="form1">
<table width="60%" border="0">
<%
'creo l'area ripetuta
While rs.EOF = False
%>
<tr>
<td width="14%"><%=rs("Checkbox")%></td>
<td width="6%"><label>
<input type="radio" name="Checkbox<%=rs("Id")%>" value="True" <% if rs("Checkbox").Value then Response.Write(" checked=""checked""") End if%> />
Si</label></td>
<td width="9%"><label>
<input type="radio" name="Checkbox<%=rs("Id")%>" value="False" <% if not rs("Checkbox").Value then Response.Write(" checked=""checked""") End if%> />
No</label></td>
<td width="71%"><%=Server.HTMLEncode(rs("Stag"))%></td>
</tr>
<%
rs.MoveNext
'chiudo l'area ripetuta
Wend
rs.Close
%>
<tr>
<td colspan="4"><span class="Insubmit">
<input type="submit" name="Modifica" value="Modifica">

</span></td>
</tr>
</table>
</form>

<%
Dim Checkbox
If Request.Form("Modifica") <> "" Then
rs.Open "Stagione", cn, 3, 3
While rs.EOF = False
'qui chiedo il valore della checkbox che ha il mio id nel nome
Checkbox = Request.Form("Checkbox" & rs("ID"))

rs("Checkbox") = Checkbox
rs.Update
rs.MoveNext
Wend

rs.Close
Response.Redirect("Stagione_Inserimento.asp")
End If
%>
</body>
</html>
<%
Set Rs = Nothing
%>
51 messaggi dal 02 novembre 2006
angelorso ha scritto:
Funziona. ho però modificato il codice della pagina in questo modo:

ho dovuto inserire un gruppo di pulsanti (due) per la scelta vero/falso relativa ad ogni record, dato che il risultato che mi serviva con un solo pulsante non lo posso ottenere. in pratica volevo un pulsante radio per ogni record che flaggato "spostava la condizione vero/falso" sul quel record, invertendola in tutti gli altri, ora modificando il name del checkbox da "Checkbox" a Checkbox<%=rs("Id")%>" questo diventa ovviamente univoco e relativo al singolo record pertanto, devo necessariamente inserire un secondo pulsante per invertire la condizione.

grazie per l'aiuto, per ora lo utilizzo così

Sarebbe possibile realizzare una lista con un songolo pulsante che sposta il flag in verticale, e che aggiorni tutti i record?

<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>
<!--#include file="../Connections/data.asp" -->
<%
'creo l'oggetto Recordset
'Set rs = Server.CreateObject("ADODB.Recordset")
'Eseguo la query SQL SELECT
rs.Open "SELECT * FROM Stagione ORDER by Stag DESC", cn
%>
<html>
<head>
<title>Gestione Stagione</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link href="../Stile/organico.css" rel="stylesheet" type="text/css">
</head>
<body>
<form action="" method="post" name="form1">
<table width="60%" border="0">
<%
'creo l'area ripetuta
While rs.EOF = False
%>
<tr>
<td width="14%"><%=rs("Checkbox")%></td>
<td width="6%"><label>
<input type="radio" name="Checkbox<%=rs("Id")%>" value="True" <% if rs("Checkbox").Value then Response.Write(" checked=""checked""") End if%> />
Si</label></td>
<td width="9%"><label>
<input type="radio" name="Checkbox<%=rs("Id")%>" value="False" <% if not rs("Checkbox").Value then Response.Write(" checked=""checked""") End if%> />
No</label></td>
<td width="71%"><%=Server.HTMLEncode(rs("Stag"))%></td>
</tr>
<%
rs.MoveNext
'chiudo l'area ripetuta
Wend
rs.Close
%>
<tr>
<td colspan="4"><span class="Insubmit">
<input type="submit" name="Modifica" value="Modifica">

</span></td>
</tr>
</table>
</form>

<%
Dim Checkbox
If Request.Form("Modifica") <> "" Then
rs.Open "Stagione", cn, 3, 3
While rs.EOF = False
'qui chiedo il valore della checkbox che ha il mio id nel nome
Checkbox = Request.Form("Checkbox" & rs("ID"))

rs("Checkbox") = Checkbox
rs.Update
rs.MoveNext
Wend

rs.Close
Response.Redirect("Stagione_Inserimento.asp")
End If
%>
</body>
</html>
<%
Set Rs = Nothing
%>
11.886 messaggi dal 09 febbraio 2002
Contributi
Ieri ho fatto un errore, ti ho postato questo codice:
<input type="radio" name="Checkbox<%=rs("ID")%>" <% if rs("Checkbox").Value then Response.Write(" checked=""checked""") %> />

e invece mi accorgo solo ora di aver scritto type="radio", ma quella avrebbe dovuto essere una type="checkbox". La checkbox ti permette ovviamente di impostare lo stato vero o falso, mettendo o togliendo la spunta dalla casella.


in pratica volevo un pulsante radio per ogni record che flaggato "spostava la condizione vero/falso" sul quel record, invertendola in tutti gli altri,


ah, ok. Ora capisco perché avevi creato tanti radio button con lo stesso name. Quindi tu vuoi che dei tanti record, in un dato momento, soltanto uno possa essere "attivo". Una cosa così, insomma:
http://help.adobe.com/en_US/Dreamweaver/10.0_Using/images/as_radioButton.png

Se è effettivamente così e se ho capito bene, allora la cosa si semplifica. Torna ad usare i radiobutton. Il name sarà sempre lo stesso, come avevi fatto tu, ma come value impostagli l'ID del record.

<input type="radio" name="Checkbox" <% if rs("Checkbox").Value then Response.Write(" checked=""checked""") %> value="<%= rs("ID") %>" />


Ora, lato server, recupera il valore di "Checkbox" e utilizzalo in una comando sql UPDATE.
Dim valoreSelezionato
'recupero il valore che arriva dal form
'valoreSelezionato varrà ad esempio 15, cioè l'ID del record selezionato
valoreSelezionato = CInt(Request.Form("Checkbox"))
'eseguo una query SQL che mi imposta lo stato vero/falso.
'Se l'ID è uguale al valoreSelezionato, allora imposterà true, altrimenti false
cn.Execute("UPDATE Stagione SET Checkbox=IIF(ID=" & valoreSelezionato & ", true, false)");
...e basta così. Il comando UPDATE aggiornerà tutti i record, senza che tu li debba ciclare col recordset. La funzione IIF valuterà se ID=valoreSelezionato e in caso positivo restituirà true, altrimenti false.

prova così, ciao.
Modificato da BrightSoul il 22 novembre 2011 22.33 -

Enjoy learning and just keep making
51 messaggi dal 02 novembre 2006
Ciao BrightSoul, volevo anche se tardivamente ringraziarti per la preziosa collaborazione; ho modificato il codice per aggiornare anche altre pagine contenenti records composti da molti campi, presi da tabelle relazionate ed il risultato è stato (almeno per me) decorosissimo.

Solo una curiosità: dicevi nella prima risposta che esistono due metodi per aggiornare i records con un solo submit; ti riferivi per caso all'uso degli array?

Mi consiglieresti di passare ad asp.net? quale SW posso utilizzare per iniziarne lo studio?

grazie
11.886 messaggi dal 09 febbraio 2002
Contributi
prego :)

angelorso ha scritto:
Solo una curiosità: dicevi nella prima risposta che esistono due metodi per aggiornare i records con un solo submit; ti riferivi per caso all'uso degli array?


non esattamente, ma alla fine il secondo metodo è venuto fuori: consisteva nell'usare un'istruzione UPDATE anziché aprire il recordset per invocare l'.Update su ogni record.


Mi consiglieresti di passare ad asp.net? quale SW posso utilizzare per iniziarne lo studio?

Sì, indubbiamente, asp.net ti rende molto più produttivo. Tuttavia, sii cosciente che c'è uno scoglio iniziale da superare perché l'ambiente di lavoro è completamente diverso. Bisogna, in un certo senso, "dimenticare" alcune pratiche in uso nell'asp classico, come gli include, e impararne di nuove che risolvono gli stessi problemi ma in maniera più efficiente e gestibile.

Inoltre, il .NET Framework è molto vasto e questo all'inizio può disorientarti ma con una buona guida che ti introduca "gentilmente" all'ambiente di lavoro sarà tutto molto più semplice. Far da sé in questo caso ti farà perdere del tempo. Io ti consiglio un libro ricco di esempi, qui su aspitalia per esempio ne hanno uno.

Tu ovviamente scegli il metodo di apprendimento che desideri, magari fatti consigliare anche da colleghi o amici sviluppatori che già conoscono Asp.Net.

Come software, Microsoft ti mette a disposizione Visual Web Developer Express, che è completamente gratuito.
http://www.microsoft.com/visualstudio/en-us/products/2010-editions/visual-web-developer-express

ciao,

Enjoy learning and just keep making
51 messaggi dal 02 novembre 2006
grazie per il consiglio, ho guardato nella sez. libri, ne sono menzionati più di uno. Dai feedback ci ho capito poco; quale scegliere? conosco quel poco di asp classico imparato da autodidatta. Mi scuso con i moderatori se risulto HOT con il titolo della domanda, ma non me la sono sentita di aprire un altro post, non me ne vogliate.

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.