Avatar billede pjen2004 Nybegynder
30. august 2008 - 08:21 Der er 9 kommentarer og
1 løsning

Sortere string felt fra Access db (husnr.e)

Hej

Jeg håber en kan hjælpe med følgende sorteringsproblem. Jeg har en adresse-database med vejnavne og husnumre for hele Danmark. Husnr.e er af datatypen ”string” da der kan forekomme bogstaver i denne (f.eks. nr. 22A). I en dropdown-boks skal jeg udvælge husnr. på en given vej. Når jeg sorterer efter husnr. får jeg f.eks. følgende sorterede liste:

11
18
2
21
22
25
3
30
31
32A
32B

Hvordan sikres det, at nr. 2 kommer før 11 og 18?
Avatar billede jakobdo Ekspert
30. august 2008 - 08:29 #1
Du skal have fat i en funktion, som sortere efter det man kalder: natural sort.
Da 2 jo netop skal komme før 11.
Standard sort kigger på 2 er efter 1 og derfor ender det med "fejl".
Avatar billede erikjacobsen Ekspert
30. august 2008 - 09:04 #2
Avatar billede kabbak Professor
30. august 2008 - 10:23 #3
Her er en funktion, den sættes i et modul

Public Function Husnr_Sortering(Nr As String, plads_0_1 As Byte) As Variant
    Dim I As Integer, UD(1) As Variant
    For I = 1 To Len(Nr)
        If IsNumeric(Mid(Nr, I, 1)) Then
            UD(0) = UD(0) & Mid(Nr, I, 1)
        Else
            UD(1) = UD(1) & Mid(Nr, I, 1)
        End If
    Next
    If plads_0_1 = 0 Then Husnr_Sortering = UD(0)
    If plads_0_1 = 1 Then Husnr_Sortering = UD(1)
End Function

Så laver du en forespørgsel som denne

SELECT Adresser.NR, Husnr_Sortering([NR],0) AS NR_Sorteret, Husnr_Sortering([NR],1) AS Bogstav_Sorteret
FROM Adresser
ORDER BY Husnr_Sortering([NR],0), Husnr_Sortering([NR],1);
Avatar billede kabbak Professor
30. august 2008 - 11:13 #4
Måske en lille ændring, der kan jo være etage på, eks. 22b 3th

Public Function Husnr_Sortering(Nr As String, plads_0_1 As Byte) As Variant
    Dim I As Integer, UD(1) As Variant
    For I = 1 To Len(Nr)
        If IsNumeric(Mid(Nr, I, 1)) Then
            UD(0) = UD(0) & Mid(Nr, I, 1)
        Else
            UD(1) = UD(1) & Right(Nr, Len([Nr]) - (I - 1))
            Exit For
        End If
    Next
    If plads_0_1 = 0 Then Husnr_Sortering = UD(0)
    If plads_0_1 = 1 Then Husnr_Sortering = UD(1)
End Function
Avatar billede pjen2004 Nybegynder
30. august 2008 - 18:14 #5
Tak til Kabbak for svar!

Der er ikke etager på... så jeg holder mig til første udgave.

Jeg har indsat følgende:

    Dim Conn As New Connection
    Stinavn = App.Path & "\Adresse.mdb"
    Conn.Open "Driver={Microsoft Access Driver (*.mdb)};Dbq=" & Stinavn & ";"
    strSQL = "SELECT HUSNR, Husnr_Sortering([NR],0) AS NR_Sorteret, Husnr_Sortering([NR],1) AS Bogstav_Sorteret FROM Adresse WHERE KOMNR = " & KOMM_NR & " and VEJKODE = " & VEJ_KODE & " ORDER BY Husnr_Sortering([NR],0), Husnr_Sortering([NR],1)"
    Set rs = Conn.Execute(strSQL)

Og oprettet en ny "modul": Module1(Module1) og kopiere følgende kode ind:

Public Function Husnr_Sortering(Nr As String, plads_0_1 As Byte) As Variant
    Dim I As Integer, UD(1) As Variant
    For I = 1 To Len(Nr)
        If IsNumeric(Mid(Nr, I, 1)) Then
            UD(0) = UD(0) & Mid(Nr, I, 1)
        Else
            UD(1) = UD(1) & Mid(Nr, I, 1)
        End If
    Next
    If plads_0_1 = 0 Then Husnr_Sortering = UD(0)
    If plads_0_1 = 1 Then Husnr_Sortering = UD(1)
End Function

Når jeg afvikler får jeg "der er en ikke defineret funktion "Husnr_Sortering" i udtrykket..." Hvad har jeg glemt?
Avatar billede pjen2004 Nybegynder
30. august 2008 - 18:17 #6
Skal der ikke noget med:

Private Declare Function Husnr_Sortering .... et eller andet ind først?
Avatar billede kabbak Professor
30. august 2008 - 19:02 #7
Ja, det er fordi, du ikke kører koden, i den access , der har  tabellen
Avatar billede kabbak Professor
30. august 2008 - 19:04 #8
Lav en forespørgsel i Adresse.mdb, det er også der du skal have funktionen.
Så når du skal hente, så hent fra forespørgslen i Adresse.mdb
Avatar billede pjen2004 Nybegynder
01. september 2008 - 08:44 #9
Ok. tak for det. Læg et svar så får du points!
Avatar billede kabbak Professor
01. september 2008 - 08:58 #10
et svar ;-))
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester