Gestione Errori - AccessGroup.it 2.0

Transcript

Gestione Errori - AccessGroup.it 2.0
Gestione Errori - AccessGroup.it 2.0
Scritto da SV Salvino Crucitti
Venerdì 05 Maggio 2006 00:00 - Ultimo aggiornamento Mercoledì 28 Aprile 2010 10:58
Uno degli aspetti più importanti nello sviluppo di un'applicazione consiste nella previsione
degli errori che possono verificarsi e nella successiva pianificazione di essi. Può capitare
durante l'esecuzione di un'applicazione che accadano degli eventi che non possono essere
previsti o evitati. Ad esempio che vengano accidentalmente cancellati dei record, che il
collegamento con il server di rete cada inaspettatamente o che ci sia il tentativo di eseguire
un'azione impossibile e non valida. In questi casi accadranno degli errori rilevabili solo in fase di
esecuzione. Per gestirli è necessario aggiungere un codice alle procedure per la gestione degli
errori.
Gli errori in Access a grandi linee sono di due tipi: gli errori di sintassi e gli errori di
esecuzione. Mentre per il primo tipo di errore, che avviene solo nella fase di scrittura di una
procedura in un modulo e che è rilevabile tramite la compilazione del codice, il secondo avviene
durante l'esecuzione dell'aplicazione. A questo ci riferiamo e per prevenirlo aggiungeremo alla
nostra applicazione la gestione degli errori.
A seconda della posizione dell'errore abbiamo queste possibilità:
1) Aggiungere il codice nell'evento "On Error" della maschera o report;
2) Inserire una istruzione On Error e il codice di gestione degli errori nella procedura.
In entrambi i casi è necessario identificare con il codice di errore corrispondente l'errore che si
vuole gestire. Generalmente si dichiara una costante che rappresenta il codice di errore e si fa
riferimento all'errore tramite la costante. Per visualizzare i codici di errore bisogna creare una
Tabella degli errori che contenga tutti i codici di errore e i messaggi ad essi associati.
Nota E' bene sempre riferirsi al codice dell'errore e non alla descrizione dell'errore per evitare
problemi con la versione di Access o con la localizzazione.
Con la seguente procedura si crea la tabella degli errori di VBA:
Sub GeneraTabellaErroriVBA() 'Genera tabella errori VBA
Dim DB As DAO.Database
Dim TabErr As DAO.TableDef
Dim rst As DAO.Recordset
Dim codErr As Long
Dim strErrore As String
Set DB = CurrentDb
Set TabErr = DB.CreateTableDef("TabellaErroriVBA")
With TabErr
.Fields.Append .CreateField("CodiceErrori", dbLong)
.Fields.Append .CreateField("StringaErrore", dbText)
End With
1/5
Gestione Errori - AccessGroup.it 2.0
Scritto da SV Salvino Crucitti
Venerdì 05 Maggio 2006 00:00 - Ultimo aggiornamento Mercoledì 28 Aprile 2010 10:58
DB.TableDefs.Append TabErr
Set rst = DB.OpenRecordset("TabellaErroriVBA", dbOpenTable)
For codErr = 1 To 1000
On Error Resume Next
DoCmd.Hourglass True
strErrore = Error(codErr)
If strErrore <> &quot;&quot; Then
If strErrore <> &quot;Errore definito dall'applicazione o dall'oggetto&quot; Then
rst.AddNew
rst(&quot;CodiceErrori&quot;) = codErr
rst(&quot;StringaErrore&quot;) = strErrore
rst.Update
End If
End If
Next codErr
rst.Close
DoCmd.Hourglass False
MsgBox &quot;Tabella errori creata&quot;
End Sub
Nota Nell'help in linea trovi il codice in ADO
Con quest'altra quella di Access e del Jet:
Sub GeneraTabellaErrori_A_J() 'Genera tabella errori Access/Jet
Dim DB As DAO.Database
Dim TabErr As DAO.TableDef
Dim rst As DAO.Recordset
Dim codErr As Long
Dim strErrore As String
Set DB = CurrentDb
Set TabErr = DB.CreateTableDef(&quot;TabellaErrori_Acc_Jet&quot;)
With TabErr
.Fields.Append .CreateField(&quot;CodiceErrori&quot;, dbLong)
2/5
Gestione Errori - AccessGroup.it 2.0
Scritto da SV Salvino Crucitti
Venerdì 05 Maggio 2006 00:00 - Ultimo aggiornamento Mercoledì 28 Aprile 2010 10:58
.Fields.Append .CreateField(&quot;StringaErrore&quot;, dbText)
End With
DB.TableDefs.Append TabErr
Set rst = DB.OpenRecordset(&quot;TabellaErrori_Acc_Jet&quot;, dbOpenTable)
For codErr = 1 To 32767
On Error Resume Next
DoCmd.Hourglass True
strErrore = AccessError(codErr)
If strErrore <> &quot;&quot; Then
If strErrore <> &quot;Errore definito dall'applicazione o dall'oggetto&quot; Then
rst.AddNew
rst(&quot;CodiceErrori&quot;) = codErr
rst(&quot;StringaErrore&quot;) = strErrore
rst.Update
End If
End If
Next codErr
rst.Close
DoCmd.Hourglass False
MsgBox &quot;Tabella errori creata&quot;
End Sub
Nota Nell'help in linea trovi il codice in ADO
L'istruzione On Error
Gli errori di esecuzione del VBA possono essere gestiti aggiungendo una istruzione On Error
e un codice di gestione degli errori alle procedure. E' noto che se utilizziamo
l'Autocomposizione per una qualche procedura evento Access automaticamente include una
istruzione
On Error
e i codici della gestione degli errori.
Supponiamo di creare un pulsante con l'autocomposizione a cui associamo l'apertura di una
maschera.
Private Sub Comando0_Click()
On Error GoTo Err_Comando0_Click
3/5
Gestione Errori - AccessGroup.it 2.0
Scritto da SV Salvino Crucitti
Venerdì 05 Maggio 2006 00:00 - Ultimo aggiornamento Mercoledì 28 Aprile 2010 10:58
Dim stDocName As String
stDocName = &quot;Maschera1&quot;
DoCmd.OpenForm stDocName
Exit_Comando0_Click:
Exit Sub
Err_Comando0_Click:
MsgBox Err.Description
Resume Exit_Comando0_Click
End Sub
Nel codice dell'esempio On Error attiva la gestione degli errori. Se si verifica un errore il
controllo della procedura salta all'etichetta di riga
Err_Coma
ndo0_Click:
che sta ad indicare l'inizio del codice della gestione degli errori. Il primo rigo è un messaggio
che visualizza la stringa del messaggio di errore. Dopo si passa alla successiva istruzione
Resume
che ci permette di uscire dal codice di gestione dell'errore passando a
Exit_Comando0_Click:
che con l'istruzione
Exit Sub
ci fa uscire dalla procedura Comando0_Click.
Se non si verificano errori, vengono eseguite tutte le righe della procedura fino all'istruzione E
xit Sub
e pertanto il codice della gestione degli errori che succede ad
Err_Comando0_Click:
non viene eseguito.
Resume o Resume Next
Schematicamente abbiamo questa differenza:
4/5
Gestione Errori - AccessGroup.it 2.0
Scritto da SV Salvino Crucitti
Venerdì 05 Maggio 2006 00:00 - Ultimo aggiornamento Mercoledì 28 Aprile 2010 10:58
L'utilizzo
di
a Supponiamo
partire
dall'istruzione
che
èargomento
quello,
l'ha
generato,
pertanto
di
mentre
effettuare
una
correzione,
riprendendo
lamobile
Resume
Next
consente
che
l'ha
generato.
il 0
prosieguo
del
codice
senza
correggere
eduna
eseguire
nuovamente
il procedura
codice
diversi
diverso
numeratore
otterrà
l'errore
da
ed
eResume
ilroutine
di
ilErroriAccessJet
denominatore
denominatore
voler
gestire
Se
poi
la
èsono
0
divisione
ilThen
si
numeratore
entrambi
verificherà
tra
0
non
l'errore
e5numeri.
sil'errore
è&quot;:
effettua
numerico
[Divisione
Sappiamo
potrano
divisione
per
che
zero],
essere
se
a mentre
ilvirgola
numeratore
visualizzati
se
il èsi
Function
DivNumb(Num
As
Long,
Denom
As
Long)
As
Variant
On
Error
GoTo
GestErr
'Nella
tabella
leggo
i impostazione
codici
'Divisione
zero
=6gestione
'Overflow
6[Overflow].
'Chiamata
di
o11
non
valido
=l'istruzione
Num
/=
Denom
Exit
Function
GestErr:
If
Err
=la
11
Or
Err
Or
Err
=
5passa
DivNumb
=per
Null
Else
MsgBox
&quot;Errore
non
previsto
&quot;
&due
Err
&
&quot;
&possono
Error
Ifmessaggi.
Resume
Next
End
Function
Nel
codice
sopra
descritto
notiamo
tre
passaggi:
della
1)
Attivazione
procedura
in
della
caso
di
errore.
errori
Notiamo
e
che
del
punto
da
cui
continuare
l'esecuzione
On
Error
errori
e
indirizza
alla
attiva
la
gestione
degli
[GestErr]
procedura
2)
attivato.
Codice
in
gestione
un
certo
degli
momento
errori
che
risponda
al
codice
a
tutti
getione
gli
errori
degli
che
errori,
si
l'intercettazione
prevedere.
dell'errore
Selabel
ladi
Il
codice
gestione
degli
errori
utilizza
l'istruzione
del
tipo
If..Then..Else
che
verifica
il
valore
Err
,è
che
a
sua
volta
restituisce
il
codice
dell'errore
del
VBA.
3)
Uscita
del
codice
di
gestione
degli
errori.
In
questo
passaggio
l'istruzione
Resume
Next
passa
questo
il
caso
controllo
della
procedura
all'istruzione
successiva
a
quella
in
cui
è
avvenuto
l'errore:
Function
.Exit
L'istruzione
Resume
Next
che
l'operazione
inizi
nuovamente.
èeutilizzata
anche
nel
caso
indell'istruzione
cui
si
effettua
un
ciclo
einAccess
si
desidera
Gli
imprevisti
On
Error
attiva
l'intercettazione
degli
errori.
L'uscita
della
procedura
o
On
Error
Go
To
disattiva
esecuzione,
degli
errori
l'intercettazione.
non
ma
sia
una
attivato.
intercettazione
Quando
una
può
intercettazione
essere
attiva
anche
è
attiva
se
c'è
tutto
una
il
parte
codice
di
di
codice
intercettazione
che
è0va
inin
Per
momento
ritroso
gestione
messaggio
Supponiamo
ns.
e
comodità
cerca
errori
sospese.
e
l'esecuzione
in
che
di
B
le
avere
si
e
Se
chiamiamo
poi
trova.
avviene
una
in
verrà
A,
Se
procedura
non
A,
un
in
interrotta.
B,
questo
errore
esiste
C.
che
Se
nella
percorso
alcun
Se
è
richiami
in
invece
C
esecuzione
codice
e
non
a
una
attiviamo
ritroso
esiste
gestione
seconda
la
sarà
una
C,
una
errori
la
eseguito
e
gestione
gestione
questa
A
e
Access
la
B
il
richiami
errore
codice
sono
errori
esce
con
della
una
fuori
quel
terza.
prima
con
a
un
On
Error
l'esecuzione
continuerà
da
quel
punto
e
poi
l'esecuzione
Resume
o
Next
ci
permetterà
di
gestire
secondo
questi
criteri:
a)
Con
Resume
A
include
un
codice
si
di
fa
gestione
una
chiamata
errori
attivo
alla
procedura
contenente
che
segue
nel
percorso.
In
questo
caso
se
Resume
procede
chiamando
B.
l'esecuzione
b)
Next
eseguita.
In
questo
caso
l'esecuzione
se
A
include
torna
un
codice
alla
successiva
di
gestione
istruzione
errori
attivo
dell'ultima
contenente
istruzione
Resume
Next
l'esecuzione
ritorna
all'istruzione
successiva
alla
chiamata
alla
procedura
B.
gestione
imprevisti.
Ricordiamo
errori
che
attivato
l'istruzione
e
non
nella
eseguita
procedura
si
trova
in
sempre
cui
avviene
nella
l'errore.
procedura
Questo
dove
per
c'è
evitare
il
codice
degli
di
Utilizzando
Resume
errore
è
tra
quelli
non
previsti.
può
accadere
In
aiuto
che
ci
viene
una
procedura
la
clausola
venga
eseguito
all'infinito
se
l'ultimo
Else.
Nota
versione
ad
32767,
aumentare.
per
Invengono
MS
evitare
Access
Perdefiniti
conflitti
generare
nonnuovi
con
vengono
errori
future
errori,
personalizzati
utilizzati
versioni.
pertanto
tuttiil numero
iconviene
codici didei
errore
iniziarne
codicia di
disposizione.
laerrore
numerazione
interni
Inèogni
dal
destinato
numero
SEO
by
Artio
5/5