Supportnet / Forum / Datenbanken
öffnen von Abfragen oder Tabellen über einen Befehl ?
Frage
Hi,
ich kämpfe gerade ein wenig mit Access :-)
folgendes Problem :
ich habe eine Tabelle die Prozess-Steps abbildet,
jedem dieser Prozess Steps kann ein Link hinterlegt werden, der entweder eine Tabelle, Formular oder Abfrage ist.
Dieser Link steht immer im gleichen Feld.
Nun taucht dieser Link-Name im Formular auf und bei einem Klick auf selben soll sich die hinterlegte Tabelle oder Abfrage öffnen.
soweit so gut, folgendes hab ich dann in VBA umgesetzt :
Bei Klick auf das Link-Feld :
If IsNull([Process-Link]) Then
MsgBox ("ist kein Link")
Else
DoCmd.OpenQuery ([Process-Link])
End If
Problem ist, wie bekomme ich raus ob es sich bei dem Link um eine Tabelle oder Abfrage oder was auch immer handelt so das ich den VBA code je nach Typ abhandeln kann und je nach Notwendigkeit dann : "DoCmd.OpenTabel " verwenden kann.
bin für jede idee dankbar :-))
Viele Grüße Josef
Antwort 1 von lorf55
Hallo Josef,
eigentlich hast du ja noch ein Problem. Nämlich das du zwar einen Link hast, aber dazu das Objekt fehlt, weil es evtl. gelöscht oder umbenannt wurde. Aber das fangen die nachfolgenden Funktionen glaube ich auch ab.
Das kannst du in etwa so abfragen:
siehe dazu auch
software-chuchi.ch
und
donkarl
Aufruf z.B.
if IstAbfrage([Process-Link]) then
DoCmd.OpenQuery ([Process-Link])
end if
Hoffe, das funktioniert so.
Gruß
lorf
eigentlich hast du ja noch ein Problem. Nämlich das du zwar einen Link hast, aber dazu das Objekt fehlt, weil es evtl. gelöscht oder umbenannt wurde. Aber das fangen die nachfolgenden Funktionen glaube ich auch ab.
Zitat:
jedem dieser Prozess Steps kann ein Link hinterlegt werden, der entweder eine Tabelle, Formular oder Abfrage ist.
jedem dieser Prozess Steps kann ein Link hinterlegt werden, der entweder eine Tabelle, Formular oder Abfrage ist.
Das kannst du in etwa so abfragen:
function IstAbfrage(Name As String) As Boolean
If DCount("*", "MSysObjects", "Name='" & Name & "' and (((MSysObjects.Type)=5) AND ((MSysObjects.Flags)<>3))") Then IstAbfrage = True
end function
function IstTabelle(Name As String) As Boolean
If DCount("*", "MSysObjects", "Name='" & Name & "' and (((MSysObjects.Type)=1) AND ((MSysObjects.Flags)=0) AND ((LCase(Left([Name],4)))<>'usys')) OR (((MSysObjects.ForeignName) Is Not Null))") Then IstAbfrage = True
end function
function IstFormular(Name As String) As Boolean
If DCount("*", "MSysObjects", "Name='" & Name & "' and (((MSysObjects.Type)=-32768) AND ((MSysObjects.Flags)=0))") Then IstAbfrage = True
end function
siehe dazu auch
software-chuchi.ch
und
donkarl
Aufruf z.B.
if IstAbfrage([Process-Link]) then
DoCmd.OpenQuery ([Process-Link])
end if
Hoffe, das funktioniert so.
Gruß
lorf
Antwort 2 von Josef
Vielen Dank lorf,
das hat mein Problem gelöst :-)
ich musste nur bei den 2 Funktionen
function IstTabelle(Name As String) As Boolean
und
function IstFormular(Name As String) As Boolean
den rückgabewert anpassen da dort jedesmal :
Then IstAbfrage = True
noch drin war :-))
Gruß Josef
das hat mein Problem gelöst :-)
ich musste nur bei den 2 Funktionen
function IstTabelle(Name As String) As Boolean
und
function IstFormular(Name As String) As Boolean
den rückgabewert anpassen da dort jedesmal :
Then IstAbfrage = True
noch drin war :-))
Gruß Josef
Antwort 3 von lorf55
Hallo Josef,
stimmt, das war zwischen Tür und Angel gemacht, aber erfreulicherweise kein bösartiger Fehler dabei.
Schön, dass du es hingekriegt hast.
Bis denn
lorf
PS: Bei durchgehender Objektorientierung wären solche Funktionen wohl nicht nötig, da gäbe es für jeden Typ eine Methode DoCmd und die Birne wäre geschält und nicht solche gewagten Manöver. Aber was solls ...
SCNR
stimmt, das war zwischen Tür und Angel gemacht, aber erfreulicherweise kein bösartiger Fehler dabei.
Schön, dass du es hingekriegt hast.
Bis denn
lorf
PS: Bei durchgehender Objektorientierung wären solche Funktionen wohl nicht nötig, da gäbe es für jeden Typ eine Methode DoCmd und die Birne wäre geschält und nicht solche gewagten Manöver. Aber was solls ...
SCNR

