Button Home/Top/Zurück


Datentypen ermitteln




Sobald man sich in die Tiefen der VBA Entwicklung begibt, stößt man früher oder später auf das Problem, den Datentypen eines Tabellen- oder Abfragefeldes bzw. eines Steuerelementes ermitteln zu müssen.

Bei einem Tabellen- oder Abfragefeld kann man die Tabellendefinitionen bzw. Abfragedefinitionen der Datenbank benutzen um erst die Tabelle/Abfrage zu ermitteln und über diese das gesuchte Feld.
Hierfür kann nachfolgende Funktion verwendet werden.

Public Function GetColumnDataType(TblName As String, ColName As String) As Integer
'
' GetColumnDataType()
'
' Ermittlung des Datentyps eines Tabellen- oder Abfragefeldes.
'
' IN:   TblName     Name der Tabelle/Abfrage in der sich die Column befindet
'       ColName     Name der Column deren Typ ermittelt werden soll
'
' OUT:  VBA Code des Datentyps (siehe Access-Hilfe unter "Type Property")
'
Dim AktDB As Database       ' Datenbank-Objekt
Dim TblDef As TableDef      ' Tabellendefinitionen
Dim QryDef As QueryDef      ' Abfragedefinitionen
Dim AktFld As Field         ' Feld-Objekt
    '
    ' Initialisierung des Datenbankobjektes mit der aktuellen Datenbank.
    '
    Set AktDB = CurrentDb
    '
    ' Fehlerbehandlung für den Fall, daß es die Tabelle nicht gibt.
    '
    On Error GoTo TabelleNichtGefunden
    '
    ' Tabelle setzen
    '
    Set TblDef = AktDB.TableDefs(TblName)
    '
    ' Fehlerbehandlung für den Fall, daß es die Column nicht gibt
    '
    On Error GoTo ColumnNichtGefunden
    '
    ' Column setzen.
    '
    Set AktFld = TblDef.Fields(ColName)
    '
    ' Den Typ der Column zurückgeben
    '
    GetColumnDataType = AktFld.Type
 
    Exit Function
TabelleNichtGefunden:
    '
    ' OK, die Tabelle gibt es nicht !
    ' Evtl. wird nach einer Abfrage gesucht.
    '
    On Error GoTo QueryNichtGefunden
    '
    ' Abfrage-Objekt setzen
    '
    Set QryDef = AktDB.QueryDefs(TblName)
    '
    ' Fehlerbehandlung für den Fall, daß es die Column nicht gibt
    '
    On Error GoTo ColumnNichtGefunden
    '
    ' Column setzen.
    '
    Set AktFld = QryDef.Fields(ColName)
    '
    ' Den Typ der Column zurückgeben
    '
    GetColumnDataType = AktFld.Type
 
    Exit Function
 
QueryNichtGefunden:
    '
    ' Fehlermeldung für den Fall das "TblName" weder eine Tabelle
    ' noch eine Abfrage ist.
    '
    On Error GoTo 0
    Err.Raise 4711, "GetColumnDataType", "Die Tabelle/Query " & TblName & _
              " wurde nicht gefunden."
    Exit Function
 
ColumnNichtGefunden:
    '
    ' Fehlermeldung für den Fall, daß "ColName" kein Tabellen-/Abfragefeld ist
    '
    On Error GoTo 0
    Err.Raise 4712, "GetColumnDataType", "Die Column " & TblName & "." & ColName & _
              " wurde nicht gefunden."
    Exit Function
 
End Function


Nachdem nun die Ermittlung des Datentyps einer Tabelle/Abfrage kein Problem mehr ist, stellt sich die Frage, wie das bei einem Steuerelement gemacht werden kann ?

In erster Linie geht es darum, den Datentypen eines Textfeldes zu ermitteln. Da diese Steuerelemente jeden Datentypen aufnehmen/anzeigen können. Leider gibt es keine Steuerelementeigenschaft über die der Datentyp ermittelt werden kann.

Das stimmt zwar nicht ganz , man könnte versuchen über die Eigenschaften Format und Eingabeformat auf den Datentypen zu schließen. Da diese Angaben, insbesondere das Eingabeformat, vom Entwickler frei definiert werden können, scheint die Ermittlung des Datentyps über die Angabe im Steuerelementinhalt die bessere Variante zu sein.

Bei dieser Variante werden die Angaben zur Datensatzherkunft des Formulars und zum Steuerelementinhalt des Textfeldes ausgewertet.
D.h. natürlich auch, daß der Datentyp ohne diese Angaben nicht ermittelt werden kann.

Ein besonderes Problem ist hierbei die Datensatzherkunft des Formulars. In dieser kann sowohl der Name einer Tabelle oder Abfrage als auch eine SQL-Statement angegeben werden.
Im letzteren Fall ist es notwendig aus dem SQL-Statement den Tabellen-/Abfragenamen zu extrahieren.
SELECT Tab1.Feld1, Tab1.Feld2, Tab1.Feld3 FROM Tab1;

