Selectievenster

Selectievensters maken in MS Access database deel 3: vervolg VBA-code

Openen van het formulier frmSelectieVenster

Deze blog sluit op de 2e blog over selectievensters. Daar bespraken we de code die wordt uitgevoerd wanneer we klikken op een van de buttons btnFiets, btnStuur of btnBanden en het Selectievenster wordt geopend. Nu gaan we bekijken wat er daarna gebeurt.

Selectievenster

We vallen met de deur in huis. Je treft onderstaand de code aan waarmee het Formulier frmSelectieVenster wordt geopend.

       Option Compare Database
       Option Explicit
       Dim strPbForm As String
       ‘Deze publiek variabele kent drie strings om informatie op te halen en weg te schrijven
       ‘Fietsen’, ‘Stuur’ en ‘Banden’, die alle drie als Public in strPBform worden doorgegeven
       Private Sub Form_Open(Cancel As Integer)
              ‘Amsterdam, 17 juni 2017
             ‘start de linkerlijst
             Dim strItems       As String
             Dim strOpenArgs     As String
             Dim intLengte       As Integer
  
             ‘Me.imgLogo.Picture = CurrentProject.Path & “\images\imgLogo.jpg”
  
             intLengte = InStr(1, Nz(Me.OpenArgs, “”), “,”)
             strPbForm = Nz(Left(Me.OpenArgs, intLengte – 1), 0)
             strPbForm = Mid(strPbForm, 4)
             strItems = Nz(Mid(Me.OpenArgs, intLengte + 1), 0)
  
             Me.lblOpschrift.Caption = strPbForm
             prcLijstRechts strItems
             prcLijstLinks
       End Sub

In de vorige blog stond de volgende opdracht:

‘DoCmd.OpenForm “frmSelectieVenster”, , , strLinkCriteria, , , strArgs’ waarmee het venster frmSelectieVenster werd geopend en in strArgs de argumenten (‘btnFiets, 3,4,5) meekreeg.

De variabele (‘btnFiets, 3,4,5) kunnen we opvragen met de functie Me.OpenArgs en plaatsen in de public variable strPbForm.

Met de functie Instr() zoeken we naar de positie van de komma. We starten op de 1e positie van de variabele ‘btnFiets, 3,4,5 en vinden de plaats van de komma met de formule

instr(1, Me.OpenArgs, ”,”) waarmee de variabele intLengte de waarde 9 krijgt. De komma staat op de 9e positie.

Omdat Me.OpenArgs ook Null kan zijn, beveilig ik een eventuele fout nog met de functie NZ().

intLengte = instr(1, Nz(Me.OpenArgs,””) ”,”).

Nu kunnen we de variabele strPbForm vullen met de eerste 8 posities van de Me.OpenArgs

strPbForm = Nz(Left(Me.OpenArgs, intLengte – 1), 0).

Van de uitkomst strPbForm = ‘btnFiets’ willen we de eerste drie posities niet meenemen. Dat doen we met de functie Mid()

strPbForm = Mid(strPbForm, 4)

De variabele strPbForm is nu gevuld met het woord ‘Fiets’. Deze waarde hebben we nodig bij het ophalen van de waarden uit de tblReferenties.

De items halen we ook op met de functie Mid() op eenzelfde logische manier vanaf de positie 10 (intLengte was 9 + 1)

strItems = Nz(Mid(Me.OpenArgs, intLengte + 1), 0)

De variabele strItems is nu gevuld met ‘3,4,5’. We weten nog dat 1 en 3 staan voor ‘Goed voorwiel’, ‘Goed achterwiel’ en ‘Handrem’.

Het opschrift van het formulier frmSelectieVenster krijgt de waarde van de variabele strPbForm (‘Fiets’) met de opdracht:

Me.lblOpschrift.Caption = strPbForm

De volgende opdracht voert de procedure prcLijstRechts uit. We hebben dit al toegelicht in onze vorige blog. De procedure krijgt het argument 3,4,5 mee met de variabele strItems.

Tenslotte wordt de procedure prcLijstLinks uitgevoerd. Let goed op.

De procedure prcLijstLinks

       Private Sub prcLijstLinks()
              ‘Amsterdam, 17 juni 2017
             ‘vult lstLinker
             Dim strSQL             As String
             Dim strItemsRechts   As String
  
             ‘Vraag de rijen op die in de rechterlijst voorkomen:
             strItemsRechts = fncItemsRechts
  
             strSQL = “SELECT ref_id”
             strSQL = strSQL & “, ref_strVerkort”
             strSQL = strSQL & ” FROM tblReferenties”
             strSQL = strSQL & ” WHERE ref_strTabel = ‘” & strPbForm & “‘”
                     If Not strItemsRechts = “” Then
                     strSQL = strSQL & ” AND ref_id NOT IN (” & strItemsRechts & “)” ‘zondert de rechterrijen uit.
                     strSQL = strSQL & ” ORDER BY ref_strVerkort”
                     End If
  
             With Me.lstLinker
                            .RowSource = strSQL
                            .Requery
             End With
       End Sub

