buongiorno a tutti
ampliando un database che ho creato qualche tempo fa mi sono trovato nella condizione di dover cambiare alcuni "automatismi" che avevo creato per velocizzare l'aggiornamento dei dati di una maschera: una query di aggiornamento era richiamata da macro in risposta ad alcune azioni nella maschera peincipale ed altre due query da un'altra macro per alcuni eventi nella sottomaschera; entrambe le macro venivano richiamate sugli eventi su disattivazione, su scaricamento e su chiusura della maschera e della sottomaschera.
Con il tempo è sorta la necessità di operare su più maschere aperte (ricerca dati, modifica etc.) e quindi ho realizzato un pulsante che potesse chiudere tutto e tornare alla maschera principale quando necessario; però questo ha creato un problema: alla chiusura della maschera di cui sopra si generava un errore "comando o azione 'SalvaRecord' attualmente non disponibile". Con un po' di fatica ho capito (spero) che l'errore era generato dalle due macro che tentavano di salvare le modifiche a maschera chiusa.
Alla fine per risolvere il problema ho eliminato l'esecuzione delle macro dagli eventi: su disattivazione, su scaricamento e su chiusura della maschera erelativa sottomaschera ed ho messo insieme questo codice, mettendoci un po' di mio e unpo' di ricera sulla rete, e l'idea è : se la maschera è aperta esegui le query altrimenti chiudi tutto e poi apri la maschera che mi interessa.:
Private Sub Torna_a_INTRO_Click()
If CurrentProject.AllForms("M_UPS").IsLoaded Then
DoCmd.SetWarnings False
DoCmd.Echo False, ""
DoCmd.OpenQuery "Q_agg_stime_autonomia", acViewNormal, acEdit
DoCmd.OpenQuery "Q_1costi_sm_batterie", acViewNormal, acEdit
DoCmd.OpenQuery "Q_2costi_sm_batterie", acViewNormal, acEdit
DoCmd.RunCommand acCmdSaveRecord
DoCmd.SetWarnings True
DoCmd.Echo True, ""
End If
Dim aob As AccessObject
With CurrentData
' "Tables"
For Each aob In .AllTables
If aob.IsLoaded Then
DoCmd.Close acTable, aob.Name, acSaveYes
End If
Next aob
' "Queries"
For Each aob In .AllQueries
If aob.IsLoaded Then
DoCmd.Close acQuery, aob.Name, acSaveYes
End If
Next aob
End With
With CurrentProject
' "Forms"
For Each aob In .AllForms
If aob.IsLoaded Then
DoCmd.Close acForm, aob.Name, acSaveYes
End If
Next aob
' "Reports"
For Each aob In .AllReports
If aob.IsLoaded Then
DoCmd.Close acReport, aob.Name, acSaveYes
End If
Next aob
' "Pages"
For Each aob In .AllDataAccessPages
If aob.IsLoaded Then
DoCmd.Close acDataAccessPage, aob.Name, acSaveYes
End If
Next aob
' "Macros"
For Each aob In .AllMacros
If aob.IsLoaded Then
DoCmd.Close acMacro, aob.Name, acSaveYes
End If
Next aob
' "Modules"
For Each aob In .AllModules
If aob.IsLoaded Then
DoCmd.Close acModule, aob.Name, acSaveYes
End If
Next aob
End With
DoCmd.OpenForm "INTRO", acNormal, , , acWindowNormal
End Sub
Ho fatto una prova su una copia del db e mi sembra che funzioni a dovere, però non essendo esperto di programmazione avrei piacere che qualcuno che se ne capisce ci desse un'occhiata prima di trascrivere il codice sulla copia "buona"... Per evitare disastri.
Grazie
Al.