Zugegeben, das SQL-Statement ist ziemlich simpel, da es keine Verknüpfungen enthält. Andererseits sollte man anstelle eines komplexen SQL-Statement in der Datensatzherkunft anzugeben besser dieses Statement in einer Abfrage unterbringen und den Namen dieser Abfrage als Datensatzherkunft verwenden.

Um also den Namen der Tabelle/Abfrage aus dem SQL-Statement zu extrahieren, wird nach dem Schlüsselwort FROM gesucht und der Name direkt hinter diesem als Tabellen/Abfragename verwendet.

Folgende Funktion kann (in Kombination mit der oben dargestellten Funktion) zur Ermittlung des Datentyps eines Steuerelements verwendet werden.

Public Function GetCtrlDataType(FrmName As String, CtrlName As String) As Integer
'
' GetCtrlDataType()
'
' Ermittlung des Datentyps eines Steuerelementes.
'
' IN:   FrmName     Name des Formulares, auf dem sich das Steuerelement befindet
'       CtrlName    Name des Steuerelements
'
' OUT:  VBA Code des Datentyps (siehe Access-Hilfe unter "Type Property")
'
Dim AktFrm As Form              ' Formular
Dim AktCtrl As Control          ' Das zu prüfende Steuerelement
Dim FrmTableName As String      ' Datensatzherkunft des Formulares
    '
    ' Fehlerbehandlung, für den Fall, daß es das Formular
    ' nicht gibt bzw. dieses nicht geöffnet ist.
    '
    On Error GoTo FormularNichtGefunden
    '
    ' Formular-Objekt setzen
    '
    Set AktFrm = Forms(FrmName)
    '
    ' eigene Fehlerbehandlung abschalten
    '
    On Error GoTo 0
    '
    ' Prüfen, ob das Formular eine Datensatzherkunft hat.
    '
    If AktFrm.RecordSource = "" Then
        '
        ' Wenn das Formular keine Datensatzherkunft hat, dann
        ' der Datentyp nicht ermittelt werden.
        '
        Err.Raise 4712, "GetCtrlDataType", "Das Formular " & FrmName & _
                  " besitzt keine Datensatzherkunft."
        Exit Function
    End If
    '
    ' Prüfen, ob als Datensatzherkunft eine SQL-Statement
    ' angegeben ist.
    '
    If InStr(AktFrm.RecordSource, "FROM") Then
        '
        ' Wenn ein SQL-Statement angegeben ist, dann wird mit der Tabelle
        ' weitergearbeitet, deren Name direkt hinter dem FROM steht.
        '
        FrmTableName = Right$(AktFrm.RecordSource, _
                              Len(AktFrm.RecordSource) - InStr(AktFrm.RecordSource, _
                              "FROM") - 4)
        FrmTableName = Left$(FrmTableName, InStr(FrmTableName, " ") - 1)
 
    Else
        '
        ' Wenn kein SQL-Statement angegeben ist, dann steht in der
        ' Datensatzherkunft des Formulares der Name einer Tabelle oder
        ' der einer Abfrage.
        '
        FrmTableName = AktFrm.RecordSource
    End If
    '
    ' Fehlerbehandlung für die Ermittlung des Steuerelements
    '
    On Error GoTo SteuerelementNichtGefunden
    '
    ' Steuerelement setzen
    '
    Set AktCtrl = AktFrm.Controls(CtrlName)
    '
    ' eigene Fehlerbehandlung abschalten
    '
    On Error GoTo 0
    '
    ' Prüfen, ob im Steuerelement ein Inhalt angegeben ist
    '
    If AktCtrl.ControlSource = "" Then
        '
        ' Wenn kein Steuerelementinhalt angegeben ist, kann
        ' auch der Datentyp nicht festgestellt werden.
        '
        Err.Raise 4712, "GetCtrlDataType", "Das Steuerelement " & "." & CtrlName & _
                  " besitzt keine Angabe zum Steuerelementinhalt."
        Exit Function
    End If
    '
    ' Über den Namen der Tabelle/Abfrage und der Tabellespalte denn
    ' Datentyp ermitteln.
    '
    GetCtrlDataType = GetColumnDataType(FrmTableName, AktCtrl.ControlSource)
 
    Exit Function
SteuerelementNichtGefunden:
    '
    ' Fehlermeldung, wenn es das Steuerelement "CtrlName" nicht gibt
    '
    On Error GoTo 0
    Err.Raise 4713, "GetCtrlDataType", "Das Steuerelement " & FrmName & "." & CtrlName & _
              " wurde nicht gefunden."
    Exit Function
 
FormularNichtGefunden:
    '
    ' Fehlermeldung wenn es das Formular "FrmName" nicht gibt oder es
    ' nicht geöffnet ist.
    '
    On Error GoTo 0
    Err.Raise 4711, "GetCtrlDataType", "Das Formular " & FrmName & _
              " wurde nicht gefunden."
    Exit Function
 
End Function

Modul Icon Beide Funktionen als Textfile zum Downloaden

Button Home/Top/Zurück