本主题介绍对存储在 Access 数据库中的 ip) 地址 (Internet 协议进行排序的过程。
简介
如果你使用 IP 地址,你可能已经知道它不像使用文本或数字那么简单。 这是因为 IP 地址实际上是由句点 (.) 分隔的四个数值的集合,其中每个值都是 0 到 255 之间的数字。 下表显示了应用任何排序顺序之前的数据。
MachineID |
Employee |
位置 |
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 |
第三部分 |
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 函数返回的字符转换为数字。 最后一步是必需的,因为基础数据类型为 Text。
-
单击快速访问工具栏上的“保存”,保存查询。 最好在每个中间步骤之后执行此操作。
-
为第二个地址部分添加 列。 在 PartI 右侧的列中,键入 PartII:Val (Mid ([IPAddress],InStr (1,[IPAddress],”) +1,InStr (InStr (1,[IPAddress],“.) +1,[IPAddress],“.) -InStr (1,[IPAddress],“.”字段行中的 ) -1) ) 。 表达式返回位于 IPAddress 字段中第一个和第二个句点之间的字符。
同样,请查看表达式。 由于您不知道地址的第二部分有多少位数,也不知道第二部分 (的确切位置,因为您不知道第一部分) 多长时间,因此使用 InStr 函数查找句点的位置。 然后,使用 Mid 函数提取在第一句点之后但位于第二个句点之前的字符。 最后,调用 Val 函数,将 Mid 函数返回的字符转换为数字。 最后一步是必需的,因为基础数据类型为 Text。
-
为第三个地址部分添加 列。 在 PartII 右侧的列中,键入 Part III: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 函数返回的字符转换为数字。 最后一步是必需的,因为基础数据类型为 Text。
-
添加第四个和最后一个地址部分的 列。 在 Part III 右侧的列中,键入 PartIV:Val (Right ([IPAddress],Len ([IPAddress]) -InStr (InStr (InStr (1,[IPAddress]“。”) +1,[IPAddress],“.) +1,[IPAddress],“.”字段 行中的 ) ) ) 。 表达式返回上一句点后面的字符。
同样,请查看表达式。 关键是查找第三个句点的位置,然后提取其后的所有字符。 由于你不知道第三个周期的确切位置,因此调用 InStr 函数三次以查找第三个句点的位置。 然后,使用 Len 函数计算第四部分的位数。 然后,返回的位数与 Right 函数一起使用,以从 IPAddress 字段的右侧部分提取多个字符。 最后,调用 Val 函数,将 Mid 函数返回的字符转换为数字。 最后一步是必需的,因为基础数据类型为 Text。
-
将所有四个计算列的 “排序 ”行设置为 “升序”。
重要提示 “IPAddress”列的 “排序” 行必须留空。
如果要按其他字段值排序,除了地址,请将字段放在 所有四个计算列的左侧或右侧。 不要在计算列之间放置其他排序字段。
-
下一步是在数据表中隐藏四个计算列。 但在执行此操作之前,请切换到数据表视图以查看计算列中表达式的结果。 下表显示了将在“数据表”视图中看到的列。
MachineID
IPAddress
PartI
PartII
第三部分
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 地址对记录进行排序的窗体或报表,请将新对象基于按前面所述对地址进行排序的查询,而不是基于存储地址的表。