Betreft: MS Access 97, 2000
A.E.Veltstra
11 april 2003
Probleem:
Stel, 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:
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:
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