Keuzelijst met invoervak sorteren op straatnaam PLUS huisnummer

Status
Niet open voor verdere reacties.

Lubbie87

Gebruiker
Lid geworden
16 feb 2009
Berichten
23
Goedemiddag,

ik heb in een formulier een keuzelijst met invoervak voor het opzoeken van, in dit geval, een adres. Dit adres bestaat uit een straatnaam plus een huisnummer.
Nu heb ik op dit moment een sortering op basis van straatnaam, echter zijn de huisnummers die erbij horen niet correct gesorteerd.
Het adres "Kerkweg 11" staat bijvoorbeeld boven het adres "Kerkweg 2".
Mijn code sorteert de huisnummers dus niet correct.

Code:
Private Sub cboAdres_AfterUpdate()
    ' De record zoeken die overeenkomt met het besturingselement
    Dim rs As Object

    Set rs = Me.Recordset.Clone
    rs.FindFirst "[debnr] = " & Str(Nz(Me![cboAdres], 0))
    If Not rs.EOF Then Me.Bookmark = rs.Bookmark
End Sub
Code:
Private Sub cboAdres_Enter()
Me.cboAdres = ""
End Sub

Weet iemand waar dit aan kan liggen?
 
Mijn code sorteert de huisnummers dus niet correct.
Niet correct; je code sorteert namelijk wèl correct. Zodra je numerieke en tekstgegevens gaat mengen (en dat doe je) is het eindresultaat per definitie een alfanumerieke string. En die wordt gesorteerd op basis van tekens, en niet van waarden. Hij sorteert dus niet op "Kerkweg 11" en "Kerkweg 2", maar als "K" en "K", "Ke" en "Ke", ... "Kerkweg 1" en "Kerkweg 2" en daarna pas "Kerkweg 11" en "Kerkweg 2". De lengte van de string bepaalt dus de sortering bij gelijke waarden. Sowieso is het natuurlijk vele malen beter om gegevens gescheiden op te slaan, dus een apart veld voor straatnaam en huisnummer. Ben je ook gelijk van je probleem af, want het huisnummer 11 komt nà het huisnummer 2. Mits je uiteraard het veld Huisnummer numeriek maakt.
 
Kan de vraag denk ik op (voor jou dan helaas niet ;) ) <Opgelost> gezet worden.
 
Is er een makkelijke manier om in de tabel de huisnummers van het adres te scheiden en in een aparte kolom te plaatsen?
Ik heb wel onderstaande module gevonden maar snap niet hoe ik het toe kan passen op de tabel.
Code:
Option Compare Database
Option Explicit

Public Type ptAdres
    adres                As String
    huisnummer           As Integer
    toevoeging           As String
End Type

Function fAdresSplitsen(s As String) As ptAdres
    Dim iPos             As Integer
    Dim iL               As Integer
    Dim sNummer          As String

    iPos = InStrRev(s, " ")

    If iPos > 0 Then
        sNummer = Mid$(s, iPos + 1)
        If Val(sNummer) = 0 Then    'geen nummer dan nog een keer de spatie zoeken voor b.v. 39 hs
            iPos = InStrRev(s, " ", iPos - 1)
        End If

        'de straatnaam
        fAdresSplitsen.adres = Left$(s, iPos - 1)

        'het huisnummer, alleen numeriek is toegestaan
        sNummer = Mid$(s, iPos + 1)
        fAdresSplitsen.huisnummer = Val(sNummer)

        'de toevoeging
        sNummer = Mid$(s, iPos + 1)
        iL = Len(CStr(Val(sNummer)))
        fAdresSplitsen.toevoeging = Trim(Right$(sNummer, Len(sNummer) - iL))
    Else
        fAdresSplitsen.adres = s
        fAdresSplitsen.huisnummer = 0    'gebruik de 0 om informatie op scherm te zetten voor handmatige aanpassing
        fAdresSplitsen.toevoeging = ""
    End If

End Function
 
Lijkt mij geen handige functie, die denk ik ook nog eens niet heel snel is. Je kunt beter de SPLIT functie gebruiken waarbij je het adres splitst op basis van een spatie. Elk woord staat dan in een array element. Je kunt dan simpel checken of een element numeriek is of niet. Al werkt dat niet helemaal goed bij toevoegingen. Maar daar is ook nog wel wat van te maken.
 
Laatst bewerkt:
Deze functie trekt het eerste nummer uit een string. Is dus ook niet geheel zonder feilen, maar je komt er qua idee al een heel eind mee.
Code:
Function AdresNummer(Adres As String) As Integer
Dim arr As Variant
Dim i As Integer
    arr = Split(Adres, " ")
    
    For i = LBound(arr) To UBound(arr)
        If IsNumeric(arr(i)) Then
            AdresNummer = arr(i)
            Exit Function
        End If
    Next i

End Function
In een query gebruik je zo'n code overigens op deze manier:
Code:
Expr1: AdresNummer([Adres])
Simpel om te zetten naar een Bijwerkquery, waarmee je op deze manier een veld Huisnummer kunt vullen.
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan