Descrizione oggetti

di il
10 risposte

Descrizione oggetti

Gli oggetti di access hanno diversi attributi: Data creazione, Data ultima modifica,  ecc… 

Questi attributi sono facilmente rintracciabili cliccando con il destro sull'oggetto e selezionando il menù “Proprietà oggetto”.

C'è anche la possibilità di modificare la Descrizione che è cosa ben diversa dal Nome dell'oggetto.

Tante di queste caratteristiche le trovo nella tabella di sistema MSysObjects ma non riesco a rintracciare la Descrizione.

Qualcuno sa come rintracciarla magari con qualche istruzione in VBA?

10 Risposte

  • Re: Descrizione oggetti

    28/11/2023 - Gianky ha scritto:


    Qualcuno sa come rintracciarla magari con qualche istruzione in VBA?

    Bisogna andare a cercare nella collection Properties.

    Qui trovi tutto già pronto

    https://extramiledata.com/get-the-name-and-description-of-all-ms-access-database-objects/

    Siccome non è un codice “segreto” o impossibile da scrivere, non credo ci siano problemi a riportarlo anche qui

    Public Sub AllDescriptions()
    ' This procedure finds the names and descriptions (from the property
    ' sheet) for all the types of objects in the database.  It creates results
    ' in the Immediate window, like "Form+frmOrdersEdit:Add/edit Orders data",
    ' where the object type = Form, object name = frmOrdersEdit, and the object
    ' description = Add/edit Orders data.
    
    ' You can copy the results to column A in an Excel workbook that has the
    ' following formulas to parse the list:
    ' Object Type =LEFT(A1,SEARCH("+",A1)-1)
    ' Object Name =RIGHT(LEFT(A1,SEARCH(":",A1)-1),LEN(LEFT(A1,SEARCH(":",A1)-1))-SEARCH("+",A1))
    ' Object Desc =RIGHT(A1,LEN(A1)-SEARCH(":",A1))
    
    ' AllDescriptions() Version 1.0.0
    ' Copyright © 2009 Extra Mile Data, www.extramiledata.com.
    ' For questions or issues, please contact [email protected].
    ' Use (at your own risk) and modify freely as long as proper credit is given.
    
    On Error GoTo Err_AllDescriptions
    
        Dim qdf As QueryDef
        Dim tdf As TableDef
        Dim obj As AccessObject
        Dim varProperty
        Dim strType As String
       
        ' Queries.
        For Each qdf In CurrentDb.QueryDefs
            If Left(qdf.Name, 1) <> "~" Then
                varProperty = ""
                varProperty = qdf.Properties("Description")
                Debug.Print "Query" & "+" & qdf.Name & ":" & varProperty
            End If
        Next qdf
       
        ' Tables.
        For Each tdf In CurrentDb.TableDefs
            If Left(tdf.Name, 4) <> "MSys" Then
                varProperty = ""
                varProperty = tdf.Properties("Description")
                ' Set the type based on whether or not the definition
                ' has a connect string, signifying that it is linked.
                If Len(tdf.Connect) > 0 Then
                    strType = "Table Link"
                Else
                    strType = "Table"
                End If
                Debug.Print strType & "+" & tdf.Name & ":" & varProperty
            End If
        Next tdf
       
        ' Pages.
        For Each obj In CurrentProject.AllDataAccessPages
            varProperty = ""
            varProperty = CurrentDb.Containers("DataAccessPages").Documents(obj.Name).Properties("Description")
            Debug.Print "Page" & "+" & obj.Name & ":" & varProperty
        Next obj
       
        ' Forms.
        For Each obj In CurrentProject.AllForms
            varProperty = ""
            varProperty = CurrentDb.Containers("Forms").Documents(obj.Name).Properties("Description")
            Debug.Print "Form" & "+" & obj.Name & ":" & varProperty
        Next obj
       
        ' Macros.
        For Each obj In CurrentProject.AllMacros
            varProperty = ""
            varProperty = CurrentDb.Containers("Scripts").Documents(obj.Name).Properties("Description")
            Debug.Print "Macro" & "+" & obj.Name & ":" & varProperty
        Next obj
       
        ' Modules.
        For Each obj In CurrentProject.AllModules
            varProperty = ""
            varProperty = CurrentDb.Containers("Modules").Documents(obj.Name).Properties("Description")
            Debug.Print "Module" & "+" & obj.Name & ":" & varProperty
        Next obj
       
        ' Reports.
        For Each obj In CurrentProject.AllReports
            varProperty = ""
            varProperty = CurrentDb.Containers("Reports").Documents(obj.Name).Properties("Description")
            Debug.Print "Report" & "+" & obj.Name & ":" & varProperty
        Next obj
       
    Exit_AllDescriptions:
        On Error Resume Next
        Exit Sub
       
    Err_AllDescriptions:
        Select Case Err.Number
        Case 3270
            ' There was no description property for this object.
            Resume Next
        Case Else
            MsgBox Err.Number & " " & Err.Description, vbCritical, "AllDescriptions"
            Resume Exit_AllDescriptions
        End Select
    
    End Sub

    Va a guardare anche le pagine di accesso ai dati che hanno avuto vita breve ed ora non sono più supportate.

    Forse c'è di meglio quanto a codice però questo è per dare concretezza alla prima riga della mia risposta.

    (edit del 29/11/2023: c'erano due If senza <>, errore di sintassi)

  • Re: Descrizione oggetti

    Sei sicuro Phil che la proprietà DESCRIPTION ci sia nell'oggetto Document che usi…?

    Secondo me no…

    Segui gli errori e vedrai che skippa sempre, ma questa è la riprova più veloce, usando questo ciclo un poco più stringato:

    Function ContainerObjectX()
        
        On Error Resume Next
        Dim ctrLoop  As DAO.Container
        Dim prpLoop  As DAO.Property
        Dim docLoop  As DAO.Document
        
        
        With DBEngine(0)(0)
            For Each ctrLoop In .Containers
                Debug.Print "CONTAINSER: " & ctrLoop.Name
                    
                For Each docLoop In ctrLoop.Documents
                    Debug.Print "  DOCUMENT: " & docLoop.Name
    '				Questo LOOP itera tutte le Properties dell'Oggetto Document, ma per l'esempio
    '				puntiamo solo alla Property Ricercata=Description...
    '                For Each prpLoop In docLoop.Properties
    '                   Debug.Print "      DOC_PROPERTY: " & prpLoop.Name & " = "; prpLoop
    '                Next
                    Debug.Print "      DOC_PROPERTY: Description = " & docLoop.Properties("Description")
                Next
            Next
        
        End With
    End Function

    Verai che stampa tutti i Container e Document, ma non trova alcuna “Description” come del resto nel tuo codice… il tutto a meno di errori grossolani…

  • Re: Descrizione oggetti

    29/11/2023 - @Alex ha scritto:

    Sei sicuro Phil che la proprietà DESCRIPTION ci sia nell'oggetto Document che usi…?

    Verai che stampa tutti i Container e Document, ma non trova alcuna “Description” come del resto nel tuo codice… il tutto a meno di errori grossolani…

    Oh… che dire, a parte il fatto che c'erano due errori di sintassi, che comunque erano ben evidenziati con il carattere rosso ed immediatamente risolvibili mettendo <>, ho fatto una verifica lampo con pochissimi oggetti su tabelle, query, maschere e report ed ha stampato la descrizione (ignorando gli oggetti di sistema)

    Anche il tuo codice funziona, ovviamente, visto che 

    28/11/2023 - Philcattivocarattere ha scritto:

    Forse c'è di meglio

    era riferito al tuo DocuScan che però non avevo il tempo di guardare e men che meno di pubblicare.

  • Re: Descrizione oggetti

    Chiarito l'arcano, la proprietà Description, non esiste di Default, viene creata quando si Valorizza la Descrizione, quindi nel caso l'oggetto puntato non abbia valorizzata la Descrizione, viene generato errore, stampato con il Print il Nome Oggetto ma non valorizzato nulla, in quanto il Resume Next fa stampare ugualmente…

    Esempio:

    ?AllDescriptions()
    Form+Maschera1:
    Module+cPoint:Pippo

    Come vedi facendo Debug la Form [Maschera1] mi ha generato Err=3270, come indicato nella nota sotto al tuo codice… mentre il Modulo [cPoint] ha scritto correttamente.

    Il Dubbio che avevo era che la Property “Description” fosse nelle Default quindi quando ho verificato e non la trovavo… mi sembrava strano… un poco di ruggine…

    Il Codice che usa direttamente la Collection Containers secondo me è più snello ma è un dettaglio.

  • Re: Descrizione oggetti

    Grazie ai vostri consigli sono riuscito a trarre quello che mi serviva:

    CurrentDb.QueryDefs(NomeQuery).Properties("Description")

    Ho visto anche il più generico CurrentDb.Containers.

    Ad esempio per leggere la descrizione di un Report: CurrentDb.Containers("Reports").Documents(NomeReport).Properties("Description")

    Esistono vari contenitori: DataAccessPages, Databases, Forms, Modules, Relationships, Reports, Scripts, SysRel e Tables.

    Manca solo il contenitore delle query che, per coerenza, poteva essere Queries.

    Sapete il motivo?

    Grazie a tutti.

  • Re: Descrizione oggetti

    Sinceramente non so il motivo per il quale manchino proprio le Queries, è così dagli anni 90,… tuttavia mi sento di fare una considerazione generale.

    Personalmente ritengo che nella Classe Containers, non dovrebbero esserci NE Tabelle NE queries, queste sono più specifice della parte DBENGINE che nel caso di Access purtroppo sono mischiate, quindi non è strano manchi QUERIES ma è assurdo ci sia TABLES.

    Questo perchè questi oggetti vengono gestiti dalla connessione DAO, e nulla dovrebbero avere a che fare con la parte CLIENT RESIDENTE che invece include gli oggetti tipici del Client.

    Chiaramente il ragionamento che espongo è ulteriormente supportato dalla Classe CurrentProject che come vedi non espone AllTables e AllQueries…

    Ora , nel dettaglio personalmente mi rivolgerei direttamente alle Classi Oggetto specifiche saltando la pur Comoda Classe Containers in quanto rappresenta un accrocchio sincronizzato locale, quindi andrei su Tabledefs/QueryDefs/Forms/Reports/Modules/Relations ecc…!

  • Re: Descrizione oggetti

    30/11/2023 - Gianky ha scritto:

    Manca solo il contenitore delle query che, per coerenza, poteva essere Queries.

    Manca, vero. Perché? non lo so (se non lo sa @Alex che ha quasi suggerito a Microsoft come fare Access, lo so io?)

    Ma le queries sono presenti in uno dei Container. Prova a dare ad una query lo stesso nome di una tabella.

  • Re: Descrizione oggetti

    30/11/2023 - Philcattivocarattere ha scritto:


    Prova a dare ad una query lo stesso nome di una tabella.

    Ottimo!!! Ho verificato. La query è vista (giustamente) come tabella e quindi è nel Container delle Tables.

    30/11/2023 - @Alex ha scritto:


    Ora , nel dettaglio personalmente mi rivolgerei direttamente alle Classi Oggetto specifiche saltando la pur Comoda Classe Containers in quanto rappresenta un accrocchio sincronizzato locale, quindi andrei su Tabledefs/QueryDefs/Forms/Reports/Modules/Relations ecc…!

    Spiegami meglio questo altro metodo. Diciamo che ho una query che si chiama “Q1”.
    Potrei fare: x = CurrentDb.Containers("Tables").Documents("Q1").Properties("Description")
    Oppure fare: x = CurrentDb.QueryDefs("Q1").Properties("Description")
    Oppure?

  • Re: Descrizione oggetti

    La seconda che hai scritto

  • Re: Descrizione oggetti

    OK. Grazie.

Devi accedere o registrarti per scrivere nel forum
10 risposte