В этом разделе описывается процедура сортировки IP-адресов, хранящихся в базе данных Access.
Введение
Если вы работаете с 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 |
Сортировка IP-адресов в Access является сложной задачей, так как 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-адресов на четыре числовые части. Адреса должны быть отсортированы по первой части, затем по каждому значению в первой части, затем по второй части и т. д. В таблице показана каждая часть в разных столбцах. Так как столбцы содержат простые числовые значения, становится возможным сортировать столбцы слева направо в порядке возрастания, как показано в следующей таблице.
Партия |
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 запрос сортирует записи по четырем вычисляемым столбцам.
Создание запроса
Вы создадите запрос на выборку с именем Sorted 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 введите 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 , в число. Этот последний шаг необходим, так как базовый тип данных — Text.
-
Добавьте столбец для четвертой и последней части адреса. В столбце справа от PartIII введите 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
Партия
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;" " и свойство Format поля IP-адреса, &&&&&&&&&&&&.
Что делает маска ввода? При вводе в поле адреса маска ввода не позволяет вводить символы, отличные от цифр и пробелов между тремя точками. Если числовая часть является двузначным числом, оставьте третью цифру пустым или введите пробел. Обратите внимание, что эта маска ввода не предупреждает пользователя, если он пропускает ввод одной или нескольких частей адреса или вводит только пробелы вместо числового значения. Например, "345. .3. " будет принят в качестве допустимого адреса.
Что делает формат отображения? После завершения ввода и выхода из поля формат отображения удаляет пробелы в адресе и отображает только числа и точки. Таким образом, если вы ввели "354.35.2.12", адрес отображается как "354.35.2.12". Обратите внимание, что если щелкнуть внутри адреса или нажать клавишу F2 (чтобы перейти в режим редактирования) при выборе адреса, пробелы появятся снова.
Совет: Если вы хотите скопировать адрес, перейдите к предыдущему столбцу или элементу управления, нажмите клавишу TAB, чтобы выбрать отформатированный адрес, а затем нажмите кнопку Копировать. В этом случае строка адреса, содержащая пробелы, не копируется.
Сортировка записей в форме или отчете по IP-адресам
Если вам нужно создать форму или отчет, в котором записи отсортированы по IP-адресам, создайте новый объект на основе запроса, который сортирует адреса, как описано выше, а не в таблице, в которой хранятся адреса.