Newsgroup: it.comp.lang.visual-basic
Titolo: Gestione Errori: perchè va in loop?

ciao, premetto che ho cercato in lungo e in largo nel forum , nei
mallopponi di manuali che ho ecc.. ma tutti la stessa cosa, come del
resto ne sono convinto: gestione errore con On Error GoTo....
Teoricamente al rilevamento dell'errore dovrebbe saltare tutto il
codice compreso dall'errore fino al punto di rimando:
cioè:
_________________
codice...
On Error GoTo babbonatale
codice
Exit Sub
babbonatale:
qualcosa...
Resume Next...
_________
Mi ha sempre funzionato tranne quando ci son di mezzo le connessioni al
adatabase:....
questo è il mio codice:
__________________
Private Sub cmdSalva_Click()
On Error GoTo ErroreConnessione
    If Check1.Value = vbChecked Then
 ' CONTROLLO LA VALIDITA' DEI CAMPI
    If Len(Trim(txtNome.Text)) = 0 Then
        lblMessaggio.Caption = "Inserire il nome"
        txtNome.SetFocus
    ElseIf Len(Trim(TxtCognome.Text)) = 0 Then
        lblMessaggio.Caption = "Inserire il cognome"
        TxtCognome.SetFocus
    ElseIf Len(Trim(txtSigla.Text)) = 0 Then
        lblMessaggio.Caption = "Inserire la sigla"
        txtSigla.SetFocus
    Else ' SE TUTTE LE CONDIZIONI SONO STATE SODDISFATTE...
        Dim SQL As String      ' COMANDO SQL A SECONDA CHE SI TRATTI DI
UNA INSERT O DI UN UPDATE
        Dim conferma As String ' MESSAGGIO DI CONFERMA (SECONDO LO
STESSO CRITERIO DESCRITTO SOPRA)
       ' COME SOPRA...
s = Split(cmbseleziona.Text, "-->")
        Set cn = New ADODB.Connection
        Set rs = New ADODB.Recordset
        ' APRO LA CONNESSIONE
        cn.Open "driver={Microsoft Access Driver
(*.mdb)};dbq=GESDOC.mdb"
         ' ...ESEGUO L'UPDATE
            SQL = "UPDATE TUtenti SET " _
            & "Nome = '" & Replace(txtNome.Text, "'", "''") & "', " _
            & "Cognome = '" & Replace(TxtCognome.Text, "'", "''") & "',
" _
            & "Sigla = '" & Replace(txtSigla.Text, "'", "''") & "', " _
            & "Email = '" & Replace(txtEmail.Text, "'", "''") & "', " _
            & "Telefono = '" & Replace(txtTelefono.Text, "'", "''") &
"', " _
            & "Cellulare= '" & Replace(txtCellulare.Text, "'", "''") &
"'  Where IDUtente =  " & CInt(s(1))
            conferma = "Modifica effettuata con successo"
        ' ESEGUO REALMENTE IL COMANDO SQL CHE ARRIVA ALL'ESTERNO DELLA
CONDIZIONE
        cn.Execute (SQL)
        lblMessaggio.Caption = conferma
        cn.Close
        ' PULISCO E RICARICO LA COMBO BOX
        cmbseleziona.Clear
        Call Form_Load
    End If
  Else
  conferma = "Non sono consentite modifiche"
  lblMessaggio.Caption = conferma
 End If
 Exit Sub
ErroreConnessione:
MsgBox "database occupato...Riprova"
Resume Next
End Sub
_________________________________
Per generare l'errore apro la tabella del database in modalità
struttura in modo da avere il lock esclusivo...(uso access aimè)
Le mie domande a cui non trovo risposta da due setimane sono:
A) perchè in caso di errore mi apre più MsgBox?  ...mi sembra di
capire che se trova l'errore sulla connessione  e lo mando fuori
chiudendola, riesegue comunque la query..torna indietro? perchè?
Una volta loppati tutti gli errori mi rimane in stallo il form...e non
esegue più connessioni...anche se chiudo la tabella in access.... In
realtà la connessione non si è chiusa? è in loop la procedura?
non so più che fare...
scusate per il post lungo ma ho creduto giusto essere più preciso
possibile...

 realtà la connessione non si è chiusa? è in loop la procedura?
Non fossilizzarti sulle conseguenze, non serve a niente.
Una volta risolto il problema principale, se si presenta un altro problema 
cercherai soluzioni per questo.
Ciao 

 _________
Errr...visto cosi', (e visto anche il codice che hai postato dopo e che ho 
tagliato), mi stupirei se funzionasse.
Procedura:
Inizia l'elaborazione
Incontra l'errore
Salta nella parte di controllo degli errori
Elabora qualcosa
RIPARTE DALLA RIGA SUCCESSIVA A QUELLA DOVE SI ERA VERIFICATO L'ERRORE!
Spiegami che senso ha il codice che hai scritto: se trova un'errore, 
indipendentemente da qual'e', segnala all'utente che il DB e' occupato e poi 
riparte dalla riga successiva a quella dov'era l'errore, ovvero in un 
qualsiasi punto imprecisato della Sub...oltretutto prima della Form_Load 
nemmeno azzeri il controllo di errore, cosi' se avviene un errore in quella 
funzione il messaggio che ottieni e' "database occupato...Riprova" e poi 
esce dalla sub come se nulla fosse...

 RIPARTE DALLA RIGA SUCCESSIVA A QUELLA DOVE SI ERA VERIFICATO L'ERRORE!
Ecco!!! Non avevo ben chiaro il concetto di Resume Next!!! Azz!!!
Ora è tutto ok...ma il mio dubbio ora è un altro... Se io metto
all'inizio della sub il comando On Error GoTo.. , un modo per
controllare i diversi errori è dunque quello di intercettare i tipi di
errori in uscita e visualizzare un messaggio diverso a seconda del tipo
di errore giusto?