Newsgroup: it.comp.appl.access
Titolo: return senza gosub, ma non è mica vero

Ogni tanto mi capita l'errore in oggetto:
 
https://i.imgur.com/TEGPJ52.png
 
 
la cosa strana è che se procedo passo passo con F8 questo errore non si 
verifica.
 
ho notato cose strane anche per altri casi: errori senza spiegazione che 
*non* si presentano procedendo passo passo
 
nella vostra esperienza avete avuto modo di incappare nello stesso problema 
e magari di risolverlo?
 
nota bene: a parte alcune "View" e una tabella collegate via ODBC con un 
server (SQL), la maschera non implementa cose strane, è tutto un 
susseguirsi di calcoli (in effetti la procedura si chiama proprio 
"Calcoli"...) basati sulle 4 operazioni, per stabilire un prezzo di vendita 
di un prodotto partendo da un valore base e una serie di parametri
 
-- 
/-\ /\/\ /\/\ /-\ /\/\ /\/\ /-\ T /-\
-=- -=- -=- -=- -=- -=- -=- -=- - -=-
........... [ al lavoro ] ...........

 
 
un esempio breve breve: ci sono tre pulsanti: Save, Cancel, Delete
 
il Cancel chiude il form senza salvare i dati:
 
Private Sub Cancel_Click()
On Error GoTo Err_Cancel_Click
 
    ' Cancel = closes TMP without save
    DoCmd.Close
 
Exit_Cancel_Click:
    Exit Sub
 
Err_Cancel_Click:
    MsgBox Err.Description
    Resume Exit_Cancel_Click
 
End Sub
 
 
 
ebbene, oggi l'errore si presenta qui, in queste poche righe. Se metto un 
break point su  DoCmd.Close  e poi proseguo passo passo fa tutto alla 
perfezione
 
 
questo Form con un record temporaneo per le modifiche lo ottengo svuotando 
la tabella TMP (gemella di quella con i dati), copiandoci dentro i dati 
dalla tabella di memorizzazione e presentandoli a video, niente di strano.
 
 
 
 
Private Sub EditRecord_Click()
On Error GoTo Err_EditRecord_Click
 
' MODIFY RECORD
 
' if nothing is selected then exit
If IsNull(Me.CalcList) Then Exit Sub
 
'open linked tables
Dim DB As DAO.Recordset
Set DB = CurrentDb.OpenRecordset("SELECT * FROM [dbo_@A_DITTA_QCT] WHERE ID 
= " & Me.CalcList)
Dim DBDest As DAO.Recordset
Set DBDest = CurrentDb.OpenRecordset("SELECT * FROM TMP")
Dim IDD As Long
 
'clean table TMP
DoCmd.SetWarnings False
DoCmd.RunSQL "delete * from TMP"
DoCmd.SetWarnings True
 
'add new record in TMP
DBDest.AddNew
For i = 0 To DB.Fields.Count - 1
    Debug.Print i, DBDest(i).Name
    'assign values field by field
    DBDest(i) = DB(DBDest(i).Name)
Next i
'update record
DBDest![Flag] = True ' Modification
IDD = DBDest![IDSource]
DBDest.Update
DBDest.Close
DB.Close
 
'open form
DoCmd.OpenForm "frmQCT", acNormal, , "IDSource = " & IDD ' Me.CalcList
 
Exit_EditRecord_Click:
    Exit Sub
 
Err_EditRecord_Click:
    MsgBox Err.Description
    Resume Exit_EditRecord_Click
 
End Sub


 di un prodotto partendo da un valore base e una serie di parametri 
 
A me capita, saltuariamente ancora senza capire bene a cosa possa essere attribuibile, che il compilatore mi segnali Errori di Compilazione, tipo quello che hai tu ora in fase di COMPILE.
Chiaramente, nel mio caso ho appurato che non era presente alcun errore... 
L'unica procedura che mi rimuove il problema è IMPORTARE gli Oggetti in un nuovo applicativo.
Sempre nella mia siatuazione, e nel 100% dei casi dopo l'Import, il compile non genera alcuna segnalazione.
 
Temo si possa trattare di "corruzione" del sorgente... ma non saprei a cosa pensare, io peraltro ho alcuni applicativi con molto molto codice, anche complesso(parliamo di parecchie classi ed alcune decine di migliaia di righe di codice in totale con una 50ina di Moduli tra classi e Standard, ed altri diciamo nella norma ma queste anomalie si verificano su entrambe le casistiche.
 
Non so se poi questo possa essere anche il tuo scenario.
 
@Alex

 di un prodotto partendo da un valore base e una serie di parametri
 
Quindi Debug --> Compile Database non ti dà errore... esatto?
Hai l'Exit Sub prima dell'inizio della subRoutine?
 
Bruno

 
 
il codice è questo: perché dici *prima* dell'inizio?
 
 
Private Sub Cancel_Click()
On Error GoTo Err_Cancel_Click
 
    ' Cancel = closes TMP without save
    DoCmd.Close
 
Exit_Cancel_Click:
    Exit Sub
 
Err_Cancel_Click:
    MsgBox Err.Description
    Resume Exit_Cancel_Click
 
End Sub
 
 




>> Hai l'Exit Sub prima dell'inizio della subRoutine?
Pensavo tu avessi una subRoutine (che richiede in chiusura il Return),
invece hai un On Error Goto... cosa che non richiede il Return.
 
GoTo..., On Error GoTo..,. GoSub... sono tre cose un po' simili
nell'espressione ma molto diverse nell'esecuzione.
 
Bruno

 
 
è una subroutine: il goto all'interno resta comunque nella subroutine che 
poi si chiude sempre con un return o un exit sub (che per quanto ne so sono 
equivalenti)
 
potrei farmi la domanda sul resume: interrompe qualche flusso? vuota 
qualche stack? boh... il codice è quello generato in automatico dal wizard 
di access per il comando di chiusura form
 
 
 
Private Sub Cancel_Click()
On Error GoTo Err_Cancel_Click ' <<<<<<<<<<<<<< cinque righe sotto
 
    ' Cancel = closes TMP without save
    DoCmd.Close
 
Exit_Cancel_Click:
    Exit Sub
 
Err_Cancel_Click:
    MsgBox Err.Description
    Resume Exit_Cancel_Click
 
End Sub
 
 



Bruno