none
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 Aktion

    Hier will ich Aktion ausführen (DoCmd.OpenForm "FrmBerichtsauswahl")
        End If

    End Function

    Villeicht 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 

    Donnerstag, 27. Juni 2013 14:56

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


    Donnerstag, 27. Juni 2013 16:29
  • 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.

    Freitag, 28. Juni 2013 07:27
  • 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

    Freitag, 28. Juni 2013 08:38
  • 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

    Freitag, 28. Juni 2013 09:41
  • 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

    Freitag, 5. Juli 2013 13:07
  • Hi Markus

    habe ich alles schon ausprobiert. Wenn ich es so mache wie du es sagst, erkennt VBA nicht das es eine Funktion ist. Soll heißen DoCmd wird dann nicht mehr erkannt

    Montag, 8. Juli 2013 06:01
  • 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

    Mittwoch, 10. Juli 2013 11:34
  • 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 

    Mittwoch, 10. Juli 2013 11:53