I dette emne beskrives fremgangsmåden for sortering af IP-adresser, der er gemt i en Access database.
Introduktion
Hvis du arbejder med IP-adresser, ved du sikkert allerede, at det ikke er lige så ligetil som at arbejde med tekst eller tal. Dette skyldes, at en IP-adresse i virkeligheden er en samling af fire numeriske værdier adskilt af punktum (.), hvor hver værdi er et tal mellem 0 og 255. Følgende tabel viser data, før der anvendes en sorteringsrækkefølge.
MachineID |
Medarbejder |
Sted |
IPAddress |
1 |
... |
... |
123.4.245.23 |
2 |
... |
... |
104.244.253.29 |
3 |
... |
... |
1.198.3.93 |
4 |
... |
... |
32.183.93.40 |
5 |
... |
... |
104.30.244.2 |
6 |
... |
... |
104.244.4.1 |
Sortering af IP-adresser i Access er en udfordring, fordi Access ikke indeholder en særlig datatype til lagring af IP-adresser. Selvom en IP-adresse blot er en samling tal, kan du ikke gemme en IP-adresse i et numerisk felt. Dette skyldes, at et numerisk felt kun understøtter et enkelt decimaltegn (.), mens en IP-adresse indeholder tre punktummer (.). Det betyder, at du skal gemme adresserne i et tekstfelt.
Da du gemmer IP-adresser i et tekstfelt, kan du ikke bruge de indbyggede sorteringsknapper i Access til at sortere adresserne på en meningsfuld måde. Sorteringsknapperne sorterer altid værdier i et tekstfelt i alfabetisk rækkefølge, også selvom tegnene er tal. Med andre ord sorteres adresserne efter det første ciffer, derefter efter det andet ciffer osv., i stedet for efter de numeriske værdier, der udgør adressen. Følgende tabel viser adresserne fra den forrige tabel sorteret i alfabetisk rækkefølge i feltet IPAddress.
MachineID |
IPAddress |
3 |
1.198.3.93 |
2 |
104.244.253.29 |
6 |
104.244.4.1 |
5 |
104.30.244.2 |
1 |
123.4.245.23 |
4 |
32.183.93.40 |
De adresser, der starter med 1, vises før de adresser, der starter med 2 osv. Følgende tabel viser adresserne i den rigtige stigende rækkefølge.
MachineID |
IPAddress |
3 |
1.198.3.93 |
4 |
32.183.93.40 |
5 |
104.30.244.2 |
6 |
104.244.4.1 |
2 |
104.244.253.29 |
1 |
123.4.245.23 |
For at gøre det nemmere at forstå trinnene i forbindelse med sortering af disse adresser opdeler du IP-adresserne i fire numeriske dele. Adresserne skal sorteres efter den første del og derefter for hver værdi i den første del, derefter efter den anden del osv. Tabellen viser hver del i en anden kolonne, og fordi kolonnerne indeholder simple numeriske værdier, bliver det muligt at sortere kolonnerne fra venstre mod højre i stigende rækkefølge, som vist i følgende tabel.
PartI |
DelII |
PartIII |
DelIV |
1 |
198 |
3 |
93 |
32 |
183 |
93 |
40 |
104 |
30 |
244 |
2 |
104 |
244 |
4 |
1 |
104 |
244 |
253 |
29 |
123 |
4 |
245 |
23 |
Sortering af de fire dele separat er tricket bag sortering af IP-adresser. I følgende fremgangsmåde opretter du en forespørgsel, der foruden FELTET IP-adresse indeholder fire beregnede kolonner, hvor hver kolonne gemmer en del af adresseværdierne. Den første beregnede kolonne indeholder den første numeriske del af adressen, den anden beregnede kolonne indeholder den anden numeriske del af adressen osv. I stedet for at sortere posterne efter feltet IPAddress sorterer forespørgslen posterne efter de fire beregnede kolonner.
Opret forespørgslen
Du skal oprette en udvælgelsesforespørgsel med navnet Sorterede IPAddresses, der viser posterne i stigende rækkefølge af IP-adresser. Antag, at den aktuelle database har en tabel med navnet MachineDetails, der indeholder et tekstfelt med navnet IPAddress.
-
Klik på Opret > forespørgselsdesign.
-
Vælg Tilføj tabeller(Vis tabel iAccess 2013), og træk Computerdetaljer til den øverste del af designvisning.
-
Træk felterne MachineID og IPAddress til forespørgselsdesigngitteret.
-
Du er nu klar til at tilføje de beregnede kolonner. I den første tomme kolonne til højre skal du skrive udtrykket PartI: Val(Left([IPAddress],(InStr(1,[IPAddress],".") -1))) i feltrækken. Udtrykket returnerer de tegn, der er før det første punktum (.) i feltet IPAddress.
Gennemse nu udtrykket. Da du ikke ved, hvor mange cifre der udgør den første del af adressen, kan du bruge funktionen InStr til at finde placeringen af det første punktum. Hvis du trækker 1 fra (for at udelade punktum), returneres antallet af cifre i første del. Du kan derefter bruge dette tal sammen med funktionen Venstre til at udtrække så mange tegn fra tegnet længst til venstre fra feltet IPAddress. Til sidst skal du kalde funktionen Val for at konvertere de tegn, der returneres af funktionen Venstre, til et tal. Det sidste trin er nødvendigt, fordi den underliggende datatype er Tekst.
-
Gem forespørgslen ved at klikke på Gem på værktøjslinjen Hurtig adgang. Det er en god ide at gøre dette efter hvert mellemliggende trin.
-
Tilføj kolonnen for den anden adressedel. I kolonnen til højre for PartI skal du skrive PartI: Val(Mid([IPAddress],InStr(1,[IPAddress],".") +1,InStr(InStr(1,[IPAddress],".") +1,[IPAddress],".") -InStr(1,[IPAddress],".") -1)) i feltrækken. Udtrykket returnerer de tegn, der er placeret mellem det første og det andet punkt i feltet IPAddress.
Gennemse udtrykket igen. Da du ikke ved, hvor mange cifre der udgør den anden del af adressen, eller præcis hvor den anden del starter (fordi du ikke hvor længe den første del er), bruger du funktionen InStr til at finde placeringerne af perioderne. Du kan derefter bruge funktionen Midt til at udtrække de tegn, der følger efter det første punktum, men foran det andet punktum. Til sidst skal du kalde funktionen Val for at konvertere de tegn, der returneres af funktionen Mid, til et tal. Det sidste trin er nødvendigt, fordi den underliggende datatype er Tekst.
-
Tilføj kolonnen for tredje adressedel. I kolonnen til højre for DelII skal du skrive PartIII: Val(Mid([IPAddress],InStr(InStr(1,[IPAddress],".") +1,[IPAddress],".") +1,InStr(InStr(InStr(1,[IPAddress],".") +1,[IPAddress],".") +1,[IPAddress],".") -InStr(InStr(1,[IPAddress],".") +1,[IPAddress],".") -1)) i feltrækken. Udtrykket returnerer de tegn, der er placeret mellem det andet og tredje punkt i feltet IPAddress.
Gennemse udtrykket igen. Da du ikke ved, hvor mange cifre der udgør tredje del af adressen, eller præcis hvor den tredje del starter (fordi du ikke ved, hvor lang tid den første og anden del er), bruger du funktionen InStr til at finde placeringerne af perioderne. Du kan derefter bruge funktionen Midt til at udtrække de tegn, der følger efter det andet punktum, men foran det tredje punktum. Til sidst skal du kalde funktionen Val for at konvertere de tegn, der returneres af funktionen Mid, til et tal. Det sidste trin er nødvendigt, fordi den underliggende datatype er Tekst.
-
Tilføj kolonnen for den fjerde og sidste adressedel. I kolonnen til højre for PartIII skal du skrive PartIV: Val(Right([IPAddress],Len([IPAddress])-InStr(InStr(InStr(1,[IPAddress],".") +1,[IPAddress],".") +1,[IPAddress],"."))) i rækken Felt. Udtrykket returnerer de tegn, der følger efter det sidste punktum.
Gennemse udtrykket igen. Nøglen er at finde placeringen af det tredje punktum og derefter udtrække alle de tegn, der følger efter det. Da du ikke ved præcis, hvor den tredje periode er placeret, skal du ringe til Funktionen InStr tre gange for at finde placeringen af den tredje periode. Du kan derefter bruge funktionen Længde til at beregne antallet af cifre i fjerde del. Antallet af cifre, der returneres, bruges derefter sammen med funktionen Højre til at udtrække så mange tegn fra den højre del af feltet IPAddress. Til sidst skal du kalde funktionen Val for at konvertere de tegn, der returneres af funktionen Mid, til et tal. Det sidste trin er nødvendigt, fordi den underliggende datatype er Tekst.
-
Indstil rækken Sortér for alle fire beregnede kolonner til Stigende.
Vigtigt Rækken Sortér i kolonnen IPAddress skal være tom.
Hvis du vil sortere efter andre feltværdier ud over adresserne, skal du placere felterne enten til venstre eller højre for alle fire beregnede kolonner. Placer ikke de andre sorteringsfelter mellem de beregnede kolonner.
-
Det næste trin er at skjule de fire beregnede kolonner fra dataarket. Men før du gør det, skal du skifte til dataarkvisning for at se resultatet af udtrykkene i de beregnede kolonner. Følgende tabel viser de kolonner, der vises i dataarkvisning.
MachineID
IPAddress
PartI
DelII
PartIII
DelIV
3
1.198.3.93
1
198
3
93
4
32.183.93.40
32
183
93
40
5
104.30.244.2
104
30
244
2
6
104.244.4.1
104
244
4
1
2
104.244.253.29
104
244
253
29
1
123.4.245.23
123
4
245
23
-
Skift tilbage til designvisning, og fjern markeringen i afkrydsningsfeltet i rækken Vis for alle fire beregnede kolonner. Dette forhindrer, at de beregnede kolonner vises i dataarkvisning.
-
Du kan også angive kriterier for at udelukke poster fra forespørgslen.
-
Skift til dataarkvisning for at få vist posterne i sorteret rækkefølge. Du får vist posterne korrekt sorteret i stigende rækkefølge af IP-adresserne.
Flere anvendelsesområder for sorterede IP-adresser
Valider IP-adresser under dataindtastning
Hvis du vil validere adresser uden at skrive kode, kan du gøre det i begrænset omfang ved at angive egenskaben Inputmaske for feltet til ### .###.###.####;0;" " og egenskaben Format for feltet IP-adresse til at &&&&&&&&&&&&.
Hvad gør inputmasken? Når du begynder at skrive i adressefeltet, forhindrer inputmasken dig i at indtaste andre tegn end tal og mellemrum mellem de tre punktummer. Hvis en numerisk del er et dobbeltcifret tal, skal du lade det tredje ciffer være tomt eller skrive et mellemrum i stedet for. Bemærk, at denne inputmaske ikke advarer brugeren, hvis han springer indtastning af en eller flere dele af adressen over eller kun skriver mellemrum i stedet for en numerisk værdi. Eksempel: "345. .3. " ville blive accepteret som en gyldig adresse.
Hvad gør visningsformatet? Når du er færdig med at skrive og forlader feltet, fjerner visningsformatet mellemrummene i adressen og viser kun tallene og punkterne. Så hvis du har skrevet "354.35 .2 .12", vises adressen som "354.35.2.12". Bemærk, at hvis du klikker inde i adressen, eller trykker på F2 (for at angive redigeringstilstand), når adressen er markeret, vises mellemrummene igen.
Tip!: Hvis du vil kopiere en adresse, skal du gå til den forrige kolonne eller det forrige kontrolelement, trykke på Tab for at vælge den formaterede adresse og derefter klikke på Kopiér. Ved at gøre dette kopierer du ikke den adressestreng, der indeholder mellemrum.
Sortere poster i en formular eller rapport efter IP-adresser
Hvis du vil oprette en formular eller rapport, hvor posterne sorteres efter IP-adresser, skal du basere det nye objekt på en forespørgsel, der sorterer adresser som beskrevet tidligere, i stedet for på den tabel, hvor adresserne gemmes.