2010-10-22 16 views
6

estoy quering los MSysObjects mesa para hacer una lista de los objetos en mi base de datos:Significado de MSysObjects valora -32.758, -32.757 y 3 (Microsoft Access)

SELECT MsysObjects.Name, MsysObjects.Type 
FROM MsysObjects 
WHERE (((Left$([Name],1))<>'~') AND ((Left$([Name],4))<>'Msys')) 
ORDER BY MsysObjects.Name; 

Sé el significado de estos valores :

-32768 = Form 
-32766 = Macro 
-32764 = Report 
-32761 = Module 
1 = Table 
5 = Query 
6 = Linked Table 

Pero ¿qué pasa con -32758, -32757 y 3? ¿Dónde están parados? No puedo encontrarlo en la web.

Respuesta

11
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

¡Gracias! Pero, ¿no debería haber información "oficial" de Microsoft en alguna parte? – waanders

+0

Por lo que recuerdo, MS no quiere que hurgues en las tablas del sistema, puede hacer cosas realmente horribles en tu DB si no sabes lo que estás haciendo. Son indocumentados y la gente siempre usa una advertencia cuando los menciona. Sin embargo, eso parece haberse detenido. – Fionnuala

+0

Bueno, para empezar, MS ha prometido (según Michael Kaplan) que una vez que algo en una tabla del sistema se usa para algo, siempre será compatible. Cómo sabes la diferencia entre objetos usados ​​y no usados, no tengo ni idea, pero ahí está. –

3

Me tienden a evitar curioseaba con las tablas del sistema. Por un lado, los objetos temporales pueden aparecer allí y confundir las cosas. Para obtener la misma información, puede utilizar:

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

Esa es la forma documentada de obtener la información. Dependiendo de las tablas del sistema no documentadas no se recomienda.

+0

AFAIK, una macro solo se podrá acceder desde AllMacros si se abre primero, y no hay manera _reliable_ (* tos * SendKeys * tos *) de abrir una Macro desde el código. – Pastymage

0

FWIW - IIF es un arrastre, y la solución de conmutación no parece válida para SQL (es posible que haya hecho algo mal). Entré en los valores que Fionnuala ofreció en una nueva tabla llamada 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 

luego se usa el siguiente código SQL para crear una lista de nombres de objeto y su población. Obviamente se podría incluir todos los registros si quería:

SELECT objectdesc, Count(*) AS Expr1 
FROM msysobjects, AccessObjectTypeXref where type = objecttype 
group by objectdesc order by objectdesc 
+0

jchad debe formatear sus publicaciones utilizando [esta sintaxis] (https://stackoverflow.com/help/formatting) – asymmetric

1

Paso 1 Crear una tabla "AccessObjectType" Columnas:

  • TypeID autonumber
  • texto TypeStr
  • showuser Sí/No
  • ShowAdmin Sí/No

pueblan el "AccessObjectType" tabla:

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 

Si lo desea, puede crear otra columna llamada "SimpleType" para la agrupación de 1, 4 y 6 de la Tabla tan simple tipo.

Paso 2 Crear consulta "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; 

Paso 3 Crear una tabla "AccessObjectVisibility" Columnas:

  • de objeto, siempre y (crear una búsqueda usando AccessObjectQ)
  • UserVisible como Sí/No
  • AdminVisible como Sí/No

Ahora puede abrir fácilmente esta tabla (o una consulta) y seleccione los objetos que desea que los usuarios y los administradores a ver en las listas de forma automática pobladas que ha suministrado en formas.

Paso 4 Crear consulta "UserAccessObject"

Select * from AccessObjectVisibility where UserVisible = True 

Crear consulta "UserAccessForm"

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

Crear consultas: "UserAccessQuery" "UserAccessReport", "UserAccessMacro", etc.

Paso 5 " Cree un menú de informes personalizados mediante la consulta "UserAccessReport" para rellenar un cuadro de lista o un cuadro combinado

+0

Por favor, sangría las partes del código con cuatro espacios (o simplemente selecciónelos y seleccione el botón "código" en el editor) , esto no es realmente legible –

Cuestiones relacionadas