Avatar billede fqthjoe Nybegynder
03. marts 2003 - 20:16 Der er 6 kommentarer og
1 løsning

sortering af tal (ip-adresser9

Hej eksperter
Har en access-base knyttet til mit VB6.0-prg.
Her har jeg et felt til ip-adresser (tal), som jeg gerne vil have sorteret.
Eks. på poster:
10.100.0.1
10.100.0.2
10.100.0.200
10.100.0.3
Så sorterer den .200 før .3
Kan man gøre noget ved dette ?
Avatar billede kabbak Professor
03. marts 2003 - 22:40 #1
Når der står 10.100.0.200 er det en tekst, så når du sorterer kikker den på værdien på hvert tegns plads, og når den når til tegn 10 er 2 jo mindre end 3.

Derfor kan den ikke sortere bedre ellers skal du lave dem om således, men der er jo ikke korrekt.

010.100.000.001
010.100.000.002
010.100.000.200
010.100.000.003

så jeg tror ikke du kan sortere bedre en du gør nu.
Avatar billede tjacob Juniormester
04. marts 2003 - 08:57 #2
kabbak har ret:

En måde at gøre det på (besværligt):

1) læs alle IP-adresserne ud af DB ind i et array
2) loop igennem array og indsæt foranstående 0'er
3) Sortér
4) trim foranstående 0'er væk igen
5) genindlæs IP-adresserne til DB i korrekt rækkefølge

En nemmere metode er:
Når posterne indlæses i DB'en, så indsæt de foranstående 0'er først, og
lad tabellen indeholde adresserne MED foranstående nuller.
Så vil tabellen altid kunne sorteres korrekt.

Så behøver du blot en rutine, der kan fjerne de foranstående 0'er
når du trækker IP-adresser ud af DB.

Hvis du ønsker hjælp til kode der kan indsætte/fjerne 0'er,
så lad mig det vide.

/tjacob
Avatar billede tjacob Juniormester
04. marts 2003 - 09:27 #3
For i øvrigt:

Er du sikker på at feltet i tabellen der indeholder IP-adresserne
er et tal?    Hvordan kan du have flere . i et tal?
Tror du ikke at de er lagret som strenge?

Her er de rutiner jeg talte om:
(Det er forudsat at du har posterne i et strengarray IParray):

Dim strNum() As String, strTemp As String, i As Long, j As Long
    'laver alle tal 3-cifrede med foranstående nuller:
    For i = 0 To UBound(IParray)
        strTemp = ""
        strNum = Split(IParray(i), ".")
        For j = 0 To UBound(strNum)
            strTemp = strTemp & Format(CLng(strNum(j)), "000") & "."
        Next j
        strTemp = Left(strTemp, Len(strTemp) - 1)
        IParray(i) = strTemp
    Next i
    'fjerner alle foranstående nuller (lader mindst ét ciffer stå):
    For i = 0 To UBound(IParray)
        strNum = Split(IParray(i), ".")
        strTemp = ""
        For j = 0 To UBound(strNum)
            strTemp = strTemp & Format(CLng(strNum(j)), "##0") & "."
        Next j
        strTemp = Left(strTemp, Len(strTemp) - 1)
        IParray(i) = strTemp
    Next i

/tjacob
Avatar billede fqthjoe Nybegynder
04. marts 2003 - 12:29 #4
tjacob:
Din løsning ser meget interessant ud :-)
"Det er forudsat at du har posterne i et strengarray IParray):"
Kan du hjælpe mig med det ?

"Tror du ikke at de er lagret som strenge?"
jo :-)
vh thjoe
Avatar billede olet Nybegynder
04. marts 2003 - 12:48 #5
Umiddelbart ville jeg dele IP adresserne op i de 4 bestanddele og placere dem i hver sin kolonne og så sortere på dem i den rigtig rækkefølge. Samles så igen til præsentationsformål.

Men why bother. Er det ikke korrekt af .200 kommer før .3 ? Hele formålet med sorteringen må jo være at gøre det lettere for en bruger at finde en given IP-adresse og hvis jeg fx ledte efter 1.1.1.3 så ville jeg da ikke forvente at finde den i en rækkefølge fortolket til 1.1.1.003 ?? If it ain't broke, don't fix it.
Avatar billede tjacob Juniormester
04. marts 2003 - 15:56 #6
Du behøver sådan set ikke at indlæse posterne i et array.

Eksempel med almindelig ADODB:

Database med Tabel "Kunder"
med felter: "IP_adresse" -streng + flere andre

Efter du har lavet en Connection:

Dim rsIP As RecordSet, strTemp As String, sNum() As String, i As Long

Set rsIP = New RecordSet
strTemp = "SELECT * FROM Kunder"
rsIP.Open strTemp, [Connection], adOpenKeyset, adLockOptimistic, adCmdText
Do While Not rsIP.EOF
    strTemp = ""
    sNum = Split(rsIP.Fields("IP_adresse"), ".")
    For i = 0 To UBound(sNum)
        strTemp = strTemp & Format(CLng(sNum(i)), "000") & "."
    Next i
    strTemp = Left(strTemp, Len(strTemp) - 1)
    rsIP.Fields("IP_adresse") = strTemp
    rsIP.Update
    rsIP.MoveNext
Loop
rsIP.Close
Set rsIP = Nothing

Dette vil ændre data direkte i tabellen.

/tjacob
Avatar billede fqthjoe Nybegynder
04. marts 2003 - 19:04 #7
tjacob
Ok. Jeg er desværre stået af.. kan ikke få det til at virke :-(
Men det er nok mig der læse bedre på lektien...
Men du skal have points.. for tiden du har brug.. Takker..
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