Работа с группами, битовые маски
Материал из BiTel WiKi
Очень часто возникает проблема с тем, что необходимо фильтровать договора по группам, в новом модуле GOROD тоже необходимо считать маску договора http://bgbilling.ru/v5.2/doc/ch04s02.html
#Чтобы узнать коды параметров "Адрес" и "Полное имя" откройте справочник "Параметры договоров" #и выберите коды из левого столбца. Параметр "Полное имя" должен быть в договоре обязательно, #а адреса может не быть - в этом случае подставится значение по умолчанию. param.address=<код параметра адрес> param.fullname=<код параметра "Полное имя"> #это будет подставлено в адрес по умолчанию ${cid} - код договора default.address=Уфа,ДС,0,${cid} #битовая маска групп для которых выгружаются реестры. Определяется следующим образом: откройте справочник групп, #выделите позиции групп, начинающиеся с 0. Затем посчитайте выражение mask = 1<<gr1 | 1<<gr2...| 1<<grN group.mask=262144 #счёт подставляемый в файл реестра для тега с кодом 1 (Код тега можно узнать на вкладке Теги в модуле Город) account.1=175 #счёт подставляемый для договора с группой по маске 3 (т.е для договоров где (gr&3)>0) #если счёт по группе договора не найден, используется счёт по фирме account.gr.3=176
Одна из участниц форума начала настраивать и встал вопрос о том как же посчитать
#Затем посчитайте выражение mask = 1<<gr1 | 1<<gr2...| 1<<grN
Эту формулу. У меня так же возник вопрос (который я хотел давно разобрать) как же делать sql запрос, чтобы выбирать договора по определенным группам
gr&(1<<5)>0 AND gr&(1<<25)=0
Для первого Пример высчитывания от разработчиков. Есть группы группы id = 25, 26, 30, 31, 32, 33 высчитывается по такой формуле
mask = ( 1 << 25 ) | ( 1 << 26 ) | ( 1 << 30 ) | ( 1 << 31 ) | ( 1 << 32 ) | ( 1 << 33 ) = 1 * 2^25 + 1 * 2^26 + 1 * 2^30 + 1 * 2^31 + 1 * 2^32 + 1 * 2^33 = большое число типа long Формула m << n в двоичной арифметике означает, что число m нужно умножить на 2 в степени n. А операция | эквивалентна сложению.
Для более подобного понимания рассмотрю пример ниже. Собственно << - это означает смещение байтов. Тоесть 1 в двоичной системе счисления будет равно 000001 и выражение 1<<5 будет равно 100000 (Тоесть сначала что сдвигаем, потом на сколько). Выражение gr&(1<<5)>0 высчитывается так: gr - это номер группы (начинается с нуля) потом переводится в двоичный вид (любой калькулятор в ОС это умеет делать) & означает побайтное И. Например в sql запросе
SELECT title, gr FROM contract
В gr вышла цифра 29, переводим ее в двоичную систему - получаем 011101, выражение gr&(1<<5)>0 принимает вид 011101&(100000)>0. Вычисляем
011101 100000 ====== 000000
0>0 тоесть false --- это значит что договор не принадлежит к группе 5
а вообще, самое просто - это брать договор, ставить у него нужные группы, потом делать sql запрос SELECT title, gr FROM contract where id = 23800 и смотреть цифры группы
--Skyb 01:37, 1 сентября 2011 (UTC)