MS Access Database: selectievensters maken

Selectievensters maken in MS Access database deel 2: toelichting op de VBA-code

Toelichting op de VBA-code van de Selectievensters in een MS Access database

Dag toekomstig MS Access database expert! Ik hoop dat je mijn vorige blog informatief vond. Super dat je ook met dit tweede (van de vier) blog aan de slag wilt. Laten we meteen beginnen.

Rechterlijstje

Laten we starten met het vullen van het rechterlijstje met de naam lstRechter van het formulier frmSelectieVenster. Open het Visual-Basic scherm met de toetscombinatie Alt-F11. Let op dat het de code begint met:

Option Compare Database
Option Explicit
 

De tweede option voorkomt dat je variabelen in je code plaatst zonder dat je deze van tevoren hebt aangegeven (gedeclareerd) met het woord Dim. Er ontstaat een foutmelding als je bijvoorbeeld in je code hebt staan srtRechterLijst ipv strRechterLijst. Zonder de Option Explicit gaat bij de uitvoering van de code door en wordt de variabele strRechterLijst niet gevuld, omdat je er een verkeerde naam aan gaf. Je zult dan behoorlijk in je code naar de fout moeten zoeken. Het vooraf declareren voorkomt daarmee heel wat problemen.

In Visual Basic kennen we het onderscheid tussen Sub-  en Function-routines. De Sub-routine doorloopt de code en verricht een of meer handelingen. De Function-routines geven een waarde terug. Ik kom daar later op terug.

Ik heb de code (zie hierna in het kleinere lettertype) de naam prcLijstRechts gegeven, waarbij prc staat voor Procedure. De tekst tussen haakjes (strItems is een variabele die bij het aanroepen van de procedure wordt gevuld – zien we ook later).

De in groen weergegeven regels zijn door de voorafgaande apostrof verklarende tekst geworden en worden overgeslagen bij het uitvoeren van de code.

Private Sub prcLijstRechts( _
       strItems As String _
       )
           ‘Amsterdam, 16 juni 2017
        ‘Laat de rijen in de rechterlijst zien.
           Dim strSQL      As String
           strSQL = “SELECT ref_id”
           strSQL = strSQL & “, ref_strVerkort”
           strSQL = strSQL & ” FROM tblReferenties”
           strSQL = strSQL & ” WHERE ref_strTabel = ‘” & strPbForm & “‘”
           strSQL = strSQL & ” AND ref_id IN (” & strItems & “)”
           strSQL = strSQL & ” ORDER BY ref_strVerkort”
           With Me.lstRechter
                   .RowSource = strSQL
                   .Requery
           End With
End Sub

Je ziet dat ik ben gestart met het declareren van de variabele strSQL als een string. Deze variabele vullen we met inhoud. Eerst met “SELECT ref_id” en vervolgens wordt deze inhoud weer aangevuld met “, ref_strVerkort”. Het is een manier van transparant programmeren die veel wordt gebruikt. Je kunt de opdracht ook achter elkaar zetten, zoals ik hierna doe, maar het wordt minder overzichtelijk en je kunt later moeilijker aanpassingen doen.

Misschien wist je nog niet dat Access gebaseerd is op de computertaal SQL. Met SQL-opdrachten haal je specifieke gegevens op uit je database. In het formulier frmFietsen hebben we de tblFietsen als recordbron gekozen. Eigenlijk staat er de SQL-opdracht “SELECT * FROM tblFietsen” = haal alle records op van de tabel tblFietsen met de beperking zoals in “WHERE” aangegeven. De bovenstaande code staat voluit geschreven:

“SELECT ref_id, ref_strVerkort FROM tblReferenties WHERE ref_strTabel = ‘Fiets’ en ref_id IN (3, 4, 5)  ORDER BY ref_strVerkort”

Je ziet dat ik de vetgedrukte variabelen strPbForm en strItems al heb ingevuld met ‘Fiets’ en ‘3,4,5’. Op de vulling van de variabelen kom ik uiteraard later terug, maar nu kan ik alvast aangeven dat de strItems de informatie ophaalt uit de tabel ‘tblFietsen’ en het veld ‘fts_strFiets’

