Fragensteller
Eine Funktion in eine Variable speichern und ausführen

Frage
-
Hallo
Ich habe ein Problem, und zwar speichere ich in einer Tabelle Befehle ab. Das sieht wie folgt aus:
Durch diese Tabelle lade ich die Eigenschaften meiner einzelnen Ribbon Elemente. Damit ich bei Änderungen nicht unbedingt in den Code gehen uns suchen muss, habe ich mir gedacht das ich die Befehle auch in die Tabelle speichere und das dazugehörige Formular auch.
Durch den Einsatz von SQL hole ich die benötigten Daten aus der Tabelle, setze Feld Funktionsart und Actions zusammen und will die nun ausführen als DoCmd.OpenForm "FrmBerichtsauswahl".
Hierzu mal mein Code:
'#### Aktionen die mit Ribbonelementen ausgeführt werden
Public Function Actions(ctl As IRibbonControl)
Dim Sql1 As String
Dim rs1 As ADODB.Recordset
Dim Funktionsart As String
Dim Aktion As String
Sql1 = "Select * from tbRibbonMenue where control = '" & ctl.ID & "'"
Set rs1 = CurrentProject.Connection.Execute(Sql1)
If rs1.EOF = False Then
If IsNull(rs1.Fields("Actions")) Then
nachricht = rs1.Fields("Nachricht")
Else
Action = rs1.Fields("Actions")
gesperrt = rs1.Fields("gesperrt")
nachricht = rs1.Fields("Nachricht")
Funktionsart = rs1.Fields("Funktionsart")
End If
End If
rs1.Close
If (gesperrt = True) Or (Action = Null) Then
MsgBox (nachricht)
Else
Aktion = Funktionsart & " " & Action
Debug.Print AktionHier will ich Aktion ausführen (DoCmd.OpenForm "FrmBerichtsauswahl")
End If
End FunctionVilleicht hat sich ja einer mit diesem Thema befasst und kann mir sagen ob es überhaupt möglich ist oder nicht. Sollte es nicht der Fall sein, so kann ich es umbauen.
Schonmal ein dankeschön
Alle Antworten
-
Hi,
auch wenn ich denke, das es in den meisten Fällen nicht sonderlich sinnvoll ist, Strings als Code dynamisch auszuführen, würde ich mal RunCode oder Run probieren:
http://msdn.microsoft.com/en-us/library/office/ff834373.aspx
http://msdn.microsoft.com/de-de/library/office/ff193559.aspx
Probiert hab ich es allerdings nicht, hoffe, es hilft trotzdem :)
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
- Bearbeitet Stefan FalzModerator Donnerstag, 27. Juni 2013 16:32 Grund
-
Danke für deine Antwort Stefan,
eigentlich ist das ganze ja recht praktisch, Befehlt steht in der Tabelle und es muss nur noch durch ein SQL Befehl selektiert und dann ausgeführt werden.
Nun das ganze ist leider nicht so einfach machbar, anscheinend über Shell Funktionen in denen ich jetzt nicht viel Zeit investieren möchte.
Ich habe in der Tabelle was geändert und jetzt mache ich einfach ein Select Case und die Funktion steht dahinter. So geht das recht schnell.
-
Hi,
hast Du das. was ich dir geschrieben hatte, überhaupt mal ausprobiert? Denn insbesondere das Letzte klingt mir schon so als ob es das wäre, was Du gesucht hast.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
klar habe ich natürlich durchgelesen und versucht anzuwenden. Leider kein Erfolg, das Problem ist das Access mein Befehl nicht erkennen will. Ich bekomme dann andauernd die Meldung, DoCmd... konnte von Access nicht gefunden werden.
Ich habe es einfach wie folgt gemacht, ist einfacher und ich kann mich auf die nächsten Schritte konzentrieren. Denn das Projekt ist leider riesig und vieles wurde nicht ordentlich programmiert und überall gibt es Baustellen die ausbügeln muss.
Public Function Actions(ctl As IRibbonControl)
Dim Sql1 As String
Dim rs1 As ADODB.Recordset
Action = ""
Sql1 = "Select * from tbRibbonMenue where control = '" & ctl.ID & "'"
Set rs1 = CurrentProject.Connection.Execute(Sql1)
If rs1.EOF = False Then
If IsNull(rs1.Fields("Actions")) Then
nachricht = rs1.Fields("Nachricht")
Else
Action = rs1.Fields("Actions")
gesperrt = rs1.Fields("gesperrt")
nachricht = rs1.Fields("Nachricht")
Funktionsart = rs1.Fields("Funktionsart")
End If
End If
rs1.Close
If (gesperrt = True) Or (Action = Null) Or (Action = "") Then
MsgBox (nachricht)
Else
Select Case Funktionsart
Case "oeffnen"
DoCmd.OpenForm Action
Case "schließen"
DoCmd.Close
DoCmd.OpenForm ("frmHauptmenue")
Case "Funktion"
' Filter
Case "Else"
Debug.Print "keine Aktion hinterlegt"
End Select
End If
End Function -
Hallo biker
Du kannst den Aufruf so gestalten:
Eval (Dein Wert aus der Tabell)
Dabei ist zu beachten, dass du in der Tabelle die Formularnamen in " setzt also
DoCmd.OpenForm "frmDeinForm"
Allenfalls mit den weiteren Parametern ganu so wie du dies im VBA auch machen würdest.
Gruss Markus
-
Hallo Biker
Habe bei mir folgende Funktion in einem Modul erstellt:
Public Function fShowForm(sFormName As String, _ Optional vFilter As Variant, _ Optional vOpenArgs As Variant, _ Optional vView As Variant, _ Optional vDataMode As Variant) As Boolean If IsMissing(vView) Or IsNull(vView) Then vView = acNormal End If If IsMissing(vDataMode) Or IsNull(vDataMode) Then vDataMode = acFormEdit End If DoCmd.OpenForm sFormName, vView, , vFilter, vDataMode, acWindowNormal, vOpenArgs End Function
Jetzt kannst du in deiner Tabelle den Aufruf wie folgt ändern:
fShowForm("frmFormular")
die diversen Parameter welche die Ansicht ändenr oder welche das Formular direkt zum Erfassen von neuen Datensätzen öffnen kannst du entsprechend mitgeben.
z.B. als Datenblatt öffnen anstelle Formularansicht
fShowForm("frmDatenblatt",Null,Null,3)
oder neue Datensätze anfügen bei Formularansicht:
fShowForm("frmFormular",Null,Null,Null,0)
Sorry dass ich nicht gleich am Anfang daran dachte bei mir öffne ich halt alle Forms mit einer ähnlichen Funktion die dann noch gleich die Berechtigungen steuert.
Gruss Markus
-
Ist auch ein Ansatz. Ich habe das ganze jetzt so gemacht. Meine Rechteabfrage ist für die Sichtbarkeit der Menüleiste wird hier direkt aus der Tabelle gelesen, nun kann ich die Ribbon Elemente so steuern wie ich lust und laune habe. Der Code wurde zwar ein bisschen länger aber dafür auch für andere die auch daran schaffen werden einfacher.
Ich würde jedem empfehlen bei einer Ribbon Menüleiste alles in eine Tabelle zu packen und von dort aus alles zu steuern. Meine ersten Versuche mit Ribbons will ich mir gar nicht erst vorstellen, deshalb wird auch das vorherige Projekt komplett umgebaut auf eine Tabellenstruktur.
'#### Aktionen die mit Ribbonelementen ausgeführt werden
Public Function Actions(ctl As IRibbonControl)
Dim Sql1 As String
Dim rs1 As ADODB.Recordset
Action = ""
Sql1 = "Select * from tbRibbonMenue where control = '" & ctl.ID & "'"
Set rs1 = CurrentProject.Connection.Execute(Sql1)
If rs1.EOF = False Then
If IsNull(rs1.Fields("Actions")) Then
nachricht = rs1.Fields("Nachricht")
Else
Action = rs1.Fields("Actions")
gesperrt = rs1.Fields("gesperrt")
nachricht = rs1.Fields("Nachricht")
Funktionsart = rs1.Fields("Funktionsart")
End If
End If
rs1.Close
If (gesperrt = True) Or (Action = Null) Or (Action = "") Then
MsgBox (nachricht)
Else
Select Case Funktionsart
Case "oeffnen"
DoCmd.OpenForm Action
Case "schließen"
DoCmd.Close acForm, Action
Case "Drucken"
DoCmd.OpenReport Action, acPreview
Case "Funktion"
Select Case Action
Case "Beenden"
If MsgBox("Möchten Sie das Programm beenden? ", vbQuestion + vbYesNo, "Ende?") = vbYes Then
DoCmd.Quit
End If
Case "ShiftAktiv"
ShiftSperre.activateShiftKey (False)
Case "ShiftDeaktiv"
ShiftSperre.activateShiftKey (True)
Case "SanduhrD"
DoCmd.Hourglass False
Case "SanduhrA"
DoCmd.Hourglass True
End Select
Case "Else"
Debug.Print "keine Aktion hinterlegt"
End Select
End If
End Function
'#### Sichtbarkeit der Ribbonelemente
Public Function getVisible(ctl As IRibbonControl, ByRef Visible)
Dim Sql2 As String
Dim rs2 As ADODB.Recordset
Sql2 = "Select * from tbRibbonMenue where control = '" & ctl.ID & "'"
Set rs2 = CurrentProject.Connection.Execute(Sql2)
If rs2.EOF = False Then
sicht = rs2.Fields("Visible")
Rechte = rs2.Fields("Userrecht")
End If
rs2.Close
If Rechte = 10000 Then
Visible = sicht
ElseIf glbUserInfo.BestBerechtLevel <= Rechte Then
Visible = sicht
End If
End Function