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 Bild 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

Bild 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

Der Status kann einer der Werte 1, 2 oder 4 oder auch eine Kombination dieser Werte sein.

Wenn Sie beispielsweise eine Tabelle öffnen und diese dann im Kombinationsfeld des Beispielformulars auswählen, zeigt dieses den Status acObjStateOpen an.

ändern Sie dann eine Eigenschaft der Tabelle, indem Sie beispielsweise eine Spaltenbreite anpassen. Beim nächsten Auswählen dieses Objekts zeigt das Formular dann den Wert acObjStageOpen + acObjStateDirty an. Ein Wechsel zurück zur Tabelle und die Tastenkombination Strg + S speichern die änderungen. Anschließend liefert SysCmd wieder den Wert acObjStateOpen.

Gleiches funktioniert auch bei neu angelegten Objekten – diese können jedoch nicht mit dem Kombinationsfeld des Beispielformulars ausgewählt werden, da Objekte erst nach dem Speichern in der Tabelle MSysObjects vorliegen.

Statustext anzeigen

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar