ancora domande su asp

  • Creatore Discussione Creatore Discussione Toscano
  • Data di inizio Data di inizio

Toscano

Utente Attivo
27 Apr 2012
31
0
0
Firenze
Nuovo dubbio mi assale........
riassuno delle puntate precedenti: sto organizzando un programmino per dare la possibilità ai genitori di prenotare i colloqui con gli insegnanti della mia scuola.
Sono riuscito a fare quasi tutto quello che mi ero prefissato di fare, anche grazie all'aiuto ricevuto dal forum e dagli articoli pubblicati da questo portale.
Oggi ho invitato circa 100 colleghi insegnanti a "far finta di essere utenti" e provare a prenotare un colloquio e, com'era logico aspettarsi, sono arrivate le prime considerazioni critiche:

1. la più importante: il ns. Liceo ha due sedi e un certo numeo di insegnanti lavora su entrambe. All'atto della prenotazione avevo previsto che nel form gli utenti scrivessero nome insegnante-sede per scegliere, tra quelli operanti sulle due sedi, l'opzione di interesse: ad esempio Pippo-s (sta per sede centrale) mentre Pippo-b (sta per succursale)
Era a mio avviso questo il modo più semplice poichè nello steso campo (scegli il nome dell'insegnante con cui prenotare il colloquio) ci stavano tutte le info da recuperare poi per visualizzare la lista delle prenotazioni.

Adesso qualche collega mi chiede: perché non metti una checkbox per la scelta della sede? Sarebbe più semplice per l'utente. E' vero dico io ma a me complica la vita perché non so come gestirla.

Vi posto il codice della pagina htm e asp relative alla prenotazione:

prenota.htm (codice specifico del form)

</font><form method="post" action="inserisci.asp">
<p align="left"><font face="arial" size="2"><b>Nome cognome e classe dello studente/studentessa<br><input name="Cognome e classe" size="20" type="text"></b></font></p>
<p align="left"><font face="arial" size="2"><b>Email - di un genitore<br><input name="IndirizzoPostaElettronica" size="20" type="text"></b></font></p>
<p align="left"><font face="arial" size="2"><b>Telefono - di un genitore<br><input name="TelefonoCellulare" size="20" type="text"></b></font></p>

<p align="left"><font face="arial" size="2"><b>Cognome Insegnante con cui si desidera prenotare il colloquio</b><span style="font-weight: bold;"></span></font><font face="arial" size="2"><span style="font-weight: bold;"></span><b><br><input name="NomeInsegnante" size="20" type="text"></b><br><span style="font-style: italic;">(specificare</span> <span style="font-weight: bold;">cognome-p </span><span style="font-style: italic;">(per la sede di via del Podestà);</span>&nbsp; </font><font style="font-weight: bold;" face="arial" size="2">cognome-b</font><font face="arial" size="2"><span style="font-weight: bold;">&nbsp; </span><span style="font-style: italic;">(per la sede di via Baldovinetti) - <br>per gli insegnanti che operano sulle due sedi: vedi lista)</span></font></p><p align="left"><font face="arial" size="2"><input value="Invia" name="B1" type="submit"></font></p>
</form>

file inserisci.asp

<%
a=request.form("Cognome e classe")
b=request.form("IndirizzoPostaElettronica")
c=request.form("TelefonoCellulare")
d=request.form("NomeInsegnante")

'apro la connessione
set OBJdbConnection=Server.CreateObject("ADODB.Connection")
OBJdbConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("data/data.mdb")

Set rs=server.CreateObject("ADODB.Recordset")
rs.Open "Contatti" ,OBJdbConnection,3,3
rs.AddNew
rs("Cognome e classe")=a
rs("IndirizzoPostaElettronica")=b
rs("TelefonoCellulare")=c
rs("NomeInsegnante")=d
rs.update
rs.Close
OBJdbConnection.Close
response.write "Scrittura avvenuta correttamente!"
response.redirect "docenti.htm"
%>

vorrei, in sostanza, o che la sede si potesse scegliere spuntando una checkbox (solo per prenotare colloqui con la succursale)
oppure, in alternativa mettere nel form un menù a tendina dove l'utente potrebbe scegliere direttamente l'insegnante senza scriverlo.

Grazie, come sempre per le vs risposte.
 
sempre IO

riprendo la mia domanda di ieri cercando di spiegare meglio quello che vorrei fare:
dopo aver cercato a lungo e su diversi siti una possibile soluzione (che però non ho trovato), mi sono chiarito le idee su ciò che voglio realizzare.

mettere nel form un menù a tendina dove l'utente potrebbe scegliere direttamente l'insegnante senza scriverlo.

Questo implica ovviamente, da quanto ho capito leggendo, una modifica del mio file di database.

Attualmente ne ho uno (data.mdb) che ha una sola tabella con i seguenti campi: nome studente e classe - e-mail - telefono - nome insegnante richiesto per il colloquio.
Sono tutti campi di testo che l'utente compila dal form che ho postato sopra e che viene gestito dalla pagina asp anch'essa postata sopra.

Se volessi togliere - nel form - all'utente la possibilità di scrivere il nome dell'insegnante (lasciando però gli altri campi) facendoglielo scegliere da una lista che scorre in un menù a tendina come potrei fare?

Da quello che ho capito fin'ora dovrei creare una seconda tabella nel mio file di database che contiene i cognomi di tutti gli insegnanti (un centinaio circa) e collegare questa al menù a tendina.
E' corretto? Ma operativamente come si scrive il codice asp???

Grazie a chi vorrà darmi una mano
 
Ciao,

per favore usa il tasto # per inserire il codice nel tag CODE, cosi è difficile da leggere.

Fai una nuova tabella con nome NomeInsegnante

Nei campi della tabella metti i nomi degli insegnanti

Per popolare una select dinamicamente recuperando i dati da un database la pagina che contiene il form deve essere una pagina .asp

prenota.htm cambia in prenota.asp

Codice: il tuo form con l'inserimento dello script per popolare gli option di una select

Codice:
<form method="post" action="inserisci.asp">
<p align="left"><font face="arial" size="2"><b>Nome cognome e classe dello studente/studentessa<br>
<input name="Cognome e classe" size="20" type="text"></b></font></p>
<p align="left"><font face="arial" size="2"><b>Email - di un genitore<br>
<input name="IndirizzoPostaElettronica" size="20" type="text"></b></font></p>
<p align="left"><font face="arial" size="2"><b>Telefono - di un genitore<br>
<input name="TelefonoCellulare" size="20" type="text"></b></font></p>
<p align="left"><font face="arial" size="2"><b>Cognome Insegnante con cui si desidera prenotare il colloquio</b><span style="font-weight: bold;"></span></font><font face="arial" size="2"><span style="font-weight: bold;"></span><b><br>

<select name="NomeInsegnante">
<%
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("data.mdb")
%>
<% 
SQL = "Select * FROM NomeInsegnante"
Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Open SQL, Conn
Do While Not objRS.EOF
Response.write "<option name=""" & objRS("NomeInsegnante") & """>" & objRS("NomeInsegnante") & "</option>"  & vbCRLF

objRS.MoveNext
Loop

Response.write"</select>"

objRS.Close
Set objRS = Nothing
Conn.Close
Set Conn = Nothing

%>

</b><br><span style="font-style: italic;">(specificare</span> <span style="font-weight: bold;">cognome-p </span><span style="font-style: italic;">(per la sede di via del Podestà);</span>&nbsp; </font><font style="font-weight: bold;" face="arial" size="2">cognome-b</font><font face="arial" size="2"><span style="font-weight: bold;">&nbsp; </span><span style="font-style: italic;">(per la sede di via Baldovinetti) - <br>per gli insegnanti che operano sulle due sedi: vedi lista)</span></font></p><p align="left"><font face="arial" size="2">
<input value="Invia" name="B1" type="submit"></font></p>
</form>

Devi sostituire il campo del form un txt in una select dinamica

Questa:

Codice:
<select name="NomeInsegnante">
<%
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("data.mdb")
%>
<% 
SQL = "Select * FROM NomeInsegnante"
Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Open SQL, Conn
Do While Not objRS.EOF
Response.write "<option name=""" & objRS("NomeInsegnante") & """>" & objRS("NomeInsegnante") & "</option>"  & vbCRLF

objRS.MoveNext
Loop

Response.write"</select>"

objRS.Close
Set objRS = Nothing
Conn.Close
Set Conn = Nothing

%>


Non serve altro sono due operazioni indipendenti, non c'è bisogno di relazioni fra le tabelle.

Valeria.
 
Grazie!
in questi giorni provo a modificare le pagine seguendo i tuoi consigli poi ti faccio sapere.
Sicuramente ti chiederò altre cose: questa applicazione che cerco di sviluppare per me non è affatto facile

L'unica cosa che mi anima di entusiasmo è che se riuscirò ad arrivare in fondo alla scuola non costerà un centesimo e sarà utile per gli utenti.
 
Funziona!!!!

Ho provato la modifica che mi hai suggerito: Ottimo!
Adesso funziona tutto a dovere.
Ancora due domande:
1. Alcuni colleghi mi segnalano che non è possibile correggere la prenotazione in caso di errore di battitura, ad esempio se si sbaglia a scrivere il cognome dello studente o la classe.
Sarebbe possibile inserire un tasto di preview? Tipo quelli dei forum che ti permettono di visualizzare il tuo intervento prima di spedirlo??

2. Considera che abbiamo circa 1000 studenti iscritti e che ai colloqui settimanali circa 6/700 genitori vorranno prenotare: il database fatto con access riuscirà a reggere il carico?

grazie ancora
T.
 
Ciao,

aggiunto l'anteprima che verrà visualizzata in PopUp a centro schermo.

Modulo invio Dati al DB e Anteprima:

Codice:
<script type="text/javascript">
function anteprima(ff){
larghezza = 600;
altezza = 400;
var x = (screen.width-larghezza-10)/2; 
var y = (screen.height-altezza)/2; 
window.open('','anteprima','width=' + larghezza + ',height=' + altezza + ',left=' + x + ',top=' + y);
oldAction = ff.action;
ff.target='anteprima'; 
ff.action='anteprima.asp'; 
ff.submit();
ff.action = oldAction;
}
</script>
<form method="post" action="inserisci.asp">
<p align="left"><font face="arial" size="2"><b>Nome cognome e classe dello studente/studentessa<br>
<input name="Cognome e classe" value="<%=request.form("Cognome e classe")%>" size="20" type="text"></b></font></p>
<p align="left"><font face="arial" size="2"><b>Email - di un genitore<br>
<input name="IndirizzoPostaElettronica" value="<%=request.form("IndirizzoPostaElettronica")%>" size="20" type="text"></b></font></p>
<p align="left"><font face="arial" size="2"><b>Telefono - di un genitore<br>
<input name="TelefonoCellulare" value="<%=request.form("TelefonoCellulare")%>" size="20" type="text"></b></font></p>
<p align="left"><font face="arial" size="2"><b>Cognome Insegnante con cui si desidera prenotare il colloquio</b><span style="font-weight: bold;"></span></font><font face="arial" size="2"><span style="font-weight: bold;"></span><b><br>
<select name="NomeInsegnante">
<%
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("data.mdb") 
SQL = "Select * FROM NomeInsegnante"
Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Open SQL, Conn
Do While Not objRS.EOF
Response.write "<option name=""" & objRS("NomeInsegnante") & """>" & objRS("NomeInsegnante") & "</option>"  & vbCRLF

objRS.MoveNext
Loop

Response.write"</select>"

objRS.Close
Set objRS = Nothing
Conn.Close
Set Conn = Nothing

%>
 
</b><br><span style="font-style: italic;">(specificare</span> <span style="font-weight: bold;">cognome-p </span><span style="font-style: italic;">(per la sede di via del Podestà);</span>&nbsp; </font><font style="font-weight: bold;" face="arial" size="2">cognome-b</font><font face="arial" size="2"><span style="font-weight: bold;">&nbsp; </span><span style="font-style: italic;">(per la sede di via Baldovinetti) - <br>per gli insegnanti che operano sulle due sedi: vedi lista)</span></font></p><p align="left"><font face="arial" size="2">
<input value="Invia" name="B1" type="submit"> <input type="button" value="Anteprima" onclick="anteprima(this.form)"></font></p>
</form>

Codice della popup pagina anteprima.asp

Codice:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title> Anteprima - Messaggio </title>
<style type="text/css">
.tabella { background-color: #d6d6d6; border: 1px solid #333333 }
.testo_messaggio { background-color: #0000ff; padding: 2px; font-family:verdana; font-weight: bold; margin-top: 1px; color: #ffffff ;text-align:center; }
.testi_inseriti { background-color: #fafafa }
</style>
</head>
<body bgcolor="#FFFFFF">
<div id="anteprima" style="display:block">
<div class="tabella">
<div class="testo_messaggio">Anteprima Messaggio</div>
<div class="testi_inseriti" style="padding: 6px;">
<%
aa=request.form("Cognome e classe")
bb=request.form("IndirizzoPostaElettronica")
cc=request.form("TelefonoCellulare")
dd=request.form("NomeInsegnante")
Response.Write "<font face=""Verdana"" size=""2"">Cognome e classe: " & Server.HTMLEncode(aa) & "</font>"
Response.write "<br>"
Response.Write "<font face=""Verdana"" size=""2"">IndirizzoPostaElettronica: " & Server.HTMLEncode(bb) & "</font>"
Response.write "<br>"
Response.Write "<font face=""Verdana"" size=""2"">TelefonoCellulare: " & Server.HTMLEncode(cc) & "</font>"
Response.write "<br>"
Response.Write "<font face=""Verdana"" size=""2"">NomeInsegnante: " & Server.HTMLEncode(dd) & "</font>"
%>
</div>
</div>
</div>
<br><br><br>
<div align="center">
<input type="button" value="Chiudi Anteprima" onclick="window.close()">
</div>

</body>
</html>

1. Fatto

2. Il codice deve essere scritto bene. Per adesso sto solo vedendo una pagina inserimento dati che non ha controlli lato server sui dati immessi, nei campi (a meno che non lo hai postato), i tuoi campi accettano codice html o javascript, nessun controllo fra lettere e numeri ecc...

bene mettere Server.HTMLEncode("nome_campo_sel_form"), per convertire i caratteri speciali, es; & diventa &amp; < &lt; ecc.. o fare un replace dei caratteri importanti e pericolosi.

Il database riuscirà a leggere il carico (ne ho fatto uno con oltre 200.000 record e 4 (quattro) campi circa 15MB, e molto utilizzato. Se troppe connessioni disturberanno le aperture e chiusure del db (non correttamente gestite) dagli utenti lo vedrai quando e se arriverà il messaggio d'errore. C'è anche il fattore Server. Stop.

Valeria.
 
Grazie valeria,
il problema dei controlli non me lo sono posto però è vero andrebbe previsto.
Comunque per il momento provo a risistemare le pagine con gli aggiornamenti che mi hai mandato poi ti faccio sapere.
 
Tutto funziona - un'ultima dritta: se volessi cancellare dei record da database?

questa è l'ultima che chiedo:

ho una pagina di amministrazione che restituisce tutti i dati immessi nel database.
Se però un utente sbaglia a inserire, vorrei poterli cancellare.

Posto il codice (non sono riuscito a racchiuderlo con #)

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

<%

Set objConn = Server.CreateObject("ADODB.Connection")

strConn = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("data/data.mdb")

objConn.Open strConn

Set objRs = Server.CreateObject("ADODB.Recordset")

set objRs = objConn.Execute("SELECT * FROM Contatti;")



Do while NOT objRs.EOF



response.write "Cognome = " & objRs("Cognome e classe") & "<br>"

response.write "E-mail = " & objRs("IndirizzoPostaElettronica") & "<br>"

response.write "Telefono = " & objRs("TelefonoCellulare") & "<br>"

response.write "Nome Insegnante = " & objRs("NomeInsegnante") & "<br>"

response.write "<hr size='1' color='midnightblue' width='40%' align='left'>"

objRs.Movenext

Loop



objRs.Close

Set objRs = Nothing

objConn.Close

Set objConn = Nothing

%>

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

Si può fare?
 
Ciao,

certo che si può fare

aggiungi alla pagina postata subito dopo Do while NOT objRs.EOF

Codice:
response.write "<a href=""cancella_record.asp?ID=" & objRs("id") & """>Cancella</a><br><br>"

Ora hai su ogni record della pagina un link chiamato cancella associato all'ID di quel campo

<a href="cancella_record.asp?ID=22">Cancella</a> dove 22 è l'id da cancellare, e sarà univoco per ogni record.

Pagina cancella_record.asp

Codice:
<%response.expires=0%>
<%
Set cn = Server.CreateObject("ADODB.Connection")
strDB = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("data/data.mdb")
cn.Open strDB
%>

<%
ID=request.QueryString("ID") ' recupero l'ID passato dalla precedente pagina
If ID = "" then ' se non è presente ID=N° 
	Response.Write("ID non valorizzato") ' stampo un messaggio
	Response.End ' blocco l'esecuzione del codice successivo
End If

  'Cancellazione del messaggio
  strSQL = "DELETE FROM Contatti WHERE ID = " & ID &";"
  'Esegue la query
  cn.Execute(strSQL) 
  cn.Close
  set cn = nothing
%>
<html>
<head>
<title> Eliminazione </title>
</head>
<body bgcolor="#FFFFFF">
<h3>Il Record <%=ID%> &egrave; stato eliminato</h3>
</body>
</html>

Valeria.
 
Incollando la stringa che mi hai suggerito ottengo il seguente errore:

ADODB.Recordset error '800a0cc1'

Item cannot be found in the collection corresponding to the requested name or ordinal.

/public/prenotazioni-online/prenota/check_connection.asp, line 10

Il mio database ha due tabelle:
1.Contatti - con i campi: ID - Cognome e classe - IndirizzoPostaElettronica - TelefonoCellulare - NomeInsegnante
2.NomeInsegnante- con i campi: ID - NomeInsegnante

Qualche idea?
 
Ho trovato!

L'errore risiedeva nel fatto che la stringa che mi avevi postato
Codice:
response.write "<a href=""cancella_record.asp?ID=" & objRs("id") & """>Cancella</a><br><br>"

definisce objRs("id")

mentre nella tabella contatti l'Id è chiamato IDContatto per cui ho variato in:

Codice:
response.write "<a href=""cancella_record.asp?ID=" & objRs("IDContatto") & """>Cancella</a><br><br>"

e...... Funziona a meraviglia!

Grazie
 
Troppo facile: ancora errorucci!

la pagina cancella_record.asp restituisce l'errore ID non valorizzato.

Allora: ho cambiato anche su quella pagina Id con IDContatto:

Codice:
<%response.expires=0%>
<%
Set cn = Server.CreateObject("ADODB.Connection")
strDB = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("data/data.mdb")
cn.Open strDB
%>

<%
ID=request.QueryString("IDContatto") ' recupero l'ID passato dalla precedente pagina
If ID = "" then ' se non è presente ID=N° 
	Response.Write("ID non valorizzato") ' stampo un messaggio
	Response.End ' blocco l'esecuzione del codice successivo
End If

  'Cancellazione del messaggio
  strSQL = "DELETE FROM Contatti WHERE ID = " & IDContatto &";"
  'Esegue la query
  cn.Execute(strSQL) 
  cn.Close
  set cn = nothing
%>
<html>
<head>
<title> Eliminazione </title>
</head>
<body bgcolor="#FFFFFF">
<h3>Il Record <%=IDContatto%> &egrave; stato eliminato</h3>
</body>
</html>

Perché non lo trova?
 
Perché non lo trova? E invece si!

Come sempre la pazienza non è una mia prerogativa.
Ho trovato la soluzione e la scrivo di seguito affinché possa essere utile a chi si trova come me a dover gestire le funzioni di eliminazione di un record con asp.

L'errore stava nella stringa:
Codice:
ID=request.QueryString("IDContatto") ' recupero l'ID passato dalla precedente pagina

che ho cambiato in

Codice:
IDContatto=request.QueryString("IDContatto") ' recupero l'ID passato dalla precedente pagina

IDContatto è il nome preciso del campo ID sulla mia tabella Contatti del database.

Ciao e buona Domenica a tutti.
 
Ciao,

se il recordset contatore non si chiama ID ma IDContatto nel link devi passare quel valore.

Codice:
response.write "<a href=""cancella_record.asp?ID=" & objRs("IDContatto") & """>Calcella</a><br><br>"

ID= è una variabile di assegnazione non un campo univoco.

basta modificare solo:

Codice:
strSQL = "DELETE FROM Contatti WHERE IDContatto = " & ID &";"

il resto rimane come scritto nell'esempio

al dato che passi puoi dare un nome qualsiasi es: pippo

Codice:
response.write "<a href=""cancella_record.asp?pippo=" & objRs("IDContatto") & """>Calcella</a><br><br>"

dopo cambi ID del precedente esempio con pippo

Codice:
<%
pippo=request.QueryString("pippo")
If pippo = "" then
	Response.Write("Pippo non valorizzato")
	Response.End
End If

  'Delete del messaggio
  strSQL = "DELETE FROM Contatti WHERE IDContatto = " & pippo &";"
  'Esegue la query
  cn.Execute(strSQL) 
  cn.Close
  set cn = nothing
%>
<html>
<head>
<title> Eliminazione </title>
</head>
<body bgcolor="#FFFFFF">
<h3>Il Record <%=pippo%> &egrave; stato eliminato</h3>
</body>
</html>

Per correttezza andrebbe inserito un controllo sul dato passato es: ID=100

se nella barra degli indirizzi scrivi un numero che non esiste es: 1000

hai come risposta il record 1000 è stato cancellato, ma il record 1000 non esiste

Codice:
<%response.expires=0%>
<%
Set cn = Server.CreateObject("ADODB.Connection")
strDB = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=d:\Sites\Pungo8\vale2\database\data.mdb"
cn.Open strDB
%>

<%
ID=request.QueryString("ID")
If ID = "" then
	Response.Write("ID non valorizzato")
	Response.End
End If

Set rs = Server.CreateObject("ADODB.Recordset")
strSQL="SELECT * FROM Contatti where IDContatto = " & ID &";" 
rs.Open strSQL,cn

if rs.EOF then 

response.write("<h3><center>Si sono verificati problemi durante la lettura della base dati.</center></h3><br><br>")
response.write("<h3><center>Il record <font color=""#0000FF"">" & ID & "</font> non esiste.</center></h3>")
response.end
end if

  'Delete del messaggio
  strSQL = "DELETE FROM Contatti WHERE IDContatto = " & ID &";"
  'Esegue la query
  cn.Execute(strSQL) 
  cn.Close
  set cn = nothing
%>
<html>
<head>
<title> Eliminazione </title>
</head>
<body bgcolor="#FFFFFF">
<h3>Il Record <%=ID%> &egrave; stato eliminato</h3>
</body>
</html>

Valeria.
 
Perfetto! Grazie.
La differenza tra la mia soluzione e la tua è che io "smanetto" e se ho fortuna trovo la soluzione mentre tu, da competente in materia, arrivi subito al cuore del problema.

Grazie molte ancora.

Adesso proverò a cimentarmi sulle opzioni di validation control del mio modulo di immissione dati.
Ma per favorire chi legge o ricerca sul forum questo argomento, aprirò una nuova discussione, ovviamente, solo dopo averci provato...........:byebye:
 

Discussioni simili