De procedure begint met een functie. In de vorige blog leerden we dat een functie een waarde teruggeeft. De variabele strItemsRechts wordt gevuld met de waarde die met de functie fncItemsRechts wordt opgehaald.

Het ophalen van de waarden in het rechterlijstje met de functie ‘fncItemsRechts’

       Function fncItemsRechts () As String
      ‘Amsterdam, 16 juni 2017
      ‘Routine die de lijst met items samenstelt
      Dim strItem         As String
      Dim strItems         As String
      Dim lngItem         As Long
      ‘Controleer of er een item in de rechterlijst voorkomt.
      If Me.lstRechter.ListCount = 0 Then ‘De lijst is leeg
             strItem = “”
      Else
             For lngItem = 0 To Me.lstRechter.ListCount – 1
                            strItem = Nz(Me.lstRechter.Column(0, lngItem), 0)
                            strItems = strItems & strItem
                            ‘ Dan nog komma tussen de namen (als het niet het laatste item is
                            If Not (lngItem = (Me.lstRechter.ListCount – 1)) Then
                            strItems = strItems & “, “
                            End If
             Next
      End If
      fncItemsRechts = strItems
      
       End Function

Het ophalen van de waarden gaat met een For, Next – lus en wel zo vaak als er waarden in de lijst voorkomen.

Met Me.lstRechter.ListCount wordt het aantal waarden opgehaald uit het rechterlijstje. Deze waren met de vorige opdracht prcLijstRechts gevuld met de waarden 3,4,5. Er zijn met andere woorden dus drie items.

For lngItem = 0 To Me.lstRechter.ListCount – 1

Het eerste item heeft de waarde 0, waardoor de For, Next – lus drie keer rond gaat en lngItem achtereenvolgens 0, 1 en 2 als waarde krijgt. Met deze waarde van lngItem wordt de inhoud van dit item opgehaald met:

strItem = Nz(Me.lstRechter.Column(0, lngItem), 0)

Achtereenvolgens worden in het rechterlijstje de waarden 3, 4 en 5 gevonden.

De gevonden waarde ‘strItem’ wordt met een komma toegevoegd aan de variabele ‘strItems’, tenzij dit het laatste item in de lijst is.

     strItems = strItems & strItem

      ‘ Dan nog komma tussen de namen als het niet het laatste item is

     If Not (lngItem = (Me.lstRechter.ListCount – 1)) Then

             strItems = strItems & “, “

     End If

De functie fncItemsRechts levert dus in ons geval de string ‘3, 4, 5’ op, waarmee de variabele strItemsRechts wordt gevuld.

Met de strSQL variabele gaan we alle waarden ‘ref_id’ en ‘ref_strVerkort’ ophalen uit de tblReferenties met de waarde ‘Fiets’ (strPbForm). Maar als er iets gevuld is in de variabele ‘strItemsRechts’ (If Not strItemsRechts = “”) dan worden deze uitgezonderd door de opdracht ‘AND ref_id NOT IN (” & strItemsRechts & “)”.

Hier staat dus eigenlijk: Haal alle ref_id’s op uit de tblReferenties waar ‘Fiets’ is ingevuld in het veld ‘ref_strTabel’ (dat worden dan ‘1, 2, 3, 4, 5, 6, 7, 8’), maar zonder hiervan uit de waarden ‘3,4 en 5’, omdat die al in het rechterlijstje staan.

Hiermee heeft het venster frmSelectieVenster de hele procedure doorlopen als het geopend wordt en zullen het linker- en het rechterlijstje gevuld zijn.

Keuze van links naar rechts overbrengen

Dat gaan we op 2 manieren doen, nl met de button btnNaarRechts of een dubbelklik op het linkerlijstje. Onderstaande code laat de prcNaarRechts uitvoeren:

       Private Sub btnNaarRechts_Click()
             prcNaarRechts
       End Sub
       Private Sub lstLinker_DblClick(Cancel As Integer)
             prcNaarRechts
       End Sub
Hoe werkt de prcNaarRechts()
       Private Sub prcNaarRechts()
             ‘Amsterdam, 17 juni 2017
             ‘Voegt het linkerItem toe aan de rechterlijst
             Dim lngItem                    As Long
             Dim strRechterItems         As String
  
              If Me.lstLinker.ListIndex = -1 Then ‘Niets doen als er geen naam geselecteerd is (.ListIndex = -1)
                            If Me.lstLinker.ListCount > 0 Then ‘De lijst kan ook leeg zijn
                            MsgBox “Selecteer eerst een naam.”, vbInformation
                            End If
             Else
                            ‘Welke items staan al in de rechterlijst?
                            strRechterItems = fncItemsRechts
                            ‘Controleer welk item in de linkerlijst geselecteerd is en voeg het dan toe aan die in de rechterlijst
                            For lngItem = 0 To Me.lstLinker.ListCount – 1
                            If Me.lstLinker.Selected(lngItem) Then
                                          If strRechterItems = “” Then ‘zonder komma
                                           strRechterItems = Me.lstLinker.Column(0, lngItem)
                                          Else ‘met komma
                                          strRechterItems = strRechterItems & “, ” & Me.lstLinker.Column(0, lngItem)
                                          End If
                                          Exit For
                            End If
                            Next
                            prcLijstRechts strRechterItems
                            prcLijstLinks
             End If
       End Sub

Het eerste deel van deze procedure heeft nog wat uitleg nodig. Het begint ermee dat er op de btnNaarRechts is geklikt en er geen selectie is gemaakt. In dat geval is de .listindex gelijk aan -1. Daarna kan het zijn dat alle items al naar de rechterlijst zijn overgebracht en er geen items meer over zijn in de linkerlijst. We ondervangen hiermee dat de procedure dan vastloopt. Als er geen selectie is gemaakt en er zijn nog wel items in de linkerlijst, dan volgt een berichtje in de messagebox.

Met de eerdere uitleg van de functie fncItemsRechts zal het vervolg van de procedure al snel te lezen zijn. In feite worden de rechter items opnieuw opgevraagd en wordt het geselecteerde item uit de linkerlijst met de opdracht Me.lstLinker.Selected(lngItem) eraan toegevoegd.

Keuze van rechts naar links overbrengen

Eveneens doen we dat op twee manieren. Met de btnNaarLinks of een dubbelklik op het rechterlijstje.

       Private Sub lstRechter_DblClick(Cancel As Integer)
             prcNaarLinks
       End Sub
       Private Sub btnNaarLinks (Cancel As Integer)
             prcNaarLinks
       End Sub
Hoe werkt de procedure prcNaarLinks()
Private Sub prcNaarLinks()
‘Amsterdam, 17 juni 2017
      ‘Verwijdert het gekozen item uit de rechterlijst en bouwt de linker opnieuw op
              Dim lngItem                    As Long
             Dim strRechterItems        As String
             Dim intItem                     As Integer
             Dim strItem                    As String
             Dim strPlaats                  As String
  
              If Me.lstRechter.ListIndex = -1 Then ‘Niets doen als er geen naam geselecteerd is (.ListIndex = -1)
                            If Me.lstRechter.ListCount > 0 Then
                            MsgBox “Selecteer eerst een naam.”, vbInformation
                            End If
             Else
                            ‘Controleer of het item in de rechterlijst geselecteerd is, en verwijder het dan
                            strRechterItems = fncItemsRechts
                            For lngItem = 0 To Me.lstRechter.ListCount – 1
                            If Me.lstRechter.Selected(lngItem) Then
                                          strItem = Me.lstRechter.Column(0, lngItem)
                                          intItem = Len(strItem)
                                          strPlaats = InStr(1, strRechterItems, strItem)
                                          strRechterItems = Left(strRechterItems, strPlaats – 1) & Mid(strRechterItems, strPlaats + intItem + 2)
                                          Exit For
                             End If
                            Next
                            ‘Opnieuw opbouwen
                            prcLijstRechts strRechterItems
                            prcLijstLinks
             End If
       End Sub

 

Het zal je niet verbazen dat deze procedure vrijwel hetzelfde is als de procedure prcNaarRechts.

Het verschil zijn de opdrachten.

strPlaats = InStr(1, strRechterItems, strItem)

                  strRechterItems = Left(strRechterItems, strPlaats – 1) & Mid(strRechterItems, strPlaats + intItem + 2)

Eerst wordt de plaats van het gekozen item gezocht in de variabel strRechteritems en vervolgens met de functies Left() en Mid() uit de string gehaald. Na het item worden nog twee posities meegenomen: de komma en de spatie.

Als de srtRechterItems is gewijzigd, worden de beide listboxen opnieuw opgebouwd.

Vervolg

Dit derde blog zit er ook alweer op. Er rest nog 1 laatste blog, waarin wij de resultaten zullen  overbrengen naar het formulier frmFietsen eenvoudigweg door op de btnOke te klikken.

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