Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Alle Felder alle Abfragen einer DB auflisten

288 views
Skip to first unread message

Ulrich Wrede

unread,
Apr 20, 2017, 7:23:58 AM4/20/17
to
Hallo,
ich wollte mir, für Wartungszwecke, alle Felder aller Abfragen einer
Datenbank auflisten lassen.
Im Prinzip funktioniert das mit dem der QueryDefs Auflistung in
kombination mit der Fields Auflistung.
So wie ich das sehe, werden Abfragen mit benutzerdefinierten Funktion
allerdings nicht aufgelistet. ADO bzw. ADOX bieten anscheinend auch
keine Lösung.

Hat jemand da eine Lösung oder zeugt die Fragestellung schlicht von
einer defizitären Wartungsstragie.

Schönen Gruß
Ulrich

Ulrich Möller

unread,
Apr 20, 2017, 7:56:43 AM4/20/17
to
Hi Ulrich,

Am 20.04.2017 um 13:23 schrieb Ulrich Wrede:
> ich wollte mir, für Wartungszwecke, alle Felder aller Abfragen einer
> Datenbank auflisten lassen.
> Im Prinzip funktioniert das mit dem der QueryDefs Auflistung in
> kombination mit der Fields Auflistung.
> So wie ich das sehe, werden Abfragen mit benutzerdefinierten Funktion
> allerdings nicht aufgelistet.

Was meinst du mit "benutzerdefinierten Funktionen" ? Was fehlt genau?

> ADO bzw. ADOX bieten anscheinend auch keine Lösung.

Für eine schnelle einfache Auflistung kann man auch den
Datenbankdokumentierer/Abfrage verwenden.

Ulrich

Ulrich Wrede

unread,
Apr 20, 2017, 9:37:05 AM4/20/17
to
Am 20.04.2017 um 13:57 schrieb Ulrich Möller:
Hallo Ulrich

> Was meinst du mit "benutzerdefinierten Funktionen" ? Was fehlt genau?

Manche Abfragen enthalten VBA Funktionen, die ich selber geschrieben
habe. Diese Abfragen und die die darauf aufbauen, werden in der
Auflistung nicht bearbeitet.





Thomas Kühn

unread,
Apr 20, 2017, 10:06:51 AM4/20/17
to
Moin,

>
> Manche Abfragen enthalten VBA Funktionen, die ich selber geschrieben
> habe. Diese Abfragen und die die darauf aufbauen, werden in der
> Auflistung nicht bearbeitet.

Die Tabelle MSysQueries enthält alle Abfragen auch mit eigenen Funktionen.

Gruß Thomas

Ulrich Wrede

unread,
Apr 20, 2017, 11:00:40 AM4/20/17
to
Hallo Thomas,
ist bekannt. Es geht mir in erster Linie um die Felder die in einer
Abfrage enthalten sind.

Ulrich

Ulrich Möller

unread,
Apr 20, 2017, 1:24:03 PM4/20/17
to
Hi Ulrich,
habe das gerade mal mit ACC2010 getestet und es wird alles korrekt
angezeigt, auch eigene VBA Funktionen.

Hier mein vba Testroutine mit der Ausgabe im Direktbereich:

Sub Test()
Dim qdf As QueryDefs
Dim qry As QueryDef
Dim fld As Field

Set qdf = CurrentDb.QueryDefs

For Each qry In qdf
Debug.Print qry.Name, qry.SQL
For Each fld In qry.Fields
Debug.Print vbTab; fld.Name, fld.SourceField, fld.SourceTable,
fld.Type
Next
Next
End Sub

Ulrich


Ulrich Wrede

unread,
Apr 20, 2017, 2:26:00 PM4/20/17
to
Hallo Ulrich,

Dein Vorschlag hat mir weitergeholfen.

Innerhalb der zu prüfenden Datenbank funktinioniert alles wie erwartet.
Allerdings wollte ich gerne von außen auf eine DB zugreifen.
dann wird nicht für alle Abfragen die Felder aufgelistet.
Die eigenen Funktionen stehen dann wohl nicht zur Verfügung, vielleicht
deshalb?


Const strDB As String = "meine.accdb"

Sub Test()
Dim db As Database
Dim qdf As QueryDefs
Dim qry As QueryDef
Dim fld As Field

Set db = OpenDatabase(Name:=strDB)
Set qdf = db.QueryDefs

For Each qry In qdf
Debug.Print qry.Name, qry.SQL
For Each fld In qry.Fields
Debug.Print vbTab; fld.Name, fld.SourceField, fld.SourceTable,
fld.Type
Next
Next
End Sub


Danke für die Unterstützung
Ulrich

Ulrich Möller

unread,
Apr 20, 2017, 6:48:43 PM4/20/17
to
Am 20.04.2017 um 20:25 schrieb Ulrich Wrede:
> Innerhalb der zu prüfenden Datenbank funktinioniert alles wie erwartet.
> Allerdings wollte ich gerne von außen auf eine DB zugreifen.
> dann wird nicht für alle Abfragen die Felder aufgelistet.
> Die eigenen Funktionen stehen dann wohl nicht zur Verfügung,
> vielleicht deshalb?
>
>
> Const strDB As String = "meine.accdb"
>
> Sub Test()
> Dim db As Database
> Dim qdf As QueryDefs
> Dim qry As QueryDef
> Dim fld As Field
>
> Set db = OpenDatabase(Name:=strDB)
> Set qdf = db.QueryDefs
>
> For Each qry In qdf
> Debug.Print qry.Name, qry.SQL
> For Each fld In qry.Fields
> Debug.Print vbTab; fld.Name, fld.SourceField, fld.SourceTable,
> fld.Type
> Next
> Next
db.close ' <- noch ergänzen!
> End Sub
Sollte eigentlich alle Felder der Abfragen anzeigen. An die Module und
Funktionen kommst du über das Application Objekt heran, siehe hier:
http://www.office-loesung.de/ftopic420710_0_0_asc.php
(gilt analog auch für accdb Datenbanken)

Wenn du die Funktionen selber aus der externen DB ausführen möchtest,
muß ein Verweis auf die externe DB eingerichtet sein.

Ulrich

Ulrich Wrede

unread,
Apr 21, 2017, 1:05:56 AM4/21/17
to
Hallo Ulrich
ich habe mal ein Beispiel zusammengebaut. Externer Zugriff.
Die Felder der Abfrage "A_mit_eigeneFunktion" werden nicht aufgelistet:

A_mit_AccessFunktion SELECT Tabelle1.Feld1, Date() AS tag
FROM Tabelle1;

Feld1 Feld1 Tabelle1 10
tag 8
A_mit_eigeneFunktion SELECT Tabelle1.*, eigeneFunktion() AS test
FROM Tabelle1;

A_ohne_Funktion SELECT Tabelle1.*
FROM Tabelle1;

ID ID Tabelle1 4
Feld1 Feld1 Tabelle1 10
Feld2 Feld2 Tabelle1 10



beim "internen" Zugriff sieht alles richtig aus:

A_mit_AccessFunktion SELECT Tabelle1.Feld1, Date() AS tag
FROM Tabelle1;

Feld1 Feld1 Tabelle1 10
tag 8
A_mit_eigeneFunktion SELECT Tabelle1.*, eigeneFunktion() AS test
FROM Tabelle1;

ID ID Tabelle1 4
Feld1 Feld1 Tabelle1 10
Feld2 Feld2 Tabelle1 10
test 10
A_ohne_Funktion SELECT Tabelle1.*
FROM Tabelle1;

ID ID Tabelle1 4
Feld1 Feld1 Tabelle1 10
Feld2 Feld2 Tabelle1 10

Schönen Gruß
Ulrich

Ulrich Möller

