Die SysCmd-Wundertüte

Access hütet so manche Quelle interessanter Funktionen. Darunter befindet sich etwa die wenig beachtete SysCmd-Anweisung, die eine Reihe cooler Features bereithält. Damit fragen Sie beispielsweise mal eben ab, ob gerade die Vollversion oder die Runtime-Version läuft, oder ermitteln die Access-Version. Dieser Beitrag stellt alle Möglichkeiten dieser Methode vor.

Die SysCmd-Methode gehört zum Application-Objekt. Genau genommen ist SysCmd gleichzeitig Methode und Funktion: Je nachdem, welche Parameter Sie angeben, liefert es Informationen zurück oder führt Aktionen aus. SysCmd kann einen bis drei Parameter verarbeiten, wobei die Anzahl der weiteren Parameter vom Wert des ersten Parameters abhängt. In den folgenden Abschnitten schauen wir uns an, welche Möglichkeiten SysCmd bietet.

Access-Verzeichnis ermitteln

Mit dem Wert acSysCmdAccessDir für den ersten Parameter verwenden Sie SysCmd als Funktion. Sie erhalten dann den Namen des Verzeichnisses zurück, in dem sich die aktuell verwendete Access-Instanz befindet (also die Datei MSAccess.exe). Das Formular aus Abb. 1 zeigt Beispiele für die Anwendung der SysCmd-Funktionen. Das obere Textfeld txtAccessDir wird beispielsweise beim Öffnen des Formulars mit der folgenden Anweisung gefüllt:

pic001.png

Abb. 1: Formular mit Beispielen für die Nutzung von SysCmd

Me!txtAccessDir = SysCmd(acSysCmdAccessDir)

Access-Version ermitteln

Auf ähnliche Weise arbeitet SysCmd mit dem Wert acSysCmdAccessVer. Die Funktion liefert dann die Access-Version der laufenden Instanz, also beispielsweise 11.0 für Access 2003, 12.0 für Access 2007 oder 14.0 für Access 2010. Im Beispielformular funktioniert dies so:

Me!txtAccessVer = SysCmd(acSysCmdAccessVer)

Arbeitsgruppendatei ermitteln

Mit dem Wert acSysCmdGetWorkgroupFile ermittelt SysCmd den Namen der Arbeitsgruppen-Informationsdatei, die das System aktuell verwendet:

Me!txtWorkgroupfile = SysCmd(acSysCmdGetWorkgroupFile)

Runtime oder Vollversion

Die vierte Information, an die Sie mit nur einem Parameter herankommen, erhalten Sie mit dem Wert acSysCmdRuntime. SysCmd liefert damit eine Information darüber zurück, ob die aktuelle Access-Version die Runtime-Version ist oder nicht – das Ergebnis ist entweder True oder False:

Me!txtRuntime = SysCmd(acSysCmdRuntime)

Zustand von Objekten ermitteln

Etwas aufwendiger ist die Ermittlung des Zustands eines bestimmten Objekts.

Allein der Aufruf erfordert die Angabe aller drei möglichen Parameter, in diesem Fall die folgenden:

  • Aufrufart: acSysCmdGetObjectState
  • Objektart (acTable, acQuery, acForm, acReport, acMacro, acModule)
  • Objektname (also beispielsweise frmSysCmd)

Die Funktion liefert eine Kombination der folgenden Werte zurück:

  • acObjStateOpen (1): Objekt geöffnet
  • acObjStateDirty (2): Objekt geändert, aber nicht gespeichert
  • acObjStateNew (4): Neu angelegtes Objekt

Im Beispielformular frmSysCmd wählen Sie mit einem Kombinationsfeld einen der Einträge der Systemtabelle MSysObjekts aus. Der Kombinationsfeldeintrag enthält den Namen sowie den in MSysObjects gespeicherten Typ des Objekts (etwa -32768 für Formulare). Die Prozedur aus Listing 1 ermittelt zunächst die Access-Konstante für den Objekttyp und ruft dann den Status des Objekts mit SysCmd ab.

Listing 1: Ermitteln des Zustands eines bestimmten Objekts

Private Sub cboObjekte_AfterUpdate()
    Dim intType As Integer
    Dim intStatus As Integer
    Select Case Me!cboObjekte.Column(0)
        Case 1
            intType = acTable
        Case 5
            intType = acQuery
        Case -32761
            intType = acModule
        Case -32764
            intType = acReport
        Case -32766
            intType = acMacro
        Case -32768
            intType = acForm
    End Select
    intStatus = SysCmd(acSysCmdGetObjectState, intType, Me!cboObjekte.Column(1))
    Me!txtGetObjectState = Choose(intStatus + 1, "Undefiniert", "acObjStateOpen", _
        "acObjStateDirty", "acObjStageOpen + acObjStateDirty", "acObjStateNew", _
        "acobjStateOpen + acObjStateNew", "acObjStateDirty + acObjStateNew", _
        "acObjStateOpen + acObjStateDirty + acObjStateNew")
End Sub

Sie haben das Ende des frei verfügbaren Textes erreicht. Möchten Sie ...

Workplace

Jahresabonnement TestzugangOder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar