Введение

В системе R-Keeper CRM возможны следующие варианты добавления (или поиска) карты в Редакторе карт:

1. В ручном режиме (справочник "Выпуск карт");

2. В полуручном режиме (с ипользованием COM-считывателя карт).

Для реализации варианта №2 необходимо подключить считыватель к машине, на которой происходит работа в редакторе карт и настроить данный считыватель в конфигураторе(рис.1), а также настроить маску (рис.2). Для примера, использовался бесконтактный считыватель EM-Marine.

Рис.1

Рис.2

Формула необходима, чтобы корректно обработать данные, записанные на карте. Примеры формул описаны в пункте 2 данной статьи.

1. Функции и операции

1.1. Базовые операции

ОперацияРеализация
Арифметические x + y , x - y , x * y, x / y, x ^ y
Сравнение x > y, x < y, x >= y, x <= y, x = y, x <> y
Сравнение строк s > t, s < t, s >= t, s <= t, s = t, s <> t
Логические (1/0) a AND b, a OR b, NOT(a), x in [...] // Пример: 12 in [22, 12, 3]

1.2. Работа с переменными

ОперацияФормула
Установка x:=formula (or value);
Уничтожение FreeVar(s); //s = имя переменной
Проверка существования ExistVar(s) // s = имя переменной

1.3. Преобразование из одного типа в другой

ФункцияПояснениеПример
Logic(x)     Переводит значение x в логический тип (0 или 1)  Logic(0) = 0 или Logic(2) = 1
Numeric(s) Переводит значение из строки в цифровой       Numeric("10.23") = 10.23
String(x)   Переводит значение из числа в строку     String(10.23) = "10.23"
Char(x)    Переводит число в символ   Char(65) = "A"
Ascii(s)  Переводит символ в число  Ascii("A") = 65
Eval(f)   Вычисляет формулу    Eval("2+1+4") = 7
NumBase(x, base)  Переводит число в строку в другой системе исчисления, где base - система исчисления от 2 до 16  NumBase(254, 16) = "FE"
BaseNum(s, base)  Функция обратная функции NumBase(x, base)

1.4. Математические операции


x Div y             целочисленное деление числа x на число y
x Mod y           модуль от целочисленного деления числа x на число y

1.5. Математические функции


Abs(x)        возвращает абсолютное значение числа x
Frac(x)        возвращает дробную часть числа x
Trunc(x)      отбрасывает дробную часть числа x
Sign(x)        определяет знак числа Sign(0) = 0; Sign(2) = 1; Sign(-2) = -1
Sqrt(x)        возвращает квадратный корень числа x
Ln(x)           возвращает натуральный логарифм числа x
Exp(x)         возвращает экспоненту степени x
Cos(x)         возвращает косинус числа x
Ctg(x)         возвращает котангенс числа x
Ch(x)          возвращает гиперболический косинус числа x
Cth(x)         возвращает гиперболический котангенс числа x
Sin(x)          возвращает синус числа x
Sh(x)           возвращает гиперболический синус числа x
Tg(x)           возвращает тангенс числа x
Th(x)           возвращает гиперболический тангенс числа x
ArcSin(x)     возвращает арксинус числа x
ArcCos(x)    возвращает арккосинус числа x
ArcTg(x)      возвращает арктангенс числа x
ArcCtg(x)    возвращает аркотангенс числа x
MaxVal(x [,y, ...])        возвращает максимальное число из списка MaxVal(1,2,3,4,0,7+2,2) = 9
MinVal(x [,y, ...])         возвращает минимальное число из списка MinVal(1,2,3,4,0,-5,2) = -5
SumVal(x [,y, ...])        возвращает сумму списка SumVal(1,2,3,4,0,7,2) = 19
AvgVal(x [,y, ...])         возвращает среднее значение чисел из списка AvgVal(1,2,3,4,0,7,2) = 2.714

1.6. Операции со строками


s || t                    конкатенация строк
s Like t              определяет есть ли подстрока в строке (%,_)               "www.tsoft.szm.com" Like "%szm%" = "1"
s Wildcard t      определяет подходит ли маска (*,?)                                 "jan.tungli@seznam.cz" Wildcard "*@*.?z" = "1"

1.7. Функции работы со строками


Length(s)               возвращает длину строки
Pos(t, s)                  возвращает позицию вхождения подстроки t в строке s
Trim(s)                    удаляет пробельные символы в начала и в конце строки
TrimLeft(s)              удаляет пробельные символы в начале строки
TrimRight(s)            удаляет пробельные символы в конце строки
Upper(s)                 переводит строку в верхний регистр
Lower(s)                 переводит строку в нижний регистр
Copy(s, x, [y])          копирует из строки s символы с позиции x, если задано значение y, то копирует только y символов
CopyTo(s, x, [y])      копирует из строки s символы с позиции x, если задано значение y, то копирует только до символа в позиции y
Delete(s, x, [y])        удаляет из строки s символы с позиции x, если задано значение y, то удаляет только y символов
Insert(s, t, x)            вставляет в строку s подстроку t в позиции x
IFF(a, s, t)                ветвление, если a>=1 возвращается значение s иначе - t
Replace(s, t, v,         заменяет в строке s подстроку t на подстроку v, 
[1/0=ReplaceAll,       если указан параметр ReplaceAll=1, то заменяет все найденные подстроки t на подстроку v, 
[1/0=IgnoreCase]])   если задан параметр IgnoreCase=1, то при поиске подстроки t регистр учитываться не будет

1.8. Функции работы с датой и временем


Year(s)                    возращает год                        Year("2008/03/20") = 2008
Month(s)                возращает месяц                    Month("2008/03/20") = 3
Day(s)                     возращает день                      Day("2008/03/20") = 20
WeekDay(s)             возращает день недели          WeekDay("2008/03/20") = 4
Hour(s)                    возращает час                        Hour("23:55:34") = 23
Minute(s)                 возращает минуты                 Minute("23:55:34") = 55
Sec(s)                       возращает секунды                Sec("23:55:34") = 34
StrToStamp(d)          преобразует строковое представление даты и времени в числовое
StampToStr(x)          преобразует числовое представление даты и времени в строковое
StampToDateStr(x)   преобразует числовое представление даты в строковое
StampToTimeStr(x)   преобразует числовое представление времени в строковое
Date                        возвращает текущую дату
Time                        возвращает текущее время
Now                        возвращает текущую дату и время

2. Примеры формул

Пример 1. Нужно настроить использование карт, которые раньше определялись маской 778=99999998=####

В строке формула в конфигураторе (см. рис.1) надо написать такое выражение:     =Numeric(IFF(Copy(Value, 5, 8) = "99999998", Copy(Value, 14, 4), "0"))
Если с карты считается код, например 778=12345678=0102, то результатом вычисления будет 0, а если считается код 778=99999998=1234, то результатом вычисления будет 1234.
Если код карты после вычисления будет 0, то это значит, что карта не определена.
 
Ниже два примера для преобразования данных с карт бесконтактными считывателями.
Пример 2. Использование сложных формул. Вычисление идет слева направо.
=v1:=Pos("] ",Value);v2:=Copy(Value,v1+2,255);v1:=Pos(",",v2); v3:=Copy(v2,1,v1);v4:=Copy(v2,v1+1,255);Numeric(v3+v4)
Пример 3. Преобразование шестнадцатиричного вида в десятичный.
=V1:=String(BaseNum(Copy(Value, 1, 2), 16));V2:=String(BaseNum(Copy(Value,3,4), 16));V2:=IFF(Length(V2) < 5, "0"||V2, V2);V2:=IFF(Length(V2) < 5, "0"||V2, V2);V2:=IFF(Length(V2) < 5, "0"||V2, V2);V2:=IFF(Length(V2) < 5, "0"||V2, V2);result:=Numeric(V1 || V2)
Маска: 778=199999999=########

3. Работа со считывателем СРЧ-125 фирмы UCS

Пример считывателя и карты.

Рис.3

Настраиваем в конфигураторе считываетель (указываем № COM-порта, скорость и код организации (необязательно), см.рис.4) и маску (см. рис. 5).

Рис.4 Настройка считывателя

Прописываем маску в виде формулы, например: =V:=Value;V:=Delete(V,1,Pos("=",V));V:=Delete(V,1,Pos("=",V));result:=Numeric(V) или маски, например: 778=199990099=#######.

Данная формула выделяет подстроку (после 2-го знака "=") в строке (параметр Message** в лог-файле) после преобразования данных с карты, т.е. возвращает номер карты. При применении формулы код организации(см.рис.4) можно не указывать. 

Маска так же возвращает номер карты, но число знаков "#" должно соответствовать числу цифр в серии карт (см.рис.3, первая группа цифр).

Проанализировать работу драйвера можно по записям в лог-файле iod_MCR_Serial.01.log после прикладывания карты к считывателю при запущенном Редакторе карт.
14.05.2014 15:23:23.355>          Enable Reader
14.05.2014 15:23:24.261>          Buffer : 750=2364000162753731310                              //  прошито на карте (можно проверить с помощью утилиты HyperTerminal)
14.05.2014 15:23:24.261>          Message : 778=199990099=1702866                            //  ** 199990099 - код организации (прописывается в свойствах драйвера, см.рис.4);  1702866 - номер карты (результат преобразования 750=2364000162753731310)
 

Рис.5 Настройка маски

4. Работа со считывателем RFID RDM530

Для данного устройства написан специальный драйвер (прикреплен к статье). Для работы данного считывателя достаточно подкинуть данный драйвер и настроить в конфигураторе маску =Numeric(Value)

iod_mcr_serial_mifare_14443.7z