Deze sql-opdracht verbinden we aan de eigenschap ‘Rijbron’ (lstRechter.Rowsource) van het besturingselement ‘lstRechter’.

Terug naar de eigenschappen van de Keuzelijsten

lstrechter-gegevens   lstrechter-opmaak

We moeten nu nog even terug naar de ontwerpweergave van het formulier ‘frmFietsen’. Kies daar voor de eigenschappen van ‘lstRechter’ en stel die in zoals hiernaast weergegeven. In de opmaak zie je staan dat er twee kolommen zijn, waarvan de 1e kolom niet zichtbaar is (0cm). Ook kies je ervoor om de kolomkoppen niet te laten zien.

Als je de bovenstaande SQL-opdracht kopieert en plakt in de eigenschap Rijbron en je kiest voor Weergave van het formulier, dan zie je de gekozen Id’s 3,4,5 weergegeven als ‘Goed voorwiel’, ‘Goed achterwiel’ en ‘Handrem’. Kijk maar even in de tblReferenties en doorgrondt de sql-opdracht.

Je kunt er nog voor kiezen om de 1e kolom en de kolomkoppen wel te laten zien. In de Weergave zie je dan ‘ref_id’ en ‘ref_strVerkort’ met in de 1e kolom de ID’s 1 en 3.

Het vullen van de variabelen ‘strItems’ en ‘strPbForm’

Zoals gezegd waren mijn variabelen al gevuld met ‘Fiets’ en ‘1, 3’. Dit vindt plaats op het moment dat het formulier frmSelectieVenster zich opent. Daartoe moeten we de code van het frmFietsen bekijken. Immers vanuit dit formulier laten we het Selectievenster openen.

Ga naar het frmFietsen in de ontwerpweergave, klik met de rechtermuisknop op de btnFiets en kies voor Gebeurtenis opbouwen. Het vba-scherm komt weer tevoorschijn. Ik zet hieronder alvast de code neer.

Private Sub btnFiets_Click()
           Dim strLinkCriteria    As String
           Dim strArgs        As String
          strLinkCriteria = “[fts_id]=” & Nz(Me.fts_ID, 0)
           strArgs = Me.ActiveControl.Name & “,” & Nz(Me.fts_strFiets.Value, “”)
           DoCmd.OpenForm “frmSelectieVenster”, , , strLinkCriteria, , , strArgs
End Sub

De variabele strLinkCriteria gaat gevuld worden met de het Id van de fiets die op dat moment voorstaat in het Weergave-venster van het frmFietsen, bijvoorbeeld ‘Batavus’ met het fts_ID = 1.

Je ziet dit weergegeven in de 3e regel: strLinkCriteria = “[fts_id]=” & Nz(Me.fts_ID, 0).

Laat je niet afschrikken door de code. De haken rond fts_id betekenen dat het een veld van een tabel is en voorkomen dat eventuele spaties in de naamgeving (wat ik niet heb gedaan) ook worden meegenomen. Dit gedeelte is een tekstgedeelte omdat het tussen aanhalingstekens staat. Daarna volgt het ‘waarde’-gedeelte wat opgehaald wordt uit het formulier frmFietsen, aangeduid met het woord ‘Me’ en de waarde uit het veld met de naam ‘.fts_ID.value’.

Dit alles staat tussen de functie NZ(). De interne vba-functie NZ(), staat voor NULLZERO geeft een waarde terug als het veld zelf de waarde NULL (helemaal oningevuld) bevat. In dit geval kies ik ervoor om dan een 0 terug te geven. In de volgende regel zie je staan dat ik een lege string (“”) terug wil bij een Null-waarde.

De ampersand (&) verbindt het tekstgedeelte met het waardegedeelte, zodat de variabel strLinkCriteria nu gevuld zou zijn met “fts_id = 1”.

De volgende regel is nu gemakkelijker te begrijpen. In de variabele strArgs komt de naam van het actuele veld (‘btnFiets’) en de inhoud van het veld ‘fts_strFiets’ te staan, i.c. ‘3,4,5’).

