Automatisch herkennen van een velddatatype

Betreft: MS Access 97, 2000

A.E.Veltstra
11 april 2003

Probleem:

MS Access tabel, in ontwerpmodusStel, je hebt een tabel, en volgens goede gewoonte geef je de velden namen als "POCntPers". Wat nu, als je een zoekscherm wilt maken, waarin je de gebruiker laat kiezen uit alle velden van een willekeurige tabel, zodat hij voor dat veld een zoekcriterium in kan voeren, waarna het scherm volautomatisch de juiste query opzet en uitvoert? Je loopt daarmee tegen twee problemen aan:

  1. De veldnaam "POCntPers" is niet vriendelijk (de gebruiker weet niet wat het voorstelt);
  2. Je weet niet of een veld een nummer of een tekst is, zodat je niet weet of je in je query wel of geen aanhalingstekens op moet nemen.

Oplossing:

Of je wel of geen aanhalingstekens op moet nemen hangt af van het velddatatype. Voor tekst- en memovelden heb je wel aanhalingstekens nodig, voor numerieke niet. En voor datumtijdvelden gebruik je soms aanhalingstekens, en soms hekjes.

De oplossing geeft een mogelijke manier om het velddatatype gemakkelijk te herkennen.

Je voegt (in het tabelontwerp) aan het tabelveld een omschrijving toe aan die velden, die je op wilt nemen in de keuzelijst op het zoekscherm. De andere veldomschrijvingen laat je leeg.

Je maakt op het zoekscherm een keuzelijst met de volgende eigenschappen:

Als we zometeen de lijst hebben gevuld, staat de veldnaam in eerste kolom (onzichtbaar), de vriendelijke veldomschrijving in de tweede kolom (zichtbaar) en het velddatatype in de derde kolom (onzichtbaar). Om het velddatatype van het gekozen veld uit te lezen gebruik je deze code:

'kolommen beginnen bij 0 te tellen
lngVeldType = cmbMijnVeldKeuze.Column(2)

Dan moet je de veldtypen nog kennen. Hier zijn enkele veelgebruikte:

  1. dbInt = 3 = Integer
  2. dbLong = 4 = Long Integer (Autonummer)
  3. dbDouble = 7 = Dubbele Integer
  4. dbDate = 8 = Datum/Tijd
  5. dbText = 10 = Text (max. 255 tekens)
  6. dbMemo = 12 = Memo (max 1 GB)

De rest van de datatypes kun je vinden in de Object Browser in de DAO-bibliotheek, in de DataTypeEnum-opsomming.

Het laatste wat je nodig hebt, is onderstaande functie, waarmee je de keuzelijst gevuld krijgt met veldnaam, -omschrijving en -datatype.


Public Function strVeldNaamTypeVanTabel(strTabelNaam) As String

Dim db As DAO.Database, tdf As DAO.TableDef, rst As DAO.Recordset
Dim fldT As DAO.Field, fldR As DAO.Field
Dim strResult As String

  'zonder db-object houdt tdf zijn toewijzing niet vast :(
  Set db = Application.CurrentDb
  Set rst = db.OpenRecordset(strTabelNaam, , dbOpenSnapshot)
  Set tdf = db.TableDefs(strTabelNaam)
  
  On Error Resume Next
  For Each fldR In rst.Fields
    Set fldT = tdf.Fields(fldR.Name)
    strResult = strResult & fldT.Name & ";" & _
                fldT.Properties("Description") & _
                ";" & fldT.Type & ";"
  Next

  If (Err.Number = 3720) Or (Err.Number = 91) Then
    '3720 = property missing (veldomschrijving leeg)
    '91 = object not set (recordsetveld werd niet 
    '     aangetroffen in de tabledef)
    Err.Clear
  End If

  Set tdf = Nothing
  Set rst = Nothing
  Set db = Nothing

  strVeldNaamTypeVanTabel = strResult

End Function

Het restultaat van deze functie krijg je in de keuzelijst door de volgende code:

Private Sub Form_Load()
    Me.cmbMijnVeldKeuze.RowSource = _
        strVeldNaamTypeVanTabel("tblEenTabelnaam")
    'waarbij je tblEenTabelnaam vervangt door 
    'de gewenste, bestaande tabelnaam
End Sub