unread,
Apr 21, 2017, 7:32:19 AM4/21/17
to
Hallo Ulrich,
Ok, jetzt kann ich das nachvollziehen.
Das Problem ist die Expression "*" in der SQL-Abfrage. Dieser wird
offensichtlich erst zur Laufzeit aufgelöst und kann somit erst Abgefragt
werden, wenn die Abfrage ausgeführt wird, was bei internen Zugriff
scheinbar gemacht wird.

Die Abfrage kann aber auch nicht durchgeführt werden, weil die Funktion
"EigeneFunktion()" in der aktuellen DB nicht bekannt ist. Es
funktioniert, wenn man einen Verweis zu der Ext. DB erstellt. Aber das
ist natürlich keine Lösung für ein Tool, mit dem man mehrere DBs
untersuchen möchte.

Vielleicht gibt es auch eine andere Lösung. Muß ich mal antesten.

Gruß
Ulrich

Ulrich Möller

unread,
Apr 22, 2017, 5:41:25 AM4/22/17
to
Hallo Ulrich,

Am 21.04.2017 um 07:05 schrieb Ulrich Wrede:
> ich habe mal ein Beispiel zusammengebaut. Externer Zugriff.
> Die Felder der Abfrage "A_mit_eigeneFunktion" werden nicht aufgelistet:
>
> A_mit_AccessFunktion SELECT Tabelle1.Feld1, Date() AS tag
> FROM Tabelle1;
>
> Feld1 Feld1 Tabelle1 10
> tag 8
> A_mit_eigeneFunktion SELECT Tabelle1.*, eigeneFunktion() AS test
> FROM Tabelle1;
>
> A_ohne_Funktion SELECT Tabelle1.*
> FROM Tabelle1;
>
> ID ID Tabelle1 4
> Feld1 Feld1 Tabelle1 10
> Feld2 Feld2 Tabelle1 10

am einfachsten scheint es zu sein, die externe DB in einer neuen Instanz
zu öffnen und diese dann per Automation zu analysieren:

Const DB_NAME_EXT = "x:\database_extern.accdb"

Sub DumpFieldsEXT()
Dim acc As Access.Application
Dim dbs As DAO.Database
Dim qdf As DAO.QueryDefs
Dim qry As DAO.QueryDef
Dim fld As DAO.Field

Set acc = New Access.Application
acc.OpenCurrentDatabase DB_NAME_EXT

Set dbs = acc.CurrentDb
Set qdf = dbs.QueryDefs

For Each qry In qdf
Debug.Print qry.Name & ": "; qry.SQL

For Each fld In qry.Fields
Debug.Print , fld.OrdinalPosition, fld.Name, fld.Type,
fld.SourceTable, fld.SourceField
Next
Next

Set fld = Nothing
Set qry = Nothing
Set qdf = Nothing
Set dbs = Nothing

acc.CloseCurrentDatabase
Set acc = Nothing
End Sub

Ulrich

Ulrich Wrede

unread,
Apr 22, 2017, 11:57:20 AM4/22/17
to
Hallo Ulrich,

klasse das haut hin.
Ich habe eine Datenbank durchlaufen lassen und alles in einer Tabelle
mitschreiben lassen. Mehrere tausend Felder. Im Laufe der Jahre hat sich
da einiges angesammelt.
Korrupte Abfrage werden nicht bearbeitet. Die die muss man in einer
Logtabelle gesondert ausweisen.
Auf jeden Fall freue ich mich über das Ergebnis.

Herzlichen Dank
Ulrich

OT:
Nach meiner bisherigen Wahrnehmung gibt es immer eine Lösung. Man muß
nur dran bleiben und zusammenarbeiten. Ich möchte dies nicht nur auf die
Arbeit mit Access beschränken. Was könnte die Menschheit erreichen, wenn
wir unsere Energie und Fähigkeiten nicht mehr mit "auf den Kopf hauen"
verschwenden, sondern sie zum Wohlen aller einsetzen. Das Universum
stünde der Menschheit offen.
0 new messages