De laatste regel van de buttons spreekt voor zich – let op de komma’s. Open het formulier frmSelectieVenster met het record fts_id = 1 (strLinkcriteria) en de argumenten (‘btnFiets, 3,4,5). Argumenten? Ja, als het frmSelectieVenster is geopend, draagt het een eigenschap mee, die met vba (.openargs) is op te vragen. We gebruiken deze argumenten straks in de openingscodes van het formulier ‘frmSelectieVenster’

Overige buttons

Voor de volledigheid zet ik ook de code van de andere buttons neer.

Private Sub btnStuur_Click()
           Dim strLinkCriteria    As String
           Dim strArgs        As String
          strLinkCriteria = “[fts_id]=” & Nz(Me.fts_ID, 0)
           strArgs = Me.ActiveControl.Name & “,” & Nz(Me.fts_strStuur.Value, “”)
           DoCmd.OpenForm “frmSelectieVenster”, , , strLinkCriteria, , , strArgs
End Sub
Private Sub btnBanden_Click()
           Dim strLinkCriteria    As String
           Dim strArgs        As String
          strLinkCriteria = “[fts_id]=” & Nz(Me.fts_ID, 0)
           strArgs = Me.ActiveControl.Name & “,” & Nz(Me.fts_strBanden.Value, “”)
           DoCmd.OpenForm “frmSelectieVenster”, , , strLinkCriteria, , , strArgs
End Sub

Je ziet dat de code nauwelijks van elkaar verschilt. Het zou te comprimeren zijn tot één routine die door alledrie buttons aangeroepen wordt, maar dat is in dit geval een beetje overbodig. Als je de routines in het Visual Basic venster hebt geplakt, dan moet je nog wel onder de Eigenschappen bij de Gebeurtenis Bij Klikken kiezen voor de Opbouwfunctie voor Programmacode. Daarmee verbind je de uitvoering van de code aan de Button als er op geklikt wordt.

Openen van het frmSelectieVenster

Tot slot gaan we na wat er gebeurt als het frmSelectieVenster wordt geopend. Daartoe is het nodig dat er een onderbreking komt te staan op de regel ‘strLinkCriteria’. Klik met de muis op de code van de btnFiets en vervolgens op deze regel en druk daarna op de functietoets F9 van je toetsenbord. De regel wordt nu rood-bruin weergegeven, ten teken dat de uitvoering van de code hier zal stoppen.

Ga nu naar het frmFietsen, kies voor de Weergave en klik op de btnFiets.

btnfiets

De uitvoering van de procedure zal stoppen bij de aangegeven regel en in het geel worden weergegeven. Nu kun je met de functietoets F8 per regel zien wat er gebeurt. Ben je na twee keer F8 aangeland bij de DoCmd regel, ga dan even met de muis over de beide ingevulde variabelen heen. Je zult dan zien dat ze ingevuld zijn. De vulling van de variabelen kun je ook zien als in de menubalk kiest voor Beeld, Venster Locale variabelen.

Zo zie je dat de variabele ‘strArgs’ bij mij nú gevuld is met de waarde ‘btnFiets, 8,4,3,2’. Met andere woorden: de naam van de button en kennelijk is de inhoud van het veld fts_strFiets gevuld met 8,4,3,2. Als jouw veld nog niet gevuld is, staat er uiteraard allen maar ‘btnFiets,’

Vervolg met F8 en dan opent zich het venster frmSelectieVenster stoppend bij de code

‘Private Sub Form_Open(Cancel As Integer)’. Ga door met F5 of klik op het driehoekje onder de ‘n’ van ‘Invoegen’ in de knoppenbalk. Het vierkantje, iets verderop, staat voor ‘Stoppen’ van de uitvoering.

knoppenbalk-vb-driehoekje

Vervolg

Dit tweede blog zit er op! In de derde blog gaan we verder met de uitleg van de code. Opnieuw wordt het niet eenvoudiger..

Heb je vragen over onze blog? Laat hieronder een opmerking achter.

Neem contact op

Heb je een specifieke vraag of wens, bevindt je je in een knelpunt of wil je simpelweg even brainstormen? Contact ons vandaag nog op 020 6 254 254 of

Write a comment

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

Recente blogberichten


WhatsApp Ons whatsapp