Доступ - обновить поля между рядом других полей - PullRequest
0 голосов
/ 05 января 2019

У меня есть список IP-адресов в таблице. Недавно я решил идентифицировать эти IP-адреса по их подразделению (сейчас я не могу придумать лучшего имени - их организационное подразделение? Во всяком случае, ни здесь, ни там).

Я хочу обновить разделение для диапазона IP-адресов. Например, я хочу обновить диапазон IP-адресов 192.168.1.10-192.168.1.50, чтобы иметь разделение Local. Я знаю, что-то вроде этого, я просто не могу понять:

UPDATE [IP Address Range]
SET [IP Address Range].Division = Local
WHERE [IP Address Range].[IP Addresses] >192.168.1.10 <192.168.1.50

Я на правильном пути?

1 Ответ

0 голосов
/ 05 января 2019

Поскольку IP-адреса представлены в виде строк, любое сравнение будет выполнено для кодов символов ASCII, содержащих строки, которые будут возвращать нежелательные результаты, если все разделы IP-адреса не будут дополнены тремя символами с начальными нулями (например, "192.168.001.050").

При заполнении сравнение строк будет работать, потому что символы будут сравниваться с символами в одной и той же позиции в каждой строке, и в силу того факта, что коды символов ASCII для числовых символов являются последовательными и увеличиваются с числовыми значениями.

Для интерпретации строк в виде числового диапазона в том формате, в котором они отображаются в данный момент (т. Е. Без нулей заполнения), потребуется написать функцию для анализа каждого раздела строки, разделенной точкой, и сравнить числовое значение каждого раздела.

Одним из способов достижения этого является преобразование 4 байтов, представленных адресом IPv4, в 32-разрядное целое число (которое, к сожалению, необходимо будет представить с использованием Double, поскольку VBA не поддерживает 32-разрядные целые числа без знака), а затем просто сравнивая два числовых значения, используя стандартные реляционные операторы.

Вот краткий пример:

Function IPValue(IPAddr As String) As Double
    Dim byt
    Dim fac As Long: fac = 16777216
    For Each byt In Split(IPAddr, ".")
        IPValue = IPValue + fac * byt
        fac = fac / 256
    Next byt
End Function

(к сожалению, VBA также не имеет оператора побитового сдвига, в противном случае это будет еще короче)

Диапазон 192.168.1.10 до 192.168.1.50 затем становится:

?IPValue("192.168.1.10")
 3232235786 
?IPValue("192.168.1.50")
 3232235826 

Который, после определения функции в общедоступном модуле, вы можете использовать в своем выражении SQL следующим образом:

UPDATE [IP Address Range] SET [IP Address Range].Division = "Local"
WHERE 
    IPValue([IP Address Range].[IP Addresses]) 
    BETWEEN IPValue("192.168.1.10") AND IPValue("192.168.1.50")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...