12 messaggi dal 14 dicembre 2001
Salve ho un problema! In una pagina richiamo tutti gli iscritti al mio db e con recordsperpagina =100 visualizzo i miei primi 100 iscritti e con un ciclo li visualizzo tutti e 100 nome,cognome, email e i relativi campi si/no del mio db access con i fatidici checkbox ai quali assegno comel valore l'id dell'iscritto e con una funzione controllo se nel db è checked oppure no.
Fin qui tutto funziona ... questo è il codice:
sqlb="SELECT * from Iscritti2"
Set rs = Server.CreateObject("ADODB.Recordset")
RecordsPerPagina=100
page=request("page")
if page="" then page=1
strRicerca=Request("Ricerca")
rs.Open Sqlb,cn, adOpenKeyset,adLockOptimistic
rs.PageSize=RecordsPerPagina
rs.AbsolutePage=page
Totalrecords=rs.RecordCount
if Totalrecords=0 then
Response.Write"<p>Nessun risultato positivo</p>"
else
for i=1 to RecordsPerPagina

if Not rs.EOF then
%>
<input type="hidden" name="cod" value="<%=rs.Fields("id")%>">
<TR class="td_sfondo">
<TD>
<%response.write rs.Fields("Cognome")%>
</TD>
<TD> <div align="center"><font color="#000000"><b> <%response.write rs.Fields("Nome")%>
</TD>
<TD>
<%response.write rs.Fields("email")%>
</TD>
<TD>
<%Dim stato
stato=rs.Fields("rosso")
if stato=true then
stato="CHECKED"
else
stato="0"
end if
%>
<input type="checkbox" value="<%=rs.fields("id")%>" name="rosso" <%=stato6%> >

</TD>
<TD>
<%Dim stato2
stato2=rs.Fields("giallo")
if stato2=true then
stato2="CHECKED"
else
stato2="0"
end if
%>
<input type="checkbox" value="<%=rs.fields("id")%>" name="giallo" <%=stato6%> >

</TD>
...ecc
Ma il problema è nell'altra pagina.
Come faccio ad aggiornare il mio db se i valori che mi passa sono solo quelli dei campi checkbox spuntati?Se deseleziono un campo che il mio bravo sistema aveva segnalato come checked perchè nel mio db era selezionato come faccio ora ad aggiornarlo se mi passa solo l'id degli utenti selezionati?Come faccio a dirgli deselezionami il campo rosso dell'id 5 se l'id 5 non comparirà mai perchè è stato deselezionato a video ? Io posso solo aggiornare gli id con il seguente codice:

ide=Request.Form("cod")
red=Request.Form("rosso")
elencorosso= SPLIT (red,",")
'response.Write elencorosso
for ib=LBOUND(elencorosso) to UBOUND(elencorosso)
sql="UPDATE Iscritti2 SET Iscritti2.[rosso] = "& 1 &" WHERE (((Iscritti2.ID)="& (elencorosso(ib)) &"))"
cn.Execute(sql)
next

Eraldo Lattari
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,
dovresti tenere una copia dei valori che erano selezionati originariamente.
Mi spiego:

Come giustamente hai detto, la pagina che riceve il post riesce a sapere unicamente gli id degli utenti che hanno la spunta. Se tu, oltre alle checkbox predisponi anche un campo hidden che contenga tutti gli id spuntati in origine, poi la pagina potrà fare un confronto tra questo valore e quello che ti viene passato dalle checkbox. Così potrai sapere:

1) i nuovi record spuntati
2) i record a cui l'utente ha tolto la spunta.

In termini di prestazioni, è bene che vengano aggiornati solo i record oggetto di modifica, senza toccare gli altri. In pagina1, aggiorna il tuo script in questo modo (in grassetto le aggiunte)

Dim statoi
stato=rs.Fields("rosso")
if stato=true then
stato="CHECKED"
originalirosso = originalirosso & "," & rs.Fields("id")
else
stato="0"
end if

qusto ti servirà per mettere in una variabile tutti gli id dei record che hanno spuntato il campo "rosso".
Adesso, in fondo subito dopo il next metti:


if Len(originalirosso)>0 then originalirosso = Mid(originalirosso,2)
Response.write "<input type=""hidden"" name=""originali_rosso"" value=""" & originalirosso & """>"


in pagina2 poi dovrai confrontare i valori di questo campo hidden (originali_rosso) e delle checkbox (rosso).
Dopo aver fatto uno split sulla virgola per il valore di "rosso", controlla se ogni valore dell'array era già presente in "originali_rosso". Se sì, non occorrono modifiche su questo record, se no fai una update.
Ora fai il contrario.
Controlla se ogni elemento di originali_rosso è presente in rosso. Se sì, non fare modifche, se no fai una update togliendo la spunta dal campo "rosso".

ciao

Enjoy learning and just keep making
12 messaggi dal 14 dicembre 2001
Grazie per aver risposto brightsoul, ora provo e ti faccio sapere!
Ancora grazie.

Eraldo Lattari
12 messaggi dal 14 dicembre 2001
Non riesco a fare il for nella seconda pagina.
Recupero le informazioni...
red=request.form("rosso")
splitred=SPLIT (red,",")
originalirosso=request.form("originali_rosso")
splitoriginalirosso=SPLIT (originalirosso,",")
ho controllato tutti e due i valori con response.write e funziona. Mi stampa a video sia gli id selezionati originariamente nel db che quelli che vado a selezionare successimante.
response.write red &"<br>"
response.write originalirosso&"<br>"
Ora quale è il modo per controllare l'arrey?
io ho fatto così senza fare l'update per provare, ma non va!
for ib=LBOUND(elencorosso) to UBOUND(elencorosso)
if (elencorosso(ib))=originalirosso then
response.Write "arrivederci" &"<br>"
else
response.Write "ciao"
'sql="UPDATE Iscritti2 SET Iscritti2.[rosso] = "& 1 &" WHERE (((Iscritti2.ID)="& (elencorosso(ib)) &"))"
'cn.Execute(sql)
end if
next
... mi da sempre e soltanto ciao per ogni campo rosso selezionato nella prima pagina!
qual è il modo per controllare l'array?
Ancora non so come sdebbitarmi. A presto

Eraldo Lattari
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,
per prima cosa crea i due array. Attenzione perchè non è un'operazione scontata: se la variabile contiene un solo id, lo split sulla virgola non funziona. Allora fai:

elenco_originale = Split(request.form("originali_rosso") & ",", ",")
elenco_red = Split(request.form("rosso") & ",", ",")


qui lo split funzionerà sicuramente, indipendentemente dal valore di Request.Form("originali_rosso") perchè gli ho concatenato una virgola in fondo.
Siccome ho aggiunto una virgola, si è creato un altro elemento. Basta non considerarlo e fare il ciclo for da 0 a Ubound-1.

Bene, passiamo alla parte "interessante".
Per controllare quali elementi sono stati deselezionati dall'utente, bisogna scorrere tutto l'array elenco_originale e confrontarlo con ogni elemento di elenco_red. Quando un valore è presente nel primo ma non nel secondo, vuol dire che è stato deselezionato:

Dim trovato, deselezionati
deselezionati = ""
for i = 0 to Ubound(elenco_originale)-1
trovato = false
for j = 0 to Ubound(elenco_red)-1
if Trim(elenco_originale(i)) = Trim(elenco_red(j)) then
trovato = true
end if
next
'se il valore non è stato trovato, lo concateno ad una variabile
if not trovato then deselezionati = deselezionati & "," & Trim(elenco_originale(i))
next
if deselezionati <> "" then deselezionati = Mid(deselezionati,2)


bene, adesso ho una variabile, "deselezionati" che è una catena di id di record a cui l'utente ha tolto la spunta.
Posso usare questa catena direttamente in una query:
cn.Execute "UPDATE tabella SET rosso=false WHERE id IN (" & deselezionati & ")"


la clausola WHERE id IN (...) mi permette di specificare un numero variabile (da 1 a n) di id separati da virgole.

il primo problema è risolto.
Adesso, se vuoi sapere quali record sono stati invece SELEZIONATI dall'utente, fai il contrario (inverti i for):

for i = 0 to Ubound(elenco_red)-1
...
for i = 0 to Ubound(elenco_originale)-1
...
next
...
next


ciao
Modificato da BrightSoul il 31 marzo 2004 23.56 -

Enjoy learning and just keep making
12 messaggi dal 14 dicembre 2001
Ciao BrightSoul, grazie a te comincio a vedere la luce.
Sono sicuro che siamo arrivati alla fine di questo tormentato aggiornamento con i checkbox.
In effetti non ti avevo detto che i miei Id sono circa 6000 e in pratica l'istruzione mid non va.
mi da il seguente errore qualora cercassi di inserire ad esempio gli id 2500 e 2501:
Microsoft JET Database Engine (0x80040E14)
Errore di sintassi (operatore mancante) nell'espressione della query 'id IN (,2500,2501)'.
... mentre se vado a deselezionare ad esempio gli id 2498 e2499 mi deseleziona il primo e non i restanti.
Il codice della mia seconda pagina è questo correggilo se sbaglio:

elenco_originale = Split(request.form("originali_rosso") & ",", ",")
elenco_rosso = Split(request.form("rosso") & ",", ",")

Dim trovato, deselezionati
deselezionati = " "
for i = 0 to Ubound(elenco_originale)-1
trovato = false
for j = 0 to Ubound(elenco_rosso)-1
if Trim(elenco_originale(i)) = Trim(elenco_rosso(j)) then
trovato = true
end if
next

'se il valore non è stato trovato, lo concateno ad una variabile
if not trovato then
deselezionati = deselezionati & "," & Trim(elenco_originale(i))
end if
next
if deselezionati <> " " then
deselezionati = Mid(deselezionati,3)
'se il mid gli passo 3 mi fa modificare i primi id tranquillamente
'response.write deselezionati
cn.Execute "UPDATE Iscritti SET Iscritti.[rosso] = "& 0 &" WHERE id IN (" & deselezionati & ")"
end if
'cambio i valori come mi avevi detto, ma ho cambiato anche la variabile da (i) ad (a) e da (j) a (b)
for a = 0 to Ubound (elenco_rosso)-1
trovato = false
for b = 0 to Ubound (elenco_originale)-1
if Trim(elenco_rosso(a))=Trim(elenco_originale(b)) then
trovato = true
end if
next
'se il valore non è stato trovato, lo concateno ad una variabile
if not trovato then
deselezionati = deselezionati & "," & Trim(elenco_rosso(a))
end if
next
if deselezionati <> "" then
deselezionati = Mid(deselezionati,2)
response.write deselezionati
cn.Execute "UPDATE Iscritti SET Iscritti.[rosso] = "& 1 &" WHERE id IN (" & deselezionati & ")"
end if
... dove sbaglio ... su tutto? Sono proprio un ignorante, ma un giorno migliorerò! Promesso!!!
Ancora grazie.


Modificato da eraldo76 il 02 aprile 2004 00.15 -

Eraldo Lattari
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao, ti riporto un file col codice corretto.
E' del tutto simile a quello che avevi scritto, ho fatto pochissimi cambiamenti :)

Allora, ho fatto una prova in locale con questa pagina e ho dovuto usare due accorgimenti per farla funzionare da sola:

1) i dati non li riceve da un form, ho inserito io direttamente gli id.
elenco_originale = Split("2502,2503,2504,2505,2506" & ",", ",")
elenco_rosso = Split("2502,2505,2507" & ",", ",")
Al momento di montare lo script sulla pagina definitiva tieni le due righe che hai tu, ossia queste qua:
elenco_originale = Split(request.form("originali_rosso") & ",", ",")
elenco_rosso = Split(request.form("rosso") & ",", ",")

2) La pagina non effettua le query, le stampa solamente a video col response.write
Response.write "UPDATE Iscritti SET Iscritti.[rosso] = 0 WHERE id IN (" & deselezionati & ")"
Ma tu usa la tua sintassi:
cn.Execute "UPDATE Iscritti SET Iscritti.[rosso] = 0 WHERE id IN (" & deselezionati & ")"


I cambiamenti che ho fatto sono stati lievi... proprio prima del ciclo for per trovare i selezionati bisognava svuotare la variabile su cui venivano memorizzati di id trovati. Per maggiore comprensione anzichè svuotarla ne ho usata un'altra così adesso per il primo ciclo for hai "deselezionati", per il secondo hai "selezionati". Ecco l'estratto di codice a cui faccio riferimento:
Dim selezionati
selezionati = ""
for a = 0 to Ubound(elenco_rosso)-1
trovato = false
...
if not trovato then
selezionati = selezionati & "," & Trim(elenco_rosso(a))

le queries *dovrebbero* funzionare anche con una stringa composta da molti id. Credo che anche con qualche migliaio non ci siano problemi... poi lo verificherai facendo una prova pratica.
Ciao :) fammi sapere se funziona

simulazione.asp
<%
elenco_originale = Split("2502,2503,2504,2505,2506" & ",", ",") 
elenco_rosso = Split("2502,2505,2507" & ",", ",") 

Dim trovato, deselezionati
deselezionati = "" 
for i = 0 to Ubound(elenco_originale)-1 
trovato = false 
for j = 0 to Ubound(elenco_rosso)-1 
if Trim(elenco_originale(i)) = Trim(elenco_rosso(j)) then 
trovato = true 
end if 
next 

'se il valore non è stato trovato, lo concateno ad una variabile 
if not trovato then 
deselezionati = deselezionati & "," & Trim(elenco_originale(i)) 
end if 
next 
if deselezionati <> "" then 
deselezionati = Mid(deselezionati,2) 

Response.write "UPDATE Iscritti SET Iscritti.[rosso] = 0 WHERE id IN (" & deselezionati & ")" 
end if 

Response.write("<br>")

Dim selezionati
selezionati = ""
for a = 0 to Ubound(elenco_rosso)-1 
trovato = false 
for b = 0 to Ubound(elenco_originale)-1 
if Trim(elenco_rosso(a))=Trim(elenco_originale(b)) then 
trovato = true 
end if 
next 
'se il valore non è stato trovato, lo concateno ad una variabile 
if not trovato then 
selezionati = selezionati & "," & Trim(elenco_rosso(a)) 
end if 
next 
if selezionati <> "" then 
selezionati = Mid(selezionati,2) 
Response.write "UPDATE Iscritti SET Iscritti.[rosso] = 1 WHERE id IN (" & selezionati & ")" 
end if 
%>


Enjoy learning and just keep making
12 messaggi dal 14 dicembre 2001
Ciao, va tutto bene tranne quando faccio una prova...
premessa... ti ricordi che la pagina è divisa per 100 record alla volta... ora può capitare che una pagina sia senza valori siglati... ne seleziono alcuni premo invio e mi da errore nella quary:
Microsoft JET Database Engine (0x80040E14)
Errore di sintassi (operatore mancante) nell'espressione della query 'id IN ()'.
... in pratica ho risolto così... :
if Len(originalirosso)>0 then
originalirosso = Mid(originalirosso,2)
Response.write "<input type=""hidden"" name=""originali_rosso"" value=""" & originalirosso & """>"
else
originalirosso= 0
Response.write "<input type=""hidden"" name=""originali_rosso"" value=""" & originalirosso & """>"
End If
Gli ho dato il valore numerico 0 a originalirosso... e funziona!
Se faccio il contrario ... cioè ho una pagina con dei record siglati e li vado a deselezionare tutti ...
la seconda pagina me li va a deselezionare nel db, ma nella pagina mi spara a video il fatidico:
Microsoft JET Database Engine (0x80040E14)
Errore di sintassi (operatore mancante) nell'espressione della query 'id IN ()'.
... penso che sia dovuto alla mancanza di un valore...
allora avevo pensato di fare così nella seconda pagina:
elenco_originale = Split(request.form("originali_rosso") & ",", ",")
red= request.form("rosso")
if red=" " then
red=0
end if
elenco_red = Split(request.form("rosso") & ",", ",")
... ma non funonzia!Non so perchè ma...
... sento che ci siamo... sento che ci siamo veramente!
...un abbraccio!

Eraldo Lattari

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.