Pulsante x ritorno a form principale

Anonimo
2022-09-29T13:16:35+00:00

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.

Microsoft 365 e Office | Access | Per il lavoro | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

domenico laurenza 9,900 Punti di reputazione Moderatore volontario
2022-10-04T10:38:27+00:00

Ciao,

abbiamo poche informazioni per darti consigli.

Sicuramente nel codice che hai postato devi limitarti a chiudere le sole maschere ed eventualmente le report ma non altri oggetti come tabelle, quey, moduli e macro.

Se vuoi approfondire, per poter effettuare FILTRI su di una maschera senza doverne aprire altre potresti avere una maschera di tipo popup a scelta obbligatoria o, in modo più sofisticato ma più complesso potresti valutare l'utilizzo delle Ribbon.

Ciao Mimmo

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

3 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2022-10-04T12:30:13+00:00

    Ciao,

    ok elimino dal codice tabelle, query, moduli e macro.

    per i filtri mi sono affidato ad una maschera divisa (facilmente comprensibile da chi è più abituato ad usare Excell) e ad un pulsante "apri maschera dove...", semplice e funzionale.

    Grazie

    Al.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2022-10-04T07:16:22+00:00

    Ciao,

    normalmente se posso evito anche io di utilizzare più maschere contemporaneamente, ma questa volta ho la necessità di evitare di ripetere una ricerca ed eventualmente di confrontare dati di dettaglio che da quella ricerca derivano.

    Chiudo tutto perché non sono particolarmente esperto, sopratutto di codice, e quindi un po' paranoicamente resetto la situazione quando torno alla maschera principale.

    Al.

    La risposta è stata utile?

    0 commenti Nessun commento
  3. domenico laurenza 9,900 Punti di reputazione Moderatore volontario
    2022-10-02T17:26:54+00:00

    Ciao,

    ti premetto che normalmente non utilizzo più maschere aperte ed attivabili in contemporanea.

    Guardando il tuo codice non capisco perché chiudi tabelle, query, macro e moduli. Io utilizzo solo le maschere nel frontEnd per l'utilizzatore del DB.

    Mimmo

    La risposta è stata utile?

    0 commenti Nessun commento