本主題說明 (儲存在 Access 資料庫中的IP) 位址排序因特網通訊協議的程式。
簡介
如果您使用IP位址,您可能已經知道它並不像使用文字或數字那麼簡單。 這是因為IP位址實際上是以句號 (.) 分隔的四個數值集合,其中每個值都是0到255之間的數位。 下表顯示套用任何排序順序之前的數據。
MachineID |
員工 |
位置 |
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 |
在 Access 中排序 IP 位址是一項挑戰,因為 Access 並未提供儲存 IP 位址的特殊資料類型。 雖然IP位址只是數位的集合,但您無法將IP位址儲存在數值欄位中。 這是因為數值欄位只支援單一小數點 (.) ,而IP位址包含三個句 (.) 。 這表示您必須將位址儲存在文字欄位中。
因為您將IP位址儲存在文字欄位中,因此您無法使用 Access 中的內建排序按鈕,以有意義的方式排序位址。 排序按鈕一律會依字母順序排序文字欄位中的值,即使字元是數位也一樣。 換句話說,位址是依第一位數排序,再依第二位數排序,依此類推,而不是依構成位址的數值排序。 下表顯示 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 |
開頭為 1 的位址會先顯示在以 2 開頭的位址之前,依此類再顯示。 下表顯示位址的遞增順序 是正確的 。
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 |
若要更輕鬆瞭解排序這些位址所涉及的步驟,您可以將IP位址分成四個數值部分。 地址必須依第一部分排序,然後針對第一部分的每一個值,然後依第二部分排序,依此類操作。 表格會顯示不同數據行中的每一個部分,而且由於數據行保存簡單的數值,因此可以按照遞增順序從左至右排序數據行,如下表所示。
PartI |
PartII |
PartIII |
PartIV |
---|---|---|---|
1 |
198 |
3 |
93 |
32 |
183 |
93 |
40 |
104 |
30 |
244 |
2 |
104 |
244 |
4 |
1 |
104 |
244 |
253 |
29 |
123 |
4 |
245 |
23 |
分別排序四個部分是排序 IP 位址背後的訣竅。 在接下來的程式中,您會建立一個查詢,除了IP位址欄位之外,還包含四個計算結果列,其中每一欄會儲存位址值的一部分。 第一個計算結果列會保留位址的第一個數值部分,第二個計算結果欄會保留位址的第二個數值部分,依此類推。 查詢會依據四個計算結果列來排序記錄,而不是依IPAddress字段排序記錄。
建立查詢
您將建立名為 [排序的IPAddresses] 的選取查詢,以IP位址的遞增順序顯示記錄。 假設目前的資料庫有名為 MachineDetails 的數據表,其中包含名為 IPAddress 的文字字段。
-
按兩下 [建立 > 查詢設計]。
-
選取 [新增數據表 (在 Access 中 顯示數據表 ]) 並將 [ 計算機詳細數據 ] 拖曳到 [設計視圖] 的上方區段。
-
將 MachineID 和 IPAddress 欄位拖曳到查詢設計網格線。
-
您現在可以新增計算結果列了。 在右側第一個空白欄中,輸入表達式 PartI:Val (Left ([IPAddress], (InStr (1,[IPAddress],“”。在 [功能變數] 列中 ) -1) ) ) 。 表達式會傳回第一個句點 (.) 之前的字元 中的IPAddress功能變數。
現在請檢閱表達式。 由於您不知道位址第一部分有多少位數,因此您可以使用 InStr 函數來尋找第一個句點的位置。 減去 1 (以排除句點) 會傳回第一部分的位數。 接著,您將此數位與 Left 函數搭配使用,從 IPAddress 欄位從最左邊的字元開始擷取許多字元。 最後,您呼叫 Val 函數,將 Left 函數傳回的字元轉換為數位。 最後一個步驟是必要的,因為基礎數據類型是 [文字]。
-
按兩下 [快速存取工具列] 上的 [儲存],儲存查詢。 建議您在每個中繼步驟之後執行此動作。
-
新增第二個位址部分的欄。 在 PartI 右側的欄中,輸入 PartII:Val (Mid ([IPAddress],InStr (1,[IPAddress],“”。) +1,InStr (InStr (1,[IPAddress],“”。) +1,[IPAddress],“”。) -InStr (1,[IPAddress],“”。) -1) ) 欄位列 。 表達式會傳回位於IPAddress欄位中第一個和第二個期間之間的字元。
再次檢閱表達式。 由於您不知道位址第二部分有多少位數,或第二部分的起始位置 (,因為您不知道第一部分) 多久,您可以使用 InStr 函數來尋找期間的位置。 接著,您可以使用 Mid 函數來擷取第一個句點後面但第二個句點之前的字元。 最後,您呼叫 Val 函數,將 Mid 函數傳回的字元轉換為數位。 最後一個步驟是必要的,因為基礎數據類型是 [文字]。
-
新增第三個位址部分的欄。 在 PartII 右側的欄中,輸入 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) ) 。 表達式會傳回IPAddress字段中第二個和第三個週期之間的字元。
再次檢閱表達式。 由於您不知道位址第三部分有多少位數,或確切的第三部分是從哪裡開始 (,因為您不知道第一部分和第二部分) 多久,因此您可以使用 InStr 函數來尋找期間的位置。 接著,您使用 Mid 函數來擷取第二個句點後面但第三個句點之前的字元。 最後,您呼叫 Val 函數,將 Mid 函數傳回的字元轉換為數位。 最後一個步驟是必要的,因為基礎數據類型是 [文字]。
-
新增第四個及最後一個位址部分的欄。 在 PartIII 右側的欄中,輸入 PartIV:Val (Right ([IPAddress],Len ([IPAddress]) -InStr (InStr (InStr (1,[IPAddress],“”。) +1,[IPAddress],“”。) +1,[IPAddress],“”。在 [功能變數] 列中 ) ) ) 。 表達式會傳回最後一個周期之後的字元。
再次檢閱表達式。 關鍵在於尋找第三個句點的位置,然後擷取其後的所有字元。 由於您不知道第三個週期的確切位置,因此請撥打 InStr 函數三次,以尋找第三個週期的位置。 接著,您使用 Len 函數來計算第四個部分的位數。 傳回的位數會與 Right 函數搭配使用,從 IPAddress 功能變數的右側部分擷取該許多字元。 最後,您呼叫 Val 函數,將 Mid 函數傳回的字元轉換為數位。 最後一個步驟是必要的,因為基礎數據類型是 [文字]。
-
將所有四個計算結果列的 [排序 ] 列設為 [遞增]。
重要 IPAddress 欄的 [排序 ] 列必須留白。
如果您想要依據其他域值排序,除了位址以外,請將欄位置於 所有四個計算結果列的左方或右側。 請勿在計算結果列之間放置其他排序欄位。
-
下一個步驟是隱藏數據工作表中的四個計算結果列。 但在您這麼做之前,請切換到 [數據工作表檢視] 以查看計算結果列中表達式的結果。 下表顯示您將在 [資料工作表檢視] 中看到的欄。
MachineID
IPAddress
PartI
PartII
PartIII
PartIV
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
-
切換回 [設計視圖],並清除 [ 顯示 所有四個計算結果列的列] 中的複選框。 這可防止計算結果列顯示在 [數據工作表檢視] 中。
-
您也可以指定排除查詢記錄的準則。
-
切換到 [數據工作表檢視],以排序順序查看記錄。 您會看到記錄以IP位址的遞增順序正確排序。
排序IP位址的更多用途
在數據輸入期間驗證IP位址
如果您想要驗證位址而不撰寫程式代碼,您可以將欄位的 InputMask 屬性設為 ###.#.##.##; 以限定範圍驗證位址。0;"“ 和 IP 位址欄位的 Format 屬性,以 &&&&&&&&&&&&。
輸入掩碼有什麼作用? 當您開始在位址欄位中輸入時,輸入遮罩可防止您在三個句點之間輸入數位和空格以外的字元。 如果數值部分是兩位數數位,請將第三位數留白,或改為輸入空格。 請注意,如果使用者略過輸入位址的一或多個部分,或只輸入空格而非數值,此輸入掩碼不會警告使用者。 例如,“345。 .3. 」 會被接受為有效的位址。
顯示格式有何作用? 當您完成輸入並離開字段時,顯示格式會移除位址中的空格,只顯示數位和句點。 因此,如果您輸入 「354.35.2.12」,位址會顯示為 「354.35.2.12」。。 請注意,如果您按兩下位址內部,或按 F2 (進入編輯模式) 選取位址時,空格會重新出現。
提示: 如果您想要複製位址,請移至上一欄或控件,按 TAB 以選取格式化的位址,然後按兩下 [ 複製]。 如此一來,您就不會複製包含空格的位址字串。
依IP位址排序表表中的記錄
如果您需要建立以IP位址排序記錄的表單或報表,請將新物件以如先前所述排序位址的查詢為基礎,而不是以儲存地址的數據表為基礎。