Meaning of MsysObjects values -32758, -32757 and 3 (Microsoft Access)

前端 未结 5 1659
忘了有多久
忘了有多久 2020-12-05 21:16

I\'m quering the table MsysObjects for making a list of the objects in my database:

SELECT MsysObjects.Name, MsysObjects.Type
FROM MsysObjects
WHERE (((Left$         


        
相关标签:
5条回答
  • 2020-12-05 21:33

    Re David Fenton's proper answer above, here is Microsoft documentation of those techniques. There appear to be two distinct object models for Access:

    • Data access object model:
      • Database object has properties TableDefs and QueryDefs, which are collections of all the tables and queries in the database.
    • Access object model:
      • CurrentData object has properties AllTables and AllQueries, which are collections of all the tables and queries in the database, with different sets of properties than TableDefs and QueryDefs have.
      • CurrentProject object has properties AllForms, AllReports, AllMacros, and AllModules, which are collections of those objects.
    0 讨论(0)
  • 2020-12-05 21:36

    I'd tend to avoid mucking about with the system tables. For one, temporary objects can show up there and confuse things. To get the same information, you can use:

      CurrentDB.TableDefs
      CurrentDB.QueryDefs
      CurrentProject.AllForms
      CurrentProject.AllReports
      CurrentProject.AllMacros
    

    That's the documented way to get the information. Depending on undocumented system tables is not recommended.

    0 讨论(0)
  • 2020-12-05 21:47
    Type   TypeDesc
    -32768  Form
    -32766  Macro
    -32764  Reports
    -32761  Module
    -32758  Users
    -32757  Database Document
    -32756  Data Access Pages
    1   Table - Local Access Tables
    2   Access Object - Database
    3   Access Object - Containers
    4   Table - Linked ODBC Tables
    5   Queries
    6   Table - Linked Access Tables
    8   SubDataSheets

    -- http://www.access-programmers.co.uk/forums/showthread.php?t=103811

    0 讨论(0)
  • 2020-12-05 21:50

    Step 1 Create table "AccessObjectType" Columns:

    • TypeID autonumber
    • TypeStr text
    • ShowUser Yes/No
    • ShowAdmin Yes/No

    Populate the "AccessObjectType" table:

    TypeID  TypeStr ShowUser    ShowAdmin
    
    -32775  Module  False   True
    -32772  Report  True    True
    -32768  Form    True    True
    -32766  Macro   True    True
    -32764  Report  True    True
    -32761  Module  False   True
    -32758  User    False   False
    -32757  Database Document   False   False
    1   Table (local)   True    True
    2   Access Object - Database    False   True
    3   Access Object - Container   False   True
    4   Table, linked ODB SQL   True    True
    5   Query   True    True
    6   Table, Linked Access Excel  True    True
    7   Type 7  True    True
    8   SubDataSheet    True    True
    

    If you like, you can create another column called "SimpleType" for grouping of 1, 4 and 6 as simple type Table.

    Step 2 Create Query "AccessObjectQ" SQL:

    SELECT MSysObjects.Id, 
           MSysObjects.Name, 
           [Name] & " (" & [TypeStr] & ")" AS NameAndType, 
           [TypeStr] & ": " & [Name] AS TypeAndName, 
           Abs([Type]) AS ObjTypeID, 
           AccessObjectType.TypeStr, 
           AccessObjectType.ShowUser, 
           AccessObjectType.ShowAdmin
    FROM MSysObjects LEFT JOIN AccessObjectType 
      ON MSysObjects.Type = AccessObjectType.TypeID
    WHERE (((MSysObjects.Name) Not Like "msys*" 
      And (MSysObjects.Name) Not Like "*subform" 
      And (MSysObjects.Name) Not Like "*_*" 
      And (MSysObjects.Name) And (MSysObjects.Name) Not Like "*SF" 
      And (MSysObjects.Name) Not Like "*SQ" 
      And (MSysObjects.Name) Not Like "*~*") 
      AND (((AccessObjectType.ShowUser)=True) OR ((AccessObjectType.ShowAdmin)=True)))
    ORDER BY MSysObjects.Name;
    

    Step 3 Create a table "AccessObjectVisibility" Columns:

    • ObjectID as long (create as a lookup using AccessObjectQ)
    • UserVisible as Yes/No
    • AdminVisible as Yes/No

    You can now easily open this table (or a query) and select objects that you want users and admins to see in automatically populated lists you provide on forms.

    Step 4 Create Query "UserAccessObject"

    Select * from AccessObjectVisibility where UserVisible = True
    

    Create Query "UserAccessForm"

    Select * from AccessObjectVisibility where UserVisible = True and TypeID = -32768
    

    Create queries: "UserAccessReport", "UserAccessQuery", "UserAccessMacro", etc.

    Step 5" Create a custom reports menu using query "UserAccessReport" to populate a list box or combo box

    0 讨论(0)
  • 2020-12-05 21:53

    FWIW - IIF is a drag, and the switch solution doesn't seem valid for SQL (I may have done something wrong). I entered the values that Fionnuala offered into a new table named AccessObjectXref:

    ID  ObjectType  ObjectDesc
    1   -32768  Form
    2   -32766  Macro
    3   -32764  Report
    4   -32761  Module
    5   -32758  Users
    6   -32757  DB Document
    7   1   Table
    8   2   DB
    9   3   Container
    10  5   Query
    11  8   Subdatasheet
    

    Then used the following SQL to create a list of object names and their counts. Obviously you could include every record if you wanted:

    SELECT objectdesc, Count(*) AS Expr1
    FROM msysobjects,  AccessObjectTypeXref where type = objecttype
    group by objectdesc order by objectdesc
    
    0 讨论(0)
提交回复
热议问题