Errore 2450 alla chiusura del database

di il
9 risposte

Errore 2450 alla chiusura del database

Mi trovo con il problema in oggetto alla chiusura del database FE accdb: esce il messaggio "2450 Microsoft access: impossibile trovare la maschera 'frmOCordini'. Eppure la maschera c'e' ed e' funzionante.

Ho provato a cancellare la form e reimportarla da un backup. ma non ho risolto. Volevo evitare di ricostruire la form da zero perche' c'e' tanto lavoro...

Ho provato a debuggare cercando quale routine genera questo errore, ma non sono riuscito a trovarla.

C'e' un modo per mostrare nel MsgBox il pulsante Debug?

Premetto che, chiusa la Msgbox con l'errore, il Db si chiude e alla riapertura funziona tutto.

qualche spunto su cui lavorare?

Grazie in anticipo

9 Risposte

  • Re: Errore 2450 alla chiusura del database

    Sicuro di non aver inserito da qualche parte un evento unload o close

  • Re: Errore 2450 alla chiusura del database

    Ciao, 

    provo a provare questa cosa ?

    1. Apri l'FE tenendo premuto lo shift
    2. Senza eseguire il codice, (senza fare nulla) chiudi l'FE
    3. Verifica se ti restituisce errore
  • Re: Errore 2450 alla chiusura del database

    Prima di partire per DEBUG avanzati, proverei a creare un Accdb nuovo ed importerei tutto compili e vedi se lo fa ancora.

    Purtroppo qualche volta si corrompe qualche cosa e questi fantasmi si generano.

    Se persiste, io ti suggerirei di esportare tutte le form ed i moduli come file di testo... c'è una funzione nascosta per farlo SaveAsText... a quel punto con un editor di testo evoluto Notepad++ cerchi nella cartella in tutti i file che contengono il nome della Maschera chiamata e trovi facilmente dove sta il problema...

    Attento a non pensare di esportare solo la parte codice... sarebbe un errore... se esporti cone ti ho indicato includi anche le chiamate inserite come ControlSource o Object properties... è completo.

    Io mi ero fatto una funzione che esportava Forms/Modules in poche righe si fa...

    Questo lo riporto copiato.... ma mi pare banale e semplice da usare(è formattato male... colpa del copy/paste):

    Option Compare Database
             Option Explicit
    
      Private Const VB_MODULE               As Integer = 1
      Private Const VB_CLASS                As Integer = 2
      Private Const VB_FORM                 As Integer = 100
      Private Const EXT_TABLE               As String = ".tbl"
      Private Const EXT_QUERY               As String = ".qry"
      Private Const EXT_MODULE              As String = ".bas"
      Private Const EXT_CLASS               As String = ".cls"
      Private Const EXT_FORM                As String = ".frm"
      Private Const CODE_FLD                As String = "code"
    
      Private Const mblnSave                As Boolean = True               ' False: just generate the script
    '
    '
    
    Public Sub saveAllAsText()
    
                Dim oTable                  As TableDef
                Dim oQuery                  As QueryDef
                Dim oCont                   As Container
                Dim oForm                   As Document
                Dim oModule                 As Object
                Dim FSO                     As Object
            
                Dim strPath                 As String
                Dim strName                 As String
                Dim strFileName             As String
        
    '**
        On Error GoTo errHandler
        
        strPath = CurrentProject.path
        Set FSO = CreateObject("Scripting.FileSystemObject")
        strPath = addFolder(FSO, strPath, Application.CurrentProject.name & "_" & CODE_FLD)
        strPath = addFolder(FSO, strPath, Format(Date, "yyyy.mm.dd"))
    
        
        For Each oTable In CurrentDb.TableDefs
            strName = oTable.name
            If left(strName, 4) <> "MSys" Then
                strFileName = strPath & "\" & strName & EXT_TABLE
                If mblnSave Then Application.ExportXML acExportTable, strName, strFileName, strFileName & ".XSD", strFileName & ".XSL", , acUTF8, acEmbedSchema + acExportAllTableAndFieldProperties
                Debug.Print "Application.ImportXML """ & strFileName & """, acStructureAndData"
            End If
        Next
        
        For Each oQuery In CurrentDb.QueryDefs
            strName = oQuery.name
            If left(strName, 1) <> "~" Then
                strFileName = strPath & "\" & strName & EXT_QUERY
                If mblnSave Then Application.SaveAsText acQuery, strName, strFileName
                Debug.Print "Application.LoadFromText acQuery, """ & strName & """, """ & strFileName & """"
            End If
        Next
        
        Set oCont = CurrentDb.Containers("Forms")
        For Each oForm In oCont.Documents
            strName = oForm.name
            strFileName = strPath & "\" & strName & EXT_FORM
            If mblnSave Then Application.SaveAsText acForm, strName, strFileName
            Debug.Print "Application.LoadFromText acForm, """ & strName & """, """ & strFileName & """"
        Next
        
        strPath = addFolder(FSO, strPath, "modules")
        For Each oModule In Application.VBE.ActiveVBProject.VBComponents
            strName = oModule.name
            strFileName = strPath & "\" & strName
            Select Case oModule.Type
                Case VB_MODULE
                    If mblnSave Then oModule.Export strFileName & EXT_MODULE
                    Debug.Print "Application.VBE.ActiveVBProject.VBComponents.Import """ & strFileName & EXT_MODULE; """"
                Case VB_CLASS
                    If mblnSave Then oModule.Export strFileName & EXT_CLASS
                    Debug.Print "Application.VBE.ActiveVBProject.VBComponents.Import """ & strFileName & EXT_CLASS; """"
                Case VB_FORM
                    ' Do not export form modules (already exported the complete forms)
                Case Else
                    Debug.Print "Unknown module type: " & oModule.Type, oModule.name
            End Select
        Next
        
        If mblnSave Then MsgBox "Files saved in  " & strPath, vbOKOnly, "Export Complete"
    
    Exit Sub
    
    errHandler:
        MsgBox "Error " & Err.Number & ": " & Err.Description & vbCrLf
        Stop: Resume
    
    End Sub
    '
    
    '
    ' Create a folder when necessary. Append the folder name to the given path.
    '
    Private Function addFolder(ByRef FSO As Object, ByVal strPath As String, ByVal strAdd As String) As String
        addFolder = strPath & "\" & strAdd
        If Not FSO.FolderExists(addFolder) Then MkDir addFolder
    End Function
    '
    
  • Re: Errore 2450 alla chiusura del database

    01/02/2025 - @Alex ha scritto:

    Prima di partire per DEBUG avanzati, proverei a creare un Accdb nuovo ed importerei tutto compili e vedi se lo fa ancora.

    Condivido ma prima ancora di partire con un accdb nuovo io proverei a decompilare, compattare e ricompilare l'accdb esistente (magari per ulteriore sicurezza proverei su una copia).

    Per decompilare un accdb occorre utilizzare l'opzione /decompile all'apertura del file accdb.

    Con la strategia proposta, finora, non ho mai avuto la necessità di importare tutto in un nuovo accdb ... però penso che qualche volta sia necessario.

  • Re: Errore 2450 alla chiusura del database

    Grazie a tutti per i preziosi suggerimenti. 

    Avevo gia' provato le soluzioni di decompilare e ricompilare, oltre al compatta e ripristina ma non avevo risolto. 

    Questa mattina o verificato di nuovo tutte le routines del codice ed ho trovato (credo...) l'inghippo che mi era sfuggito.

    31/01/2025 - Antony73 ha scritto:

    Sicuro di non aver inserito da qualche parte un evento unload o close

    Su evento close di una form avevo un requery di un controllo all'interno della form incriminata:

    Private Sub Form_Close()
    On Error GoTo Err_handler
    
    	Forms!frmOCordini!sfrmDOdettagliordineacquisto.Form!sfrmDOcboNUMtabDOIDtabEVid.Requery
    ...

    Ho sostituito con questo:

    ...
    If CurrentProject.AllForms("frmOCordini").IsLoaded Then
           Forms!frmOCordini!sfrmDOdettagliordineacquisto.Form!sfrmDOcboNUMtabDOIDtabEVid.Requery
    End If
    ...

    Ho fatto diverse simulazioni e non ha piu' dato l'errore. 

    Quindi, cliccando sulla "x"  della label della form, questa non si chiude? Perche' l'evento close non accade...

  • Re: Errore 2450 alla chiusura del database

    Non ho capito se fai una ulteriore domanda o cosa...

    Un suggerimento, io di base non metto mai riferimenti esterni in maschere, proprio perchè di tendenza il rischio di non ricordare dove si spalmano... è troppo.

    Come mai su Close fai questa cosa...?

  • Re: Errore 2450 alla chiusura del database

    03/02/2025 - @Alex ha scritto:

    Non ho capito se fai una ulteriore domanda o cosa...

    Si', e' solo un chiarimento per mia conoscenza personale: chiedevo perche' non si verifica l'evento Close della form quando la chiudo con la "X" della label

    03/02/2025 - @Alex ha scritto:

    Come mai su Close fai questa cosa...?

    Era una routine che avevo creato perche', da una form, aprivo una seconda form, poi alla chiusura di quest'ultima facevo il requery di un controllo.

    Rivedendo il codice, mi sono accorto che non serve piu' perche' adesso la form la apro, con doppio click sul controllo stesso, in modalita' acdialog e faccio il requery nella stessa routine.

  • Re: Errore 2450 alla chiusura del database

    03/02/2025 - Mailman ha scritto:

    03/02/2025 - @Alex ha scritto:

    Non ho capito se fai una ulteriore domanda o cosa...

    Si', e' solo un chiarimento per mia conoscenza personale: chiedevo perche' non si verifica l'evento Close della form quando la chiudo con la "X" della label

    Ho provato e se in una Form Valrizzo l'evento CLOSE, ed UNLOAD si scatenano entrambi chiudendo la [X].

    03/02/2025 - @Alex ha scritto:

    Come mai su Close fai questa cosa...?

    Era una routine che avevo creato perche', da una form, aprivo una seconda form, poi alla chiusura di quest'ultima facevo il requery di un controllo.

    Rivedendo il codice, mi sono accorto che non serve piu' perche' adesso la form la apro, con doppio click sul controllo stesso, in modalita' acdialog e faccio il requery nella stessa routine.

    Perchè non hai aperto la 2° maschera in modalità scelta obbligatoria [acDialog], che rende la Form SINCRONA alla chiamante, quindi dopo l'openForm nella Chiamante metti il Requery dell'oggetto presente nella Form chiamante... questa è la tecnica corretta proprio per non distribuire dipendenze tra le form.

    Oppure, altra soluzione se non ti piace la PopupObbligatoria con acDialog, dichiari un oggetto Form con Private WithEvents ed erediti l'evento Close, e su quello fai il Requery e tutto resta nella Form Chiamante.

    Una cosa simile per semplificare, si chiama Incapsulamento se non erro :

    Option Compare Database
    Option Explicit
    
    Private WithEvents eF As Access.Form
    
    Private Sub ComandoAperturaFormEsterna_Click()
        DoCmd.OpenForm "FormEsterna"
        Set eF = Forms!Splash
        eF.OnClose = "[Event Procedure]"
    End Sub
    
    Private Sub eF_Close()
        MsgBox "LA FORM ESTERNA SI E' CHIUSA"
        ' Questo è il punto in cui fare il Requery...
    End Sub

    Io ho una Classe dedicata che consente sia la MultiIstanza che questi giochetti... 

  • Re: Errore 2450 alla chiusura del database

    03/02/2025 - @Alex ha scritto:

    Una cosa simile per semplificare, si chiama Incapsulamento se non erro :

    Option Compare Database
    Option Explicit
    
    Private WithEvents eF As Access.Form
    
    Private Sub ComandoAperturaFormEsterna_Click()
        DoCmd.OpenForm "FormEsterna"
        Set eF = Forms!Splash
        eF.OnClose = "[Event Procedure]"
    End Sub
    
    Private Sub eF_Close()
        MsgBox "LA FORM ESTERNA SI E' CHIUSA"
        ' Questo è il punto in cui fare il Requery...
    End Sub

    Io ho una Classe dedicata che consente sia la MultiIstanza che questi giochetti... 

    Grazie @Alex sempre molto interessanti i Tuoi suggerimenti. Avevo optato per la soluzione dell'apertura Form in modalita' "acDialog", ma quest'ultima mi piace di piu'. Provo ad implementare

Devi accedere o registrarti per scrivere nel forum
9 risposte