2010-10-22 15 views
6

mam quering z MsysObjects stół do tworzenia listy obiektów w mojej bazy danych:Znaczenie MsysObjects wartości -32758, -32757 i 3 (Microsoft Access)

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

wiem rozumieniu niniejszego wartości :

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

Ale co z -32758, -32757 i 3? Gdzie one oznaczają? Nie można go znaleźć w Internecie.

Odpowiedz

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

Dzięki! Ale czy nie powinno być gdzieś "oficjalnych" informacji od Microsoft? – waanders

+0

O ile sobie przypominam, MS nie chce, żebyś grzebał w tabelach systemowych, może zrobić straszne rzeczy dla twojego DB, jeśli nie wiesz, co robisz. Są nieudokumentowane i ludzie zawsze użyli ostrzeżenia, gdy o nich wspomnieli. Jednak wydaje się, że zatrzymał się. – Fionnuala

+0

Cóż, dla jednego, MS obiecał (zgodnie z Michaelem Kaplanem), że gdy coś w tabeli systemowej zostanie użyte do czegoś, to zawsze będzie obsługiwane. Jak znasz różnicę między używanymi i nieużywanymi obiektami, nie mam pojęcia, ale tak jest. –

3

bym unikają mucking z tabel systemowych. Po pierwsze, tymczasowe obiekty mogą się tam pojawiać i dezorientować. Aby uzyskać te same informacje, można użyć:

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

To jest udokumentowany sposób na uzyskanie informacji. W zależności od nieudokumentowanych tabel systemowych nie jest zalecane.

+0

AFAIK, makro będzie będzie dostępny tylko z AllMacros, jeśli zostanie otwarty jako pierwszy i nie ma żadnego _reliable_ (* cough * SendKeys * cough *), aby otworzyć makro z kodu. – Pastymage

0

FWIW - IIF jest oporem, a rozwiązanie przełączające nie wydaje się poprawne dla SQL (być może zrobiłem coś źle). Wszedłem wartości, które Fionnuala oferowanych do nowej tabeli o nazwie 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 

następnie wykorzystane następujące SQL, aby utworzyć listę nazw obiektów i ich liczby. Oczywiście można to każdy rekord jeśli chciałeś:

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

jchad powinieneś sformatować swoje posty za pomocą [tej składni] (https://stackoverflow.com/help/formatting) – asymmetric

1

Krok 1 Tworzenie tabela "AccessObjectType" kolumnach:

  • TypeID AutoNumber
  • tekst TypeStr
  • ShowUser Tak/Nie
  • ShowAdmin Tak/nie

Wypełnianie „AccessObjectType” tabeli:

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 

Jeśli chcesz, możesz utworzyć kolejną kolumnę o nazwie „simpleType” dla grupy 1, 4 i 6 jako prostego typu tabeli.

Etap 2 Tworzenie zapytania "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; 

Etap 3 Tworzenie tabeli "AccessObjectVisibility" Kolumny:

  • ObjectID dopóki (utworzyć wyszukiwanie za pomocą AccessObjectQ)
  • UserVisible jak Yes/No
  • AdminVisible jak Yes/No

Teraz można łatwo otworzyć tę tabelę (lub zapytanie) i wybrać obiekty, które mają użytkownicy i administratorzy zobaczyć w wypełniane automatycznie list Państwo dostarczyć na formularze.

Krok 4 Tworzenie zapytań "UserAccessObject"

Select * from AccessObjectVisibility where UserVisible = True 

Tworzenie zapytania "UserAccessForm"

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

Tworzenie zapytania: "UserAccessReport", "UserAccessQuery", "UserAccessMacro", etc.

Krok 5 " Utwórz niestandardowe menu raportów, używając zapytania "UserAccessReport" do zapełnienia pola listy lub pola kombi

+0

Proszę wcięcia części kodu z czterema spacjami (lub po prostu wybierz je i wybierz przycisk "kod" w edytorze) , to naprawdę nie jest czytelne. –